From e0cd90cab1624796ed12abb424422e726113185c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 11 Sep 2018 10:05:37 -0400 Subject: [PATCH 02/74] Update the documentation and implementation of swap calculation. Make the ramps consistent between suspend-to-disk and not, and don't do the weird drop from 8GiB swap down to 4GiB for large-memory systems. --- .../partition/core/PartitionActions.cpp | 55 ++++++------------- src/modules/partition/partition.conf | 16 ++++-- 2 files changed, 28 insertions(+), 43 deletions(-) diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp index d35345424..99c231b1b 100644 --- a/src/modules/partition/core/PartitionActions.cpp +++ b/src/modules/partition/core/PartitionActions.cpp @@ -45,17 +45,7 @@ using CalamaresUtils::operator""_MiB; qint64 swapSuggestion( const qint64 availableSpaceB ) { - /* If suspend-to-disk is demanded, then we always need enough - * swap to write the whole memory to disk -- between 2GB and 8GB - * RAM give proportionally more swap, and from 8GB RAM keep - * swap = RAM. - * - * If suspend-to-disk is not demanded, then ramp up more slowly, - * to 8GB swap at 16GB memory, and then drop to 4GB for "large - * memory" machines, on the assumption that those don't need swap - * because they have tons of memory (or whatever they are doing, - * had better not run into swap). - */ + // See partition.conf for explanation qint64 suggestedSwapSizeB = 0; auto memory = CalamaresUtils::System::instance()->getTotalMemoryB(); qint64 availableRamB = memory.first; @@ -65,36 +55,25 @@ swapSuggestion( const qint64 availableSpaceB ) Calamares::JobQueue::instance()->globalStorage()-> value( "ensureSuspendToDisk" ).toBool(); - if ( ensureSuspendToDisk ) - { - if ( availableRamB < 4_GiB ) - suggestedSwapSizeB = qMax( 2_GiB, availableRamB * 2 ); - else if ( availableRamB >= 4_GiB && availableRamB < 8_GiB ) - suggestedSwapSizeB = 8_GiB; - else - suggestedSwapSizeB = availableRamB; + // Ramp up quickly to 8GiB, then follow memory size + if ( availableRamB <= 4_GiB ) + suggestedSwapSizeB = availableRamB * 2; + else if ( availableRamB <= 8_GiB ) + suggestedSwapSizeB = 8_GiB; + else + suggestedSwapSizeB = availableRamB; - suggestedSwapSizeB *= overestimationFactor; - } - else //if we don't care about suspend to disk - { - if ( availableRamB < 2_GiB ) - suggestedSwapSizeB = qMax( 2_GiB, availableRamB * 2 ); - else if ( availableRamB >= 2_GiB && availableRamB < 8_GiB ) - suggestedSwapSizeB = availableRamB; - else if ( availableRamB >= 8_GiB && availableRamB < 16_GiB ) - suggestedSwapSizeB = 8_GiB; - else - suggestedSwapSizeB = 4_GiB; + // .. top out at 8GiB if we don't care about suspend + if ( !ensureSuspendToDisk ) + suggestedSwapSizeB = qMin( 8_GiB, suggestedSwapSizeB ); - suggestedSwapSizeB *= overestimationFactor; - // don't use more than 10% of available space - qreal maxSwapDiskRatio = 0.10; - qint64 maxSwapSizeB = availableSpaceB * maxSwapDiskRatio; - if ( suggestedSwapSizeB > maxSwapSizeB ) - suggestedSwapSizeB = maxSwapSizeB; - } + // Allow for a fudge factor + suggestedSwapSizeB *= overestimationFactor; + + // don't use more than 10% of available space + if ( !ensureSuspendToDisk ) + suggestedSwapSizeB = qMin( suggestedSwapSizeB, qint64( 0.10 * availableSpaceB ) ); cDebug() << "Suggested swap size:" << suggestedSwapSizeB / 1024. / 1024. / 1024. << "GiB"; diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index 78ad82f10..3e0ce5950 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -6,11 +6,17 @@ efiSystemPartition: "/boot/efi" # Make sure an autogenerated swap partition is big enough for hibernation in # automated partitioning modes. Swap can be disabled through *neverCreateSwap*. # -# When *ensureSuspendToDisk* is true, swap is never smaller than physical -# memory, follows the guideline 2 * memory until swap reaches 8GiB. -# When *ensureSuspendToDisk* is false, swap size scales up with memory -# size until 8GiB, then at roughly half of memory size. -# +# - *neverCreateSwap* is true: no swap is created +# - *neverCreateSwap* is false (the default): swap is created, as follows: +# - *ensureSuspendToDisk* is true (default): Swap is always at least total +# memory size, and up to 4GiB RAM follows the rule-of-thumb 2 * memory; +# from 4GiB to 8 GiB it stays steady at 8GiB, and over 8 GiB memory +# swap is the size of main memory. +# - *ensureSuspendToDisk* is false: Follows the rules above, but Swap is at +# most 8GiB, and no more than 10% of available disk. +# In both cases, a fudge factor (usually 10% extra) is applied so that there +# is some space for administrative overhead (e.g. 8 GiB swap will allocate +# 8.8GiB on disk in the end). # # Default is true. ensureSuspendToDisk: true From c8133759081ed4cf1e8e50eaa7d3de03a508620f Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 12 Sep 2018 08:09:01 -0400 Subject: [PATCH 03/74] [partition] Prepare for swap options - Extend PrettyRadioButton with options (combo-boxes which may be added later). --- .../partition/gui/PrettyRadioButton.cpp | 21 +++++++++++++------ src/modules/partition/gui/PrettyRadioButton.h | 13 ++++++++++++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/modules/partition/gui/PrettyRadioButton.cpp b/src/modules/partition/gui/PrettyRadioButton.cpp index a697ed270..be09f5753 100644 --- a/src/modules/partition/gui/PrettyRadioButton.cpp +++ b/src/modules/partition/gui/PrettyRadioButton.cpp @@ -21,15 +21,16 @@ #include "utils/CalamaresUtilsGui.h" #include "widgets/ClickableLabel.h" +#include +#include #include -#include PrettyRadioButton::PrettyRadioButton( QWidget* parent ) : QWidget( parent ) { - QHBoxLayout* mainLayout = new QHBoxLayout; - setLayout( mainLayout ); + m_mainLayout = new QGridLayout; + setLayout( m_mainLayout ); m_radio = new QRadioButton; m_label = new ClickableLabel; @@ -41,9 +42,9 @@ PrettyRadioButton::PrettyRadioButton( QWidget* parent ) m_label->setWordWrap( true ); m_label->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); - mainLayout->addWidget( m_radio ); - mainLayout->addWidget( m_label ); - mainLayout->setContentsMargins( 0, 0, 0, 0 ); + m_mainLayout->addWidget( m_radio, 0, 0 ); + m_mainLayout->addWidget( m_label, 0, 1, -1, 1 ); // Row span to right edge + m_mainLayout->setContentsMargins( 0, 0, 0, 0 ); } @@ -80,3 +81,11 @@ PrettyRadioButton::buttonWidget() const { return m_radio; } + +void +PrettyRadioButton::addOptionsComboBox( const QString& label, QComboBox* box ) +{ + int row = m_mainLayout->rowCount(); // Rows index from 0, count from 1 + m_mainLayout->addWidget( new QLabel( label ), row, 1 ); + m_mainLayout->addWidget( box, row, 2 ); +} diff --git a/src/modules/partition/gui/PrettyRadioButton.h b/src/modules/partition/gui/PrettyRadioButton.h index f475ce528..c5ed6b336 100644 --- a/src/modules/partition/gui/PrettyRadioButton.h +++ b/src/modules/partition/gui/PrettyRadioButton.h @@ -22,7 +22,16 @@ #include class ClickableLabel; +class QComboBox; +class QGridLayout; +/** @brief A radio button with fancy label next to it. + * + * The radio button itself can be retrieved with buttonWidget(), + * and the whole behaves a lot like a label. Extra options can be + * added to the display (options are hidden when the button is + * not selected) with addOptionsComboBox(). + */ class PrettyRadioButton : public QWidget { Q_OBJECT @@ -40,9 +49,13 @@ public: virtual QRadioButton* buttonWidget() const; + /** @brief Add an options drop-down to this button. */ + void addOptionsComboBox( const QString& label, QComboBox* ); + protected: ClickableLabel* m_label; QRadioButton* m_radio; + QGridLayout* m_mainLayout; }; #endif // PRETTYRADIOBUTTON_H From a791818a65de0281b12aedbf9178933ad94d472c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 12 Sep 2018 08:18:45 -0400 Subject: [PATCH 04/74] [partition] Add swap drop-down - This is WIP; the drop-down contents should be customised, depending on configuration and the state of the device being installed-to. --- src/modules/partition/gui/ChoicePage.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index bef6e4966..b921941c2 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -172,6 +172,18 @@ ChoicePage::init( PartitionCoreModule* core ) ChoicePage::applyDeviceChoice(); } +static QComboBox* +swapSelectionCombo() +{ + QComboBox* box = new QComboBox; + box->addItem( box->tr( "No swap" ), 0 ); + box->addItem( box->tr( "Re-use swap" ), 1 ); + box->addItem( box->tr( "Limited swap" ), 2 ); + box->addItem( box->tr( "Full swap" ), 3 ); + box->addItem( box->tr( "Swap file" ), 4 ); + + return box; +} /** * @brief ChoicePage::setupChoices creates PrettyRadioButton objects for the action @@ -216,6 +228,7 @@ ChoicePage::setupChoices() m_eraseButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::PartitionEraseAuto, CalamaresUtils::Original, iconSize ) ); + m_eraseButton->addOptionsComboBox( tr( "Swap" ), swapSelectionCombo() ); m_grp->addButton( m_eraseButton->buttonWidget(), Erase ); m_replaceButton = new PrettyRadioButton; From dc492b301ce48e7cf0d28073debce7bc3056a9f9 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 12 Sep 2018 08:42:21 -0400 Subject: [PATCH 05/74] [partition] Drop label on swap-options box --- src/modules/partition/gui/ChoicePage.cpp | 2 +- src/modules/partition/gui/PrettyRadioButton.cpp | 5 ++--- src/modules/partition/gui/PrettyRadioButton.h | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index b921941c2..4dd214382 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -228,7 +228,7 @@ ChoicePage::setupChoices() m_eraseButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::PartitionEraseAuto, CalamaresUtils::Original, iconSize ) ); - m_eraseButton->addOptionsComboBox( tr( "Swap" ), swapSelectionCombo() ); + m_eraseButton->addOptionsComboBox( swapSelectionCombo() ); m_grp->addButton( m_eraseButton->buttonWidget(), Erase ); m_replaceButton = new PrettyRadioButton; diff --git a/src/modules/partition/gui/PrettyRadioButton.cpp b/src/modules/partition/gui/PrettyRadioButton.cpp index be09f5753..9be49fb82 100644 --- a/src/modules/partition/gui/PrettyRadioButton.cpp +++ b/src/modules/partition/gui/PrettyRadioButton.cpp @@ -83,9 +83,8 @@ PrettyRadioButton::buttonWidget() const } void -PrettyRadioButton::addOptionsComboBox( const QString& label, QComboBox* box ) +PrettyRadioButton::addOptionsComboBox( QComboBox* box ) { int row = m_mainLayout->rowCount(); // Rows index from 0, count from 1 - m_mainLayout->addWidget( new QLabel( label ), row, 1 ); - m_mainLayout->addWidget( box, row, 2 ); + m_mainLayout->addWidget( box, row, 1 ); } diff --git a/src/modules/partition/gui/PrettyRadioButton.h b/src/modules/partition/gui/PrettyRadioButton.h index c5ed6b336..1cb94c1a0 100644 --- a/src/modules/partition/gui/PrettyRadioButton.h +++ b/src/modules/partition/gui/PrettyRadioButton.h @@ -50,7 +50,7 @@ public: virtual QRadioButton* buttonWidget() const; /** @brief Add an options drop-down to this button. */ - void addOptionsComboBox( const QString& label, QComboBox* ); + void addOptionsComboBox( QComboBox* ); protected: ClickableLabel* m_label; From c3f3276188978f25b1e63c32ca639bacc2586fbe Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 12 Sep 2018 09:20:44 -0400 Subject: [PATCH 06/74] [partition] Improve presentation of swap options --- .../partition/gui/PrettyRadioButton.cpp | 44 +++++++++++++++---- src/modules/partition/gui/PrettyRadioButton.h | 6 +++ 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/modules/partition/gui/PrettyRadioButton.cpp b/src/modules/partition/gui/PrettyRadioButton.cpp index 9be49fb82..cd3c6dd3b 100644 --- a/src/modules/partition/gui/PrettyRadioButton.cpp +++ b/src/modules/partition/gui/PrettyRadioButton.cpp @@ -23,28 +23,32 @@ #include #include +#include #include PrettyRadioButton::PrettyRadioButton( QWidget* parent ) : QWidget( parent ) + , m_radio( new QRadioButton ) + , m_label( new ClickableLabel ) + , m_mainLayout( new QGridLayout ) + , m_optionsLayout( nullptr ) { - m_mainLayout = new QGridLayout; setLayout( m_mainLayout ); - m_radio = new QRadioButton; - m_label = new ClickableLabel; - - connect( m_label, &ClickableLabel::clicked, - m_radio, &QRadioButton::click ); m_label->setBuddy( m_radio ); m_label->setWordWrap( true ); m_label->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); m_mainLayout->addWidget( m_radio, 0, 0 ); - m_mainLayout->addWidget( m_label, 0, 1, -1, 1 ); // Row span to right edge + m_mainLayout->addWidget( m_label, 0, 1 ); m_mainLayout->setContentsMargins( 0, 0, 0, 0 ); + + connect( m_label, &ClickableLabel::clicked, + m_radio, &QRadioButton::click ); + connect( m_radio, &QRadioButton::toggled, + this, &PrettyRadioButton::toggleOptions ); } @@ -85,6 +89,28 @@ PrettyRadioButton::buttonWidget() const void PrettyRadioButton::addOptionsComboBox( QComboBox* box ) { - int row = m_mainLayout->rowCount(); // Rows index from 0, count from 1 - m_mainLayout->addWidget( box, row, 1 ); + if ( !box ) + return; + + if ( !m_optionsLayout ) + { + QWidget* w = new QWidget; + m_optionsLayout = new QHBoxLayout; + m_optionsLayout->setAlignment( Qt::AlignmentFlag::AlignLeft ); + m_optionsLayout->addStretch( 1 ); + + w->setLayout( m_optionsLayout ); + m_mainLayout->addWidget( w, 1, 1 ); + + toggleOptions( m_radio->isChecked() ); + } + + m_optionsLayout->insertWidget( m_optionsLayout->count()-1, box ); +} + +void +PrettyRadioButton::toggleOptions( bool toggle ) +{ + if ( m_optionsLayout ) + m_optionsLayout->parentWidget()->setVisible( toggle ); } diff --git a/src/modules/partition/gui/PrettyRadioButton.h b/src/modules/partition/gui/PrettyRadioButton.h index 1cb94c1a0..c88c00728 100644 --- a/src/modules/partition/gui/PrettyRadioButton.h +++ b/src/modules/partition/gui/PrettyRadioButton.h @@ -24,6 +24,7 @@ class ClickableLabel; class QComboBox; class QGridLayout; +class QHBoxLayout; /** @brief A radio button with fancy label next to it. * @@ -52,10 +53,15 @@ public: /** @brief Add an options drop-down to this button. */ void addOptionsComboBox( QComboBox* ); +protected slots: + /// Options are hidden when the radio button is off + void toggleOptions( bool checked ); + protected: ClickableLabel* m_label; QRadioButton* m_radio; QGridLayout* m_mainLayout; + QHBoxLayout* m_optionsLayout; }; #endif // PRETTYRADIOBUTTON_H From 10f7bac2df3e650d097b5701f07d93828db933f6 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 12 Sep 2018 10:05:14 -0400 Subject: [PATCH 07/74] [partition] Reorder initialization --- src/modules/partition/gui/PrettyRadioButton.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/partition/gui/PrettyRadioButton.cpp b/src/modules/partition/gui/PrettyRadioButton.cpp index cd3c6dd3b..18627f41c 100644 --- a/src/modules/partition/gui/PrettyRadioButton.cpp +++ b/src/modules/partition/gui/PrettyRadioButton.cpp @@ -29,8 +29,8 @@ PrettyRadioButton::PrettyRadioButton( QWidget* parent ) : QWidget( parent ) - , m_radio( new QRadioButton ) , m_label( new ClickableLabel ) + , m_radio( new QRadioButton ) , m_mainLayout( new QGridLayout ) , m_optionsLayout( nullptr ) { From 7d0451fe6924affe41d371b20a21016d3b3aa992 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 12 Sep 2018 10:16:48 -0400 Subject: [PATCH 08/74] [partition] Rename Choice -> InstallChoice - There are more choices to be made (or to come) when partitioning, so don't take the most generic term for one enum. --- src/modules/partition/gui/ChoicePage.cpp | 8 ++++---- src/modules/partition/gui/ChoicePage.h | 10 +++++----- src/modules/partition/gui/PartitionViewStep.cpp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index 4dd214382..62ee27a7e 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -262,7 +262,7 @@ ChoicePage::setupChoices() { if ( checked ) // An action was picked. { - m_choice = static_cast< Choice >( id ); + m_choice = static_cast< InstallChoice >( id ); updateNextEnabled(); emit actionChosen(); @@ -386,7 +386,7 @@ ChoicePage::continueApplyDeviceChoice() void -ChoicePage::applyActionChoice( ChoicePage::Choice choice ) +ChoicePage::applyActionChoice( ChoicePage::InstallChoice choice ) { m_beforePartitionBarsView->selectionModel()-> disconnect( SIGNAL( currentRowChanged( QModelIndex, QModelIndex ) ) ); @@ -901,7 +901,7 @@ ChoicePage::updateDeviceStatePreview() * @param choice the chosen partitioning action. */ void -ChoicePage::updateActionChoicePreview( ChoicePage::Choice choice ) +ChoicePage::updateActionChoicePreview( ChoicePage::InstallChoice choice ) { Device* currentDevice = selectedDevice(); Q_ASSERT( currentDevice ); @@ -1356,7 +1356,7 @@ ChoicePage::isNextEnabled() const } -ChoicePage::Choice +ChoicePage::InstallChoice ChoicePage::currentChoice() const { return m_choice; diff --git a/src/modules/partition/gui/ChoicePage.h b/src/modules/partition/gui/ChoicePage.h index c36747e93..d991e513a 100644 --- a/src/modules/partition/gui/ChoicePage.h +++ b/src/modules/partition/gui/ChoicePage.h @@ -53,7 +53,7 @@ class ChoicePage : public QWidget, private Ui::ChoicePage { Q_OBJECT public: - enum Choice + enum InstallChoice { NoChoice, Alongside, @@ -84,7 +84,7 @@ public: * currently selected partitioning mode (with a PrettyRadioButton). * @return the enum Choice value. */ - Choice currentChoice() const; + InstallChoice currentChoice() const; /** * @brief onLeave runs when control passes from this page to another one. @@ -95,7 +95,7 @@ public: * @brief applyActionChoice reacts to a choice of partitioning mode. * @param choice the partitioning action choice. */ - void applyActionChoice( ChoicePage::Choice choice ); + void applyActionChoice( ChoicePage::InstallChoice choice ); signals: void nextStatusChanged( bool ); @@ -121,7 +121,7 @@ private: void continueApplyDeviceChoice(); // .. called after scan void updateDeviceStatePreview(); - void updateActionChoicePreview( ChoicePage::Choice choice ); + void updateActionChoicePreview( ChoicePage::InstallChoice choice ); void setupActions(); OsproberEntryList getOsproberEntriesForDevice( Device* device ) const; void doAlongsideApply(); @@ -132,7 +132,7 @@ private: QMutex m_previewsMutex; - Choice m_choice; + InstallChoice m_choice; bool m_isEfi; QComboBox* m_drivesCombo; diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index b49b6c93b..6ad1a6c77 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -138,7 +138,7 @@ PartitionViewStep::createSummaryWidget() const widget->setLayout( mainLayout ); mainLayout->setMargin( 0 ); - ChoicePage::Choice choice = m_choicePage->currentChoice(); + ChoicePage::InstallChoice choice = m_choicePage->currentChoice(); QFormLayout* formLayout = new QFormLayout( widget ); const int MARGIN = CalamaresUtils::defaultFontHeight() / 2; From cfa940b35c8b09d9f7c491418cda9b6330466496 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 12 Sep 2018 11:18:17 -0400 Subject: [PATCH 09/74] [partition] Support translations of swap choices - Introduce enum to indicate what is selected - Support translations - Fill selections for erase --- src/modules/partition/gui/ChoicePage.cpp | 69 +++++++++++++++++++----- src/modules/partition/gui/ChoicePage.h | 15 ++++++ 2 files changed, 70 insertions(+), 14 deletions(-) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index 62ee27a7e..ab5a9316a 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -78,6 +78,9 @@ ChoicePage::ChoicePage( QWidget* parent ) , m_eraseButton( nullptr ) , m_replaceButton( nullptr ) , m_somethingElseButton( nullptr ) + , m_eraseSwapChoices( nullptr ) + , m_replaceSwapChoices( nullptr ) + , m_alongsideSwapChoices( nullptr ) , m_deviceInfoWidget( nullptr ) , m_beforePartitionBarsView( nullptr ) , m_beforePartitionLabelsView( nullptr ) @@ -172,19 +175,6 @@ ChoicePage::init( PartitionCoreModule* core ) ChoicePage::applyDeviceChoice(); } -static QComboBox* -swapSelectionCombo() -{ - QComboBox* box = new QComboBox; - box->addItem( box->tr( "No swap" ), 0 ); - box->addItem( box->tr( "Re-use swap" ), 1 ); - box->addItem( box->tr( "Limited swap" ), 2 ); - box->addItem( box->tr( "Full swap" ), 3 ); - box->addItem( box->tr( "Swap file" ), 4 ); - - return box; -} - /** * @brief ChoicePage::setupChoices creates PrettyRadioButton objects for the action * choices. @@ -228,7 +218,6 @@ ChoicePage::setupChoices() m_eraseButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::PartitionEraseAuto, CalamaresUtils::Original, iconSize ) ); - m_eraseButton->addOptionsComboBox( swapSelectionCombo() ); m_grp->addButton( m_eraseButton->buttonWidget(), Erase ); m_replaceButton = new PrettyRadioButton; @@ -239,6 +228,13 @@ ChoicePage::setupChoices() iconSize ) ); m_grp->addButton( m_replaceButton->buttonWidget(), Replace ); + // Fill up swap options + // .. TODO: only if enabled in the config + m_eraseSwapChoices = new QComboBox; + for ( SwapChoice c : { NoSwap, SmallSwap, FullSwap } ) + m_eraseSwapChoices->addItem( QString(), c ); + m_eraseButton->addOptionsComboBox( m_eraseSwapChoices ); + m_itemsLayout->addWidget( m_alongsideButton ); m_itemsLayout->addWidget( m_replaceButton ); m_itemsLayout->addWidget( m_eraseButton ); @@ -292,6 +288,12 @@ ChoicePage::setupChoices() applyActionChoice( currentChoice() ); } } ); + + CALAMARES_RETRANSLATE( + updateSwapChoicesTr( m_eraseSwapChoices ); + updateSwapChoicesTr( m_alongsideSwapChoices ); + updateSwapChoicesTr( m_replaceSwapChoices ); + ) } @@ -1404,3 +1406,42 @@ ChoicePage::updateNextEnabled() emit nextStatusChanged( enabled ); } +void +ChoicePage::updateSwapChoicesTr(QComboBox* box) +{ + if ( !box ) + return; + + static_assert(NoSwap == 0, "Enum values out-of-sync"); + for ( int index = 0; index < box->count(); ++index ) + { + bool ok = false; + int value = 0; + + switch ( value = box->itemData( index ).toInt( &ok ) ) + { + // case 0: + case NoSwap: + // toInt() returns 0 on failure, so check for ok + if ( ok ) // It was explicitly set to 0 + box->setItemText( index, tr( "No Swap" ) ); + else + cWarning() << "Box item" << index << box->itemText( index ) << "has non-integer role."; + break; + case ReuseSwap: + box->setItemText( index, tr( "Reuse Swap" ) ); + break; + case SmallSwap: + box->setItemText( index, tr( "Swap (no Hibernate)" ) ); + break; + case FullSwap: + box->setItemText( index, tr( "Swap (with Hibernate)" ) ); + break; + case SwapFile: + box->setItemText( index, tr( "Swap to file" ) ); + break; + default: + cWarning() << "Box item" << index << box->itemText( index ) << "has role" << value; + } + } +} diff --git a/src/modules/partition/gui/ChoicePage.h b/src/modules/partition/gui/ChoicePage.h index d991e513a..a8ff3a330 100644 --- a/src/modules/partition/gui/ChoicePage.h +++ b/src/modules/partition/gui/ChoicePage.h @@ -62,6 +62,15 @@ public: Manual }; + enum SwapChoice + { + NoSwap, // don't create any swap, don't use any + ReuseSwap, // don't create, but do use existing + SmallSwap, // up to 8GiB of swap + FullSwap, // ensureSuspendToDisk -- at least RAM size + SwapFile // use a file (if supported) + }; + explicit ChoicePage( QWidget* parent = nullptr ); virtual ~ChoicePage(); @@ -127,6 +136,9 @@ private: void doAlongsideApply(); void setupEfiSystemPartitionSelector(); + // Translations support + void updateSwapChoicesTr( QComboBox* box ); + bool m_nextEnabled; PartitionCoreModule* m_core; @@ -142,6 +154,9 @@ private: PrettyRadioButton* m_eraseButton; PrettyRadioButton* m_replaceButton; PrettyRadioButton* m_somethingElseButton; + QComboBox* m_eraseSwapChoices; + QComboBox* m_replaceSwapChoices; + QComboBox* m_alongsideSwapChoices; DeviceInfoWidget* m_deviceInfoWidget; From 959cd7b224585d67b4506f6b210987ffdbf5ff84 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 13 Sep 2018 04:44:36 -0400 Subject: [PATCH 10/74] [partition] Simplify creation of comboboxes for swap choices --- src/modules/partition/gui/ChoicePage.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index ab5a9316a..ccdc6920e 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -175,6 +175,20 @@ ChoicePage::init( PartitionCoreModule* core ) ChoicePage::applyDeviceChoice(); } + +/** @brief Creates a combobox with the given choices in it. + * + * No texts are set -- that happens later by the translator functions. + */ +static inline QComboBox* +createCombo( std::initializer_list< ChoicePage::SwapChoice > l ) +{ + QComboBox* box = new QComboBox; + for ( ChoicePage::SwapChoice c : l ) + box->addItem( QString(), c ); + return box; +} + /** * @brief ChoicePage::setupChoices creates PrettyRadioButton objects for the action * choices. @@ -230,11 +244,15 @@ ChoicePage::setupChoices() // Fill up swap options // .. TODO: only if enabled in the config - m_eraseSwapChoices = new QComboBox; - for ( SwapChoice c : { NoSwap, SmallSwap, FullSwap } ) - m_eraseSwapChoices->addItem( QString(), c ); + m_eraseSwapChoices = createCombo( { NoSwap, SmallSwap, FullSwap } ); m_eraseButton->addOptionsComboBox( m_eraseSwapChoices ); + m_replaceSwapChoices = createCombo( { NoSwap, ReuseSwap, SmallSwap, FullSwap } ); + m_replaceButton->addOptionsComboBox( m_replaceSwapChoices ); + + m_alongsideSwapChoices = createCombo( { NoSwap, ReuseSwap, SmallSwap, FullSwap } ); + m_alongsideButton->addOptionsComboBox( m_alongsideSwapChoices ); + m_itemsLayout->addWidget( m_alongsideButton ); m_itemsLayout->addWidget( m_replaceButton ); m_itemsLayout->addWidget( m_eraseButton ); From 8c79c981b112a53b58775e92a2d79e6d0bfd5b9a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 13 Sep 2018 05:33:39 -0400 Subject: [PATCH 11/74] [partition] Simplify space calculations - Q_ASSERT doesn't work in constexpr functions because it's not - May as well calculate bytes at compile-time, no need to give the runaround via number-of-MiB --- src/modules/partition/core/PartitionActions.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp index 99c231b1b..7e488367f 100644 --- a/src/modules/partition/core/PartitionActions.cpp +++ b/src/modules/partition/core/PartitionActions.cpp @@ -83,10 +83,7 @@ swapSuggestion( const qint64 availableSpaceB ) constexpr qint64 alignBytesToBlockSize( qint64 bytes, qint64 blocksize ) { - Q_ASSERT( bytes >= 0 ); - Q_ASSERT( blocksize > 0 ); qint64 blocks = bytes / blocksize; - Q_ASSERT( blocks >= 0 ); if ( blocks * blocksize != bytes ) ++blocks; @@ -114,17 +111,17 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass // the logical sector size (usually 512B). EFI starts with 2MiB // empty and a 300MiB EFI boot partition, while BIOS starts at // the 1MiB boundary (usually sector 2048). - int uefisys_part_size = isEfi ? 300 : 0; - int empty_space_size = isEfi ? 2 : 1; + int uefisys_part_sizeB = isEfi ? 300_MiB : 0_MiB; + int empty_space_sizeB = isEfi ? 2_MiB : 1_MiB; // Since sectors count from 0, if the space is 2048 sectors in size, // the first free sector has number 2048 (and there are 2048 sectors // before that one, numbered 0..2047). - qint64 firstFreeSector = bytesToSectors( MiBtoBytes(empty_space_size), dev->logicalSize() ); + qint64 firstFreeSector = bytesToSectors( empty_space_sizeB, dev->logicalSize() ); if ( isEfi ) { - qint64 efiSectorCount = bytesToSectors( MiBtoBytes(uefisys_part_size), dev->logicalSize() ); + qint64 efiSectorCount = bytesToSectors( uefisys_part_sizeB, dev->logicalSize() ); Q_ASSERT( efiSectorCount > 0 ); // Since sectors count from 0, and this partition is created starting From 846e496d7666682d40d102a064e0cc8d24cdcfcb Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 13 Sep 2018 05:50:46 -0400 Subject: [PATCH 12/74] [partition] Tidy includes --- src/modules/partition/gui/ChoicePage.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index ccdc6920e..4c5f7ff65 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -20,31 +20,32 @@ #include "ChoicePage.h" #include "core/BootLoaderModel.h" -#include "core/PartitionActions.h" -#include "core/PartitionCoreModule.h" #include "core/DeviceModel.h" -#include "core/PartitionModel.h" +#include "core/KPMHelpers.h" #include "core/OsproberEntry.h" #include "core/PartUtils.h" +#include "core/PartitionActions.h" +#include "core/PartitionCoreModule.h" +#include "core/PartitionInfo.h" #include "core/PartitionIterator.h" +#include "core/PartitionModel.h" -#include "ReplaceWidget.h" -#include "PrettyRadioButton.h" +#include "BootInfoWidget.h" +#include "DeviceInfoWidget.h" #include "PartitionBarsView.h" #include "PartitionLabelsView.h" #include "PartitionSplitterWidget.h" -#include "BootInfoWidget.h" -#include "DeviceInfoWidget.h" +#include "PrettyRadioButton.h" +#include "ReplaceWidget.h" #include "ScanningDialog.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include "utils/Retranslator.h" + #include "Branding.h" -#include "core/KPMHelpers.h" -#include "JobQueue.h" #include "GlobalStorage.h" -#include "core/PartitionInfo.h" +#include "JobQueue.h" #include #include From 513602141660deab76b228e7d6a741461e9d920f Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 13 Sep 2018 06:23:33 -0400 Subject: [PATCH 13/74] [partition] Move SwapChoice to another namespace - The choice of swap needs to be handled in more places, so make the enum available in the partition module core instead of just inside the choice page. --- src/modules/partition/core/PartitionActions.h | 19 ++++++++++++++- src/modules/partition/gui/ChoicePage.cpp | 24 +++++++++---------- src/modules/partition/gui/ChoicePage.h | 9 ------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/modules/partition/core/PartitionActions.h b/src/modules/partition/core/PartitionActions.h index bb624552f..8312d582b 100644 --- a/src/modules/partition/core/PartitionActions.h +++ b/src/modules/partition/core/PartitionActions.h @@ -50,6 +50,23 @@ void doReplacePartition( PartitionCoreModule* core, Device* dev, Partition* partition, const QString& luksPassphrase = QString() ); -} + +/** @brief Namespace for enums + * + * This namespace houses non-class enums..... + */ +namespace Choices +{ + /** @brief Ccchoice of swap (size and type) */ + enum SwapChoice + { + NoSwap, // don't create any swap, don't use any + ReuseSwap, // don't create, but do use existing + SmallSwap, // up to 8GiB of swap + FullSwap, // ensureSuspendToDisk -- at least RAM size + SwapFile // use a file (if supported) + }; +} // namespace Choices +} // namespace PartitionActions #endif // PARTITIONACTIONS_H diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index 4c5f7ff65..82302ac4c 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -59,7 +59,7 @@ #include #include - +using PartitionActions::Choices::SwapChoice; /** * @brief ChoicePage::ChoicePage is the default constructor. Called on startup as part of @@ -182,10 +182,10 @@ ChoicePage::init( PartitionCoreModule* core ) * No texts are set -- that happens later by the translator functions. */ static inline QComboBox* -createCombo( std::initializer_list< ChoicePage::SwapChoice > l ) +createCombo( std::initializer_list< SwapChoice > l ) { QComboBox* box = new QComboBox; - for ( ChoicePage::SwapChoice c : l ) + for ( SwapChoice c : l ) box->addItem( QString(), c ); return box; } @@ -245,13 +245,13 @@ ChoicePage::setupChoices() // Fill up swap options // .. TODO: only if enabled in the config - m_eraseSwapChoices = createCombo( { NoSwap, SmallSwap, FullSwap } ); + m_eraseSwapChoices = createCombo( { SwapChoice::NoSwap, SwapChoice::SmallSwap, SwapChoice:: FullSwap } ); m_eraseButton->addOptionsComboBox( m_eraseSwapChoices ); - m_replaceSwapChoices = createCombo( { NoSwap, ReuseSwap, SmallSwap, FullSwap } ); + m_replaceSwapChoices = createCombo( { SwapChoice::NoSwap, SwapChoice::ReuseSwap, SwapChoice::SmallSwap, SwapChoice::FullSwap } ); m_replaceButton->addOptionsComboBox( m_replaceSwapChoices ); - m_alongsideSwapChoices = createCombo( { NoSwap, ReuseSwap, SmallSwap, FullSwap } ); + m_alongsideSwapChoices = createCombo( { SwapChoice::NoSwap, SwapChoice::ReuseSwap, SwapChoice::SmallSwap, SwapChoice::FullSwap } ); m_alongsideButton->addOptionsComboBox( m_alongsideSwapChoices ); m_itemsLayout->addWidget( m_alongsideButton ); @@ -1431,7 +1431,7 @@ ChoicePage::updateSwapChoicesTr(QComboBox* box) if ( !box ) return; - static_assert(NoSwap == 0, "Enum values out-of-sync"); + static_assert(SwapChoice::NoSwap == 0, "Enum values out-of-sync"); for ( int index = 0; index < box->count(); ++index ) { bool ok = false; @@ -1440,23 +1440,23 @@ ChoicePage::updateSwapChoicesTr(QComboBox* box) switch ( value = box->itemData( index ).toInt( &ok ) ) { // case 0: - case NoSwap: + case SwapChoice::NoSwap: // toInt() returns 0 on failure, so check for ok if ( ok ) // It was explicitly set to 0 box->setItemText( index, tr( "No Swap" ) ); else cWarning() << "Box item" << index << box->itemText( index ) << "has non-integer role."; break; - case ReuseSwap: + case SwapChoice::ReuseSwap: box->setItemText( index, tr( "Reuse Swap" ) ); break; - case SmallSwap: + case SwapChoice::SmallSwap: box->setItemText( index, tr( "Swap (no Hibernate)" ) ); break; - case FullSwap: + case SwapChoice::FullSwap: box->setItemText( index, tr( "Swap (with Hibernate)" ) ); break; - case SwapFile: + case SwapChoice::SwapFile: box->setItemText( index, tr( "Swap to file" ) ); break; default: diff --git a/src/modules/partition/gui/ChoicePage.h b/src/modules/partition/gui/ChoicePage.h index a8ff3a330..07d052c2d 100644 --- a/src/modules/partition/gui/ChoicePage.h +++ b/src/modules/partition/gui/ChoicePage.h @@ -62,15 +62,6 @@ public: Manual }; - enum SwapChoice - { - NoSwap, // don't create any swap, don't use any - ReuseSwap, // don't create, but do use existing - SmallSwap, // up to 8GiB of swap - FullSwap, // ensureSuspendToDisk -- at least RAM size - SwapFile // use a file (if supported) - }; - explicit ChoicePage( QWidget* parent = nullptr ); virtual ~ChoicePage(); From d2f4079a18476adcf82aff0c8055fb72c1fc206b Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 17 Sep 2018 06:42:14 -0400 Subject: [PATCH 14/74] [partition] Move partitioning options into a class - As (auto) partitioning grows more options, the parameter list becomes more unwieldy. Add some structure to it. --- .../partition/core/PartitionActions.cpp | 49 +++++------- src/modules/partition/core/PartitionActions.h | 76 +++++++++++++------ src/modules/partition/gui/ChoicePage.cpp | 68 ++++++++++------- src/modules/partition/gui/ReplaceWidget.cpp | 14 ++-- 4 files changed, 121 insertions(+), 86 deletions(-) diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp index 7e488367f..e06ff6c36 100644 --- a/src/modules/partition/core/PartitionActions.cpp +++ b/src/modules/partition/core/PartitionActions.cpp @@ -28,7 +28,6 @@ #include "utils/Units.h" #include "JobQueue.h" #include "utils/Logger.h" -#include "GlobalStorage.h" #include #include @@ -43,17 +42,18 @@ using CalamaresUtils::operator""_GiB; using CalamaresUtils::operator""_MiB; qint64 -swapSuggestion( const qint64 availableSpaceB ) +swapSuggestion( const qint64 availableSpaceB, Choices::SwapChoice swap ) { + if ( ( swap != Choices::SmallSwap ) && ( swap != Choices::FullSwap ) ) + return 0; + // See partition.conf for explanation qint64 suggestedSwapSizeB = 0; auto memory = CalamaresUtils::System::instance()->getTotalMemoryB(); qint64 availableRamB = memory.first; qreal overestimationFactor = memory.second; - bool ensureSuspendToDisk = - Calamares::JobQueue::instance()->globalStorage()-> - value( "ensureSuspendToDisk" ).toBool(); + bool ensureSuspendToDisk = swap == Choices::FullSwap; // Ramp up quickly to 8GiB, then follow memory size if ( availableRamB <= 4_GiB ) @@ -97,16 +97,14 @@ bytesToSectors( qint64 bytes, qint64 blocksize ) } void -doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPassphrase ) +doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionOptions o ) { - Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); - - bool isEfi = PartUtils::isEfiSystem(); - - QString defaultFsType = gs->value( "defaultFileSystemType" ).toString(); + QString defaultFsType = o.defaultFsType; if ( FileSystem::typeForName( defaultFsType ) == FileSystem::Unknown ) defaultFsType = "ext4"; + bool isEfi = PartUtils::isEfiSystem(); + // Partition sizes are expressed in MiB, should be multiples of // the logical sector size (usually 512B). EFI starts with 2MiB // empty and a 300MiB EFI boot partition, while BIOS starts at @@ -139,8 +137,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass PartitionTable::FlagNone ); PartitionInfo::setFormat( efiPartition, true ); - PartitionInfo::setMountPoint( efiPartition, gs->value( "efiSystemPartition" ) - .toString() ); + PartitionInfo::setMountPoint( efiPartition, o.efiPartitionMountPoint ); core->createPartition( dev, efiPartition, PartitionTable::FlagEsp ); firstFreeSector = lastSector + 1; } @@ -149,20 +146,18 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass core->createPartitionTable( dev, PartitionTable::msdos ); } - const bool mayCreateSwap = !gs->value( "neverCreateSwap" ).toBool(); + const bool mayCreateSwap = ( o.swap == Choices::SmallSwap ) || ( o.swap == Choices::FullSwap ); bool shouldCreateSwap = false; qint64 suggestedSwapSizeB = 0; if ( mayCreateSwap ) { qint64 availableSpaceB = ( dev->totalLogical() - firstFreeSector ) * dev->logicalSize(); - suggestedSwapSizeB = swapSuggestion( availableSpaceB ); + suggestedSwapSizeB = swapSuggestion( availableSpaceB, o.swap ); // Space required by this installation is what the distro claims is needed // (via global configuration) plus the swap size plus a fudge factor of // 0.6GiB (this was 2.1GiB up to Calamares 3.2.2). - qint64 requiredSpaceB = - GiBtoBytes( gs->value( "requiredStorageGB" ).toDouble() + 0.6 ) + - suggestedSwapSizeB; + qint64 requiredSpaceB = o.requiredSpaceB + 600_MiB + suggestedSwapSizeB; // If there is enough room for ESP + root + swap, create swap, otherwise don't. shouldCreateSwap = availableSpaceB > requiredSpaceB; @@ -175,7 +170,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass } Partition* rootPartition = nullptr; - if ( luksPassphrase.isEmpty() ) + if ( o.luksPassphrase.isEmpty() ) { rootPartition = KPMHelpers::createNewPartition( dev->partitionTable(), @@ -195,7 +190,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass FileSystem::typeForName( defaultFsType ), firstFreeSector, lastSectorForRoot, - luksPassphrase + o.luksPassphrase ); } PartitionInfo::setFormat( rootPartition, true ); @@ -205,7 +200,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass if ( shouldCreateSwap ) { Partition* swapPartition = nullptr; - if ( luksPassphrase.isEmpty() ) + if ( o.luksPassphrase.isEmpty() ) { swapPartition = KPMHelpers::createNewPartition( dev->partitionTable(), @@ -225,7 +220,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPass FileSystem::LinuxSwap, lastSectorForRoot + 1, dev->totalLogical() - 1, - luksPassphrase + o.luksPassphrase ); } PartitionInfo::setFormat( swapPartition, true ); @@ -240,13 +235,11 @@ void doReplacePartition( PartitionCoreModule* core, Device* dev, Partition* partition, - const QString& luksPassphrase ) + Choices::ReplacePartitionOptions o ) { cDebug() << "doReplacePartition for device" << partition->partitionPath(); - QString defaultFsType = Calamares::JobQueue::instance()-> - globalStorage()-> - value( "defaultFileSystemType" ).toString(); + QString defaultFsType = o.defaultFsType; if ( FileSystem::typeForName( defaultFsType ) == FileSystem::Unknown ) defaultFsType = "ext4"; @@ -267,7 +260,7 @@ doReplacePartition( PartitionCoreModule* core, } Partition* newPartition = nullptr; - if ( luksPassphrase.isEmpty() ) + if ( o.luksPassphrase.isEmpty() ) { newPartition = KPMHelpers::createNewPartition( partition->parent(), @@ -287,7 +280,7 @@ doReplacePartition( PartitionCoreModule* core, FileSystem::typeForName( defaultFsType ), partition->firstSector(), partition->lastSector(), - luksPassphrase + o.luksPassphrase ); } PartitionInfo::setMountPoint( newPartition, "/" ); diff --git a/src/modules/partition/core/PartitionActions.h b/src/modules/partition/core/PartitionActions.h index 8312d582b..5acf444fa 100644 --- a/src/modules/partition/core/PartitionActions.h +++ b/src/modules/partition/core/PartitionActions.h @@ -27,30 +27,6 @@ class Partition; namespace PartitionActions { - -/** - * @brief doAutopartition sets up an autopartitioning operation on the given Device. - * @param core a pointer to the PartitionCoreModule instance. - * @param dev the device to wipe. - * @param luksPassphrase the passphrase for LUKS encryption (optional, default is empty). - */ -void doAutopartition( PartitionCoreModule* core, - Device* dev, - const QString& luksPassphrase = QString() ); - -/** - * @brief doReplacePartition sets up replace-partitioning with the given partition. - * @param core a pointer to the PartitionCoreModule instance. - * @param dev a pointer to the Device on which to replace a partition. - * @param partition a pointer to the Partition to be replaced. - * @param luksPassphrase the passphrase for LUKS encryption (optional, default is empty). - * @note this function also takes care of requesting PCM to delete the partition. - */ -void doReplacePartition( PartitionCoreModule* core, - Device* dev, - Partition* partition, - const QString& luksPassphrase = QString() ); - /** @brief Namespace for enums * * This namespace houses non-class enums..... @@ -66,7 +42,59 @@ namespace Choices FullSwap, // ensureSuspendToDisk -- at least RAM size SwapFile // use a file (if supported) }; + + struct ReplacePartitionOptions + { + QString defaultFsType; // e.g. "ext4" or "btrfs" + QString luksPassphrase; // optional + + ReplacePartitionOptions( const QString& fs, const QString& luks ) + : defaultFsType( fs ) + , luksPassphrase( luks ) + { + } + }; + + struct AutoPartitionOptions : ReplacePartitionOptions + { + QString efiPartitionMountPoint; // optional, e.g. "/boot" + quint64 requiredSpaceB; // estimated required space for root partition + SwapChoice swap; + + AutoPartitionOptions( const QString& fs, const QString& luks, const QString& efi, qint64 r, SwapChoice s ) + : ReplacePartitionOptions( fs, luks ) + , efiPartitionMountPoint( efi ) + , requiredSpaceB( r > 0 ? r : 0 ) + , swap( s ) + { + } + }; + } // namespace Choices + +/** + * @brief doAutopartition sets up an autopartitioning operation on the given Device. + * @param core a pointer to the PartitionCoreModule instance. + * @param dev the device to wipe. + * @param options settings for autopartitioning. + */ +void doAutopartition( PartitionCoreModule* core, + Device* dev, + Choices::AutoPartitionOptions options ); + +/** + * @brief doReplacePartition sets up replace-partitioning with the given partition. + * @param core a pointer to the PartitionCoreModule instance. + * @param dev a pointer to the Device on which to replace a partition. + * @param partition a pointer to the Partition to be replaced. + * @param options settings for partitioning (not all fields apply) + * + * @note this function also takes care of requesting PCM to delete the partition. + */ +void doReplacePartition( PartitionCoreModule* core, + Device* dev, + Partition* partition, + Choices::ReplacePartitionOptions options ); } // namespace PartitionActions #endif // PARTITIONACTIONS_H diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index 82302ac4c..b5a2ce529 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -42,6 +42,7 @@ #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include "utils/Retranslator.h" +#include "utils/Units.h" #include "Branding.h" #include "GlobalStorage.h" @@ -417,30 +418,37 @@ ChoicePage::applyActionChoice( ChoicePage::InstallChoice choice ) switch ( choice ) { case Erase: - if ( m_core->isDirty() ) { - ScanningDialog::run( QtConcurrent::run( [ = ] - { - QMutexLocker locker( &m_coreMutex ); - m_core->revertDevice( selectedDevice() ); - } ), - [ = ] - { - PartitionActions::doAutopartition( m_core, - selectedDevice(), - m_encryptWidget->passphrase() ); - emit deviceChosen(); - }, - this ); - } - else - { - PartitionActions::doAutopartition( m_core, - selectedDevice(), - m_encryptWidget->passphrase() ); - emit deviceChosen(); - } + auto gs = Calamares::JobQueue::instance()->globalStorage(); + PartitionActions::Choices::AutoPartitionOptions options { + gs->value( "defaultFileSystemType" ).toString(), + m_encryptWidget->passphrase(), + gs->value( "efiSystemPartition" ).toString(), + CalamaresUtils::GiBtoBytes( gs->value( "requiredStorageGB" ).toDouble() ), + static_cast( m_eraseSwapChoices->currentData().toInt() ) + }; + + if ( m_core->isDirty() ) + { + ScanningDialog::run( QtConcurrent::run( [ = ] + { + QMutexLocker locker( &m_coreMutex ); + m_core->revertDevice( selectedDevice() ); + } ), + [ = ] + { + PartitionActions::doAutopartition( m_core, selectedDevice(), options ); + emit deviceChosen(); + }, + this ); + } + else + { + PartitionActions::doAutopartition( m_core, selectedDevice(), options ); + emit deviceChosen(); + } + } break; case Replace: if ( m_core->isDirty() ) @@ -518,6 +526,7 @@ ChoicePage::doAlongsideSetupSplitter( const QModelIndex& current, ->value( "requiredStorageGB" ) .toDouble(); + // TODO: make this consistent qint64 requiredStorageB = qRound64( requiredStorageGB + 0.1 + 2.0 ) * 1024 * 1024 * 1024; m_afterPartitionSplitterWidget->setSplitPartition( @@ -802,14 +811,19 @@ ChoicePage::doReplaceSelectedPartition( const QModelIndex& current ) if ( homePartitionPath->isEmpty() ) doReuseHomePartition = false; - PartitionActions::doReplacePartition( m_core, - selectedDevice(), - selectedPartition, - m_encryptWidget->passphrase() ); + Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); + + PartitionActions::doReplacePartition( + m_core, + selectedDevice(), + selectedPartition, + { + gs->value( "defaultFileSystemType" ).toString(), + m_encryptWidget->passphrase() + } ); Partition* homePartition = KPMHelpers::findPartitionByPath( { selectedDevice() }, *homePartitionPath ); - Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); if ( homePartition && doReuseHomePartition ) { PartitionInfo::setMountPoint( homePartition, "/home" ); diff --git a/src/modules/partition/gui/ReplaceWidget.cpp b/src/modules/partition/gui/ReplaceWidget.cpp index 524932057..faedc03d4 100644 --- a/src/modules/partition/gui/ReplaceWidget.cpp +++ b/src/modules/partition/gui/ReplaceWidget.cpp @@ -85,6 +85,8 @@ ReplaceWidget::reset() void ReplaceWidget::applyChanges() { + auto gs = Calamares::JobQueue::instance()->globalStorage(); + PartitionModel* model = qobject_cast< PartitionModel* >( m_ui->partitionTreeView->model() ); if ( model ) { @@ -93,7 +95,9 @@ ReplaceWidget::applyChanges() { Device* dev = model->device(); - PartitionActions::doReplacePartition( m_core, dev, partition ); + PartitionActions::doReplacePartition( + m_core, dev, partition, + { gs->value( "defaultFileSystemType" ).toString(), QString() } ); if ( m_isEfi ) { @@ -102,17 +106,13 @@ ReplaceWidget::applyChanges() { PartitionInfo::setMountPoint( efiSystemPartitions.first(), - Calamares::JobQueue::instance()-> - globalStorage()-> - value( "efiSystemPartition" ).toString() ); + gs->value( "efiSystemPartition" ).toString() ); } else if ( efiSystemPartitions.count() > 1 ) { PartitionInfo::setMountPoint( efiSystemPartitions.at( m_ui->bootComboBox->currentIndex() ), - Calamares::JobQueue::instance()-> - globalStorage()-> - value( "efiSystemPartition" ).toString() ); + gs->value( "efiSystemPartition" ).toString() ); } } From 2a61116b3ca7cfa558e65b366ccf8f121385d1af Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 8 Oct 2018 15:32:02 -0400 Subject: [PATCH 15/74] [partition] Disable swap choice for replace & alongside --- src/modules/partition/gui/ChoicePage.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index 5b1577369..cc7819778 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -252,11 +252,13 @@ ChoicePage::setupChoices() m_eraseSwapChoices = createCombo( { SwapChoice::NoSwap, SwapChoice::SmallSwap, SwapChoice:: FullSwap } ); m_eraseButton->addOptionsComboBox( m_eraseSwapChoices ); +#if 0 m_replaceSwapChoices = createCombo( { SwapChoice::NoSwap, SwapChoice::ReuseSwap, SwapChoice::SmallSwap, SwapChoice::FullSwap } ); m_replaceButton->addOptionsComboBox( m_replaceSwapChoices ); m_alongsideSwapChoices = createCombo( { SwapChoice::NoSwap, SwapChoice::ReuseSwap, SwapChoice::SmallSwap, SwapChoice::FullSwap } ); m_alongsideButton->addOptionsComboBox( m_alongsideSwapChoices ); +#endif m_itemsLayout->addWidget( m_alongsideButton ); m_itemsLayout->addWidget( m_replaceButton ); From caa4b8ab53c8f26d8506d59b357b8fb7773ca147 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 9 Oct 2018 05:30:14 -0400 Subject: [PATCH 16/74] [partition] Document intention of new-style swap config --- .../partition/gui/PartitionViewStep.cpp | 35 +++++++++------ src/modules/partition/partition.conf | 43 +++++++++++-------- 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index 6ad1a6c77..608ca0d22 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -487,25 +487,36 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) gs->insert( "efiSystemPartition", QStringLiteral( "/boot/efi" ) ); } + // SWAP SETTINGS + // + // This is a bit convoluted because there's legacy settings to handle as well + // as the new-style list of choices, with mapping back-and-forth. + if ( configurationMap.contains( "userSwapChoices" ) && + ( configurationMap.contains( "ensureSuspendToDisk" ) || configurationMap.contains( "neverCreateSwap" ) ) ) + cError() << "Partition-module configuration mixes old- and new-style swap settings."; + + bool ensureSuspendToDisk = true; + if ( configurationMap.contains( "ensureSuspendToDisk" ) ) + cWarning() << "Partition-module setting *ensureSuspendToDisk* is deprecated."; if ( configurationMap.contains( "ensureSuspendToDisk" ) && configurationMap.value( "ensureSuspendToDisk" ).type() == QVariant::Bool ) - { - gs->insert( "ensureSuspendToDisk", configurationMap.value( "ensureSuspendToDisk" ).toBool() ); - } + ensureSuspendToDisk = configurationMap.value( "ensureSuspendToDisk" ).toBool(); else - { - gs->insert( "ensureSuspendToDisk", true ); - } + ensureSuspendToDisk = true; + bool neverCreateSwap = false; + if ( configurationMap.contains( "neverCreateSwap" ) ) + cWarning() << "Partition-module setting *neverCreateSwap* is deprecated."; if ( configurationMap.contains( "neverCreateSwap" ) && configurationMap.value( "neverCreateSwap" ).type() == QVariant::Bool ) - { - gs->insert( "neverCreateSwap", configurationMap.value( "neverCreateSwap" ).toBool() ); - } + neverCreateSwap = configurationMap.value( "neverCreateSwap" ).toBool(); else - { - gs->insert( "neverCreateSwap", false ); - } + neverCreateSwap = false; + + // These gs settings seem to be unused (in upstream Calamares) outside of + // the partition module itself. + gs->insert( "ensureSuspendToDisk", ensureSuspendToDisk ); + gs->insert( "neverCreateSwap", neverCreateSwap ); if ( configurationMap.contains( "drawNestedPartitions" ) && configurationMap.value( "drawNestedPartitions" ).type() == QVariant::Bool ) diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index 3e0ce5950..70d0ea17f 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -3,28 +3,37 @@ # etc.) use just /boot. efiSystemPartition: "/boot/efi" -# Make sure an autogenerated swap partition is big enough for hibernation in -# automated partitioning modes. Swap can be disabled through *neverCreateSwap*. +# In autogenerated partitioning, allow the user to select a swap size? +# If there is exactly one choice, no UI is presented, and the user +# cannot make a choice -- this setting is used. If there is more than +# one choice, a UI is presented. # -# - *neverCreateSwap* is true: no swap is created -# - *neverCreateSwap* is false (the default): swap is created, as follows: -# - *ensureSuspendToDisk* is true (default): Swap is always at least total -# memory size, and up to 4GiB RAM follows the rule-of-thumb 2 * memory; +# Legacy settings *neverCreateSwap* and *ensureSuspendToDisk* correspond +# to values of *userSwapChoices* as follows: +# - *neverCreateSwap* is true, means [none] +# - *neverCreateSwap* is false, *ensureSuspendToDisk* is false, [small] +# - *neverCreateSwap* is false, *ensureSuspendToDisk* is true, [suspend] +# +# Autogenerated swap sizes are as follows: +# - *suspend*: Swap is always at least total memory size, +# and up to 4GiB RAM follows the rule-of-thumb 2 * memory; # from 4GiB to 8 GiB it stays steady at 8GiB, and over 8 GiB memory # swap is the size of main memory. -# - *ensureSuspendToDisk* is false: Follows the rules above, but Swap is at +# - *small*: Follows the rules above, but Swap is at # most 8GiB, and no more than 10% of available disk. -# In both cases, a fudge factor (usually 10% extra) is applied so that there -# is some space for administrative overhead (e.g. 8 GiB swap will allocate -# 8.8GiB on disk in the end). -# -# Default is true. -ensureSuspendToDisk: true +# In both cases, a fudge factor (usually 10% extra) is applied so that there +# is some space for administrative overhead (e.g. 8 GiB swap will allocate +# 8.8GiB on disk in the end). +userSwapChoices: + - none # Create no swap, use no swap + # - reuse # Re-use existing swap, but don't create any + - small # Up to 4GB + - suspend # At least main memory size + # - file # To swap file instead of partition (unsupported right now) -# Never create swap partitions in automated partitioning modes. -# If this is true, ensureSuspendToDisk is ignored. -# Default is false. -neverCreateSwap: false +# LEGACY SETTINGS (these will generate a warning) +# ensureSuspendToDisk: true +# neverCreateSwap: false # Correctly draw nested (e.g. logical) partitions as such. drawNestedPartitions: false From 3d543e9063000e4e40ccd2d01a2f008c58162dfb Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 9 Oct 2018 05:46:12 -0400 Subject: [PATCH 17/74] [partition] Refactor to use current config-reading methods --- .../partition/gui/PartitionViewStep.cpp | 86 ++++--------------- 1 file changed, 18 insertions(+), 68 deletions(-) diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index 608ca0d22..9e8a120a7 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -476,16 +476,10 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) // Copy the efiSystemPartition setting to the global storage. It is needed not only in // the EraseDiskPage, but also in the bootloader configuration modules (grub, bootloader). Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); - if ( configurationMap.contains( "efiSystemPartition" ) && - configurationMap.value( "efiSystemPartition" ).type() == QVariant::String && - !configurationMap.value( "efiSystemPartition" ).toString().isEmpty() ) - { - gs->insert( "efiSystemPartition", configurationMap.value( "efiSystemPartition" ).toString() ); - } - else - { - gs->insert( "efiSystemPartition", QStringLiteral( "/boot/efi" ) ); - } + QString efiSP = CalamaresUtils::getString( configurationMap, "efiSystemPartition" ); + if ( efiSP.isEmpty() ) + efiSP = QStringLiteral( "/boot/efi" ); + gs->insert( "efiSystemPartition", efiSP ); // SWAP SETTINGS // @@ -495,78 +489,34 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) ( configurationMap.contains( "ensureSuspendToDisk" ) || configurationMap.contains( "neverCreateSwap" ) ) ) cError() << "Partition-module configuration mixes old- and new-style swap settings."; - bool ensureSuspendToDisk = true; if ( configurationMap.contains( "ensureSuspendToDisk" ) ) cWarning() << "Partition-module setting *ensureSuspendToDisk* is deprecated."; - if ( configurationMap.contains( "ensureSuspendToDisk" ) && - configurationMap.value( "ensureSuspendToDisk" ).type() == QVariant::Bool ) - ensureSuspendToDisk = configurationMap.value( "ensureSuspendToDisk" ).toBool(); - else - ensureSuspendToDisk = true; + bool ensureSuspendToDisk = CalamaresUtils::getBool( configurationMap, "ensureSuspendToDisk", true ); - bool neverCreateSwap = false; if ( configurationMap.contains( "neverCreateSwap" ) ) cWarning() << "Partition-module setting *neverCreateSwap* is deprecated."; - if ( configurationMap.contains( "neverCreateSwap" ) && - configurationMap.value( "neverCreateSwap" ).type() == QVariant::Bool ) - neverCreateSwap = configurationMap.value( "neverCreateSwap" ).toBool(); - else - neverCreateSwap = false; + bool neverCreateSwap = CalamaresUtils::getBool( configurationMap, "neverCreateSwap", false ); // These gs settings seem to be unused (in upstream Calamares) outside of // the partition module itself. gs->insert( "ensureSuspendToDisk", ensureSuspendToDisk ); gs->insert( "neverCreateSwap", neverCreateSwap ); - if ( configurationMap.contains( "drawNestedPartitions" ) && - configurationMap.value( "drawNestedPartitions" ).type() == QVariant::Bool ) - { - gs->insert( "drawNestedPartitions", - configurationMap.value( "drawNestedPartitions", false ).toBool() ); - } - else - { - gs->insert( "drawNestedPartitions", false ); - } + // OTHER SETTINGS + // + gs->insert( "drawNestedPartitions", CalamaresUtils::getBool( configurationMap, "drawNestedPartitions", false ) ); + gs->insert( "alwaysShowPartitionLabels", CalamaresUtils::getBool( configurationMap, "alwaysShowPartitionLabels", true ) ); + gs->insert( "enableLuksAutomatedPartitioning", CalamaresUtils::getBool( configurationMap, "enableLuksAutomatedPartitioning", true ) ); - if ( configurationMap.contains( "alwaysShowPartitionLabels" ) && - configurationMap.value( "alwaysShowPartitionLabels" ).type() == QVariant::Bool ) + QString defaultFS = CalamaresUtils::getString( configurationMap, "defaultFileSystemType" ); + if ( defaultFS.isEmpty() ) + defaultFS = QStringLiteral( "ext4" ); + if ( FileSystem::typeForName( defaultFS ) == FileSystem::Unknown ) { - gs->insert( "alwaysShowPartitionLabels", - configurationMap.value( "alwaysShowPartitionLabels", true ).toBool() ); - } - else - { - gs->insert( "alwaysShowPartitionLabels", true ); - } - - if ( configurationMap.contains( "defaultFileSystemType" ) && - configurationMap.value( "defaultFileSystemType" ).type() == QVariant::String && - !configurationMap.value( "defaultFileSystemType" ).toString().isEmpty() ) - { - QString typeString = configurationMap.value( "defaultFileSystemType" ).toString(); - gs->insert( "defaultFileSystemType", typeString ); - if ( FileSystem::typeForName( typeString ) == FileSystem::Unknown ) - { - cWarning() << "bad default filesystem configuration for partition module. Reverting to ext4 as default."; - gs->insert( "defaultFileSystemType", "ext4" ); - } - } - else - { - gs->insert( "defaultFileSystemType", QStringLiteral( "ext4" ) ); - } - - if ( configurationMap.contains( "enableLuksAutomatedPartitioning" ) && - configurationMap.value( "enableLuksAutomatedPartitioning" ).type() == QVariant::Bool ) - { - gs->insert( "enableLuksAutomatedPartitioning", - configurationMap.value( "enableLuksAutomatedPartitioning" ).toBool() ); - } - else - { - gs->insert( "enableLuksAutomatedPartitioning", true ); + cWarning() << "Partition-module setting *defaultFileSystemType* is bad (" << defaultFS << ") using ext4."; + defaultFS = QStringLiteral( "ext4" ); } + gs->insert( "defaultFileSystemType", defaultFS ); // Now that we have the config, we load the PartitionCoreModule in the background From c7645af358b548597def0d676e0a38b4b8dd4309 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 11 Oct 2018 06:27:39 -0400 Subject: [PATCH 18/74] [partition] Translate swap-choice-strings to enum - Handle legacy and modern config, mixed-configs, - Translate strings to enum values, - Default and warn as appropriate. - Doesn't **do** anything with the config, though. --- .../partition/gui/PartitionViewStep.cpp | 65 ++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index 9e8a120a7..bfd52b35e 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -21,6 +21,7 @@ #include "gui/PartitionViewStep.h" #include "core/DeviceModel.h" +#include "core/PartitionActions.h" #include "core/PartitionCoreModule.h" #include "core/PartitionModel.h" #include "core/KPMHelpers.h" @@ -470,6 +471,31 @@ PartitionViewStep::onLeave() } +static PartitionActions::Choices::SwapChoice +nameToChoice( QString name, bool& ok ) +{ + ok = false; + name = name.toLower(); + + using namespace PartitionActions::Choices; + + // Each return here first sets ok to true, returns enum value + if ( name == QStringLiteral( "none" ) ) + return( ok=true, SwapChoice::NoSwap ); + else if ( name == QStringLiteral( "small" ) ) + return( ok=true, SwapChoice::SmallSwap); + else if ( name == QStringLiteral( "suspend" ) ) + return( ok=true, SwapChoice::FullSwap ); + else if ( name == QStringLiteral( "reuse" ) ) + return( ok=true, SwapChoice::ReuseSwap ); + else if ( name == QStringLiteral( "file" ) ) + return( ok=true, SwapChoice::SwapFile ); + + ok = false; + return SwapChoice::NoSwap; +} + + void PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { @@ -497,6 +523,43 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) cWarning() << "Partition-module setting *neverCreateSwap* is deprecated."; bool neverCreateSwap = CalamaresUtils::getBool( configurationMap, "neverCreateSwap", false ); + QSet< PartitionActions::Choices::SwapChoice > choices; // Available swap choices + if ( configurationMap.contains( "userSwapChoices" ) ) + { + // We've already warned about overlapping settings with the + // legacy *ensureSuspendToDisk* and *neverCreateSwap*. + QStringList l = configurationMap[ "userSwapChoices" ].toStringList(); + + for ( const auto& item : l ) + { + bool ok = false; + auto v = nameToChoice( item, ok ); + if ( ok ) + choices.insert( v ); + } + + if ( choices.isEmpty() ) + { + cWarning() << "Partition-module configuration for *userSwapChoices* is empty:" << l; + choices.insert( PartitionActions::Choices::SwapChoice::FullSwap ); + } + + // suspend if it's one of the possible choices; suppress swap only if it's + // the **only** choice available. + ensureSuspendToDisk = choices.contains( PartitionActions::Choices::SwapChoice::FullSwap ); + neverCreateSwap = ( choices.count() == 1 ) && choices.contains( PartitionActions::Choices::SwapChoice::NoSwap ); + } + else + { + // Convert the legacy settings into a single setting for now. + if ( neverCreateSwap ) + choices.insert( PartitionActions::Choices::SwapChoice::NoSwap ); + else if ( ensureSuspendToDisk ) + choices.insert( PartitionActions::Choices::SwapChoice::FullSwap ); + else + choices.insert( PartitionActions::Choices::SwapChoice::SmallSwap ); + } + // These gs settings seem to be unused (in upstream Calamares) outside of // the partition module itself. gs->insert( "ensureSuspendToDisk", ensureSuspendToDisk ); @@ -524,7 +587,7 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) // and remove the spinner. QFutureWatcher< void >* watcher = new QFutureWatcher< void >(); connect( watcher, &QFutureWatcher< void >::finished, - this, [ this, watcher ] + this, [ this, watcher, choices ] { continueLoading(); watcher->deleteLater(); From 417eeedd9f05c23c4817a904b243dc3d655a4c13 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 11 Oct 2018 06:35:45 -0400 Subject: [PATCH 19/74] [partition] Calamares is spaced-out enough without extra's --- src/modules/partition/gui/ChoicePage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp index cc7819778..63bc9ea43 100644 --- a/src/modules/partition/gui/ChoicePage.cpp +++ b/src/modules/partition/gui/ChoicePage.cpp @@ -249,7 +249,7 @@ ChoicePage::setupChoices() // Fill up swap options // .. TODO: only if enabled in the config - m_eraseSwapChoices = createCombo( { SwapChoice::NoSwap, SwapChoice::SmallSwap, SwapChoice:: FullSwap } ); + m_eraseSwapChoices = createCombo( { SwapChoice::NoSwap, SwapChoice::SmallSwap, SwapChoice::FullSwap } ); m_eraseButton->addOptionsComboBox( m_eraseSwapChoices ); #if 0 From 463b1441a58c5189b70702ab96721c57dcf50e87 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 6 Nov 2018 05:54:45 -0500 Subject: [PATCH 20/74] [partition] Be more verbose about default file-system settings - Log the type that is configured - Document that this is a delicate setting, case-sensitive and dependent on KPMCore. --- src/modules/partition/gui/PartitionViewStep.cpp | 2 ++ src/modules/partition/partition.conf | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index bfd52b35e..0fdc4480b 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -574,6 +574,8 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) QString defaultFS = CalamaresUtils::getString( configurationMap, "defaultFileSystemType" ); if ( defaultFS.isEmpty() ) defaultFS = QStringLiteral( "ext4" ); + else + cDebug() << "Partition-module setting *defaultFileSystemType*" << defaultFS; if ( FileSystem::typeForName( defaultFS ) == FileSystem::Unknown ) { cWarning() << "Partition-module setting *defaultFileSystemType* is bad (" << defaultFS << ") using ext4."; diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index 70d0ea17f..229ffc32c 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -53,6 +53,8 @@ alwaysShowPartitionLabels: true # # Suggested values: ext2, ext3, ext4, reiser, xfs, jfs, btrfs # If nothing is specified, Calamares defaults to "ext4". +# +# Names are case-sensitive and defined by KPMCore. defaultFileSystemType: "ext4" # Show/hide LUKS related functionality in automated partitioning modes. From 97c9e5bdcd95166efbcc9a22045adc57b375394f Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 6 Nov 2018 06:22:02 -0500 Subject: [PATCH 21/74] [partition] Debug-log available file-system types --- src/modules/partition/gui/PartitionViewStep.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index 0fdc4480b..0152f8bec 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -580,6 +580,18 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { cWarning() << "Partition-module setting *defaultFileSystemType* is bad (" << defaultFS << ") using ext4."; defaultFS = QStringLiteral( "ext4" ); +#ifdef DEBUG_FILESYSTEMS + // This bit is for distro's debugging their settings, and shows + // all the strings that KPMCore is matching against for FS type. + { + Logger::CLog d( Logger::LOGDEBUG ); + using TR = Logger::DebugRow< int, QString >; + const auto fstypes = FileSystem::types(); + d << "Available types (" << fstypes.count() << ')'; + for ( FileSystem::Type t : fstypes ) + d << TR( static_cast( t ), FileSystem::nameForType( t ) ); + } +#endif } gs->insert( "defaultFileSystemType", defaultFS ); From 9816b6951f5dc8cdcf2971e27a6e89c01363ccfc Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 6 Nov 2018 06:36:51 -0500 Subject: [PATCH 22/74] CMake: add debugging flags to compile in debug mode --- CMakeLists.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4fb88420b..c4458c133 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,7 @@ option( WITH_PYTHON "Enable Python modules API (requires Boost.Python)." ON ) option( WITH_PYTHONQT "Enable next generation Python modules API (experimental, requires PythonQt)." ON ) option( WITH_KF5Crash "Enable crash reporting with KCrash." ON ) + ### USE_* # # By convention, when there are multiple modules that implement similar @@ -77,6 +78,7 @@ set( CALAMARES_VERSION_MINOR 2 ) set( CALAMARES_VERSION_PATCH 3 ) set( CALAMARES_VERSION_RC 1 ) + ### Transifex (languages) info # # complete = 100% translated, @@ -142,6 +144,11 @@ set( CMAKE_CXX_STANDARD_REQUIRED ON ) set( CMAKE_C_STANDARD 99 ) set( CMAKE_C_STANDARD_REQUIRED ON ) +# Debugging flags +set( CMAKE_CXX_FLAGS_DEBUG + "-DDEBUG_TIMEZONES -DDEBUG_FILESYSTEMS" + ) + set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall" ) if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) message( STATUS "Found Clang ${CMAKE_CXX_COMPILER_VERSION}, setting up Clang-specific compiler flags." ) @@ -175,7 +182,7 @@ if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) set( SUPPRESS_3RDPARTY_WARNINGS "-Wno-everything" ) set( SUPPRESS_BOOST_WARNINGS " -Wno-zero-as-null-pointer-constant -Wno-disabled-macro-expansion" ) - set( CMAKE_CXX_FLAGS_DEBUG "-g" ) + set( CMAKE_CXX_FLAGS_DEBUG "-g ${CMAKE_CXX_FLAGS_DEBUG}" ) set( CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG" ) set( CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG" ) set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g" ) From 33540749b244cb741c3e890771b2363e5a6d5f99 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 6 Nov 2018 06:37:55 -0500 Subject: [PATCH 23/74] CI: switch to debug builds --- ci/travis-config.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/travis-config.sh b/ci/travis-config.sh index 85e6a9790..260c4b78c 100644 --- a/ci/travis-config.sh +++ b/ci/travis-config.sh @@ -5,6 +5,7 @@ # This file is sourced by travis.sh, and exports the variables # to the environment. CMAKE_ARGS="\ + -DCMAKE_BUILD_TYPE=Debug \ -DWEBVIEW_FORCE_WEBKIT=1 \ -DKDE_INSTALL_USE_QT_SYS_PATHS=ON \ -DWITH_PYTHONQT=OFF" From b798c27bc43454f083b77c6cd312208be7c4de46 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 3 Dec 2018 16:28:40 +0100 Subject: [PATCH 24/74] [partition] Be more verbose while looking for fstab entries --- src/modules/partition/core/PartUtils.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp index 7dddec414..3ac17067b 100644 --- a/src/modules/partition/core/PartUtils.cpp +++ b/src/modules/partition/core/PartUtils.cpp @@ -177,6 +177,9 @@ lookForFstabEntries( const QString& partitionPath ) mountOptions.append( "noload" ); } + cDebug() << "Checking device" << partitionPath + << "for fstab (fs=" << r.getOutput() << ')'; + FstabEntryList fstabEntries; QTemporaryDir mountsDir; mountsDir.setAutoRemove( false ); @@ -185,6 +188,9 @@ lookForFstabEntries( const QString& partitionPath ) if ( !exit ) // if all is well { QFile fstabFile( mountsDir.path() + "/etc/fstab" ); + + cDebug() << " .. reading" << fstabFile.fileName(); + if ( fstabFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) { const QStringList fstabLines = QString::fromLocal8Bit( fstabFile.readAll() ) @@ -193,12 +199,18 @@ lookForFstabEntries( const QString& partitionPath ) for ( const QString& rawLine : fstabLines ) fstabEntries.append( FstabEntry::fromEtcFstab( rawLine ) ); fstabFile.close(); + cDebug() << " .. got" << fstabEntries.count() << "lines."; std::remove_if( fstabEntries.begin(), fstabEntries.end(), [](const FstabEntry& x) { return !x.isValid(); } ); + cDebug() << " .. got" << fstabEntries.count() << "fstab entries."; } + else + cWarning() << "Could not read fstab from mounted fs"; if ( QProcess::execute( "umount", { "-R", mountsDir.path() } ) ) cWarning() << "Could not unmount" << mountsDir.path(); } + else + cWarning() << "Could not mount existing fs"; return fstabEntries; } From 14c72824f030982363be7b076acb2b0fb1fc707e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 3 Dec 2018 16:42:40 +0100 Subject: [PATCH 25/74] [partition] Be chatty when deciding a partition isn't resizable --- src/modules/partition/core/PartUtils.cpp | 27 +++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp index 3ac17067b..d61064041 100644 --- a/src/modules/partition/core/PartUtils.cpp +++ b/src/modules/partition/core/PartUtils.cpp @@ -80,26 +80,47 @@ bool canBeResized( Partition* candidate ) { if ( !candidate ) + { + cDebug() << "Partition* is NULL"; return false; + } + cDebug() << "Checking if" << candidate->partitionPath() << "can be resized."; if ( !candidate->fileSystem().supportGrow() || !candidate->fileSystem().supportShrink() ) + { + cDebug() << " .. filesystem" << candidate->fileSystem().name() + << "does not support resize."; return false; + } if ( KPMHelpers::isPartitionFreeSpace( candidate ) ) + { + cDebug() << " .. partition is free space"; return false; + } if ( candidate->isMounted() ) + { + cDebug() << " .. partition is mounted"; return false; + } if ( candidate->roles().has( PartitionRole::Primary ) ) { PartitionTable* table = dynamic_cast< PartitionTable* >( candidate->parent() ); if ( !table ) + { + cDebug() << " .. no partition table found"; return false; + } if ( table->numPrimaries() >= table->maxPrimaries() ) + { + cDebug() << " .. partition table already has" + << table->maxPrimaries() << "primary partitions."; return false; + } } bool ok = false; @@ -136,11 +157,10 @@ bool canBeResized( PartitionCoreModule* core, const QString& partitionPath ) { //FIXME: check for max partitions count on DOS MBR - cDebug() << "checking if" << partitionPath << "can be resized."; + cDebug() << "Checking if" << partitionPath << "can be resized."; QString partitionWithOs = partitionPath; if ( partitionWithOs.startsWith( "/dev/" ) ) { - cDebug() << partitionWithOs << "seems like a good path"; DeviceModel* dm = core->deviceModel(); for ( int i = 0; i < dm->rowCount(); ++i ) { @@ -148,10 +168,11 @@ canBeResized( PartitionCoreModule* core, const QString& partitionPath ) Partition* candidate = KPMHelpers::findPartitionByPath( { dev }, partitionWithOs ); if ( candidate ) { - cDebug() << "found Partition* for" << partitionWithOs; + cDebug() << " .. found Partition* for" << partitionWithOs; return canBeResized( candidate ); } } + cDebug() << " .. no Partition* found for" << partitionWithOs; } cDebug() << "Partition" << partitionWithOs << "CANNOT BE RESIZED FOR AUTOINSTALL."; From a0766a6895658f33b8bd9c0a710f9cf0bad0a71f Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Mon, 3 Dec 2018 21:09:29 +0100 Subject: [PATCH 26/74] i18n: [calamares] Automatic merge of Transifex translations --- lang/calamares_de.ts | 2 +- lang/calamares_ru.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lang/calamares_de.ts b/lang/calamares_de.ts index dde1796be..ea9421a7b 100644 --- a/lang/calamares_de.ts +++ b/lang/calamares_de.ts @@ -2746,7 +2746,7 @@ Ausgabe: Physical Extent Size: - + Größe der Körpergröße: diff --git a/lang/calamares_ru.ts b/lang/calamares_ru.ts index 18740e526..6862e400d 100644 --- a/lang/calamares_ru.ts +++ b/lang/calamares_ru.ts @@ -821,7 +821,7 @@ The installer will quit and all changes will be lost. %1 - (%2) - + %1 - (%2) @@ -1724,7 +1724,7 @@ The installer will quit and all changes will be lost. New Volume Group - + Новая группа томов From e485f057d52279b1eb95a911629f27e3856c6d3a Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Mon, 3 Dec 2018 21:09:29 +0100 Subject: [PATCH 27/74] i18n: [desktop] Automatic merge of Transifex translations --- calamares.desktop | 158 +++++++++++++++++++++++----------------------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/calamares.desktop b/calamares.desktop index ca766ec81..b4c3a2693 100644 --- a/calamares.desktop +++ b/calamares.desktop @@ -14,168 +14,168 @@ Categories=Qt;System; X-AppStream-Ignore=true Name[ar]=نظام التثبيت -Comment[be]=Calamares — усталёўшчык сістэмы -Icon[be]=calamares Name[be]=Усталяваць сістэму +Icon[be]=calamares GenericName[be]=Усталёўшчык сістэмы -Comment[bg]=Calamares — Системен Инсталатор -Icon[bg]=calamares +Comment[be]=Calamares — усталёўшчык сістэмы Name[bg]=Инсталирай системата +Icon[bg]=calamares GenericName[bg]=Системен Инсталатор -Comment[ca]=Calamares — Instal·lador de sistema -Icon[ca]=calamares +Comment[bg]=Calamares — Системен Инсталатор Name[ca]=Instal·la el sistema +Icon[ca]=calamares GenericName[ca]=Instal·lador de sistema -Comment[da]=Calamares — Systeminstallationsprogram -Icon[da]=calamares +Comment[ca]=Calamares — Instal·lador de sistema Name[da]=Installér system +Icon[da]=calamares GenericName[da]=Systeminstallationsprogram -Comment[de]=Calamares - Installation des Betriebssystems -Icon[de]=calamares +Comment[da]=Calamares — Systeminstallationsprogram Name[de]=System installieren +Icon[de]=calamares GenericName[de]=Installation des Betriebssystems -Comment[el]=Calamares — Εγκατάσταση συστήματος -Icon[el]=calamares +Comment[de]=Calamares - Installation des Betriebssystems Name[el]=Εγκατάσταση συστήματος +Icon[el]=calamares GenericName[el]=Εγκατάσταση συστήματος -Comment[en_GB]=Calamares — System Installer -Icon[en_GB]=calamares +Comment[el]=Calamares — Εγκατάσταση συστήματος Name[en_GB]=Install System +Icon[en_GB]=calamares GenericName[en_GB]=System Installer -Comment[es]=Calamares — Instalador del Sistema -Icon[es]=calamares +Comment[en_GB]=Calamares — System Installer Name[es]=Instalar Sistema +Icon[es]=calamares GenericName[es]=Instalador del Sistema -Comment[et]=Calamares — süsteemipaigaldaja -Icon[et]=calamares +Comment[es]=Calamares — Instalador del Sistema Name[et]=Paigalda süsteem +Icon[et]=calamares GenericName[et]=Süsteemipaigaldaja +Comment[et]=Calamares — süsteemipaigaldaja Name[eu]=Sistema instalatu Name[es_PR]=Instalar el sistema -Comment[fr]=Calamares - Installateur système -Icon[fr]=calamares Name[fr]=Installer le système +Icon[fr]=calamares GenericName[fr]=Installateur système -Comment[gl]=Calamares — Instalador de sistemas -Icon[gl]=calamares +Comment[fr]=Calamares - Installateur système Name[gl]=Instalación do Sistema +Icon[gl]=calamares GenericName[gl]=Instalador de sistemas -Comment[he]=Calamares - אשף התקנה -Icon[he]=calamares +Comment[gl]=Calamares — Instalador de sistemas Name[he]=התקנת מערכת +Icon[he]=calamares GenericName[he]=אשף התקנה -Comment[hi]=Calamares — सिस्टम इंस्टॉलर -Icon[hi]=calamares +Comment[he]=Calamares - אשף התקנה Name[hi]=सिस्टम इंस्टॉल करें +Icon[hi]=calamares GenericName[hi]=सिस्टम इंस्टॉलर -Comment[hr]=Calamares — Instalacija sustava -Icon[hr]=calamares +Comment[hi]=Calamares — सिस्टम इंस्टॉलर Name[hr]=Instaliraj sustav +Icon[hr]=calamares GenericName[hr]=Instalacija sustava -Comment[hu]=Calamares – Rendszertelepítő -Icon[hu]=calamares +Comment[hr]=Calamares — Instalacija sustava Name[hu]=Rendszer telepítése +Icon[hu]=calamares GenericName[hu]=Rendszertelepítő -Comment[id]=Calamares — Pemasang Sistem -Icon[id]=calamares +Comment[hu]=Calamares – Rendszertelepítő Name[id]=Instal Sistem +Icon[id]=calamares GenericName[id]=Pemasang -Comment[is]=Calamares — Kerfis uppsetning -Icon[is]=calamares +Comment[id]=Calamares — Pemasang Sistem Name[is]=Setja upp kerfið +Icon[is]=calamares GenericName[is]=Kerfis uppsetning -Comment[cs_CZ]=Calamares – instalátor operačních systémů -Icon[cs_CZ]=calamares +Comment[is]=Calamares — Kerfis uppsetning Name[cs_CZ]=Nainstalovat +Icon[cs_CZ]=calamares GenericName[cs_CZ]=Instalátor systému -Comment[ja]=Calamares — システムインストーラー -Icon[ja]=calamares +Comment[cs_CZ]=Calamares – instalátor operačních systémů Name[ja]=システムをインストール +Icon[ja]=calamares GenericName[ja]=システムインストーラー -Comment[ko]=깔라마레스 — 시스템 설치 관리자 -Icon[ko]=깔라마레스 +Comment[ja]=Calamares — システムインストーラー Name[ko]=시스템 설치 +Icon[ko]=깔라마레스 GenericName[ko]=시스템 설치 관리자 -Comment[lt]=Calamares — Sistemos diegimo programa -Icon[lt]=calamares +Comment[ko]=깔라마레스 — 시스템 설치 관리자 Name[lt]=Įdiegti Sistemą +Icon[lt]=calamares GenericName[lt]=Sistemos diegimas į kompiuterį -Comment[it_IT]=Calamares — Programma d'installazione del sistema -Icon[it_IT]=calamares +Comment[lt]=Calamares — Sistemos diegimo programa Name[it_IT]=Installa il sistema +Icon[it_IT]=calamares GenericName[it_IT]=Programma d'installazione del sistema -Comment[nb]=Calamares-systeminstallatør -Icon[nb]=calamares +Comment[it_IT]=Calamares — Programma d'installazione del sistema Name[nb]=Installer System +Icon[nb]=calamares GenericName[nb]=Systeminstallatør -Comment[nl]=Calamares — Installatieprogramma -Icon[nl]=calamares +Comment[nb]=Calamares-systeminstallatør Name[nl]=Installeer systeem +Icon[nl]=calamares GenericName[nl]=Installatieprogramma -Comment[pl]=Calamares — Instalator systemu -Icon[pl]=calamares +Comment[nl]=Calamares — Installatieprogramma Name[pl]=Zainstaluj system +Icon[pl]=calamares GenericName[pl]=Instalator systemu -Comment[pt_BR]=Calamares — Instalador de Sistema -Icon[pt_BR]=calamares +Comment[pl]=Calamares — Instalator systemu Name[pt_BR]=Sistema de Instalação +Icon[pt_BR]=calamares GenericName[pt_BR]=Instalador de Sistema -Comment[ro]=Calamares — Instalator de sistem -Icon[ro]=calamares +Comment[pt_BR]=Calamares — Instalador de Sistema Name[ro]=Instalează sistemul +Icon[ro]=calamares GenericName[ro]=Instalator de sistem -Comment[ru]=Calamares - Установщик системы -Icon[ru]=calamares +Comment[ro]=Calamares — Instalator de sistem Name[ru]=Установить систему +Icon[ru]=calamares GenericName[ru]=Установщик системы -Comment[sk]=Calamares — Inštalátor systému -Icon[sk]=calamares +Comment[ru]=Calamares - Установщик системы Name[sk]=Inštalovať systém +Icon[sk]=calamares GenericName[sk]=Inštalátor systému +Comment[sk]=Calamares — Inštalátor systému Name[sl]=Namesti sistem -Comment[sq]=Calamares — Instalues Sistemi -Icon[sq]=calamares Name[sq]=Instalo Sistemin +Icon[sq]=calamares GenericName[sq]=Instalues Sistemi -Comment[fi_FI]=Calamares — Järjestelmän Asentaja -Icon[fi_FI]=calamares +Comment[sq]=Calamares — Instalues Sistemi Name[fi_FI]=Asenna Järjestelmä +Icon[fi_FI]=calamares GenericName[fi_FI]=Järjestelmän Asennusohjelma +Comment[fi_FI]=Calamares — Järjestelmän Asentaja Name[sr@latin]=Instaliraj sistem Name[sr]=Инсталирај систем -Comment[sv]=Calamares — Systeminstallerare -Icon[sv]=calamares Name[sv]=Installera system +Icon[sv]=calamares GenericName[sv]=Systeminstallerare +Comment[sv]=Calamares — Systeminstallerare Name[th]=ติดตั้งระบบ -Comment[uk]=Calamares - Встановлювач системи Name[uk]=Встановити Систему GenericName[uk]=Встановлювач системи -Comment[zh_CN]=Calamares — 系统安装程序 -Icon[zh_CN]=calamares +Comment[uk]=Calamares - Встановлювач системи Name[zh_CN]=安装系统 +Icon[zh_CN]=calamares GenericName[zh_CN]=系统安装程序 -Comment[zh_TW]=Calamares ── 系統安裝程式 -Icon[zh_TW]=calamares +Comment[zh_CN]=Calamares — 系统安装程序 Name[zh_TW]=安裝系統 +Icon[zh_TW]=calamares GenericName[zh_TW]=系統安裝程式 -Comment[ast]=Calamares — Instalador del sistema -Icon[ast]=calamares +Comment[zh_TW]=Calamares ── 系統安裝程式 Name[ast]=Instalar sistema +Icon[ast]=calamares GenericName[ast]=Instalador del sistema -Comment[eo]=Calamares — Sistema Instalilo -Icon[eo]=calamares +Comment[ast]=Calamares — Instalador del sistema Name[eo]=Instali Sistemo +Icon[eo]=calamares GenericName[eo]=Sistema Instalilo -Comment[es_MX]=Calamares - Instalador del sistema -Icon[es_MX]=calamares +Comment[eo]=Calamares — Sistema Instalilo Name[es_MX]=Instalar el Sistema +Icon[es_MX]=calamares GenericName[es_MX]=Instalador del sistema -Comment[pt_PT]=Calamares - Instalador de Sistema -Icon[pt_PT]=calamares +Comment[es_MX]=Calamares - Instalador del sistema Name[pt_PT]=Instalar Sistema +Icon[pt_PT]=calamares GenericName[pt_PT]=Instalador de Sistema -Comment[tr_TR]=Calamares — Sistem Yükleyici -Icon[tr_TR]=calamares +Comment[pt_PT]=Calamares - Instalador de Sistema Name[tr_TR]=Sistemi Yükle +Icon[tr_TR]=calamares GenericName[tr_TR]=Sistem Yükleyici +Comment[tr_TR]=Calamares — Sistem Yükleyici From 6ac872e7240dbe64411171865d2074b3b6ca4861 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Mon, 3 Dec 2018 21:09:30 +0100 Subject: [PATCH 28/74] i18n: [dummypythonqt] Automatic merge of Transifex translations --- .../lang/fr/LC_MESSAGES/dummypythonqt.mo | Bin 972 -> 977 bytes .../lang/fr/LC_MESSAGES/dummypythonqt.po | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/dummypythonqt/lang/fr/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/fr/LC_MESSAGES/dummypythonqt.mo index 45d8fc355cbf8ecdbff4d714acd3680e51a8a761..c309c24d636d241917cb95391d0ede31cff84c73 100644 GIT binary patch delta 76 zcmX@Zevy4bi0LXu28IM67Ghvv;AUoEFb2|cK$-_g2LWkGARP~+#esAskhTZX6E}AD SF|rjD<(K5=ZI)o#!UzDK`wVvg delta 71 zcmcb}eujNQi0M*B28IM67GhvvU}I)rFb2|+K$-_g`vPf6ARPsy#esAQkhTZXJsUgw N7#Y(y%Q9_Y1OQxF3K;+Z diff --git a/src/modules/dummypythonqt/lang/fr/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/fr/LC_MESSAGES/dummypythonqt.po index 082109871..fe75d0c55 100644 --- a/src/modules/dummypythonqt/lang/fr/LC_MESSAGES/dummypythonqt.po +++ b/src/modules/dummypythonqt/lang/fr/LC_MESSAGES/dummypythonqt.po @@ -5,7 +5,7 @@ # # Translators: # Paul Combal , 2017 -# Aestan , 2018 +# Aestan , 2018 # #, fuzzy msgid "" @@ -14,7 +14,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-05 11:34-0400\n" "PO-Revision-Date: 2016-12-16 12:18+0000\n" -"Last-Translator: Aestan , 2018\n" +"Last-Translator: Aestan , 2018\n" "Language-Team: French (https://www.transifex.com/calamares/teams/20061/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" From dc92415ae0724321049863d7ac5ec42f7ae7350c Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Mon, 3 Dec 2018 21:09:30 +0100 Subject: [PATCH 29/74] i18n: [python] Automatic merge of Transifex translations --- lang/python/fr/LC_MESSAGES/python.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/python/fr/LC_MESSAGES/python.po b/lang/python/fr/LC_MESSAGES/python.po index c1c4af1ef..d869f977d 100644 --- a/lang/python/fr/LC_MESSAGES/python.po +++ b/lang/python/fr/LC_MESSAGES/python.po @@ -6,7 +6,7 @@ # Translators: # Paul Combal , 2017 # Abdallah B , 2017 -# Aestan , 2018 +# Aestan , 2018 # Jeremy Gourmel , 2018 # #, fuzzy From b8595a1323b7826744b99ad6d2e94f682bd16794 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 3 Dec 2018 21:44:29 +0100 Subject: [PATCH 30/74] CMake: relax debugging flags again --- CMakeLists.txt | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c4458c133..faaab2283 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -145,9 +145,24 @@ set( CMAKE_C_STANDARD 99 ) set( CMAKE_C_STANDARD_REQUIRED ON ) # Debugging flags -set( CMAKE_CXX_FLAGS_DEBUG - "-DDEBUG_TIMEZONES -DDEBUG_FILESYSTEMS" - ) +# +# Possible debugging flags are: +# - DEBUG_TIMEZONES draws latitude and longitude lines on the timezone +# widget and enables chatty debug logging, for dealing with the timezone +# location database. +# - DEBUG_FILESYSTEMS does extra logging and checking when looking at +# partition configuration. Lists known KPMCore FS types. +# +# The flags listed here are enabled in Debug builds. By default, none +# are **actually** listed, because they're for such specific scenarios. +set( _enable_debug_flags + # DEBUG_TIMEZONES + # DEBUG_FILESYSTEMS +) +# Add those flags to the CXX flags in a suitable format. +foreach( _edf ${_enable_debug_flags} ) + string( APPEND CMAKE_CXX_FLAGS_DEBUG " -D${_edf}" ) +endforeach() set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall" ) if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) From d7f0a1b93781fa77bcec0ea9dd1c3f90512c072b Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 11 Dec 2018 13:55:31 +0100 Subject: [PATCH 31/74] [lang] Xml could be option, this is developer tooling after all --- lang/CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt index 65c0c4ca2..37ea8356c 100644 --- a/lang/CMakeLists.txt +++ b/lang/CMakeLists.txt @@ -18,7 +18,8 @@ # ### -find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED Xml ) - -add_executable(txload txload.cpp) -target_link_libraries(txload Qt5::Xml) +find_package(Qt5 COMPONENTS Xml) +if( Qt5Xml_FOUND ) + add_executable(txload txload.cpp) + target_link_libraries(txload Qt5::Xml) +endif() From 33c5baa9f31bef11ac62ccf230ad410b17c509b9 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 11 Dec 2018 14:03:18 +0100 Subject: [PATCH 32/74] [lang] Add usage information - This developer tool was originally committed with a not-useful commit message, no usage info, and no documentation. Bad [ade]. --- lang/txload.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lang/txload.cpp b/lang/txload.cpp index 51b9dacb1..36e0f71a2 100644 --- a/lang/txload.cpp +++ b/lang/txload.cpp @@ -16,6 +16,11 @@ * along with Calamares. If not, see . */ +/* + * Tool to find differences between translations (can be used to help + * merging them into one). See usage string, below, for details. + */ + #include #include #include @@ -23,6 +28,16 @@ #include +static const char usage[] = "Usage: txload [ ...]\n" + "\n" + "Reads a .ts source file and zero or more .ts \n" + "files, and does a comparison between the translations. Source (English)\n" + "strings that are untranslated are flagged in each of the translation\n" + "files, while differences in the translations are themselves also shown.\n" + "\n" + "Outputs to stdout a human-readable list of differences between the\n" + "translations.\n"; + bool load_file(const char* filename, QDomDocument& doc) { QFile file(filename); @@ -158,7 +173,10 @@ int main(int argc, char** argv) QCoreApplication a(argc, argv); if (argc < 2) + { + qWarning() << usage; return 1; + } QDomDocument doc("master"); if ( !load_file(argv[1], doc) ) From 19617fc42dbfd0fb43efada69470bd6a8c4a4750 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 11 Dec 2018 14:23:23 +0100 Subject: [PATCH 33/74] CI: more debugging due to disk-space problems --- ci/travis-continuous.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci/travis-continuous.sh b/ci/travis-continuous.sh index 1b3841e54..afa46e16c 100755 --- a/ci/travis-continuous.sh +++ b/ci/travis-continuous.sh @@ -15,9 +15,11 @@ cd $BUILDDIR || exit 1 echo "###" echo "### cmake $CMAKE_ARGS $SRCDIR" echo "###" +df -h cmake $CMAKE_ARGS $SRCDIR || { echo "! CMake failed" ; exit 1 ; } echo -e "###\n### make\n###" +df -h make -j2 || { make -j1 VERBOSE=1 ; echo "! Make failed" ; exit 1 ; } echo -e "###\n### make install\n###" From c4b5360d911e30adabe4c259c4629d2c1fae1b08 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 11 Dec 2018 14:53:06 +0100 Subject: [PATCH 34/74] CI: more debugging due to disk-space problems --- ci/travis-continuous.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ci/travis-continuous.sh b/ci/travis-continuous.sh index afa46e16c..4ecd7159b 100755 --- a/ci/travis-continuous.sh +++ b/ci/travis-continuous.sh @@ -15,12 +15,13 @@ cd $BUILDDIR || exit 1 echo "###" echo "### cmake $CMAKE_ARGS $SRCDIR" echo "###" +pwd -P df -h cmake $CMAKE_ARGS $SRCDIR || { echo "! CMake failed" ; exit 1 ; } echo -e "###\n### make\n###" df -h -make -j2 || { make -j1 VERBOSE=1 ; echo "! Make failed" ; exit 1 ; } +make -j2 || { pwd -P ; df -h ; make -j1 VERBOSE=1 ; echo "! Make failed" ; exit 1 ; } echo -e "###\n### make install\n###" From 59e30e3cdb964bca617e53bff4b94e44c49f38aa Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 11 Dec 2018 15:25:39 +0100 Subject: [PATCH 35/74] CI: yet another attempt to debug the disk-space failures --- ci/travis-continuous.sh | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/ci/travis-continuous.sh b/ci/travis-continuous.sh index 4ecd7159b..aefaca6f8 100755 --- a/ci/travis-continuous.sh +++ b/ci/travis-continuous.sh @@ -12,26 +12,26 @@ test -f $SRCDIR/CMakeLists.txt || { echo "! Missing $SRCDIR/CMakeLists.txt" ; ex cd $BUILDDIR || exit 1 +section() { echo "###" -echo "### cmake $CMAKE_ARGS $SRCDIR" +echo "### $1" echo "###" pwd -P df -h +} + +section "cmake $CMAKE_ARGS $SRCDIR" cmake $CMAKE_ARGS $SRCDIR || { echo "! CMake failed" ; exit 1 ; } -echo -e "###\n### make\n###" -df -h -make -j2 || { pwd -P ; df -h ; make -j1 VERBOSE=1 ; echo "! Make failed" ; exit 1 ; } +section "make" +make -j2 || { echo "! Make recheck" ; pwd -P ; df -h ; make -j1 VERBOSE=1 ; echo "! Make failed" ; exit 1 ; } -echo -e "###\n### make install\n###" +section "make install" install_debugging() { ls -la $( find "$1" -type f -name '*.so' ) } -echo "# System status" -df -h - echo "# Build results" install_debugging "$BUILDDIR" @@ -48,10 +48,8 @@ else result=false fi -echo "# System status" -df -h -echo "# Install results" +section "Install results" install_debugging "$DESTDIR" $result || { echo "! Install failed" ; exit 1 ; } # Result of make install, above From 6798d613d87536d216e2e13752ebc9413d8a813e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 11 Dec 2018 15:40:02 +0100 Subject: [PATCH 36/74] CI: guess that debug builds are way too big for Travis --- ci/travis-config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/travis-config.sh b/ci/travis-config.sh index 260c4b78c..565b3deba 100644 --- a/ci/travis-config.sh +++ b/ci/travis-config.sh @@ -5,7 +5,7 @@ # This file is sourced by travis.sh, and exports the variables # to the environment. CMAKE_ARGS="\ - -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_BUILD_TYPE=Release \ -DWEBVIEW_FORCE_WEBKIT=1 \ -DKDE_INSTALL_USE_QT_SYS_PATHS=ON \ -DWITH_PYTHONQT=OFF" From 1321ba15252a6304e504b901cacc98feb38e898d Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Tue, 11 Dec 2018 19:31:21 +0100 Subject: [PATCH 37/74] i18n: [calamares] Automatic merge of Transifex translations --- lang/calamares_bg.ts | 2 +- lang/calamares_es.ts | 38 +- lang/calamares_id.ts | 206 +-- lang/calamares_is.ts | 30 +- lang/calamares_ja.ts | 2 +- lang/calamares_mk.ts | 2847 ++++++++++++++++++++++++++++++++++++++++++ lang/calamares_ru.ts | 41 +- 7 files changed, 3007 insertions(+), 159 deletions(-) create mode 100644 lang/calamares_mk.ts diff --git a/lang/calamares_bg.ts b/lang/calamares_bg.ts index 2a69a9ef6..55a48e1a8 100644 --- a/lang/calamares_bg.ts +++ b/lang/calamares_bg.ts @@ -2774,7 +2774,7 @@ Output: Total Sectors: - + Общо сектори: diff --git a/lang/calamares_es.ts b/lang/calamares_es.ts index 17c5cbde8..42c359fef 100644 --- a/lang/calamares_es.ts +++ b/lang/calamares_es.ts @@ -720,22 +720,22 @@ Saldrá del instalador y se perderán todos los cambios. Create new volume group named %1. - + Crear un nuevo grupo de volúmenes llamado %1. Create new volume group named <strong>%1</strong>. - + Crear un nuevo grupo de volúmenes llamado <strong>%1</strong>. Creating new volume group named %1. - + Creando un nuevo grupo de volúmenes llamado %1. The installer failed to create a volume group named '%1'. - + El instalador falló en crear un grupo de volúmenes llamado '%1'. @@ -744,17 +744,17 @@ Saldrá del instalador y se perderán todos los cambios. Deactivate volume group named %1. - + Desactivar grupo de volúmenes llamado %1. Deactivate volume group named <strong>%1</strong>. - + Desactivar grupo de volúmenes llamado <strong>%1</strong>. The installer failed to deactivate a volume group named %1. - + El instalador falló en desactivar el grupo de volúmenes llamado %1. @@ -823,7 +823,7 @@ Saldrá del instalador y se perderán todos los cambios. %1 - (%2) - + %1-(%2) @@ -1726,27 +1726,27 @@ Saldrá del instalador y se perderán todos los cambios. New Volume Group - + Nuevo grupo de volúmenes Resize Volume Group - + Cambiar el tamaño del grupo de volúmenes Deactivate Volume Group - + Desactivar grupo de volúmenes Remove Volume Group - + Remover grupo de volúmenes I&nstall boot loader on: - + Instalar gestor de arranque en: @@ -2034,12 +2034,12 @@ Salida: Remove Volume Group named %1. - + Remover grupo de volúmenes llamado %1. Remove Volume Group named <strong>%1</strong>. - + Remover grupo de volúmenes llamado <strong>%1</strong>. @@ -2280,12 +2280,12 @@ Salida: Resize volume group named %1 from %2 to %3. - + Cambiar el tamaño del grupo de volúmenes llamado %1 de %2 a %3. Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong>. - + Cambiar el tamaño del grupo de volúmenes llamado <strong>%1</strong> de <strong>%2</strong> a <strong>%3</strong>. @@ -2747,7 +2747,7 @@ Salida: Physical Extent Size: - + Tamaño de sector físico: @@ -2780,7 +2780,7 @@ Salida: Quantity of LVs: - + Cantidad de LVs: diff --git a/lang/calamares_id.ts b/lang/calamares_id.ts index 3fd711dd1..0e59d2c45 100644 --- a/lang/calamares_id.ts +++ b/lang/calamares_id.ts @@ -9,12 +9,12 @@ 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. - Sistem ini telah dimulai dengan lingkungan boot <strong>EFI</strong>.<br><br>Untuk mengkonfigurasi startup dari lingkungan EFI, pemasang ini seharusnya memaparkan sebuah aplikasi boot loader, seperti <strong>GRUB</strong> atau <strong>systemd-boot</strong> pada sebuah <strong>EFI System Partition</strong>. Ini adalah otomatis, kecuali kalau kamu memilih pemartisian manual, dalam beberapa kasus kamu harus memilihnya atau menciptakannya pada milikmu. + Sistem ini telah dimulai dengan lingkungan boot <strong>EFI</strong>.<br><br>Untuk mengkonfigurasi startup dari lingkungan EFI, installer ini seharusnya memaparkan sebuah aplikasi boot loader, seperti <strong>GRUB</strong> atau <strong>systemd-boot</strong> pada sebuah <strong>EFI System Partition</strong>. Ini adalah otomatis, kecuali kalau kamu memilih pemartisian manual, dalam beberapa kasus kamu harus memilihnya atau menciptakannya pada milikmu. 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. - Sistem ini dimulai dengan sebuah lingkungan boot <strong>BIOS</strong>.<br><br>Untuk mengkonfigurasi startup dari sebuah lingkungan BIOS, pemasang ini seharusnya memasang sebuah boot loader, seperti <strong>GRUB</strong>, baik di awal partisi atau pada <strong>Master Boot Record</strong> di dekat awalan tabel partisi (yang disukai). Ini adalah otomatis, kecuali kalau kamu memilih pemartisian manual, dalam beberapa kasus kamu harus menyetelnya pada milikmu. + Sistem ini dimulai dengan sebuah lingkungan boot <strong>BIOS</strong>.<br><br>Untuk mengkonfigurasi startup dari sebuah lingkungan BIOS, installer ini seharusnya memasang sebuah boot loader, seperti <strong>GRUB</strong>, baik di awal partisi atau pada <strong>Master Boot Record</strong> di dekat awalan tabel partisi (yang disukai). Ini adalah otomatis, kecuali kalau kamu memilih pemartisian manual, dalam beberapa kasus kamu harus menyetelnya pada milikmu. @@ -37,7 +37,7 @@ Do not install a boot loader - Jangan pasang boot loader + Jangan instal boot loader @@ -107,7 +107,7 @@ Install - Pasang + Instal @@ -187,7 +187,7 @@ Cancel installation without changing the system. - Batal pemasangan tanpa mengubah sistem yang ada. + Batalkan instalasi tanpa mengubah sistem yang ada. @@ -197,7 +197,7 @@ %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. - %1 tidak dapat terpasang. Calamares tidak dapat memuat seluruh modul konfigurasi. Terdapat masalah dengan Calamares karena sedang digunakan oleh distribusi. + %1 tidak dapat terinstal. Calamares tidak dapat memuat seluruh modul konfigurasi. Terdapat masalah dengan Calamares karena sedang digunakan oleh distribusi. @@ -207,19 +207,19 @@ &Install - &Pasang + &Instal Cancel installation? - Batalkan pemasangan? + Batalkan instalasi? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - Apakah Anda benar-benar ingin membatalkan proses pemasangan ini? -Pemasangan akan ditutup dan semua perubahan akan hilang. + Apakah Anda benar-benar ingin membatalkan proses instalasi ini? +Instalasi akan ditutup dan semua perubahan akan hilang. @@ -244,12 +244,12 @@ Pemasangan akan ditutup dan semua perubahan akan hilang. 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> - Pemasang %1 akan membuat perubahan ke disk Anda untuk memasang %2.<br/><strong>Anda tidak dapat membatalkan perubahan tersebut.</strong> + Installer %1 akan membuat perubahan ke disk Anda untuk memasang %2.<br/><strong>Anda tidak dapat membatalkan perubahan tersebut.</strong> &Install now - &Pasang sekarang + &Instal sekarang @@ -264,7 +264,7 @@ Pemasangan akan ditutup dan semua perubahan akan hilang. The installation is complete. Close the installer. - Pemasangan sudah lengkap. Tutup pemasang. + Instalasi sudah lengkap. Tutup installer. @@ -274,7 +274,7 @@ Pemasangan akan ditutup dan semua perubahan akan hilang. Installation Failed - Pemasangan Gagal + Instalasi Gagal @@ -305,7 +305,7 @@ Pemasangan akan ditutup dan semua perubahan akan hilang. %1 Installer - Pemasang %1 + Installer %1 @@ -319,13 +319,13 @@ Pemasangan akan ditutup dan semua perubahan akan hilang. This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> Komputer ini tidak memenuhi syarat minimum untuk memasang %1. -Pemasang tidak dapat dilanjutkan. <a href=" +Installer tidak dapat dilanjutkan. <a href=" This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. Komputer ini tidak memenuhi beberapa syarat yang dianjurkan untuk memasang %1. -Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. +Instalasi dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. @@ -437,7 +437,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. - <strong>Pasang berdampingan dengan</strong><br/>Pemasang akan mengiris sebuah partisi untuk memberi ruang bagi %1. + <strong>Instal berdampingan dengan</strong><br/>Installer akan mengiris sebuah partisi untuk memberi ruang bagi %1. @@ -624,7 +624,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. The installer failed to create partition on disk '%1'. - Pemasang gagal untuk membuat partisi di disk '%1'. + Installer gagal untuk membuat partisi di disk '%1'. @@ -675,7 +675,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. The installer failed to create a partition table on %1. - Pemasang gagal membuat tabel partisi pada %1. + Installer gagal membuat tabel partisi pada %1. @@ -721,22 +721,22 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Create new volume group named %1. - + Ciptakan grup volume baru bernama %1. Create new volume group named <strong>%1</strong>. - + Ciptakan grup volume baru bernama <strong>%1</strong>. Creating new volume group named %1. - + Menciptakan grup volume baru bernama %1. The installer failed to create a volume group named '%1'. - + Installer gagal menciptakan sebuah grup volume bernama '%1'. @@ -745,17 +745,17 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Deactivate volume group named %1. - + Nonaktifkan grup volume bernama %1. Deactivate volume group named <strong>%1</strong>. - + Nonaktifkan grup volume bernama <strong>%1</strong>. The installer failed to deactivate a volume group named %1. - + Installer gagal menonaktifkan sebuah grup volume bernama %1. @@ -778,7 +778,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. The installer failed to delete partition %1. - Pemasang gagal untuk menghapus partisi %1. + Installer gagal untuk menghapus partisi %1. @@ -786,7 +786,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. 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. - Tipe dari <strong>tabel partisi</strong> pada perangkat penyimpanan terpilih.<br><br>Satu-satunya cara untuk mengubah tabel partisi adalah dengan menyetip dan menciptakan ulang tabel partisi dari awal, yang melenyapkan semua data pada perangkat penyimpanan.<br>Pemasang ini akan menjaga tabel partisi saat ini kecuali kamu secara gamblang memilih sebaliknya.<br>Jika tidak yakin, pada sistem GPT modern lebih disukai. + Tipe dari <strong>tabel partisi</strong> pada perangkat penyimpanan terpilih.<br><br>Satu-satunya cara untuk mengubah tabel partisi adalah dengan menyetip dan menciptakan ulang tabel partisi dari awal, yang melenyapkan semua data pada perangkat penyimpanan.<br>Installer ini akan menjaga tabel partisi saat ini kecuali kamu secara gamblang memilih sebaliknya.<br>Jika tidak yakin, pada sistem GPT modern lebih disukai. @@ -801,7 +801,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. 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. - Pemasang <strong>tidak bisa mendeteksi tabel partisi apapun</strong> pada media penyimpanan terpilih.<br><br>Mungkin media ini tidak memiliki tabel partisi, atau tabel partisi yang ada telah korup atau tipenya tidak dikenal.<br>Pemasang dapat membuatkan partisi baru untuk Anda, baik secara otomatis atau melalui laman pemartisian manual. + Installer <strong>tidak bisa mendeteksi tabel partisi apapun</strong> pada media penyimpanan terpilih.<br><br>Mungkin media ini tidak memiliki tabel partisi, atau tabel partisi yang ada telah korup atau tipenya tidak dikenal.<br>Installer dapat membuatkan partisi baru untuk Anda, baik secara otomatis atau melalui laman pemartisian manual. @@ -824,7 +824,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. %1 - (%2) - + %1 - (%2) @@ -949,7 +949,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Install %1 on <strong>new</strong> %2 system partition. - Pasang %1 pada partisi sistem %2 <strong>baru</strong> + Instal %1 pada partisi sistem %2 <strong>baru</strong> @@ -959,7 +959,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Install %2 on %3 system partition <strong>%1</strong>. - Pasang %2 pada sistem partisi %3 <strong>%1</strong>. + Instal %2 pada sistem partisi %3 <strong>%1</strong>. @@ -969,7 +969,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Install boot loader on <strong>%1</strong>. - Pasang boot loader di <strong>%1</strong>. + Instal boot loader di <strong>%1</strong>. @@ -987,7 +987,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. <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> - Ketika kotak ini dicentang, sistem kamu akan segera dimulai kembali saat mengklik Selesai atau menutup pemasang. + Ketika kotak ini dicentang, sistem kamu akan segera dimulai kembali saat mengklik Selesai atau menutup installer. @@ -997,12 +997,12 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. <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. - <h1>Selesai.</h1><br>%1 sudah terpasang di komputer Anda.<br/>Anda dapat memulai ulang ke sistem baru atau lanjut menggunakan lingkungan Live %2. + <h1>Selesai.</h1><br>%1 sudah terinstal di komputer Anda.<br/>Anda dapat memulai ulang ke sistem baru atau lanjut menggunakan lingkungan Live %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. - <h1>Pemasangan Gagal</h1><br/>%1 tidak bisa dipasang pada komputermu.<br/>Pesan galatnya adalah: %2. + <h1>Instalasi Gagal</h1><br/>%1 tidak bisa diinstal pada komputermu.<br/>Pesan galatnya adalah: %2. @@ -1015,12 +1015,12 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Installation Complete - Pemasangan Lengkap + Instalasi Lengkap The installation of %1 is complete. - Pemasangan %1 telah lengkap. + Instalasi %1 telah lengkap. @@ -1043,7 +1043,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. The installer failed to format partition %1 on disk '%2'. - Pemasang gagal memformat partisi %1 pada disk '%2'.'%2'. + Installer gagal memformat partisi %1 pada disk '%2'.'%2'. @@ -1051,12 +1051,12 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Konsole not installed - Konsole tidak terpasang + Konsole tidak terinstal Please install KDE Konsole and try again! - Silahkan pasang KDE Konsole dan ulangi lagi! + Silahkan instal KDE Konsole dan ulangi lagi! @@ -1146,7 +1146,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. 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. - Mohon periksa End User License Agreements(EULA) di atas.<br/>Bila Anda tidak setuju, perangkat lunak proprietary tidak akan dipasang, dan alternatif open source akan dipasang sebagai gantinya + Mohon periksa End User License Agreements(EULA) di atas.<br/>Bila Anda tidak setuju, perangkat lunak proprietary tidak akan diinstal, dan alternatif open source akan diinstal sebagai gantinya @@ -1262,12 +1262,12 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Network Installation. (Disabled: Unable to fetch package lists, check your network connection) - Pemasangan Jaringan. (Dinonfungsikan: Tak mampu menarik daftar paket, periksa sambungan jaringanmu) + Instalasi Jaringan. (Dinonfungsikan: Tak mampu menarik daftar paket, periksa sambungan jaringanmu) Network Installation. (Disabled: Received invalid groups data) - Pemasangan jaringan. (Menonaktifkan: Penerimaan kelompok data yang tidak sah) + Instalasi jaringan. (Menonaktifkan: Penerimaan kelompok data yang tidak sah) @@ -1566,7 +1566,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> - <small>Jika lebih dari satu orang akan menggunakan komputer ini, Anda dapat mengatur beberapa akun setelah pemasangan.</small> + <small>Jika lebih dari satu orang akan menggunakan komputer ini, Anda dapat mengatur beberapa akun setelah instalasi.</small> @@ -1727,27 +1727,27 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. New Volume Group - + Grup Volume Baru Resize Volume Group - + Ubah-ukuran Grup Volume Deactivate Volume Group - + Nonaktifkan Grup Volume Remove Volume Group - + Hapus Grup Volume I&nstall boot loader on: - + I&nstal boot loader di: @@ -1780,12 +1780,12 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Install %1 <strong>alongside</strong> another operating system. - Pasang %1 <strong>berdampingan</strong> dengan sistem operasi lain. + Instal %1 <strong>berdampingan</strong> dengan sistem operasi lain. <strong>Erase</strong> disk and install %1. - <strong>Hapus</strong> diska dan pasang %1. + <strong>Hapus</strong> diska dan instal %1. @@ -1800,12 +1800,12 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). - Pasang %1 <strong>berdampingan</strong> dengan sistem operasi lain di disk <strong>%2</strong> (%3). + Instal %1 <strong>berdampingan</strong> dengan sistem operasi lain di disk <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. - <strong>Hapus</strong> diska <strong>%2</strong> (%3) dan pasang %1. + <strong>Hapus</strong> diska <strong>%2</strong> (%3) dan instal %1. @@ -1892,7 +1892,7 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. 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. - Silakan pilih sebuah look-and-feel untuk KDE Plasma Desktop. Anda juga dapat melewati langkah ini dan konfigurasi look-and-feel sekali ketika sistem terpasang. Mengeklik pilihan look-and-feel akan memberi Anda pratinjau langsung dari look-and-feel. + Silakan pilih sebuah look-and-feel untuk KDE Plasma Desktop. Anda juga dapat melewati langkah ini dan konfigurasi look-and-feel setelah sistem terinstal. Mengeklik pilihan look-and-feel akan memberi Anda pratinjau langsung pada look-and-feel tersebut. @@ -2035,17 +2035,17 @@ Keluaran: Remove Volume Group named %1. - + Hapus Grup Volume bernama %1. Remove Volume Group named <strong>%1</strong>. - + Hapus Grup Volume bernama <strong>%1</strong>. The installer failed to remove a volume group named '%1'. - + Installer gagal menghapus sebuah grup volume bernama '%1'. @@ -2058,7 +2058,7 @@ Keluaran: Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. - Pilih tempat pemasangan %1.<br/><font color="red">Peringatan: </font>hal ini akan menghapus semua berkas di partisi terpilih. + Pilih tempat instalasi %1.<br/><font color="red">Peringatan: </font>hal ini akan menghapus semua berkas di partisi terpilih. @@ -2068,17 +2068,17 @@ Keluaran: %1 cannot be installed on empty space. Please select an existing partition. - %1 tidak dapat dipasang di ruang kosong. Mohon pilih partisi yang tersedia. + %1 tidak dapat diinstal di ruang kosong. Mohon pilih partisi yang tersedia. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. - %1 tidak bisa dipasang pada Partisi Extended. Mohon pilih Partisi Primary atau Logical yang tersedia. + %1 tidak bisa diinstal pada Partisi Extended. Mohon pilih Partisi Primary atau Logical yang tersedia. %1 cannot be installed on this partition. - %1 tidak dapat dipasang di partisi ini. + %1 tidak dapat diinstal di partisi ini. @@ -2110,7 +2110,7 @@ Keluaran: <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 akan dipasang pada %2.<br/><font color="red">Peringatan: </font>seluruh data %2 akan hilang. + <strong>%3</strong><br/><br/>%1 akan diinstal pada %2.<br/><font color="red">Peringatan: </font>seluruh data %2 akan hilang. @@ -2173,12 +2173,12 @@ Keluaran: The installer is not running with administrator rights. - Pemasang tidak dijalankan dengan kewenangan administrator. + Installer tidak dijalankan dengan kewenangan administrator. The screen is too small to display the installer. - Layar terlalu kecil untuk menampilkan pemasang. + Layar terlalu kecil untuk menampilkan installer. @@ -2186,29 +2186,29 @@ Keluaran: Resize Filesystem Job - + Tugas Ubah-ukuran Filesystem Invalid configuration - + Konfigurasi taksah The file-system resize job has an invalid configuration and will not run. - + Tugas pengubahan ukuran filesystem mempunyai sebuah konfigurasi yang taksah dan tidak akan berjalan. KPMCore not Available - + KPMCore tidak Tersedia Calamares cannot start KPMCore for the file-system resize job. - + Calamares gak bisa menjalankan KPMCore untuk tugas pengubahan ukuran filesystem. @@ -2217,39 +2217,39 @@ Keluaran: Resize Failed - + Pengubahan Ukuran, Gagal The filesystem %1 could not be found in this system, and cannot be resized. - + Filesystem %1 enggak ditemukan dalam sistem ini, dan gak bisa diubahukurannya. The device %1 could not be found in this system, and cannot be resized. - + Perangkat %1 enggak ditemukan dalam sistem ini, dan gak bisa diubahukurannya. The filesystem %1 cannot be resized. - + Filesystem %1 gak bisa diubahukurannya. The device %1 cannot be resized. - + Perangkat %1 gak bisa diubahukurannya. The filesystem %1 must be resized, but cannot. - + Filesystem %1 mestinya bisa diubahukurannya, namun gak bisa. The device %1 must be resized, but cannot - + Perangkat %1 mestinya bisa diubahukurannya, namun gak bisa. @@ -2272,7 +2272,7 @@ Keluaran: The installer failed to resize partition %1 on disk '%2'. - Pemasang gagal untuk merubah ukuran partisi %1 pada disk '%2'. + Installer gagal untuk merubah ukuran partisi %1 pada disk '%2'. @@ -2281,17 +2281,17 @@ Keluaran: Resize volume group named %1 from %2 to %3. - + Ubah ukuran grup volume bernama %1 dari %2 ke %3. Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong>. - + Ubah ukuran grup volume bernama <strong>%1</strong> dari <strong>%2</strong> ke %3<strong>. The installer failed to resize a volume group named '%1'. - + Installer gagal mengubah ukuran sebuah grup volume bernama '%1'. @@ -2447,7 +2447,7 @@ Keluaran: The installer failed to set flags on partition %1. - Pemasang gagal menetapkan bendera pada partisi %1. + Installer gagal menetapkan bendera pada partisi %1. @@ -2553,7 +2553,7 @@ Keluaran: This is an overview of what will happen once you start the install procedure. - Berikut adalah tinjauan mengenai yang akan terjadi setelah Anda memulai prosedur pemasangan. + Berikut adalah tinjauan mengenai yang akan terjadi setelah Anda memulai prosedur instalasi. @@ -2579,7 +2579,7 @@ Keluaran: Internal error in install-tracking. - Galat intern di pelacakan-pemasangan. + Galat intern di pelacakan-instalasi. @@ -2631,7 +2631,7 @@ Keluaran: <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>Dengan memilih ini, Anda akan mengirim <span style=" font-weight:600;">tidak ada informasi di </span> tentang pemasangan Anda. </p></body></html> + <html><head/><body><p>Dengan memilih ini, Anda akan mengirim <span style=" font-weight:600;">tidak ada informasi di </span> tentang instalasi Anda. </p></body></html> @@ -2655,22 +2655,22 @@ Keluaran: 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. - Pasang bantuan pelacakan %1 untuk melihat berapa banyak pengguna memiliki, piranti keras apa yang mereka pasang %1 dan (dengan dua pilihan terakhir), dapatkan informasi berkelanjutan tentang aplikasi yang disukai. Untuk melihat apa yang akan dikirim, silakan klik ikon bantuan ke beberapa area selanjtunya. + Instal bantuan pelacakan %1 untuk melihat berapa banyak pengguna memiliki, piranti keras apa yang mereka instal %1 dan (dengan dua pilihan terakhir), dapatkan informasi berkelanjutan tentang aplikasi yang disukai. Untuk melihat apa yang akan dikirim, silakan klik ikon bantuan ke beberapa area selanjtunya. 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. - Dengan memilih ini Anda akan mengirim informasi tentang pemasangan dan piranti keras Anda. Informasi ini hanya akan <b>dikirim sekali</b> setelah pemasangan selesai. + Dengan memilih ini Anda akan mengirim informasi tentang instalasi dan piranti keras Anda. Informasi ini hanya akan <b>dikirim sekali</b> setelah instalasi selesai. By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. - Dengan memilih ini anda akan <b> secara berkala</b> mengirim informasi tentang pemasangan, piranti keras dan aplikasi Anda, ke %1. + Dengan memilih ini anda akan <b> secara berkala</b> mengirim informasi tentang instalasi, piranti keras dan aplikasi Anda, ke %1. By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. - Dengan memilih ini anda akan<b>secara teratur</b> mengirim informasi tentang pemasangan, piranti keras, aplikasi dan pola pemakaian Anda, ke %1. + Dengan memilih ini anda akan<b>secara teratur</b> mengirim informasi tentang instalasi, piranti keras, aplikasi dan pola pemakaian Anda, ke %1. @@ -2728,27 +2728,27 @@ Keluaran: VolumeGroupDialog - + DialogGrupVolume List of Physical Volumes - + Daftar dari Volume Fisik Volume Group Name: - + Nama Grup Volume: Volume Group Type: - + Tipe Grup Volume: Physical Extent Size: - + Ukuran Luas Fisik: @@ -2758,7 +2758,7 @@ Keluaran: Total Size: - + Total Ukuran: @@ -2766,22 +2766,22 @@ Keluaran: --- - + --- Used Size: - + Ukuran Terpakai: Total Sectors: - + Total Sektor: Quantity of LVs: - + Kuantitas LV: @@ -2819,17 +2819,17 @@ Keluaran: <h1>Welcome to the %1 installer.</h1> - <h1>Selamat datang di pemasang %1.</h1> + <h1>Selamat datang di installer %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> - <h1>Selamat datang di Calamares pemasang untuk %1.</h1> + <h1>Selamat datang di Calamares installer untuk %1.</h1> About %1 installer - Tentang pemasang %1 + Tentang installer %1 diff --git a/lang/calamares_is.ts b/lang/calamares_is.ts index 181ca9986..196215a0c 100644 --- a/lang/calamares_is.ts +++ b/lang/calamares_is.ts @@ -192,7 +192,7 @@ Calamares Initialization Failed - + Calamares uppsetning mistókst @@ -207,7 +207,7 @@ &Install - + &Setja upp @@ -503,7 +503,7 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. Could not run command. - + Gat ekki keyrt skipun. @@ -559,7 +559,7 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. LVM LV name - + LVM LV nafn @@ -822,7 +822,7 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. %1 - (%2) - + %1 - (%2) @@ -1281,17 +1281,17 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. Password is too short - + Lykilorðið þitt er of stutt Password is too long - + Lykilorðið þitt er of langt Password is too weak - + Lykilorðið þitt er of veikt @@ -1386,7 +1386,7 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. The password is too short - + Lykilorðið er of stutt @@ -1906,7 +1906,7 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. Saving files for later ... - + Vista skrár fyrir seinna ... @@ -2540,7 +2540,7 @@ Output: %L1 / %L2 slide counter, %1 of %2 (numeric) - + %L1 / %L2 @@ -2640,7 +2640,7 @@ Output: ... - + ... @@ -2753,7 +2753,7 @@ Output: Total Size: - + Heildar stærð: @@ -2761,12 +2761,12 @@ Output: --- - + --- Used Size: - + Notuð stærð: diff --git a/lang/calamares_ja.ts b/lang/calamares_ja.ts index 001e1a19e..673f3e4bb 100644 --- a/lang/calamares_ja.ts +++ b/lang/calamares_ja.ts @@ -1751,7 +1751,7 @@ The installer will quit and all changes will be lost. Are you sure you want to create a new partition table on %1? - %1 上で新しいパーティションテーブルを作成します。よろしいですか? + %1 上で新しいパーティションテーブルを作成します。よろしいですか? diff --git a/lang/calamares_mk.ts b/lang/calamares_mk.ts new file mode 100644 index 000000000..a1b95a0da --- /dev/null +++ b/lang/calamares_mk.ts @@ -0,0 +1,2847 @@ + + + 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 + + + Install + + + + + Calamares::JobThread + + + Done + + + + + 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::ViewManager + + + &Back + + + + + + &Next + + + + + + &Cancel + + + + + + Cancel installation without changing the system. + + + + + 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: + + + + + &Install + + + + + Cancel installation? + + + + + 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 Installer + + + + + Show debug information + + + + + CheckerWidget + + + 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 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 + + + + + ChoicePage + + + Form + + + + + After: + + + + + <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. + + + + + Boot loader location: + + + + + %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. + + + + + 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> + + + + + <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. + + + + + + + + <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 %2MB partition on %4 (%3) with file system %1. + + + + + Create new <strong>%2MB</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. + + + + + 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) + + + + + %1 - (%2) + + + + + 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 + + + + + <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> + + + + + &Restart now + + + + + <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. + + + + + <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. + + + + + FinishedViewStep + + + Finish + + + + + Installation Complete + + + + + The installation of %1 is complete. + + + + + FormatPartitionJob + + + Format partition %1 (file system: %2, size: %3 MB) on %4. + + + + + Format <strong>%3MB</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'. + + + + + 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. + + + + + <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> + + + + + <a href="%1">view license agreement</a> + + + + + LicenseViewStep + + + License + + + + + 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/> + + + + + %1 (%2) + Language (Country) + + + + + 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 + + + + + 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? + + + + + + + font-weight: normal + + + + + <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> + + + + + 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 + + + + + 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. + + + + + PlasmaLnfJob + + + Plasma Look-and-Feel Job + + + + + + Could not select KDE Plasma Look-and-Feel package + + + + + PlasmaLnfPage + + + Form + + + + + Placeholder + + + + + 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 + + + + + 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: + + + + + RequirementsChecker + + + Gathering system information... + + + + + has at least %1 GB available drive space + + + + + There is not enough drive space. At least %1 GB is required. + + + + + has at least %1 GB working memory + + + + + The system does not have enough working memory. At least %1 GB 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 installer is not running with administrator rights. + + + + + The screen is too small to display the installer. + + + + + 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>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. + + + + + Resizing %2MB partition %1 to %3MB. + + + + + The installer failed to resize partition %1 on disk '%2'. + + + + + 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'. + + + + + 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 %1MB %2 partition. + + + + + Set flags on new partition. + + + + + Clear flags on partition <strong>%1</strong>. + + + + + Clear flags on %1MB <strong>%2</strong> partition. + + + + + Clear flags on new partition. + + + + + Flag partition <strong>%1</strong> as <strong>%2</strong>. + + + + + Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. + + + + + Flag new partition as <strong>%1</strong>. + + + + + Clearing flags on partition <strong>%1</strong>. + + + + + Clearing flags on %1MB <strong>%2</strong> partition. + + + + + Clearing flags on new partition. + + + + + Setting flags <strong>%2</strong> on partition <strong>%1</strong>. + + + + + Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. + + + + + 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 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> + + + + + + + TextLabel + + + + + + + ... + + + + + <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 + + + 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 + + + VolumeGroupDialog + + + + + 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 + + + + + &Language: + + + + + &Release notes + + + + + &Known issues + + + + + &Support + + + + + &About + + + + + <h1>Welcome to the %1 installer.</h1> + + + + + <h1>Welcome to the Calamares installer for %1.</h1> + + + + + 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 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg 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_ru.ts b/lang/calamares_ru.ts index 6862e400d..1dffae487 100644 --- a/lang/calamares_ru.ts +++ b/lang/calamares_ru.ts @@ -718,22 +718,22 @@ The installer will quit and all changes will be lost. Create new volume group named %1. - + Создать новую группу томов на диске %1 Create new volume group named <strong>%1</strong>. - + Создать новую группу томов на диске %1 Creating new volume group named %1. - + Cоздание новой группы томов на диске %1 The installer failed to create a volume group named '%1'. - + Программа установки не смогла создать группу томов на диске '%1'. @@ -829,7 +829,7 @@ The installer will quit and all changes will be lost. Write LUKS configuration for Dracut to %1 - + Записать LUKS настройки для Dracut в %1 @@ -1470,7 +1470,7 @@ The installer will quit and all changes will be lost. Bad integer value of setting - %1 - + Недопустимое целое значение свойства - %1 @@ -1729,7 +1729,7 @@ The installer will quit and all changes will be lost. Resize Volume Group - + Изменить размер группы томов @@ -1739,12 +1739,12 @@ The installer will quit and all changes will be lost. Remove Volume Group - + Удалить группу томов I&nstall boot loader on: - + Уст&ановить загрузчик в: @@ -1884,7 +1884,7 @@ The installer will quit and all changes will be lost. Placeholder - + Заменитель @@ -1905,12 +1905,12 @@ The installer will quit and all changes will be lost. Saving files for later ... - + Сохраняю файлы на потом... No files configured to save for later. - + Нет файлов, которые требуется сохранить на потом. @@ -1924,7 +1924,8 @@ The installer will quit and all changes will be lost. There was no output from the command. - + +Вывода из команды не последовало. @@ -2031,17 +2032,17 @@ Output: Remove Volume Group named %1. - + Удалить группу томов на диске %1 Remove Volume Group named <strong>%1</strong>. - + Удалить группу томов на диске %1 The installer failed to remove a volume group named '%1'. - + Установщик не смог удалить группу томов на диске '%1'. @@ -2182,12 +2183,12 @@ Output: Resize Filesystem Job - + Изменить размер файловой системы Invalid configuration - + Недействительная конфигурация @@ -2213,7 +2214,7 @@ Output: Resize Failed - + Не удалось изменить размер @@ -2622,7 +2623,7 @@ Output: Placeholder - + Заменитель From 99b99d24bdbb354e980362dd4795c030c00617b5 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Tue, 11 Dec 2018 19:31:22 +0100 Subject: [PATCH 38/74] i18n: [desktop] Automatic merge of Transifex translations --- calamares.desktop | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/calamares.desktop b/calamares.desktop index b4c3a2693..c29b9b345 100644 --- a/calamares.desktop +++ b/calamares.desktop @@ -104,6 +104,10 @@ Name[it_IT]=Installa il sistema Icon[it_IT]=calamares GenericName[it_IT]=Programma d'installazione del sistema Comment[it_IT]=Calamares — Programma d'installazione del sistema +Name[mk]=Инсталирај го системот +Icon[mk]=calamares +GenericName[mk]=Системен Инсталер +Comment[mk]=Calamares - Системен Инсталер Name[nb]=Installer System Icon[nb]=calamares GenericName[nb]=Systeminstallatør From bf976b3de06ce581be49bd7879dd800b6bc14a7b Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Tue, 11 Dec 2018 19:31:23 +0100 Subject: [PATCH 39/74] i18n: [dummypythonqt] Automatic merge of Transifex translations --- .../lang/mk/LC_MESSAGES/dummypythonqt.mo | Bin 0 -> 625 bytes .../lang/mk/LC_MESSAGES/dummypythonqt.po | 46 ++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/modules/dummypythonqt/lang/mk/LC_MESSAGES/dummypythonqt.mo create mode 100644 src/modules/dummypythonqt/lang/mk/LC_MESSAGES/dummypythonqt.po diff --git a/src/modules/dummypythonqt/lang/mk/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/mk/LC_MESSAGES/dummypythonqt.mo new file mode 100644 index 0000000000000000000000000000000000000000..aae5bd9b4655721e470dcbd9f68828dd44e0ef94 GIT binary patch literal 625 zcmYL`&2AGh5XYCV11rIyXAYACRV#4T4k3!11_&WV5eW$)^oVdbZfde?uWYAjAA}1M zFM)(q@%0S8aOGK;O+@pTej3kc=I`(e)_W!T25{me(r1Fx{vFTCU*DKpe}g8g(<3E+ChcXl%_#nR?Qnkt1oHGMdA< z(|y%>*@L6r8Y?z z`u4l&A!%;=%BxPKB|V**nbLC(&12=SHsz2n;&HaLA|r>!=8l6d)~RdPTCh2`_cYuG yMxosX2D`hkNhwq?XZ!FJC~#n{I0|3F@9_2NcZbj6N4N~%!>@1&;b-_(iT(j+m9#Vf literal 0 HcmV?d00001 diff --git a/src/modules/dummypythonqt/lang/mk/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/mk/LC_MESSAGES/dummypythonqt.po new file mode 100644 index 000000000..82998bf47 --- /dev/null +++ b/src/modules/dummypythonqt/lang/mk/LC_MESSAGES/dummypythonqt.po @@ -0,0 +1,46 @@ +# 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. +# +# Translators: +# Martin Ristovski , 2018 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-10-05 11:34-0400\n" +"PO-Revision-Date: 2016-12-16 12:18+0000\n" +"Last-Translator: Martin Ristovski , 2018\n" +"Language-Team: Macedonian (https://www.transifex.com/calamares/teams/20061/mk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +#: src/modules/dummypythonqt/main.py:84 +msgid "Click me!" +msgstr "Кликни ме!" + +#: src/modules/dummypythonqt/main.py:94 +msgid "A new QLabel." +msgstr "Нов QLabel." + +#: 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 915884c6fe9229f78ec1e7cd0aca3ab06bca7d06 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Tue, 11 Dec 2018 19:31:23 +0100 Subject: [PATCH 40/74] i18n: [python] Automatic merge of Transifex translations --- lang/python/es/LC_MESSAGES/python.mo | Bin 1207 -> 2626 bytes lang/python/es/LC_MESSAGES/python.po | 27 +++--- lang/python/fr/LC_MESSAGES/python.mo | Bin 1193 -> 2528 bytes lang/python/fr/LC_MESSAGES/python.po | 23 +++-- lang/python/id/LC_MESSAGES/python.mo | Bin 1082 -> 2644 bytes lang/python/id/LC_MESSAGES/python.po | 35 ++++---- lang/python/ja/LC_MESSAGES/python.mo | Bin 2808 -> 3013 bytes lang/python/ja/LC_MESSAGES/python.po | 5 +- lang/python/mk/LC_MESSAGES/python.mo | Bin 0 -> 2005 bytes lang/python/mk/LC_MESSAGES/python.po | 120 +++++++++++++++++++++++++++ 10 files changed, 174 insertions(+), 36 deletions(-) create mode 100644 lang/python/mk/LC_MESSAGES/python.mo create mode 100644 lang/python/mk/LC_MESSAGES/python.po diff --git a/lang/python/es/LC_MESSAGES/python.mo b/lang/python/es/LC_MESSAGES/python.mo index a8182412db11321bc73fae9cf5b6dd5b75f473e4..e3aaa18ecc0486bbc41153365958a6e5098fadad 100644 GIT binary patch literal 2626 zcmbW2O>Y}T7{>=_d2x9yAhig}6dK{EU3;CTY2q{}C3d4wCyf%P;yT$K+tcjMY z$mayl>lklh{DScoM(_mw;JE{y0PlkDg8zVLz*A2W@*cPV+V?H+9QYad3iuQF8u&+- z_qy}CYw!*5SMUsY2RsfQeU^~(;0bU7tabS@XxIH7 zTmki*CW4U2^B7nn z%_%^T4)P*~%`KKp9~_w=ypiVxydAYO3rtF7sHbE@G?SRqnrOC6Wx4lZCl-d&tCi)x z2{S@T+7JOBwW)n{7^7_U|6FXnw)D^)D?&#BYtxWP*5vWNb#|DhLV7BU0&X~|Bw^U5 zQQNd|;2UbQFgl|RkLcblvdATm8KMlC*AkLD!Y_~|sSOJP8ZmDRJL&$6kWH#2?|m4V zAIr-m9QS+Q;50~FnlZX}THm6+;+op5^If408A{wEj7Ac7u-%HH{%DRg)jZ&y;XZAs zn3@*vS@e<^DnAK$fvm>L<67GYdtuZ3Sl&~KG>EE5$MQxYE93q+S>vJFejpe9*#|Q* zRMCS^U&rABPh79d#vmJCBB@R&q1a<=% zaF%@MI*&E_w@gI6Sf$siYwJtbR&r}RQn7KCbyN7x2T4;qbycRh)oXQUA?9h* zI~8_cycwSjZ=@A z)B!UpF4M(C_=+yZOlw6idCAR0pfEER=bIrDK>^+T{<(BdxXNaNW_0SDg=M-PF)4J5 z=3B-@x?C*o?CcbbU0F2vu5~PWEMOsvxh@*G=;DOyPL+yy9nUQ7k?f|7bZ$on*BSMm-O@;Esf9S2zpoJVkO+?gNq&a6>0c0*Iq0(MND}>S&VDD zjlLi9@~xn z9GZU2T&9vc2ob$ywKeUX&TYEQyv{eaVRV#qzS6ckT5K~DTa?U(A1K`o9Y0vZ-Iqx) ZOf;!*9YQ$J9U6=C5I@1N?A}Rq%D+X?83F(R delta 307 zcmX>kvYoU3o)F7a1|Z-BVi_P#0b*VtUIWA+@BoMff%qX1ivaOwD9ynL5tjwhCO|QL zAgv9gQ-HJqke&dfMS=7|AiWQWuLH3pkUx!?fk6sLZvfIN3=D}3r-2M1puh(pZ49KD zSs(_P18ERH8A!_m>FGckXa)lZ5HkTW2!I^T4#cb=4io^DfdSAs1~wp`yoae}@>}NE z$s1TU8@LrE<|StqC+8~!A6}T3oRM0k;B$C$0gy^bRq#nI%1u, 2018 +# Guido Grasso , 2018 # #, fuzzy msgid "" @@ -14,7 +15,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-05 11:34-0400\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Francisco Sánchez López de Lerma , 2018\n" +"Last-Translator: Guido Grasso , 2018\n" "Language-Team: Spanish (https://www.transifex.com/calamares/teams/20061/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,31 +25,31 @@ msgstr "" #: src/modules/displaymanager/main.py:380 msgid "Cannot write KDM configuration file" -msgstr "" +msgstr "No se puede escribir el archivo de configuración KDM" #: src/modules/displaymanager/main.py:381 msgid "KDM config file {!s} does not exist" -msgstr "" +msgstr "El archivo de configuración {!s} de KDM no existe" #: src/modules/displaymanager/main.py:442 msgid "Cannot write LXDM configuration file" -msgstr "" +msgstr "No se puede escribir el archivo de configuración LXDM" #: src/modules/displaymanager/main.py:443 msgid "LXDM config file {!s} does not exist" -msgstr "" +msgstr "El archivo de configuracion {!s} de LXDM no existe" #: src/modules/displaymanager/main.py:517 msgid "Cannot write LightDM configuration file" -msgstr "" +msgstr "No se puede escribir el archivo de configuración de LightDM" #: src/modules/displaymanager/main.py:518 msgid "LightDM config file {!s} does not exist" -msgstr "" +msgstr "El archivo de configuración {!s} de LightDM no existe" #: src/modules/displaymanager/main.py:592 msgid "Cannot configure LightDM" -msgstr "" +msgstr "No se puede configurar LightDM" #: src/modules/displaymanager/main.py:593 msgid "No LightDM greeter installed." @@ -56,16 +57,18 @@ msgstr "" #: src/modules/displaymanager/main.py:624 msgid "Cannot write SLIM configuration file" -msgstr "" +msgstr "No se puede escribir el archivo de configuración de SLIM" #: src/modules/displaymanager/main.py:625 msgid "SLIM config file {!s} does not exist" -msgstr "" +msgstr "El archivo de configuración {!s} de SLIM no existe" #: src/modules/displaymanager/main.py:740 #: src/modules/displaymanager/main.py:772 msgid "No display managers selected for the displaymanager module." msgstr "" +"No se ha seleccionado ningún gestor de pantalla para el modulo " +"displaymanager" #: src/modules/displaymanager/main.py:741 msgid "" @@ -76,10 +79,12 @@ msgstr "" #: src/modules/displaymanager/main.py:773 msgid "The list is empty after checking for installed display managers." msgstr "" +"La lista está vacía después de haber chequeado los gestores de pantalla " +"instalados" #: src/modules/displaymanager/main.py:821 msgid "Display manager configuration was incomplete" -msgstr "" +msgstr "La configuración del gestor de pantalla estaba incompleta" #: src/modules/umount/main.py:40 msgid "Unmount file systems." diff --git a/lang/python/fr/LC_MESSAGES/python.mo b/lang/python/fr/LC_MESSAGES/python.mo index 602af1c17346200e1e2cf474c0b3b3f072151de5..b612733eab2cdd4655d4fc9c898f2381799155af 100644 GIT binary patch literal 2528 zcmbVNNpl=E6c!M+VGm1jfGSbJWxJA|>9HMR#@NJoNx5t%E_&nWIzHKtNTRuO+?r^cKBu{(3D5=p0Q?AeA9x)&b%Bsqfhq71cYg(>cK?ao-ZtaVZakUm$3Pp;=fJms-vM8<^1v4GezAY?DMA?5Q@}d#8=$rOD=-8;0B!(x zpU(606A*5Z=P_|K$N_*ngL%<@6vO8EMNEWG5CVA?6RP9|Ogj*6HEP8dTp|c#Xgr72 z<926(Nf{gJ#WE0`RB^f{I$g84ULNc#VK`k~T(3l!5wWC!2>Gzg+J_G#lw1E-V_R!0 zXWqCdbP}>2jhJK|u1?t5XPOG>#ZeM+!^vVAMLnAIOcxH{iFfM5JKFGse)<`?!6jD= zQAW(`3dtSe*U5_1hJ_(bn750YbhRU7hsKhZ2SfWKV=|4#{qhV-H{&v)w4*qjQgCo! znd1_i`ojTfs(Hvg!+jdWikdDjCCZ4S*iS=VCmSmExYpL4(nmTrGUmmpG;pCoN5)Ky z5XSv+vdN=(@08=!?rFE%r|#7>6xvXsDUTA*X=8-6Kj0f7z=D-ye{{4t(P|PDodq}vgAnWwv23)gEvTZ4|R;Ni-g=k=A0GZ zxy_ZvBW=-*`GwW_8%y-|(&pC6t(&z?p2W&H>$)R+=YzDPop#)!wT)YCXF>77%XSv= z6k2q`ZB9E)*Kx1XX0tUp<+xL>3qfa-?+I)CNbZ{BPCM?qwCO_bvWrn$W7;@v#iR}y z($S*xsggaL7$JA*d;3D9lfFI(o0H9nYu7sw6Csil&0QJX3w7B^kwd4=S=6G-ic7Cc z$GXNOy47gx@9)=*H7){vVD%av3t7Yz*9`*=-I#FQcbbhrHO6b}E9*-~32D~d+CnT1 zm+-HbAW*{(Oanb7jS?VfbtZ$e= z%OUF^wCoU!*3Q01m(YNDMtI<$0kx6r3&WC=y8~v+`ZDV)q%4(G_$ayv1ViT(OjnT? zBtou1Bp;{T9C2OY<0!QAqe`JT;b57P@(R`Y)Ps08y9+`s3Q7@S+0a>^`>D^ mlo)mO%9{L>D+R4)eH3{y>qnLf^4eP-%?=|30!NEZ)8ua`%M9uO delta 291 zcmaDLypps2o)F7a1|Z-BVi_P#0b*VtUIWA+@BoMff%qX1ivaOwD9ynL5tjwhCO|QL zAgv9gQ-HJqke&dfMS=7|AiW5PuS5A&%nS??AbB9I$iR@uuoB1+0}7l5(pEtF5s=mc z(y}ZJ3>HAz2S_Ue=~f^OG=qTyh?#&G1VD~v2Vzzb2MU17zyN3r0~-)ep2O5Kxr#Y< zaw*GZ1+Ubi)Z9u1_x#eL+|(Qeo2+yQ%OR~OHB~RIXtE#cv&s4FiziRx$e6r`Qw0Fj C{3+M~ diff --git a/lang/python/fr/LC_MESSAGES/python.po b/lang/python/fr/LC_MESSAGES/python.po index d869f977d..f4d4ef26c 100644 --- a/lang/python/fr/LC_MESSAGES/python.po +++ b/lang/python/fr/LC_MESSAGES/python.po @@ -8,6 +8,7 @@ # Abdallah B , 2017 # Aestan , 2018 # Jeremy Gourmel , 2018 +# Aurnytoraink , 2018 # #, fuzzy msgid "" @@ -16,7 +17,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-05 11:34-0400\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Jeremy Gourmel , 2018\n" +"Last-Translator: Aurnytoraink , 2018\n" "Language-Team: French (https://www.transifex.com/calamares/teams/20061/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,7 +27,7 @@ msgstr "" #: src/modules/displaymanager/main.py:380 msgid "Cannot write KDM configuration file" -msgstr "" +msgstr "Impossible d'écrire le fichier de configuration KDM" #: src/modules/displaymanager/main.py:381 msgid "KDM config file {!s} does not exist" @@ -34,7 +35,7 @@ msgstr "" #: src/modules/displaymanager/main.py:442 msgid "Cannot write LXDM configuration file" -msgstr "" +msgstr "Impossible d'écrire le fichier de configuration LXDM" #: src/modules/displaymanager/main.py:443 msgid "LXDM config file {!s} does not exist" @@ -42,7 +43,7 @@ msgstr "" #: src/modules/displaymanager/main.py:517 msgid "Cannot write LightDM configuration file" -msgstr "" +msgstr "Impossible d'écrire le fichier de configuration LightDM" #: src/modules/displaymanager/main.py:518 msgid "LightDM config file {!s} does not exist" @@ -50,15 +51,15 @@ msgstr "" #: src/modules/displaymanager/main.py:592 msgid "Cannot configure LightDM" -msgstr "" +msgstr "Impossible de configurer LightDM" #: src/modules/displaymanager/main.py:593 msgid "No LightDM greeter installed." -msgstr "" +msgstr "Aucun hôte LightDM est installé" #: src/modules/displaymanager/main.py:624 msgid "Cannot write SLIM configuration file" -msgstr "" +msgstr "Impossible d'écrire le fichier de configuration SLIM" #: src/modules/displaymanager/main.py:625 msgid "SLIM config file {!s} does not exist" @@ -68,20 +69,26 @@ msgstr "" #: src/modules/displaymanager/main.py:772 msgid "No display managers selected for the displaymanager module." msgstr "" +"Aucun gestionnaire d'affichage n'a été sélectionné pour le module de " +"gestionnaire d'affichage" #: src/modules/displaymanager/main.py:741 msgid "" "The displaymanagers list is empty or undefined in bothglobalstorage and " "displaymanager.conf." msgstr "" +"La liste des gestionnaires d'affichage est vide ou indéfinie dans " +"bothglobalstorage et displaymanager.conf." #: src/modules/displaymanager/main.py:773 msgid "The list is empty after checking for installed display managers." msgstr "" +"La liste est vide après vérification des gestionnaires d'affichage " +"installés." #: src/modules/displaymanager/main.py:821 msgid "Display manager configuration was incomplete" -msgstr "" +msgstr "La configuration du gestionnaire d'affichage était incomplète" #: src/modules/umount/main.py:40 msgid "Unmount file systems." diff --git a/lang/python/id/LC_MESSAGES/python.mo b/lang/python/id/LC_MESSAGES/python.mo index 0dba5b35a8840ce4e551949b9132d50ba3914285..9c932366fa7e627a1e023e45c8f43e15fbe7b2be 100644 GIT binary patch literal 2644 zcma)7O>Y}T7@k54ttnsOs|P-&g@i=y+Uq7jaGI(mP9iII8zpYxfIwsKcsM+J6iD68H=725{~SA#VWp zfj=O20i;-;d7hAY-~w;~*aR*C^>F>;aQ!=Q4*QRRZvs!9&GWthd=2aBaJ>n97wfNp z6!;K$3HTGxp7R^aA)mHsesL0`-24AJ+iy0GJ+Ury9I^q8m}EXr zj`%rXnhM!fQ52(hD;FmA4XHe zJ>Bk>Dk@0*goA|yjAW^BWQC{RG=rLI9`df?9_^`wnm#Wq3W_7;r6Dhq-9&Y{);9lw z6uLOS*j1@C$hku27mWgEOWqRMlp)AvKwVWBoEK^-ZR-jM{$_U@O7bw2Hk^(=ecKJNxL6-&>E%ECu+5mD+p zGO|?U;p+izSA<=#b`SJA4bQpD6OGoX(cPOHJ2$sC>D|q}{l@KEr9B?2#5gVO3(xs1 z^|jMhHCo!e-F7w-p7onk#|5p?t8R7Gsk)B)5v^8h%PWq%;<_+&_V|5aosaE4aoknM z{ghT+*j;upN=>GX(@vPwAp;#X`Z<$E4HUh0kp1Do4L@Qc1S8S)E7@UqNBSvwx-4W7OSrBWyrnBwUH9W^MR=8^QmfJ0 z95YcZyQK{!4VMUP5FXg zEz#d6u(BO~60@Q7PR4cov9?{v&P2pVx|())m_{^VQJhMjv{N6-=%tYus$rSfx(2Kd z{hQn;Eilms1z~^+&*~vMKj6m6e#@D0-Vyme6d=<-vW1UBE_L~LCHsElAu*55KF$;n zC;KSK@diWn8~bPr7#4*ZN!rRA}nV>L@vxl_z2miazwhqyf!Du4w9^@}YTc zwlwBZqBPg`&X4r2GNE?3K3x?<&&Rrk_h!?~L~fiy9RkCWBZngT5M>FJR!D^zmQuq4 zPh_Ho7PocrY04txcg;pLo*W9gb8waH_qZ5$ff M%Ml1q0tTu37k#e^AOHXW delta 322 zcmca2vWuhso)F7a1|Z-BVi_P#0b*VtUIWA+@BoMff%qX1ivaOwD9ynL5tjwhCO|QL zAgv9gQ-HJqke&dfMS=7|AiWfbuLH3VkYCHpz#s;a2htJ@42cZOfeap?zyYYlSs<+j z, 2018 +# Wantoyo , 2018 # #, fuzzy msgid "" @@ -14,7 +15,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-05 11:34-0400\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Harry Suryapambagya , 2018\n" +"Last-Translator: Wantoyo , 2018\n" "Language-Team: Indonesian (https://www.transifex.com/calamares/teams/20061/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,62 +25,66 @@ msgstr "" #: src/modules/displaymanager/main.py:380 msgid "Cannot write KDM configuration file" -msgstr "" +msgstr "Gak bisa menulis file konfigurasi KDM" #: src/modules/displaymanager/main.py:381 msgid "KDM config file {!s} does not exist" -msgstr "" +msgstr "File {!s} config KDM belum ada" #: src/modules/displaymanager/main.py:442 msgid "Cannot write LXDM configuration file" -msgstr "" +msgstr "Gak bisa menulis file konfigurasi LXDM" #: src/modules/displaymanager/main.py:443 msgid "LXDM config file {!s} does not exist" -msgstr "" +msgstr "File {!s} config LXDM enggak ada" #: src/modules/displaymanager/main.py:517 msgid "Cannot write LightDM configuration file" -msgstr "" +msgstr "Gak bisa menulis file konfigurasi LightDM" #: src/modules/displaymanager/main.py:518 msgid "LightDM config file {!s} does not exist" -msgstr "" +msgstr "File {!s} config LightDM belum ada" #: src/modules/displaymanager/main.py:592 msgid "Cannot configure LightDM" -msgstr "" +msgstr "Gak bisa mengkonfigurasi LightDM" #: src/modules/displaymanager/main.py:593 msgid "No LightDM greeter installed." -msgstr "" +msgstr "Tiada LightDM greeter yang terinstal." #: src/modules/displaymanager/main.py:624 msgid "Cannot write SLIM configuration file" -msgstr "" +msgstr "Gak bisa menulis file konfigurasi SLIM" #: src/modules/displaymanager/main.py:625 msgid "SLIM config file {!s} does not exist" -msgstr "" +msgstr "File {!s} config SLIM belum ada" #: src/modules/displaymanager/main.py:740 #: src/modules/displaymanager/main.py:772 msgid "No display managers selected for the displaymanager module." -msgstr "" +msgstr "Tiada display manager yang dipilih untuk modul displaymanager." #: src/modules/displaymanager/main.py:741 msgid "" "The displaymanagers list is empty or undefined in bothglobalstorage and " "displaymanager.conf." msgstr "" +"Daftar displaymanager telah kosong atau takdidefinisikan dalam " +"bothglobalstorage dan displaymanager.conf." #: src/modules/displaymanager/main.py:773 msgid "The list is empty after checking for installed display managers." msgstr "" +"Daftar telah kosong sesudah pemeriksaan untuk display manager yang " +"terinstal." #: src/modules/displaymanager/main.py:821 msgid "Display manager configuration was incomplete" -msgstr "" +msgstr "Konfigurasi display manager belum rampung" #: src/modules/umount/main.py:40 msgid "Unmount file systems." @@ -104,13 +109,13 @@ msgstr "Paket pemrosesan (%(count)d/%(total)d)" #: src/modules/packages/main.py:64 src/modules/packages/main.py:74 msgid "Install packages." -msgstr "pasang paket" +msgstr "Instal paket-paket." #: src/modules/packages/main.py:67 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." -msgstr[0] "memasang paket %(num)d" +msgstr[0] "Menginstal paket %(num)d" #: src/modules/packages/main.py:70 #, python-format diff --git a/lang/python/ja/LC_MESSAGES/python.mo b/lang/python/ja/LC_MESSAGES/python.mo index f95e6b93ad86b3cad31066fae4e40cad952a0ae5..687043bbf5052156147f174aaeabfef6f1978c8f 100644 GIT binary patch delta 686 zcmX}p&r4KM6u|K_Iio&vO2^E?qMHgXY++6XW|6e;AF!ZB5D$Gi4`)W1Hw3Px=YX`B zYTy|m2m=!Mi->T93TxN4l^Y4#Ty)&D9+!RZ%+!JNKKEQM=l*!7-9LJAzhmLILiCVV z$OG~kSqSkVTF;1FLJRw`4+n4p2XU@Z2Y7?}Gj`$;UchR@_NMy$b-cxV9O;*n1OwBs zfTrOmyo!f7hE*KGcvxf@pP^Y_#HYB2;~0yGbmJtx;_xo^Q&*csMzOa=SfHZzx19Jxr48<@#=Dsnu|-6G(it(C(R9GBzyl4bJ%~uUF00uMV=>lgj%qd&|Y{f z;g8gUhY`#C_YSgi_fII=^x#p#QAyX!D%Vp^Y9YI*?3t{SQBw(LYR*m1s+swWa?@Vc zP9~jcHSKx}NqbSH?6f`WWW3-syw`EE^X6o8`{+Ya9hbK%rS;wYNOL3@wl0TC!N-=q yk^H{)caGn$Rm$tyf2aNLwQouLoBD;X^V@pqi_X8)exb7URr?#-Uk$#sjr|3#8+DEV delta 550 zcmXZZJ4*vW5Ww+COiq)iiFqj`LO>ycL3{>$HCk9HLafB*5F;X9niB+tU@uri3yTB4 zfyI4-E9|uJ3z*KzLcziZ1pjlnfw|xAvdqrzJq~~8ny=}|tq^&#NIsFHlka|toW}pRa)Pi@Y4S2YWZJfkH zL}VH_Q1_qV9y*xAU%aBpRJ7ZuV~8xW?%@*t;VM>pyK@^?IA0zZXvgoU9d`mVecgj5 zaE|p&oWV<+MHd(F4YhDFCbEXRsQVo(;|uEkAH2azoF>r25a;`cQ^UUnNP^TxG?JwL znhePc3YV0Al3J1`HFzKy^hf-jK<*%1*pF1;0P;8@>!xKj?9zV2s=L{6C)}z<-Q6P_h-ZyIRm} z)LyVNwb8)Gqp_$w~><6iehmmXZGBKkOu1iD|ULede0NL63H{5568^M)KtQd zdke7~8Ov@<-O1R{0p$!=ki-r|V zYAH>2L5vtf0wt>1jYW~&_KMpdKd03PQ1hxy?<~Yo`H<$OrcX@0Q=zk!`P0=?CkykU zqqOyErX4lCx4UiQ)m2D^xl?s-T8sR;ycupqNaKDm;RU|uAEh7&UpeCWM|>YdZ(dx8 zocI>+HP4^${MRY)!F$<9E6j3Zy}IVo#M~+!QjKdHNt#E|)djN{(HluVqel~Ob+ocd zCOnFZ4V4@_oM!+b+3uoPUS06S$uvY$$%sojxL|F^gr(Bb(o)g7qoS5rc6&<=9&^YG zQ?l4)O5?u&YEViRONR=zYOS(Wo}lO#rj@ipBHN1{ytWm~wuDQHXOBSw8&* z3)izx(ti45wvt^+d)cQLW6nLZD}<$9b~Rlm%-mBNk{jvI?kIP_;2YU})!|3A>%#fB zvg@ilt8D(O8I%{-lwHoQprZYqR&qO)9aqi?{r>IU`8aRET0Md@uIE|y()G0OJOlE^ z$W{Zd!4UbvwQME51_ynXThndF+rdYDSmuY#t#D2sKDq(Dwd|@h@ERn0**6F;5vaZY X{_Ap&uR?s?xper?d+>YQrda<1zo1ti literal 0 HcmV?d00001 diff --git a/lang/python/mk/LC_MESSAGES/python.po b/lang/python/mk/LC_MESSAGES/python.po new file mode 100644 index 000000000..16a51e0c2 --- /dev/null +++ b/lang/python/mk/LC_MESSAGES/python.po @@ -0,0 +1,120 @@ +# 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. +# +# Translators: +# Martin Ristovski , 2018 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-10-05 11:34-0400\n" +"PO-Revision-Date: 2017-08-09 10:34+0000\n" +"Last-Translator: Martin Ristovski , 2018\n" +"Language-Team: Macedonian (https://www.transifex.com/calamares/teams/20061/mk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +#: src/modules/displaymanager/main.py:380 +msgid "Cannot write KDM configuration file" +msgstr "KDM конфигурациониот фајл не може да се создаде" + +#: src/modules/displaymanager/main.py:381 +msgid "KDM config file {!s} does not exist" +msgstr "KDM конфигурациониот фајл {!s} не постои" + +#: src/modules/displaymanager/main.py:442 +msgid "Cannot write LXDM configuration file" +msgstr "LXDM конфигурациониот фајл не може да се создаде" + +#: src/modules/displaymanager/main.py:443 +msgid "LXDM config file {!s} does not exist" +msgstr "LXDM конфигурациониот фајл {!s} не постои" + +#: src/modules/displaymanager/main.py:517 +msgid "Cannot write LightDM configuration file" +msgstr "LightDM конфигурациониот фајл не може да се создаде" + +#: src/modules/displaymanager/main.py:518 +msgid "LightDM config file {!s} does not exist" +msgstr "LightDM конфигурациониот фајл {!s} не постои" + +#: src/modules/displaymanager/main.py:592 +msgid "Cannot configure LightDM" +msgstr "Не може да се подеси LightDM" + +#: src/modules/displaymanager/main.py:593 +msgid "No LightDM greeter installed." +msgstr "Нема инсталирано LightDM поздравувач" + +#: src/modules/displaymanager/main.py:624 +msgid "Cannot write SLIM configuration file" +msgstr "SLIM конфигурациониот фајл не може да се создаде" + +#: src/modules/displaymanager/main.py:625 +msgid "SLIM config file {!s} does not exist" +msgstr "SLIM конфигурациониот фајл {!s} не постои" + +#: src/modules/displaymanager/main.py:740 +#: src/modules/displaymanager/main.py:772 +msgid "No display managers selected for the displaymanager module." +msgstr "Немате избрано дисплеј менаџер за displaymanager модулот." + +#: src/modules/displaymanager/main.py:741 +msgid "" +"The displaymanagers list is empty or undefined in bothglobalstorage and " +"displaymanager.conf." +msgstr "" + +#: src/modules/displaymanager/main.py:773 +msgid "The list is empty after checking for installed display managers." +msgstr "" + +#: src/modules/displaymanager/main.py:821 +msgid "Display manager configuration was incomplete" +msgstr "" + +#: src/modules/umount/main.py:40 +msgid "Unmount file systems." +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/machineid/main.py:35 +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] "" From 0b6e1ca4884bdbeda25624c02640902b749fd268 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 13 Dec 2018 14:50:33 +0100 Subject: [PATCH 41/74] i18n: update list of translations from Transifex - Add automatic tooling to retrieve translation stats and output new CMake variable settings. - If there are i18n language selection warnings, stop CMake. --- CMakeLists.txt | 19 +++++++---- ci/txstats.py | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 ci/txstats.py diff --git a/CMakeLists.txt b/CMakeLists.txt index faaab2283..47054bd8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,12 +103,12 @@ set( CALAMARES_VERSION_RC 1 ) # checks for new languages and misspelled ones are done (that is, # copy these four lines to four backup lines, add "p", and then update # the original four lines with the current translations). -set( _tx_complete ca zh_TW hr cs_CZ da et fr id it_IT lt pl pt_PT es_MX tr_TR ) -set( _tx_good sq de pt_BR zh_CN ja ro es sk ) -set( _tx_ok hu ru he nl bg uk ast is ko ar sv el gl en_GB - th fi_FI hi eu nb sr sl sr@latin mr es_PR kn kk be ) -set( _tx_bad fr_CH gu lo fa ur uz eo ) - +set( _tx_complete zh_TW tr_TR sk pt_PT pt_BR pl lt ja id hr gl fr + et de da cs_CZ ca ) +set( _tx_good es sq es_MX zh_CN it_IT he en_GB ru ro hi bg hu ) +set( _tx_ok uk nl ast ko is ar sv el th fi_FI eu sr nb sl + sr@latin mr es_PR ) +set( _tx_bad eo kk kn uz ur mk lo gu fr_CH fa be ) ### Required versions # @@ -316,12 +316,14 @@ endif() # 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( tx_errors OFF ) if ( prev_tx ) # Gone in new list foreach( l ${prev_tx} ) list( FIND curr_tx ${l} p_l ) if( p_l EQUAL -1 ) message(WARNING "Language ${l} was present in previous translations and is now absent.") + set( tx_errors ON ) endif() endforeach() @@ -330,10 +332,12 @@ if ( prev_tx ) list( FIND prev_tx ${l} p_l ) if( p_l EQUAL -1 ) message(WARNING "Language ${l} is new.") + set( tx_errors ON ) endif() set( p_l "lang/calamares_${l}.ts" ) if( NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${p_l} ) message(WARNING "Language ${l} has no .ts file yet.") + set( tx_errors ON ) endif() endforeach() @@ -342,6 +346,9 @@ if ( prev_tx ) endif() unset( prev_tx ) unset( curr_tx ) +if( tx_errors ) + message( FATAL_ERROR "Translation warnings, see above." ) +endif() set( CALAMARES_TRANSLATION_LANGUAGES en ${_tx_complete} ${_tx_good} ${_tx_ok} ) list( SORT CALAMARES_TRANSLATION_LANGUAGES ) diff --git a/ci/txstats.py b/ci/txstats.py new file mode 100644 index 000000000..368ce503e --- /dev/null +++ b/ci/txstats.py @@ -0,0 +1,87 @@ +#! /usr/bin/env python +# +# Uses the Transifex API to get a list of enabled languages, +# and outputs CMake settings for inclusion into CMakeLists.txt. +import sys + +def get_tx_credentials(): + """ + Gets the API token out of the user's .transifexrc (this is supposed + to be secure). + """ + import configparser + import os + txconfig_name = os.path.expanduser("~/.transifexrc") + try: + with open(txconfig_name, "r") as f: + parser = configparser.SafeConfigParser() + parser.readfp(f) + + return parser.get("https://www.transifex.com", "password") + except IOError as e: + return None + +def output_langs(all_langs, label, filterfunc): + """ + Output (via print) all of the languages in @p all_langs + that satisfy the translation-percentage filter @p filterfunc. + Prints a CMake set() command with the @p label as part + of the variable name. + + Performs line-wrapping. + """ + these_langs = [l for s, l in all_langs if filterfunc(s)] + out = " ".join(["set( _tx_%s" % label, " ".join(these_langs), ")"]) + width = 68 + prefix = "" + + while len(out) > width - len(prefix): + chunk = out[:out[:width].rfind(" ")] + print("%s%s" % (prefix, chunk)) + out = out[len(chunk)+1:] + prefix = " " + print("%s%s" % (prefix, out)) + +def get_tx_stats(token): + """ + Does an API request to Transifex with the given API @p token, getting + the translation statistics for the main body of texts. Then prints + out CMake settings to replace the _tx_* variables in CMakeLists.txt + according to standard criteria. + """ + import requests + + r = requests.get("https://api.transifex.com/organizations/calamares/projects/calamares/resources/calamares-master/", auth=("api", token)) + if r.status_code != 200: + return 1 + + all_langs = [] + + j = r.json() + languages = j["stats"] + print("# Total %d languages" % len(languages)) + for lang_name in languages: + stats = languages[lang_name]["translated"]["percentage"] + all_langs.append((stats, lang_name)) + + all_langs.sort(reverse=True) + + 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) + + return 0 + + +def main(): + cred = get_tx_credentials() + if cred: + return get_tx_stats(cred) + else: + print("! Could not find API token in ~/.transifexrc") + return 1 + return 0 + +if __name__ == "__main__": + sys.exit(main()) From 311af6de5d9a4d157ec6d888e6b85b0aaf9441a1 Mon Sep 17 00:00:00 2001 From: Harald Sitter Date: Thu, 5 Apr 2018 11:57:23 +0200 Subject: [PATCH 42/74] [locale] prefer native language and country names when available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This basically means we talk about localization in the respective localized variant. e.g. "German (Germany)" ➡ "Deutsch (Deutschland)". If geoip lookup failed or isn't configured for whatever reason it's a stretch to expect the user to know english enough to find their own language. Preferring the localized strings resolves this issue. Additionally this happens to bypass #712 respectively https://bugreports.qt.io/browse/QTBUG-34287 as the native names are properly spelled. So, as long as Qt has localized names the names will also be properly spelled. --- src/modules/keyboard/KeyboardPage.cpp | 2 ++ src/modules/locale/LocalePage.cpp | 9 +++++++-- src/modules/welcome/WelcomePage.cpp | 1 - 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/modules/keyboard/KeyboardPage.cpp b/src/modules/keyboard/KeyboardPage.cpp index 6f4473014..9056ba273 100644 --- a/src/modules/keyboard/KeyboardPage.cpp +++ b/src/modules/keyboard/KeyboardPage.cpp @@ -369,6 +369,8 @@ KeyboardPage::onActivate() { const auto langParts = lang.split( '_', QString::SkipEmptyParts ); + // Note that this his string is not fit for display purposes! + // It doesn't come from QLocale::nativeCountryName. QString country = QLocale::countryToString( QLocale( lang ).country() ); cDebug() << " .. extracted country" << country << "::" << langParts; diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index 9aad283c6..50f2d9889 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -477,8 +477,13 @@ LocalePage::prettyLCLocale( const QString& lcLocale ) const QLocale locale( localeString ); //: Language (Country) - return tr( "%1 (%2)" ).arg( QLocale::languageToString( locale.language() ) ) - .arg( QLocale::countryToString( locale.country() ) ); + const QString lang = !locale.nativeLanguageName().isEmpty() ? + locale.nativeLanguageName() : + QLocale::languageToString( locale.language() ); + const QString country = !locale.nativeCountryName().isEmpty() ? + locale.nativeCountryName() : + QLocale::countryToString( locale.country() ); + return tr( "%1 (%2)" ).arg( lang ).arg( country ); } void diff --git a/src/modules/welcome/WelcomePage.cpp b/src/modules/welcome/WelcomePage.cpp index 0a1d2fb7d..4fc44e0d5 100644 --- a/src/modules/welcome/WelcomePage.cpp +++ b/src/modules/welcome/WelcomePage.cpp @@ -345,4 +345,3 @@ WelcomePage::focusInEvent( QFocusEvent* e ) ui->languageWidget->setFocus(); e->accept(); } - From 084f4d24450b018999b97f53f3580cc69507cc5c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Dec 2018 10:52:55 +0100 Subject: [PATCH 43/74] [libcalamaresui] Refactor: move LocaleLabel to UI library - This is prep-work for making locale labels consistent everywhere. - While here, improve code documentation. --- .../utils/CalamaresUtilsGui.cpp | 37 ++++++++++ src/libcalamaresui/utils/CalamaresUtilsGui.h | 65 ++++++++++++++++- src/modules/welcome/WelcomePage.cpp | 72 +------------------ 3 files changed, 103 insertions(+), 71 deletions(-) diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp index 425ee1811..41465ca02 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp @@ -266,5 +266,42 @@ clearLayout( QLayout* layout ) } } +LocaleLabel::LocaleLabel( const QString& locale ) + : m_locale( LocaleLabel::getLocale( locale ) ) + , m_localeId( locale ) +{ + QString sortKey = QLocale::languageToString( m_locale.language() ); + QString label = m_locale.nativeLanguageName(); + + if ( label.isEmpty() ) + label = QString( QLatin1Literal( "* %1 (%2)" ) ).arg( locale, sortKey ); + + if ( locale.contains( '_' ) && QLocale::countriesForLanguage( m_locale.language() ).count() > 2 ) + { + QLatin1Literal countrySuffix( " (%1)" ); + + sortKey.append( QString( countrySuffix ).arg( QLocale::countryToString( m_locale.country() ) ) ); + + // If the language name is RTL, make this parenthetical addition RTL as well. + QString countryFormat = label.isRightToLeft() ? QString( QChar( 0x202B ) ) : QString(); + countryFormat.append( countrySuffix ); + label.append( countryFormat.arg( m_locale.nativeCountryName() ) ); + } + + m_sortKey = sortKey; + m_label = label; +} + +QLocale LocaleLabel::getLocale( const QString& localeName ) +{ + if ( localeName.contains( "@latin" ) ) + { + QLocale loc( localeName ); // Ignores @latin + return QLocale( loc.language(), QLocale::Script::LatinScript, loc.country() ); + } + else + return QLocale( localeName ); +} + } diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.h b/src/libcalamaresui/utils/CalamaresUtilsGui.h index 4b041466d..1e5f283b1 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.h +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.h @@ -23,6 +23,7 @@ #include "utils/CalamaresUtils.h" #include "UiDllMacro.h" +#include #include #include @@ -125,6 +126,68 @@ constexpr int windowMinimumWidth = 800; constexpr int windowMinimumHeight = 520; constexpr int windowPreferredWidth = 1024; constexpr int windowPreferredHeight = 520; -} + +/** + * @brief Consistent locale (language + country) naming. + * + * Support class to turn locale names (as used by Calamares's + * translation system) into QLocales, and also into consistent + * human-readable text labels. + */ +class LocaleLabel : public QObject +{ + Q_OBJECT + +public: + /** @brief Construct from a locale name. + * + * The locale name should be one that Qt recognizes, e.g. en_US or ar_EY. + */ + LocaleLabel( const QString& localeName ); + + /** @brief Define a sorting order. + * + * English (@see isEnglish() -- it means en_US) is sorted at the top. + */ + bool operator <(const LocaleLabel& other) const + { + if ( isEnglish() ) + return !other.isEnglish(); + if ( other.isEnglish() ) + return false; + return m_sortKey < other.m_sortKey; + } + + /** @brief Is this locale English? + * + * en_US and en (American English) is defined as English. The Queen's + * English -- proper English -- is relegated to non-English status. + */ + bool isEnglish() const + { + return m_localeId == QLatin1Literal( "en_US" ) || m_localeId == QLatin1Literal( "en" ); + } + + /** @brief Get the human-readable name for this locale. */ + QString label() const { return m_label; } + /** @brief Get the Qt locale. */ + QLocale locale() const { return m_locale; } + + /** @brief Get a Qt locale for the given @p localeName + * + * This special-cases `sr@latin`, which is used as a translation + * name in Calamares, while Qt recognizes `sr@latn`. + */ + static QLocale getLocale( const QString& localeName ); + +protected: + QLocale m_locale; + QString m_localeId; // the locale identifier, e.g. "en_GB" + QString m_sortKey; // the English name of the locale + QString m_label; // the native name of the locale +} ; + + +} // namespace CalamaresUtils #endif // CALAMARESUTILSGUI_H diff --git a/src/modules/welcome/WelcomePage.cpp b/src/modules/welcome/WelcomePage.cpp index 4fc44e0d5..8ffb153bf 100644 --- a/src/modules/welcome/WelcomePage.cpp +++ b/src/modules/welcome/WelcomePage.cpp @@ -132,74 +132,6 @@ bool matchLocale( QComboBox& list, QLocale& matchFound, std::function 2 ) - { - QLatin1Literal countrySuffix( " (%1)" ); - - sortKey.append( QString( countrySuffix ).arg( QLocale::countryToString( m_locale.country() ) ) ); - - // If the language name is RTL, make this parenthetical addition RTL as well. - QString countryFormat = label.isRightToLeft() ? QString( QChar( 0x202B ) ) : QString(); - countryFormat.append( countrySuffix ); - label.append( countryFormat.arg( m_locale.nativeCountryName() ) ); - } - - m_sortKey = sortKey; - m_label = label; - } - - QLocale m_locale; - QString m_localeId; // the locale identifier, e.g. "en_GB" - QString m_sortKey; // the English name of the locale - QString m_label; // the native name of the locale - - /** @brief Define a sorting order. - * - * English (@see isEnglish() -- it means en_US) is sorted at the top. - */ - bool operator <(const LocaleLabel& other) const - { - if ( isEnglish() ) - return !other.isEnglish(); - if ( other.isEnglish() ) - return false; - return m_sortKey < other.m_sortKey; - } - - /** @brief Is this locale English? - * - * en_US and en (American English) is defined as English. The Queen's - * English -- proper English -- is relegated to non-English status. - */ - bool isEnglish() const - { - return m_localeId == QLatin1Literal( "en_US" ) || m_localeId == QLatin1Literal( "en" ); - } - - static QLocale getLocale( const QString& localeName ) - { - if ( localeName.contains( "@latin" ) ) - { - QLocale loc( localeName ); - return QLocale( loc.language(), QLocale::Script::LatinScript, loc.country() ); - } - else - return QLocale( localeName ); - } -} ; - void WelcomePage::initLanguages() { @@ -208,7 +140,7 @@ WelcomePage::initLanguages() ui->languageWidget->setInsertPolicy( QComboBox::InsertAtBottom ); { - std::list< LocaleLabel > localeList; + std::list< CalamaresUtils::LocaleLabel > localeList; const auto locales = QString( CALAMARES_TRANSLATION_LANGUAGES ).split( ';'); for ( const QString& locale : locales ) { @@ -219,7 +151,7 @@ WelcomePage::initLanguages() for ( const auto& locale : localeList ) { - ui->languageWidget->addItem( locale.m_label, locale.m_locale ); + ui->languageWidget->addItem( locale.label(), locale.locale() ); } } From 1f4ac45bb5d6ad4712109bd126a33cf306d35e9d Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Dec 2018 11:22:47 +0100 Subject: [PATCH 44/74] [libcalamaresui] Cleanup locale-labeling code - Support translations of the "language (country)" format instead of forcing English parenthesis. --- .../utils/CalamaresUtilsGui.cpp | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp index 41465ca02..5e4b8e069 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp @@ -270,26 +270,27 @@ LocaleLabel::LocaleLabel( const QString& locale ) : m_locale( LocaleLabel::getLocale( locale ) ) , m_localeId( locale ) { + QString longFormat = tr( "%1 (%2)", "Language (Country)" ); + QString sortKey = QLocale::languageToString( m_locale.language() ); - QString label = m_locale.nativeLanguageName(); + QString languageName = m_locale.nativeLanguageName(); + QString countryName; - if ( label.isEmpty() ) - label = QString( QLatin1Literal( "* %1 (%2)" ) ).arg( locale, sortKey ); + if ( languageName.isEmpty() ) + languageName = QString( QLatin1Literal( "* %1 (%2)" ) ).arg( locale, sortKey ); - if ( locale.contains( '_' ) && QLocale::countriesForLanguage( m_locale.language() ).count() > 2 ) + bool needsCountryName = locale.contains( '_' ) && QLocale::countriesForLanguage( m_locale.language() ).count() > 2; + + if ( needsCountryName ) { - QLatin1Literal countrySuffix( " (%1)" ); + sortKey.append( '+' ); + sortKey.append( QLocale::countryToString( m_locale.country() ) ); - sortKey.append( QString( countrySuffix ).arg( QLocale::countryToString( m_locale.country() ) ) ); - - // If the language name is RTL, make this parenthetical addition RTL as well. - QString countryFormat = label.isRightToLeft() ? QString( QChar( 0x202B ) ) : QString(); - countryFormat.append( countrySuffix ); - label.append( countryFormat.arg( m_locale.nativeCountryName() ) ); + countryName = m_locale.nativeCountryName(); } m_sortKey = sortKey; - m_label = label; + m_label = needsCountryName ? longFormat.arg( languageName ).arg( countryName ) : languageName; } QLocale LocaleLabel::getLocale( const QString& localeName ) From 3dda9ab860f1d2aec92e505465f4bc1c97d6d664 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Dec 2018 11:30:05 +0100 Subject: [PATCH 45/74] [libcalamaresui] LocaleLabel doesn't need to inherit QObject - Use static QObject::tr instead. --- src/libcalamaresui/utils/CalamaresUtilsGui.cpp | 2 +- src/libcalamaresui/utils/CalamaresUtilsGui.h | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp index 5e4b8e069..803e1b050 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp @@ -270,7 +270,7 @@ LocaleLabel::LocaleLabel( const QString& locale ) : m_locale( LocaleLabel::getLocale( locale ) ) , m_localeId( locale ) { - QString longFormat = tr( "%1 (%2)", "Language (Country)" ); + QString longFormat = QObject::tr( "%1 (%2)", "Language (Country)" ); QString sortKey = QLocale::languageToString( m_locale.language() ); QString languageName = m_locale.nativeLanguageName(); diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.h b/src/libcalamaresui/utils/CalamaresUtilsGui.h index 1e5f283b1..9cbc7a4a3 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.h +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.h @@ -134,10 +134,8 @@ constexpr int windowPreferredHeight = 520; * translation system) into QLocales, and also into consistent * human-readable text labels. */ -class LocaleLabel : public QObject +class LocaleLabel { - Q_OBJECT - public: /** @brief Construct from a locale name. * From 8790985fca581469b96b61cb71f1c631a2291b2a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Dec 2018 11:33:13 +0100 Subject: [PATCH 46/74] [libcalamaresui] Code-formatting, remove dead code --- src/libcalamaresui/utils/CalamaresUtilsGui.cpp | 8 ++------ src/libcalamaresui/utils/CalamaresUtilsGui.h | 14 ++++++++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp index 803e1b050..789b41c4f 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp @@ -170,11 +170,7 @@ createRoundedImage( const QPixmap& pixmap, const QSize& size, float frameWidthPc painter.setBrush( brush ); painter.setPen( pen ); - painter.drawRoundedRect( outerRect, qreal(frameWidthPct) * 100.0, qreal(frameWidthPct) * 100.0, Qt::RelativeSize ); - -/* painter.setBrush( Qt::transparent ); - painter.setPen( Qt::white ); - painter.drawRoundedRect( outerRect, frameWidthPct, frameWidthPct, Qt::RelativeSize ); */ + painter.drawRoundedRect( outerRect, qreal( frameWidthPct ) * 100.0, qreal( frameWidthPct ) * 100.0, Qt::RelativeSize ); return frame; } @@ -246,7 +242,7 @@ setDefaultFontSize( int points ) QSize defaultIconSize() { - const int w = int(defaultFontHeight() * 1.6); + const int w = int( defaultFontHeight() * 1.6 ); return QSize( w, w ); } diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.h b/src/libcalamaresui/utils/CalamaresUtilsGui.h index 9cbc7a4a3..e75eee210 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.h +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.h @@ -147,7 +147,7 @@ public: * * English (@see isEnglish() -- it means en_US) is sorted at the top. */ - bool operator <(const LocaleLabel& other) const + bool operator <( const LocaleLabel& other ) const { if ( isEnglish() ) return !other.isEnglish(); @@ -163,13 +163,19 @@ public: */ bool isEnglish() const { - return m_localeId == QLatin1Literal( "en_US" ) || m_localeId == QLatin1Literal( "en" ); + return m_localeId == QLatin1Literal( "en_US" ) || m_localeId == QLatin1Literal( "en" ); } /** @brief Get the human-readable name for this locale. */ - QString label() const { return m_label; } + QString label() const + { + return m_label; + } /** @brief Get the Qt locale. */ - QLocale locale() const { return m_locale; } + QLocale locale() const + { + return m_locale; + } /** @brief Get a Qt locale for the given @p localeName * From 210965aca48dac26837335f1d7538fc4a6fc5183 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Dec 2018 13:20:32 +0100 Subject: [PATCH 47/74] [libcalamaresui] Allow always-show-country setting in locale label --- src/libcalamaresui/utils/CalamaresUtilsGui.cpp | 5 +++-- src/libcalamaresui/utils/CalamaresUtilsGui.h | 9 +++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp index 789b41c4f..a7783af3e 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp @@ -262,7 +262,7 @@ clearLayout( QLayout* layout ) } } -LocaleLabel::LocaleLabel( const QString& locale ) +LocaleLabel::LocaleLabel( const QString& locale, LabelFormat format ) : m_locale( LocaleLabel::getLocale( locale ) ) , m_localeId( locale ) { @@ -275,7 +275,8 @@ LocaleLabel::LocaleLabel( const QString& locale ) if ( languageName.isEmpty() ) languageName = QString( QLatin1Literal( "* %1 (%2)" ) ).arg( locale, sortKey ); - bool needsCountryName = locale.contains( '_' ) && QLocale::countriesForLanguage( m_locale.language() ).count() > 2; + bool needsCountryName = ( format == LabelFormat::AlwaysWithCountry ) || + (locale.contains( '_' ) && QLocale::countriesForLanguage( m_locale.language() ).count() > 1 ); if ( needsCountryName ) { diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.h b/src/libcalamaresui/utils/CalamaresUtilsGui.h index e75eee210..6a036b218 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.h +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.h @@ -137,11 +137,16 @@ constexpr int windowPreferredHeight = 520; class LocaleLabel { public: + /** @brief Formatting option for label -- add (country) to label. */ + enum class LabelFormat { AlwaysWithCountry, IfNeededWithCountry } ; + /** @brief Construct from a locale name. * - * The locale name should be one that Qt recognizes, e.g. en_US or ar_EY. + * The @p localeName should be one that Qt recognizes, e.g. en_US or ar_EY. + * The @p format determines whether the country name is always present + * in the label (human-readable form) or only if needed for disambiguation. */ - LocaleLabel( const QString& localeName ); + LocaleLabel( const QString& localeName, LabelFormat format = LabelFormat::IfNeededWithCountry ); /** @brief Define a sorting order. * From 56a71c232f73113843272bc85bfb7ee904379d21 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 14 Dec 2018 13:27:32 +0100 Subject: [PATCH 48/74] [locale] Use the re-factored LocaleLabel --- src/modules/locale/LocalePage.cpp | 31 ++++++++----------------------- src/modules/locale/LocalePage.h | 1 - 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index 50f2d9889..ea77d6b9f 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -21,6 +21,7 @@ #include "timezonewidget/timezonewidget.h" #include "SetTimezoneJob.h" +#include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include "utils/Retranslator.h" #include "GlobalStorage.h" @@ -383,12 +384,14 @@ LocalePage::init( const QString& initialRegion, std::pair< QString, QString > LocalePage::prettyLocaleStatus( const LocaleConfiguration& lc ) const { + using CalamaresUtils::LocaleLabel; + + LocaleLabel lang( lc.lang, LocaleLabel::LabelFormat::AlwaysWithCountry ); + LocaleLabel num( lc.lc_numeric, LocaleLabel::LabelFormat::AlwaysWithCountry ); + return std::make_pair< QString, QString >( - tr( "The system language will be set to %1." ) - .arg( prettyLCLocale( lc.lang ) ), - tr( "The numbers and dates locale will be set to %1." ) - .arg( prettyLCLocale( lc.lc_numeric ) ) - ); + tr( "The system language will be set to %1." ).arg( lang.label() ), + tr( "The numbers and dates locale will be set to %1." ).arg( num.label() ) ); } QString @@ -468,24 +471,6 @@ LocalePage::guessLocaleConfiguration() const } -QString -LocalePage::prettyLCLocale( const QString& lcLocale ) const -{ - QString localeString = lcLocale; - if ( localeString.endsWith( " UTF-8" ) ) - localeString.remove( " UTF-8" ); - - QLocale locale( localeString ); - //: Language (Country) - const QString lang = !locale.nativeLanguageName().isEmpty() ? - locale.nativeLanguageName() : - QLocale::languageToString( locale.language() ); - const QString country = !locale.nativeCountryName().isEmpty() ? - locale.nativeCountryName() : - QLocale::countryToString( locale.country() ); - return tr( "%1 (%2)" ).arg( lang ).arg( country ); -} - void LocalePage::updateGlobalStorage() { diff --git a/src/modules/locale/LocalePage.h b/src/modules/locale/LocalePage.h index c4ca20503..fae16cfb9 100644 --- a/src/modules/locale/LocalePage.h +++ b/src/modules/locale/LocalePage.h @@ -51,7 +51,6 @@ public: private: LocaleConfiguration guessLocaleConfiguration() const; - QString prettyLCLocale( const QString& localesMap ) const; // For the given locale config, return two strings describing // the settings for language and numbers. From fe3a88f834dabdb81bd5dddf2a35d6b4e2ad9a27 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 3 Jan 2019 14:36:48 +0100 Subject: [PATCH 49/74] [packages] Fix cut-and-paste-o in packages try_remove - Copied from_local from the code for install, which doesn't make sense and causes a NameError. FIXES #1063 --- src/modules/packages/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py index 9116cf2ef..aac1aa6f9 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -150,10 +150,10 @@ class PackageManager(metaclass=abc.ABCMeta): @param packagedata: str|dict """ if isinstance(packagedata, str): - self.remove([packagedata], from_local=from_local) + self.remove([packagedata]) else: self.run(packagedata["pre-script"]) - self.remove([packagedata["package"]], from_local=from_local) + self.remove([packagedata["package"]]) self.run(packagedata["post-script"]) From ad9fe5b38249d5af7e5aea97efb867d37bd9230a Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Thu, 3 Jan 2019 15:06:50 +0100 Subject: [PATCH 50/74] i18n: [calamares] Automatic merge of Transifex translations --- lang/calamares_ar.ts | 4 +- lang/calamares_eu.ts | 287 ++++++++++++++++++++++--------------------- lang/calamares_hu.ts | 235 ++++++++++++++++++----------------- lang/calamares_ja.ts | 90 +++++++------- lang/calamares_mk.ts | 12 +- 5 files changed, 317 insertions(+), 311 deletions(-) diff --git a/lang/calamares_ar.ts b/lang/calamares_ar.ts index 32ed6c1d7..f50c7d51f 100644 --- a/lang/calamares_ar.ts +++ b/lang/calamares_ar.ts @@ -73,7 +73,7 @@ Modules - الوحدا + الوحدات @@ -2834,7 +2834,7 @@ Output: %1 support - 1% الدعم + %1 الدعم diff --git a/lang/calamares_eu.ts b/lang/calamares_eu.ts index 811d034b3..c93ffb6b1 100644 --- a/lang/calamares_eu.ts +++ b/lang/calamares_eu.ts @@ -4,17 +4,17 @@ 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. - + Sistema honen <strong>abio ingurunea</strong>. <br><br>X86 zaharrek <strong>BIOS</strong> euskarria bakarrik daukate. <br>Sistema modernoek normalean <strong>EFI</strong> darabilte, baina BIOS bezala ere agertu daitezke konpatibilitate moduan hasiz gero. 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. - + Sistema hau <strong>EFI</strong> abio inguruneaz hasi da.<br><br>EFI ingurunetik abiaraztea konfiguratzeko instalatzaile honek abio kargatzaile aplikazioa ezarri behar du, <strong>GRUB </strong> bezalakoa edo <strong>systemd-abioa</strong> <strong>EFI sistema partizio</strong> batean. Hau automatikoa da, zuk partizioak eskuz egitea aukeratzen ez baduzu, eta kasu horretan zuk sortu edo aukeratu beharko duzu zure kabuz. 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. - + Sistema hau <strong>BIOS</strong> abio inguruneaz hasi da.<br><br>BIOS ingurunetik abiaraztea konfiguratzeko instalatzaile honek abio kargatzaile aplikazioa ezarri behar du, <strong>GRUB</strong> bezalakoa, partizioaren hasieran edo <strong>Master Boot Record</strong> deritzonean partizio taularen hasieratik gertu (hobetsia). Hau automatikoa da, zuk partizioak eskuz egitea aukeratzen ez baduzu eta kasu horretan zuk sortu edo aukeratu beharko duzu zure kabuz. @@ -22,7 +22,7 @@ Master Boot Record of %1 - + %1-(e)n Master Boot Record @@ -50,7 +50,7 @@ Blank Page - + Orri zuria @@ -63,7 +63,7 @@ GlobalStorage - + Biltegiratze globala @@ -84,12 +84,12 @@ none - + Ezer ez Interface: - + Interfasea: @@ -99,7 +99,7 @@ Debug information - + Arazte informazioa @@ -146,7 +146,7 @@ Working directory %1 for python job %2 is not readable. - + %1 lanerako direktorioa %2 python lanak ezin du irakurri. @@ -161,7 +161,7 @@ Boost.Python error in job "%1". - + Boost.Python errorea "%1" lanean. @@ -192,22 +192,22 @@ Calamares Initialization Failed - + Calamares instalazioak huts egin du %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. - + %1 ezin da instalatu. Calamares ez da gai konfiguratutako modulu guztiak kargatzeko. Arazao hau banaketak Calamares erabiltzen duen eragatik da. <br/>The following modules could not be loaded: - + <br/> Ondorengo moduluak ezin izan dira kargatu: &Install - + &Instalatu @@ -218,7 +218,8 @@ Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + Ziur uneko instalazio prozesua bertan behera utzi nahi duzula? +Instalatzailea irten egingo da eta aldaketa guztiak galduko dira. @@ -243,7 +244,7 @@ The installer will quit and all changes will be lost. 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> - + %1 instalatzailea zure diskoan aldaketak egitera doa %2 instalatzeko.<br/><strong>Ezingo dituzu desegin aldaketa hauek.</strong> @@ -281,7 +282,7 @@ The installer will quit and all changes will be lost. Unknown exception type - + Salbuespen-mota ezezaguna @@ -309,7 +310,7 @@ The installer will quit and all changes will be lost. Show debug information - + Erakutsi arazte informazioa @@ -317,17 +318,17 @@ The installer will quit and all changes will be lost. This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> - + Konputagailu honek ez dauzka gutxieneko eskakizunak %1 instalatzeko. <br/>Instalazioak ezin du jarraitu. <a href="#details">Xehetasunak...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. - + Konputagailu honek ez du betetzen gomendatutako zenbait eskakizun %1 instalatzeko. <br/>Instalazioak jarraitu ahal du, baina zenbait ezaugarri desgaituko dira. This program will ask you some questions and set up %2 on your computer. - + Konputagailuan %2 ezartzeko programa honek hainbat galdera egingo dizkizu. @@ -370,7 +371,7 @@ The installer will quit and all changes will be lost. Select storage de&vice: - + Aukeratu &biltegiratze-gailua: @@ -413,7 +414,7 @@ The installer will quit and all changes will be lost. 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. - + Biltegiratze-gailuak badirudi ez duela sistema eragilerik. Zer egin nahiko zenuke? <br/>Zure aukerak berrikusteko eta berresteko aukera izango duzu aldaketak gauzatu aurretik biltegiratze-gailuan @@ -421,7 +422,7 @@ The installer will quit and all changes will be lost. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. - + <strong>Diskoa ezabatu</strong><br/>Honek orain dauden datu guztiak <font color="red">ezbatuko</font> ditu biltegiratze-gailutik. @@ -533,7 +534,7 @@ The installer will quit and all changes will be lost. MiB - + MiB @@ -558,12 +559,12 @@ The installer will quit and all changes will be lost. LVM LV name - + LVM LV izena Flags: - + Banderak: @@ -573,12 +574,12 @@ The installer will quit and all changes will be lost. Si&ze: - Ta&maina: + &Tamaina: En&crypt - + En%kriptatu @@ -598,7 +599,7 @@ The installer will quit and all changes will be lost. Mountpoint already in use. Please select another one. - + Muntatze-puntua erabiltzen. Mesedez aukeratu beste bat. @@ -606,22 +607,22 @@ The installer will quit and all changes will be lost. Create new %2MB partition on %4 (%3) with file system %1. - + Sortu %2MB partizioa %4n (%3) %1 fitxategi sistemaz. Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. - + Sortu <strong>%2MB</strong> partizioa <strong>%4</strong>n (%3) <strong>%1</strong> fitxategi sistemaz. Creating new %1 partition on %2. - + %1 partizioa berria sortzen %2n. The installer failed to create partition on disk '%1'. - + Huts egin du instalatzaileak '%1' diskoan partizioa sortzen. @@ -634,17 +635,17 @@ The installer will quit and all changes will be lost. Creating a new partition table will delete all existing data on the disk. - + Partizio taula berria sortzean diskoan dauden datu guztiak ezabatuko dira. What kind of partition table do you want to create? - + Zein motatako partizio taula sortu nahi duzu? Master Boot Record (MBR) - + Master Boot Record (MBR) @@ -657,22 +658,22 @@ The installer will quit and all changes will be lost. Create new %1 partition table on %2. - + Sortu %1 partizio taula berria %2n. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). - + Sortu <strong>%1</strong> partizio taula berria <strong>%2</strong>n (%3). Creating new %1 partition table on %2. - + %1 partizio taula berria %2n sortzen. The installer failed to create a partition table on %1. - + Huts egin du instalatzaileak '%1' diskoan partizioa taula sortzen. @@ -685,7 +686,7 @@ The installer will quit and all changes will be lost. Create user <strong>%1</strong>. - + Sortu <strong>%1</strong> erabiltzailea @@ -718,22 +719,22 @@ The installer will quit and all changes will be lost. Create new volume group named %1. - + Sortu bolumen talde berria %1 izenaz. Create new volume group named <strong>%1</strong>. - + Sortu bolumen talde berria<strong> %1</strong> izenaz. Creating new volume group named %1. - + Bolumen talde berria sortzen %1 izenaz. The installer failed to create a volume group named '%1'. - + Huts egin du instalatzaileak '%1' izeneko bolumen taldea sortzen. @@ -742,17 +743,17 @@ The installer will quit and all changes will be lost. Deactivate volume group named %1. - + Desaktibatu %1 izeneko bolumen taldea. Deactivate volume group named <strong>%1</strong>. - + Desaktibatu <strong>%1</strong> izeneko bolumen taldea. The installer failed to deactivate a volume group named %1. - + Huts egin du instalatzaileak '%1' izeneko bolumen taldea desaktibatzen. @@ -765,7 +766,7 @@ The installer will quit and all changes will be lost. Delete partition <strong>%1</strong>. - + Ezabatu <strong>%1</strong> partizioa. @@ -775,7 +776,7 @@ The installer will quit and all changes will be lost. The installer failed to delete partition %1. - + Huts egin du instalatzaileak %1 partizioa ezabatzen. @@ -788,7 +789,7 @@ The installer will quit and all changes will be lost. This device has a <strong>%1</strong> partition table. - + Gailuak <strong>%1</strong> partizio taula dauka. @@ -821,7 +822,7 @@ The installer will quit and all changes will be lost. %1 - (%2) - + %1 - (%2) @@ -839,7 +840,7 @@ The installer will quit and all changes will be lost. Failed to open %1 - + Huts egin du %1 irekitzean @@ -847,7 +848,7 @@ The installer will quit and all changes will be lost. Dummy C++ Job - + Dummy C++ lana @@ -855,7 +856,7 @@ The installer will quit and all changes will be lost. Edit Existing Partition - + Editatu badagoen partizioa @@ -865,7 +866,7 @@ The installer will quit and all changes will be lost. &Keep - + M&antendu @@ -890,7 +891,7 @@ The installer will quit and all changes will be lost. MiB - + MiB @@ -900,12 +901,12 @@ The installer will quit and all changes will be lost. Flags: - + Banderak: Mountpoint already in use. Please select another one. - + Muntatze-puntua erabiltzen. Mesedez aukeratu beste bat. @@ -918,22 +919,22 @@ The installer will quit and all changes will be lost. En&crypt system - + Sistema en%kriptatua Passphrase - + Pasahitza Confirm passphrase - + Berretsi pasahitza Please enter the same passphrase in both boxes. - + Mesedez sartu pasahitz berdina bi kutxatan. @@ -946,7 +947,7 @@ The installer will quit and all changes will be lost. Install %1 on <strong>new</strong> %2 system partition. - + Instalatu %1 sistemako %2 partizio <strong>berrian</strong>. @@ -966,7 +967,7 @@ The installer will quit and all changes will be lost. Install boot loader on <strong>%1</strong>. - + Instalatu abio kargatzailea <strong>%1</strong>-(e)n. @@ -1012,12 +1013,12 @@ The installer will quit and all changes will be lost. Installation Complete - + Instalazioa amaitua The installation of %1 is complete. - + %1 instalazioa amaitu da. @@ -1025,7 +1026,7 @@ The installer will quit and all changes will be lost. Format partition %1 (file system: %2, size: %3 MB) on %4. - + Formateatu %1 partizioa %4-(e)n (fitxategi sistema: %2, tamaina: %3 MB). @@ -1035,12 +1036,12 @@ The installer will quit and all changes will be lost. Formatting partition %1 with file system %2. - + %1 partizioa formateatzen %2 sistemaz. The installer failed to format partition %1 on disk '%2'. - + Huts egin du instalatzaileak %1 partizioa sortzen '%2' diskoan. @@ -1053,7 +1054,7 @@ The installer will quit and all changes will be lost. Please install KDE Konsole and try again! - + Mesedez instalatu KDE kontsola eta saiatu berriz! @@ -1066,7 +1067,7 @@ The installer will quit and all changes will be lost. Script - + Script @@ -1074,12 +1075,12 @@ The installer will quit and all changes will be lost. Set keyboard model to %1.<br/> - + Ezarri teklatu mota %1ra.<br/> Set keyboard layout to %1/%2. - + Ezarri teklatu diseinua %1%2ra. @@ -1110,7 +1111,7 @@ The installer will quit and all changes will be lost. &OK - + &Ados @@ -1180,7 +1181,7 @@ The installer will quit and all changes will be lost. <a href="%1">view license agreement</a> - + <a href="%1">Ikusi lizentzia kontratua</a> @@ -1196,12 +1197,12 @@ The installer will quit and all changes will be lost. The system language will be set to %1. - + %1 ezarriko da sistemako hizkuntza bezala. The numbers and dates locale will be set to %1. - + Zenbaki eta daten eskualdea %1-(e)ra ezarri da. @@ -1222,7 +1223,7 @@ The installer will quit and all changes will be lost. Set timezone to %1/%2.<br/> - + Ordu-zonaldea %1%2-ra ezarri da.<br/> @@ -1254,7 +1255,7 @@ The installer will quit and all changes will be lost. Description - + Deskribapena @@ -1272,7 +1273,7 @@ The installer will quit and all changes will be lost. Package selection - + Pakete aukeraketa @@ -1280,17 +1281,17 @@ The installer will quit and all changes will be lost. Password is too short - + Pasahitza laburregia da Password is too long - + Pasahitza luzeegia da Password is too weak - + Pasahitza ahulegia da @@ -1305,12 +1306,12 @@ The installer will quit and all changes will be lost. The password is the same as the old one - + Pasahitza aurreko zahar baten berdina da The password is a palindrome - + Pasahitza palindromoa da @@ -1320,7 +1321,7 @@ The installer will quit and all changes will be lost. The password is too similar to the old one - + Pasahitza aurreko zahar baten oso antzerakoa da @@ -1340,52 +1341,52 @@ The installer will quit and all changes will be lost. The password contains less than %1 digits - + Pasahitzak %1 baino zenbaki gutxiago ditu The password contains too few digits - + Pasahitzak zenbaki gutxiegi ditu The password contains less than %1 uppercase letters - + Pasahitzak %1 baino maiuskula gutxiago ditu The password contains too few uppercase letters - + Pasahitzak maiuskula gutxiegi ditu The password contains less than %1 lowercase letters - + Pasahitzak %1 baino minuskula gutxiago ditu The password contains too few lowercase letters - + Pasahitzak minuskula gutxiegi ditu The password contains less than %1 non-alphanumeric characters - + Pasahitzak alfabetokoak ez diren %1 baino karaktere gutxiago ditu The password contains too few non-alphanumeric characters - + Pasahitzak alfabetokoak ez diren karaktere gutxiegi ditu The password is shorter than %1 characters - + Pasahitza %1 karaktere baino motzagoa da. The password is too short - + Pasahitza motzegia da @@ -1551,24 +1552,24 @@ The installer will quit and all changes will be lost. What name do you want to use to log in? - + Zein izen erabili nahi duzu saioa hastean? font-weight: normal - + Letra-mota zabalera: normala <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> - + <small>Ordenagailu hau pertsona batek baino gehiagok erabiltzen badu, instalazio ondoren hainbat kontu ezarri zenitzake.</small> Choose a password to keep your account safe. - + Aukeratu pasahitza zure kontua babesteko. @@ -1583,7 +1584,7 @@ The installer will quit and all changes will be lost. <small>This name will be used if you make the computer visible to others on a network.</small> - + <small>Izen hau erakutsiko da sarean zure ordenagailua besteei erakustean.</small> @@ -1603,7 +1604,7 @@ The installer will quit and all changes will be lost. <small>Enter the same password twice, so that it can be checked for typing errors.</small> - + <small>Sartu pasahitza birritan, honela tekleatze erroreak egiaztatzeko.</small> @@ -1611,32 +1612,32 @@ The installer will quit and all changes will be lost. Root - + Root Home - + Home Boot - + Boot EFI system - + EFI sistema Swap - + Swap New partition for %1 - + Partizio berri %1(e)ntzat @@ -1646,7 +1647,7 @@ The installer will quit and all changes will be lost. %1 %2 - + %1 %2 @@ -1694,12 +1695,12 @@ The installer will quit and all changes will be lost. Storage de&vice: - + Biltegiratze-gailua: &Revert All Changes - + Atze&ra bota aldaketa guztiak: @@ -1905,7 +1906,7 @@ The installer will quit and all changes will be lost. Saving files for later ... - + Fitxategiak geroko gordetzen... @@ -1931,32 +1932,34 @@ There was no output from the command. Output: - + +Irteera: + External command crashed. - + Kanpo-komandoak huts egin du. Command <i>%1</i> crashed. - + <i>%1</i> komandoak huts egin du. External command failed to start. - + Ezin izan da %1 kanpo-komandoa abiarazi. Command <i>%1</i> failed to start. - + Ezin izan da <i>%1</i> komandoa abiarazi. Internal error when starting command. - + Barne-akatsa komandoa abiarazterakoan. @@ -1966,7 +1969,7 @@ Output: External command failed to finish. - + Kanpo-komandoa ez da bukatu. @@ -1976,7 +1979,7 @@ Output: External command finished with errors. - + Kanpo-komandoak akatsekin bukatu da. @@ -1989,7 +1992,7 @@ Output: Default Keyboard Model - + Teklatu mota lehenetsia @@ -2000,22 +2003,22 @@ Output: unknown - + Ezezaguna extended - + Hedatua unformatted - + Formatugabea swap - + swap @@ -2167,12 +2170,12 @@ Output: The installer is not running with administrator rights. - + Instalatzailea ez dabil exekutatzen administrari eskubideekin. The screen is too small to display the installer. - + Pantaila txikiegia da instalatzailea erakusteko. @@ -2185,7 +2188,7 @@ Output: Invalid configuration - + Konfigurazio baliogabea @@ -2251,7 +2254,7 @@ Output: Resize partition %1. - + Tamaina aldatu %1 partizioari. @@ -2293,12 +2296,12 @@ Output: Scanning storage devices... - + Biltegiratze-gailuak eskaneatzen... Partitioning - + Partizioa(k) egiten @@ -2469,7 +2472,7 @@ Output: Cannot disable root account. - + Ezin da desgaitu root kontua. @@ -2517,7 +2520,7 @@ Output: Cannot set timezone, - + Ezin da ezarri ordu-zonaldea @@ -2747,12 +2750,12 @@ Output: MiB - + MiB Total Size: - + Tamaina guztira: @@ -2760,22 +2763,22 @@ Output: --- - + --- Used Size: - + Erabilitako tamaina: Total Sectors: - + Sektoreak guztira: Quantity of LVs: - + LV kopurua: diff --git a/lang/calamares_hu.ts b/lang/calamares_hu.ts index 0be907a6c..47a596df1 100644 --- a/lang/calamares_hu.ts +++ b/lang/calamares_hu.ts @@ -192,17 +192,17 @@ Calamares Initialization Failed - + A Calamares előkészítése meghiúsult %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. - + A(z) %1 nem telepíthető. A Calamares nem tudta betölteni a konfigurált modulokat. Ez a probléma abból fakad, ahogy a disztribúció a Calamarest használja. <br/>The following modules could not be loaded: - + <br/>A következő modulok nem tölthetőek be: @@ -509,12 +509,12 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + A parancs a gazdakörnyezetben fut, és ismernie kell a gyökér útvonalát, de nincs rootMountPoint megadva. The command needs to know the user's name, but no username is defined. - + A parancsnak tudnia kell a felhasználónevet, de az nincs megadva. @@ -522,7 +522,7 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l Contextual Processes Job - + Környezetfüggő folyamatok feladat @@ -560,7 +560,7 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l LVM LV name - + LVM LV név @@ -720,22 +720,22 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l Create new volume group named %1. - + Új kötetcsoport létrehozása: %1. Create new volume group named <strong>%1</strong>. - + Új kötetcsoport létrehozása: <strong>%1</strong>. Creating new volume group named %1. - + Új kötetcsoport létrehozása: %1. The installer failed to create a volume group named '%1'. - + A telepítő nem tudta létrehozni a kötetcsoportot: „%1”. @@ -744,17 +744,17 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l Deactivate volume group named %1. - + A kötetcsoport deaktiválása: %1. Deactivate volume group named <strong>%1</strong>. - + Kötetcsoport deaktiválása: <strong>%1</strong>. The installer failed to deactivate a volume group named %1. - + A telepítőnek nem sikerült deaktiválnia a kötetcsoportot: %1. @@ -823,7 +823,7 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l %1 - (%2) - + %1 – (%2) @@ -986,7 +986,7 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l <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> - + <html><head/><body><p>Ha ez be van jelölve, akkor a rendszer azonnal újraindul, ha a <span style=" font-style:italic;">Kész</span>-re kattint, vagy bezárja a telepítőt.</p></body></html> @@ -1292,232 +1292,232 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l Password is too weak - + A jelszó túl gyenge Memory allocation error when setting '%1' - + Memóriafoglalási hiba a(z) „%1” beállításakor Memory allocation error - + Memóriafoglalási hiba The password is the same as the old one - + A jelszó ugyanaz, mint a régi The password is a palindrome - + A jelszó egy palindrom The password differs with case changes only - + A jelszó csak kis- és nagybetűben tér el The password is too similar to the old one - + A jelszó túlságosan hasonlít a régire The password contains the user name in some form - + A jelszó tartalmazza felhasználónevet valamilyen formában The password contains words from the real name of the user in some form - + A jelszó tartalmazza a felhasználó valódi nevét valamilyen formában The password contains forbidden words in some form - + A jelszó tiltott szavakat tartalmaz valamilyen formában The password contains less than %1 digits - + A jelszó kevesebb mint %1 számjegyet tartalmaz The password contains too few digits - + A jelszó túl kevés számjegyet tartalmaz The password contains less than %1 uppercase letters - + A jelszó kevesebb mint %1 nagybetűt tartalmaz The password contains too few uppercase letters - + A jelszó túl kevés nagybetűt tartalmaz The password contains less than %1 lowercase letters - + A jelszó kevesebb mint %1 kisbetűt tartalmaz The password contains too few lowercase letters - + A jelszó túl kevés kisbetűt tartalmaz The password contains less than %1 non-alphanumeric characters - + A jelszó kevesebb mint %1 nem alfanumerikus karaktert tartalmaz The password contains too few non-alphanumeric characters - + A jelszó túl kevés nem alfanumerikus karaktert tartalmaz The password is shorter than %1 characters - + A jelszó rövidebb mint %1 karakter The password is too short - + A jelszó túl rövid The password is just rotated old one - + A jelszó egy újra felhasznált régi jelszó The password contains less than %1 character classes - + A jelszó kevesebb mint %1 karaktert tartalmaz The password does not contain enough character classes - + A jelszó nem tartalmaz elég karakterosztályt The password contains more than %1 same characters consecutively - + A jelszó több mint %1 egyező karaktert tartalmaz egymás után The password contains too many same characters consecutively - + A jelszó túl sok egyező karaktert tartalmaz egymás után The password contains more than %1 characters of the same class consecutively - + A jelszó több mint %1 karaktert tartalmaz ugyanabból a karakterosztályból egymás után The password contains too many characters of the same class consecutively - + A jelszó túl sok karaktert tartalmaz ugyanabból a karakterosztályból egymás után The password contains monotonic sequence longer than %1 characters - + A jelszó %1 karakternél hosszabb monoton sorozatot tartalmaz The password contains too long of a monotonic character sequence - + A jelszó túl hosszú monoton karaktersorozatot tartalmaz No password supplied - + Nincs jelszó megadva Cannot obtain random numbers from the RNG device - + Nem nyerhetőek ki véletlenszámok az RNG eszközből Password generation failed - required entropy too low for settings - + A jelszó előállítás meghiúsult – a szükséges entrópia túl alacsony a beállításokhoz The password fails the dictionary check - %1 - + A jelszó megbukott a szótárellenőrzésen – %1 The password fails the dictionary check - + A jelszó megbukott a szótárellenőrzésen Unknown setting - %1 - + Ismeretlen beállítás – %1 Unknown setting - + Ismeretlen beállítás Bad integer value of setting - %1 - + Hibás egész érték a beállításnál – %1 Bad integer value - + Hibás egész érték Setting %1 is not of integer type - + A(z) %1 beállítás nem egész típusú Setting is not of integer type - + A beállítás nem egész típusú Setting %1 is not of string type - + A(z) %1 beállítás nem karakterlánc típusú Setting is not of string type - + A beállítás nem karakterlánc típusú Opening the configuration file failed - + A konfigurációs fájl megnyitása meghiúsult The configuration file is malformed - + A konfigurációs fájl rosszul formázott Fatal failure - + Végzetes hiba Unknown error - + Ismeretlen hiba @@ -1711,7 +1711,7 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l Cre&ate - + &Létrehozás @@ -1726,27 +1726,27 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l New Volume Group - + Új kötetcsoport Resize Volume Group - + Kötetcsoport átméretezése Deactivate Volume Group - + Kötetcsoport deaktiválása Remove Volume Group - + Kötetcsoport eltávolítása I&nstall boot loader on: - + Rendszerbetöltő &telepítése ide: @@ -1756,12 +1756,12 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l Can not create new partition - + Nem hozható létre új partíció 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. - + A(z) %1 lemezen lévő partíciós táblában már %2 elsődleges partíció van, és több nem adható hozzá. Helyette távolítson el egy elsődleges partíciót, és adjon hozzá egy kiterjesztett partíciót. @@ -1867,13 +1867,13 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l Plasma Look-and-Feel Job - + Plasma kinézet feladat Could not select KDE Plasma Look-and-Feel package - + A KDE Plasma kinézeti csomag nem válaszható ki @@ -1891,7 +1891,7 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l 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. - + Válasszon egy kinézetet a KDE Plasma asztali környezethez. Ki is hagyhatja ezt a lépést, és beállíthatja a kinézetet, ha a telepítés elkészült. A kinézetválasztóra kattintva élő előnézetet kaphat a kinézetről. @@ -1899,7 +1899,7 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l Look-and-Feel - + Kinézet @@ -1907,17 +1907,17 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l Saving files for later ... - + Fájlok mentése későbbre … No files configured to save for later. - + Nincsenek fájlok beállítva elmentésre későbbre Not all of the configured files could be preserved. - + Nem az összes beállított fájl örízhető meg. @@ -1926,14 +1926,17 @@ Telepítés nem folytatható. <a href="#details">Részletek...&l There was no output from the command. - + +A parancsnak nem volt kimenete. Output: - + +Kimenet: + @@ -1948,17 +1951,17 @@ Output: External command failed to start. - + A külső parancsot nem sikerült elindítani. Command <i>%1</i> failed to start. - + A(z) <i>%1</i> parancsot nem sikerült elindítani. Internal error when starting command. - + Belső hiba a parancs végrehajtásakor. @@ -1973,17 +1976,17 @@ Output: Command <i>%1</i> failed to finish in %2 seconds. - + A(z) <i>%1</i> parancsot nem sikerült befejezni %2 másodperc alatt. External command finished with errors. - + A külső parancs hibával fejeződött be. Command <i>%1</i> finished with exit code %2. - + A(z) <i>%1</i> parancs hibakóddal lépett ki: %2. @@ -2031,17 +2034,17 @@ Output: Remove Volume Group named %1. - + A kötetcsoport eltávolítása: %1. Remove Volume Group named <strong>%1</strong>. - + Kötetcsoport eltávolítása: <strong>%1</strong>. The installer failed to remove a volume group named '%1'. - + A telepítő nem tudta eltávolítani a kötetcsoportot: „%1”. @@ -2182,29 +2185,29 @@ Output: Resize Filesystem Job - + Fájlrendszer átméretezési feladat Invalid configuration - + Érvénytelen konfiguráció The file-system resize job has an invalid configuration and will not run. - + A fájlrendszer átméretezési feladat konfigurációja érvénytelen, és nem fog futni. KPMCore not Available - + A KPMCore nem érhető el Calamares cannot start KPMCore for the file-system resize job. - + A Calamares nem tudja elindítani a KPMCore-t a fájlrendszer átméretezési feladathoz. @@ -2213,39 +2216,39 @@ Output: Resize Failed - + Az átméretezés meghiúsult The filesystem %1 could not be found in this system, and cannot be resized. - + A(z) %1 fájlrendszer nem található a rendszeren, és nem méretezhető át. The device %1 could not be found in this system, and cannot be resized. - + A(z) %1 eszköz nem található a rendszeren, és nem méretezhető át. The filesystem %1 cannot be resized. - + A(z) %1 fájlrendszer nem méretezhető át. The device %1 cannot be resized. - + A(z) %1 eszköz nem méretezhető át. The filesystem %1 must be resized, but cannot. - + A(z) %1 fájlrendszert át kell méretezni, de nem lehet. The device %1 must be resized, but cannot - + A(z) %1 eszközt át kell méretezni, de nem lehet @@ -2277,17 +2280,17 @@ Output: Resize volume group named %1 from %2 to %3. - + A(z) %1 kötet átméretezése ekkoráról: %2, ekkorára: %3. Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong>. - + A(z) <strong>%1</strong> kötet átméretezése ekkoráról: <strong>%2</strong>, ekkorára: <strong>%3</strong>. The installer failed to resize a volume group named '%1'. - + A telepítő nem tudta átméretezni a kötetcsoportot: „%1”. @@ -2532,7 +2535,7 @@ Output: Shell Processes Job - + Parancssori folyamatok feladat @@ -2541,7 +2544,7 @@ Output: %L1 / %L2 slide counter, %1 of %2 (numeric) - + %L1 / %L2 @@ -2725,27 +2728,27 @@ Calamares hiba %1. VolumeGroupDialog - + Kötetcsoport párbeszédablak List of Physical Volumes - + Fizikai kötetek listája Volume Group Name: - + Kötetcsoport neve: Volume Group Type: - + Kötetcsoport típusa: Physical Extent Size: - + Fizikai kiterjedés mérete: @@ -2755,7 +2758,7 @@ Calamares hiba %1. Total Size: - + Teljes méret: @@ -2763,22 +2766,22 @@ Calamares hiba %1. --- - + --- Used Size: - + Használt méret: Total Sectors: - + Szektorok összesen: Quantity of LVs: - + Logkai kötetek száma: @@ -2831,7 +2834,7 @@ Calamares hiba %1. <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 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg 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/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Köszönet: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg és a <a href="https://www.transifex.com/calamares/calamares/">Calamares fordítócsapat</a>.<br/><br/>A <a href="https://calamares.io/">Calamares</a> fejlesztését a <br/><a href="http://www.blue-systems.com/">Blue Systems</a> támogatja. diff --git a/lang/calamares_ja.ts b/lang/calamares_ja.ts index 673f3e4bb..1fb982825 100644 --- a/lang/calamares_ja.ts +++ b/lang/calamares_ja.ts @@ -14,7 +14,7 @@ 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. - このシステムは <strong>BIOS</strong> ブート環境で起動しました。<br><br> BIOS環境からの起動について設定するためには、パーティションの開始位置あるいはパーティションテーブルの開始位置の近く(推奨)にある<strong>マスターブートレコード</strong>に <strong>GRUB</strong> のようなブートローダーをインストールしなければなりません。手動によるパーティショニングを選択する場合はユーザー自身で設定しなければなりません。そうでない場合は、この操作は自動的に行われます。 + このシステムは <strong>BIOS</strong> ブート環境で起動しました。<br><br> BIOS環境からの起動について設定するためには、パーティションの開始位置あるいはパーティションテーブルの開始位置の近く (推奨) にある<strong>マスターブートレコード</strong>に <strong>GRUB</strong> のようなブートローダーをインストールしなければなりません。手動によるパーティショニングを選択する場合はユーザー自身で設定しなければなりません。そうでない場合は、この操作は自動的に行われます。 @@ -169,19 +169,19 @@ &Back - 戻る(&B) + 戻る (&B) &Next - 次へ(&N) + 次へ (&N) &Cancel - 中止(&C) + 中止 (&C) @@ -197,7 +197,7 @@ %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. - %1 はインストールできません。Calamares は全てのモジュールをロードすることをできませんでした。これは、Calamares のこのディストリビューションでの使用法による問題です。 + %1 はインストールできません。Calamares はすべてのモジュールをロードすることをできませんでした。これは、Calamares のこのディストリビューションでの使用法による問題です。 @@ -207,7 +207,7 @@ &Install - インストール(&I) + インストール (&I) @@ -224,17 +224,17 @@ The installer will quit and all changes will be lost. &Yes - はい(&Y) + はい (&Y) &No - いいえ(&N) + いいえ (&N) &Close - 閉じる(&C) + 閉じる (&C) @@ -249,17 +249,17 @@ The installer will quit and all changes will be lost. &Install now - 今すぐインストール(&I) + 今すぐインストール (&I) Go &back - 戻る(&B) + 戻る (&B) &Done - 実行(&D) + 実行 (&D) @@ -371,7 +371,7 @@ The installer will quit and all changes will be lost. Select storage de&vice: - ストレージデバイスを選択(&V): + ストレージデバイスを選択 (&V): @@ -539,22 +539,22 @@ The installer will quit and all changes will be lost. Partition &Type: - パーティションの種類(&T): + パーティションの種類 (&T): &Primary - プライマリ(&P) + プライマリ (&P) E&xtended - 拡張(&x) + 拡張 (&X) Fi&le System: - ファイルシステム (&L): + ファイルシステム (&L): @@ -569,17 +569,17 @@ The installer will quit and all changes will be lost. &Mount Point: - マウントポイント(&M) + マウントポイント (&M) Si&ze: - サイズ(&Z) + サイズ (&Z) En&crypt - 暗号化(&C) + 暗号化 (&C) @@ -650,7 +650,7 @@ The installer will quit and all changes will be lost. GUID Partition Table (GPT) - GUID パーティションテーブル(GPT) + GUID パーティションテーブル (GPT) @@ -784,7 +784,7 @@ The installer will quit and all changes will be lost. 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. - 選択したストレージデバイスにおける<strong> パーティションテーブル </strong> の種類。 <br><br> パーティションテーブルの種類を変更する唯一の方法は、パーティションテーブルを消去し、最初から再作成を行うことですが、この操作はストレージ上の全てのデータを破壊します。 <br> このインストーラーは、他の種類へ明示的に変更ししない限り、現在のパーティションテーブルが保持されます。よくわからない場合、最近のシステムではGPTが推奨されます。 + 選択したストレージデバイスにおける<strong> パーティションテーブル </strong> の種類。 <br><br> パーティションテーブルの種類を変更する唯一の方法は、パーティションテーブルを消去し、最初から再作成を行うことですが、この操作はストレージ上のすべてのデータを破壊します。 <br> このインストーラーは、他の種類へ明示的に変更ししない限り、現在のパーティションテーブルが保持されます。よくわからない場合、最近のシステムではGPTが推奨されます。 @@ -866,7 +866,7 @@ The installer will quit and all changes will be lost. &Keep - 保持(&K) + 保持 (&K) @@ -881,12 +881,12 @@ The installer will quit and all changes will be lost. &Mount Point: - マウントポイント(&M) + マウントポイント (&M) Si&ze: - サイズ(&Z): + サイズ (&Z): @@ -896,7 +896,7 @@ The installer will quit and all changes will be lost. Fi&le System: - ファイルシステム(&L) + ファイルシステム (&L) @@ -919,7 +919,7 @@ The installer will quit and all changes will be lost. En&crypt system - システムを暗号化(&C) + システムを暗号化 (&C) @@ -990,7 +990,7 @@ The installer will quit and all changes will be lost. &Restart now - 今すぐ再起動(&R) + 今すぐ再起動 (&R) @@ -1107,12 +1107,12 @@ The installer will quit and all changes will be lost. &Cancel - 中止(&C) + 中止 (&C) &OK - 了解(&O) + 了解 (&O) @@ -1219,7 +1219,7 @@ The installer will quit and all changes will be lost. &Change... - 変更(&C)... + 変更 (&C)... @@ -1696,7 +1696,7 @@ The installer will quit and all changes will be lost. Storage de&vice: - ストレージデバイス (&V): + ストレージデバイス (&V): @@ -1706,22 +1706,22 @@ The installer will quit and all changes will be lost. New Partition &Table - 新しいパーティションテーブル(&T) + 新しいパーティションテーブル (&T) Cre&ate - 作成(&a) + 作成 (&A) &Edit - 編集(&E) + 編集 (&E) &Delete - 削除(&D) + 削除 (&D) @@ -1859,7 +1859,7 @@ The installer will quit and all changes will be lost. 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. - ブートパーティションは暗号化されたルートパーティションとともにセットアップされましたが、ブートパーティションは暗号化されていません。<br/><br/>重要なシステムファイルが暗号化されていないパーティションに残されているため、このようなセットアップは安全上の懸念があります。<br/>セットアップを続行することはできますが、後でシステムの起動中にファイルシステムが解除されるおそれがあります。<br/>ブートパーティションを暗号化させるには、前の画面に戻って、再度パーティションを作成し、パーティション作成ウィンドウ内で<strong>Encrypt</strong>(暗号化)を選択してください。 + ブートパーティションは暗号化されたルートパーティションとともにセットアップされましたが、ブートパーティションは暗号化されていません。<br/><br/>重要なシステムファイルが暗号化されていないパーティションに残されているため、このようなセットアップは安全上の懸念があります。<br/>セットアップを続行することはできますが、後でシステムの起動中にファイルシステムが解除されるおそれがあります。<br/>ブートパーティションを暗号化させるには、前の画面に戻って、再度パーティションを作成し、パーティション作成ウィンドウ内で<strong>Encrypt</strong> (暗号化) を選択してください。 @@ -1917,7 +1917,7 @@ The installer will quit and all changes will be lost. Not all of the configured files could be preserved. - 設定ファイルは全て保護されるわけではありません。 + 設定ファイルはすべて保護されるわけではありません。 @@ -2654,7 +2654,7 @@ Output: 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. - インストールトラッキングは %1 にとって、どれだけのユーザーが どのハードに %1 をインストールするのか(下記の2つのオプション)、どのようなアプリケーションが好まれているのかについての情報を把握することの補助を行っています。 どのような情報が送信されているのか確認したい場合は、以下の各エリアのヘルプのアイコンをクリックして下さい。 + インストールトラッキングは %1 にとって、どれだけのユーザーが どのハードに %1 をインストールするのか (下記の2つのオプション)、どのようなアプリケーションが好まれているのかについての情報を把握することの補助を行っています。 どのような情報が送信されているのか確認したい場合は、以下の各エリアのヘルプのアイコンをクリックして下さい。 @@ -2757,7 +2757,7 @@ Output: Total Size: - 全てのサイズ: + すべてのサイズ: @@ -2775,7 +2775,7 @@ Output: Total Sectors: - 全てのセクター: + すべてのセクター: @@ -2793,17 +2793,17 @@ Output: &Language: - 言語(&L): + 言語 (&L): &Release notes - リリースノート(&R) + リリースノート (&R) &Known issues - 既知の問題(&K) + 既知の問題 (&K) @@ -2813,7 +2813,7 @@ Output: &About - 説明(&A) + 説明 (&A) diff --git a/lang/calamares_mk.ts b/lang/calamares_mk.ts index a1b95a0da..b6002eb4a 100644 --- a/lang/calamares_mk.ts +++ b/lang/calamares_mk.ts @@ -50,7 +50,7 @@ Blank Page - + Празна Страна @@ -94,7 +94,7 @@ Tools - + Алатки @@ -107,7 +107,7 @@ Install - + Инсталирај @@ -115,7 +115,7 @@ Done - + Готово @@ -263,12 +263,12 @@ The installer will quit and all changes will be lost. The installation is complete. Close the installer. - + Инсталацијата е готова. Исклучете го инсталерот. Error - + Грешка From 491202d75fff8a7ce6d9ae5ee9bedfbcf9f083a2 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Thu, 3 Jan 2019 15:06:54 +0100 Subject: [PATCH 51/74] i18n: [desktop] Automatic merge of Transifex translations --- calamares.desktop | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/calamares.desktop b/calamares.desktop index c29b9b345..79180c475 100644 --- a/calamares.desktop +++ b/calamares.desktop @@ -13,7 +13,10 @@ StartupNotify=true Categories=Qt;System; X-AppStream-Ignore=true -Name[ar]=نظام التثبيت +Name[ar]=تثبيت النظام +Icon[ar]=كالامارس +GenericName[ar]=مثبت النظام +Comment[ar]=كالامارس - مثبت النظام Name[be]=Усталяваць сістэму Icon[be]=calamares GenericName[be]=Усталёўшчык сістэмы @@ -51,6 +54,9 @@ Icon[et]=calamares GenericName[et]=Süsteemipaigaldaja Comment[et]=Calamares — süsteemipaigaldaja Name[eu]=Sistema instalatu +Icon[eu]=calamares +GenericName[eu]=Sistema instalatzailea +Comment[eu]=Calamares - sistema instalatzailea Name[es_PR]=Instalar el sistema Name[fr]=Installer le système Icon[fr]=calamares From e572784eb51ac99ea3f1ecc857626ee8da0fd08a Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Thu, 3 Jan 2019 15:06:55 +0100 Subject: [PATCH 52/74] i18n: [dummypythonqt] Automatic merge of Transifex translations --- .../lang/ar/LC_MESSAGES/dummypythonqt.mo | Bin 503 -> 1074 bytes .../lang/ar/LC_MESSAGES/dummypythonqt.po | 16 ++++++++++------ .../lang/eu/LC_MESSAGES/dummypythonqt.mo | Bin 420 -> 926 bytes .../lang/eu/LC_MESSAGES/dummypythonqt.po | 16 ++++++++++------ 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/modules/dummypythonqt/lang/ar/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/ar/LC_MESSAGES/dummypythonqt.mo index b4977573454d2d0fc3f8f2dc0d430d30022ac6a0..9ccb135d00458ca953d3e9fab7a7970b5e3745e5 100644 GIT binary patch delta 641 zcma)&O)ErE7{?#RYZ6(oKs~dgxOpidWMU-?GAS$04>xten)P12M`CMj9?3>tY? z-qy-D&^a5Q!9pnu`5zi23#aot|L65Q_nw!)d0G0grf83_N%(@1Z;082- zdr%IZKpl7mwVBUy2U@tJt-br~uCpNh`Jb!~ z)rsCxC#25Qh1%B{m1A{e486%nZRjmy+`!174#{J6rL!>duRv;FU8-AkWvWmUr0=%h iwfvO}|GYDQ6_egnr)J2123xGNtPb?L&gzVL8F~jO3*Mjr delta 70 zcmdnQ@txV?o)F7a1|VPrVi_P-0b*t#)&XJ=umIw{KuJp=4N?OGlj9ltH|sMQFaiK9 C^9QW} diff --git a/src/modules/dummypythonqt/lang/ar/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/ar/LC_MESSAGES/dummypythonqt.po index 950eb4583..91d430930 100644 --- a/src/modules/dummypythonqt/lang/ar/LC_MESSAGES/dummypythonqt.po +++ b/src/modules/dummypythonqt/lang/ar/LC_MESSAGES/dummypythonqt.po @@ -3,6 +3,9 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # +# Translators: +# Abubakaragoub Y , 2018 +# #, fuzzy msgid "" msgstr "" @@ -10,6 +13,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-05 11:34-0400\n" "PO-Revision-Date: 2016-12-16 12:18+0000\n" +"Last-Translator: Abubakaragoub Y , 2018\n" "Language-Team: Arabic (https://www.transifex.com/calamares/teams/20061/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,24 +23,24 @@ msgstr "" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" -msgstr "" +msgstr "اضغط علي!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." -msgstr "" +msgstr "QLabel جديد" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" -msgstr "" +msgstr "دميه خطوة PythonQt " #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" -msgstr "" +msgstr "دميه عملية PythonQt " #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" -msgstr "" +msgstr "هذة دميه عملية خطوة PythonQt. و تقول: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." -msgstr "" +msgstr "رسالة حاله دميه عملية خطوة PythonQt" diff --git a/src/modules/dummypythonqt/lang/eu/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/eu/LC_MESSAGES/dummypythonqt.mo index 60bb83584c40a54105844f09ede4cdc6f7ff3318..d508e3fac6202393e92ad0a6f5f8fdef41766f3e 100644 GIT binary patch delta 575 zcmZvX!Ab)$5QbA*Eh2g-q8E`7iYVAcMMZlnS`hJIY4L38#y0MDQ<5yD73m8I(t}q| zK7`%{-$Hx@@#x7vTah9i_S-)*lRwEkr605X_gv~i=d+4OAlqeD%s+{t=2t8!RavK|J31fIe(3R436t`MkI_uh|iYk^)RNZ5Tp}Y*R zYlXQkA8DUU(WzR|X0@gmV?|jS!e_^}J#scbx$#=n$?&cz(#`E)|2}VQp{99cLT;5V zQYrF!V#3d delta 69 zcmbQozJ%H0o)F7a1|VPrVi_P-0b*t#)&XJ=umIvLprj>`2C0F8$?=T+lSP^C0ssK8 B2V?*M diff --git a/src/modules/dummypythonqt/lang/eu/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/eu/LC_MESSAGES/dummypythonqt.po index 9ac8d08f0..a336c22a0 100644 --- a/src/modules/dummypythonqt/lang/eu/LC_MESSAGES/dummypythonqt.po +++ b/src/modules/dummypythonqt/lang/eu/LC_MESSAGES/dummypythonqt.po @@ -3,6 +3,9 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # +# Translators: +# Ander Elortondo, 2019 +# #, fuzzy msgid "" msgstr "" @@ -10,6 +13,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-05 11:34-0400\n" "PO-Revision-Date: 2016-12-16 12:18+0000\n" +"Last-Translator: Ander Elortondo, 2019\n" "Language-Team: Basque (https://www.transifex.com/calamares/teams/20061/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,24 +23,24 @@ msgstr "" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" -msgstr "" +msgstr "Egidazu klik!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." -msgstr "" +msgstr "QLabel berria." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" -msgstr "" +msgstr "Dummy PythonQt pauso-ikuspegia" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" -msgstr "" +msgstr " Dummy PythonQt lana" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" -msgstr "" +msgstr "Hau Dummy PythonQt lana da. Dummy lanak zera dio: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." -msgstr "" +msgstr "Dummy PythonQt lanaren egoera mezua." From 934e58ad54e6997154f84eec93485f3b3b7df801 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Thu, 3 Jan 2019 15:06:56 +0100 Subject: [PATCH 53/74] i18n: [python] Automatic merge of Transifex translations --- lang/python/ar/LC_MESSAGES/python.mo | Bin 503 -> 2015 bytes lang/python/ar/LC_MESSAGES/python.po | 36 ++++++++++--------- lang/python/eu/LC_MESSAGES/python.mo | Bin 420 -> 2779 bytes lang/python/eu/LC_MESSAGES/python.po | 50 ++++++++++++++++----------- lang/python/fr/LC_MESSAGES/python.mo | Bin 2528 -> 2719 bytes lang/python/fr/LC_MESSAGES/python.po | 7 ++-- 6 files changed, 53 insertions(+), 40 deletions(-) diff --git a/lang/python/ar/LC_MESSAGES/python.mo b/lang/python/ar/LC_MESSAGES/python.mo index 05f9dbc339376dc40bfca358295b1e0b8085e931..43e3ffa7ede4b969ea8d128f4d47fd557a828a70 100644 GIT binary patch literal 2015 zcma)6TW=dh6ked*+;XRa2apbegqUXS-6SoEQx`&#R;EcCrEUaIXuKY8w)O5>yJM0l z^r7Hf2v0ol1Gq>DX-kxf(xyLvS6*jd5aN{|z#HP5UEczPW~Ae9=A7?bXFb0@f8;9- z>p93PknbQbLHZxU57s*HW#H$)*MZ*v-vIs$d=vOb^ZdfYNsM9Oi_pK{#E+VK0aX60 zK;^#;RQ|sJUj_aNJOMoZNMauY9>=)?{0ligX`YuK)wEvdzXU4(d%(AVzctTCAJa6# zc@U@ri_P<=Ko##>U>|S~m<1ouJn4S~IE3>YP}#p|;vFE$(4K*)brkY61ZBrd z%}*_a)1HEW-d;~)_bdc0Xiq?nK#oDwNk>RQZ0+)CY$lCD9)k?9x=>KQm6$U3ZCUOJW{1T=7d8ZJ#C-yhh8{ zv~%3!0Yl*~v*sO->rOeN6}(WeYL#lty2@-GX0%RQaX+;DT6m4hJ`YLFgfBXw(7M|C zAJV?I4(46(Tk|D5;9T&4oTMs_0%ro>;$i4`cDqLE>*=%nx+l_Q%2H3C@XM}%QsLr-)GV+0fzYQz z+bQes)$LF(`Z-F?TrBG20gpcceF6i{(STtN>!zU_C&@H(gG0J8WEddov;1R61@G|Q z){SA^7$MUD?}UMsnqr~Qivjb(DieN?qp?!G#ICY{*?zr5AJXZTVhNhkySB@mYR2;2 zGyQR91n}%SZc{IE=E6N-CC8$^c_C_HE}LCgSjY$!-l_0K<(IWsmANe7VOGE+%nlgF zDKpE0Y&tbvn4av6#LO6}ao-c%LxoEonyJ;(9hv7^>ThHsp, YEAR. # +# Translators: +# Abubakaragoub Y , 2018 +# #, fuzzy msgid "" msgstr "" @@ -10,6 +13,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-05 11:34-0400\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" +"Last-Translator: Abubakaragoub Y , 2018\n" "Language-Team: Arabic (https://www.transifex.com/calamares/teams/20061/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,43 +23,43 @@ msgstr "" #: src/modules/displaymanager/main.py:380 msgid "Cannot write KDM configuration file" -msgstr "" +msgstr "فشلت كتابة ملف ضبط KDM." #: src/modules/displaymanager/main.py:381 msgid "KDM config file {!s} does not exist" -msgstr "" +msgstr "ملف ضبط KDM {!s} غير موجود" #: src/modules/displaymanager/main.py:442 msgid "Cannot write LXDM configuration file" -msgstr "" +msgstr "فشلت كتابة ملف ضبط LXDM." #: src/modules/displaymanager/main.py:443 msgid "LXDM config file {!s} does not exist" -msgstr "" +msgstr "ملف ضبط LXDM {!s} غير موجود" #: src/modules/displaymanager/main.py:517 msgid "Cannot write LightDM configuration file" -msgstr "" +msgstr "فشلت كتابة ملف ضبط LightDM." #: src/modules/displaymanager/main.py:518 msgid "LightDM config file {!s} does not exist" -msgstr "" +msgstr "ملف ضبط LightDM {!s} غير موجود" #: src/modules/displaymanager/main.py:592 msgid "Cannot configure LightDM" -msgstr "" +msgstr "فشل ضبط LightDM" #: src/modules/displaymanager/main.py:593 msgid "No LightDM greeter installed." -msgstr "" +msgstr "لم يتم تصيب LightDM" #: src/modules/displaymanager/main.py:624 msgid "Cannot write SLIM configuration file" -msgstr "" +msgstr "فشلت كتابة ملف ضبط SLIM." #: src/modules/displaymanager/main.py:625 msgid "SLIM config file {!s} does not exist" -msgstr "" +msgstr "ملف ضبط SLIM {!s} غير موجود" #: src/modules/displaymanager/main.py:740 #: src/modules/displaymanager/main.py:772 @@ -78,28 +82,28 @@ msgstr "" #: src/modules/umount/main.py:40 msgid "Unmount file systems." -msgstr "" +msgstr "الغاء تحميل ملف النظام" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." -msgstr "" +msgstr "عملية بايثون دميه" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" -msgstr "" +msgstr "عملية دميه خطوه بايثون {}" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." -msgstr "" +msgstr "توليد معرف الجهاز" #: src/modules/packages/main.py:62 #, python-format msgid "Processing packages (%(count)d / %(total)d)" -msgstr "" +msgstr "جاري تحميل الحزم (%(count)d/%(total)d)" #: src/modules/packages/main.py:64 src/modules/packages/main.py:74 msgid "Install packages." -msgstr "" +msgstr "تثبيت الحزم" #: src/modules/packages/main.py:67 #, python-format diff --git a/lang/python/eu/LC_MESSAGES/python.mo b/lang/python/eu/LC_MESSAGES/python.mo index 5c9c13e0c17d39d499e7b5a78b8ceeded773e0c7..5abe8e5b2a8cee2b7d97b89df7a89a1c3e7eec6a 100644 GIT binary patch literal 2779 zcma)-&u<$=6vqcB(7NSUC=`ibuPqf0?b_=kh15|b+Qf;XCT*0Y6+%d8>>bleaKAt-9 zBSSlf{vP^Y=pUj#dJaEmC!c5R9q<%*5xf9?1g?M|gW+KO19%1F-@!M)f5EfhlL61X z(4RjK&S8EQbpG0)^Y;jJ{(c4D2mb*Vz$f5kaP|aaKKM20?7suQ0)GQP2d7?S>@9E` z{2qIk;JXU%@r)%5T@I75Gjn5b>I`rTnTNO$q98t!+(UwYhGAOY% zWh{>(>hMO0mCSHPsupP_@&{w{mx?Nlr-S?%UfLHfQ;Z&*HxDV$!jMy4>`7zUh;UCa z8WZklyIVRxL24xeDkM-O3q>F*JPpPbG-O018de0<)Ct+P$Srb-V;!WCD6!2%H-s@R z{#+C)UMeiQ8H%7FNkby;*e)T0 zR0X1mQw$I{)wON6B3fdm}V$YUwqorDa(mXN3F5cN$@#gpK+)_=Ecr{$?00&W}`MR{jT~EkvXK6BT0INy^Rhidn5 z0xii&2Hf`K&@{Wf$F&_?;$xa;m*N?=n_O8gBTiu&AXR$!FUGdcNgHibYVrDkiWs4W z9w>=vf9EJDjXCO6RR#9*O(8$Fe*kRne*jj}M1kUEL(36tqIQcXvTDUHe;;_6J0csTvkl$jiMo!GvN$brqK9m2vR-$f_&*a+13|Wl{@CCQ8Oba#yZrou;lr ZVNWHtlHWx#DE`2C0F8$r-HuljYd%0ss|L B2gv{c diff --git a/lang/python/eu/LC_MESSAGES/python.po b/lang/python/eu/LC_MESSAGES/python.po index 57a4e1b84..dc5751b86 100644 --- a/lang/python/eu/LC_MESSAGES/python.po +++ b/lang/python/eu/LC_MESSAGES/python.po @@ -3,6 +3,9 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # +# Translators: +# Ander Elortondo, 2019 +# #, fuzzy msgid "" msgstr "" @@ -10,6 +13,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-05 11:34-0400\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" +"Last-Translator: Ander Elortondo, 2019\n" "Language-Team: Basque (https://www.transifex.com/calamares/teams/20061/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,98 +23,102 @@ msgstr "" #: src/modules/displaymanager/main.py:380 msgid "Cannot write KDM configuration file" -msgstr "" +msgstr "Ezin da KDM konfigurazio fitxategia idatzi" #: src/modules/displaymanager/main.py:381 msgid "KDM config file {!s} does not exist" -msgstr "" +msgstr "KDM konfigurazio fitxategia {!s} ez da existitzen" #: src/modules/displaymanager/main.py:442 msgid "Cannot write LXDM configuration file" -msgstr "" +msgstr "Ezin da LXDM konfigurazio fitxategia idatzi" #: src/modules/displaymanager/main.py:443 msgid "LXDM config file {!s} does not exist" -msgstr "" +msgstr "LXDM konfigurazio fitxategia {!s} ez da existitzen" #: src/modules/displaymanager/main.py:517 msgid "Cannot write LightDM configuration file" -msgstr "" +msgstr "Ezin da LightDM konfigurazio fitxategia idatzi" #: src/modules/displaymanager/main.py:518 msgid "LightDM config file {!s} does not exist" -msgstr "" +msgstr "LightDM konfigurazio fitxategia {!s} ez da existitzen" #: src/modules/displaymanager/main.py:592 msgid "Cannot configure LightDM" -msgstr "" +msgstr "Ezin da LightDM konfiguratu" #: src/modules/displaymanager/main.py:593 msgid "No LightDM greeter installed." -msgstr "" +msgstr "Ez dago LightDM harrera instalatua." #: src/modules/displaymanager/main.py:624 msgid "Cannot write SLIM configuration file" -msgstr "" +msgstr "Ezin da SLIM konfigurazio fitxategia idatzi" #: src/modules/displaymanager/main.py:625 msgid "SLIM config file {!s} does not exist" -msgstr "" +msgstr "SLIM konfigurazio fitxategia {!s} ez da existitzen" #: src/modules/displaymanager/main.py:740 #: src/modules/displaymanager/main.py:772 msgid "No display managers selected for the displaymanager module." msgstr "" +"Ez da pantaila kudeatzailerik aukeratu pantaila-kudeatzaile modulurako." #: src/modules/displaymanager/main.py:741 msgid "" "The displaymanagers list is empty or undefined in bothglobalstorage and " "displaymanager.conf." msgstr "" +"Pantaila-kudeatzaile-zerrenda hutsik dago edo definitzeke bothglobalstorage " +"eta displaymanager.conf" #: src/modules/displaymanager/main.py:773 msgid "The list is empty after checking for installed display managers." msgstr "" +"Zerrenda hutsik dago instalatutako pantaila-kudeatzaileak egiaztatu ondoren." #: src/modules/displaymanager/main.py:821 msgid "Display manager configuration was incomplete" -msgstr "" +msgstr "Pantaila kudeatzaile konfigurazioa osotu gabe" #: src/modules/umount/main.py:40 msgid "Unmount file systems." -msgstr "" +msgstr "Fitxategi sistemak desmuntatu." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." -msgstr "" +msgstr "Dummy python lana." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" -msgstr "" +msgstr "Dummy python urratsa {}" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." -msgstr "" +msgstr "Sortu makina-id." #: src/modules/packages/main.py:62 #, python-format msgid "Processing packages (%(count)d / %(total)d)" -msgstr "" +msgstr "Paketeak prozesatzen (%(count)d/ %(total)d) " #: src/modules/packages/main.py:64 src/modules/packages/main.py:74 msgid "Install packages." -msgstr "" +msgstr "Instalatu paketeak" #: src/modules/packages/main.py:67 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Pakete bat instalatzen." +msgstr[1] "%(num)dpakete instalatzen." #: src/modules/packages/main.py:70 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Pakete bat kentzen." +msgstr[1] "%(num)dpakete kentzen." diff --git a/lang/python/fr/LC_MESSAGES/python.mo b/lang/python/fr/LC_MESSAGES/python.mo index b612733eab2cdd4655d4fc9c898f2381799155af..21eee76c0163f4ea9c0cae8a2ae43aba64ce30b1 100644 GIT binary patch delta 633 zcmajbPbh<79KiA4yUm~ZZw%$no<%AD(oiyGv7}5nP!1f1P0QLVTT;?4E^bQ7Mbr+? z+R0%zXOg>!i;D{vPQK6k&cVsAe(&e`Jw5O9=l9fb?#(`WTqiA<~UgsOwGa!y~N60yg4Z(bwYq7Y;LD>9qFCN{E5pU>)_rhZw|5?8O%x z#9EigGKMgOXQ(gzh&e9xiHiEP)IQ)EN2uR%6uZjodIcw_kI^exkp~9)g>UFbN4ZFo z{sG4@i27wa*pE5X>+Ug%A2@)EZu_7EOi~wc9(yY6&h4Q=T}SeZG?21DR+73^zoB2{ zA?cLxD5)aZ%W5kK4Url>AlTCi?k+skirV~@VHz{D;W@Qtrs9bW6;C8%YR{kESLn!Ntv`;1XIIX$}5ZIytDbZt5o8 z9OCFuLDxd3qJy~m7q}F^*Bm~0`P{qX?sD%T^_{GKIo6F3Nit17lN02w!H1~hIKE;A zKXD4%IE@)Iu6J;j`Upqx4oC4x`=;kV&}04wxu+^_LS&7J4V=MqT);;>z!q+yXNjaR z#2S}hqpRk-;{*3`iTVmxu&(Q0+@zlGiT4Mn9&~||+%NYG#?%H}#a3rQ#IZ&4)E>^^ zEvkdxv50Nl!$NP|nHS{0WRPU3(*=-z(oq8)s?)GUVt{0?43R2$@PG8_5&tAS wB#x+Q1V(h3u+8*#ST3C%2j#q9D!A(>z8~feE2qV5F1xrK)w&vH)U+GMALZ9I_W%F@ diff --git a/lang/python/fr/LC_MESSAGES/python.po b/lang/python/fr/LC_MESSAGES/python.po index f4d4ef26c..f51f485b0 100644 --- a/lang/python/fr/LC_MESSAGES/python.po +++ b/lang/python/fr/LC_MESSAGES/python.po @@ -9,6 +9,7 @@ # Aestan , 2018 # Jeremy Gourmel , 2018 # Aurnytoraink , 2018 +# Florian B , 2018 # #, fuzzy msgid "" @@ -17,7 +18,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-05 11:34-0400\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Aurnytoraink , 2018\n" +"Last-Translator: Florian B , 2018\n" "Language-Team: French (https://www.transifex.com/calamares/teams/20061/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,7 +32,7 @@ msgstr "Impossible d'écrire le fichier de configuration KDM" #: src/modules/displaymanager/main.py:381 msgid "KDM config file {!s} does not exist" -msgstr "" +msgstr "Le fichier de configuration KDM n'existe pas" #: src/modules/displaymanager/main.py:442 msgid "Cannot write LXDM configuration file" @@ -39,7 +40,7 @@ msgstr "Impossible d'écrire le fichier de configuration LXDM" #: src/modules/displaymanager/main.py:443 msgid "LXDM config file {!s} does not exist" -msgstr "" +msgstr "Le fichier de configuration LXDM n'existe pas" #: src/modules/displaymanager/main.py:517 msgid "Cannot write LightDM configuration file" From b1ea96e4639b916938718875ba9e52ece620fb71 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 2 Nov 2018 11:58:49 -0400 Subject: [PATCH 54/74] [partition] Don't autoremove the tempdir - Dangerout since we're mounting things inside that tempdir, and then doing a "weak" unmount --- src/modules/partition/core/PartUtils.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp index 12aa489db..f080d97a4 100644 --- a/src/modules/partition/core/PartUtils.cpp +++ b/src/modules/partition/core/PartUtils.cpp @@ -163,6 +163,7 @@ lookForFstabEntries( const QString& partitionPath ) { FstabEntryList fstabEntries; QTemporaryDir mountsDir; + mountsDir.setAutoRemove( false ); int exit = QProcess::execute( "mount", { partitionPath, mountsDir.path() } ); if ( !exit ) // if all is well From dc06de58d86e50aaeb3c79ddd8e0b01680fedcbe Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 3 Jan 2019 15:29:04 +0100 Subject: [PATCH 55/74] Changes: document source of fix --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index d76ca0ea6..2cedfe508 100644 --- a/CHANGES +++ b/CHANGES @@ -6,11 +6,15 @@ website will have to do for older versions. = 3.2.3 (unreleased) = This release contains contributions from (alphabetically by first name): + - aliveafter1000 == Core == == Modules == + * Fixed bug where, during detection of existing systems, the existing + system partitions may be mounted and then destroyed. + = 3.2.2 (2018-09-04) = This release contains contributions from (alphabetically by first name): From 59eaf18b9f878bf639bbd04d68868a961f34b329 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 4 Dec 2018 10:40:23 +0100 Subject: [PATCH 56/74] CMake: bump required Qt version - kpmcore will require Qt 5.10 shortly - KDE CI tests only Qt 5.10 and later --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 47054bd8c..e3cffc383 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,7 +113,7 @@ set( _tx_bad eo kk kn uz ur mk lo gu fr_CH fa be ) ### Required versions # # See DEPENDENCIES section below. -set( QT_VERSION 5.7.0 ) +set( QT_VERSION 5.10.0 ) set( YAMLCPP_VERSION 0.5.1 ) set( ECM_VERSION 5.18 ) set( PYTHONLIBS_VERSION 3.3 ) From e52f0318fe8e71b83c216bdfa78d7231d4d68309 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 7 Jan 2019 15:16:37 +0100 Subject: [PATCH 57/74] [locale] Call timedatectl only when needed - When testing and running not-as-root, only call the timedatectl when the settings actually change; this reduces the number of times kauth pops up. --- src/modules/locale/LocalePage.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index 9aad283c6..f9e2aa515 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -484,19 +484,22 @@ LocalePage::prettyLCLocale( const QString& lcLocale ) const void LocalePage::updateGlobalStorage() { + auto *gs = Calamares::JobQueue::instance()->globalStorage(); + LocaleGlobal::Location location = m_tzWidget->getCurrentLocation(); - Calamares::JobQueue::instance()->globalStorage() - ->insert( "locationRegion", location.region ); - Calamares::JobQueue::instance()->globalStorage() - ->insert( "locationZone", location.zone ); + bool locationChanged = ( location.region != gs->value( "locationRegion" ) ) || + ( location.zone != gs->value( "locationZone" ) ); + + gs->insert( "locationRegion", location.region ); + gs->insert( "locationZone", location.zone ); const QString bcp47 = m_selectedLocaleConfiguration.toBcp47(); - Calamares::JobQueue::instance()->globalStorage()->insert( "locale", bcp47 ); + gs->insert( "locale", bcp47 ); // If we're in chroot mode (normal install mode), then we immediately set the // timezone on the live system. When debugging timezones, don't bother. #ifndef DEBUG_TIMEZONES - if ( Calamares::Settings::instance()->doChroot() ) + if ( locationChanged && Calamares::Settings::instance()->doChroot() ) { QProcess::execute( "timedatectl", // depends on systemd { "set-timezone", From 3ff480eaa9566bba95e6beaa4e9a43d843694574 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 7 Jan 2019 17:29:54 +0100 Subject: [PATCH 58/74] [locale] Refactor to make updating global locale setting easier. --- src/modules/locale/LocalePage.cpp | 13 +++++++++++-- src/modules/locale/LocalePage.h | 6 ++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index f9e2aa515..d5bd8147a 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -481,6 +481,16 @@ LocalePage::prettyLCLocale( const QString& lcLocale ) const .arg( QLocale::countryToString( locale.country() ) ); } + +void +LocalePage::updateGlobalLocale() +{ + auto *gs = Calamares::JobQueue::instance()->globalStorage(); + const QString bcp47 = m_selectedLocaleConfiguration.toBcp47(); + gs->insert( "locale", bcp47 ); +} + + void LocalePage::updateGlobalStorage() { @@ -493,8 +503,7 @@ LocalePage::updateGlobalStorage() gs->insert( "locationRegion", location.region ); gs->insert( "locationZone", location.zone ); - const QString bcp47 = m_selectedLocaleConfiguration.toBcp47(); - gs->insert( "locale", bcp47 ); + updateGlobalLocale(); // If we're in chroot mode (normal install mode), then we immediately set the // timezone on the live system. When debugging timezones, don't bother. diff --git a/src/modules/locale/LocalePage.h b/src/modules/locale/LocalePage.h index c4ca20503..4b93c690e 100644 --- a/src/modules/locale/LocalePage.h +++ b/src/modules/locale/LocalePage.h @@ -57,6 +57,12 @@ private: // the settings for language and numbers. std::pair< QString, QString > prettyLocaleStatus( const LocaleConfiguration& ) const; + /** @brief Update the GS *locale* key with the selected system language. + * + * This uses whatever is set in m_selectedLocaleConfiguration as the language, + * and writes it to GS *locale* key (as a string, in BCP47 format). + */ + void updateGlobalLocale(); void updateGlobalStorage(); void updateLocaleLabels(); From bc398756f51822b75d3fa46f9a9e795600d72565 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 7 Jan 2019 18:34:25 +0100 Subject: [PATCH 59/74] [locale] Debugging support for Location - code formatting - provide an operator << for debugging TZ widget --- src/modules/locale/timezonewidget/localeglobal.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/modules/locale/timezonewidget/localeglobal.h b/src/modules/locale/timezonewidget/localeglobal.h index 5452b0b09..88a8ae125 100644 --- a/src/modules/locale/timezonewidget/localeglobal.h +++ b/src/modules/locale/timezonewidget/localeglobal.h @@ -38,11 +38,13 @@ class LocaleGlobal { public: - struct Locale { + struct Locale + { QString description, locale; }; - struct Location { + struct Location + { QString region, zone, country; double latitude, longitude; static QString pretty( const QString& s ); @@ -59,7 +61,12 @@ private: static void initLocales(); static void initLocations(); - static double getRightGeoLocation(QString str); + static double getRightGeoLocation( QString str ); }; +inline QDebug& operator <<( QDebug& s, const LocaleGlobal::Location& l ) +{ + return s << l.region << '/' << l.zone << '(' << l.country << ") @N" << l.latitude << 'E' << l.longitude; +} + #endif // LOCALEGLOBAL_H From 9d871fb9dbf7e3af3589d28a945c900994203769 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 7 Jan 2019 18:49:08 +0100 Subject: [PATCH 60/74] [locale] Update global locale setting when it changes - use debugging to be a little more chatty - when changing the system language on the locale page, the global locale setting should change, too. --- src/modules/locale/LocalePage.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index d5bd8147a..cfd7eb2fa 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -137,6 +137,7 @@ LocalePage::LocalePage( QWidget* parent ) connect( m_tzWidget, &TimeZoneWidget::locationChanged, [this]( LocaleGlobal::Location location ) { + cDebug() << "Updating location from TZ widget to" << location; m_blockTzWidgetSet = true; // Set region index @@ -173,6 +174,7 @@ LocalePage::LocalePage( QWidget* parent ) { m_selectedLocaleConfiguration.lang = dlg->selectedLCLocale(); m_selectedLocaleConfiguration.explicit_lang = true; + this->updateGlobalLocale(); this->updateLocaleLabels(); } @@ -441,6 +443,7 @@ LocalePage::onActivate() { auto newLocale = guessLocaleConfiguration(); m_selectedLocaleConfiguration.lang = newLocale.lang; + updateGlobalLocale(); updateLocaleLabels(); } } @@ -487,6 +490,7 @@ LocalePage::updateGlobalLocale() { auto *gs = Calamares::JobQueue::instance()->globalStorage(); const QString bcp47 = m_selectedLocaleConfiguration.toBcp47(); + cDebug() << "Updating global locale setting to" << bcp47; gs->insert( "locale", bcp47 ); } From 093240c131148dbb720c3c8a5df2a706ad54179f Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 8 Jan 2019 10:51:53 +0100 Subject: [PATCH 61/74] [libcalamares] Be less chatty in Python scripts - When finding the gettext path, the debug output was very chatty and didn't include an indication that it was looking for translations. --- src/libcalamares/PythonJobApi.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/libcalamares/PythonJobApi.cpp b/src/libcalamares/PythonJobApi.cpp index f540c2683..19670b87f 100644 --- a/src/libcalamares/PythonJobApi.cpp +++ b/src/libcalamares/PythonJobApi.cpp @@ -275,16 +275,21 @@ gettext_path() } _add_localedirs( candidatePaths, QDir().canonicalPath() ); // . - cDebug() << "Standard paths" << candidatePaths; + cDebug() << "Determining gettext path from" << candidatePaths; - for ( auto lang : _gettext_languages() ) + QStringList candidateLanguages = _gettext_languages(); + + for ( const auto& lang : candidateLanguages ) for ( auto localedir : candidatePaths ) { QDir ldir( localedir ); - cDebug() << "Checking" << lang << "in" < Date: Tue, 8 Jan 2019 11:10:16 +0100 Subject: [PATCH 62/74] [locale] Replace weird static-constructor - Replace createDefault() with a constructor that takes a locale name; use it with en_US.UTF-8 in those places where createDefault was previously used. --- src/modules/locale/LocaleConfiguration.cpp | 12 +++++------- src/modules/locale/LocaleConfiguration.h | 4 +++- src/modules/locale/LocalePage.cpp | 6 ++++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/modules/locale/LocaleConfiguration.cpp b/src/modules/locale/LocaleConfiguration.cpp index 7c8ad3305..f980b850c 100644 --- a/src/modules/locale/LocaleConfiguration.cpp +++ b/src/modules/locale/LocaleConfiguration.cpp @@ -27,14 +27,12 @@ LocaleConfiguration::LocaleConfiguration() } -LocaleConfiguration -LocaleConfiguration::createDefault() +LocaleConfiguration::LocaleConfiguration( const QString& localeName ) + : LocaleConfiguration() { - LocaleConfiguration lc = LocaleConfiguration(); - lc.lang = lc.lc_numeric = lc.lc_time = lc.lc_monetary = lc.lc_paper = lc.lc_name - = lc.lc_address = lc.lc_telephone = lc.lc_measurement - = lc.lc_identification = "en_US.UTF-8"; - return lc; + lang = lc_numeric = lc_time = lc_monetary = lc_paper = lc_name + = lc_address = lc_telephone = lc_measurement + = lc_identification = localeName; } diff --git a/src/modules/locale/LocaleConfiguration.h b/src/modules/locale/LocaleConfiguration.h index c077ef6f7..a4753e221 100644 --- a/src/modules/locale/LocaleConfiguration.h +++ b/src/modules/locale/LocaleConfiguration.h @@ -26,9 +26,11 @@ class LocaleConfiguration { public: + /// @brief Create an empty locale, with nothing set explicit LocaleConfiguration(); + /// @brief Create a locale with everything set to the given @p localeName + explicit LocaleConfiguration( const QString& localeName /* "en_US.UTF-8" */ ); - static LocaleConfiguration createDefault(); static LocaleConfiguration fromLanguageAndLocation( const QString& language, const QStringList& availableLocales, const QString& countryCode ); diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index cfd7eb2fa..45397b1ab 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -452,18 +452,20 @@ LocalePage::onActivate() LocaleConfiguration LocalePage::guessLocaleConfiguration() const { + static QString defaultLocale = QStringLiteral( "en_US.UTF-8" ); + QLocale myLocale; // User-selected language // If we cannot say anything about available locales if ( m_localeGenLines.isEmpty() ) { cWarning() << "guessLocaleConfiguration can't guess from an empty list."; - return LocaleConfiguration::createDefault(); + return LocaleConfiguration( defaultLocale ); } QString myLanguageLocale = myLocale.name(); if ( myLanguageLocale.isEmpty() ) - return LocaleConfiguration::createDefault(); + return LocaleConfiguration( defaultLocale ); return LocaleConfiguration::fromLanguageAndLocation( myLanguageLocale, m_localeGenLines, From b1921cced9c392d2c8afc4565005448489a5d16b Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 8 Jan 2019 11:30:49 +0100 Subject: [PATCH 63/74] [locale] Add tests for some of the data classes --- src/modules/locale/CMakeLists.txt | 11 +++++++ src/modules/locale/Tests.cpp | 53 +++++++++++++++++++++++++++++++ src/modules/locale/Tests.h | 39 +++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 src/modules/locale/Tests.cpp create mode 100644 src/modules/locale/Tests.h diff --git a/src/modules/locale/CMakeLists.txt b/src/modules/locale/CMakeLists.txt index 24259d797..e6da9db73 100644 --- a/src/modules/locale/CMakeLists.txt +++ b/src/modules/locale/CMakeLists.txt @@ -59,6 +59,17 @@ if( ECM_FOUND AND BUILD_TESTING ) ${YAMLCPP_LIBRARY} ) set_target_properties( geoiptest PROPERTIES AUTOMOC TRUE ) + + ecm_add_test( + Tests.cpp + LocaleConfiguration.cpp + TEST_NAME + localetest + LINK_LIBRARIES + calamares + Qt5::Test + ) + set_target_properties( localetest PROPERTIES AUTOMOC TRUE ) endif() if( BUILD_TESTING ) diff --git a/src/modules/locale/Tests.cpp b/src/modules/locale/Tests.cpp new file mode 100644 index 000000000..32a10e250 --- /dev/null +++ b/src/modules/locale/Tests.cpp @@ -0,0 +1,53 @@ +/* === 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 "LocaleConfiguration.h" + +#include + +QTEST_GUILESS_MAIN( LocaleTests ) + + +LocaleTests::LocaleTests() +{ +} + +LocaleTests::~LocaleTests() +{ +} + +void LocaleTests::initTestCase() +{ +} + +void LocaleTests::testEmptyLocaleConfiguration() +{ + LocaleConfiguration lc; + + QVERIFY( lc.isEmpty() ); + QCOMPARE( lc.toBcp47(), QString() ); +} + +void LocaleTests::testDefaultLocaleConfiguration() +{ + LocaleConfiguration lc( "en_US.UTF-8" ); + QVERIFY( !lc.isEmpty() ); + QCOMPARE( lc.toBcp47(), "en_US" ); +} diff --git a/src/modules/locale/Tests.h b/src/modules/locale/Tests.h new file mode 100644 index 000000000..acb3ab309 --- /dev/null +++ b/src/modules/locale/Tests.h @@ -0,0 +1,39 @@ +/* === 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 TESTS_H +#define TESTS_H + +#include + +class LocaleTests : public QObject +{ + Q_OBJECT +public: + LocaleTests(); + ~LocaleTests() override; + +private Q_SLOTS: + void initTestCase(); + // Check the sample config file is processed correctly + void testEmptyLocaleConfiguration(); + void testDefaultLocaleConfiguration(); +}; + +#endif From 0a526febae9cfe761cb427c285165fc1a07c8dff Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 8 Jan 2019 11:39:15 +0100 Subject: [PATCH 64/74] [locale] Refactor setting the BCP47 name and update test --- src/modules/locale/LocaleConfiguration.cpp | 17 ++++++++++++----- src/modules/locale/LocaleConfiguration.h | 8 ++++++++ src/modules/locale/Tests.cpp | 2 +- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/modules/locale/LocaleConfiguration.cpp b/src/modules/locale/LocaleConfiguration.cpp index f980b850c..ca0a707ad 100644 --- a/src/modules/locale/LocaleConfiguration.cpp +++ b/src/modules/locale/LocaleConfiguration.cpp @@ -30,9 +30,19 @@ LocaleConfiguration::LocaleConfiguration() LocaleConfiguration::LocaleConfiguration( const QString& localeName ) : LocaleConfiguration() { - lang = lc_numeric = lc_time = lc_monetary = lc_paper = lc_name + lc_numeric = lc_time = lc_monetary = lc_paper = lc_name = lc_address = lc_telephone = lc_measurement = lc_identification = localeName; + + (void) setLanguage( localeName ); +} + +QString +LocaleConfiguration::setLanguage(const QString& localeName ) +{ + QString language = localeName.split( '_' ).first(); + myLanguageLocaleBcp47 = QLocale( language ).bcp47Name().toLower(); + return language; } @@ -42,10 +52,7 @@ LocaleConfiguration::fromLanguageAndLocation( const QString& languageLocale, const QString& countryCode ) { LocaleConfiguration lc; - - // Note that the documentation how this works is in packages.conf - QString language = languageLocale.split( '_' ).first(); - lc.myLanguageLocaleBcp47 = QLocale(language).bcp47Name().toLower(); + QString language = lc.setLanguage( languageLocale ); QStringList linesForLanguage; for ( const QString &line : availableLocales ) diff --git a/src/modules/locale/LocaleConfiguration.h b/src/modules/locale/LocaleConfiguration.h index a4753e221..95dadd5c3 100644 --- a/src/modules/locale/LocaleConfiguration.h +++ b/src/modules/locale/LocaleConfiguration.h @@ -51,6 +51,14 @@ public: bool explicit_lang, explicit_lc; private: + /** @brief sets lang and the BCP47 representation + * + * Note that the documentation how this works is in packages.conf + * + * @return The language part of the locale (e.g. before _) + */ + QString setLanguage( const QString& localeName ); + QString myLanguageLocaleBcp47; }; diff --git a/src/modules/locale/Tests.cpp b/src/modules/locale/Tests.cpp index 32a10e250..6cad2ef74 100644 --- a/src/modules/locale/Tests.cpp +++ b/src/modules/locale/Tests.cpp @@ -49,5 +49,5 @@ void LocaleTests::testDefaultLocaleConfiguration() { LocaleConfiguration lc( "en_US.UTF-8" ); QVERIFY( !lc.isEmpty() ); - QCOMPARE( lc.toBcp47(), "en_US" ); + QCOMPARE( lc.toBcp47(), "en" ); } From dbe50fe3db0ca1ba2993500ee7110fd7a8faf8bc Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 8 Jan 2019 13:23:16 +0100 Subject: [PATCH 65/74] [locale] Improve LocaleConfiguration constructors - Allow split-setting of the language and formats - Test new constructors - Since fromLanguageAndLocation can handle empty localeGen lists just fine, skip all the weird checks that return invalid guessed locale configurations. --- src/modules/locale/LocaleConfiguration.cpp | 15 +++++--------- src/modules/locale/LocaleConfiguration.h | 5 ++++- src/modules/locale/LocalePage.cpp | 17 +--------------- src/modules/locale/Tests.cpp | 23 ++++++++++++++++++++++ src/modules/locale/Tests.h | 1 + 5 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/modules/locale/LocaleConfiguration.cpp b/src/modules/locale/LocaleConfiguration.cpp index ca0a707ad..2e0689090 100644 --- a/src/modules/locale/LocaleConfiguration.cpp +++ b/src/modules/locale/LocaleConfiguration.cpp @@ -27,16 +27,17 @@ LocaleConfiguration::LocaleConfiguration() } -LocaleConfiguration::LocaleConfiguration( const QString& localeName ) +LocaleConfiguration::LocaleConfiguration( const QString& localeName, const QString& formatsName ) : LocaleConfiguration() { lc_numeric = lc_time = lc_monetary = lc_paper = lc_name = lc_address = lc_telephone = lc_measurement - = lc_identification = localeName; + = lc_identification = formatsName; (void) setLanguage( localeName ); } + QString LocaleConfiguration::setLanguage(const QString& localeName ) { @@ -51,8 +52,7 @@ LocaleConfiguration::fromLanguageAndLocation( const QString& languageLocale, const QStringList& availableLocales, const QString& countryCode ) { - LocaleConfiguration lc; - QString language = lc.setLanguage( languageLocale ); + QString language = languageLocale.split( '_' ).first(); QStringList linesForLanguage; for ( const QString &line : availableLocales ) @@ -269,12 +269,7 @@ LocaleConfiguration::fromLanguageAndLocation( const QString& languageLocale, if ( lc_formats.isEmpty() ) lc_formats = lang; - lc.lang = lang; - lc.lc_address = lc.lc_identification = lc.lc_measurement = lc.lc_monetary - = lc.lc_name = lc.lc_numeric = lc.lc_paper = lc.lc_telephone - = lc.lc_time = lc_formats; - - return lc; + return LocaleConfiguration( lang, lc_formats ); } diff --git a/src/modules/locale/LocaleConfiguration.h b/src/modules/locale/LocaleConfiguration.h index 95dadd5c3..0bd310d9d 100644 --- a/src/modules/locale/LocaleConfiguration.h +++ b/src/modules/locale/LocaleConfiguration.h @@ -29,7 +29,10 @@ public: /// @brief Create an empty locale, with nothing set explicit LocaleConfiguration(); /// @brief Create a locale with everything set to the given @p localeName - explicit LocaleConfiguration( const QString& localeName /* "en_US.UTF-8" */ ); + explicit LocaleConfiguration( const QString& localeName /* "en_US.UTF-8" */ ) + : LocaleConfiguration( localeName, localeName ) { }; + /// @brief Create a locale with language and formats separate + explicit LocaleConfiguration( const QString& localeName, const QString& formatsName ); static LocaleConfiguration fromLanguageAndLocation( const QString& language, const QStringList& availableLocales, diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index 45397b1ab..c456ef940 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -452,22 +452,7 @@ LocalePage::onActivate() LocaleConfiguration LocalePage::guessLocaleConfiguration() const { - static QString defaultLocale = QStringLiteral( "en_US.UTF-8" ); - - QLocale myLocale; // User-selected language - - // If we cannot say anything about available locales - if ( m_localeGenLines.isEmpty() ) - { - cWarning() << "guessLocaleConfiguration can't guess from an empty list."; - return LocaleConfiguration( defaultLocale ); - } - - QString myLanguageLocale = myLocale.name(); - if ( myLanguageLocale.isEmpty() ) - return LocaleConfiguration( defaultLocale ); - - return LocaleConfiguration::fromLanguageAndLocation( myLanguageLocale, + return LocaleConfiguration::fromLanguageAndLocation( QLocale().name(), m_localeGenLines, m_tzWidget->getCurrentLocation().country ); } diff --git a/src/modules/locale/Tests.cpp b/src/modules/locale/Tests.cpp index 6cad2ef74..91fea42b8 100644 --- a/src/modules/locale/Tests.cpp +++ b/src/modules/locale/Tests.cpp @@ -50,4 +50,27 @@ void LocaleTests::testDefaultLocaleConfiguration() LocaleConfiguration lc( "en_US.UTF-8" ); QVERIFY( !lc.isEmpty() ); QCOMPARE( lc.toBcp47(), "en" ); + + LocaleConfiguration lc2( "de_DE.UTF-8" ); + QVERIFY( !lc2.isEmpty() ); + QCOMPARE( lc2.toBcp47(), "de" ); +} + +void LocaleTests::testSplitLocaleConfiguration() +{ + LocaleConfiguration lc( "en_US.UTF-8", "de_DE.UTF-8" ); + QVERIFY( !lc.isEmpty() ); + QCOMPARE( lc.toBcp47(), "en" ); + QCOMPARE( lc.lc_numeric, QStringLiteral( "de_DE.UTF-8" ) ); + + LocaleConfiguration lc2( "de_DE.UTF-8", "da_DK.UTF-8" ); + QVERIFY( !lc2.isEmpty() ); + QCOMPARE( lc2.toBcp47(), "de" ); + QCOMPARE( lc2.lc_numeric, "da_DK.UTF-8" ); + + LocaleConfiguration lc3( "da_DK.UTF-8", "de_DE.UTF-8" ); + QVERIFY( !lc3.isEmpty() ); + QCOMPARE( lc3.toBcp47(), "da" ); + QCOMPARE( lc3.lc_numeric, "de_DE.UTF-8" ); + } diff --git a/src/modules/locale/Tests.h b/src/modules/locale/Tests.h index acb3ab309..299eac61d 100644 --- a/src/modules/locale/Tests.h +++ b/src/modules/locale/Tests.h @@ -34,6 +34,7 @@ private Q_SLOTS: // Check the sample config file is processed correctly void testEmptyLocaleConfiguration(); void testDefaultLocaleConfiguration(); + void testSplitLocaleConfiguration(); }; #endif From 2345b933cdb520d0a3659071734c6c4f0d89a57c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 8 Jan 2019 13:40:20 +0100 Subject: [PATCH 66/74] [locale] Add operator << for LocaleConfiguration, for debugging --- src/modules/locale/LocaleConfiguration.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/modules/locale/LocaleConfiguration.h b/src/modules/locale/LocaleConfiguration.h index 0bd310d9d..7e835084f 100644 --- a/src/modules/locale/LocaleConfiguration.h +++ b/src/modules/locale/LocaleConfiguration.h @@ -20,6 +20,7 @@ #ifndef LOCALECONFIGURATION_H #define LOCALECONFIGURATION_H +#include #include #include @@ -65,4 +66,9 @@ private: QString myLanguageLocaleBcp47; }; +inline QDebug& operator <<( QDebug& s, const LocaleConfiguration& l ) +{ + return s << l.lang << '(' << l.toBcp47() << ") +" << l.lc_numeric; +} + #endif // LOCALECONFIGURATION_H From 8cc0e1f5f9390c6c92bdd5a32168fa2753622883 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 8 Jan 2019 14:39:40 +0100 Subject: [PATCH 67/74] [locale] Expand tests to check lang - This shows that one constructor isn't doing it right. --- src/modules/locale/Tests.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/modules/locale/Tests.cpp b/src/modules/locale/Tests.cpp index 91fea42b8..889519ca8 100644 --- a/src/modules/locale/Tests.cpp +++ b/src/modules/locale/Tests.cpp @@ -49,10 +49,12 @@ void LocaleTests::testDefaultLocaleConfiguration() { LocaleConfiguration lc( "en_US.UTF-8" ); QVERIFY( !lc.isEmpty() ); + QCOMPARE( lc.lang, "en_US.UTF-8" ); QCOMPARE( lc.toBcp47(), "en" ); LocaleConfiguration lc2( "de_DE.UTF-8" ); QVERIFY( !lc2.isEmpty() ); + QCOMPARE( lc2.lang, "de_DE.UTF-8" ); QCOMPARE( lc2.toBcp47(), "de" ); } @@ -60,11 +62,13 @@ void LocaleTests::testSplitLocaleConfiguration() { LocaleConfiguration lc( "en_US.UTF-8", "de_DE.UTF-8" ); QVERIFY( !lc.isEmpty() ); + QCOMPARE( lc.lang, "en_US.UTF-8" ); QCOMPARE( lc.toBcp47(), "en" ); QCOMPARE( lc.lc_numeric, QStringLiteral( "de_DE.UTF-8" ) ); LocaleConfiguration lc2( "de_DE.UTF-8", "da_DK.UTF-8" ); QVERIFY( !lc2.isEmpty() ); + QCOMPARE( lc2.lang, "de_DE.UTF-8" ); QCOMPARE( lc2.toBcp47(), "de" ); QCOMPARE( lc2.lc_numeric, "da_DK.UTF-8" ); From f1cbd5fcbf109ea50b96a7da35beb59e7baa2732 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 8 Jan 2019 18:09:34 +0100 Subject: [PATCH 68/74] [locale] Provide API for setting language - The language and BCP need to be in-sync - Existing code was inconsistent in setting things, which is why you could get through the locale page without setting a locale (at all) or it would keep English in spite of picking Germand on the welcome page. - Patch tests to use that API. --- src/modules/locale/LocaleConfiguration.cpp | 17 +++++--------- src/modules/locale/LocaleConfiguration.h | 27 +++++++++++----------- src/modules/locale/LocalePage.cpp | 12 +++++----- src/modules/locale/Tests.cpp | 8 +++---- 4 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/modules/locale/LocaleConfiguration.cpp b/src/modules/locale/LocaleConfiguration.cpp index 2e0689090..64d9971a7 100644 --- a/src/modules/locale/LocaleConfiguration.cpp +++ b/src/modules/locale/LocaleConfiguration.cpp @@ -38,12 +38,12 @@ LocaleConfiguration::LocaleConfiguration( const QString& localeName, const QStri } -QString +void LocaleConfiguration::setLanguage(const QString& localeName ) { QString language = localeName.split( '_' ).first(); - myLanguageLocaleBcp47 = QLocale( language ).bcp47Name().toLower(); - return language; + m_languageLocaleBcp47 = QLocale( language ).bcp47Name().toLower(); + m_lang = localeName; } @@ -276,7 +276,7 @@ LocaleConfiguration::fromLanguageAndLocation( const QString& languageLocale, bool LocaleConfiguration::isEmpty() const { - return lang.isEmpty() && + return m_lang.isEmpty() && lc_numeric.isEmpty() && lc_time.isEmpty() && lc_monetary.isEmpty() && @@ -294,8 +294,8 @@ LocaleConfiguration::toMap() const { QMap< QString, QString > map; - if ( !lang.isEmpty() ) - map.insert( "LANG", lang ); + if ( !m_lang.isEmpty() ) + map.insert( "LANG", m_lang ); if ( !lc_numeric.isEmpty() ) map.insert( "LC_NUMERIC", lc_numeric ); @@ -327,8 +327,3 @@ LocaleConfiguration::toMap() const return map; } -QString -LocaleConfiguration::toBcp47() const -{ - return myLanguageLocaleBcp47; -} diff --git a/src/modules/locale/LocaleConfiguration.h b/src/modules/locale/LocaleConfiguration.h index 7e835084f..e408d8ecb 100644 --- a/src/modules/locale/LocaleConfiguration.h +++ b/src/modules/locale/LocaleConfiguration.h @@ -41,13 +41,21 @@ public: bool isEmpty() const; - QMap< QString, QString > toMap() const; + /** @brief sets lang and the BCP47 representation + * + * Note that the documentation how this works is in packages.conf + */ + void setLanguage( const QString& localeName ); + QString language() const { return m_lang; } + // Note that the documentation how this works is in packages.conf - QString toBcp47() const; + QString toBcp47() const { return m_languageLocaleBcp47; } + + QMap< QString, QString > toMap() const; // These become all uppercase in locale.conf, but we keep them lowercase here to // avoid confusion with locale.h. - QString lang, lc_numeric, lc_time, lc_monetary, lc_paper, lc_name, lc_address, + QString lc_numeric, lc_time, lc_monetary, lc_paper, lc_name, lc_address, lc_telephone, lc_measurement, lc_identification; // If the user has explicitly selected language (from the dialog) @@ -55,20 +63,13 @@ public: bool explicit_lang, explicit_lc; private: - /** @brief sets lang and the BCP47 representation - * - * Note that the documentation how this works is in packages.conf - * - * @return The language part of the locale (e.g. before _) - */ - QString setLanguage( const QString& localeName ); - - QString myLanguageLocaleBcp47; + QString m_lang; + QString m_languageLocaleBcp47; }; inline QDebug& operator <<( QDebug& s, const LocaleConfiguration& l ) { - return s << l.lang << '(' << l.toBcp47() << ") +" << l.lc_numeric; + return s << l.language() << '(' << l.toBcp47() << ") +" << l.lc_numeric; } #endif // LOCALECONFIGURATION_H diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index c456ef940..65d681f37 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -164,15 +164,15 @@ LocalePage::LocalePage( QWidget* parent ) { LCLocaleDialog* dlg = new LCLocaleDialog( m_selectedLocaleConfiguration.isEmpty() ? - guessLocaleConfiguration().lang : - m_selectedLocaleConfiguration.lang, + guessLocaleConfiguration().language() : + m_selectedLocaleConfiguration.language(), m_localeGenLines, this ); dlg->exec(); if ( dlg->result() == QDialog::Accepted && !dlg->selectedLCLocale().isEmpty() ) { - m_selectedLocaleConfiguration.lang = dlg->selectedLCLocale(); + m_selectedLocaleConfiguration.setLanguage( dlg->selectedLCLocale() ); m_selectedLocaleConfiguration.explicit_lang = true; this->updateGlobalLocale(); this->updateLocaleLabels(); @@ -387,7 +387,7 @@ std::pair< QString, QString > LocalePage::prettyLocaleStatus( const LocaleConfig { return std::make_pair< QString, QString >( tr( "The system language will be set to %1." ) - .arg( prettyLCLocale( lc.lang ) ), + .arg( prettyLCLocale( lc.language() ) ), tr( "The numbers and dates locale will be set to %1." ) .arg( prettyLCLocale( lc.lc_numeric ) ) ); @@ -442,7 +442,7 @@ LocalePage::onActivate() !m_selectedLocaleConfiguration.explicit_lang ) { auto newLocale = guessLocaleConfiguration(); - m_selectedLocaleConfiguration.lang = newLocale.lang; + m_selectedLocaleConfiguration.setLanguage( newLocale.language() ); updateGlobalLocale(); updateLocaleLabels(); } @@ -511,7 +511,7 @@ LocalePage::updateGlobalStorage() auto newLocale = guessLocaleConfiguration(); if ( !m_selectedLocaleConfiguration.isEmpty() && m_selectedLocaleConfiguration.explicit_lang ) - newLocale.lang = m_selectedLocaleConfiguration.lang; + newLocale.setLanguage( m_selectedLocaleConfiguration.language() ); if ( !m_selectedLocaleConfiguration.isEmpty() && m_selectedLocaleConfiguration.explicit_lc ) { diff --git a/src/modules/locale/Tests.cpp b/src/modules/locale/Tests.cpp index 889519ca8..0e1a3eb48 100644 --- a/src/modules/locale/Tests.cpp +++ b/src/modules/locale/Tests.cpp @@ -49,12 +49,12 @@ void LocaleTests::testDefaultLocaleConfiguration() { LocaleConfiguration lc( "en_US.UTF-8" ); QVERIFY( !lc.isEmpty() ); - QCOMPARE( lc.lang, "en_US.UTF-8" ); + QCOMPARE( lc.language(), "en_US.UTF-8" ); QCOMPARE( lc.toBcp47(), "en" ); LocaleConfiguration lc2( "de_DE.UTF-8" ); QVERIFY( !lc2.isEmpty() ); - QCOMPARE( lc2.lang, "de_DE.UTF-8" ); + QCOMPARE( lc2.language(), "de_DE.UTF-8" ); QCOMPARE( lc2.toBcp47(), "de" ); } @@ -62,13 +62,13 @@ void LocaleTests::testSplitLocaleConfiguration() { LocaleConfiguration lc( "en_US.UTF-8", "de_DE.UTF-8" ); QVERIFY( !lc.isEmpty() ); - QCOMPARE( lc.lang, "en_US.UTF-8" ); + QCOMPARE( lc.language(), "en_US.UTF-8" ); QCOMPARE( lc.toBcp47(), "en" ); QCOMPARE( lc.lc_numeric, QStringLiteral( "de_DE.UTF-8" ) ); LocaleConfiguration lc2( "de_DE.UTF-8", "da_DK.UTF-8" ); QVERIFY( !lc2.isEmpty() ); - QCOMPARE( lc2.lang, "de_DE.UTF-8" ); + QCOMPARE( lc2.language(), "de_DE.UTF-8" ); QCOMPARE( lc2.toBcp47(), "de" ); QCOMPARE( lc2.lc_numeric, "da_DK.UTF-8" ); From 200f68ae48f450aca1d6c6a81065e14aecd26848 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 8 Jan 2019 22:18:01 +0100 Subject: [PATCH 69/74] [locale] Reduce debug-chattiness --- src/modules/locale/LocalePage.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index 65d681f37..e64740574 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -137,7 +137,6 @@ LocalePage::LocalePage( QWidget* parent ) connect( m_tzWidget, &TimeZoneWidget::locationChanged, [this]( LocaleGlobal::Location location ) { - cDebug() << "Updating location from TZ widget to" << location; m_blockTzWidgetSet = true; // Set region index @@ -318,7 +317,7 @@ LocalePage::init( const QString& initialRegion, } else { - cDebug() << "Cannot open file" << localeGenPath + cWarning() << "Cannot open file" << localeGenPath << ". Assuming the supported languages are already built into " "the locale archive."; QProcess localeA; @@ -477,7 +476,6 @@ LocalePage::updateGlobalLocale() { auto *gs = Calamares::JobQueue::instance()->globalStorage(); const QString bcp47 = m_selectedLocaleConfiguration.toBcp47(); - cDebug() << "Updating global locale setting to" << bcp47; gs->insert( "locale", bcp47 ); } From ba82526449dbadc5a658185f1b56ae50ae60b327 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 8 Jan 2019 22:25:25 +0100 Subject: [PATCH 70/74] CMake: drop RC version for release --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f241cedd0..fa550f3c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,7 +75,7 @@ set( CALAMARES_DESCRIPTION_SUMMARY set( CALAMARES_VERSION_MAJOR 3 ) set( CALAMARES_VERSION_MINOR 2 ) set( CALAMARES_VERSION_PATCH 3 ) -set( CALAMARES_VERSION_RC 1 ) +set( CALAMARES_VERSION_RC 0 ) ### Transifex (languages) info # From 527392f0afa550fd16ba51e4897f14d5afe2a492 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 8 Jan 2019 22:29:55 +0100 Subject: [PATCH 71/74] [libcalamares] Update Copyright statement --- src/libcalamares/PythonJobApi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcalamares/PythonJobApi.cpp b/src/libcalamares/PythonJobApi.cpp index 19670b87f..b953f821a 100644 --- a/src/libcalamares/PythonJobApi.cpp +++ b/src/libcalamares/PythonJobApi.cpp @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac - * Copyright 2017-2018, Adriaan de Groot + * Copyright 2017-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 From 4b1b71dd3e8bc800bcd1ff22ca6c8adee8d1b195 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 8 Jan 2019 22:30:12 +0100 Subject: [PATCH 72/74] [locale] Update Copyright statements --- src/modules/locale/LocaleConfiguration.cpp | 2 +- src/modules/locale/LocaleConfiguration.h | 2 +- src/modules/locale/LocalePage.cpp | 2 +- src/modules/locale/LocalePage.h | 1 + src/modules/locale/timezonewidget/localeglobal.h | 1 + 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/modules/locale/LocaleConfiguration.cpp b/src/modules/locale/LocaleConfiguration.cpp index 64d9971a7..8bc2b2c77 100644 --- a/src/modules/locale/LocaleConfiguration.cpp +++ b/src/modules/locale/LocaleConfiguration.cpp @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac - * Copyright 2017-2018, Adriaan de Groot + * Copyright 2017-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 diff --git a/src/modules/locale/LocaleConfiguration.h b/src/modules/locale/LocaleConfiguration.h index e408d8ecb..abe90ffcb 100644 --- a/src/modules/locale/LocaleConfiguration.h +++ b/src/modules/locale/LocaleConfiguration.h @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2016, Teo Mrnjavac - * Copyright 2017-2018, Adriaan de Groot + * Copyright 2017-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 diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index e64740574..41ce488e3 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac - * Copyright 2017-2018, Adriaan de Groot + * Copyright 2017-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 diff --git a/src/modules/locale/LocalePage.h b/src/modules/locale/LocalePage.h index 4b93c690e..741a5d2e9 100644 --- a/src/modules/locale/LocalePage.h +++ b/src/modules/locale/LocalePage.h @@ -1,6 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014, Teo Mrnjavac + * 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 diff --git a/src/modules/locale/timezonewidget/localeglobal.h b/src/modules/locale/timezonewidget/localeglobal.h index 88a8ae125..1a8f796d4 100644 --- a/src/modules/locale/timezonewidget/localeglobal.h +++ b/src/modules/locale/timezonewidget/localeglobal.h @@ -1,6 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014-2016, Teo Mrnjavac + * Copyright 2019, Adriaan de Groot * * Originally from the Manjaro Installation Framework * by Roland Singer From 2d2454025de098605c7ee9a4d057899ebf1ab974 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 9 Jan 2019 12:58:31 +0100 Subject: [PATCH 73/74] Changes: document locale fix FIXES #1064 --- CHANGES | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES b/CHANGES index 2cedfe508..2b649b772 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,11 @@ This release contains contributions from (alphabetically by first name): * Fixed bug where, during detection of existing systems, the existing system partitions may be mounted and then destroyed. + * *locale* It was possible to set the installer and system language + (e.g. to German) while the global storage value for *locale* + remained set to English. Then no localization packages are installed + (see feature `${LOCALE}` in `packages.conf`). Reported downstream + in Netrunner. = 3.2.2 (2018-09-04) = From b18ba3d66292e8fd3848f074d3a4d6fe3381d403 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 9 Jan 2019 13:00:52 +0100 Subject: [PATCH 74/74] Changes: polish the change-notes a bit --- CHANGES | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 2b649b772..ae2ca240b 100644 --- a/CHANGES +++ b/CHANGES @@ -3,23 +3,29 @@ contributors are listed. Note that Calamares does not have a historical changelog -- this log starts with version 3.2.0. The release notes on the website will have to do for older versions. -= 3.2.3 (unreleased) = += 3.2.3 (2019-01-09) = This release contains contributions from (alphabetically by first name): - aliveafter1000 == Core == +There are no core changes in this release. + == Modules == - * Fixed bug where, during detection of existing systems, the existing - system partitions may be mounted and then destroyed. + * *partition* Fixed bug where, during detection of existing systems, the + existing system partitions may be mounted and then files deleted. + This is a **limited** version of the patch from aliveafter1000 + that will be in 3.2.4, which tries harder to mount filesystems + read-only and unmodifiable. * *locale* It was possible to set the installer and system language (e.g. to German) while the global storage value for *locale* remained set to English. Then no localization packages are installed (see feature `${LOCALE}` in `packages.conf`). Reported downstream in Netrunner. + = 3.2.2 (2018-09-04) = This release contains contributions from (alphabetically by first name):