From 9f8f76befcd4d975f6c225597d1c508df07f49b5 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 May 2018 03:45:14 -0400 Subject: [PATCH 01/50] [locale] Introduce timezone-widget debugging Replace pin and text label with just a dot (to pinpoint where locations are) and draw latitude lines on the globe when DEbUG_TIMEZONE is set at compile time. Since there's probably still timezone-related bugs (in particular in the images that map points on the globe to timezones), leave this in the codebase. --- src/modules/locale/CMakeLists.txt | 5 +++ src/modules/locale/LocalePage.cpp | 4 +- .../locale/timezonewidget/timezonewidget.cpp | 45 ++++++++++++++++++- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/modules/locale/CMakeLists.txt b/src/modules/locale/CMakeLists.txt index 384135d4c..853ad8cc2 100644 --- a/src/modules/locale/CMakeLists.txt +++ b/src/modules/locale/CMakeLists.txt @@ -4,6 +4,11 @@ if( ECM_FOUND AND BUILD_TESTING ) find_package( Qt5 COMPONENTS Core Test REQUIRED ) endif() +# When debugging the timezone widget, add this debugging definition +# to have a debugging-friendly timezone widget, debug logging, +# and no intrusive timezone-setting while clicking around. +add_definitions( -DDEBUG_TIMEZONES ) + include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) set( geoip_src GeoIP.cpp GeoIPJSON.cpp ) diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index e2571d085..e4f36daad 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -494,13 +494,15 @@ LocalePage::updateGlobalStorage() Calamares::JobQueue::instance()->globalStorage()->insert( "locale", bcp47 ); // If we're in chroot mode (normal install mode), then we immediately set the - // timezone on the live system. + // timezone on the live system. When debugging timezones, don't bother. +#ifndef DEBUG_TIMEZONES if ( Calamares::Settings::instance()->doChroot() ) { QProcess ::execute( "timedatectl", // depends on systemd { "set-timezone", location.region + '/' + location.zone } ); } +#endif // Preserve those settings that have been made explicit. auto newLocale = guessLocaleConfiguration(); diff --git a/src/modules/locale/timezonewidget/timezonewidget.cpp b/src/modules/locale/timezonewidget/timezonewidget.cpp index 976c139fc..a06d3169d 100644 --- a/src/modules/locale/timezonewidget/timezonewidget.cpp +++ b/src/modules/locale/timezonewidget/timezonewidget.cpp @@ -23,6 +23,8 @@ #include +#include "utils/Logger.h" + #include "timezonewidget.h" constexpr double MATH_PI = 3.14159265; @@ -75,6 +77,13 @@ void TimeZoneWidget::setCurrentLocation( LocaleGlobal::Location location ) { currentLocation = location; +#ifdef DEBUG_TIMEZONES + cDebug() << "Setting location" << location.region << location.zone << location.country; + cDebug() << " .. long" << location.longitude << "lat" << location.latitude; + + bool found = false; +#endif + // Set zone QPoint pos = getLocationPosition( currentLocation.longitude, currentLocation.latitude ); @@ -85,8 +94,21 @@ void TimeZoneWidget::setCurrentLocation( LocaleGlobal::Location location ) // If not transparent set as current if ( zone.pixel( pos ) != RGB_TRANSPARENT ) { +#ifdef DEBUG_TIMEZONES + // Log *all* the zones that contain this point, + // but only pick the first. + if ( !found ) + { + currentZoneImage = zone; + found = true; + cDebug() << " .. First zone found" << i; + } + else + cDebug() << " .. Also in zone" << i; +#else currentZoneImage = zone; break; +#endif } } @@ -149,8 +171,28 @@ void TimeZoneWidget::paintEvent( QPaintEvent* ) // Draw zone image painter.drawImage( 0, 0, currentZoneImage ); - // Draw pin +#ifdef DEBUG_TIMEZONES QPoint point = getLocationPosition( currentLocation.longitude, currentLocation.latitude ); + // Draw latitude lines + for ( int y_lat = -50; y_lat < 80 ; y_lat+=5 ) + { + QPen p( y_lat ? Qt::black : Qt::red ); + p.setWidth( 0 ); + painter.setPen( p ); + QPoint latLine0( getLocationPosition( 0, y_lat ) ); + int llx = latLine0.x() + ((y_lat & 1) ? -10 : 0); + int lly = latLine0.y(); + + for ( int c = 0 ; c < width ; ++c ) + painter.drawPoint( c, lly ); + } + // Just a dot in the selected location, no label + painter.setPen( Qt::red ); + painter.drawPoint( point ); +#else + // Draw pin at current location + QPoint point = getLocationPosition( currentLocation.longitude, currentLocation.latitude ); + painter.drawImage( point.x() - pin.width()/2, point.y() - pin.height()/2, pin ); // Draw text and box @@ -173,6 +215,7 @@ void TimeZoneWidget::paintEvent( QPaintEvent* ) painter.drawRoundedRect( rect, 3, 3 ); painter.setPen( Qt::white ); painter.drawText( rect.x() + 5, rect.bottom() - 4, LocaleGlobal::Location::pretty( currentLocation.zone ) ); +#endif painter.end(); } From 2c18ba6ddb37a9d220b86c1cbc5b7cc1ac63ec54 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 May 2018 05:52:07 -0400 Subject: [PATCH 02/50] [locale] Adjust latitude calculation in the southern hemisphere The scaling on the map was a little off; the degrees of latitude are a little wider there than around the equator and Europe. - Johannesburg is in the right spot - Hobart is no longer a suburb of Melbourne - Punta Arenas is in Chile --- src/modules/locale/timezonewidget/timezonewidget.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/modules/locale/timezonewidget/timezonewidget.cpp b/src/modules/locale/timezonewidget/timezonewidget.cpp index a06d3169d..ae048ab6f 100644 --- a/src/modules/locale/timezonewidget/timezonewidget.cpp +++ b/src/modules/locale/timezonewidget/timezonewidget.cpp @@ -131,13 +131,17 @@ QPoint TimeZoneWidget::getLocationPosition( double longitude, double latitude ) double x = ( width / 2.0 + ( width / 2.0 ) * longitude / 180.0 ) + MAP_X_OFFSET * width; double y = ( height / 2.0 - ( height / 2.0 ) * latitude / 90.0 ) + MAP_Y_OFFSET * height; - //Far north, the MAP_Y_OFFSET no longer holds, cancel the Y offset; it's noticeable + // Far north, the MAP_Y_OFFSET no longer holds, cancel the Y offset; it's noticeable // from 62 degrees north, so scale those 28 degrees as if the world is flat south // of there, and we have a funny "rounded" top of the world. In practice the locations // of the different cities / regions looks ok -- at least Thule ends up in the right // country, and Inuvik isn't in the ocean. if ( latitude > 62.0 ) y -= sin( MATH_PI * ( latitude - 62.0 ) / 56.0 ) * MAP_Y_OFFSET * height; + // Far south, some stretching occurs as well, but it is less pronounced. + // Move down by 1 pixel per 5 degrees past 10 south + if ( latitude < - 14 ) + y += int( (-latitude) / 5.0 ); // Antarctica isn't shown on the map, but you could try clicking there if ( latitude < -60 ) y = height - 1; From b7dbc8cc1ff4dea3d31005626e4a942c8de9d90a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 May 2018 06:33:50 -0400 Subject: [PATCH 03/50] [locale] Name zones when debugging - When debugging timezones, state their names (e.g. UTC offset) and also log the pixel position under consideration. --- .../locale/timezonewidget/timezonewidget.cpp | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/modules/locale/timezonewidget/timezonewidget.cpp b/src/modules/locale/timezonewidget/timezonewidget.cpp index ae048ab6f..5acdb6458 100644 --- a/src/modules/locale/timezonewidget/timezonewidget.cpp +++ b/src/modules/locale/timezonewidget/timezonewidget.cpp @@ -27,7 +27,12 @@ #include "timezonewidget.h" -constexpr double MATH_PI = 3.14159265; +constexpr static double MATH_PI = 3.14159265; + +#ifdef DEBUG_TIMEZONES +// Adds a label to the timezone with this name +constexpr static QLatin1Literal ZONE_NAME( "zone" ); +#endif TimeZoneWidget::TimeZoneWidget( QWidget* parent ) : QWidget( parent ) @@ -50,7 +55,12 @@ TimeZoneWidget::TimeZoneWidget( QWidget* parent ) : // Zone images QStringList zones = QString( ZONES ).split( " ", QString::SkipEmptyParts ); for ( int i = 0; i < zones.size(); ++i ) + { timeZoneImages.append( QImage( ":/images/timezone_" + zones.at( i ) + ".png" ).scaled( X_SIZE, Y_SIZE, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) ); +#ifdef DEBUG_TIMEZONES + timeZoneImages.last().setText( ZONE_NAME, zones.at( i ) ); +#endif + } } @@ -77,15 +87,17 @@ void TimeZoneWidget::setCurrentLocation( LocaleGlobal::Location location ) { currentLocation = location; + // Set zone + QPoint pos = getLocationPosition( currentLocation.longitude, currentLocation.latitude ); + #ifdef DEBUG_TIMEZONES cDebug() << "Setting location" << location.region << location.zone << location.country; cDebug() << " .. long" << location.longitude << "lat" << location.latitude; + cDebug() << " .. x" << pos.x() << "y" << pos.y(); bool found = false; #endif - // Set zone - QPoint pos = getLocationPosition( currentLocation.longitude, currentLocation.latitude ); for ( int i = 0; i < timeZoneImages.size(); ++i ) { @@ -101,10 +113,10 @@ void TimeZoneWidget::setCurrentLocation( LocaleGlobal::Location location ) { currentZoneImage = zone; found = true; - cDebug() << " .. First zone found" << i; + cDebug() << " .. First zone found" << i << zone.text( ZONE_NAME ); } else - cDebug() << " .. Also in zone" << i; + cDebug() << " .. Also in zone" << i << zone.text( ZONE_NAME ); #else currentZoneImage = zone; break; From 4bacafb41102252321dbcb30235131fca0e5b8b0 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 May 2018 06:44:28 -0400 Subject: [PATCH 04/50] [locale] Fix timezone pixel map for Tierra del Fuego region - Punta Arenas, draw like it's in -4 - Ushuaia, draw like it's in -3 FIXUP pixel --- src/modules/locale/images/timezone_-3.0.png | Bin 16635 -> 15999 bytes src/modules/locale/images/timezone_-4.0.png | Bin 18758 -> 17925 bytes src/modules/locale/images/timezone_-5.0.png | Bin 23061 -> 22353 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/modules/locale/images/timezone_-3.0.png b/src/modules/locale/images/timezone_-3.0.png index 0c5246e10f5d225623eca6f1e6948a00055690b4..dc64644fcd17b5e8f0bc6039f8dcff700293f923 100644 GIT binary patch literal 15999 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 literal 16635 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 diff --git a/src/modules/locale/images/timezone_-4.0.png b/src/modules/locale/images/timezone_-4.0.png index d556e93f4095a72015eb6a96ca4fc8a05fb1bf10..da1e73735a3ec08d13659cc69ca04b356a109650 100644 GIT binary patch literal 17925 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 OBs^XHT-G@yGywo*;s?(F literal 18758 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 SY@~pS7(8A5T-G@yGywocC$v%k diff --git a/src/modules/locale/images/timezone_-5.0.png b/src/modules/locale/images/timezone_-5.0.png index 8facd09f8a0441c6ea868acb773b33b0ba582f6a..1ab1a6713841f2a9a7e982ca7727563622b46235 100644 GIT binary patch literal 22353 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 From 6b3299e6ffda4064c7861b9dc020079df12215bc Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 May 2018 07:56:50 -0400 Subject: [PATCH 05/50] [locale] Adjust the North - Fudge the numbers in the North, to improve location of the pins and lines of latitude. - Inuvik, Yellowknife, Cambridge Bay, Resolute look ok - Thule, Scoresbysund look ok; Danmarkshavn a pixel or so too far North - Reykjavik is a bit too far North - Longyearbyen is a bit too far North Since these places are off by one or two pixels, this becomes invisible when a large pin + text label is placed on it. --- .../locale/timezonewidget/timezonewidget.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/modules/locale/timezonewidget/timezonewidget.cpp b/src/modules/locale/timezonewidget/timezonewidget.cpp index 5acdb6458..64557c151 100644 --- a/src/modules/locale/timezonewidget/timezonewidget.cpp +++ b/src/modules/locale/timezonewidget/timezonewidget.cpp @@ -148,11 +148,21 @@ QPoint TimeZoneWidget::getLocationPosition( double longitude, double latitude ) // of there, and we have a funny "rounded" top of the world. In practice the locations // of the different cities / regions looks ok -- at least Thule ends up in the right // country, and Inuvik isn't in the ocean. - if ( latitude > 62.0 ) - y -= sin( MATH_PI * ( latitude - 62.0 ) / 56.0 ) * MAP_Y_OFFSET * height; + if ( latitude > 70.0 ) + y -= sin( MATH_PI * ( latitude - 70.0 ) / 56.0 ) * MAP_Y_OFFSET * height * 0.8; + if ( latitude > 74.0 ) + y += 4; + if ( latitude > 69.0 ) + y -= 2; + if ( latitude > 59.0 ) + y -= 4 * int( ( latitude - 54.0 ) / 5.0 ); + if ( latitude > 54.0 ) + y -= 2; + if ( latitude > 49.0 ) + y -= int ( (latitude - 44.0) / 5.0 ); // Far south, some stretching occurs as well, but it is less pronounced. // Move down by 1 pixel per 5 degrees past 10 south - if ( latitude < - 14 ) + if ( latitude < 0 ) y += int( (-latitude) / 5.0 ); // Antarctica isn't shown on the map, but you could try clicking there if ( latitude < -60 ) From 1ee87c3cdeb4c861ae5997f9e7e441bd06a4e254 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 May 2018 08:00:50 -0400 Subject: [PATCH 06/50] [locale] Drop debugging define --- src/modules/locale/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/locale/CMakeLists.txt b/src/modules/locale/CMakeLists.txt index 853ad8cc2..24259d797 100644 --- a/src/modules/locale/CMakeLists.txt +++ b/src/modules/locale/CMakeLists.txt @@ -7,7 +7,8 @@ endif() # When debugging the timezone widget, add this debugging definition # to have a debugging-friendly timezone widget, debug logging, # and no intrusive timezone-setting while clicking around. -add_definitions( -DDEBUG_TIMEZONES ) +# +# add_definitions( -DDEBUG_TIMEZONES ) include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) From 40b60abcb31e9f088c25e403e7225fff5ccd1ffe Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 29 May 2018 11:29:44 -0400 Subject: [PATCH 07/50] [locale] Move constants for map-munging These don't have to be defines at all. --- src/modules/locale/timezonewidget/timezonewidget.cpp | 3 +++ src/modules/locale/timezonewidget/timezonewidget.h | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/modules/locale/timezonewidget/timezonewidget.cpp b/src/modules/locale/timezonewidget/timezonewidget.cpp index 64557c151..6609160d5 100644 --- a/src/modules/locale/timezonewidget/timezonewidget.cpp +++ b/src/modules/locale/timezonewidget/timezonewidget.cpp @@ -27,6 +27,9 @@ #include "timezonewidget.h" + +static constexpr double MAP_Y_OFFSET = 0.125; +static constexpr double MAP_X_OFFSET = -0.0370; constexpr static double MATH_PI = 3.14159265; #ifdef DEBUG_TIMEZONES diff --git a/src/modules/locale/timezonewidget/timezonewidget.h b/src/modules/locale/timezonewidget/timezonewidget.h index a96a0309c..8589dc74d 100644 --- a/src/modules/locale/timezonewidget/timezonewidget.h +++ b/src/modules/locale/timezonewidget/timezonewidget.h @@ -36,8 +36,6 @@ #include "localeglobal.h" -#define MAP_Y_OFFSET 0.125 -#define MAP_X_OFFSET -0.0370 #define RGB_TRANSPARENT 0 #define ZONES "0.0 1.0 2.0 3.0 3.5 4.0 4.5 5.0 5.5 5.75 6.0 6.5 7.0 8.0 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.75 13.0 -1.0 -2.0 -3.0 -3.5 -4.0 -4.5 -5.0 -5.5 -6.0 -7.0 -8.0 -9.0 -9.5 -10.0 -11.0" #define X_SIZE 780 From 41d427e543071a8692b994f95354989aad6aa209 Mon Sep 17 00:00:00 2001 From: Gabriel Craciunescu Date: Fri, 1 Jun 2018 17:45:40 +0200 Subject: [PATCH 08/50] [modules]: hwclock fix typo - methode -> method --- src/modules/hwclock/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/hwclock/main.py b/src/modules/hwclock/main.py index d247ccd00..e2f70ee61 100644 --- a/src/modules/hwclock/main.py +++ b/src/modules/hwclock/main.py @@ -46,7 +46,7 @@ def run(): libcalamares.utils.debug("Hwclock returned error code {}".format(ret)) libcalamares.utils.debug(" .. ISA bus method failed.") else: - libcalamares.utils.debug("Hwclock set using ISA bus methode.") + libcalamares.utils.debug("Hwclock set using ISA bus method.") if is_broken_rtc and is_broken_isa: libcalamares.utils.debug("BIOS or Kernel BUG: Setting hwclock failed.") From 8430970e719251cb871a79743455c010e1d66ae0 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 7 Jun 2018 13:47:41 +0200 Subject: [PATCH 09/50] [preservefiles] Reduce copying by using const-ref into list --- src/modules/preservefiles/PreserveFiles.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/preservefiles/PreserveFiles.cpp b/src/modules/preservefiles/PreserveFiles.cpp index 29564fcd1..0fe1d278b 100644 --- a/src/modules/preservefiles/PreserveFiles.cpp +++ b/src/modules/preservefiles/PreserveFiles.cpp @@ -93,7 +93,7 @@ Calamares::JobResult PreserveFiles::exec() prefix.append( '/' ); int count = 0; - for ( const auto it : m_items ) + for ( const auto& it : m_items ) { QString source = it.source; QString dest = prefix + atReplacements( it.dest ); @@ -162,7 +162,7 @@ void PreserveFiles::setConfigurationMap(const QVariantMap& configurationMap) QVariantList l = files.toList(); unsigned int c = 0; - for ( const auto li : l ) + for ( const auto& li : l ) { if ( li.type() == QVariant::String ) { From d82b103edae31067d5d7f71ddb9bf7a747f6ba4c Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Mon, 4 Jun 2018 08:21:57 -0400 Subject: [PATCH 10/50] i18n: [calamares] Automatic merge of Transifex translations --- lang/calamares_da.ts | 6 +- lang/calamares_et.ts | 14 ++-- lang/calamares_fr.ts | 14 ++-- lang/calamares_id.ts | 14 ++-- lang/calamares_it_IT.ts | 165 ++++++++++++++++++++-------------------- lang/calamares_pl.ts | 8 +- 6 files changed, 111 insertions(+), 110 deletions(-) diff --git a/lang/calamares_da.ts b/lang/calamares_da.ts index 8ee303ef1..edbe2737f 100644 --- a/lang/calamares_da.ts +++ b/lang/calamares_da.ts @@ -485,12 +485,12 @@ Installationsprogrammet vil stoppe og alle ændringer vil gå tabt. The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + Kommandoen kører i værtsmiljøet og har brug for at kende rodstien, men der er ikke defineret nogen rootMountPoint. The command needs to know the user's name, but no username is defined. - + Kommandoen har brug for at kende brugerens navn, men der er ikke defineret noget brugernavn. @@ -1670,7 +1670,7 @@ Installationsprogrammet vil stoppe og alle ændringer vil gå tabt. 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. - + Partitionstabellen på %1 har allerede %2 primære partitioner, og der kan ikke tilføjes flere. Fjern venligst en primær partition og tilføj i stedet en udviddet partition. diff --git a/lang/calamares_et.ts b/lang/calamares_et.ts index e56118622..871f447da 100644 --- a/lang/calamares_et.ts +++ b/lang/calamares_et.ts @@ -485,12 +485,12 @@ Installija sulgub ja kõik muutused kaovad. The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + See käsklus käivitatakse hostikeskkonnas ning peab teadma juurteed, kuid rootMountPoint pole defineeritud. The command needs to know the user's name, but no username is defined. - + Käsklus peab teadma kasutaja nime, aga kasutajanimi pole defineeritud. @@ -1665,12 +1665,12 @@ Installija sulgub ja kõik muutused kaovad. Can not create new partition - + Uut partitsiooni ei saa luua 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. - + Partitsioonitabel kohas %1 juba omab %2 peamist partitsiooni ning rohkem juurde ei saa lisada. Palun eemalda selle asemel üks peamine partitsioon ja lisa juurde laiendatud partitsioon. @@ -1816,17 +1816,17 @@ Installija sulgub ja kõik muutused kaovad. Saving files for later ... - + Salvestan faile hiljemaks... No files configured to save for later. - + Ühtegi faili ei konfigureeritud hiljemaks salvestamiseks. Not all of the configured files could be preserved. - + Ühtegi konfigureeritud faili ei suudetud säilitada. diff --git a/lang/calamares_fr.ts b/lang/calamares_fr.ts index f9796a5c9..b2356b5d2 100644 --- a/lang/calamares_fr.ts +++ b/lang/calamares_fr.ts @@ -485,12 +485,12 @@ L'installateur se fermera et les changements seront perdus. The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + La commande est exécutée dans l'environnement hôte et a besoin de connaître le chemin racine, mais aucun point de montage racine n'est défini. The command needs to know the user's name, but no username is defined. - + La commande a besoin de connaître le nom de l'utilisateur, mais aucun nom d'utilisateur n'est défini. @@ -1665,12 +1665,12 @@ L'installateur se fermera et les changements seront perdus. Can not create new partition - + Impossible de créer une nouvelle 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. - + La table de partition sur %1 contient déjà %2 partitions primaires, et aucune supplémentaire ne peut être ajoutée. Veuillez supprimer une partition primaire et créer une partition étendue à la place. @@ -1817,17 +1817,17 @@ Vous pouvez obtenir un aperçu des différentes apparences en cliquant sur celle Saving files for later ... - + Sauvegarde des fichiers en cours pour plus tard... No files configured to save for later. - + Aucun fichier de sélectionné pour sauvegarde ultérieure. Not all of the configured files could be preserved. - + Certains des fichiers configurés n'ont pas pu être préservés. diff --git a/lang/calamares_id.ts b/lang/calamares_id.ts index ebfb416c3..3e6e991bd 100644 --- a/lang/calamares_id.ts +++ b/lang/calamares_id.ts @@ -487,12 +487,12 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + Perintah berjalan di lingkungan host dan perlu diketahui alur root-nya, tetapi bukan rootMountPoint yang ditentukan. The command needs to know the user's name, but no username is defined. - + Perintah perlu diketahui nama si pengguna, tetapi bukan nama pengguna yang ditentukan. @@ -1667,12 +1667,12 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Can not create new partition - + Tidak bisa menciptakan partisi baru. 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. - + Partisi tabel pada %1 sudah memiliki %2 partisi primer, dan tidak ada lagi yang bisa ditambahkan. Silakan hapus salah satu partisi primer dan tambahkan sebuah partisi extended, sebagai gantinya. @@ -1818,17 +1818,17 @@ Pemasangan dapat dilanjutkan, namun beberapa fitur akan dinonfungsikan. Saving files for later ... - + Menyimpan file untuk kemudian... No files configured to save for later. - + Tiada file yang dikonfigurasi untuk penyimpanan nanti. Not all of the configured files could be preserved. - + Tidak semua file yang dikonfigurasi dapat dipertahankan. diff --git a/lang/calamares_it_IT.ts b/lang/calamares_it_IT.ts index 889f60c97..453321e44 100644 --- a/lang/calamares_it_IT.ts +++ b/lang/calamares_it_IT.ts @@ -4,7 +4,7 @@ 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. - L'<strong>ambiente di avvio</strong> di questo sistema. <br><br>I vecchi sistemi x86 supportano solo <strong>BIOS</strong>. <bt>I sistemi moderni normalmente usano <strong>EFI</strong> ma possono anche usare BIOS se l'avvio viene eseguito in modalità compatibile. + L'<strong>ambiente di avvio</strong> di questo sistema. <br><br>I vecchi sistemi x86 supportano solo <strong>BIOS</strong>. <bt>I sistemi moderni normalmente usano <strong>EFI</strong> ma possono anche apparire come sistemi BIOS se avviati in modalità compatibile. @@ -241,7 +241,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno The installation is complete. Close the installer. - L'installazione è terminata. Chiudere l'installer. + L'installazione è terminata. Chiudere il programma d'installazione. @@ -485,12 +485,12 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + Il comando viene eseguito nell'ambiente host e richiede il percorso di root ma nessun rootMountPoint (punto di montaggio di root) è definito. The command needs to know the user's name, but no username is defined. - + Il comando richiede il nome utente, nessun nome utente definito. @@ -498,7 +498,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno Contextual Processes Job - Attività dei processi contestuali + Job dei processi contestuali @@ -536,7 +536,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno LVM LV name - Nome LVM LV + Nome LV di LVM @@ -915,7 +915,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno <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>Quando questa casella è selezionata, il sistema sarà riavviato immediatamente al click su <span style=" font-style:italic;">Fatto</span> o alla chiusura del programma d'installazione.</p></body></html> @@ -943,12 +943,12 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno Installation Complete - Installazione Eseguita + Installazione completata The installation of %1 is complete. - L'installazione di %1 è completa. + L'installazione di %1 è completata. @@ -979,12 +979,12 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno Konsole not installed - Konsole non installato + Konsole non installata Please install KDE Konsole and try again! - Si prega di installare KDE Konsole e provare nuovamente! + Si prega di installare KDE Konsole e riprovare! @@ -1195,7 +1195,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno Network Installation. (Disabled: Received invalid groups data) - Installazione di rete. (Disabilitata: Ricevuti dati non validi sui gruppi) + Installazione di rete. (Disabilitata: Ricevuti dati non validi dei gruppi) @@ -1221,12 +1221,12 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno Password is too weak - La password è troppo debole + Password troppo debole Memory allocation error when setting '%1' - + Errore di allocazione della memoria quando si imposta '%1' @@ -1236,217 +1236,217 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno The password is the same as the old one - La nuova password coincide con la precedente + La password coincide con la precedente The password is a palindrome - La password è palindroma + La password è un palindromo The password differs with case changes only - + La password differisce solo per lettere minuscole e maiuscole The password is too similar to the old one - La nuova password è troppo simile a quella precedente + La password è troppo simile a quella precedente The password contains the user name in some form - La password contiene il nome utente in una qualche forma + La password contiene il nome utente in qualche campo The password contains words from the real name of the user in some form - La password contiene parte del nome reale dell'utente in qualche forma + La password contiene parti del nome utente reale in qualche campo The password contains forbidden words in some form - + La password contiene parole vietate in alcuni campi The password contains less than %1 digits - La password contiene meno di %1 numeri + La password contiene meno di %1 cifre The password contains too few digits - La password contiene troppo pochi numeri + La password contiene poche cifre The password contains less than %1 uppercase letters - + La password contiene meno di %1 lettere maiuscole The password contains too few uppercase letters - + La password contiene poche lettere maiuscole The password contains less than %1 lowercase letters - + La password contiene meno di %1 lettere minuscole The password contains too few lowercase letters - + La password contiene poche lettere minuscole The password contains less than %1 non-alphanumeric characters - + La password contiene meno di %1 caratteri non alfanumerici The password contains too few non-alphanumeric characters - + La password contiene pochi caratteri non alfanumerici The password is shorter than %1 characters - + La password ha meno di %1 caratteri The password is too short - + La password è troppo corta The password is just rotated old one - + La password è solo una rotazione della precedente The password contains less than %1 character classes - + La password contiene meno di %1 classi di caratteri The password does not contain enough character classes - + La password non contiene classi di caratteri sufficienti The password contains more than %1 same characters consecutively - + La password contiene più di %1 caratteri uguali consecutivi The password contains too many same characters consecutively - + La password contiene troppi caratteri uguali consecutivi The password contains more than %1 characters of the same class consecutively - + La password contiene più di %1 caratteri consecutivi della stessa classe The password contains too many characters of the same class consecutively - + La password contiene molti caratteri consecutivi della stessa classe The password contains monotonic sequence longer than %1 characters - + La password contiene una sequenza monotona più lunga di %1 caratteri The password contains too long of a monotonic character sequence - + La password contiene una sequenza di caratteri monotona troppo lunga No password supplied - + Nessuna password fornita Cannot obtain random numbers from the RNG device - + Impossibile ottenere numeri casuali dal dispositivo RNG Password generation failed - required entropy too low for settings - + Generazione della password fallita - entropia richiesta troppo bassa per le impostazioni The password fails the dictionary check - %1 - + La password non supera il controllo del dizionario - %1 The password fails the dictionary check - + La password non supera il controllo del dizionario Unknown setting - %1 - + Impostazioni sconosciute - %1 Unknown setting - + Impostazione sconosciuta Bad integer value of setting - %1 - + Valore intero non valido per l'impostazione - %1 Bad integer value - + Valore intero non valido Setting %1 is not of integer type - + Impostazione %1 non è di tipo intero Setting is not of integer type - + Impostazione non è di tipo intero Setting %1 is not of string type - + Impostazione %1 non è di tipo stringa Setting is not of string type - + Impostazione non è di tipo stringa Opening the configuration file failed - + Apertura del file di configurazione fallita The configuration file is malformed - + Il file di configurazione non è corretto Fatal failure - + Errore fatale Unknown error - + Errore sconosciuto @@ -1665,12 +1665,12 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno Can not create new partition - + Impossibile creare nuova partizione 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. - + La tabella delle partizioni su %1 contiene già %2 partizioni primarie, non se ne possono aggiungere altre. Rimuovere una partizione primaria e aggiungere una partizione estesa invece. @@ -1776,13 +1776,13 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno Plasma Look-and-Feel Job - Attività del tema di Plasma + Job di Plasma Look-and-Feel Could not select KDE Plasma Look-and-Feel package - Impossibile selezionare il pacchetto del tema di KDE Plasma + Impossibile selezionare il pacchetto di KDE Plasma Look-and-Feel @@ -1800,7 +1800,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno 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. - + Scegliere il tema per il desktop KDE Plasma. Si può anche saltare questa scelta e configurare il tema dopo aver installato il sistema. Cliccando su selezione del tema, ne sarà mostrata un'anteprima dal vivo. @@ -1808,7 +1808,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno Look-and-Feel - Tema + Look-and-Feel @@ -1816,17 +1816,17 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno Saving files for later ... - + Salvataggio dei file per dopo ... No files configured to save for later. - + Nessun file configurato per dopo. Not all of the configured files could be preserved. - + Non tutti i file configurati possono essere preservati. @@ -1835,7 +1835,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno There was no output from the command. - + Non c'era output dal comando. @@ -1864,7 +1864,8 @@ Output: Command <i>%1</i> failed to start. - Il comando %1 non si è avviato. + Il comando %1 non si è avviato. + @@ -1874,7 +1875,7 @@ Output: Bad parameters for process job call. - Parametri errati per elaborare l'attività richiesta + Parametri errati per elaborare la chiamata al job. @@ -2334,7 +2335,7 @@ Output: Shell Processes Job - + Job dei processi della shell @@ -2343,7 +2344,7 @@ Output: %L1 / %L2 slide counter, %1 of %2 (numeric) - + %L1 / %L2 @@ -2372,7 +2373,7 @@ Output: Sending installation feedback. - Invio in corso della valutazione dell'installazione + Invio della valutazione dell'installazione. @@ -2382,7 +2383,7 @@ Output: HTTP request timed out. - La richiesta HTTP ha raggiunto il timeout. + La richiesta HTTP è scaduta. @@ -2406,12 +2407,12 @@ Output: Could not configure machine feedback correctly, script error %1. - Non è stato possibile configurare correttamente la valutazione automatica, errore script %1. + Non è stato possibile configurare correttamente la valutazione automatica, errore dello script %1. Could not configure machine feedback correctly, Calamares error %1. - Non è stato possibile configurare correttamente la valutazione automatica, errore Calamares %1. + Non è stato possibile configurare correttamente la valutazione automatica, errore di Calamares %1. @@ -2429,7 +2430,7 @@ Output: <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>Selezionando questo, non verrà inviata <span style=" font-weight:600;">alcuna informazione</span> riguardo la propria installazione.</p></body></html> + <html><head/><body><p>Selezionando questo, non verrà inviata <span style=" font-weight:600;">alcuna informazione</span> relativa alla propria installazione.</p></body></html> @@ -2448,27 +2449,27 @@ Output: <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> - <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Cliccare qui per maggiori informazioni riguardo la valutazione degli utenti</span></a></p></body></html> + <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Cliccare qui per maggiori informazioni sulla valutazione degli utenti</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. - Il tracciamento dell'installazione aiuta %1 a capire quanti utenti vengono serviti, su quale hardware installano %1 e (con le ultime due opzioni qui sotto), a ricevere continue informazioni riguardo le applicazioni preferite. Per vedere cosa verrà inviato, si prega di cliccare sull'icona di aiuto vicino ad ogni area. + Il tracciamento dell'installazione aiuta %1 a capire quanti utenti vengono serviti, su quale hardware si installa %1 e (con le ultime due opzioni sotto), a ricevere continue informazioni sulle applicazioni preferite. Per vedere cosa verrà inviato, cliccare sull'icona di aiuto accanto ad ogni 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. - Selezionando questa opzione verranno inviate informazioni riguardo l'installazione e l'hardware. Queste informazioni verranno <b>inviate solo una volta</b> dopo che l'installazione è terminata. + Selezionando questa opzione saranno inviate informazioni relative all'installazione e all'hardware. I dati saranno <b>inviati solo una volta</b> al termine dell'installazione. By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. - Selezionando questa opzione verranno inviate <b>periodicamente</b> informazioni riguardo l'installazione, l'hardware e le applicazioni, a %1. + Selezionando questa opzione saranno inviate <b>periodicamente</b> informazioni sull'installazione, l'hardware e le applicazioni, a %1. By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. - Selezionando questa opzione verranno inviate <b>regolarmente</b> informazioni riguardo l'installazione, l'hardware, le applicazioni e il modo di utilizzo, a %1. + Selezionando questa opzione verranno inviate <b>regolarmente</b> informazioni sull'installazione, l'hardware, le applicazioni e i modi di utilizzo, a %1. @@ -2571,7 +2572,7 @@ Output: <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/>Grazie a: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg e al <a href="https://www.transifex.com/calamares/calamares/">team dei traduttori di Calamares</a>.<br/><br/>Lo sviluppo di<a href="https://calamares.io/">Calamares</a> è sponsorizzato da <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. diff --git a/lang/calamares_pl.ts b/lang/calamares_pl.ts index ea5512300..65c0343f0 100644 --- a/lang/calamares_pl.ts +++ b/lang/calamares_pl.ts @@ -490,7 +490,7 @@ Instalator zostanie zamknięty i wszystkie zmiany zostaną utracone. The command needs to know the user's name, but no username is defined. - + Polecenie musi znać nazwę użytkownika, ale żadna nazwa nie została jeszcze zdefiniowana. @@ -1816,17 +1816,17 @@ Instalator zostanie zamknięty i wszystkie zmiany zostaną utracone. Saving files for later ... - + Zapisywanie plików na później ... No files configured to save for later. - + Nie skonfigurowano żadnych plików do zapisania na później. Not all of the configured files could be preserved. - + Nie wszystkie pliki konfiguracyjne mogą być zachowane. From 8acb88ed4dd1e82e2abd5f4a60821d9b9f9f6561 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Mon, 4 Jun 2018 08:21:58 -0400 Subject: [PATCH 11/50] i18n: [desktop] Automatic merge of Transifex translations --- calamares.desktop | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/calamares.desktop b/calamares.desktop index caba57a7e..f8be5d1f3 100644 --- a/calamares.desktop +++ b/calamares.desktop @@ -92,9 +92,9 @@ GenericName[lt]=Sistemos diegimas į kompiuterį Comment[lt]=Calamares — Sistemos diegimo programa Name[lt]=Įdiegti Sistemą Icon[it_IT]=calamares -GenericName[it_IT]=Programma di installazione -Comment[it_IT]=Calamares — Installare il Sistema -Name[it_IT]=Installa il Sistema +GenericName[it_IT]=Programma d'installazione del sistema +Comment[it_IT]=Calamares — Programma d'installazione del sistema +Name[it_IT]=Installa il sistema Icon[nb]=calamares GenericName[nb]=Systeminstallatør Comment[nb]=Calamares-systeminstallatør From 54515688f7afa87592376e4e8d439b5e9cb43d8f Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Mon, 4 Jun 2018 08:21:59 -0400 Subject: [PATCH 12/50] i18n: [dummypythonqt] Automatic merge of Transifex translations --- .../lang/it_IT/LC_MESSAGES/dummypythonqt.mo | Bin 970 -> 979 bytes .../lang/it_IT/LC_MESSAGES/dummypythonqt.po | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/dummypythonqt/lang/it_IT/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/it_IT/LC_MESSAGES/dummypythonqt.mo index 14d83f4892241afb32aee1a8c69b5ee5b3c93ee7..2c001df40a95891aa1c484f764d780697ee2e759 100644 GIT binary patch delta 141 zcmX@bewlqji0O7l28IM67Gz*xkYHwDFaXk8K$;s!M+0doAe|1RMS*k^khTKSGd6Z= zFbY`c8kp)DStuBoSecsZ8kkHz$Y`SzoLH7xl$oz!Qw(9~B^4#+B_}2)XXZPk=O$+6 b=q2ap+UY1585o*vR$vNXWK5e}$Q%g(2gn~} delta 132 zcmcc2eu{lUi0L{;28IM67Gz*x;AduFFaXkuK$;s!2LWj*ARPy!MS*lBkhTKS{Tn+q z7zNCA4UKe-3>6H`tV~R_4GbqAWVBKCO)N^zSBTP6u*uELORO?8GjmAKP0Y;EOU}== W(@`)oFf`w+$rQlI=r*~EIT8Sxwi;Cc diff --git a/src/modules/dummypythonqt/lang/it_IT/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/it_IT/LC_MESSAGES/dummypythonqt.po index 02dec56cb..6b22b4b65 100644 --- a/src/modules/dummypythonqt/lang/it_IT/LC_MESSAGES/dummypythonqt.po +++ b/src/modules/dummypythonqt/lang/it_IT/LC_MESSAGES/dummypythonqt.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-12-21 16:44+0100\n" +"POT-Creation-Date: 2018-05-28 04:57-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Marco Z. , 2017\n" +"Last-Translator: Saverio , 2016\n" "Language-Team: Italian (Italy) (https://www.transifex.com/calamares/teams/20061/it_IT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,7 +28,7 @@ msgstr "Una nuova QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" -msgstr "PythonQt ViewStep Fittizio" +msgstr "PythonQt ViewStep fittizio" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" From 430ca800f7454f341375c78f96494c4492a45cb6 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Mon, 4 Jun 2018 08:21:59 -0400 Subject: [PATCH 13/50] i18n: [python] Automatic merge of Transifex translations --- lang/python/it_IT/LC_MESSAGES/python.mo | Bin 1162 -> 1173 bytes lang/python/it_IT/LC_MESSAGES/python.po | 14 +++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lang/python/it_IT/LC_MESSAGES/python.mo b/lang/python/it_IT/LC_MESSAGES/python.mo index 2407dbe213cb18d12278dc8098376a97dc9363bb..9aee6696ec0bbaacade9577ec1c0e5ad4d389a30 100644 GIT binary patch delta 254 zcmeC;oXR;N#dRek1H*M77GYpuXk=z!5C_uJfV2>hUI(Owf%HKjZ40EY0%;>4EzH8e zU;(7vfV3!(uHU%wG^1QVW@<@MzJgm(VqS7;aWasVpI4HYm#Cv)WMF7Mc{0;`W3T)q zg@VeGjQl)>w9Jx{%&N?MJ%#{?KygWGfkJgHT!O(pH7~U&ak2oT$mGM!`r1IXd8rC1 znF^{Jd8N6UDGCLN$;lb1KvVP>TyqkW@{1CoN>V3_usCq$!!%5eW|0z5$OIakld4c$ K3A86yj{yLesz*lv delta 174 zcmbQr*~K{_#dQ@U1H*M77Gz*xXkuny5CPItfV2>hUJ0ayf%G0AZ2_b&0BJoS&B?;R zUSaQa(;Y4VsffOZgHMoa(=Fzj)IYap~d7$Oz$T? z)SbMA*_k;nC4cgNW@#26tuR@M#euyvzbq9bn9U+3nx3ASuaJ_OqmY)Fld4c$SzMBu G%K!iuXe-hH diff --git a/lang/python/it_IT/LC_MESSAGES/python.po b/lang/python/it_IT/LC_MESSAGES/python.po index 24100878d..0ad2a26ed 100644 --- a/lang/python/it_IT/LC_MESSAGES/python.po +++ b/lang/python/it_IT/LC_MESSAGES/python.po @@ -10,7 +10,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-05-28 04:57-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Mark , 2018\n" +"Last-Translator: Pietro Francesco Fontana, 2017\n" "Language-Team: Italian (Italy) (https://www.transifex.com/calamares/teams/20061/it_IT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,15 +20,15 @@ msgstr "" #: src/modules/umount/main.py:40 msgid "Unmount file systems." -msgstr "Smontaggio del file system" +msgstr "Smonta i file system." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." -msgstr "Dummy python job." +msgstr "Job python fittizio." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" -msgstr "Dummy python step {}" +msgstr "Python step {} fittizio" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." @@ -37,7 +37,7 @@ msgstr "Genera machine-id." #: src/modules/packages/main.py:61 #, python-format msgid "Processing packages (%(count)d / %(total)d)" -msgstr "Elaborando i pacchetti (%(count)d / %(total)d)" +msgstr "Elaborazione dei pacchetti (%(count)d / %(total)d)" #: src/modules/packages/main.py:63 src/modules/packages/main.py:73 msgid "Install packages." @@ -48,11 +48,11 @@ msgstr "Installa pacchetti." msgid "Installing one package." msgid_plural "Installing %(num)d packages." msgstr[0] "Installando un pacchetto." -msgstr[1] "Installando %(num)d pacchetti." +msgstr[1] "Installazione di %(num)d pacchetti." #: src/modules/packages/main.py:69 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." msgstr[0] "Rimuovendo un pacchetto." -msgstr[1] "Rimuovendo %(num)d pacchetti." +msgstr[1] "Rimozione di %(num)d pacchetti." From 91a5ec426d57aa1724fd7ca0e4faa4e0eb14c426 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 7 Jun 2018 13:16:57 +0200 Subject: [PATCH 15/50] CMake: shuffle the top-level CMakeLists - Put all the options near the top, easy to spot when reading the file - Put the settings that need regular updates, like version, near the top - Add some "section headers" --- CMakeLists.txt | 61 +++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e7ca237f..2de3d661a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,12 +33,33 @@ project( calamares C CXX ) cmake_minimum_required( VERSION 3.2 ) -set( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeModules" ) -set( CMAKE_CXX_STANDARD 14 ) -set( CMAKE_CXX_STANDARD_REQUIRED ON ) -set( CMAKE_C_STANDARD 99 ) -set( CMAKE_C_STANDARD_REQUIRED ON ) +### OPTIONS +# +option( INSTALL_CONFIG "Install configuration files" ON ) +option( BUILD_TESTING "Build the testing tree." ON ) +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 ) + + +### Calamares application info +# +set( CALAMARES_ORGANIZATION_NAME "Calamares" ) +set( CALAMARES_ORGANIZATION_DOMAIN "github.com/calamares" ) +set( CALAMARES_APPLICATION_NAME "Calamares" ) +set( CALAMARES_DESCRIPTION_SUMMARY + "The distribution-independent installer framework" ) + +set( CALAMARES_VERSION_MAJOR 3 ) +set( CALAMARES_VERSION_MINOR 2 ) +set( CALAMARES_VERSION_PATCH 0 ) +set( CALAMARES_VERSION_RC 0 ) + + +### CMAKE SETUP +# +set( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeModules" ) # CMake 3.9, 3.10 compatibility if( POLICY CMP0071 ) @@ -52,8 +73,15 @@ if(NOT CMAKE_VERSION VERSION_LESS "3.10.0") ) endif() - set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall" ) +### C++ SETUP +# +set( CMAKE_CXX_STANDARD 14 ) +set( CMAKE_CXX_STANDARD_REQUIRED ON ) +set( CMAKE_C_STANDARD 99 ) +set( CMAKE_C_STANDARD_REQUIRED ON ) + +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." ) set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall" ) @@ -139,12 +167,6 @@ if( ECM_FOUND ) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH}) endif() -option( INSTALL_CONFIG "Install configuration files" ON ) -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 ) -option( BUILD_TESTING "Build the testing tree." ON ) - find_package( KF5 COMPONENTS CoreAddons Crash ) if( NOT KF5Crash_FOUND ) set( WITH_KF5Crash OFF ) @@ -245,23 +267,10 @@ endif() unset( prev_tx ) unset( curr_tx ) -add_subdirectory( lang ) # i18n tools - -### -### Calamares application info -### -set( CALAMARES_ORGANIZATION_NAME "Calamares" ) -set( CALAMARES_ORGANIZATION_DOMAIN "github.com/calamares" ) -set( CALAMARES_APPLICATION_NAME "Calamares" ) -set( CALAMARES_DESCRIPTION_SUMMARY "The distribution-independent installer framework" ) set( CALAMARES_TRANSLATION_LANGUAGES en ${_tx_complete} ${_tx_good} ${_tx_ok} ) list( SORT CALAMARES_TRANSLATION_LANGUAGES ) -### Bump version here -set( CALAMARES_VERSION_MAJOR 3 ) -set( CALAMARES_VERSION_MINOR 2 ) -set( CALAMARES_VERSION_PATCH 0 ) -set( CALAMARES_VERSION_RC 0 ) +add_subdirectory( lang ) # i18n tools set( CALAMARES_VERSION ${CALAMARES_VERSION_MAJOR}.${CALAMARES_VERSION_MINOR}.${CALAMARES_VERSION_PATCH} ) set( CALAMARES_VERSION_SHORT "${CALAMARES_VERSION}" ) From fc979404d1e8e443f7820e0efcfbbea023442219 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 7 Jun 2018 13:26:22 +0200 Subject: [PATCH 16/50] CMake: move translation settings up - Follow previous move of user-adaptable settings and regularly-updated variables to the top of CMakeLists.txt with a move of the list of translated languages. --- CMakeLists.txt | 60 ++++++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2de3d661a..73af6b201 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,37 @@ set( CALAMARES_VERSION_PATCH 0 ) set( CALAMARES_VERSION_RC 0 ) +### Transifex (languages) info +# +# complete = 100% translated, +# good = nearly complete (use own judgement, right now >= 75%) +# ok = incomplete (more than 25% untranslated), +# bad = 0% translated, placeholder in tx; these are not included. +# +# Language en (source language) is added later. It isn't listed in +# Transifex either. Get the list of languages and their status +# from https://transifex.com/calamares/calamares/ . +# +# When adding a new language, take care that it is properly loaded +# by the translation framework. Languages with alternate scripts +# (sr@latin in particular) may need special handling in CalamaresUtils.cpp. +# +# TODO: drop the es_ES translation from Transifex +# TODO: move eo (Esperanto) to _ok once Qt can actually create a +# locale for it. +# +# NOTE: when updating the list from Transifex, copy these four lines +# and prefix each variable name with "p", so that the automatic +# 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 da pt_PT ro tr_TR zh_TW zh_CN pt_BR fr hr ca lt id cs_CZ ) +set( _tx_good sq es pl ja sk it_IT hu ru he de nl bg uk ) +set( _tx_ok ast is ar sv el es_MX gl en_GB th fi_FI hi eu sr nb + sl sr@latin mr es_PR kk kn et be ) +set( _tx_bad uz lo ur gu fr_CH fa eo ) + + ### CMAKE SETUP # set( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeModules" ) @@ -211,33 +242,10 @@ endif() ### Transifex Translation status # -# complete = 100% translated, -# good = nearly complete (use own judgement, right now >= 75%) -# ok = incomplete (more than 25% untranslated), -# bad = 0% translated, placeholder in tx; these are not included. +# Construct language lists for use. If there are p_tx* variables, +# then run an extra cmake-time check for consistency of the old +# (p_tx*) and new (_tx*) lists. # -# Language en (source language) is added later. It isn't listed in -# Transifex either. Get the list of languages and their status -# from https://transifex.com/calamares/calamares/ . -# -# When adding a new language, take care that it is properly loaded -# by the translation framework. Languages with alternate scripts -# (sr@latin in particular) may need special handling in CalamaresUtils.cpp. -# -# TODO: drop the es_ES translation from Transifex -# TODO: move eo (Esperanto) to _ok once Qt can actually create a -# locale for it. -# -# NOTE: when updating the list from Transifex, copy these four lines -# and prefix each variable name with "p", so that the automatic -# checks for new languages and misspelled ones are done. -set( _tx_complete da pt_PT ro tr_TR zh_TW zh_CN pt_BR fr hr ca lt id cs_CZ ) -set( _tx_good sq es pl ja sk it_IT hu ru he de nl bg uk ) -set( _tx_ok ast is ar sv el es_MX gl en_GB th fi_FI hi eu sr nb - sl sr@latin mr es_PR kk kn et be ) -set( _tx_bad uz lo ur gu fr_CH fa eo ) - -# check translation update 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} ) if ( prev_tx ) From 15b97f8e3f330b5548c365dbedd84d3059e32a1b Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 7 Jun 2018 13:31:12 +0200 Subject: [PATCH 17/50] [libcalamares] Add missing include-dir - Fix build on FreeBSD, where the yaml-cpp headers don't live in any normally-searched include directory. --- src/libcalamares/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libcalamares/CMakeLists.txt b/src/libcalamares/CMakeLists.txt index cbc049ac6..598d3c313 100644 --- a/src/libcalamares/CMakeLists.txt +++ b/src/libcalamares/CMakeLists.txt @@ -40,6 +40,7 @@ mark_thirdparty_code( ${kdsagSources} ) include_directories( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} + ${YAMLCPP_INCLUDE_DIR} ) if( WITH_PYTHON ) From dfd76ed384f617856870e361759e088f97cc8331 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 7 Jun 2018 13:34:15 +0200 Subject: [PATCH 18/50] CMake: drop unused variable (no thirdparty/ dir anymore) --- CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 73af6b201..1c393a675 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -329,7 +329,6 @@ configure_file( set( CALAMARES_CMAKE_DIR "${CMAKE_SOURCE_DIR}/CMakeModules" ) set( CALAMARES_LIBRARIES calamares ) -set( THIRDPARTY_DIR "${CMAKE_SOURCE_DIR}/thirdparty" ) ### Example Distro # @@ -382,7 +381,6 @@ endif() # "http://tldp.org/HOWTO/SquashFS-HOWTO/creatingandusing.html" add_feature_info( ExampleDistro ${mksquashfs_FOUND} "Create example-distro target.") -# add_subdirectory( thirdparty ) add_subdirectory( src ) add_feature_info(Python ${WITH_PYTHON} "Python job modules") From fd2afc3ba9e1058b9ee284a49f1a2d60a70d52b5 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 7 Jun 2018 13:39:28 +0200 Subject: [PATCH 19/50] CMake: move dependency-versioning info to top --- CMakeLists.txt | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c393a675..66550a13e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,6 +88,16 @@ set( _tx_ok ast is ar sv el es_MX gl en_GB th fi_FI hi eu sr nb set( _tx_bad uz lo ur gu fr_CH fa eo ) +### Required versions +# +# See DEPENDENCIES section below. +set( QT_VERSION 5.6.0 ) +set( YAMLCPP_VERSION 0.5.1 ) +set( ECM_VERSION 5.18 ) +set( PYTHONLIBS_VERSION 3.3 ) +set( BOOSTPYTHON_VERSION 1.54.0 ) + + ### CMAKE SETUP # set( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeModules" ) @@ -182,17 +192,17 @@ endif() include( FeatureSummary ) include( CMakeColors ) -set( QT_VERSION 5.6.0 ) +### DEPENDENCIES +# find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED Core Gui Widgets LinguistTools Svg Quick QuickWidgets ) -find_package( YAMLCPP 0.5.1 REQUIRED ) +find_package( YAMLCPP ${YAMLCPP_VERSION} REQUIRED ) find_package( PolkitQt5-1 REQUIRED ) # Find ECM once, and add it to the module search path; Calamares # modules that need ECM can do # find_package(ECM ${ECM_VERSION} REQUIRED NO_MODULE), # no need to mess with the module path after. -set( ECM_VERSION 5.18 ) find_package(ECM ${ECM_VERSION} NO_MODULE) if( ECM_FOUND ) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH}) @@ -207,7 +217,7 @@ if( BUILD_TESTING ) enable_testing() endif () -find_package( PythonLibs 3.3 ) +find_package( PythonLibs ${PYTHONLIBS_VERSION} ) set_package_properties( PythonLibs PROPERTIES DESCRIPTION "C interface libraries for the Python 3 interpreter." @@ -217,7 +227,7 @@ set_package_properties( if ( PYTHONLIBS_FOUND ) include( BoostPython3 ) - find_boost_python3( 1.54.0 ${PYTHONLIBS_VERSION_STRING} CALAMARES_BOOST_PYTHON3_FOUND ) + find_boost_python3( ${BOOSTPYTHON_VERSION} ${PYTHONLIBS_VERSION_STRING} CALAMARES_BOOST_PYTHON3_FOUND ) set_package_properties( Boost PROPERTIES PURPOSE "Boost.Python is used for Python job modules." From e52c99685d1165ea8de0ae532c636860e7868cf9 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 7 Jun 2018 13:43:44 +0200 Subject: [PATCH 20/50] CMake: untangle more sections of top-level CMakeLists.txt --- CMakeLists.txt | 119 ++++++++++++++++++++++++++----------------------- 1 file changed, 62 insertions(+), 57 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 66550a13e..4d4a24550 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -290,55 +290,6 @@ list( SORT CALAMARES_TRANSLATION_LANGUAGES ) add_subdirectory( lang ) # i18n tools -set( CALAMARES_VERSION ${CALAMARES_VERSION_MAJOR}.${CALAMARES_VERSION_MINOR}.${CALAMARES_VERSION_PATCH} ) -set( CALAMARES_VERSION_SHORT "${CALAMARES_VERSION}" ) -if( CALAMARES_VERSION_RC ) - set( CALAMARES_VERSION ${CALAMARES_VERSION}rc${CALAMARES_VERSION_RC} ) -endif() - -# additional info for non-release builds -if( NOT BUILD_RELEASE AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git/" ) - include( CMakeDateStamp ) - set( CALAMARES_VERSION_DATE "${CMAKE_DATESTAMP_YEAR}${CMAKE_DATESTAMP_MONTH}${CMAKE_DATESTAMP_DAY}" ) - if( CALAMARES_VERSION_DATE GREATER 0 ) - set( CALAMARES_VERSION ${CALAMARES_VERSION}.${CALAMARES_VERSION_DATE} ) - endif() - - include( CMakeVersionSource ) - if( CMAKE_VERSION_SOURCE ) - set( CALAMARES_VERSION ${CALAMARES_VERSION}-${CMAKE_VERSION_SOURCE} ) - endif() -endif() - -# enforce using constBegin, constEnd for const-iterators -add_definitions( "-DQT_STRICT_ITERATORS" ) - -# set paths -set( CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" ) -set( CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" ) -set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" ) - -# Better default installation paths: GNUInstallDirs defines -# CMAKE_INSTALL_FULL_SYSCONFDIR to be CMAKE_INSTALL_PREFIX/etc by default -# but we really want /etc -if( NOT DEFINED CMAKE_INSTALL_SYSCONFDIR ) - set( CMAKE_INSTALL_SYSCONFDIR "/etc" ) -endif() - -# make predefined install dirs available everywhere -include( GNUInstallDirs ) - -# make uninstall support -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" - IMMEDIATE @ONLY -) - -# Early configure these files as we need them later on -set( CALAMARES_CMAKE_DIR "${CMAKE_SOURCE_DIR}/CMakeModules" ) -set( CALAMARES_LIBRARIES calamares ) - ### Example Distro # @@ -391,6 +342,58 @@ endif() # "http://tldp.org/HOWTO/SquashFS-HOWTO/creatingandusing.html" add_feature_info( ExampleDistro ${mksquashfs_FOUND} "Create example-distro target.") + +### CALAMARES PROPER +# +set( CALAMARES_VERSION ${CALAMARES_VERSION_MAJOR}.${CALAMARES_VERSION_MINOR}.${CALAMARES_VERSION_PATCH} ) +set( CALAMARES_VERSION_SHORT "${CALAMARES_VERSION}" ) +if( CALAMARES_VERSION_RC ) + set( CALAMARES_VERSION ${CALAMARES_VERSION}rc${CALAMARES_VERSION_RC} ) +endif() + +# additional info for non-release builds +if( NOT BUILD_RELEASE AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git/" ) + include( CMakeDateStamp ) + set( CALAMARES_VERSION_DATE "${CMAKE_DATESTAMP_YEAR}${CMAKE_DATESTAMP_MONTH}${CMAKE_DATESTAMP_DAY}" ) + if( CALAMARES_VERSION_DATE GREATER 0 ) + set( CALAMARES_VERSION ${CALAMARES_VERSION}.${CALAMARES_VERSION_DATE} ) + endif() + + include( CMakeVersionSource ) + if( CMAKE_VERSION_SOURCE ) + set( CALAMARES_VERSION ${CALAMARES_VERSION}-${CMAKE_VERSION_SOURCE} ) + endif() +endif() + +# enforce using constBegin, constEnd for const-iterators +add_definitions( "-DQT_STRICT_ITERATORS" ) + +# set paths +set( CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" ) +set( CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" ) +set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" ) + +# Better default installation paths: GNUInstallDirs defines +# CMAKE_INSTALL_FULL_SYSCONFDIR to be CMAKE_INSTALL_PREFIX/etc by default +# but we really want /etc +if( NOT DEFINED CMAKE_INSTALL_SYSCONFDIR ) + set( CMAKE_INSTALL_SYSCONFDIR "/etc" ) +endif() + +# make predefined install dirs available everywhere +include( GNUInstallDirs ) + +# make uninstall support +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + IMMEDIATE @ONLY +) + +# Early configure these files as we need them later on +set( CALAMARES_CMAKE_DIR "${CMAKE_SOURCE_DIR}/CMakeModules" ) +set( CALAMARES_LIBRARIES calamares ) + add_subdirectory( src ) add_feature_info(Python ${WITH_PYTHON} "Python job modules") @@ -398,14 +401,6 @@ add_feature_info(PythonQt ${WITH_PYTHONQT} "Python view modules") add_feature_info(Config ${INSTALL_CONFIG} "Install Calamares configuration") add_feature_info(KCrash ${WITH_KF5Crash} "Crash dumps via KCrash") -feature_summary(WHAT ALL) - -get_directory_property( SKIPPED_MODULES - DIRECTORY src/modules - DEFINITION LIST_SKIPPED_MODULES -) -calamares_explain_skipped_modules( ${SKIPPED_MODULES} ) - # Add all targets to the build-tree export set set( CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/Calamares" CACHE PATH "Installation directory for CMake files" ) set( CMAKE_INSTALL_FULL_CMAKEDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_CMAKEDIR}" ) @@ -490,3 +485,13 @@ configure_file( add_custom_target( uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake ) + +### CMAKE SUMMARY REPORT +# +feature_summary(WHAT ALL) + +get_directory_property( SKIPPED_MODULES + DIRECTORY src/modules + DEFINITION LIST_SKIPPED_MODULES +) +calamares_explain_skipped_modules( ${SKIPPED_MODULES} ) From 52f2161c35d84b921681649d2a1e4f49c8d7a914 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 7 Jun 2018 14:17:43 +0200 Subject: [PATCH 21/50] CMake: make polkit-qt5-1 optional - This is only found in order to know where polkit files should be installed. In distro's that don't use polkit, may as well make it entirely optional. --- CMakeLists.txt | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d4a24550..c33ad8e6f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,6 +37,7 @@ cmake_minimum_required( VERSION 3.2 ) ### OPTIONS # option( INSTALL_CONFIG "Install configuration files" ON ) +option( INSTALL_POLKIT "Install Polkit configuration" ON ) option( BUILD_TESTING "Build the testing tree." ON ) option( WITH_PYTHON "Enable Python modules API (requires Boost.Python)." ON ) option( WITH_PYTHONQT "Enable next generation Python modules API (experimental, requires PythonQt)." ON ) @@ -197,7 +198,18 @@ include( CMakeColors ) # find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED Core Gui Widgets LinguistTools Svg Quick QuickWidgets ) find_package( YAMLCPP ${YAMLCPP_VERSION} REQUIRED ) -find_package( PolkitQt5-1 REQUIRED ) +if( INSTALL_POLKIT ) + find_package( PolkitQt5-1 REQUIRED ) +else() + # Find it anyway, for dependencies-reporting + find_package( PolkitQt5-1 ) +endif() +set_package_properties( + PolkitQt5-1 PROPERTIES + DESCRIPTION "Qt5 support for Polkit" + URL "https://cgit.kde.org/polkit-qt-1.git" + PURPOSE "PolkitQt5-1 helps with installing Polkit configuration" +) # Find ECM once, and add it to the module search path; Calamares # modules that need ECM can do @@ -454,12 +466,14 @@ if( INSTALL_CONFIG ) ) endif() -install( - FILES - com.github.calamares.calamares.policy - DESTINATION - "${POLKITQT-1_POLICY_FILES_INSTALL_DIR}" -) +if( INSTALL_POLKIT ) + install( + FILES + com.github.calamares.calamares.policy + DESTINATION + "${POLKITQT-1_POLICY_FILES_INSTALL_DIR}" + ) +endif() install( FILES From 24b0df3c044eb8445d938c989bca365c8f6b21a0 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 7 Jun 2018 09:03:54 -0400 Subject: [PATCH 22/50] [locale] Missing includes - Implicitly included in recent Qt, but not in old versions Reported from Neptune Linux --- src/modules/locale/GeoIPTests.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/modules/locale/GeoIPTests.cpp b/src/modules/locale/GeoIPTests.cpp index 42779ede0..d9c0a5898 100644 --- a/src/modules/locale/GeoIPTests.cpp +++ b/src/modules/locale/GeoIPTests.cpp @@ -23,6 +23,10 @@ #include "GeoIPXML.h" #endif +#include +#include +#include + #include QTEST_GUILESS_MAIN( GeoIPTests ) From a626e52bf32cba3900a209e190d02992491e6ccd Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 8 Jun 2018 17:36:29 -0400 Subject: [PATCH 23/50] [libcalamares] Introduce more descriptive type name --- src/libcalamares/Settings.cpp | 2 +- src/libcalamares/Settings.h | 6 ++++-- src/libcalamaresui/modulesystem/ModuleManager.cpp | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libcalamares/Settings.cpp b/src/libcalamares/Settings.cpp index 732afa8d8..087822623 100644 --- a/src/libcalamares/Settings.cpp +++ b/src/libcalamares/Settings.cpp @@ -175,7 +175,7 @@ Settings::modulesSearchPaths() const } -QList > +Settings::InstanceDescriptionList Settings::customModuleInstances() const { return m_customModuleInstances; diff --git a/src/libcalamares/Settings.h b/src/libcalamares/Settings.h index 42720b986..35527243a 100644 --- a/src/libcalamares/Settings.h +++ b/src/libcalamares/Settings.h @@ -43,7 +43,9 @@ public: QStringList modulesSearchPaths() const; - QList< QMap< QString, QString > > customModuleInstances() const; + using InstanceDescription = QMap< QString, QString >; + using InstanceDescriptionList = QList< InstanceDescription >; + InstanceDescriptionList customModuleInstances() const; QList< QPair< ModuleAction, QStringList > > modulesSequence() const; @@ -60,7 +62,7 @@ private: QStringList m_modulesSearchPaths; - QList< QMap< QString, QString > > m_customModuleInstances; + InstanceDescriptionList m_customModuleInstances; QList< QPair< ModuleAction, QStringList > > m_modulesSequence; QString m_brandingComponentName; diff --git a/src/libcalamaresui/modulesystem/ModuleManager.cpp b/src/libcalamaresui/modulesystem/ModuleManager.cpp index 83273e924..df77c5602 100644 --- a/src/libcalamaresui/modulesystem/ModuleManager.cpp +++ b/src/libcalamaresui/modulesystem/ModuleManager.cpp @@ -159,7 +159,7 @@ ModuleManager::loadModules() { QTimer::singleShot( 0, this, [ this ]() { - QList< QMap< QString, QString > > customInstances = + Settings::InstanceDescriptionList customInstances = Settings::instance()->customModuleInstances(); const auto modulesSequence = Settings::instance()->modulesSequence(); From dccf6f16f5cec7d7ed94c4ffa028687c58cbfea5 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 8 Jun 2018 17:56:23 -0400 Subject: [PATCH 24/50] [libcalamaresui] Lambdas are fun, but not always the solution --- .../modulesystem/ModuleManager.cpp | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/libcalamaresui/modulesystem/ModuleManager.cpp b/src/libcalamaresui/modulesystem/ModuleManager.cpp index df77c5602..317ca884f 100644 --- a/src/libcalamaresui/modulesystem/ModuleManager.cpp +++ b/src/libcalamaresui/modulesystem/ModuleManager.cpp @@ -154,6 +154,26 @@ ModuleManager::moduleInstance( const QString& instanceKey ) } +/** + * @brief Search a list of instance descriptions for one matching @p module and @p id + * + * @return -1 on failure, otherwise index of the instance that matches. + */ +static int findCustomInstance( const Settings::InstanceDescriptionList& customInstances, + const QString& module, + const QString& id ) +{ + for ( int i = 0; i < customInstances.count(); ++i ) + { + const auto& thisInstance = customInstances[ i ]; + if ( thisInstance.value( "module" ) == module && + thisInstance.value( "id" ) == id ) + return i; + } + return -1; +} + + void ModuleManager::loadModules() { @@ -196,25 +216,11 @@ ModuleManager::loadModules() return; } - auto findCustomInstance = - [ customInstances ]( const QString& module, - const QString& id) -> int - { - for ( int i = 0; i < customInstances.count(); ++i ) - { - auto thisInstance = customInstances[ i ]; - if ( thisInstance.value( "module" ) == module && - thisInstance.value( "id" ) == id ) - return i; - } - return -1; - }; - if ( moduleName != instanceId ) //means this is a custom instance { - if ( findCustomInstance( moduleName, instanceId ) > -1 ) + if ( int found = findCustomInstance( customInstances, moduleName, instanceId ) > -1 ) { - configFileName = customInstances[ findCustomInstance( moduleName, instanceId ) ].value( "config" ); + configFileName = customInstances[ found ].value( "config" ); } else //ought to be a custom instance, but cannot find instance entry { From 1999e4e5c2839628a88ce4816b711af18e171a8c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 8 Jun 2018 18:14:51 -0400 Subject: [PATCH 25/50] [libcalamaresui] Error out consistently when module loading fails - Some module-loading failures were ignored and produce only a warning, instead of erroring out. --- .../modulesystem/ModuleManager.cpp | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/libcalamaresui/modulesystem/ModuleManager.cpp b/src/libcalamaresui/modulesystem/ModuleManager.cpp index 317ca884f..48a2c1476 100644 --- a/src/libcalamaresui/modulesystem/ModuleManager.cpp +++ b/src/libcalamaresui/modulesystem/ModuleManager.cpp @@ -177,6 +177,8 @@ static int findCustomInstance( const Settings::InstanceDescriptionList& customIn void ModuleManager::loadModules() { + static const char GOODBYE[] = "\nCalamares will now quit."; + QTimer::singleShot( 0, this, [ this ]() { Settings::InstanceDescriptionList customInstances = @@ -197,8 +199,8 @@ ModuleManager::loadModules() if ( moduleEntrySplit.length() < 1 || moduleEntrySplit.length() > 2 ) { - cError() << "Wrong module entry format for module" << moduleEntry << '.'; - cError() << "Calamares will now quit."; + cError() << "Wrong module entry format for module" << moduleEntry << '.' + << GOODBYE; qApp->exit( 1 ); return; } @@ -210,8 +212,8 @@ ModuleManager::loadModules() m_availableDescriptorsByModuleName.value( moduleName ).isEmpty() ) { cError() << "Module" << moduleName << "not found in module search paths." - << Logger::DebugList( m_paths ); - cError() << "Calamares will now quit."; + << Logger::DebugList( m_paths ) + << GOODBYE; qApp->exit( 1 ); return; } @@ -224,8 +226,8 @@ ModuleManager::loadModules() } else //ought to be a custom instance, but cannot find instance entry { - cError() << "Custom instance" << moduleEntry << "not found in custom instances section."; - cError() << "Calamares will now quit."; + cError() << "Custom instance" << moduleEntry << "not found in custom instances section." + << GOODBYE; qApp->exit( 1 ); return; } @@ -248,7 +250,7 @@ ModuleManager::loadModules() if ( thisModule && !thisModule->isLoaded() ) { cError() << "Module" << instanceKey << "exists but not loaded." - << "\nCalamares will now quit."; + << GOODBYE; qApp->exit( 1 ); return; } @@ -266,18 +268,18 @@ ModuleManager::loadModules() m_moduleDirectoriesByModuleName.value( moduleName ) ); if ( !thisModule ) { - cWarning() << "Module" << instanceKey << "cannot be created from descriptor."; - Q_ASSERT( thisModule ); - continue; + cError() << "Module" << instanceKey << "cannot be created from descriptor" << configFileName + << GOODBYE; + qApp->exit( 1 ); } // If it's a ViewModule, it also appends the ViewStep to the ViewManager. thisModule->loadSelf(); m_loadedModulesByInstanceKey.insert( instanceKey, thisModule ); if ( !thisModule->isLoaded() ) { - cWarning() << "Module" << moduleName << "loading FAILED"; - Q_ASSERT( thisModule->isLoaded() ); - continue; + cError() << "Module" << instanceKey << "loading FAILED" + << GOODBYE; + qApp->exit( 1 ); } } From a40c36ef493b6a5596515d9d288cc4c91e270834 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 11 Jun 2018 05:59:56 -0400 Subject: [PATCH 26/50] [libcalamaresui] Report on failed module loading - Collect the failed modules, instead of bailing out on the first one (this also prevents crashes caused by quit() called from a timer). - Introduce a slot to report on failed module loading (no UI yet). --- src/calamares/CalamaresApplication.cpp | 8 ++++++ src/calamares/CalamaresApplication.h | 1 + .../modulesystem/ModuleManager.cpp | 28 +++++++++++-------- .../modulesystem/ModuleManager.h | 3 +- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/calamares/CalamaresApplication.cpp b/src/calamares/CalamaresApplication.cpp index 2bb0af8df..2f61749b0 100644 --- a/src/calamares/CalamaresApplication.cpp +++ b/src/calamares/CalamaresApplication.cpp @@ -335,6 +335,8 @@ CalamaresApplication::initView() connect( m_moduleManager, &Calamares::ModuleManager::modulesLoaded, this, &CalamaresApplication::initViewSteps ); + connect( m_moduleManager, &Calamares::ModuleManager::modulesFailed, + this, &CalamaresApplication::initFailed ); m_moduleManager->loadModules(); @@ -356,6 +358,12 @@ CalamaresApplication::initViewSteps() cDebug() << "STARTUP: Window now visible and ProgressTreeView populated"; } +void +CalamaresApplication::initFailed(const QStringList& l) +{ + cError() << "STARTUP: failed modules are" << l; + m_mainwindow->show(); +} void CalamaresApplication::initJobQueue() diff --git a/src/calamares/CalamaresApplication.h b/src/calamares/CalamaresApplication.h index 3cfd4f79f..a588afcee 100644 --- a/src/calamares/CalamaresApplication.h +++ b/src/calamares/CalamaresApplication.h @@ -70,6 +70,7 @@ public: private slots: void initView(); void initViewSteps(); + void initFailed( const QStringList& l ); private: void initQmlPath(); diff --git a/src/libcalamaresui/modulesystem/ModuleManager.cpp b/src/libcalamaresui/modulesystem/ModuleManager.cpp index 48a2c1476..57a82994f 100644 --- a/src/libcalamaresui/modulesystem/ModuleManager.cpp +++ b/src/libcalamaresui/modulesystem/ModuleManager.cpp @@ -181,6 +181,7 @@ ModuleManager::loadModules() QTimer::singleShot( 0, this, [ this ]() { + QStringList failedModules; Settings::InstanceDescriptionList customInstances = Settings::instance()->customModuleInstances(); @@ -201,8 +202,8 @@ ModuleManager::loadModules() { cError() << "Wrong module entry format for module" << moduleEntry << '.' << GOODBYE; - qApp->exit( 1 ); - return; + failedModules.append( moduleEntry ); + continue; } moduleName = moduleEntrySplit.first(); instanceId = moduleEntrySplit.last(); @@ -214,8 +215,8 @@ ModuleManager::loadModules() cError() << "Module" << moduleName << "not found in module search paths." << Logger::DebugList( m_paths ) << GOODBYE; - qApp->exit( 1 ); - return; + failedModules.append( moduleName ); + continue; } if ( moduleName != instanceId ) //means this is a custom instance @@ -228,8 +229,8 @@ ModuleManager::loadModules() { cError() << "Custom instance" << moduleEntry << "not found in custom instances section." << GOODBYE; - qApp->exit( 1 ); - return; + failedModules.append( moduleEntry ); + continue; } } @@ -251,8 +252,8 @@ ModuleManager::loadModules() { cError() << "Module" << instanceKey << "exists but not loaded." << GOODBYE; - qApp->exit( 1 ); - return; + failedModules.append( instanceKey ); + continue; } if ( thisModule && thisModule->isLoaded() ) @@ -270,7 +271,8 @@ ModuleManager::loadModules() { cError() << "Module" << instanceKey << "cannot be created from descriptor" << configFileName << GOODBYE; - qApp->exit( 1 ); + failedModules.append( instanceKey ); + continue; } // If it's a ViewModule, it also appends the ViewStep to the ViewManager. thisModule->loadSelf(); @@ -279,7 +281,8 @@ ModuleManager::loadModules() { cError() << "Module" << instanceKey << "loading FAILED" << GOODBYE; - qApp->exit( 1 ); + failedModules.append( instanceKey ); + continue; } } @@ -300,7 +303,10 @@ ModuleManager::loadModules() } } } - emit modulesLoaded(); + if ( !failedModules.isEmpty() ) + emit modulesFailed( failedModules ); + else + emit modulesLoaded(); } ); } diff --git a/src/libcalamaresui/modulesystem/ModuleManager.h b/src/libcalamaresui/modulesystem/ModuleManager.h index ed7700c40..e1763d93c 100644 --- a/src/libcalamaresui/modulesystem/ModuleManager.h +++ b/src/libcalamaresui/modulesystem/ModuleManager.h @@ -82,7 +82,8 @@ public: signals: void initDone(); - void modulesLoaded(); + void modulesLoaded(); /// All of the modules were loaded successfully + void modulesFailed( QStringList ); /// .. or not private slots: void doInit(); From 49622a6a3079172b8ba86f9be0e4f3f6d4819ba2 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 11 Jun 2018 06:28:31 -0400 Subject: [PATCH 27/50] Tests: expand test-application test_conf - Add -v (verbose) and -b (load via bytearray) - Verbose prints the keys read from the file, - Bytes reads via an indirection through QByteArray, like Settings does --- src/modules/CMakeLists.txt | 2 +- src/modules/test_conf.cpp | 55 +++++++++++++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/modules/CMakeLists.txt b/src/modules/CMakeLists.txt index 7f93c555a..514d6b4f6 100644 --- a/src/modules/CMakeLists.txt +++ b/src/modules/CMakeLists.txt @@ -6,7 +6,7 @@ set( LIST_SKIPPED_MODULES "" ) if( BUILD_TESTING ) add_executable( test_conf test_conf.cpp ) - target_link_libraries( test_conf ${YAMLCPP_LIBRARY} ) + target_link_libraries( test_conf ${YAMLCPP_LIBRARY} Qt5::Core ) target_include_directories( test_conf PUBLIC ${YAMLCPP_INCLUDE_DIR} ) endif() diff --git a/src/modules/test_conf.cpp b/src/modules/test_conf.cpp index 7ef557a3c..082f626c8 100644 --- a/src/modules/test_conf.cpp +++ b/src/modules/test_conf.cpp @@ -21,43 +21,86 @@ * shipped with each module for correctness -- well, for parseability. */ +#include +#include + #include + #include +#include +#include + using std::cerr; +static const char usage[] = "Usage: test_conf [-v] [-b] ...\n"; + int main(int argc, char** argv) { - if (argc != 2) + bool verbose = false; + bool bytes = false; + + int opt; + while ((opt = getopt(argc, argv, "vb")) != -1) { + switch (opt) { + case 'v': + verbose = true; + break; + case 'b': + bytes = true; + break; + default: /* '?' */ + cerr << usage; + return 1; + } + } + + if ( optind >= argc ) { - cerr << "Usage: test_conf \n"; + cerr << usage; return 1; } + const char* filename = argv[optind]; try { - YAML::Node doc = YAML::LoadFile( argv[1] ); + YAML::Node doc; + if ( bytes ) + { + QFile f( filename ); + if ( f.open( QFile::ReadOnly | QFile::Text ) ) + doc = YAML::Load( f.readAll().constData() ); + } + else + doc = YAML::LoadFile( filename ); if ( doc.IsNull() ) { // Special case: empty config files are valid, // but aren't a map. For the example configs, // this is still an error. - cerr << "WARNING:" << argv[1] << '\n'; + cerr << "WARNING:" << filename << '\n'; cerr << "WARNING: empty YAML\n"; return 1; } if ( !doc.IsMap() ) { - cerr << "WARNING:" << argv[1] << '\n'; + cerr << "WARNING:" << filename << '\n'; cerr << "WARNING: not-a-YAML-map\n"; return 1; } + + if ( verbose ) + { + cerr << "Keys:\n"; + for ( auto i = doc.begin(); i != doc.end(); ++i ) + cerr << i->first.as() << '\n'; + } } catch ( YAML::Exception& e ) { - cerr << "WARNING:" << argv[1] << '\n'; + cerr << "WARNING:" << filename << '\n'; cerr << "WARNING: YAML parser error " << e.what() << '\n'; return 1; } From a732ce11bcf60c6c9ac978200d0bab0e0081cd45 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 11 Jun 2018 08:33:47 -0400 Subject: [PATCH 28/50] [libcalamares] Warn more about badly-formed config --- src/libcalamares/Settings.cpp | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/libcalamares/Settings.cpp b/src/libcalamares/Settings.cpp index 087822623..bc645ab39 100644 --- a/src/libcalamares/Settings.cpp +++ b/src/libcalamares/Settings.cpp @@ -30,6 +30,32 @@ #include +/** Helper function to grab a QString out of the config, and to warn if not present. */ +static QString +requireString( const YAML::Node& config, const char* key ) +{ + if ( config[ key ] ) + return QString::fromStdString( config[ key ].as< std::string >() ); + else + { + cWarning() << "Required settings.conf key" << key << "is missing."; + return QString(); + } +} + +/** Helper function to grab a bool out of the config, and to warn if not present. */ +static bool +requireBool( const YAML::Node& config, const char* key, bool d ) +{ + if ( config[ key ] ) + return config[ key ].as< bool >(); + else + { + cWarning() << "Required settings.conf key" << key << "is missing."; + return d; + } +} + namespace Calamares { @@ -41,7 +67,6 @@ Settings::instance() return s_instance; } - Settings::Settings( const QString& settingsFilePath, bool debugMode, QObject* parent ) @@ -148,11 +173,9 @@ Settings::Settings( const QString& settingsFilePath, } } - m_brandingComponentName = QString::fromStdString( config[ "branding" ] - .as< std::string >() ); - m_promptInstall = config[ "prompt-install" ].as< bool >(); - - m_doChroot = config[ "dont-chroot" ] ? !config[ "dont-chroot" ].as< bool >() : true; + m_brandingComponentName = requireString( config, "branding" ); + m_promptInstall = requireBool( config, "prompt-install", false ); + m_doChroot = requireBool( config, "dont-chroot", true ); } catch ( YAML::Exception& e ) { From 35124c149e493a1659eed73b6b29dc8ad6d9e5e2 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 11 Jun 2018 13:35:12 -0400 Subject: [PATCH 29/50] [libcalamaresui] Drop the 'goodbye' message --- .../modulesystem/ModuleManager.cpp | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/libcalamaresui/modulesystem/ModuleManager.cpp b/src/libcalamaresui/modulesystem/ModuleManager.cpp index 57a82994f..194db65a2 100644 --- a/src/libcalamaresui/modulesystem/ModuleManager.cpp +++ b/src/libcalamaresui/modulesystem/ModuleManager.cpp @@ -177,8 +177,6 @@ static int findCustomInstance( const Settings::InstanceDescriptionList& customIn void ModuleManager::loadModules() { - static const char GOODBYE[] = "\nCalamares will now quit."; - QTimer::singleShot( 0, this, [ this ]() { QStringList failedModules; @@ -200,8 +198,7 @@ ModuleManager::loadModules() if ( moduleEntrySplit.length() < 1 || moduleEntrySplit.length() > 2 ) { - cError() << "Wrong module entry format for module" << moduleEntry << '.' - << GOODBYE; + cError() << "Wrong module entry format for module" << moduleEntry; failedModules.append( moduleEntry ); continue; } @@ -213,8 +210,7 @@ ModuleManager::loadModules() m_availableDescriptorsByModuleName.value( moduleName ).isEmpty() ) { cError() << "Module" << moduleName << "not found in module search paths." - << Logger::DebugList( m_paths ) - << GOODBYE; + << Logger::DebugList( m_paths ); failedModules.append( moduleName ); continue; } @@ -227,8 +223,7 @@ ModuleManager::loadModules() } else //ought to be a custom instance, but cannot find instance entry { - cError() << "Custom instance" << moduleEntry << "not found in custom instances section." - << GOODBYE; + cError() << "Custom instance" << moduleEntry << "not found in custom instances section."; failedModules.append( moduleEntry ); continue; } @@ -250,8 +245,7 @@ ModuleManager::loadModules() m_loadedModulesByInstanceKey.value( instanceKey, nullptr ); if ( thisModule && !thisModule->isLoaded() ) { - cError() << "Module" << instanceKey << "exists but not loaded." - << GOODBYE; + cError() << "Module" << instanceKey << "exists but not loaded."; failedModules.append( instanceKey ); continue; } @@ -269,8 +263,7 @@ ModuleManager::loadModules() m_moduleDirectoriesByModuleName.value( moduleName ) ); if ( !thisModule ) { - cError() << "Module" << instanceKey << "cannot be created from descriptor" << configFileName - << GOODBYE; + cError() << "Module" << instanceKey << "cannot be created from descriptor" << configFileName; failedModules.append( instanceKey ); continue; } @@ -279,8 +272,7 @@ ModuleManager::loadModules() m_loadedModulesByInstanceKey.insert( instanceKey, thisModule ); if ( !thisModule->isLoaded() ) { - cError() << "Module" << instanceKey << "loading FAILED" - << GOODBYE; + cError() << "Module" << instanceKey << "loading FAILED."; failedModules.append( instanceKey ); continue; } From d61b32aba65901236c00ff67db0df1b57ec0717c Mon Sep 17 00:00:00 2001 From: Raul Rodrigo Segura Date: Tue, 12 Jun 2018 13:44:28 +0200 Subject: [PATCH 30/50] Add configuration values into pythonqt modules --- src/libcalamaresui/modulesystem/PythonQtViewModule.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp b/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp index 486d9a8e2..d010f2200 100644 --- a/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp +++ b/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp @@ -95,6 +95,9 @@ PythonQtViewModule::loadSelf() s_utils = new ::Utils( Calamares::JobQueue::instance()->globalStorage() ); cala.addObject( "utils", s_utils ); + // Append configuration object, in module PythonQt.calamares + cala.addVariable("configuration",m_configurationMap); + // Basic stdout/stderr handling QObject::connect( PythonQt::self(), &PythonQt::pythonStdOut, []( const QString& message ) From 8b406cac9b57a8e5f535087ea743f2e8fde46c79 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 13 Jun 2018 04:37:52 -0400 Subject: [PATCH 31/50] [libcalamaresui] Improve module loading - Add a TODO for allowing modules to come from somewhere other than the module loader (this would allow "internal" modules that are always present) - Warnings are warnings --- src/libcalamaresui/modulesystem/ViewModule.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/libcalamaresui/modulesystem/ViewModule.cpp b/src/libcalamaresui/modulesystem/ViewModule.cpp index 1f940b30b..317d32712 100644 --- a/src/libcalamaresui/modulesystem/ViewModule.cpp +++ b/src/libcalamaresui/modulesystem/ViewModule.cpp @@ -52,27 +52,32 @@ ViewModule::loadSelf() PluginFactory* pf = qobject_cast< PluginFactory* >( m_loader->instance() ); if ( !pf ) { - cDebug() << Q_FUNC_INFO << "No factory:" << m_loader->errorString(); + cWarning() << Q_FUNC_INFO << "No factory:" << m_loader->errorString(); return; } m_viewStep = pf->create< Calamares::ViewStep >(); if ( !m_viewStep ) { - cDebug() << Q_FUNC_INFO << "create() failed" << m_loader->errorString(); + cWarning() << Q_FUNC_INFO << "create() failed" << m_loader->errorString(); return; } -// cDebug() << "ViewModule loading self for instance" << instanceKey() -// << "\nViewModule at address" << this -// << "\nCalamares::PluginFactory at address" << pf -// << "\nViewStep at address" << m_viewStep; + } + // TODO: allow internal view steps to be created here; they would + // have to be linked into the main application somehow. + + // If any method created the view step, use it now. + if ( m_viewStep ) + { m_viewStep->setModuleInstanceKey( instanceKey() ); m_viewStep->setConfigurationMap( m_configurationMap ); ViewManager::instance()->addViewStep( m_viewStep ); m_loaded = true; cDebug() << "ViewModule" << instanceKey() << "loading complete."; } + else + cWarning() << Q_FUNC_INFO << "No view step was created"; } From 3e24c3c58fce63ec223dc317fda8dc9b15e52aae Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 13 Jun 2018 19:31:00 +0200 Subject: [PATCH 32/50] [libcalamaresui] Provide standardised large font --- src/libcalamaresui/utils/CalamaresUtilsGui.cpp | 9 +++++++++ src/libcalamaresui/utils/CalamaresUtilsGui.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp index b05d4ea4f..3c59b0f89 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp @@ -226,6 +226,15 @@ defaultFont() } +QFont +largeFont() +{ + QFont f; + f.setPointSize( defaultFontSize() + 4 ); + return f; +} + + void setDefaultFontSize( int points ) { diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.h b/src/libcalamaresui/utils/CalamaresUtilsGui.h index c0905d4d0..98a49db61 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.h +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.h @@ -115,6 +115,7 @@ UIDLLEXPORT void setDefaultFontSize( int points ); UIDLLEXPORT int defaultFontSize(); // in points UIDLLEXPORT int defaultFontHeight(); // in pixels, DPI-specific UIDLLEXPORT QFont defaultFont(); +UIDLLEXPORT QFont largeFont(); UIDLLEXPORT QSize defaultIconSize(); /** From 9918dfb95ffc17fcf0885cb036356d76c7d1f201 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 13 Jun 2018 05:11:31 -0400 Subject: [PATCH 33/50] [libcalamaresui] Reporting on failures - Provide information on failed modules - Disallow further progress when configuration is borked --- src/libcalamaresui/CMakeLists.txt | 1 + src/libcalamaresui/ViewManager.cpp | 15 +++ src/libcalamaresui/ViewManager.h | 6 + .../modulesystem/ModuleManager.cpp | 3 + .../viewpages/BlankViewStep.cpp | 113 ++++++++++++++++++ src/libcalamaresui/viewpages/BlankViewStep.h | 70 +++++++++++ 6 files changed, 208 insertions(+) create mode 100644 src/libcalamaresui/viewpages/BlankViewStep.cpp create mode 100644 src/libcalamaresui/viewpages/BlankViewStep.h diff --git a/src/libcalamaresui/CMakeLists.txt b/src/libcalamaresui/CMakeLists.txt index 6bbb285bb..efd0ebb29 100644 --- a/src/libcalamaresui/CMakeLists.txt +++ b/src/libcalamaresui/CMakeLists.txt @@ -15,6 +15,7 @@ set( calamaresui_SOURCES utils/qjsonitem.cpp viewpages/AbstractPage.cpp + viewpages/BlankViewStep.cpp viewpages/ViewStep.cpp widgets/ClickableLabel.cpp diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index e597bf6a3..8777f79d7 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -20,6 +20,7 @@ #include "ViewManager.h" #include "utils/Logger.h" +#include "viewpages/BlankViewStep.h" #include "viewpages/ViewStep.h" #include "ExecutionViewStep.h" #include "JobQueue.h" @@ -172,6 +173,20 @@ ViewManager::onInstallationFailed( const QString& message, const QString& detail } +void +ViewManager::onInitFailed( const QStringList& modules) +{ + QString title( tr( "Calamares Initialization Failed" ) ); + QString description( tr( "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 can not be installed." ) ); + QStringList details; + details << QLatin1Literal("
    "); + for( const auto& m : modules ) + details << QLatin1Literal("
  • ") << m << QLatin1Literal("
  • "); + details << QLatin1Literal("
"); + + insertViewStep( 0, new BlankViewStep( title, description.arg( *Calamares::Branding::ShortProductName ), details.join( QString() ) ) ); +} + ViewStepList ViewManager::viewSteps() const { diff --git a/src/libcalamaresui/ViewManager.h b/src/libcalamaresui/ViewManager.h index e4f215f8f..ee199f725 100644 --- a/src/libcalamaresui/ViewManager.h +++ b/src/libcalamaresui/ViewManager.h @@ -117,6 +117,12 @@ public slots: */ void onInstallationFailed( const QString& message, const QString& details ); + /** @brief Replaces the stack with a view step stating that initialization failed. + * + * @param modules a list of failed modules. + */ + void onInitFailed( const QStringList& modules ); + signals: void currentStepChanged(); void enlarge( QSize enlarge ) const; // See ViewStep::enlarge() diff --git a/src/libcalamaresui/modulesystem/ModuleManager.cpp b/src/libcalamaresui/modulesystem/ModuleManager.cpp index 194db65a2..6361fa20b 100644 --- a/src/libcalamaresui/modulesystem/ModuleManager.cpp +++ b/src/libcalamaresui/modulesystem/ModuleManager.cpp @@ -296,7 +296,10 @@ ModuleManager::loadModules() } } if ( !failedModules.isEmpty() ) + { + ViewManager::instance()->onInitFailed( failedModules ); emit modulesFailed( failedModules ); + } else emit modulesLoaded(); } ); diff --git a/src/libcalamaresui/viewpages/BlankViewStep.cpp b/src/libcalamaresui/viewpages/BlankViewStep.cpp new file mode 100644 index 000000000..093d19d8b --- /dev/null +++ b/src/libcalamaresui/viewpages/BlankViewStep.cpp @@ -0,0 +1,113 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, 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 "BlankViewStep.h" + +#include "utils/CalamaresUtilsGui.h" + +#include +#include +#include + +namespace Calamares +{ + +BlankViewStep::BlankViewStep( const QString& title, const QString& description, const QString& details, QObject* parent) + : Calamares::ViewStep( parent ) + , m_widget( new QWidget() ) +{ + QBoxLayout* layout = new QVBoxLayout(); + + auto* label = new QLabel( title ); + label->setAlignment( Qt::AlignHCenter ); + label->setFont( CalamaresUtils::largeFont() ); + layout->addWidget( label ); + + label = new QLabel( description ); + label->setWordWrap( true ); + layout->addSpacing( 10 ); + layout->addWidget( label ); + + if ( !details.isEmpty() ) + { + label = new QLabel( details ); + layout->addSpacing( 10 ); + layout->addWidget( label ); + } + + layout->addStretch( 10 ); + + m_widget->setLayout( layout ); +} + +BlankViewStep::~BlankViewStep() +{ +} + +QString +BlankViewStep::prettyName() const +{ + return tr( "Blank Page" ); +} + +void +BlankViewStep::back() +{ +} + +void +BlankViewStep::next() +{ +} + +bool +BlankViewStep::isBackEnabled() const +{ + return false; +} + +bool +BlankViewStep::isNextEnabled() const +{ + return false; +} + +bool +BlankViewStep::isAtBeginning() const +{ + return true; +} + +bool +BlankViewStep::isAtEnd() const +{ + return false; +} + +QWidget* +BlankViewStep::widget() +{ + return m_widget; +} + +Calamares::JobList +BlankViewStep::jobs() const +{ + return JobList(); +} + +} // namespace diff --git a/src/libcalamaresui/viewpages/BlankViewStep.h b/src/libcalamaresui/viewpages/BlankViewStep.h new file mode 100644 index 000000000..5e6938143 --- /dev/null +++ b/src/libcalamaresui/viewpages/BlankViewStep.h @@ -0,0 +1,70 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, 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 BLANKVIEWSTEP_H +#define BLANKVIEWSTEP_H + +#include + +#include +#include + +class QWidget; + +namespace Calamares +{ + +/** @brief A "blank" view step, used for error and status reporting + * + * + */ +class BlankViewStep : public Calamares::ViewStep +{ + Q_OBJECT + +public: + explicit BlankViewStep( const QString& title, const QString& description, const QString& details = QString(), QObject* parent = nullptr ); + virtual ~BlankViewStep() override; + + QString prettyName() const override; + + QWidget* widget() override; + + void next() override; + void back() override; + + bool isNextEnabled() const override; + bool isBackEnabled() const override; + + bool isAtBeginning() const override; + bool isAtEnd() const override; + + Calamares::JobList jobs() const override; +#if 0 + void onActivate() override; + + + void setConfigurationMap( const QVariantMap& configurationMap ) override; +#endif + +private: + QWidget* m_widget; +}; + +} // namespace +#endif // BLANKVIEWSTEP_H From bb5ac0326d35d8649d4a504e1a049f06449957e8 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 14 Jun 2018 02:31:06 -0400 Subject: [PATCH 34/50] [libcalamaresui] Improve layout of "blank" view step --- src/libcalamaresui/viewpages/BlankViewStep.cpp | 11 ++++++++--- src/libcalamaresui/viewpages/BlankViewStep.h | 9 ++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/libcalamaresui/viewpages/BlankViewStep.cpp b/src/libcalamaresui/viewpages/BlankViewStep.cpp index 093d19d8b..243305c1f 100644 --- a/src/libcalamaresui/viewpages/BlankViewStep.cpp +++ b/src/libcalamaresui/viewpages/BlankViewStep.cpp @@ -32,6 +32,9 @@ BlankViewStep::BlankViewStep( const QString& title, const QString& description, { QBoxLayout* layout = new QVBoxLayout(); + constexpr int const marginWidth = 10; + constexpr int const spacingHeight = 10; + auto* label = new QLabel( title ); label->setAlignment( Qt::AlignHCenter ); label->setFont( CalamaresUtils::largeFont() ); @@ -39,17 +42,19 @@ BlankViewStep::BlankViewStep( const QString& title, const QString& description, label = new QLabel( description ); label->setWordWrap( true ); - layout->addSpacing( 10 ); + label->setMargin( marginWidth ); + layout->addSpacing( spacingHeight ); layout->addWidget( label ); if ( !details.isEmpty() ) { label = new QLabel( details ); - layout->addSpacing( 10 ); + label->setMargin( marginWidth ); + layout->addSpacing( spacingHeight ); layout->addWidget( label ); } - layout->addStretch( 10 ); + layout->addStretch( 1 ); // Push the rest to the top m_widget->setLayout( layout ); } diff --git a/src/libcalamaresui/viewpages/BlankViewStep.h b/src/libcalamaresui/viewpages/BlankViewStep.h index 5e6938143..a3f46d1d5 100644 --- a/src/libcalamaresui/viewpages/BlankViewStep.h +++ b/src/libcalamaresui/viewpages/BlankViewStep.h @@ -31,7 +31,8 @@ namespace Calamares /** @brief A "blank" view step, used for error and status reporting * - * + * This view step never allows navigation (forward or back); it's a trap. + * It displays a title and explanation, and optional details. */ class BlankViewStep : public Calamares::ViewStep { @@ -55,12 +56,6 @@ public: bool isAtEnd() const override; Calamares::JobList jobs() const override; -#if 0 - void onActivate() override; - - - void setConfigurationMap( const QVariantMap& configurationMap ) override; -#endif private: QWidget* m_widget; From 97a45db4bf87e416f5096c1b92ecaec09bb22dbe Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 14 Jun 2018 02:35:49 -0400 Subject: [PATCH 35/50] [libcalamaresui] Reset font height when changing size - defaultFontHeight() caches the result; clear cache when changing the default size, even though this happens only once in the current codebase. --- src/libcalamaresui/utils/CalamaresUtilsGui.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp index 3c59b0f89..e4dc6b555 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp @@ -239,6 +239,7 @@ void setDefaultFontSize( int points ) { s_defaultFontSize = points; + s_defaultFontHeight = 0; // Recalculate on next call to defaultFontHeight() } From a8426730ca1dd05ccd9f290935566d6e33d52dbe Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 14 Jun 2018 02:48:52 -0400 Subject: [PATCH 36/50] [libcalamaresui] Improve wording of modules failure warning --- src/libcalamaresui/ViewManager.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 8777f79d7..2b9f87db8 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -177,14 +177,21 @@ void ViewManager::onInitFailed( const QStringList& modules) { QString title( tr( "Calamares Initialization Failed" ) ); - QString description( tr( "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 can not be installed." ) ); - QStringList details; - details << QLatin1Literal("
    "); - for( const auto& m : modules ) - details << QLatin1Literal("
  • ") << m << QLatin1Literal("
  • "); - details << QLatin1Literal("
"); + QString description( tr( "%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." ) ); + QString detailString; - insertViewStep( 0, new BlankViewStep( title, description.arg( *Calamares::Branding::ShortProductName ), details.join( QString() ) ) ); + if ( modules.count() > 0 ) + { + description.append( tr( "
The following modules could not be loaded:" ) ); + QStringList details; + details << QLatin1Literal("
    "); + for( const auto& m : modules ) + details << QLatin1Literal("
  • ") << m << QLatin1Literal("
  • "); + details << QLatin1Literal("
"); + detailString = details.join( QString() ); + } + + insertViewStep( 0, new BlankViewStep( title, description.arg( *Calamares::Branding::ShortProductName ), detailString ) ); } ViewStepList From c47fd88ff0e2c23972d21f3fdbfdcb5ec2b3b676 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Thu, 14 Jun 2018 04:47:51 -0400 Subject: [PATCH 37/50] i18n: [calamares] Automatic merge of Transifex translations --- lang/calamares_es_MX.ts | 427 ++++++++++++++++++++-------------------- lang/calamares_et.ts | 134 ++++++------- 2 files changed, 281 insertions(+), 280 deletions(-) diff --git a/lang/calamares_es_MX.ts b/lang/calamares_es_MX.ts index f6e76dc9a..657507b9d 100644 --- a/lang/calamares_es_MX.ts +++ b/lang/calamares_es_MX.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. - + El <strong>entorno de arranque </strong>de este sistema. <br><br>Sistemas antiguos x86 solo admiten <strong>BIOS</strong>. <br>Sistemas modernos usualmente usan <strong>EFI</strong>, pero podrían aparecer como BIOS si inició en modo de compatibilidad. 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. - + Este sistema fue iniciado con un entorno de arranque <strong>EFI. </strong><br><br>Para configurar el arranque desde un entorno EFI, este instalador debe hacer uso de un cargador de arranque, como <strong>GRUB</strong>, <strong>system-boot </strong> o una <strong>Partición de sistema EFI</strong>. Esto es automático, a menos que escoja el particionado manual, en tal caso debe escogerla o crearla por su cuenta. 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. - + Este sistema fue iniciado con un entorno de arranque <strong>BIOS. </strong><br><br>Para configurar el arranque desde un entorno BIOS, este instalador debe instalar un gestor de arranque como <strong>GRUB</strong>, ya sea al inicio de la partición o en el <strong> Master Boot Record</strong> cerca del inicio de la tabla de particiones (preferido). Esto es automático, a menos que escoja el particionado manual, en este caso debe configurarlo por su cuenta.
@@ -76,12 +76,12 @@ none - + ninguno Interface: - + Interfaz: @@ -138,7 +138,7 @@ Working directory %1 for python job %2 is not readable. - La carpeta de trabajo %1 para la tarea de python %2 no se pudo leer. + La carpeta de trabajo %1 para la tarea de python %2 no es accesible. @@ -179,44 +179,44 @@ Cancel installation without changing the system. - + Cancelar instalación sin cambiar el sistema. &Install - + &Instalar Cancel installation? - Cancelar la instalación? + ¿Cancelar la instalación? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - Realmente desea cancelar el proceso de instalación actual? + ¿Realmente desea cancelar el proceso de instalación actual? El instalador terminará y se perderán todos los cambios. &Yes - + &Si &No - + &No &Close - + &Cerrar Continue with setup? - Continuar con la instalación? + ¿Continuar con la instalación? @@ -236,12 +236,12 @@ El instalador terminará y se perderán todos los cambios. &Done - + &Hecho The installation is complete. Close the installer. - + Instalación completa. Cierre el instalador. @@ -259,12 +259,12 @@ El instalador terminará y se perderán todos los cambios. Unknown exception type - Excepción desconocida + Tipo de excepción desconocida unparseable Python error - error no analizable Python + error Python no analizable @@ -274,7 +274,7 @@ El instalador terminará y se perderán todos los cambios. Unfetchable Python error. - Error de Python Unfetchable. + Error de Python inalcanzable. @@ -305,8 +305,7 @@ El instalador terminará y se perderán todos los cambios. This program will ask you some questions and set up %2 on your computer. - El programa le hará algunas preguntas y configurará %2 en su ordenador. - + El programa le hará algunas preguntas y configurará %2 en su ordenador. @@ -344,7 +343,7 @@ El instalador terminará y se perderán todos los cambios. %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. - + %1 será reducido a %2MB y una nueva partición de %3MB será creado para %4. @@ -362,7 +361,7 @@ El instalador terminará y se perderán todos los cambios. Reuse %1 as home partition for %2. - + Reuse %1 como partición home para %2. @@ -393,7 +392,7 @@ El instalador terminará y se perderán todos los cambios. 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. - + Este dispositivo de almacenamiento parece no tener un sistema operativo en el. ¿que le gustaría hacer?<br/> Usted podrá revisar y confirmar sus elecciones antes que cualquier cambio se realice al dispositivo de almacenamiento. @@ -401,12 +400,12 @@ El instalador terminará y se perderán todos los cambios. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. - + <strong>Borrar disco</strong> <br/>Esto <font color="red">borrará</font> todos los datos presentes actualmente en el dispositivo de almacenamiento seleccionado. 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. - + Este dispositivo de almacenamiento tiene %1 en el. ¿Que le gustaría hacer? <br/>Usted podrá revisar y confirmar sus elecciones antes de que cualquier cambio se realice al dispositivo de almacenamiento. @@ -414,7 +413,7 @@ El instalador terminará y se perderán todos los cambios. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. - + <strong>Instalar junto a</strong> <br/>El instalador reducirá una partición con el fin de hacer espacio para %1. @@ -422,17 +421,17 @@ El instalador terminará y se perderán todos los cambios. <strong>Replace a partition</strong><br/>Replaces a partition with %1. - + <strong>Reemplazar una partición</strong> <br/>Reemplaza una partición con %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. - + Este dispositivo de almacenamiento ya tiene un sistema operativo en el. ¿Que le gustaría hacer?<br/> Usted podrá revisar y confirmar sus elecciones antes que cualquier cambio se realice al dispositivo de almacenamiento. 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. - + Este dispositivo de almacenamiento tiene múltiples sistemas operativos en el. ¿Que le gustaria hacer?<br/> Usted podrá revisar y confirmar sus elecciones antes que cualquier cambio se realice al dispositivo de almacenamiento. @@ -440,18 +439,17 @@ El instalador terminará y se perderán todos los cambios. Clear mounts for partitioning operations on %1 - <b>Instalar %1 en una partición existente</b><br/>Podrás elegir que partición borrar. + Despejar puntos de montaje para operaciones de particionamiento en %1 Clearing mounts for partitioning operations on %1. - Limpiar puntos de montaje para operaciones de particionamiento en %1 + Despejando puntos de montaje para operaciones de particionamiento en %1 Cleared all mounts for %1 - Todas las unidades desmontadas en %1 - + Puntos de montaje despejados para %1 @@ -459,12 +457,12 @@ El instalador terminará y se perderán todos los cambios. Clear all temporary mounts. - Quitar todos los puntos de montaje temporales. + Despejar todos los puntos de montaje temporales. Clearing all temporary mounts. - Limpiando todos los puntos de montaje temporales. + Despejando todos los puntos de montaje temporales. @@ -474,7 +472,7 @@ El instalador terminará y se perderán todos los cambios. Cleared all temporary mounts. - Se han quitado todos los puntos de montaje temporales. + Todos los puntos de montaje temporales despejados. @@ -483,17 +481,17 @@ El instalador terminará y se perderán todos los cambios. Could not run command. - + No puede ejecutarse el comando. The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + Este comando se ejecuta en el entorno host y necesita saber la ruta root, pero no hay rootMountPoint definido. The command needs to know the user's name, but no username is defined. - + Este comando necesita saber el nombre de usuario, pero no hay nombre de usuario definido. @@ -501,7 +499,7 @@ El instalador terminará y se perderán todos los cambios. Contextual Processes Job - + Tareas de procesos contextuales. @@ -509,12 +507,12 @@ El instalador terminará y se perderán todos los cambios. Create a Partition - Crear partición + Crear una partición MiB - + MiB @@ -539,27 +537,27 @@ El instalador terminará y se perderán todos los cambios. LVM LV name - + Nombre del LVM LV. Flags: - Banderas: + Indicadores: &Mount Point: - Punto de &montaje: + Punto de &Montaje: Si&ze: - &Tamaño: + Ta&maño: En&crypt - + En&criptar @@ -579,7 +577,7 @@ El instalador terminará y se perderán todos los cambios. Mountpoint already in use. Please select another one. - + Punto de montaje ya esta en uso. Por favor seleccione otro. @@ -722,32 +720,32 @@ El instalador terminará y se perderán todos los cambios. 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. - + Este tipo de <strong>tabla de partición</strong> en el dispositivo de almacenamiento seleccionado.<br> <br>La única forma de cambiar el tipo de tabla de partición es borrar y recrear la tabla de partición de cero. lo cual destruye todos los datos en el dispositivo de almacenamiento.<br> Este instalador conservará la actual tabla de partición a menos que usted explícitamente elija lo contrario. <br>Si no está seguro, en los sistemas modernos GPT es lo preferible. This device has a <strong>%1</strong> partition table. - + Este dispositivo tiene una tabla de partición <strong>%1</strong> 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. - + Este es un dispositivo<br> <strong>loop</strong>. <br>Es un pseudo - dispositivo sin tabla de partición que hace un archivo accesible como un dispositivo bloque. Este tipo de configuración usualmente contiene un solo sistema de archivos. 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. - + Este instalador <strong>no puede detectar una tabla de partición</strong> en el dispositivo de almacenamiento seleccionado.<br> <br>El dispositivo o no tiene tabla de partición, o la tabla de partición esta corrupta o de un tipo desconocido. <br>Este instalador puede crear una nueva tabla de partición por usted ya sea automáticamente, o a través de la página de particionado manual. <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. - + <br><br>Este es el tipo de tabla de partición recomendada para sistemas modernos que inician desde un entorno de arranque <strong>EFI</strong>. <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. - + <br><br>Este tipo de tabla de partición solo es recomendable en sistemas antiguos que inician desde un entorno de arranque <strong>BIOS</strong>. GPT es recomendado en la otra mayoría de casos.<br><br><strong> Precaución:</strong> La tabla de partición MBR es una era estándar MS-DOS obsoleta.<br> Unicamente 4 particiones <em>primarias</em> pueden ser creadas, y de esas 4, una puede ser una partición <em>extendida</em>, la cual puede a su vez contener varias particiones <em>logicas</em>. @@ -763,17 +761,17 @@ El instalador terminará y se perderán todos los cambios. Write LUKS configuration for Dracut to %1 - + Escribe configuración LUKS para Dracut a %1 Skip writing LUKS configuration for Dracut: "/" partition is not encrypted - + Omitir escritura de configuración LUKS por Dracut: "/" partición no está encriptada. Failed to open %1 - + Falla al abrir %1 @@ -781,7 +779,7 @@ El instalador terminará y se perderán todos los cambios. Dummy C++ Job - + Trabajo C++ Simulado @@ -824,7 +822,7 @@ El instalador terminará y se perderán todos los cambios. MiB - + MiB @@ -834,12 +832,12 @@ El instalador terminará y se perderán todos los cambios. Flags: - Banderas: + Indicadores: Mountpoint already in use. Please select another one. - + Punto de montaje ya esta en uso. Por favor seleccione otro. @@ -852,22 +850,22 @@ El instalador terminará y se perderán todos los cambios. En&crypt system - + En&criptar sistema Passphrase - + Contraseña segura Confirm passphrase - + Confirmar contraseña segura Please enter the same passphrase in both boxes. - + Favor ingrese la misma contraseña segura en ambas casillas. @@ -913,12 +911,12 @@ El instalador terminará y se perderán todos los cambios. Form - Forma + Formulario <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>Cuando esta casilla esta chequeada, su sistema reiniciará inmediatamente cuando de click en <span style=" font-style:italic;">Hecho</span> o cierre el instalador.</p></body></html> @@ -933,7 +931,7 @@ El instalador terminará y se perderán todos los cambios. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. - + <h1>Instalación fallida</h1> <br/>%1 no ha sido instalado en su computador. <br/>El mensaje de error es: %2. @@ -946,12 +944,12 @@ El instalador terminará y se perderán todos los cambios. Installation Complete - + Instalación Completa The installation of %1 is complete. - + La instalación de %1 está completa. @@ -987,7 +985,7 @@ El instalador terminará y se perderán todos los cambios. Please install KDE Konsole and try again! - + Favor instale la Konsola KDE e intentelo de nuevo! @@ -1044,7 +1042,7 @@ El instalador terminará y se perderán todos los cambios. &OK - + &OK @@ -1130,12 +1128,12 @@ El instalador terminará y se perderán todos los cambios. The system language will be set to %1. - + El lenguaje del sistema será establecido a %1. The numbers and dates locale will be set to %1. - + Los números y datos locales serán establecidos a %1. @@ -1188,17 +1186,17 @@ El instalador terminará y se perderán todos los cambios. Description - + Descripción Network Installation. (Disabled: Unable to fetch package lists, check your network connection) - + Instalación de Red. (Deshabilitada: No se puede acceder a la lista de paquetes, verifique su conección de red) Network Installation. (Disabled: Received invalid groups data) - + Instalación de Red. (Deshabilitada: Grupos de datos invalidos recibidos) @@ -1206,7 +1204,7 @@ El instalador terminará y se perderán todos los cambios. Package selection - + Selección de paquete @@ -1214,242 +1212,242 @@ El instalador terminará y se perderán todos los cambios. Password is too short - + La contraseña es muy corta Password is too long - + La contraseña es muy larga Password is too weak - + La contraseña es muy débil Memory allocation error when setting '%1' - + Error de asignación de memoria al configurar '%1' Memory allocation error - + Error en la asignación de memoria The password is the same as the old one - + La contraseña es la misma que la anterior The password is a palindrome - + La contraseña es un Palíndromo The password differs with case changes only - + La contraseña solo difiere en cambios de mayúsculas y minúsculas The password is too similar to the old one - + La contraseña es muy similar a la anterior. The password contains the user name in some form - + La contraseña contiene el nombre de usuario de alguna forma The password contains words from the real name of the user in some form - + La contraseña contiene palabras del nombre real del usuario de alguna forma The password contains forbidden words in some form - + La contraseña contiene palabras prohibidas de alguna forma The password contains less than %1 digits - + La contraseña contiene menos de %1 dígitos The password contains too few digits - + La contraseña contiene muy pocos dígitos The password contains less than %1 uppercase letters - + La contraseña contiene menos de %1 letras mayúsculas The password contains too few uppercase letters - + La contraseña contiene muy pocas letras mayúsculas The password contains less than %1 lowercase letters - + La contraseña continee menos de %1 letras minúsculas The password contains too few lowercase letters - + La contraseña contiene muy pocas letras minúsculas The password contains less than %1 non-alphanumeric characters - + La contraseña contiene menos de %1 caracteres no alfanuméricos The password contains too few non-alphanumeric characters - + La contraseña contiene muy pocos caracteres alfanuméricos The password is shorter than %1 characters - + La contraseña es mas corta que %1 caracteres The password is too short - + La contraseña es muy corta The password is just rotated old one - + La contraseña solo es la rotación de la anterior The password contains less than %1 character classes - + La contraseña contiene menos de %1 tipos de caracteres The password does not contain enough character classes - + La contraseña no contiene suficientes tipos de caracteres The password contains more than %1 same characters consecutively - + La contraseña contiene más de %1 caracteres iguales consecutivamente The password contains too many same characters consecutively - + La contraseña contiene muchos caracteres iguales repetidos consecutivamente The password contains more than %1 characters of the same class consecutively - + La contraseña contiene mas de %1 caracteres de la misma clase consecutivamente The password contains too many characters of the same class consecutively - + La contraseña contiene muchos caracteres de la misma clase consecutivamente The password contains monotonic sequence longer than %1 characters - + La contraseña contiene secuencias monotónicas mas larga que %1 caracteres The password contains too long of a monotonic character sequence - + La contraseña contiene secuencias monotónicas muy largas No password supplied - + Contraseña no suministrada Cannot obtain random numbers from the RNG device - + No pueden obtenerse números aleatorios del dispositivo RING Password generation failed - required entropy too low for settings - + Generación de contraseña fallida - entropía requerida muy baja para los ajustes The password fails the dictionary check - %1 - + La contraseña falla el chequeo del diccionario %1 The password fails the dictionary check - + La contraseña falla el chequeo del diccionario Unknown setting - %1 - + Configuración desconocida - %1 Unknown setting - + Configuración desconocida Bad integer value of setting - %1 - + Valor entero de configuración incorrecto - %1 Bad integer value - + Valor entero incorrecto Setting %1 is not of integer type - + Ajuste de % 1 no es de tipo entero Setting is not of integer type - + Ajuste no es de tipo entero Setting %1 is not of string type - + El ajuste %1 no es de tipo cadena Setting is not of string type - + El ajuste no es de tipo cadena Opening the configuration file failed - + Apertura del archivo de configuración fallida The configuration file is malformed - + El archivo de configuración está malformado Fatal failure - + Falla fatal Unknown error - + Error desconocido @@ -1545,32 +1543,32 @@ El instalador terminará y se perderán todos los cambios. Root - + Root Home - + Home Boot - + Boot EFI system - + Sistema EFI Swap - + Swap New partition for %1 - + Partición nueva para %1 @@ -1580,7 +1578,7 @@ El instalador terminará y se perderán todos los cambios. %1 %2 - + %1 %2 @@ -1628,7 +1626,7 @@ El instalador terminará y se perderán todos los cambios. Storage de&vice: - + Dis&positivo de almacenamiento: @@ -1658,7 +1656,7 @@ El instalador terminará y se perderán todos los cambios. Install boot &loader on: - + Instalar &cargador de arranque en: @@ -1668,12 +1666,12 @@ El instalador terminará y se perderán todos los cambios. Can not create new partition - + No se puede crear nueva partición 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. - + La tabla de partición en %1 ya tiene %2 particiones primarias, y no pueden agregarse mas. Favor remover una partición primaria y en cambio, agregue una partición extendida. @@ -1746,32 +1744,32 @@ El instalador terminará y se perderán todos los cambios. No EFI system partition configured - + Sistema de partición EFI no configurada 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. - + Un sistema de partición EFI es necesario para iniciar %1. <br/><br/>Para configurar un sistema de partición EFI, Regrese y seleccione o cree un sistema de archivos FAT32 con la bandera <strong>esp</strong> activada y el punto de montaje <strong>%2</strong>. <br/><br/>Puede continuar sin configurar una partición de sistema EFI, pero su sistema podría fallar al iniciar. EFI system partition flag not set - + Indicador de partición del sistema EFI no configurado 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. - + Una partición del sistema EFI es necesaria para iniciar% 1. <br/><br/>Una partición se configuró con el punto de montaje <strong>% 2</strong>, pero su bandera <strong>esp</strong> no está configurada. <br/>Para establecer el indicador, retroceda y edite la partición.<br/><br/> Puede continuar sin configurar el indicador, pero su sistema puede fallar al iniciar. Boot partition not encrypted - + Partición de arranque no encriptada 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. - + Se creó una partición de arranque separada junto con una partición raíz cifrada, pero la partición de arranque no está encriptada.<br/><br/> Existen problemas de seguridad con este tipo de configuración, ya que los archivos importantes del sistema se guardan en una partición no encriptada. <br/>Puede continuar si lo desea, pero el desbloqueo del sistema de archivos ocurrirá más tarde durante el inicio del sistema. <br/>Para encriptar la partición de arranque, retroceda y vuelva a crearla, seleccionando <strong>Encriptar</strong> en la ventana de creación de la partición. @@ -1779,13 +1777,13 @@ El instalador terminará y se perderán todos los cambios. Plasma Look-and-Feel Job - + Trabajo Plasma Look-and-Feel Could not select KDE Plasma Look-and-Feel package - + No se pudo seleccionar el paquete KDE Plasma Look-and-Feel @@ -1798,12 +1796,12 @@ El instalador terminará y se perderán todos los cambios. Placeholder - + Marcador de posición 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. - + Favor seleccione un Escritorio Plasma KDE Look-and-Feel. También puede omitir este paso y configurar el Look-and-Feel una vez el sistema está instalado. Haciendo clic en la selección Look-and-Feel le dará una previsualización en vivo de ese Look-and-Feel. @@ -1811,7 +1809,7 @@ El instalador terminará y se perderán todos los cambios. Look-and-Feel - + Look-and-Feel @@ -1819,17 +1817,17 @@ El instalador terminará y se perderán todos los cambios. Saving files for later ... - + Guardando archivos para más tarde ... No files configured to save for later. - + No hay archivos configurados para guardar más tarde. Not all of the configured files could be preserved. - + No todos los archivos configurados podrían conservarse. @@ -1838,39 +1836,42 @@ El instalador terminará y se perderán todos los cambios. There was no output from the command. - + +No hubo salida desde el comando. Output: - + +Salida + External command crashed. - + El comando externo ha fallado. Command <i>%1</i> crashed. - + El comando <i>%1</i> ha fallado. External command failed to start. - + El comando externo falló al iniciar. Command <i>%1</i> failed to start. - + El comando <i>%1</i> Falló al iniciar. Internal error when starting command. - + Error interno al iniciar el comando. @@ -1880,22 +1881,22 @@ Output: External command failed to finish. - + Comando externo falla al finalizar Command <i>%1</i> failed to finish in %2 seconds. - + Comando <i>%1</i> falló al finalizar en %2 segundos. External command finished with errors. - + Comando externo finalizado con errores Command <i>%1</i> finished with exit code %2. - + Comando <i>%1</i> finalizó con código de salida %2. @@ -1914,27 +1915,27 @@ Output: unknown - + desconocido extended - + extendido unformatted - + no formateado swap - + swap Unpartitioned space or unknown partition table - + Espacio no particionado o tabla de partición desconocida @@ -2068,7 +2069,7 @@ Output: The screen is too small to display the installer. - + La pantalla es muy pequeña para mostrar el instalador @@ -2099,12 +2100,12 @@ Output: Scanning storage devices... - + Escaneando dispositivos de almacenamiento... Partitioning - + Particionando @@ -2164,7 +2165,7 @@ Output: Failed to write keyboard configuration to existing /etc/default directory. - + Fallo al escribir la configuración del teclado en el directorio /etc/default existente. @@ -2172,82 +2173,82 @@ Output: Set flags on partition %1. - + Establecer indicadores en la partición% 1. Set flags on %1MB %2 partition. - + Establecer indicadores en la partición %1MB %2. Set flags on new partition. - + Establecer indicadores en la nueva partición. Clear flags on partition <strong>%1</strong>. - + Borrar indicadores en la partición <strong>%1</strong>. Clear flags on %1MB <strong>%2</strong> partition. - + Borrar indicadores %1MB en la partición <strong>%2</strong>. Clear flags on new partition. - + Borrar indicadores en la nueva partición. Flag partition <strong>%1</strong> as <strong>%2</strong>. - + Indicador de partición <strong>%1</strong> como <strong>%2</strong>. Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. - + Indicador %1MB de partición <strong>%2</strong> como <strong>%3</strong>. Flag new partition as <strong>%1</strong>. - + Marcar la nueva partición como <strong>%1</strong>. Clearing flags on partition <strong>%1</strong>. - + Borrar indicadores en la partición <strong>%1</strong>. Clearing flags on %1MB <strong>%2</strong> partition. - + Borrar indicadores en la partición %1MB <strong>%2</strong>. Clearing flags on new partition. - + Borrar indicadores en la nueva partición. Setting flags <strong>%2</strong> on partition <strong>%1</strong>. - + Establecer indicadores <strong>%2</strong> en la partición <strong>%1</strong>. Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. - + Establecer indicadores <strong>%3</strong> en partición %1MB <strong>%2</strong> Setting flags <strong>%1</strong> on new partition. - + Establecer indicadores <strong>%1</strong> en nueva partición. The installer failed to set flags on partition %1. - + El instalador no pudo establecer indicadores en la partición% 1. @@ -2275,12 +2276,12 @@ Output: Cannot disable root account. - + No se puede deshabilitar la cuenta root. passwd terminated with error code %1. - + Contraseña terminada con un error de código %1. @@ -2336,7 +2337,7 @@ Output: Shell Processes Job - + Trabajo de procesos Shell @@ -2345,7 +2346,7 @@ Output: %L1 / %L2 slide counter, %1 of %2 (numeric) - + %L1 / %L2 @@ -2369,22 +2370,22 @@ Output: Installation feedback - + Retroalimentacion de la instalación Sending installation feedback. - + Envío de retroalimentación de instalación. Internal error in install-tracking. - + Error interno en el seguimiento de instalación. HTTP request timed out. - + Tiempo de espera en la solicitud HTTP agotado. @@ -2392,28 +2393,28 @@ Output: Machine feedback - + Retroalimentación de la maquina Configuring machine feedback. - + Configurando la retroalimentación de la maquina. Error in machine feedback configuration. - + Error en la configuración de retroalimentación de la máquina. Could not configure machine feedback correctly, script error %1. - + No se pudo configurar correctamente la retroalimentación de la máquina, error de script% 1. Could not configure machine feedback correctly, Calamares error %1. - + No se pudo configurar la retroalimentación de la máquina correctamente, Calamares error% 1. @@ -2426,51 +2427,51 @@ Output: Placeholder - + Marcador de posición <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>Al seleccionar esto, usted no enviará <span style=" font-weight:600;">ninguna información</span> acerca de su instalacion.</p></body></html> TextLabel - + Etiqueta de texto ... - + ... <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> - + <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Haga clic aquí para más información acerca de comentarios del usuario</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. - + El seguimiento de instalación ayuda a% 1 a ver cuántos usuarios tienen, qué hardware instalan% 1 y (con las dos últimas opciones a continuación), obtener información continua sobre las aplicaciones preferidas. Para ver qué se enviará, haga clic en el ícono de ayuda al lado de cada área. 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. - + Al seleccionar esto usted enviará información acerca de su instalación y hardware. Esta informacion será <b>enviada unicamente una vez</b> después de terminada la instalación. By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. - + Al seleccionar esto usted enviará información <b>periodicamente</b> acerca de su instalación, hardware y aplicaciones a %1. By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. - + Al seleccionar esto usted enviará información <b>regularmente</b> acerca de su instalación, hardware y patrones de uso de aplicaciones a %1. @@ -2478,7 +2479,7 @@ Output: Feedback - + Retroalimentación @@ -2563,7 +2564,7 @@ Output: <h1>Welcome to the Calamares installer for %1.</h1> - + <h1>Bienvenido al instalador Calamares para %1.</h1> @@ -2573,7 +2574,7 @@ Output: <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/>por %3</strong><br/><br/>Derechos de autor 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt; <br/> Derechos de autor 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/> Gracias a Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg y al <a href="https://www.transifex.com/calamares/calamares/">equipo de traductores Calamares</a>. <br/><br/> Desarrollo de <a href="https://calamares.io/">Calamares</a> patrocinado por <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. diff --git a/lang/calamares_et.ts b/lang/calamares_et.ts index 871f447da..8fcf5f20e 100644 --- a/lang/calamares_et.ts +++ b/lang/calamares_et.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. - See süsteem käivitati <strong>EFI</strong> käivituskeskkonnas.<br><br>Et seadistada käivitust EFI keskkonnast, peab see installija paigaldama käivituslaaduri rakenduse, näiteks <strong>GRUB</strong> või <strong>systemd-boot</strong> sinu <strong>EFI süsteemipartitsioonile</strong>. See on automaatne, välja arvatud juhul, kui valid käsitsi partitsioneerimise, sel juhul pead sa selle valima või ise looma. + See süsteem käivitati <strong>EFI</strong> käivituskeskkonnas.<br><br>Et seadistada käivitust EFI keskkonnast, peab see paigaldaja paigaldama käivituslaaduri rakenduse, näiteks <strong>GRUB</strong> või <strong>systemd-boot</strong> sinu <strong>EFI süsteemipartitsioonile</strong>. See on automaatne, välja arvatud juhul, kui valid käsitsi partitsioneerimise, sel juhul pead sa selle valima või ise looma. 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. - See süsteem käivitati <strong>BIOS</strong> käivituskeskkonnas.<br><br>Et seadistada käivitust BIOS keskkonnast, peab see installija paigaldama käivituslaaduri, näiteks <strong>GRUB</strong>, kas mõne partitsiooni algusse või <strong>Master Boot Record</strong>'i paritsioonitabeli alguse lähedale (eelistatud). See on automaatne, välja arvatud juhul, kui valid käsitsi partitsioneerimise, sel juhul pead sa selle ise seadistama. + See süsteem käivitati <strong>BIOS</strong> käivituskeskkonnas.<br><br>Et seadistada käivitust BIOS keskkonnast, peab see paigaldaja paigaldama käivituslaaduri, näiteks <strong>GRUB</strong>, kas mõne partitsiooni algusse või <strong>Master Boot Record</strong>'i paritsioonitabeli alguse lähedale (eelistatud). See on automaatne, välja arvatud juhul, kui valid käsitsi partitsioneerimise, sel juhul pead sa selle ise seadistama. @@ -37,7 +37,7 @@ Do not install a boot loader - Ära installi käivituslaadurit + Ära paigalda käivituslaadurit @@ -99,7 +99,7 @@ Install - Installi + Paigalda @@ -179,24 +179,24 @@ Cancel installation without changing the system. - Tühista installimine ilma süsteemi muutmata. + Tühista paigaldamine ilma süsteemi muutmata. &Install - &Installi + &Paigalda Cancel installation? - Tühista installimine? + Tühista paigaldamine? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - Kas sa tõesti soovid tühistada praeguse installiprotsessi? -Installija sulgub ja kõik muutused kaovad. + Kas sa tõesti soovid tühistada praeguse paigaldusprotsessi? +Paigaldaja sulgub ning kõik muutused kaovad. @@ -221,12 +221,12 @@ Installija sulgub ja kõik muutused kaovad. 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 installija on tegemas muudatusi sinu kettale, et installida %2.<br/><strong>Sa ei saa neid muudatusi tagasi võtta.</strong> + %1 paigaldaja on tegemas muudatusi sinu kettale, et paigaldada %2.<br/><strong>Sa ei saa neid muudatusi tagasi võtta.</strong> &Install now - &Installi kohe + &Paigalda kohe @@ -241,7 +241,7 @@ Installija sulgub ja kõik muutused kaovad. The installation is complete. Close the installer. - Installimine on lõpetatud. Sulge installija. + Paigaldamine on lõpetatud. Sulge paigaldaja. @@ -251,7 +251,7 @@ Installija sulgub ja kõik muutused kaovad. Installation Failed - Installimine ebaõnnestus + Paigaldamine ebaõnnestus @@ -282,7 +282,7 @@ Installija sulgub ja kõik muutused kaovad. %1 Installer - %1 installija + %1 paigaldaja @@ -295,12 +295,12 @@ Installija sulgub ja kõik muutused kaovad. This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> - See arvuti ei rahulda %1 installimiseks vajalikke minimaaltingimusi.<br/>Installimine ei saa jätkuda. <a href="#details">Detailid...</a> + See arvuti ei rahulda %1 paigldamiseks vajalikke minimaaltingimusi.<br/>Paigaldamine ei saa jätkuda. <a href="#details">Detailid...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. - See arvuti ei rahulda mõnda %1 installimiseks soovitatud tingimust.<br/>Installimine võib jätkuda, ent mõned funktsioonid võivad olla keelatud. + See arvuti ei rahulda mõnda %1 paigaldamiseks soovitatud tingimust.<br/>Paigaldamine võib jätkuda, ent mõned funktsioonid võivad olla keelatud. @@ -371,7 +371,7 @@ Installija sulgub ja kõik muutused kaovad. <strong>Select a partition to install on</strong> - <strong>Vali partitsioon, kuhu installida</strong> + <strong>Vali partitsioon, kuhu paigaldada</strong> @@ -412,7 +412,7 @@ Installija sulgub ja kõik muutused kaovad. <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. - <strong>Installi kõrvale</strong><br/>Installija vähendab partitsiooni, et teha ruumi operatsioonisüsteemile %1. + <strong>Paigalda kõrvale</strong><br/>Paigaldaja vähendab partitsiooni, et teha ruumi operatsioonisüsteemile %1. @@ -599,7 +599,7 @@ Installija sulgub ja kõik muutused kaovad. The installer failed to create partition on disk '%1'. - Installija ei suutnud luua partitsiooni kettale "%1". + Paigaldaja ei suutnud luua partitsiooni kettale "%1". @@ -650,7 +650,7 @@ Installija sulgub ja kõik muutused kaovad. The installer failed to create a partition table on %1. - Installija ei suutnud luua partitsioonitabelit kettale %1. + Paigaldaja ei suutnud luua partitsioonitabelit kettale %1. @@ -711,7 +711,7 @@ Installija sulgub ja kõik muutused kaovad. The installer failed to delete partition %1. - Installija ei suutnud kustutada partitsiooni %1. + Paigaldaja ei suutnud kustutada partitsiooni %1. @@ -719,7 +719,7 @@ Installija sulgub ja kõik muutused kaovad. 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>Partitsioonitabeli</strong> tüüp valitud mäluseadmel.<br><br>Ainuke viis partitsioonitabelit muuta on see kustutada ja nullist taasluua, mis hävitab kõik andmed mäluseadmel.<br>See installija säilitab praeguse partitsioonitabeli, v.a juhul kui sa ise valid vastupidist.<br>Kui pole kindel, eelista modernsetel süsteemidel GPT-d. + <strong>Partitsioonitabeli</strong> tüüp valitud mäluseadmel.<br><br>Ainuke viis partitsioonitabelit muuta on see kustutada ja nullist taasluua, mis hävitab kõik andmed mäluseadmel.<br>See paigaldaja säilitab praeguse partitsioonitabeli, v.a juhul kui sa ise valid vastupidist.<br>Kui pole kindel, eelista modernsetel süsteemidel GPT-d. @@ -734,7 +734,7 @@ Installija sulgub ja kõik muutused kaovad. 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. - See installija <strong>ei suuda tuvastada partitsioonitabelit</strong>valitud mäluseadmel.<br><br>Seadmel kas pole partitsioonitabelit, see on korrumpeerunud või on tundmatut tüüpi.<br>See installija võib sulle luua uue partitsioonitabeli, kas automaatselt või läbi käsitsi partitsioneerimise lehe. + See paigaldaja <strong>ei suuda tuvastada partitsioonitabelit</strong>valitud mäluseadmel.<br><br>Seadmel kas pole partitsioonitabelit, see on korrumpeerunud või on tundmatut tüüpi.<br>See paigaldaja võib sulle luua uue partitsioonitabeli, kas automaatselt või läbi käsitsi partitsioneerimise lehe. @@ -877,7 +877,7 @@ Installija sulgub ja kõik muutused kaovad. Install %1 on <strong>new</strong> %2 system partition. - Installi %1 <strong>uude</strong> %2 süsteemipartitsiooni. + Paigalda %1 <strong>uude</strong> %2 süsteemipartitsiooni. @@ -887,7 +887,7 @@ Installija sulgub ja kõik muutused kaovad. Install %2 on %3 system partition <strong>%1</strong>. - Installi %2 %3 süsteemipartitsioonile <strong>%1</strong>. + Paigalda %2 %3 süsteemipartitsioonile <strong>%1</strong>. @@ -897,7 +897,7 @@ Installija sulgub ja kõik muutused kaovad. Install boot loader on <strong>%1</strong>. - Installi käivituslaadur kohta <strong>%1</strong>. + Paigalda käivituslaadur kohta <strong>%1</strong>. @@ -915,7 +915,7 @@ Installija sulgub ja kõik muutused kaovad. <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>Kui see märkeruut on täidetud, taaskäivitab su süsteem automaatselt, kui vajutad <span style=" font-style:italic;">Valmis</span> või sulged installija.</p></body></html> + <html><head/><body><p>Kui see märkeruut on täidetud, taaskäivitab su süsteem automaatselt, kui vajutad <span style=" font-style:italic;">Valmis</span> või sulged paigaldaja.</p></body></html> @@ -925,12 +925,12 @@ Installija sulgub ja kõik muutused kaovad. <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>Kõik on valmis.</h1><br/>%1 on installitud sinu arvutisse.<br/>Sa võid nüüd taaskäivitada oma uude süsteemi või jätkata %2 live-keskkonna kasutamist. + <h1>Kõik on valmis.</h1><br/>%1 on paigaldatud sinu arvutisse.<br/>Sa võid nüüd taaskäivitada oma uude süsteemi või jätkata %2 live-keskkonna kasutamist. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. - <h1>Installimine ebaõnnestus</h1><br/>%1 ei installitud sinu arvutisse.<br/>Veateade oli: %2. + <h1>Paigaldamine ebaõnnestus</h1><br/>%1 ei paigaldatud sinu arvutisse.<br/>Veateade oli: %2. @@ -943,12 +943,12 @@ Installija sulgub ja kõik muutused kaovad. Installation Complete - Installimine lõpetatud + Paigaldus valmis The installation of %1 is complete. - %1 installimine on lõpetatud. + %1 paigaldus on valmis. @@ -971,7 +971,7 @@ Installija sulgub ja kõik muutused kaovad. The installer failed to format partition %1 on disk '%2'. - Installija ei suutnud vormindada partitsiooni %1 kettal "%2". + Paigaldaja ei suutnud vormindada partitsiooni %1 kettal "%2". @@ -979,12 +979,12 @@ Installija sulgub ja kõik muutused kaovad. Konsole not installed - Konsole pole installitud + Konsole pole paigaldatud Please install KDE Konsole and try again! - Palun installi KDE Konsole ja proovi uuesti! + Palun paigalda KDE Konsole ja proovi uuesti! @@ -1059,7 +1059,7 @@ Installija sulgub ja kõik muutused kaovad. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. - <h1>Litsensileping</h1>See seadistusprotseduur installib omandiõigusega tarkvara, mis vastab litsensitingimustele. + <h1>Litsensileping</h1>See seadistusprotseduur paigaldab omandiõigusega tarkvara, mis vastab litsensitingimustele. @@ -1069,12 +1069,12 @@ Installija sulgub ja kõik muutused kaovad. <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. - <h1>Litsensileping</h1>See seadistusprotseduur võib installida omandiõigusega tarkvara, mis vastab litsensitingimustele, et pakkuda lisafunktsioone ja täiendada kasutajakogemust. + <h1>Litsensileping</h1>See seadistusprotseduur võib paigaldada omandiõigusega tarkvara, mis vastab litsensitingimustele, et pakkuda lisafunktsioone ja täiendada kasutajakogemust. 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. - Palun loe läbi allolevad lõppkasutaja litsensilepingud (EULAd).<br/>Kui sa tingimustega ei nõustu, ei installita omandiõigusega tarkvara ning selle asemel kasutatakse avatud lähtekoodiga alternatiive. + Palun loe läbi allolevad lõppkasutaja litsensilepingud (EULAd).<br/>Kui sa tingimustega ei nõustu, ei paigaldata omandiõigusega tarkvara ning selle asemel kasutatakse avatud lähtekoodiga alternatiive. @@ -1190,12 +1190,12 @@ Installija sulgub ja kõik muutused kaovad. Network Installation. (Disabled: Unable to fetch package lists, check your network connection) - Võrguinstall. (Keelatud: paketinimistute saamine ebaõnnestus, kontrolli oma võrguühendust) + Võrgupaigaldus. (Keelatud: paketinimistute saamine ebaõnnestus, kontrolli oma võrguühendust) Network Installation. (Disabled: Received invalid groups data) - Võrguinstall. (Keelatud: vastu võetud sobimatud grupiandmed) + Võrgupaigaldus. (Keelatud: vastu võetud sobimatud grupiandmed) @@ -1494,7 +1494,7 @@ Installija sulgub ja kõik muutused kaovad. <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> - <small>Kui rohkem kui üks inimene kasutab seda arvutit, saad sa määrata mitu kontot peale installi.</small> + <small>Kui rohkem kui üks inimene kasutab seda arvutit, saad sa pärast paigaldust määrata mitu kontot.</small> @@ -1655,7 +1655,7 @@ Installija sulgub ja kõik muutused kaovad. Install boot &loader on: - Installi käivituslaadur kohta: + Paigalda käivituslaadur kohta: @@ -1688,12 +1688,12 @@ Installija sulgub ja kõik muutused kaovad. Install %1 <strong>alongside</strong> another operating system. - Installi %1 praeguse operatsioonisüsteemi <strong>kõrvale</strong> + Paigalda %1 praeguse operatsioonisüsteemi <strong>kõrvale</strong> <strong>Erase</strong> disk and install %1. - <strong>Tühjenda</strong> ketas ja installi %1. + <strong>Tühjenda</strong> ketas ja paigalda %1. @@ -1708,12 +1708,12 @@ Installija sulgub ja kõik muutused kaovad. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). - Installi %1 teise operatsioonisüsteemi <strong>kõrvale</strong> kettal <strong>%2</strong> (%3). + Paigalda %1 teise operatsioonisüsteemi <strong>kõrvale</strong> kettal <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. - <strong>Tühjenda</strong> ketas <strong>%2</strong> (%3) ja installi %1. + <strong>Tühjenda</strong> ketas <strong>%2</strong> (%3) ja paigalda %1. @@ -1800,7 +1800,7 @@ Installija sulgub ja kõik muutused kaovad. 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. - Palun vali KDE Plasma Desktop'ile välimus-ja-tunnetus. Sa võid selle sammu ka vahele jätta ja seadistada välimust-ja-tunnetust siis, kui süsteem on installitud. Välimuse-ja-tunnetuse valikule klõpsates näed selle reaalajas eelvaadet. + Palun vali KDE Plasma töölauale välimus-ja-tunnetus. Sa võid selle sammu ka vahele jätta ja seadistada välimust-ja-tunnetust siis, kui süsteem on paigaldatud. Välimuse-ja-tunnetuse valikule klõpsates näed selle reaalajas eelvaadet. @@ -1947,7 +1947,7 @@ Väljund: Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. - Vali, kuhu soovid %1 installida.<br/><font color="red">Hoiatus: </font>see kustutab valitud partitsioonilt kõik failid. + Vali, kuhu soovid %1 paigaldada.<br/><font color="red">Hoiatus: </font>see kustutab valitud partitsioonilt kõik failid. @@ -1957,17 +1957,17 @@ Väljund: %1 cannot be installed on empty space. Please select an existing partition. - %1 ei saa installida tühjale kohale. Palun vali olemasolev partitsioon. + %1 ei saa paigldada tühjale kohale. Palun vali olemasolev partitsioon. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. - %1 ei saa installida laiendatud partitsioonile. Palun vali olemasolev põhiline või loogiline partitsioon. + %1 ei saa paigaldada laiendatud partitsioonile. Palun vali olemasolev põhiline või loogiline partitsioon. %1 cannot be installed on this partition. - %1 ei saa installida sellele partitsioonidel. + %1 ei saa sellele partitsioonile paigaldada. @@ -1999,7 +1999,7 @@ Väljund: <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 installitakse partitsioonile %2.<br/><font color="red">Hoiatus: </font>kõik andmed partitsioonil %2 kaovad. + <strong>%3</strong><br/><br/>%1 paigaldatakse partitsioonile %2.<br/><font color="red">Hoiatus: </font>kõik andmed partitsioonil %2 kaovad. @@ -2062,12 +2062,12 @@ Väljund: The installer is not running with administrator rights. - Installija ei tööta administraatoriõigustega. + Paigaldaja pole käivitatud administraatoriõigustega. The screen is too small to display the installer. - Ekraan on liiga väike installija kuvamiseks. + Ekraan on paigaldaja kuvamiseks liiga väike. @@ -2090,7 +2090,7 @@ Väljund: The installer failed to resize partition %1 on disk '%2'. - Installijal ebaõnnestus partitsiooni %1 suuruse muutmine kettal "%2". + Paigaldajal ebaõnnestus partitsiooni %1 suuruse muutmine kettal "%2". @@ -2246,7 +2246,7 @@ Väljund: The installer failed to set flags on partition %1. - Installija ei suutnud silte määrata partitsioonile %1. + Paigaldaja ei suutnud partitsioonile %1 silte määrata. @@ -2352,7 +2352,7 @@ Väljund: This is an overview of what will happen once you start the install procedure. - See on ülevaade sellest mis juhtub, kui alustad installiprotseduuri. + See on ülevaade sellest mis juhtub, kui alustad paigaldusprotseduuri. @@ -2368,17 +2368,17 @@ Väljund: Installation feedback - Installimise tagasiside + Paigalduse tagasiside Sending installation feedback. - Saadan installimise tagasisidet. + Saadan paigalduse tagasisidet. Internal error in install-tracking. - Installi jälitamisel esines sisemine viga. + Paigaldate jälitamisel esines sisemine viga. @@ -2430,7 +2430,7 @@ Väljund: <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>Seda valides <span style=" font-weight:600;">ei saada sa üldse</span> teavet oma installi kohta.</p></body></html> + <html><head/><body><p>Seda valides <span style=" font-weight:600;">ei saada sa üldse</span> teavet oma paigalduse kohta.</p></body></html> @@ -2454,22 +2454,22 @@ Väljund: 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. - Installijälitamine aitab %1-l näha, mitu kasutajat neil on, mis riistvarale nad %1 installivad ja (märkides kaks alumist valikut) saada pidevat teavet eelistatud rakenduste kohta. Et näha, mis infot saadetakse, palun klõpsa abiikooni iga ala kõrval. + Paigalduse jälitamine aitab %1-l näha, mitu kasutajat neil on, mis riistvarale nad %1 paigaldavad ja (märkides kaks alumist valikut) saada pidevat teavet eelistatud rakenduste kohta. Et näha, mis infot saadetakse, palun klõpsa abiikooni iga ala kõrval. 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. - Seda valides saadad sa teavet oma installi ja riistvara kohta. See teave <b>saadetakse ainult korra</b>peale installi lõppu. + Seda valides saadad sa teavet oma paigalduse ja riistvara kohta. See teave <b>saadetakse ainult korra</b>peale paigalduse lõppu. By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. - Seda valides saadad sa %1-le <b>perioodiliselt</b> infot oma installi, riistvara ja rakenduste kohta. + Seda valides saadad sa %1-le <b>perioodiliselt</b> infot oma paigalduse, riistvara ja rakenduste kohta. By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. - Seda valides saadad sa %1-le <b>regulaarselt</b> infot oma installi, riistvara, rakenduste ja kasutusharjumuste kohta. + Seda valides saadad sa %1-le <b>regulaarselt</b> infot oma paigalduse, riistvara, rakenduste ja kasutusharjumuste kohta. @@ -2557,17 +2557,17 @@ Väljund: <h1>Welcome to the %1 installer.</h1> - <h1>Tere tulemast %1 installijasse.</h1> + <h1>Tere tulemast %1 paigaldajasse.</h1> <h1>Welcome to the Calamares installer for %1.</h1> - <h1>Tere tulemast Calamares'i installijasse %1 jaoks.</h1> + <h1>Tere tulemast Calamares'i paigaldajasse %1 jaoks.</h1> About %1 installer - Teave %1 installija kohta + Teave %1 paigaldaja kohta From e6dc7473dae929c9bf88e66c3e7156e4c11d02dc Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Thu, 14 Jun 2018 04:47:51 -0400 Subject: [PATCH 38/50] i18n: [desktop] Automatic merge of Transifex translations --- calamares.desktop | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/calamares.desktop b/calamares.desktop index f8be5d1f3..c1c8d44e2 100644 --- a/calamares.desktop +++ b/calamares.desktop @@ -47,9 +47,9 @@ GenericName[es]=Instalador del Sistema Comment[es]=Calamares — Instalador del Sistema Name[es]=Instalar Sistema Icon[et]=calamares -GenericName[et]=Süsteemi installija -Comment[et]=Calamares — Süsteemi installija -Name[et]=Installi süsteem +GenericName[et]=Süsteemipaigaldaja +Comment[et]=Calamares — süsteemipaigaldaja +Name[et]=Paigalda süsteem Name[eu]=Sistema instalatu Name[es_PR]=Instalar el sistema Icon[fr]=calamares @@ -156,6 +156,9 @@ Icon[eo]=calamares GenericName[eo]=Sistema Instalilo Comment[eo]=Calamares — Sistema Instalilo Name[eo]=Instali Sistemo +Icon[es_MX]=calamares +GenericName[es_MX]=Instalador del sistema +Comment[es_MX]=Calamares - Instalador del sistema Name[es_MX]=Instalar el Sistema Icon[pt_PT]=calamares GenericName[pt_PT]=Instalador de Sistema From 0ea3d85ab0313fcc46180ddeb4f9b3537cbe4200 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Thu, 14 Jun 2018 04:47:53 -0400 Subject: [PATCH 39/50] i18n: [dummypythonqt] Automatic merge of Transifex translations --- .../lang/es_MX/LC_MESSAGES/dummypythonqt.mo | Bin 436 -> 1017 bytes .../lang/es_MX/LC_MESSAGES/dummypythonqt.po | 15 ++++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/modules/dummypythonqt/lang/es_MX/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/es_MX/LC_MESSAGES/dummypythonqt.mo index 73c58bb4a405e077a87de0ffb9937f1c23637c35..bb3f4ea3f029e4c94ce4ae387f07af9a8114fba7 100644 GIT binary patch literal 1017 zcmZuv&2G~`5H?Ui7;&HnxB!~o62aO|)St*Dh%|L+plL#yM!*F&&L-Yq?^@n<(@^mS zT#>l)09+9qxWIw8;2Ah`V(hkw1YP;tZ)bL9zV+_>T3mQ<;JA#qh3F!#BHkgg@da@W z@fA@({6t(q{6^eF{6XA6ES@urRpcV_H^eK%b+qqXFpM>12YC@WK+bfIkZ&V@K;A(9 zjEpJyIFB=$#=@~Vn=j!iJLkpBQv<;!@N|dvS!ki9G}Wnsh$%%!42Cj+%`}Rp(4Oi* zil-VL%f4mQL+-!Es3qf{-5zI?Jzp4ZuHw06x7i)EroQ;qn5Y@{Pay3z%+-RhEh!l=e1 zvPm^_q3o0@#91Nb3OLK|${KN&9R~wRhaK>&_(|Mzuht>W7TK)9cFS!x?!IX4dgcyQ znsgH?R7kZbOo|WLVOGKRX-FfQFlB4ZRd(5NR!cThFPqQoqS$@Y3vIMB4r13)@b_zn@1=*#@A+8 zQPV+odkF;=0{(EHj^(`NhTPZO=h8C1f83^Tz{l`2C0F8$?=Rqyym(FmbwNe T3I-NdhGvuZF&a!ZWO@q#z1|Dt diff --git a/src/modules/dummypythonqt/lang/es_MX/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/es_MX/LC_MESSAGES/dummypythonqt.po index 22412c347..8ccd80311 100644 --- a/src/modules/dummypythonqt/lang/es_MX/LC_MESSAGES/dummypythonqt.po +++ b/src/modules/dummypythonqt/lang/es_MX/LC_MESSAGES/dummypythonqt.po @@ -8,8 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-09-04 08:16-0400\n" +"POT-Creation-Date: 2018-05-28 04:57-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: guillermo pacheco , 2018\n" "Language-Team: Spanish (Mexico) (https://www.transifex.com/calamares/teams/20061/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,24 +20,24 @@ msgstr "" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" -msgstr "" +msgstr "¡Haz clic en mí!" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." -msgstr "" +msgstr "Una nueva QLabel." #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" -msgstr "" +msgstr "Vision del PythonQt ficticio" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" -msgstr "" +msgstr "Trabajo del PythonQt ficticio" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" -msgstr "" +msgstr "Este es el Trabajo PythonQt ficticio. El trabajo ficticio dice: {}" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." -msgstr "" +msgstr "Un mensaje de estado para el trabajo PythonQt ficticio." From 781bdcc1a42d3be808c801603455a32133d49442 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Thu, 14 Jun 2018 04:47:53 -0400 Subject: [PATCH 40/50] i18n: [python] Automatic merge of Transifex translations --- lang/python/es_MX/LC_MESSAGES/python.mo | Bin 436 -> 1199 bytes lang/python/es_MX/LC_MESSAGES/python.po | 21 +++++++++++---------- lang/python/et/LC_MESSAGES/python.mo | Bin 1113 -> 1123 bytes lang/python/et/LC_MESSAGES/python.po | 10 +++++----- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/lang/python/es_MX/LC_MESSAGES/python.mo b/lang/python/es_MX/LC_MESSAGES/python.mo index 3b6df235cfd484222c6a19c026a0dc5175d2f352..b8b639ba04f8d2b6e209d6dde77e4c334b54a960 100644 GIT binary patch literal 1199 zcmZWo%Wl&^6g5zwL}Eb&f(4*qQIx1m?1UB~mmor$mI%^BX<7jiLQ{K^OtEKN&$w-b z_=j%#7l;jO76^%7V29uXSn&fK=LvMAqvN^0_uQH5A34;03S`cECsAE8x%IPrx_e8urI$EbA)x1Nb)hD|in43tR+S zGnSPD-36!nSKyoABQPYaS>QB~uJp|3fwSpmw2(Gfkh9LEPpe57_DR$?JtfJm+R6VL z(S}Fl?K^9oOCB@BNyxmOkemuXZ`GtWEC@)%yf>`N^&}!>mng}{FaC+oXJr!R{P8;! zHDl#*t<$2h63NbIJ(Wm_NJj*m=sxZf4qNVW z&(NArw|T6Ek}hdhR-RVYt7N;{+N?D;GA$md*wDJ}3ZFhsx|+6?OES$yo36y185Ge~ zjKn2Hr%)ppTw?iFmVU)P`8xlFxQ zuTCda$UB)8B@LH2a6iJ$4L>w?6fhx|iPvMX=BB*WUZbUHUfQk0V_KD-^6}+dQrZz_ za%7hbdS#kH60?A=sW{Xwk<5uQ43Tr#xt tpk%D`m!0hsX6FBk58XTnkJQIH_&K=_@da>3EmAKtonC^)_$l`>fIo$eTvz}A delta 69 zcmZ3_xrN!{o)F7a1|VPrVi_P-0b*t#)&XJ=umIvJprj>`2C0F8$=4YBC$C_73jh$u B2(bVF diff --git a/lang/python/es_MX/LC_MESSAGES/python.po b/lang/python/es_MX/LC_MESSAGES/python.po index 386952128..45fc72c65 100644 --- a/lang/python/es_MX/LC_MESSAGES/python.po +++ b/lang/python/es_MX/LC_MESSAGES/python.po @@ -10,6 +10,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-05-28 04:57-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: guillermo pacheco , 2018\n" "Language-Team: Spanish (Mexico) (https://www.transifex.com/calamares/teams/20061/es_MX/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,39 +20,39 @@ msgstr "" #: src/modules/umount/main.py:40 msgid "Unmount file systems." -msgstr "" +msgstr "Desmontar sistemas de archivo." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." -msgstr "" +msgstr "Trabajo python ficticio." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" -msgstr "" +msgstr "Paso python ficticio {}" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." -msgstr "" +msgstr "Generar identificación de la maquina." #: src/modules/packages/main.py:61 #, python-format msgid "Processing packages (%(count)d / %(total)d)" -msgstr "" +msgstr "Procesando paquetes (%(count)d/%(total)d)" #: src/modules/packages/main.py:63 src/modules/packages/main.py:73 msgid "Install packages." -msgstr "" +msgstr "Instalar paquetes." #: src/modules/packages/main.py:66 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Instalando un paquete." +msgstr[1] "Instalando%(num)d paquetes." #: src/modules/packages/main.py:69 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Removiendo un paquete." +msgstr[1] "Removiendo %(num)dpaquetes." diff --git a/lang/python/et/LC_MESSAGES/python.mo b/lang/python/et/LC_MESSAGES/python.mo index 89b3804b58ec00152f1f59824b47e745391b9d6c..2fea8bab0fa4fa571dd762e4ebb2a478a6bbccfc 100644 GIT binary patch delta 133 zcmcb~@t9*mi>e?41H)2g1_nbQy&XvF0O^-NS|3P@u`n>m0BN_4EB`P#1|(*tC+4Ii zDikDUre!1#FzhxcTpf<=)9RWy;@Oj*F*{mh>M^*c<|gK(B<3j~O9I6` g5);!i719zjb25t$?_W07oA)$N&HU diff --git a/lang/python/et/LC_MESSAGES/python.po b/lang/python/et/LC_MESSAGES/python.po index eeccccc30..ccd9b1b7d 100644 --- a/lang/python/et/LC_MESSAGES/python.po +++ b/lang/python/et/LC_MESSAGES/python.po @@ -41,18 +41,18 @@ msgstr "Pakkide töötlemine (%(count)d / %(total)d)" #: src/modules/packages/main.py:63 src/modules/packages/main.py:73 msgid "Install packages." -msgstr "Installi pakid." +msgstr "Paigalda paketid." #: src/modules/packages/main.py:66 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." -msgstr[0] "Installin ühe paki." -msgstr[1] "Installin %(num)d pakki." +msgstr[0] "Paigaldan ühe paketi." +msgstr[1] "Paigaldan %(num)d paketti." #: src/modules/packages/main.py:69 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." -msgstr[0] "Eemaldan ühe paki." -msgstr[1] "Eemaldan %(num)d pakki." +msgstr[0] "Eemaldan ühe paketi." +msgstr[1] "Eemaldan %(num)d paketti." From ef897f59f5156c327c505b65cc2d63e473e2fdd4 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Thu, 14 Jun 2018 05:01:20 -0400 Subject: [PATCH 41/50] i18n: Add Korean (ko) language translations Since this is a new language, it is currently 0% translated. That is why it goes into _tx_bad. It will move to one of the other categories once some translation has happened. Add the (still empty) Transifex files already. --- CMakeLists.txt | 2 +- lang/calamares_ko.ts | 2587 +++++++++++++++++ lang/python/ko/LC_MESSAGES/python.mo | Bin 0 -> 413 bytes lang/python/ko/LC_MESSAGES/python.po | 55 + .../lang/ko/LC_MESSAGES/dummypythonqt.mo | Bin 0 -> 413 bytes .../lang/ko/LC_MESSAGES/dummypythonqt.po | 42 + 6 files changed, 2685 insertions(+), 1 deletion(-) create mode 100644 lang/calamares_ko.ts create mode 100644 lang/python/ko/LC_MESSAGES/python.mo create mode 100644 lang/python/ko/LC_MESSAGES/python.po create mode 100644 src/modules/dummypythonqt/lang/ko/LC_MESSAGES/dummypythonqt.mo create mode 100644 src/modules/dummypythonqt/lang/ko/LC_MESSAGES/dummypythonqt.po diff --git a/CMakeLists.txt b/CMakeLists.txt index c33ad8e6f..1627ff32f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,7 +86,7 @@ set( _tx_complete da pt_PT ro tr_TR zh_TW zh_CN pt_BR fr hr ca lt id cs_CZ ) set( _tx_good sq es pl ja sk it_IT hu ru he de nl bg uk ) set( _tx_ok ast is ar sv el es_MX gl en_GB th fi_FI hi eu sr nb sl sr@latin mr es_PR kk kn et be ) -set( _tx_bad uz lo ur gu fr_CH fa eo ) +set( _tx_bad uz lo ur gu fr_CH fa eo ko ) ### Required versions diff --git a/lang/calamares_ko.ts b/lang/calamares_ko.ts new file mode 100644 index 000000000..73b81b498 --- /dev/null +++ b/lang/calamares_ko.ts @@ -0,0 +1,2587 @@ + + + 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::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. + + + + + &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. + + + + + 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) + + + + + 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 + + + + + &Create + + + + + &Edit + + + + + &Delete + + + + + Install 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 + + + + + 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. + + + + + 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'. + + + + + 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 + + + + + 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/python/ko/LC_MESSAGES/python.mo b/lang/python/ko/LC_MESSAGES/python.mo new file mode 100644 index 0000000000000000000000000000000000000000..9dfa007bded575a5934de04c1ed37c5ebb18a03d GIT binary patch literal 413 zcmYL^K~KUk6vs7s+R?Lz9z1CD(T;%55)KoFE;zQ#Nuswp%9xCHX^Y?o@$30n?9{+N z`Q^2F|Nraj_sQ|sfz_eq)N*DyvRqjjd6wKZZ*6TnJ0(iK^V~ol;u;&9(6~*=wTqV$UpP@11^XYlE#eHMFkBeOK5M(F;ah|2ij|^= z@&!|xoBne)0&nkYo|, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-28 04:57-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Language-Team: Korean (https://www.transifex.com/calamares/teams/20061/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: 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:61 +#, python-format +msgid "Processing packages (%(count)d / %(total)d)" +msgstr "" + +#: src/modules/packages/main.py:63 src/modules/packages/main.py:73 +msgid "Install packages." +msgstr "" + +#: src/modules/packages/main.py:66 +#, python-format +msgid "Installing one package." +msgid_plural "Installing %(num)d packages." +msgstr[0] "" + +#: src/modules/packages/main.py:69 +#, python-format +msgid "Removing one package." +msgid_plural "Removing %(num)d packages." +msgstr[0] "" diff --git a/src/modules/dummypythonqt/lang/ko/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/ko/LC_MESSAGES/dummypythonqt.mo new file mode 100644 index 0000000000000000000000000000000000000000..9dfa007bded575a5934de04c1ed37c5ebb18a03d GIT binary patch literal 413 zcmYL^K~KUk6vs7s+R?Lz9z1CD(T;%55)KoFE;zQ#Nuswp%9xCHX^Y?o@$30n?9{+N z`Q^2F|Nraj_sQ|sfz_eq)N*DyvRqjjd6wKZZ*6TnJ0(iK^V~ol;u;&9(6~*=wTqV$UpP@11^XYlE#eHMFkBeOK5M(F;ah|2ij|^= z@&!|xoBne)0&nkYo|, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-28 04:57-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Language-Team: Korean (https://www.transifex.com/calamares/teams/20061/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: src/modules/dummypythonqt/main.py:84 +msgid "Click me!" +msgstr "" + +#: src/modules/dummypythonqt/main.py:94 +msgid "A new QLabel." +msgstr "" + +#: src/modules/dummypythonqt/main.py:97 +msgid "Dummy PythonQt ViewStep" +msgstr "" + +#: src/modules/dummypythonqt/main.py:183 +msgid "The Dummy PythonQt Job" +msgstr "" + +#: src/modules/dummypythonqt/main.py:186 +msgid "This is the Dummy PythonQt Job. The dummy job says: {}" +msgstr "" + +#: src/modules/dummypythonqt/main.py:190 +msgid "A status message for Dummy PythonQt Job." +msgstr "" From fa0518f9688fcc715f92f664bb31cd0726c31fbd Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 14 Jun 2018 05:41:43 -0400 Subject: [PATCH 42/50] [contextualprocess] Make conversion explicit - Should help with Qt 5.7 compatibility. Reported from Neptune Linux, #979 --- src/modules/contextualprocess/ContextualProcessJob.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/contextualprocess/ContextualProcessJob.cpp b/src/modules/contextualprocess/ContextualProcessJob.cpp index 380a92d0a..3c0a24433 100644 --- a/src/modules/contextualprocess/ContextualProcessJob.cpp +++ b/src/modules/contextualprocess/ContextualProcessJob.cpp @@ -66,7 +66,7 @@ struct ContextualProcessBinding void append( const QString& value, CalamaresUtils::CommandList* commands ) { checks.append( ValueCheck( value, commands ) ); - if ( value == '*' ) + if ( value == QLatin1Char('*') ) wildcard = commands; } From 5935d57069d2460d49dd4aee59cc4240b65fbcbf Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 14 Jun 2018 05:50:24 -0400 Subject: [PATCH 43/50] CMake: bump minimum Qt to 5.7 to match kpmcore --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1627ff32f..60048f44c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,7 +92,7 @@ set( _tx_bad uz lo ur gu fr_CH fa eo ko ) ### Required versions # # See DEPENDENCIES section below. -set( QT_VERSION 5.6.0 ) +set( QT_VERSION 5.7.0 ) set( YAMLCPP_VERSION 0.5.1 ) set( ECM_VERSION 5.18 ) set( PYTHONLIBS_VERSION 3.3 ) From 7eae99223ec414bd7f579cde48d7857e453dbb24 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 14 Jun 2018 06:11:39 -0400 Subject: [PATCH 44/50] CMake: check if rcc supports --format-version - The new format was introduced in Qt 5.7, and Qt 5.9 introduced the --format-version flag to rcc to switch back to the reproducible format 1. For distro's with Qt 5.7, don't use the new flag. - Reported from Neptune Linux, #979 --- CMakeModules/CalamaresAddTranslations.cmake | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/CMakeModules/CalamaresAddTranslations.cmake b/CMakeModules/CalamaresAddTranslations.cmake index f5dd8c50c..924ee2483 100644 --- a/CMakeModules/CalamaresAddTranslations.cmake +++ b/CMakeModules/CalamaresAddTranslations.cmake @@ -22,6 +22,25 @@ include( CMakeParseArguments ) +if( NOT _rcc_version_support_checked ) + set( _rcc_version_support_checked TRUE ) + execute_process( + COMMAND echo "" + COMMAND ${Qt5Core_RCC_EXECUTABLE} --format-version 1 --list - + RESULT_VARIABLE _rcc_version_rv + ERROR_VARIABLE _rcc_version_dump + ) + message( STATUS "RCC ${_rcc_version_rv} ${_rcc_version_dump}" ) + if ( _rc_version_rv ) # Not zero + set( _rcc_version_support "" ) # Assume it is version 1 (Qt 5.7) or derpy (Qt 5.8) + else() + set( _rcc_version_support --format-version 1 ) + endif() + unset( _rcc_version_rv ) + unset( _rcc_version_dump ) +endif() + + # Internal macro for adding the C++ / Qt translations to the # build and install tree. Should be called only once, from # src/calamares/CMakeLists.txt. @@ -61,7 +80,7 @@ macro(add_calamares_translations language) add_custom_command( OUTPUT ${trans_outfile} COMMAND "${Qt5Core_RCC_EXECUTABLE}" - ARGS ${rcc_options} --format-version 1 -name ${trans_file} -o ${trans_outfile} ${trans_infile} + ARGS ${rcc_options} ${_rcc_version_support} -name ${trans_file} -o ${trans_outfile} ${trans_infile} MAIN_DEPENDENCY ${trans_infile} DEPENDS ${QM_FILES} ) From 0ffb6ed67ca49e04e9e528437d61bcc10f5765ad Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 14 Jun 2018 06:41:08 -0400 Subject: [PATCH 45/50] CMake: fix checks for supported rcc format versions --- CMakeModules/CalamaresAddTranslations.cmake | 23 +++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/CMakeModules/CalamaresAddTranslations.cmake b/CMakeModules/CalamaresAddTranslations.cmake index 924ee2483..4892cc0f9 100644 --- a/CMakeModules/CalamaresAddTranslations.cmake +++ b/CMakeModules/CalamaresAddTranslations.cmake @@ -24,17 +24,32 @@ include( CMakeParseArguments ) if( NOT _rcc_version_support_checked ) set( _rcc_version_support_checked TRUE ) + + # Extract the executable name + get_property( _rcc_executable + TARGET ${Qt5Core_RCC_EXECUTABLE} + PROPERTY IMPORTED_LOCATION + ) + if( NOT _rcc_executable ) + # Weird, probably now uses Qt5::rcc which is wrong too + set( _rcc_executable ${Qt5Core_RCC_EXECUTABLE} ) + endif() + + # Try an empty RCC file with explicit format-version execute_process( COMMAND echo "" COMMAND ${Qt5Core_RCC_EXECUTABLE} --format-version 1 --list - RESULT_VARIABLE _rcc_version_rv ERROR_VARIABLE _rcc_version_dump ) - message( STATUS "RCC ${_rcc_version_rv} ${_rcc_version_dump}" ) - if ( _rc_version_rv ) # Not zero - set( _rcc_version_support "" ) # Assume it is version 1 (Qt 5.7) or derpy (Qt 5.8) - else() + if ( _rcc_version_rv EQUAL 0 ) + # Supported: force to the reproducible version set( _rcc_version_support --format-version 1 ) + else() + # Older Qt versions (5.7, 5.8) don't support setting the + # rcc format-version, so won't be reproducible if they + # default to version 2. + set( _rcc_version_support "" ) endif() unset( _rcc_version_rv ) unset( _rcc_version_dump ) From 2d29bf4449554015a1b2c90b370c78c0c189a246 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 14 Jun 2018 06:46:06 -0400 Subject: [PATCH 46/50] [contextualprocess] Make conversion explicit - Qt 5.7 doesn't like QLatin1Char comparison, so switch to a full string. Tested on Neptune Linux, #979 --- src/modules/contextualprocess/ContextualProcessJob.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/contextualprocess/ContextualProcessJob.cpp b/src/modules/contextualprocess/ContextualProcessJob.cpp index 3c0a24433..d3f4554d2 100644 --- a/src/modules/contextualprocess/ContextualProcessJob.cpp +++ b/src/modules/contextualprocess/ContextualProcessJob.cpp @@ -66,7 +66,7 @@ struct ContextualProcessBinding void append( const QString& value, CalamaresUtils::CommandList* commands ) { checks.append( ValueCheck( value, commands ) ); - if ( value == QLatin1Char('*') ) + if ( value == QLatin1Literal("*") ) wildcard = commands; } From 0ccca6902bb8a58203e2fd8b7b26225d8d1f8185 Mon Sep 17 00:00:00 2001 From: Gabriel Craciunescu Date: Mon, 11 Jun 2018 15:25:26 +0200 Subject: [PATCH 47/50] [grubcfg] fix inter-module dependency with plymouthcfg modules The plymouthcfg Calamares module is optional. Distributions which write filesystems with a full plymouth configuration won't even want to use it (see plymouthcfg docs). However, now grubcfg depends on plymouthcfg to run because the globalstorage value to trigger setting 'splash' in grub, is set in the plymouthcfg module. Just check for plymouth existence separately in the grub module. Fixes ea1c8a0e5ddfc6b72311cf744e2ac514c6630009 --- src/modules/grubcfg/main.py | 13 +++++++++---- src/modules/plymouthcfg/main.py | 7 +------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/modules/grubcfg/main.py b/src/modules/grubcfg/main.py index 197a22edf..419aa67c1 100644 --- a/src/modules/grubcfg/main.py +++ b/src/modules/grubcfg/main.py @@ -44,16 +44,21 @@ def modify_grub_default(partitions, root_mount_point, distributor): dracut_bin = libcalamares.utils.target_env_call( ["sh", "-c", "which dracut"] ) - have_dracut = dracut_bin == 0 # Shell exit value 0 means success + plymouth_bin = libcalamares.utils.target_env_call( + ["sh", "-c", "which plymouth"] + ) + + # Shell exit value 0 means success + have_plymouth = plymouth_bin == 0 + have_dracut = dracut_bin == 0 use_splash = "" swap_uuid = "" swap_outer_uuid = "" swap_outer_mappername = None - if libcalamares.globalstorage.contains("hasPlymouth"): - if libcalamares.globalstorage.value("hasPlymouth"): - use_splash = "splash" + if have_plymouth: + use_splash = "splash" cryptdevice_params = [] diff --git a/src/modules/plymouthcfg/main.py b/src/modules/plymouthcfg/main.py index 2cb4f6dac..0bbd80de4 100644 --- a/src/modules/plymouthcfg/main.py +++ b/src/modules/plymouthcfg/main.py @@ -40,14 +40,9 @@ class PlymouthController: "/etc/plymouth/plymouthd.conf"]) def detect(self): - isPlymouth = target_env_call(["which", "plymouth"]) + isPlymouth = target_env_call(["sh", "-c", "which plymouth"]) debug("which plymouth exit code: {!s}".format(isPlymouth)) - if isPlymouth == 0: - libcalamares.globalstorage.insert("hasPlymouth", True) - else: - libcalamares.globalstorage.insert("hasPlymouth", False) - return isPlymouth def run(self): From 011310091c13faab5c4673757d2d62700bec96eb Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 14 Jun 2018 14:50:47 +0200 Subject: [PATCH 48/50] [contextualprocess] QLatin1String -> QString As Kevin pointed out, there's an extra conversion involved here -- although with -O3 the difference boils away leaving only a call to a from-ASCII helper or a from-Latin1 helper. While here, coding-style. --- src/modules/contextualprocess/ContextualProcessJob.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/contextualprocess/ContextualProcessJob.cpp b/src/modules/contextualprocess/ContextualProcessJob.cpp index d3f4554d2..d79297029 100644 --- a/src/modules/contextualprocess/ContextualProcessJob.cpp +++ b/src/modules/contextualprocess/ContextualProcessJob.cpp @@ -66,7 +66,7 @@ struct ContextualProcessBinding void append( const QString& value, CalamaresUtils::CommandList* commands ) { checks.append( ValueCheck( value, commands ) ); - if ( value == QLatin1Literal("*") ) + if ( value == QString( "*" ) ) wildcard = commands; } From 67ad37581f16b1ff1bb79abea7dc7c8f67e590c7 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 14 Jun 2018 14:57:17 +0200 Subject: [PATCH 49/50] [contextualprocess] Document corner-case The "*" will match its literal value, but is also used as a wildcard. --- src/modules/contextualprocess/contextualprocess.conf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/modules/contextualprocess/contextualprocess.conf b/src/modules/contextualprocess/contextualprocess.conf index 1f148328c..74bd2304a 100644 --- a/src/modules/contextualprocess/contextualprocess.conf +++ b/src/modules/contextualprocess/contextualprocess.conf @@ -17,7 +17,10 @@ # # As a special case, the value-check "*" matches any value, but **only** # if no other value-check matches. Use it as an *else* form for value- -# checks. Take care to put the asterisk in quotes. +# checks. Take care to put the asterisk in quotes. The value-check "*" +# **also** matches a literal asterisk as value; a confusing corner case +# is checking for an asterisk **and** having a wildcard match with +# different commands. This is currently not possible. # # Global configuration variables are not checked in a deterministic # order, so do not rely on commands from one variable-check to From 448c5eae169d10a243dcc35dc91e95c693d499d7 Mon Sep 17 00:00:00 2001 From: Raul Rodrigo Segura Date: Thu, 14 Jun 2018 16:33:58 +0200 Subject: [PATCH 50/50] style code --- src/libcalamaresui/modulesystem/PythonQtViewModule.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp b/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp index d010f2200..88b0c207f 100644 --- a/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp +++ b/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp @@ -96,7 +96,7 @@ PythonQtViewModule::loadSelf() cala.addObject( "utils", s_utils ); // Append configuration object, in module PythonQt.calamares - cala.addVariable("configuration",m_configurationMap); + cala.addVariable("configuration", m_configurationMap); // Basic stdout/stderr handling QObject::connect( PythonQt::self(), &PythonQt::pythonStdOut,