diff --git a/CHANGES b/CHANGES index bc01163ae..cddcc9551 100644 --- a/CHANGES +++ b/CHANGES @@ -3,13 +3,23 @@ contributors are listed. Note that Calamares does not have a historical changelog -- this log starts with version 3.2.0. The release notes on the website will have to do for older versions. - -# 3.2.14 (unreleased) # +# 3.2.15 (unreleased) # This release contains contributions from (alphabetically by first name): + +## Core ## + +## Modules ## + + +# 3.2.14 (2019-09-30) # + +This release contains contributions from (alphabetically by first name): + - Andrius Štikonas - Harald Sitter ## Core ## + - No changes to core functionality ## Modules ## @@ -18,6 +28,11 @@ This release contains contributions from (alphabetically by first name): - *packagechooser* module can now be custom-labeled in the overall progress (left-hand column). #1228 - *displaymanager* module now recognizes KDE Plasma 5.17. + - *displaymanager* module now can handle Wayland sessions and can detect + sessions from their .desktop files. #1247 #1248 + - *unpackfs* now has special handling for *sourcefs* setting "file" + (so you can copy single files or directories that are on the source + system, directly to the target). #1188 #1181 # 3.2.13 (2019-08-30) # diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d290abf5..64e149cd8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,7 @@ cmake_minimum_required( VERSION 3.3 FATAL_ERROR ) project( CALAMARES - VERSION 3.2.13.1 + VERSION 3.2.14 LANGUAGES C CXX ) set( CALAMARES_VERSION_RC 0 ) # Set to 0 during release cycle, 1 during development diff --git a/ci/RELEASE.sh b/ci/RELEASE.sh index 78fc1f7ce..f79b0ed4a 100755 --- a/ci/RELEASE.sh +++ b/ci/RELEASE.sh @@ -1,5 +1,7 @@ #! /bin/sh # +### USAGE +# # Release script for Calamares # # This attempts to perform the different steps of the RELEASE.md @@ -11,15 +13,21 @@ # # None of the "update stuff" is done by this script; in preparation # for the release, you should have already done: -# - updating the version -# - pulling translations -# - updating the language list -# - switching to the right branch +# * updating the version +# * pulling translations +# * updating the language list +# * switching to the right branch # -# You can influence the script a little with environment variables: -# - BUILD_DEFAULT set to false to avoid first build with gcc -# - BUILD_CLANG set to false to avoid second build with clang -# - BUILD_ONLY set to true to break after building +# You can influence the script a little with these options: +# * `-B` do not build (before tagging) +# * `-P` do not package (tag, sign, tarball) +# +# The build / package settings can be influenced via environment variables: +# * BUILD_DEFAULT set to `false` to avoid first build with gcc +# * BUILD_CLANG set to `false` to avoid second build with clang +# * BUILD_ONLY set to `true` to break after building +# +### END USAGE test -d .git || { echo "Not at top-level." ; exit 1 ; } test -d src/modules || { echo "No src/modules." ; exit 1 ; } @@ -30,6 +38,23 @@ test -z "$BUILD_DEFAULT" && BUILD_DEFAULT=true test -z "$BUILD_CLANG" && BUILD_CLANG=true test -z "$BUILD_ONLY" && BUILD_ONLY=false +while getopts "hBP" opt ; do + case "$opt" in + h|\?) + sed -e '1,/USAGE/d' -e '/END.USAGE/,$d' < "$0" + return 0 + ;; + B) + BUILD_DEFAULT=false + BUILD_CLANG=false + ;; + P) + BUILD_ONLY=true + ;; + esac +done + + ### Setup # # @@ -63,11 +88,21 @@ if test "x$BUILD_ONLY" = "xtrue" ; then exit 1 fi +if test -f "$BUILDDIR/CMakeCache.txt" ; then + # Some build has created it, so that's good + : +else + # Presumably -B was given; just do the cmake part + rm -rf "$BUILDDIR" + mkdir "$BUILDDIR" || { echo "Could not create build directory." ; exit 1 ; } + ( cd "$BUILDDIR" && cmake .. ) || { echo "Could not run cmake in $BUILDDIR." ; exit 1 ; } +fi + ### Get version number for this release # # V=$( cd "$BUILDDIR" && make show-version | grep ^CALAMARES_VERSION | sed s/^[A-Z_]*=// ) -test -n "$V" || { echo "Could not obtain version." ; exit 1 ; } +test -n "$V" || { echo "Could not obtain version in $BUILDDIR." ; exit 1 ; } ### Create signed tag # diff --git a/lang/calamares_is.ts b/lang/calamares_is.ts index 00ba48462..874e9adcb 100644 --- a/lang/calamares_is.ts +++ b/lang/calamares_is.ts @@ -99,12 +99,12 @@ Reload Stylesheet - + Endurhlaða stílblað Widget Tree - + Greinar viðmótshluta @@ -117,7 +117,7 @@ Set up - + Setja upp @@ -130,7 +130,7 @@ Job failed (%1) - + Verk mistókst (%1) @@ -253,7 +253,7 @@ Setup Failed - + Uppsetning mistókst @@ -288,7 +288,7 @@ Continue with installation? - + Halda áfram með uppsetningu? @@ -298,12 +298,12 @@ &Set up now - + &Setja upp núna &Set up - + &Setja upp @@ -318,7 +318,7 @@ Cancel setup? - + Hætta við uppsetningu? @@ -1181,7 +1181,7 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. Setup Complete - + Uppsetningu lokið @@ -1191,12 +1191,12 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. The setup of %1 is complete. - + Uppsetningu á %1 er lokið. The installation of %1 is complete. - Uppsetningu af %1 er lokið. + Uppsetningu á %1 er lokið. @@ -1916,7 +1916,7 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. Package Selection - + Valdir pakkar @@ -1929,7 +1929,7 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. Packages - + Pakkar @@ -2112,7 +2112,7 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. Cre&ate - + Útbú&a @@ -2310,7 +2310,7 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. Look-and-Feel - + Útlit og hegðun @@ -2438,7 +2438,7 @@ Output: (no mount point) - + (enginn tengipunktur) @@ -3052,7 +3052,7 @@ Output: Placeholder - + Frátökueining @@ -3222,7 +3222,7 @@ Output: Select application and system language - + Veldu tungumál forrits og kerfis @@ -3232,7 +3232,7 @@ Output: &Donate - + Styr&kja @@ -3247,7 +3247,7 @@ Output: Open release notes website - + Opna vefsvæði með upplýsingum um útgáfuna @@ -3282,17 +3282,17 @@ Output: <h1>Welcome to the Calamares setup program for %1.</h1> - + <h1>Velkomin til Calamares uppsetningarforritið fyrir %1</h1> <h1>Welcome to %1 setup.</h1> - + <h1>Velkomin í %1 uppsetninguna.</h1> About %1 setup - + Um %1 uppsetninguna @@ -3302,7 +3302,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-2019 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. - + <h1>%1</h1><br/><strong>%2<br/>fyrir %3</strong><br/><br/>Höfundarréttur 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Höfundarréttur 2017-2019 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Þakkir til <a href="https://calamares.io/team/">Calamares teymisinsm</a> og <a href="https://www.transifex.com/calamares/calamares/">allra þýðenda Calamares</a>.<br/><br/>Þróun <a href="https://calamares.io/">Calamares</a> er studd af <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. diff --git a/lang/calamares_ml.ts b/lang/calamares_ml.ts index cd78a094c..ca755e70d 100644 --- a/lang/calamares_ml.ts +++ b/lang/calamares_ml.ts @@ -9,7 +9,7 @@ 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. - ഈ സിസ്റ്റം ഒരു <strong>ഇ.എഫ്.ഐ</strong> ബൂട്ട് എൻ‌വയോൺ‌മെന്റ് ഉപയോഗിച്ചാണ് ആരംഭിച്ചത്.<br><br>ഒരു ഇ.എഫ്.ഐ എൻ‌വയോൺ‌മെൻറിൽ‌ നിന്നും സ്റ്റാർ‌ട്ടപ്പ് ക്രമീകരിക്കുന്നതിന് ,ഒരു ഇ.എഫ്.ഐ സിസ്റ്റം പാർട്ടീഷനിൽ ഈ ഇൻസ്റ്റാളർ <strong>ഗ്രബ്</strong> അല്ലെങ്കിൽ <strong>സിസ്റ്റംഡി-ബൂട്ട്</strong> പോലെയുള്ള ഒരു ബൂട്ട് ലോഡർ ആപ്ലിക്കേഷൻ വിന്യസിക്കണം.നിങ്ങൾ മാനുവൽ പാർട്ടീഷനിംഗ് തിരഞ്ഞെടുത്തിട്ടില്ലെങ്കിൽ ഇത് യാന്ത്രികമായി നടക്കേണ്ടതാണ്,അത്തരം സന്ദർഭങ്ങളിൽ നിങ്ങൾ അത് തിരഞ്ഞെടുക്കണം അല്ലെങ്കിൽ സ്വന്തമായി സൃഷ്ടിക്കണം. + ഈ സിസ്റ്റം ഒരു <strong>ഇ.എഫ്.ഐ</strong> ബൂട്ട് എൻ‌വയോൺ‌മെന്റ് ഉപയോഗിച്ചാണ് ആരംഭിച്ചത്.<br>ഒരു ഇ.എഫ്.ഐ എൻ‌വയോൺ‌മെൻറിൽ‌ നിന്നും സ്റ്റാർ‌ട്ടപ്പ് ക്രമീകരിക്കുന്നതിന്, ഒരു ഇ.എഫ്.ഐ സിസ്റ്റം പാർട്ടീഷനിൽ ഈ ഇൻസ്റ്റാളർ <strong>ഗ്രബ്</strong> അല്ലെങ്കിൽ <strong>systemd-boot</strong> പോലെയുള്ള ഒരു ബൂട്ട് ലോഡർ ആപ്ലിക്കേഷൻ വിന്യസിക്കണം.നിങ്ങൾ മാനുവൽ പാർട്ടീഷനിംഗ് തിരഞ്ഞെടുത്തിട്ടില്ലെങ്കിൽ ഇത് യാന്ത്രികമായി നടക്കേണ്ടതാണ്,അത്തരം സന്ദർഭങ്ങളിൽ നിങ്ങൾ അത് തിരഞ്ഞെടുക്കണം അല്ലെങ്കിൽ സ്വന്തമായി സൃഷ്ടിക്കണം.<br> @@ -63,12 +63,12 @@ GlobalStorage - ഗ്ലോബൽ സ്റ്റോറേജ് + GlobalStorage JobQueue - ജോബ് ക്യൂ + JobQueue @@ -238,7 +238,7 @@ &Cancel - റദ്ദാക്കുക (%C) + റദ്ദാക്കുക (&C) @@ -402,7 +402,7 @@ The installer will quit and all changes will be lost. Unknown exception type - + അജ്ഞാതമായ പിശക് @@ -719,7 +719,7 @@ The installer will quit and all changes will be lost. En&crypt - + എൻക്രിപ്റ്റ് (&c) @@ -803,7 +803,7 @@ The installer will quit and all changes will be lost. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). - + <strong>%2</strong> (%3) -ൽ പുതിയ <strong>%1</strong> പാർട്ടീഷൻ ടേബിൾ ഉണ്ടാക്കുക. @@ -813,7 +813,7 @@ The installer will quit and all changes will be lost. The installer failed to create a partition table on %1. - + %1 ൽ പാർട്ടീഷൻ പട്ടിക സൃഷ്ടിക്കുന്നതിൽ ഇൻസ്റ്റാളർ പരാജയപ്പെട്ടു. @@ -1069,7 +1069,7 @@ The installer will quit and all changes will be lost. En&crypt system - + സിസ്റ്റം എൻക്രിപ്റ്റ് ചെയ്യുക (&c) @@ -1170,7 +1170,7 @@ The installer will quit and all changes will be lost. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. - + <h1>ഇൻസ്റ്റാളേഷൻ പരാജയപ്പെട്ടു</h1><br/> നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ %1 സജ്ജമാക്കിയിട്ടില്ല.<br/>പിശക് സന്ദേശം ഇതായിരുന്നു: %2. @@ -1229,22 +1229,22 @@ The installer will quit and all changes will be lost. has at least %1 GiB available drive space - + %1 GiB ഡിസ്ക്സ്പെയ്സ് എങ്കിലും ലഭ്യമായിരിക്കണം. There is not enough drive space. At least %1 GiB is required. - + ആവശ്യത്തിനു ഡിസ്ക്സ്പെയ്സ് ലഭ്യമല്ല. %1 GiB എങ്കിലും വേണം. has at least %1 GiB working memory - + %1 GiB RAM എങ്കിലും ലഭ്യമായിരിക്കണം. The system does not have enough working memory. At least %1 GiB is required. - + സിസ്റ്റത്തിൽ ആവശ്യത്തിനു RAM ലഭ്യമല്ല. %1 GiB എങ്കിലും വേണം. @@ -1391,7 +1391,7 @@ The installer will quit and all changes will be lost. &Cancel - റദ്ദാക്കുക (%C) + റദ്ദാക്കുക (&C) @@ -1515,7 +1515,7 @@ The installer will quit and all changes will be lost. The numbers and dates locale will be set to %1. - + സംഖ്യ & തീയതി രീതി %1 ആയി ക്രമീകരിക്കും. @@ -1531,12 +1531,12 @@ The installer will quit and all changes will be lost. &Change... - + മാറ്റുക (&C)... Set timezone to %1/%2.<br/> - + സമയപദ്ധതി %1/%2 ആയി ക്രമീകരിക്കുക.<br/> @@ -1598,17 +1598,17 @@ The installer will quit and all changes will be lost. Network Installation. (Disabled: Unable to fetch package lists, check your network connection) - + നെറ്റ്‌വർക്ക് ഇൻസ്റ്റാളേഷൻ. (അപ്രാപ്‌തമാക്കി: പാക്കേജ് ലിസ്റ്റുകൾ നേടാനായില്ല, നിങ്ങളുടെ നെറ്റ്‌വർക്ക് കണക്ഷൻ പരിശോധിക്കുക) Network Installation. (Disabled: Received invalid groups data) - + നെറ്റ്‌വർക്ക് ഇൻസ്റ്റാളേഷൻ. (അപ്രാപ്‌തമാക്കി: അസാധുവായ ഗ്രൂപ്പുകളുടെ ഡാറ്റ ലഭിച്ചു) Network Installation. (Disabled: Incorrect configuration) - + നെറ്റ്‌വർക്ക് ഇൻസ്റ്റാളേഷൻ. (പ്രവർത്തനരഹിതമാക്കി: തെറ്റായ ക്രമീകരണം) @@ -1629,7 +1629,7 @@ The installer will quit and all changes will be lost. <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> - + <html><head/><body><p>ഒരു ബാച്ച് ഐഡന്റിഫയർ ഇവിടെ നൽകുക. ഇത് ടാർഗെറ്റ് സിസ്റ്റത്തിൽ സംഭരിക്കും</p></body></html> @@ -1690,7 +1690,7 @@ The installer will quit and all changes will be lost. The password differs with case changes only - + പാസ്‌വേഡ് അക്ഷരങ്ങളുടെ കേസ് മാറ്റങ്ങളിൽ മാത്രം വ്യത്യാസപ്പെട്ടിരിക്കുന്നു @@ -1775,7 +1775,7 @@ The installer will quit and all changes will be lost. The password does not contain enough character classes - + രഹസ്യവാക്കിൽ ആവശ്യത്തിനു അക്ഷരങ്ങൾ ഇല്ല @@ -1790,12 +1790,12 @@ The installer will quit and all changes will be lost. The password contains more than %1 characters of the same class consecutively - + രഹസ്യവാക്കിൽ %1 തവണ ഒരേ തരം അക്ഷരം ആവർത്തിക്കുന്നു The password contains too many characters of the same class consecutively - + രഹസ്യവാക്കിൽ ഒരുപാട് തവണ ഒരേ തരം അക്ഷരം ആവർത്തിക്കുന്നു @@ -1815,12 +1815,12 @@ The installer will quit and all changes will be lost. Cannot obtain random numbers from the RNG device - + RNG ഉപകരണത്തിൽ നിന്ന് ആകസ്‌മിക സംഖ്യകൾ എടുക്കാൻ പറ്റുന്നില്ല. Password generation failed - required entropy too low for settings - + രഹസ്യവാക്ക് സൃഷ്ടിക്കുന്നതിൽ പരാജയപ്പെട്ടു - ആവശ്യത്തിനു entropy ഇല്ല. @@ -1850,42 +1850,42 @@ The installer will quit and all changes will be lost. Bad integer value - + തെറ്റായ സംഖ്യ Setting %1 is not of integer type - + %1 സജ്ജീകരണം സംഖ്യയല്ല Setting is not of integer type - + സജ്ജീകരണം സംഖ്യയല്ല Setting %1 is not of string type - + %1 സജ്ജീകരണം ഒരു വാക്കല്ലാ Setting is not of string type - + സജ്ജീകരണം ഒരു വാക്കല്ലാ Opening the configuration file failed - + ക്രമീകരണ ഫയൽ തുറക്കുന്നതിൽ പരാജയപ്പെട്ടു The configuration file is malformed - + ക്രമീകരണ ഫയൽ പാഴാണു Fatal failure - + അപകടകരമായ പിഴവ് @@ -1918,12 +1918,12 @@ The installer will quit and all changes will be lost. Package Selection - + പാക്കേജ് തിരഞ്ഞെടുക്കൽ Please pick a product from the list. The selected product will be installed. - + പട്ടികയിൽ നിന്നും ഒരു ഉത്പന്നം തിരഞ്ഞെടുക്കുക. തിരഞ്ഞെടുത്ത ഉത്പന്നം ഇൻസ്റ്റാൾ ചെയ്യപ്പെടുക. @@ -1931,7 +1931,7 @@ The installer will quit and all changes will be lost. Packages - + പാക്കേജുകൾ @@ -1977,7 +1977,7 @@ The installer will quit and all changes will be lost. <small>Enter the same password twice, so that it can be checked for typing errors. 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> - + <small>ഒരേ പാസ്‌വേഡ് രണ്ടുതവണ നൽകുക, അതുവഴി ടൈപ്പിംഗ് പിശകുകൾ പരിശോധിക്കാൻ കഴിയും.ഒരു നല്ല പാസ്‌വേഡിൽ അക്ഷരങ്ങൾ, അക്കങ്ങൾ, ചിഹ്നനം എന്നിവയുടെ മിശ്രിതം അടങ്ങിയിരിക്കും, കുറഞ്ഞത് എട്ട് പ്രതീകങ്ങളെങ്കിലും നീളമുണ്ടായിരിക്കണം, കൃത്യമായ ഇടവേളകളിൽ അവ മാറ്റണം.</small> @@ -2020,7 +2020,7 @@ The installer will quit and all changes will be lost. Home - + ഹോം @@ -2060,7 +2060,7 @@ The installer will quit and all changes will be lost. Free Space - + ലഭ്യമായ സ്ഥലം @@ -2099,7 +2099,7 @@ The installer will quit and all changes will be lost. Storage de&vice: - + സ്റ്റോറേജ് ഉപകരണം (&v): @@ -2134,32 +2134,32 @@ The installer will quit and all changes will be lost. Resize Volume Group - + വോള്യം ഗ്രൂപ്പിന്റെ വലുപ്പം മാറ്റുക Deactivate Volume Group - + വോള്യം ഗ്രൂപ്പ് നിഷ്ക്രിയമാക്കുക Remove Volume Group - + വോള്യം ഗ്രൂപ്പ് നീക്കം ചെയ്യുക I&nstall boot loader on: - + ബൂട്ട്ലോഡർ ഇവിടെ ഇൻസ്റ്റാൾ ചെയ്യുക (&n): Are you sure you want to create a new partition table on %1? - + %1ൽ ഒരു പുതിയ പാർട്ടീഷൻ ടേബിൾ നിർമ്മിക്കണമെന്ന് താങ്കൾക്കുറപ്പാണോ? Can not create new partition - + പുതിയ പാർട്ടീഷൻ നിർമ്മിക്കാനായില്ല @@ -2187,12 +2187,12 @@ The installer will quit and all changes will be lost. <strong>Erase</strong> disk and install %1. - + ഡിസ്ക് <strong>മായ്ക്കുക</strong>എന്നിട്ട് %1 ഇൻസ്റ്റാൾ ചെയ്യുക. <strong>Replace</strong> a partition with %1. - + ഒരു പാർട്ടീഷൻ %1 ഉപയോഗിച്ച് <strong>പുനഃസ്ഥാപിക്കുക.</strong> @@ -2207,22 +2207,22 @@ The installer will quit and all changes will be lost. <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. - + ഡിസ്ക് <strong>%2</strong> (%3) <strong>മായ്‌ച്ച് </strong> %1 ഇൻസ്റ്റാൾ ചെയ്യുക. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. - + <strong>%2</strong> (%3) ഡിസ്കിലെ ഒരു പാർട്ടീഷൻ %1 ഉപയോഗിച്ച് <strong>മാറ്റിസ്ഥാപിക്കുക</strong>. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). - + <strong>%1 </strong>(%2) ഡിസ്കിലെ <strong>സ്വമേധയാ</strong> പാർട്ടീഷനിംഗ്. Disk <strong>%1</strong> (%2) - + ഡിസ്ക് <strong>%1</strong> (%2) @@ -2237,12 +2237,12 @@ The installer will quit and all changes will be lost. 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. - + %1 ആരംഭിക്കാൻ ഒരു ഇഎഫ്ഐ സിസ്റ്റം പാർട്ടീഷൻ ആവശ്യമാണ്.<br/><br/>ഒരു ഇഫ്ഐ സിസ്റ്റം പാർട്ടീഷൻ ക്രമീകരിക്കുന്നതിന്,തിരികെ പോയി <strong>ഇ എസ് പി</strong> ഫ്ലാഗും മൗണ്ട് പോയിന്റ് <strong>%2</strong> ഉം ആയിട്ടുള്ള ഒരു FAT32 ഫയൽസിസ്റ്റം തിരഞ്ഞെടുക്കുക അല്ലെങ്കിൽ സൃഷ്ടിക്കുക.<br/><br/>ഒരു ഇഎഫ്ഐ സിസ്റ്റം പാർട്ടീഷൻ സജ്ജീകരിക്കാതെ നിങ്ങൾക്ക് തുടരാം, പക്ഷേ നിങ്ങളുടെ സിസ്റ്റം ആരംഭിക്കുന്നതിൽ പരാജയപ്പെട്ടേക്കാം. @@ -2257,7 +2257,7 @@ The installer will quit and all changes will be lost. Boot partition not encrypted - + ബൂട്ട് പാർട്ടീഷൻ എൻക്രിപ്റ്റ് ചെയ്യപ്പെട്ടിട്ടില്ല @@ -2320,17 +2320,17 @@ The installer will quit and all changes will be lost. Saving files for later ... - + ഫയലുകൾ ഭാവിയിലേക്കായി സംരക്ഷിക്കുന്നു ... No files configured to save for later. - + ഭാവിയിലേക്കായി സംരക്ഷിക്കാനായി ഫയലുകളൊന്നും ക്രമീകരിച്ചിട്ടില്ല. Not all of the configured files could be preserved. - + ക്രമീകരിക്കപ്പെട്ട ഫയലുകളെല്ലാം സംരക്ഷിക്കാനായില്ല. @@ -2404,18 +2404,18 @@ Output: Default Keyboard Model - + സ്വതേയുള്ള കീബോർഡ് തരം Default - + സ്വതേയുള്ളത് unknown - + അജ്ഞാതം @@ -2470,17 +2470,17 @@ Output: Remove Volume Group named %1. - + %1 എന്ന് പേരുള്ള വോള്യം ഗ്രൂപ്പ് നീക്കം ചെയ്യുക. Remove Volume Group named <strong>%1</strong>. - + <strong>%1</strong> എന്ന് പേരുള്ള വോള്യം ഗ്രൂപ്പ് നീക്കം ചെയ്യുക. The installer failed to remove a volume group named '%1'. - + '%1' എന്ന് പേരുള്ള വോള്യം ഗ്രൂപ്പ് നീക്കം ചെയ്യുന്നതിൽ ഇൻസ്റ്റാളർ പരാജയപ്പെട്ടു. @@ -2568,7 +2568,7 @@ Output: Invalid configuration - + അസാധുവായ ക്രമീകരണം @@ -2657,7 +2657,7 @@ Output: Resize Volume Group - + വോള്യം ഗ്രൂപ്പിന്റെ വലുപ്പം മാറ്റുക @@ -2684,27 +2684,27 @@ Output: This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> - + %1 സജ്ജീകരിക്കുന്നതിനുള്ള ഏറ്റവും കുറഞ്ഞ ആവശ്യങ്ങൾ ഈ കമ്പ്യൂട്ടർ നിറവേറ്റുന്നില്ല.<br/>സജ്ജീകരണം തുടരാനാവില്ല. <a href="#details">വിവരങ്ങൾ...</a> This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> - + %1 ഇൻസ്റ്റാൾ ചെയ്യുന്നതിനുള്ള ഏറ്റവും കുറഞ്ഞ ആവശ്യങ്ങൾ ഈ കമ്പ്യൂട്ടർ നിറവേറ്റുന്നില്ല.<br/>ഇൻസ്റ്റളേഷൻ തുടരാനാവില്ല. <a href="#details">വിവരങ്ങൾ...</a> This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. - + %1 സജ്ജീകരിക്കുന്നതിനുള്ള ചില ആവശ്യങ്ങൾ ഈ കമ്പ്യൂട്ടർ നിറവേറ്റുന്നില്ല.<br/>സജ്ജീകരണം തുടരാം, പക്ഷേ ചില സവിശേഷതകൾ നിഷ്ക്രിയമായിരിക്കാം. This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. - + %1 ഇൻസ്റ്റാൾ ചെയ്യാൻ ശുപാർശ ചെയ്യപ്പെട്ടിട്ടുള്ള ആവശ്യങ്ങൾ ഈ കമ്പ്യൂട്ടർ നിറവേറ്റുന്നില്ല.<br/>ഇൻസ്റ്റളേഷൻ തുടരാം, പക്ഷേ ചില സവിശേഷതകൾ നിഷ്ക്രിയമായിരിക്കാം. This program will ask you some questions and set up %2 on your computer. - + ഈ പ്രക്രിയ താങ്കളോട് ചില ചോദ്യങ്ങൾ ചോദിക്കുകയും %2 താങ്കളുടെ കമ്പ്യൂട്ടറിൽ സജ്ജീകരിക്കുകയും ചെയ്യും. @@ -2898,7 +2898,7 @@ Output: Cannot disable root account. - + റൂട്ട് അക്കൗണ്ട് നിഷ്ക്രിയമാക്കാനായില്ല. @@ -2936,7 +2936,7 @@ Output: Cannot set timezone. - + സമയപദ്ധതി സജ്ജമാക്കാനായില്ല. @@ -2946,12 +2946,12 @@ Output: Cannot set timezone, - + സമയപദ്ധതി സജ്ജമാക്കാനായില്ല, Cannot open /etc/timezone for writing - + എഴുതുന്നതിനായി /etc/timezone തുറക്കാനായില്ല @@ -2976,7 +2976,7 @@ Output: This is an overview of what will happen once you start the setup procedure. - + താങ്കൾ സജ്ജീകരണപ്രക്രിയ ആരംഭിച്ചതിനുശേഷം എന്ത് സംഭവിക്കും എന്നതിന്റെ അവലോകനമാണിത്. @@ -2989,7 +2989,7 @@ Output: Summary - + ചുരുക്കം @@ -2997,12 +2997,12 @@ Output: Installation feedback - + ഇൻസ്റ്റളേഷനെ പറ്റിയുള്ള പ്രതികരണം Sending installation feedback. - + ഇൻസ്റ്റളേഷനെ പറ്റിയുള്ള പ്രതികരണം അയയ്ക്കുന്നു. @@ -3074,7 +3074,7 @@ Output: 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. - + ഇത് തിരഞ്ഞെടുക്കുന്നതിലൂടെ നിങ്ങളുടെ ഇൻസ്റ്റാളേഷനെക്കുറിച്ചും ഹാർഡ്‌വെയറിനെക്കുറിച്ചും വിവരങ്ങൾ അയയ്ക്കും. ഇൻസ്റ്റാളേഷൻ പൂർത്തിയായതിന് ശേഷം <b>ഒരു തവണ മാത്രമേ ഈ വിവരങ്ങൾ അയയ്ക്കൂ</b>. @@ -3084,7 +3084,7 @@ Output: By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. - + ഇത് തിരഞ്ഞെടുക്കുന്നതിലൂടെ നിങ്ങളുടെ ഇൻസ്റ്റാളേഷൻ, ഹാർഡ്‌വെയർ, ആപ്ലിക്കേഷനുകൾ, ഉപയോഗ രീതികൾ എന്നിവയെക്കുറിച്ചുള്ള വിവരങ്ങൾ <b>പതിവായി</b> %1 ലേക്ക് അയയ്ക്കും. @@ -3092,7 +3092,7 @@ Output: Feedback - + പ്രതികരണം @@ -3100,12 +3100,12 @@ Output: <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> - + <small>ഒന്നിലധികം ആളുകൾ ഈ കമ്പ്യൂട്ടർ ഉപയോഗിക്കുമെങ്കിൽ, താങ്കൾക്ക് സജ്ജീകരണത്തിന് ശേഷം നിരവധി അക്കൗണ്ടുകൾ സൃഷ്ടിക്കാം.</small> <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> - + <small>ഒന്നിലധികം ആളുകൾ ഈ കമ്പ്യൂട്ടർ ഉപയോഗിക്കുമെങ്കിൽ, താങ്കൾക്ക് ഇൻസ്റ്റളേഷന് ശേഷം നിരവധി അക്കൗണ്ടുകൾ സൃഷ്ടിക്കാം.</small> @@ -3152,12 +3152,12 @@ Output: Key - + സൂചിക Value - + മൂല്യം @@ -3175,12 +3175,12 @@ Output: Volume Group Name: - + വോള്യം ഗ്രൂപ്പിന്റെ പേര്: Volume Group Type: - + വോള്യം ഗ്രൂപ്പ് തരം: @@ -3195,17 +3195,17 @@ Output: Total Size: - + മൊത്തം വലുപ്പം: Used Size: - + ഉപയോഗിച്ച വലുപ്പം: Total Sectors: - + മൊത്തം സെക്ടറുകൾ: @@ -3249,17 +3249,17 @@ Output: Open release notes website - റിലീസ് കുറിപ്പുകളുടെ വെബ്സൈറ്റ് തുറക്കുക + പ്രകാശന കുറിപ്പുകളുടെ വെബ്സൈറ്റ് തുറക്കുക &Release notes - പ്രകാശന കുറിപ്പുകൾ + പ്രകാശന കുറിപ്പുകൾ (&R) &Known issues - &നേരത്തേ അറിയാവുന്ന പ്രശ്നങ്ങൾ + ഇതിനകം അറിയാവുന്ന പ്രശ്നങ്ങൾ (&K) @@ -3269,27 +3269,27 @@ Output: &About - &വിവരം (&A) + വിവരം (&A) <h1>Welcome to the %1 installer.</h1> - + <h1>%1 ഇൻസ്റ്റാളറിലേക്ക് സ്വാഗതം</h1> <h1>Welcome to the Calamares installer for %1.</h1> - + <h1>%1 -നായുള്ള കലാമാരേസ് ഇൻസ്റ്റാളറിലേക്ക് സ്വാഗതം.</h1> <h1>Welcome to the Calamares setup program for %1.</h1> - + <h1>%1 -നായുള്ള കലാമാരേസ് സജ്ജീകരണപ്രക്രിയയിലേയ്ക്ക് സ്വാഗതം.</h1> <h1>Welcome to %1 setup.</h1> - + <h1>%1 സജ്ജീകരണത്തിലേക്ക് സ്വാഗതം.</h1> diff --git a/lang/calamares_pt_PT.ts b/lang/calamares_pt_PT.ts index 5fd531a0b..9288d409a 100644 --- a/lang/calamares_pt_PT.ts +++ b/lang/calamares_pt_PT.ts @@ -1903,7 +1903,7 @@ O instalador será encerrado e todas as alterações serão perdidas. Product Name - + Nome do produto @@ -1913,7 +1913,7 @@ O instalador será encerrado e todas as alterações serão perdidas. Long Product Description - + Descrição longa do produto @@ -1931,7 +1931,7 @@ O instalador será encerrado e todas as alterações serão perdidas. Packages - + Pacotes @@ -2459,12 +2459,12 @@ Saída de Dados: No product - + Nenhum produto No description provided. - + Nenhuma descrição fornecida. @@ -3103,12 +3103,12 @@ Saída de Dados: <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> - + <small>Se mais de uma pessoa usar este computador, você pode criar várias contas após a configuração.</small> <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> - + <small>Se mais de uma pessoa usar este computador, você pode criar várias contas após a instalação.</small> @@ -3155,7 +3155,7 @@ Saída de Dados: Key - + Chave @@ -3227,7 +3227,7 @@ Saída de Dados: Select application and system language - + Selecione o idioma da aplicação e do sistema @@ -3252,7 +3252,7 @@ Saída de Dados: Open release notes website - + Abrir o site com as notas de lançamento diff --git a/lang/calamares_zh_TW.ts b/lang/calamares_zh_TW.ts index f4c3df441..ba4c28d6b 100644 --- a/lang/calamares_zh_TW.ts +++ b/lang/calamares_zh_TW.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. - 這個系統的<strong>開機環境</strong>。<br><br>較舊的 x86 系統只支援 <strong>BIOS</strong>。<br>現代的系統則通常使用 <strong>EFI</strong>,但若開機環境是以相容模式執行,其也可能顯示為 BIOS。 + 這個系統的<strong>開機環境</strong>。<br><br>較舊的 x86 系統只支援 <strong>BIOS</strong>。<br>現時的系統則通常使用 <strong>EFI</strong>,但若使用相容模式 (CSM),也可能顯示為 BIOS。 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. - 這個系統以 <strong>EFI</strong> 開機環境啟動。<br><br>要設定從 EFI 環境開機,本安裝程式必須部署一個開機載入器應用程式,像是 <strong>GRUB</strong> 或 <strong>systemd-boot</strong> 在 <strong>EFI 系統分割區</strong>上。這是自動的,除非您選擇手動分割,在這種情況下,您必須自行選取或建立它。 + 這個系統以 <strong>EFI</strong> 開機。<br><br>要從 EFI 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong> 或 <strong>systemd-boot</strong> 在 <strong>EFI 系統分割區</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行選取或建立它。 This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. - 這個系統以 <strong>BIOS</strong> 開機環境開始。<br><br>要從 BIOS 環境開機開機,本安裝程式必須安裝開機載入器,像是 <strong>GRUB</strong>,且通常不是安裝在分割區的開頭就是在靠進分割表開頭的 <strong>主開機記錄</strong>(推薦)。這是自動的,除非您選擇手動分割,在這種情況下,您必須自行設定它。 + 這個系統以 <strong>BIOS</strong> 開機。<br><br>要從 BIOS 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong>。而且通常安裝在分割區的開首,又或最好安裝在靠近分割表開首的 <strong>主要開機記錄 (MBR)</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行設定它。 @@ -258,7 +258,7 @@ Would you like to paste the install log to the web? - 您想要將安裝紀錄檔貼到網路上嗎? + 想要將安裝紀錄檔貼到網路上嗎? @@ -298,7 +298,7 @@ &Set up now - 現在進行設定 (&S) + 馬上進行設定 (&S) @@ -329,7 +329,7 @@ Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - 您真的想要取消目前的設定程序嗎? + 真的想要取消目前的設定程序嗎? 設定程式將會結束,所有變更都將會遺失。 @@ -471,7 +471,7 @@ The installer will quit and all changes will be lost. <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. - <strong>手動分割</strong><br/>您可以自行建立或重新調整分割區大小。 + <strong>手動分割</strong><br/>可以自行建立或重新調整分割區大小。 @@ -537,7 +537,7 @@ The installer will quit and all changes will be lost. <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. - <strong>抹除磁碟</strong><br/>這將會<font color="red">刪除</font>目前選取的儲存裝置上所有的資料。 + <strong>抹除磁碟</strong><br/>這將會<font color="red">刪除</font>目前選取的儲存裝置所有的資料。 @@ -932,12 +932,12 @@ The installer will quit and all changes will be lost. The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. - 選定的儲存裝置上的<strong>分割表</strong>類型。<br><br>變更分割表的唯一方法就是抹除再重新從頭建立分割表,這會破壞在該儲存裝置上所有的資料。<br>除非您特別選擇,否則本安裝程式將會保留目前的分割表。<br>若不確定,在現代的系統上,建議使用 GPT。 + 選定的儲存裝置的<strong>分割表</strong>類型。<br><br>變更分割表的唯一方法,就是抹除再重新從頭建立分割表,這會破壞在該儲存裝置所有的資料。<br>除非特別選擇,否則本安裝程式會保留目前的分割表。<br>若不確定,現時的系統建議使用 GPT。 This device has a <strong>%1</strong> partition table. - 此裝置已有一個 <strong>%1</strong> 分割表了。 + 此裝置已有 <strong>%1</strong> 分割表。 @@ -957,7 +957,7 @@ The installer will quit and all changes will be lost. <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>這個分割表類型只被建議在從 <strong>BIOS</strong> 開機環境啟動的較舊系統上使用。其他大多數情況建議使用 GPT。<br><strong>警告:</strong>MBR 分割表是一個被棄用的 MS-DOS 時代的標準。<br>只能有 4 個<em>主要</em>分割區被建立,其中一個可以是<em>延伸</em>分割區,其可以包含許多<em>邏輯</em>分割區。 + <br><br>建議這個分割表類型只在以 <strong>BIOS</strong> 開機的舊系統使用。其他大多數情況建議使用 GPT。<br><strong>警告:</strong>MBR 分割表是已過時、源自 MS-DOS 時代的標準。<br>最多只能建立 4 個<em>主要</em>分割區;其中一個可以是<em>延伸</em>分割區,其可以包含許多<em>邏輯</em>分割區。 @@ -1016,7 +1016,7 @@ The installer will quit and all changes will be lost. &Keep - 保持(&K) + 保留(&K) @@ -1510,12 +1510,12 @@ The installer will quit and all changes will be lost. The system language will be set to %1. - 系統語言將會設定為 %1。 + 系統語言會設定為%1。 The numbers and dates locale will be set to %1. - 數字與日期語系將會被設定為 %1。 + 數字與日期語系會設定為%1。 @@ -2443,7 +2443,7 @@ Output: (no mount point) - (沒有掛載點) + (沒有掛載點) @@ -2707,7 +2707,7 @@ Output: This program will ask you some questions and set up %2 on your computer. - 本程式將會問您一些問題並在您的電腦上安裝及設定 %2 。 + 本程式會問您一些問題,然後在您的電腦安裝及設定 %2。 @@ -2979,7 +2979,7 @@ Output: This is an overview of what will happen once you start the setup procedure. - 這是您開始安裝後所會發生的事的概覽。 + 這是開始安裝後所會發生的事的概覽。 @@ -3252,7 +3252,7 @@ Output: Open release notes website - + 開啟發行手記網站 diff --git a/lang/python/hr/LC_MESSAGES/python.mo b/lang/python/hr/LC_MESSAGES/python.mo index 7bbf2f3f2..c455dea5d 100644 Binary files a/lang/python/hr/LC_MESSAGES/python.mo and b/lang/python/hr/LC_MESSAGES/python.mo differ diff --git a/lang/python/hr/LC_MESSAGES/python.po b/lang/python/hr/LC_MESSAGES/python.po index d8f7a7573..76624f5ac 100644 --- a/lang/python/hr/LC_MESSAGES/python.po +++ b/lang/python/hr/LC_MESSAGES/python.po @@ -308,7 +308,7 @@ msgstr[2] "Uklanjam %(num)d pakete." #: src/modules/bootloader/main.py:51 msgid "Install bootloader." -msgstr "Instalirajte bootloader." +msgstr "Instaliram bootloader." #: src/modules/removeuser/main.py:34 msgid "Remove live user from target system" diff --git a/lang/python/it_IT/LC_MESSAGES/python.po b/lang/python/it_IT/LC_MESSAGES/python.po index f6decc759..c4ed3e929 100644 --- a/lang/python/it_IT/LC_MESSAGES/python.po +++ b/lang/python/it_IT/LC_MESSAGES/python.po @@ -5,7 +5,7 @@ # # Translators: # Saverio , 2018 -# Pietro Francesco Fontana, 2018 +# Pietro F. Fontana, 2018 # Pierfrancesco Passerini , 2019 # #, fuzzy diff --git a/lang/python/pt_BR/LC_MESSAGES/python.mo b/lang/python/pt_BR/LC_MESSAGES/python.mo index a004f563d..9341ca481 100644 Binary files a/lang/python/pt_BR/LC_MESSAGES/python.mo and b/lang/python/pt_BR/LC_MESSAGES/python.mo differ diff --git a/lang/python/pt_BR/LC_MESSAGES/python.po b/lang/python/pt_BR/LC_MESSAGES/python.po index 493d4deed..a5da0a8fc 100644 --- a/lang/python/pt_BR/LC_MESSAGES/python.po +++ b/lang/python/pt_BR/LC_MESSAGES/python.po @@ -5,7 +5,7 @@ # # Translators: # André Marcelo Alvarenga , 2019 -# Guilherme , 2019 +# Guilherme Marçal Silva , 2019 # #, fuzzy msgid "" @@ -14,7 +14,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-15 21:54+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Guilherme , 2019\n" +"Last-Translator: Guilherme Marçal Silva , 2019\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/calamares/teams/20061/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/src/libcalamares/locale/Label.h b/src/libcalamares/locale/Label.h index 0fe61d909..95129d38c 100644 --- a/src/libcalamares/locale/Label.h +++ b/src/libcalamares/locale/Label.h @@ -67,7 +67,7 @@ public: * en_US and en (American English) is defined as English. The Queen's * English -- proper English -- is relegated to non-English status. */ - bool isEnglish() const { return m_localeId == QLatin1Literal( "en_US" ) || m_localeId == QLatin1Literal( "en" ); } + bool isEnglish() const { return m_localeId == QLatin1String( "en_US" ) || m_localeId == QLatin1String( "en" ); } /** @brief Get the human-readable name for this locale. */ QString label() const { return m_label; } diff --git a/src/libcalamares/modulesystem/InstanceKey.h b/src/libcalamares/modulesystem/InstanceKey.h index 35ad27c40..ad0fae0e7 100644 --- a/src/libcalamares/modulesystem/InstanceKey.h +++ b/src/libcalamares/modulesystem/InstanceKey.h @@ -90,7 +90,11 @@ public: QString toString() const { - return first + '@' + second; + if ( isValid() ) + { + return first + '@' + second; + } + return QString(); } private: diff --git a/src/libcalamares/modulesystem/Tests.cpp b/src/libcalamares/modulesystem/Tests.cpp index 4ef5840ea..e7301a0be 100644 --- a/src/libcalamares/modulesystem/Tests.cpp +++ b/src/libcalamares/modulesystem/Tests.cpp @@ -52,7 +52,14 @@ assert_is_invalid( const InstanceKey& k ) QVERIFY( !k.isCustom() ); QVERIFY( k.module().isEmpty() ); QVERIFY( k.id().isEmpty() ); - QVERIFY( k.toString().isEmpty() ); + if ( k.toString().isEmpty() ) + { + QVERIFY( k.toString().isEmpty() ); + } + else + { + QCOMPARE( k.toString(), QString() ); + } } void diff --git a/src/libcalamares/utils/CommandList.cpp b/src/libcalamares/utils/CommandList.cpp index 1a3075a43..8a2f3835b 100644 --- a/src/libcalamares/utils/CommandList.cpp +++ b/src/libcalamares/utils/CommandList.cpp @@ -131,8 +131,8 @@ findInCommands( const CommandList& l, const QString& needle ) Calamares::JobResult CommandList::run() { - QLatin1Literal rootMagic( "@@ROOT@@" ); - QLatin1Literal userMagic( "@@USER@@" ); + QLatin1String rootMagic( "@@ROOT@@" ); + QLatin1String userMagic( "@@USER@@" ); System::RunLocation location = m_doChroot ? System::RunLocation::RunInTarget : System::RunLocation::RunInHost; diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 8fb832369..6da81e7af 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -275,12 +275,12 @@ ViewManager::onInitFailed( const QStringList& modules ) { description.append( tr( "
The following modules could not be loaded:" ) ); QStringList details; - details << QLatin1Literal( "
    " ); + details << QLatin1String( "
      " ); for ( const auto& m : modules ) { - details << QLatin1Literal( "
    • " ) << m << QLatin1Literal( "
    • " ); + details << QLatin1String( "
    • " ) << m << QLatin1String( "
    • " ); } - details << QLatin1Literal( "
    " ); + details << QLatin1String( "
" ); detailString = details.join( QString() ); } diff --git a/src/libcalamaresui/modulesystem/ModuleManager.cpp b/src/libcalamaresui/modulesystem/ModuleManager.cpp index 78164ae18..53cc1fabb 100644 --- a/src/libcalamaresui/modulesystem/ModuleManager.cpp +++ b/src/libcalamaresui/modulesystem/ModuleManager.cpp @@ -91,7 +91,7 @@ ModuleManager::doInit() bool success = currentDir.cd( subdir ); if ( success ) { - QFileInfo descriptorFileInfo( currentDir.absoluteFilePath( QLatin1Literal( "module.desc" ) ) ); + QFileInfo descriptorFileInfo( currentDir.absoluteFilePath( QLatin1String( "module.desc" ) ) ); if ( !descriptorFileInfo.exists() ) { cDebug() << "ModuleManager expected descriptor is missing:" diff --git a/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp b/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp index 0b775e067..08e4c5c08 100644 --- a/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp +++ b/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp @@ -137,7 +137,7 @@ PythonQtViewModule::loadSelf() return; } - static const QLatin1Literal calamares_module_annotation( + static const QLatin1String calamares_module_annotation( "_calamares_module_typename = ''\n" "def calamares_module(viewmodule_type):\n" " global _calamares_module_typename\n" diff --git a/src/modules/displaymanager/displaymanager.conf b/src/modules/displaymanager/displaymanager.conf index 8f8e9c704..c3e0e1160 100644 --- a/src/modules/displaymanager/displaymanager.conf +++ b/src/modules/displaymanager/displaymanager.conf @@ -13,7 +13,25 @@ displaymanagers: - lxdm - kdm -#Enable the following settings to force a desktop environment in your displaymanager configuration file: +# Enable the following settings to force a desktop environment +# in your displaymanager configuration file. This will attempt +# to configure the given DE (without checking if it is installed). +# The DM configuration for each potential DM may **or may not** +# support configuring a default DE, so the keys are mandatory +# but their interpretation is up to the DM configuration. +# +# Subkeys of *defaultDesktopEnvironment* are (all mandatory): +# - *executable* a full path to an executable +# - *desktopFile* a .desktop filename +# +# If this is **not** set, then Calamares will look for installed +# DE's and pick the first one it finds that is actually installed. +# +# If this **is** set, and the *executable* key doesn't point to +# an installed file, then the .desktop file's TryExec key is +# used instead. +# + #defaultDesktopEnvironment: # executable: "startkde" # desktopFile: "plasma" diff --git a/src/modules/displaymanager/main.py b/src/modules/displaymanager/main.py index fdb802fef..ca42e6204 100644 --- a/src/modules/displaymanager/main.py +++ b/src/modules/displaymanager/main.py @@ -51,31 +51,59 @@ class DesktopEnvironment: self.executable = exec self.desktop_file = desktop - def find_executable(self, root_mount_point, command): - if command.startswith("/"): + def _search_executable(self, root_mount_point, pathname): + """ + Search for @p pathname within @p root_mount_point . + If the pathname is absolute, just check there inside + the target, otherwise earch in a sort-of-sensible $PATH. + + Returns the full (including @p root_mount_point) path + to that executable, or None. + """ + if pathname.startswith("/"): path = [""] else: path = ["/bin/", "/usr/bin/", "/sbin/", "/usr/local/bin/"] for p in path: - absolute_path = "{!s}{!s}{!s}".format(root_mount_point, p, command) + absolute_path = "{!s}{!s}{!s}".format(root_mount_point, p, pathname) if os.path.exists(absolute_path): return absolute_path return None - def find_tryexec(self, root_mount_point, absolute_desktop_file): + def _search_tryexec(self, root_mount_point, absolute_desktop_file): + """ + Check @p absolute_desktop_file for a TryExec line and, if that is + found, search for the command (executable pathname) within + @p root_mount_point. The .desktop file must live within the + target root. + + Returns the full (including @p root_mount_point) for the executable + from TryExec, or None. + """ assert absolute_desktop_file.startswith(root_mount_point) with open(absolute_desktop_file, "r") as f: for tryexec_line in [x for x in f.readlines() if x.startswith("TryExec")]: try: key, value = tryexec_line.split("=") if key.strip() == "TryExec": - return self.find_executable(root_mount_point, value.strip()) + return self._search_executable(root_mount_point, value.strip()) except: pass return None + def find_executable(self, root_mount_point): + """ + Returns the full path of the configured executable within @p root_mount_point, + or None if it isn't found. May search in a semi-sensible $PATH. + """ + return self._search_executable(root_mount_point, self.executable) + def find_desktop_file(self, root_mount_point): + """ + Returns the full path of the .desktop file within @p root_mount_point, + or None if it isn't found. Searches both X11 and Wayland sessions. + """ x11_sessions = "{!s}/usr/share/xsessions/{!s}.desktop".format(root_mount_point, self.desktop_file) wayland_sessions = "{!s}/usr/share/wayland-sessions/{!s}.desktop".format(root_mount_point, self.desktop_file) for candidate in (x11_sessions, wayland_sessions): @@ -83,7 +111,7 @@ class DesktopEnvironment: return candidate return None - def find_desktop_environment(self, root_mount_point): + def is_installed(self, root_mount_point): """ Check if this environment is installed in the target system at @p root_mount_point. @@ -92,10 +120,59 @@ class DesktopEnvironment: if desktop_file is None: return False - return (self.find_executable(root_mount_point, self.executable) is not None or - self.find_tryexec(root_mount_point, desktop_file) is not None) + return (self.find_executable(root_mount_point) is not None or + self._search_tryexec(root_mount_point, desktop_file) is not None) + + def update_from_desktop_file(self, root_mount_point): + """ + Find thie DE in the target system at @p root_mount_point. + This can update the *executable* configuration value if + the configured executable isn't found but the TryExec line + from the .desktop file is. + + The .desktop file is mandatory for a DE. + + Returns True if the DE is installed. + """ + desktop_file = self.find_desktop_file(root_mount_point) + if desktop_file is None: + return False + + executable_file = self.find_executable(root_mount_point) + if executable_file is not None: + # .desktop found and executable as well. + return True + + executable_file = self._search_tryexec(root_mount_point, desktop_file) + if executable_file is not None: + # Found from the .desktop file, so update own executable config + if root_mount_point and executable_file.startswith(root_mount_point): + executable_file = executable_file[len(root_mount_point):] + if not executable_file: + # Somehow chopped down to nothing + return False + + if executable_file[0] != "/": + executable_file = "/" + executable_file + self.executable = executable_file + return True + # This is to double-check + return self.is_installed(root_mount_point) +# This is the list of desktop environments that Calamares looks +# for; if no default environment is **explicitly** configured +# in the `displaymanager.conf` then the first one from this list +# that is found, is used. +# +# Each DE has a sample executable to look for, and a .desktop filename. +# If the executable exists, the DE is assumed to be installed +# and to use the given .desktop filename. +# +# If the .desktop file exists and contains a TryExec line and that +# TryExec executable exists (searched in /bin, /usr/bin, /sbin and +# /usr/local/bin) then the DE is assumed to be installed +# and to use that .desktop filename. desktop_environments = [ DesktopEnvironment('/usr/bin/startplasma-x11', 'plasma'), # KDE Plasma 5.17+ DesktopEnvironment('/usr/bin/startkde', 'plasma'), # KDE Plasma 5 @@ -131,7 +208,7 @@ def find_desktop_environment(root_mount_point): """ libcalamares.utils.debug("Using rootMountPoint {!r}".format(root_mount_point)) for desktop_environment in desktop_environments: - if desktop_environment.find_desktop_environment(root_mount_point): + if desktop_environment.is_installed(root_mount_point): libcalamares.utils.debug(".. selected DE {!s}".format(desktop_environment.desktop_file)) return desktop_environment return None @@ -847,6 +924,11 @@ def run(): default_desktop_environment = DesktopEnvironment( entry["executable"], entry["desktopFile"] ) + # Adjust if executable is bad, but desktopFile isn't. + if not default_desktop_environment.update_from_desktop_file(root_mount_point): + libcalamares.utils.warning( + "The configured default desktop environment, {!s}, " + "can not be found.".format(default_desktop_environment.desktop_file)) else: default_desktop_environment = find_desktop_environment( root_mount_point diff --git a/src/modules/dracutlukscfg/DracutLuksCfgJob.cpp b/src/modules/dracutlukscfg/DracutLuksCfgJob.cpp index 9b15ef87c..97b2c9d55 100644 --- a/src/modules/dracutlukscfg/DracutLuksCfgJob.cpp +++ b/src/modules/dracutlukscfg/DracutLuksCfgJob.cpp @@ -30,7 +30,7 @@ #include "utils/Logger.h" // static -const QLatin1Literal DracutLuksCfgJob::CONFIG_FILE( "/etc/dracut.conf.d/calamares-luks.conf" ); +const QLatin1String DracutLuksCfgJob::CONFIG_FILE( "/etc/dracut.conf.d/calamares-luks.conf" ); // static const char *DracutLuksCfgJob::CONFIG_FILE_HEADER = @@ -50,7 +50,7 @@ const char *DracutLuksCfgJob::CONFIG_FILE_CRYPTTAB_LINE = "install_items+=\" /etc/crypttab \"\n"; // static -const QLatin1Literal DracutLuksCfgJob::CONFIG_FILE_SWAPLINE( "# enable automatic resume from swap\nadd_device+=\" /dev/disk/by-uuid/%1 \"\n" ); +const QLatin1String DracutLuksCfgJob::CONFIG_FILE_SWAPLINE( "# enable automatic resume from swap\nadd_device+=\" /dev/disk/by-uuid/%1 \"\n" ); // static QString diff --git a/src/modules/dracutlukscfg/DracutLuksCfgJob.h b/src/modules/dracutlukscfg/DracutLuksCfgJob.h index 15ff24069..5811c34a1 100644 --- a/src/modules/dracutlukscfg/DracutLuksCfgJob.h +++ b/src/modules/dracutlukscfg/DracutLuksCfgJob.h @@ -42,11 +42,11 @@ public: Calamares::JobResult exec() override; private: - static const QLatin1Literal CONFIG_FILE; + static const QLatin1String CONFIG_FILE; static const char *CONFIG_FILE_HEADER; static const char *CONFIG_FILE_CRYPTTAB_KEYFILE_LINE; static const char *CONFIG_FILE_CRYPTTAB_LINE; - static const QLatin1Literal CONFIG_FILE_SWAPLINE; + static const QLatin1String CONFIG_FILE_SWAPLINE; static QString rootMountPoint(); static QVariantList partitions(); diff --git a/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.mo index dad5673f1..6e1162388 100644 Binary files a/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.mo and b/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.mo differ diff --git a/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po index 53a05e9ec..4377e6c3e 100644 --- a/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po +++ b/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po @@ -5,16 +5,16 @@ # # Translators: # Rodrigo de Almeida Sottomaior Macedo , 2017 -# Guilherme , 2018 +# Guilherme Marçal Silva , 2018 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-02-22 07:09-0500\n" +"POT-Creation-Date: 2019-09-15 21:54+0200\n" "PO-Revision-Date: 2016-12-16 12:18+0000\n" -"Last-Translator: Guilherme , 2018\n" +"Last-Translator: Guilherme Marçal Silva , 2018\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/calamares/teams/20061/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp index d3829aad3..7720a840c 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -241,7 +241,7 @@ LocalePage::init( const QString& initialRegion, const QString& initialZone, cons << "\n\t " << "* a well-formed" << supported.fileName() << "\n\tOR" << "* a well-formed" - << ( localeGenPath.isEmpty() ? QLatin1Literal( "/etc/locale.gen" ) : localeGenPath ) << "\n\tOR" + << ( localeGenPath.isEmpty() ? QLatin1String( "/etc/locale.gen" ) : localeGenPath ) << "\n\tOR" << "* a complete pre-compiled locale-gen database which allows complete locale -a output."; return; // something went wrong and there's nothing we can do about it. } diff --git a/src/modules/locale/timezonewidget/timezonewidget.cpp b/src/modules/locale/timezonewidget/timezonewidget.cpp index a228f000c..1553af9bc 100644 --- a/src/modules/locale/timezonewidget/timezonewidget.cpp +++ b/src/modules/locale/timezonewidget/timezonewidget.cpp @@ -34,7 +34,7 @@ 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" ); +constexpr static QLatin1String ZONE_NAME( "zone" ); #endif TimeZoneWidget::TimeZoneWidget( QWidget* parent ) : diff --git a/src/modules/netinstall/PackageTreeItem.cpp b/src/modules/netinstall/PackageTreeItem.cpp index 80e553d2e..b3dc6fae7 100644 --- a/src/modules/netinstall/PackageTreeItem.cpp +++ b/src/modules/netinstall/PackageTreeItem.cpp @@ -45,7 +45,7 @@ PackageTreeItem::PackageTreeItem::PackageTreeItem() : PackageTreeItem( QString(), nullptr ) { m_data.selected = Qt::Checked; - m_data.name = QLatin1Literal( "" ); + m_data.name = QLatin1String( "" ); } PackageTreeItem::~PackageTreeItem() diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp index 562474865..94630b472 100644 --- a/src/modules/partition/core/PartUtils.cpp +++ b/src/modules/partition/core/PartUtils.cpp @@ -450,7 +450,7 @@ isEfiBootable( const Partition* candidate ) QString findFS( QString fsName, FileSystem::Type* fsType ) { - QStringList fsLanguage { QLatin1Literal( "C" ) }; // Required language list to turn off localization + QStringList fsLanguage { QLatin1String( "C" ) }; // Required language list to turn off localization if ( fsName.isEmpty() ) fsName = QStringLiteral( "ext4" ); diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index 8a190b68a..95df5561c 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -646,7 +646,7 @@ PartitionViewStep::checkRequirements() Calamares::RequirementsList l; l.append( { - QLatin1Literal( "partitions" ), + QLatin1String( "partitions" ), []{ return tr( "has at least one disk device available." ); }, []{ return tr( "There are no partitons to install on." ); }, m_core->deviceModel()->rowCount() > 0, // satisfied diff --git a/src/modules/preservefiles/PreserveFiles.cpp b/src/modules/preservefiles/PreserveFiles.cpp index 96d26274c..175f8e4f8 100644 --- a/src/modules/preservefiles/PreserveFiles.cpp +++ b/src/modules/preservefiles/PreserveFiles.cpp @@ -52,7 +52,7 @@ QString targetPrefix() } } - return QLatin1Literal( "/" ); + return QLatin1String( "/" ); } QString atReplacements( QString s ) diff --git a/src/modules/unpackfs/main.py b/src/modules/unpackfs/main.py index 90c258cd7..fd3f97353 100644 --- a/src/modules/unpackfs/main.py +++ b/src/modules/unpackfs/main.py @@ -58,6 +58,9 @@ class UnpackEntry: self.copied = 0 self.total = 0 + def is_file(self): + return self.sourcefs == "file" + ON_POSIX = 'posix' in sys.builtin_module_names @@ -100,7 +103,7 @@ def file_copy(source, dest, progress_cb): # `source` *must* end with '/' otherwise a directory named after the source # will be created in `dest`: ie if `source` is "/foo/bar" and `dest` is # "/dest", then files will be copied in "/dest/bar". - if not source.endswith("/"): + if not source.endswith("/") and not os.path.isfile(source): source += "/" num_files_total_local = 0 @@ -225,11 +228,16 @@ class UnpackOperation: ["unsquashfs", "-l", entry.source] ) - if entry.sourcefs == "ext4": + elif entry.sourcefs == "ext4": fslist = subprocess.check_output( ["find", imgmountdir, "-type", "f"] ) + elif entry.is_file(): + # Hasn't been mounted, copy directly; find handles both + # files and directories. + fslist = subprocess.check_output(["find", entry.source, "-type", "f"]) + entry.total = len(fslist.splitlines()) self.report_progress() @@ -247,9 +255,15 @@ class UnpackOperation: """ Mount given image as loop device. + A *file* entry (e.g. one with *sourcefs* set to *file*) + is not mounted and just ignored. + :param entry: :param imgmountdir: """ + if entry.is_file(): + return + if os.path.isdir(entry.source): subprocess.check_call(["mount", "--bind", entry.source, @@ -287,12 +301,18 @@ class UnpackOperation: self.report_progress() try: - return file_copy(imgmountdir, entry.destination, progress_cb) + if entry.is_file(): + source = entry.source + else: + source = imgmountdir + + return file_copy(source, entry.destination, progress_cb) finally: - subprocess.check_call(["umount", "-l", imgmountdir]) + if not entry.is_file(): + subprocess.check_call(["umount", "-l", imgmountdir]) -def get_supported_filesystems(): +def get_supported_filesystems_kernel(): """ Reads /proc/filesystems (the list of supported filesystems for the current kernel) and returns a list of (names of) @@ -310,6 +330,14 @@ def get_supported_filesystems(): return [] +def get_supported_filesystems(): + """ + Returns a list of all the supported filesystems + (valid values for the *sourcefs* key in an item. + """ + return ["file"] + get_supported_filesystems_kernel() + + def run(): """ Unsquash filesystem. @@ -330,8 +358,7 @@ def run(): supported_filesystems = get_supported_filesystems() - unpack = list() - + # Bail out before we start when there are obvious problems for entry in job.configuration["unpack"]: source = os.path.abspath(entry["source"]) sourcefs = entry["sourcefs"] @@ -340,14 +367,18 @@ def run(): utils.warning("The filesystem for \"{}\" ({}) is not supported".format(source, sourcefs)) return (_("Bad unsquash configuration"), _("The filesystem for \"{}\" ({}) is not supported").format(source, sourcefs)) - - destination = os.path.abspath(root_mount_point + entry["destination"]) - if not os.path.exists(source): utils.warning("The source filesystem \"{}\" does not exist".format(source)) return (_("Bad unsquash configuration"), _("The source filesystem \"{}\" does not exist").format(source)) + unpack = list() + + for entry in job.configuration["unpack"]: + source = os.path.abspath(entry["source"]) + sourcefs = entry["sourcefs"] + destination = os.path.abspath(root_mount_point + entry["destination"]) + if not os.path.isdir(destination): utils.warning(("The destination \"{}\" in the target system is not a directory").format(destination)) return (_("Bad unsquash configuration"), diff --git a/src/modules/unpackfs/unpackfs.conf b/src/modules/unpackfs/unpackfs.conf index b2b107268..d994e351a 100644 --- a/src/modules/unpackfs/unpackfs.conf +++ b/src/modules/unpackfs/unpackfs.conf @@ -9,32 +9,59 @@ # target dir relative to rootMountPoint. --- -unpack: # Each list item is unpacked, in order, to the target system. +# # Each list item has the following attributes: # source: path relative to the live / intstalling system to the image -# sourcefs: ext4 or squashfs (may be others if mount supports it) +# sourcefs: the type of the source files; valid entries are +# - *ext4* (copies the filesystem contents) +# - *squashfs* (unsquashes) +# - *file* (copies a file or directory) +# - (may be others if mount supports it) # destination: path relative to rootMountPoint (so in the target -# system) where this filesystem is unpacked. - +# system) where this filesystem is unpacked. It may be an +# empty string, which effectively is / (the root) of the target +# system. +# +# EXAMPLES +# # Usually you list a filesystem image to unpack; you can use # squashfs or an ext4 image. # # - source: "/path/to/filesystem.sqfs" # sourcefs: "squashfs" # destination: "" - -# You can list more than one filesystem. +# +# Multiple entries are unpacked in-order # # - source: "/path/to/another/filesystem.img" # sourcefs: "ext4" # destination: "" +# - source: "/path/to/another/filesystem2.img" +# sourcefs: "ext4" +# destination: "/usr/lib/extra" # - # You can list filesystem source paths relative to the Calamares run # directory, if you use -d (this is only useful for testing, though). - - source: "_root-image_" - sourcefs: "squashfs" - destination: "" - - source: "_desktop-image_" - sourcefs: "squashfs" +# +# - source: ./example.sqfs +# sourcefs: squashfs +# destination: "" +# +# You can list individual files (copied one-by-one), or directories +# (the files inside this directory are copied directly to the destination, +# so no "dummycpp/" subdirectory is created in this example). +# Do note that the target directory must exist already (e.g. from +# extracting some other filesystem). +# +# - source: ../CHANGES +# sourcefs: file +# destination: "/tmp/derp" +# - source: ../src/modules/dummycpp +# sourcefs: file +# destination: "/tmp/derp" + +unpack: + - source: ../CHANGES + sourcefs: file + destination: "/tmp" diff --git a/src/modules/users/UsersViewStep.cpp b/src/modules/users/UsersViewStep.cpp index 4582a9e85..0d1bb593e 100644 --- a/src/modules/users/UsersViewStep.cpp +++ b/src/modules/users/UsersViewStep.cpp @@ -173,7 +173,7 @@ UsersViewStep::setConfigurationMap( const QVariantMap& configurationMap ) } } - QString shell( QLatin1Literal( "/bin/bash" ) ); // as if it's not set at all + QString shell( QLatin1String( "/bin/bash" ) ); // as if it's not set at all if ( configurationMap.contains( "userShell" ) ) shell = CalamaresUtils::getString( configurationMap, "userShell" ); // Now it might be explicitly set to empty, which is ok