Merge branch 'master' of https://github.com/calamares/calamares into development

This commit is contained in:
Philip Müller 2019-11-02 21:46:30 +01:00
commit d790e2489e
32 changed files with 707 additions and 639 deletions

25
CHANGES
View File

@ -3,10 +3,10 @@ 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.16 (unreleased) #
# 3.2.17 (unreleased) #
This release contains contributions from (alphabetically by first name):
- No other contributors this time around.
- No external contributions.
## Core ##
- No changes to core functionality
@ -15,6 +15,27 @@ This release contains contributions from (alphabetically by first name):
- No changes to module functionality
# 3.2.16 (2019-11-01) #
This release contains contributions from (alphabetically by first name):
- Bill Auger
## Core ##
- Some obscure build scenarios which would lead to bogus module-is-
misconfigured messages on startup have been resolved.
## Modules ##
- The explanatory messages on the *users* page have moved to tooltips,
and placeholder text has been added to the fields. #1202
- The bad-password messages in the *users* page have been improved. #1261
- Password-checking in the *users* module has been substantially
changed. A new key *allowWeakPasswords* can be used to introduce
an additional checkbox to the page, which can then be used to
switch off strict password checking. (Thanks to Bill Auger)
- The icons used in password warnings on the *users* page have been
changed to the colorful status icons (rather than the thin red X).
# 3.2.15 (2019-10-11) #
This release contains contributions from (alphabetically by first name):

View File

@ -40,7 +40,7 @@
cmake_minimum_required( VERSION 3.3 FATAL_ERROR )
project( CALAMARES
VERSION 3.2.16
VERSION 3.2.17
LANGUAGES C CXX )
set( CALAMARES_VERSION_RC 1 ) # Set to 0 during release cycle, 1 during development

View File

@ -3253,7 +3253,7 @@ Sortie
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="179"/>
<source>Open release notes website</source>
<translation type="unfinished"/>
<translation>Ouvrir le site des notes de publication</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="182"/>

View File

@ -99,7 +99,7 @@
<message>
<location filename="../src/calamares/DebugWindow.ui" line="106"/>
<source>Reload Stylesheet</source>
<translation type="unfinished"/>
<translation>Ricarica il foglio di stile</translation>
</message>
<message>
<location filename="../src/calamares/DebugWindow.ui" line="113"/>
@ -210,7 +210,7 @@
<message numerus="yes">
<location filename="../src/libcalamaresui/modulesystem/RequirementsChecker.cpp" line="166"/>
<source>Waiting for %n module(s).</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>In attesa del(i) modulo(i) %n.</numerusform><numerusform>In attesa del(i) modulo(i) %n.</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/libcalamaresui/modulesystem/RequirementsChecker.cpp" line="167"/>
@ -258,7 +258,7 @@
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="212"/>
<source>Would you like to paste the install log to the web?</source>
<translation type="unfinished"/>
<translation>Vuoi incollare il log di installazione nel web?</translation>
</message>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="250"/>
@ -1148,7 +1148,7 @@ Il programma d&apos;installazione sarà terminato e tutte le modifiche andranno
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="58"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When this box is checked, your system will restart immediately when you click on &lt;span style=&quot;font-style:italic;&quot;&gt;Done&lt;/span&gt; or close the setup program.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Quando questa casella è selezionata, il tuo computer verrà riavviato immediatamente quando clicchi su &lt;span style=&quot;font-style:italic;&quot;&gt;Finito&lt;/span&gt; oppure chiudi il programma di setup.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="66"/>
@ -1163,7 +1163,7 @@ Il programma d&apos;installazione sarà terminato e tutte le modifiche andranno
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="133"/>
<source>&lt;h1&gt;Setup Failed&lt;/h1&gt;&lt;br/&gt;%1 has not been set up on your computer.&lt;br/&gt;The error message was: %2.</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Installazione fallita&lt;/h1&gt;&lt;br/&gt;%1 non è stato installato sul tuo computer.&lt;br/&gt;Il messaggio di errore è: %2.</translation>
</message>
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="139"/>
@ -1204,12 +1204,12 @@ Il programma d&apos;installazione sarà terminato e tutte le modifiche andranno
<message>
<location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="41"/>
<source>Format partition %1 (file system: %2, size: %3 MiB) on %4.</source>
<translation type="unfinished"/>
<translation>Formatta la partitione %1 (file system: %2, dimensione: %3 MiB) su %4.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="52"/>
<source>Format &lt;strong&gt;%3MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; with file system &lt;strong&gt;%2&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>Formatta la partizione &lt;strong&gt;%1&lt;/strong&gt; di dimensione &lt;strong&gt;%3MiB &lt;/strong&gt; con il file system &lt;strong&gt;%2&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="63"/>
@ -1298,17 +1298,17 @@ Il programma d&apos;installazione sarà terminato e tutte le modifiche andranno
<message>
<location filename="../src/modules/oemid/IDJob.cpp" line="48"/>
<source>Could not create directories &lt;code&gt;%1&lt;/code&gt;.</source>
<translation type="unfinished"/>
<translation>Impossibile creare le cartelle &lt;code&gt;%1&lt;/code&gt;.</translation>
</message>
<message>
<location filename="../src/modules/oemid/IDJob.cpp" line="60"/>
<source>Could not open file &lt;code&gt;%1&lt;/code&gt;.</source>
<translation type="unfinished"/>
<translation>Impossibile aprire il file &lt;code&gt;%1&lt;/code&gt;.</translation>
</message>
<message>
<location filename="../src/modules/oemid/IDJob.cpp" line="68"/>
<source>Could not write to file &lt;code&gt;%1&lt;/code&gt;.</source>
<translation type="unfinished"/>
<translation>Impossibile scrivere sul file &lt;code&gt;%1&lt;/code&gt;.</translation>
</message>
</context>
<context>
@ -1316,7 +1316,7 @@ Il programma d&apos;installazione sarà terminato e tutte le modifiche andranno
<message>
<location filename="../src/modules/initcpio/InitcpioJob.cpp" line="40"/>
<source>Creating initramfs with mkinitcpio.</source>
<translation type="unfinished"/>
<translation>Sto creando initramfs con mkinitcpio.</translation>
</message>
</context>
<context>
@ -1324,7 +1324,7 @@ Il programma d&apos;installazione sarà terminato e tutte le modifiche andranno
<message>
<location filename="../src/modules/initramfs/InitramfsJob.cpp" line="37"/>
<source>Creating initramfs.</source>
<translation type="unfinished"/>
<translation>Sto creando initramfs.</translation>
</message>
</context>
<context>
@ -1475,32 +1475,32 @@ Il programma d&apos;installazione sarà terminato e tutte le modifiche andranno
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="192"/>
<source>Shows the complete license text</source>
<translation type="unfinished"/>
<translation>Mostra il testo completo della licenza</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="193"/>
<source>Hide license text</source>
<translation type="unfinished"/>
<translation>Nascondi il testo della licenza</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="194"/>
<source>Show license agreement</source>
<translation type="unfinished"/>
<translation>Mostra l&apos;accordo di licenza</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="194"/>
<source>Hide license agreement</source>
<translation type="unfinished"/>
<translation>Nascondi l&apos;accordo di licenza</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="198"/>
<source>Opens the license agreement in a browser window.</source>
<translation type="unfinished"/>
<translation>Apre l&apos;accordo di licenza in una finestra del browser.</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="200"/>
<source>&lt;a href=&quot;%1&quot;&gt;View license agreement&lt;/a&gt;</source>
<translation type="unfinished"/>
<translation>&lt;a href=&quot;%1&quot;&gt;Visualizza l&apos;accordo di licenza&lt;/a&gt;</translation>
</message>
</context>
<context>
@ -1556,7 +1556,7 @@ Il programma d&apos;installazione sarà terminato e tutte le modifiche andranno
<location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="156"/>
<location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="164"/>
<source>No partitions are defined.</source>
<translation type="unfinished"/>
<translation>Non è stata specificata alcuna partizione.</translation>
</message>
<message>
<location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="192"/>
@ -2462,7 +2462,7 @@ Output:
<message>
<location filename="../src/modules/packagechooser/PackageModel.cpp" line="87"/>
<source>No description provided.</source>
<translation type="unfinished"/>
<translation>Non è stata fornita alcuna descrizione.</translation>
</message>
</context>
<context>
@ -2564,7 +2564,7 @@ Output:
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="59"/>
<source>Resize Filesystem Job</source>
<translation type="unfinished"/>
<translation>Operazione di ridimensionamento del Filesystem</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="172"/>
@ -2574,7 +2574,7 @@ Output:
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="173"/>
<source>The file-system resize job has an invalid configuration and will not run.</source>
<translation type="unfinished"/>
<translation>L&apos;operazione di ridimensionamento del file-system ha una configurazione non valida e non verrà effettuata.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="187"/>
@ -2622,12 +2622,12 @@ Output:
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="238"/>
<source>The filesystem %1 must be resized, but cannot.</source>
<translation type="unfinished"/>
<translation>Il filesystem %1 deve essere ridimensionato, ma non è possibile farlo.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="239"/>
<source>The device %1 must be resized, but cannot</source>
<translation type="unfinished"/>
<translation>Il dispositivo %1 deve essere ridimensionato, non è possibile farlo</translation>
</message>
</context>
<context>
@ -2645,7 +2645,7 @@ Output:
<message>
<location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="66"/>
<source>Resizing %2MiB partition %1 to %3MiB.</source>
<translation type="unfinished"/>
<translation>Sto ridimensionando la partizione %1 di dimensione %2MiB a %3MiB.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="85"/>
@ -2667,12 +2667,12 @@ Output:
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="37"/>
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="55"/>
<source>Resize volume group named %1 from %2 to %3.</source>
<translation type="unfinished"/>
<translation>Ridimensiona il gruppo di volumi con nome %1 da %2 a %3.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="46"/>
<source>Resize volume group named &lt;strong&gt;%1&lt;/strong&gt; from &lt;strong&gt;%2&lt;/strong&gt; to &lt;strong&gt;%3&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>Ridimensiona il gruppo di volumi con nome &lt;strong&gt;%1&lt;/strong&gt; da &lt;strong&gt;%2&lt;/strong&gt; a &lt;strong&gt;%3&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="70"/>
@ -2685,7 +2685,7 @@ Output:
<message>
<location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="96"/>
<source>This computer does not satisfy the minimum requirements for setting up %1.&lt;br/&gt;Setup cannot continue. &lt;a href=&quot;#details&quot;&gt;Details...&lt;/a&gt;</source>
<translation type="unfinished"/>
<translation>Questo computer non soddisfa i requisiti minimi per l&apos;installazione di %1.&lt;br/&gt;L&apos;installazione non può continuare. &lt;a href=&quot;#details&quot;&gt;Dettagli...&lt;/a&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="100"/>
@ -2695,7 +2695,7 @@ Output:
<message>
<location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="118"/>
<source>This computer does not satisfy some of the recommended requirements for setting up %1.&lt;br/&gt;Setup can continue, but some features might be disabled.</source>
<translation type="unfinished"/>
<translation>Questo computer non soddisfa alcuni requisiti raccomandati per l&apos;installazione di %1.&lt;br/&gt;L&apos;installazione può continuare, ma alcune funzionalità potrebbero essere disabilitate.</translation>
</message>
<message>
<location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="122"/>
@ -3230,17 +3230,17 @@ Output:
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="140"/>
<source>Open donations website</source>
<translation type="unfinished"/>
<translation>Apri il sito web per le donazioni</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="143"/>
<source>&amp;Donate</source>
<translation type="unfinished"/>
<translation>&amp;Donazioni</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="153"/>
<source>Open help and support website</source>
<translation type="unfinished"/>
<translation>Apri il sito web per l&apos;aiuto ed il supporto</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="166"/>
@ -3250,7 +3250,7 @@ Output:
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="179"/>
<source>Open release notes website</source>
<translation type="unfinished"/>
<translation>Apri il sito web delle note di rilascio</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="182"/>
@ -3285,12 +3285,12 @@ Output:
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="247"/>
<source>&lt;h1&gt;Welcome to the Calamares setup program for %1.&lt;/h1&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Benvenuto nel programma di installazione Calamares di %1.&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="248"/>
<source>&lt;h1&gt;Welcome to %1 setup.&lt;/h1&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Benvenuto nell&apos;installazione di %1.&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="266"/>

View File

@ -1165,7 +1165,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="133"/>
<source>&lt;h1&gt;Setup Failed&lt;/h1&gt;&lt;br/&gt;%1 has not been set up on your computer.&lt;br/&gt;The error message was: %2.</source>
<translation>&lt;h1&gt;&lt;/h1&gt;&lt;br/&gt;%1 &lt;br/&gt;: %2</translation>
<translation>&lt;h1&gt;&lt;/h1&gt;&lt;br/&gt;%1 &lt;br/&gt;: %2</translation>
</message>
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="139"/>

View File

@ -135,7 +135,7 @@
<message>
<location filename="../src/libcalamares/JobExample.cpp" line="40"/>
<source>Programmed job failure was explicitly requested.</source>
<translation type="unfinished"/>
<translation> ി ി ി.</translation>
</message>
</context>
<context>
@ -648,12 +648,12 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/libcalamares/utils/CommandList.cpp" line="151"/>
<source>The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined.</source>
<translation type="unfinished"/>
<translation> ി ി, ി, rootMountPoint ിിിി.</translation>
</message>
<message>
<location filename="../src/libcalamares/utils/CommandList.cpp" line="164"/>
<source>The command needs to know the user&apos;s name, but no username is defined.</source>
<translation type="unfinished"/>
<translation>ി ി ി, ിിിി.</translation>
</message>
</context>
<context>
@ -661,7 +661,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/contextualprocess/ContextualProcessJob.cpp" line="123"/>
<source>Contextual Processes Job</source>
<translation type="unfinished"/>
<translation>ി ി ി</translation>
</message>
</context>
<context>
@ -932,7 +932,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="151"/>
<source>The type of &lt;strong&gt;partition table&lt;/strong&gt; on the selected storage device.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;This installer will keep the current partition table unless you explicitly choose otherwise.&lt;br&gt;If unsure, on modern systems GPT is preferred.</source>
<translation type="unfinished"/>
<translation>ി ി &lt;strong&gt; ിി&lt;/strong&gt;.&lt;br&gt;&lt;br&gt; ി ി , ി ിി.&lt;br&gt;ി ി ിിിി ിി ി ി.&lt;br&gt;ിി, ി ിി ിിി .</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="108"/>
@ -942,7 +942,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="115"/>
<source>This is a &lt;strong&gt;loop&lt;/strong&gt; device.&lt;br&gt;&lt;br&gt;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.</source>
<translation type="unfinished"/>
<translation> &lt;strong&gt;&lt;/strong&gt; .&lt;br&gt;&lt;br&gt; ി ി ിി ി-ി. ി ി ി .</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="122"/>
@ -1344,7 +1344,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="116"/>
<source>Executing script: &amp;nbsp;&lt;code&gt;%1&lt;/code&gt;</source>
<translation type="unfinished"/>
<translation>ി ിി:&amp;nbsp;&lt;code&gt;%1&lt;/code&gt;</translation>
</message>
</context>
<context>
@ -1386,7 +1386,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/locale/LCLocaleDialog.cpp" line="39"/>
<source>The system locale setting affects the language and character set for some command line user interface elements.&lt;br/&gt;The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>ി , ി. &lt;br/&gt;ിി &lt;strong&gt;%1&lt;/strong&gt; .</translation>
</message>
<message>
<location filename="../src/modules/locale/LCLocaleDialog.cpp" line="63"/>
@ -1414,22 +1414,22 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/license/LicensePage.cpp" line="151"/>
<source>&lt;h1&gt;License Agreement&lt;/h1&gt;This setup procedure will install proprietary software that is subject to licensing terms.</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt; ി&lt;/h1&gt; ി ി ി ി .</translation>
</message>
<message>
<location filename="../src/modules/license/LicensePage.cpp" line="154"/>
<source>Please review the End User License Agreements (EULAs) above.&lt;br/&gt;If you do not agree with the terms, the setup procedure cannot continue.</source>
<translation type="unfinished"/>
<translation>ി ി (EULAs) .&lt;br/&gt;ി ി ിിി, ി ി.</translation>
</message>
<message>
<location filename="../src/modules/license/LicensePage.cpp" line="158"/>
<source>&lt;h1&gt;License Agreement&lt;/h1&gt;This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience.</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt; ി&lt;/h1&gt;ി ി ി ി ിി ി ി ി ി.</translation>
</message>
<message>
<location filename="../src/modules/license/LicensePage.cpp" line="163"/>
<source>Please review the End User License Agreements (EULAs) above.&lt;br/&gt;If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead.</source>
<translation type="unfinished"/>
<translation>ി ി (EULAs) .&lt;br/&gt;ി ി ിിി, ി ി, ി.</translation>
</message>
</context>
<context>
@ -1452,27 +1452,27 @@ The installer will quit and all changes will be lost.</source>
<location filename="../src/modules/license/LicenseWidget.cpp" line="130"/>
<source>&lt;strong&gt;%1 graphics driver&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source>
<extracomment>%1 is usually a vendor name, example: Nvidia graphics driver</extracomment>
<translation type="unfinished"/>
<translation>&lt;strong&gt;%1 ി &lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="136"/>
<source>&lt;strong&gt;%1 browser plugin&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;%1 ി&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="142"/>
<source>&lt;strong&gt;%1 codec&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;%1 &lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="148"/>
<source>&lt;strong&gt;%1 package&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;%1 &lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="154"/>
<source>&lt;strong&gt;%1&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;%1&lt;/strong&gt;&lt;br/&gt;&lt;font color=&quot;Grey&quot;&gt;by %2&lt;/font&gt;</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="192"/>
@ -1624,7 +1624,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/oemid/OEMPage.ui" line="28"/>
<source>Ba&amp;tch:</source>
<translation type="unfinished"/>
<translation> (&amp;t):</translation>
</message>
<message>
<location filename="../src/modules/oemid/OEMPage.ui" line="38"/>
@ -1634,7 +1634,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/oemid/OEMPage.ui" line="48"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;h1&gt;OEM Configuration&lt;/h1&gt;&lt;p&gt;Calamares will use OEM settings while configuring the target system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;h1&gt;OEM &lt;/h1&gt;&lt;p&gt; ി ി OEM ി.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
</context>
<context>
@ -1647,7 +1647,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/oemid/OEMViewStep.cpp" line="126"/>
<source>Set the OEM Batch Identifier to &lt;code&gt;%1&lt;/code&gt;.</source>
<translation type="unfinished"/>
<translation>OEM ി &lt;code&gt;%1&lt;/code&gt; ി ി.</translation>
</message>
</context>
<context>
@ -1770,7 +1770,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="219"/>
<source>The password contains less than %1 character classes</source>
<translation type="unfinished"/>
<translation>ി %1 </translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="220"/>
@ -1800,12 +1800,12 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="231"/>
<source>The password contains monotonic sequence longer than %1 characters</source>
<translation type="unfinished"/>
<translation>ി %1 ി ി ിിി</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="232"/>
<source>The password contains too long of a monotonic character sequence</source>
<translation type="unfinished"/>
<translation>ി ി ി</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="234"/>
@ -1845,7 +1845,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="257"/>
<source>Bad integer value of setting - %1</source>
<translation type="unfinished"/>
<translation>ി ി - %1</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="261"/>
@ -1987,7 +1987,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/users/page_usersetup.ui" line="309"/>
<source>&lt;small&gt;This name will be used if you make the computer visible to others on a network.&lt;/small&gt;</source>
<translation type="unfinished"/>
<translation>&lt;small&gt;ി ി ി ി.&lt;/small&gt;</translation>
</message>
<message>
<location filename="../src/modules/users/page_usersetup.ui" line="466"/>
@ -2007,7 +2007,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/users/page_usersetup.ui" line="601"/>
<source>&lt;small&gt;Enter the same password twice, so that it can be checked for typing errors.&lt;/small&gt;</source>
<translation type="unfinished"/>
<translation>&lt;small&gt; , ി ി ി ിി ി.&lt;/small&gt;</translation>
</message>
</context>
<context>
@ -2164,7 +2164,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/PartitionPage.cpp" line="239"/>
<source>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.</source>
<translation type="unfinished"/>
<translation>%1 ിി ി %2 ി ,ി ിി. ി .</translation>
</message>
</context>
<context>
@ -2182,7 +2182,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="167"/>
<source>Install %1 &lt;strong&gt;alongside&lt;/strong&gt; another operating system.</source>
<translation type="unfinished"/>
<translation> ി ിി %1 .</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="171"/>
@ -2197,12 +2197,12 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="180"/>
<source>&lt;strong&gt;Manual&lt;/strong&gt; partitioning.</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;&lt;/strong&gt; ി.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="193"/>
<source>Install %1 &lt;strong&gt;alongside&lt;/strong&gt; another operating system on disk &lt;strong&gt;%2&lt;/strong&gt; (%3).</source>
<translation type="unfinished"/>
<translation>%2 (%3) ിി ി ിി %1 .</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="199"/>
@ -2262,7 +2262,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="466"/>
<source>A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.&lt;br/&gt;&lt;br/&gt;There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.&lt;br/&gt;You may continue if you wish, but filesystem unlocking will happen later during system startup.&lt;br/&gt;To encrypt the boot partition, go back and recreate it, selecting &lt;strong&gt;Encrypt&lt;/strong&gt; in the partition creation window.</source>
<translation type="unfinished"/>
<translation>ി ി ിി, ി .&lt;br/&gt;&lt;br/&gt; ി , ി ി ി ിി.&lt;br/&gt; ി , ി ി ിി ി ി.&lt;br/&gt; ി ി, ിി ി ി ി &lt;strong&gt;ി&lt;/strong&gt; ി ിി.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="650"/>
@ -2280,13 +2280,13 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/plasmalnf/PlasmaLnfJob.cpp" line="41"/>
<source>Plasma Look-and-Feel Job</source>
<translation type="unfinished"/>
<translation> ി</translation>
</message>
<message>
<location filename="../src/modules/plasmalnf/PlasmaLnfJob.cpp" line="73"/>
<location filename="../src/modules/plasmalnf/PlasmaLnfJob.cpp" line="74"/>
<source>Could not select KDE Plasma Look-and-Feel package</source>
<translation type="unfinished"/>
<translation>ി ിി</translation>
</message>
</context>
<context>
@ -2299,12 +2299,12 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/plasmalnf/PlasmaLnfPage.cpp" line="70"/>
<source>Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel.</source>
<translation type="unfinished"/>
<translation>ി ിി ി.ി ിി ി ി ി ി. ിി ി ി ി .</translation>
</message>
<message>
<location filename="../src/modules/plasmalnf/PlasmaLnfPage.cpp" line="76"/>
<source>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.</source>
<translation type="unfinished"/>
<translation>ി ിി ി.ി ിി ി ി ി ി </translation>
</message>
</context>
<context>
@ -2312,7 +2312,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/plasmalnf/PlasmaLnfViewStep.cpp" line="68"/>
<source>Look-and-Feel</source>
<translation type="unfinished"/>
<translation> </translation>
</message>
</context>
<context>
@ -2354,7 +2354,7 @@ Output:
<message>
<location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="412"/>
<source>External command crashed.</source>
<translation type="unfinished"/>
<translation> .</translation>
</message>
<message>
<location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="413"/>
@ -2364,12 +2364,12 @@ Output:
<message>
<location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="418"/>
<source>External command failed to start.</source>
<translation type="unfinished"/>
<translation> ിി .</translation>
</message>
<message>
<location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="419"/>
<source>Command &lt;i&gt;%1&lt;/i&gt; failed to start.</source>
<translation type="unfinished"/>
<translation>&lt;i&gt;%1&lt;/i&gt; ിി .</translation>
</message>
<message>
<location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="423"/>
@ -2379,27 +2379,27 @@ Output:
<message>
<location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="424"/>
<source>Bad parameters for process job call.</source>
<translation type="unfinished"/>
<translation>ി ി ിി ി .</translation>
</message>
<message>
<location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="428"/>
<source>External command failed to finish.</source>
<translation type="unfinished"/>
<translation> ിി .</translation>
</message>
<message>
<location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="429"/>
<source>Command &lt;i&gt;%1&lt;/i&gt; failed to finish in %2 seconds.</source>
<translation type="unfinished"/>
<translation> &lt;i&gt;%1&lt;/i&gt; %2 ി ിി .</translation>
</message>
<message>
<location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="436"/>
<source>External command finished with errors.</source>
<translation type="unfinished"/>
<translation> ി ിി.</translation>
</message>
<message>
<location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="437"/>
<source>Command &lt;i&gt;%1&lt;/i&gt; finished with exit code %2.</source>
<translation type="unfinished"/>
<translation> &lt;i&gt;%1&lt;/i&gt; ി %2 ി ിി.</translation>
</message>
</context>
<context>
@ -2423,7 +2423,7 @@ Output:
<message>
<location filename="../src/modules/partition/core/KPMHelpers.cpp" line="209"/>
<source>extended</source>
<translation type="unfinished"/>
<translation>ി</translation>
</message>
<message>
<location filename="../src/modules/partition/core/KPMHelpers.cpp" line="211"/>
@ -2566,7 +2566,7 @@ Output:
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="59"/>
<source>Resize Filesystem Job</source>
<translation type="unfinished"/>
<translation> ിി ി</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="172"/>
@ -2576,19 +2576,19 @@ Output:
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="173"/>
<source>The file-system resize job has an invalid configuration and will not run.</source>
<translation type="unfinished"/>
<translation> ി ിി , ിി.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="187"/>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="197"/>
<source>KPMCore not Available</source>
<translation type="unfinished"/>
<translation>KPMCore </translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="188"/>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="198"/>
<source>Calamares cannot start KPMCore for the file-system resize job.</source>
<translation type="unfinished"/>
<translation> ി ി ിി ി KPMCore ി ിി.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="206"/>
@ -2597,39 +2597,39 @@ Output:
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="237"/>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="254"/>
<source>Resize Failed</source>
<translation type="unfinished"/>
<translation> </translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="207"/>
<source>The filesystem %1 could not be found in this system, and cannot be resized.</source>
<translation type="unfinished"/>
<translation> ി %1 ിി ി, ി ി ി.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="208"/>
<source>The device %1 could not be found in this system, and cannot be resized.</source>
<translation type="unfinished"/>
<translation> %1 ിി ി, ി ി ി.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="216"/>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="229"/>
<source>The filesystem %1 cannot be resized.</source>
<translation type="unfinished"/>
<translation>%1 ിി ിി.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="217"/>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="230"/>
<source>The device %1 cannot be resized.</source>
<translation type="unfinished"/>
<translation>%1 ി ിി.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="238"/>
<source>The filesystem %1 must be resized, but cannot.</source>
<translation type="unfinished"/>
<translation>%1 ിി , ിി.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="239"/>
<source>The device %1 must be resized, but cannot</source>
<translation type="unfinished"/>
<translation>%1 ി , ിി</translation>
</message>
</context>
<context>
@ -2637,22 +2637,22 @@ Output:
<message>
<location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="48"/>
<source>Resize partition %1.</source>
<translation type="unfinished"/>
<translation>%1 .</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="55"/>
<source>Resize &lt;strong&gt;%2MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; to &lt;strong&gt;%3MiB&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;%1&lt;/strong&gt; &lt;strong&gt;%2MiB&lt;/strong&gt; &lt;strong&gt;%3Mib&lt;/strong&gt;ി .</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="66"/>
<source>Resizing %2MiB partition %1 to %3MiB.</source>
<translation type="unfinished"/>
<translation>%1 %2MiB %3Mibയി .</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="85"/>
<source>The installer failed to resize partition %1 on disk &apos;%2&apos;.</source>
<translation type="unfinished"/>
<translation>&apos;%2&apos; ിി %1 ി </translation>
</message>
</context>
<context>
@ -2669,17 +2669,17 @@ Output:
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="37"/>
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="55"/>
<source>Resize volume group named %1 from %2 to %3.</source>
<translation type="unfinished"/>
<translation>%1 ി %2 ി %3 .</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="46"/>
<source>Resize volume group named &lt;strong&gt;%1&lt;/strong&gt; from &lt;strong&gt;%2&lt;/strong&gt; to &lt;strong&gt;%3&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;%1&lt;/strong&gt; ി &lt;strong&gt;%2&lt;/strong&gt; ി &lt;strong&gt;%3&lt;/strong&gt; .</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="70"/>
<source>The installer failed to resize a volume group named &apos;%1&apos;.</source>
<translation type="unfinished"/>
<translation>&apos;%1&apos; ി ി .</translation>
</message>
</context>
<context>
@ -2712,7 +2712,7 @@ Output:
<message>
<location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="181"/>
<source>For best results, please ensure that this computer:</source>
<translation type="unfinished"/>
<translation>ി ി ി :</translation>
</message>
<message>
<location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="209"/>
@ -2760,7 +2760,7 @@ Output:
<location filename="../src/modules/users/SetHostNameJob.cpp" line="76"/>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="87"/>
<source>Cannot write hostname to target system</source>
<translation type="unfinished"/>
<translation> ിി ിി</translation>
</message>
</context>
<context>
@ -2768,12 +2768,12 @@ Output:
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="59"/>
<source>Set keyboard model to %1, layout to %2-%3</source>
<translation type="unfinished"/>
<translation> %1 ി ി, %2-%3</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="321"/>
<source>Failed to write keyboard configuration for the virtual console.</source>
<translation type="unfinished"/>
<translation>ി ി ി .</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="322"/>
@ -2785,12 +2785,12 @@ Output:
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="325"/>
<source>Failed to write keyboard configuration for X11.</source>
<translation type="unfinished"/>
<translation>X11 ി ി ി .</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="331"/>
<source>Failed to write keyboard configuration to existing /etc/default directory.</source>
<translation type="unfinished"/>
<translation>ിി /etc/default ിി ി ി .</translation>
</message>
</context>
<context>
@ -2823,17 +2823,17 @@ Output:
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="85"/>
<source>Flag %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition as &lt;strong&gt;%3&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>%1MiB &lt;strong&gt;%2&lt;/strong&gt; &lt;strong&gt;%3&lt;/strong&gt; ി .</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="107"/>
<source>Clearing flags on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</source>
<translation type="unfinished"/>
<translation> %1MiB &lt;strong&gt;%2&lt;/strong&gt; ി ിി.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="121"/>
<source>Setting flags &lt;strong&gt;%3&lt;/strong&gt; on %1MiB &lt;strong&gt;%2&lt;/strong&gt; partition.</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;%3&lt;/strong&gt; %1MiB &lt;strong&gt;%2&lt;/strong&gt; ി ി.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="75"/>
@ -2843,12 +2843,12 @@ Output:
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="79"/>
<source>Flag partition &lt;strong&gt;%1&lt;/strong&gt; as &lt;strong&gt;%2&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;%1&lt;/strong&gt; &lt;strong&gt;%2&lt;/strong&gt; ി </translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="91"/>
<source>Flag new partition as &lt;strong&gt;%1&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>ി &lt;strong&gt;%1 &lt;/strong&gt;ി .</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="103"/>
@ -2863,12 +2863,12 @@ Output:
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="115"/>
<source>Setting flags &lt;strong&gt;%2&lt;/strong&gt; on partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;%2&lt;/strong&gt; &lt;strong&gt;%1&lt;/strong&gt; ി ി.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="127"/>
<source>Setting flags &lt;strong&gt;%1&lt;/strong&gt; on new partition.</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;%1&lt;/strong&gt; ി ി ി.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="144"/>
@ -2891,12 +2891,12 @@ Output:
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="112"/>
<source>Bad destination system path.</source>
<translation type="unfinished"/>
<translation>ി ി .</translation>
</message>
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="113"/>
<source>rootMountPoint is %1</source>
<translation type="unfinished"/>
<translation>rootMountPoint %1 </translation>
</message>
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="123"/>
@ -2906,7 +2906,7 @@ Output:
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="124"/>
<source>passwd terminated with error code %1.</source>
<translation type="unfinished"/>
<translation>passwd ി %1 ി.</translation>
</message>
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="139"/>
@ -2916,7 +2916,7 @@ Output:
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="141"/>
<source>usermod terminated with error code %1.</source>
<translation type="unfinished"/>
<translation>usermod ി %1 ി.</translation>
</message>
</context>
<context>
@ -2924,17 +2924,17 @@ Output:
<message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="43"/>
<source>Set timezone to %1/%2</source>
<translation type="unfinished"/>
<translation>%1%2 ി ി ി</translation>
</message>
<message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="71"/>
<source>Cannot access selected timezone path.</source>
<translation type="unfinished"/>
<translation>ി ി .</translation>
</message>
<message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="72"/>
<source>Bad path: %1</source>
<translation type="unfinished"/>
<translation> : %1</translation>
</message>
<message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="80"/>
@ -2944,7 +2944,7 @@ Output:
<message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="81"/>
<source>Link creation failed, target: %1; link name: %2</source>
<translation type="unfinished"/>
<translation>ി , : %1, ി : %2</translation>
</message>
<message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="86"/>
@ -2962,7 +2962,7 @@ Output:
<message>
<location filename="../src/modules/shellprocess/ShellProcessJob.cpp" line="50"/>
<source>Shell Processes Job</source>
<translation type="unfinished"/>
<translation> ി ി</translation>
</message>
</context>
<context>
@ -2971,7 +2971,7 @@ Output:
<location filename="../src/qml/calamares/slideshow/SlideCounter.qml" line="36"/>
<source>%L1 / %L2</source>
<extracomment>slide counter, %1 of %2 (numeric)</extracomment>
<translation type="unfinished"/>
<translation>%L1 / %L2</translation>
</message>
</context>
<context>
@ -2984,7 +2984,7 @@ Output:
<message>
<location filename="../src/modules/summary/SummaryPage.cpp" line="60"/>
<source>This is an overview of what will happen once you start the install procedure.</source>
<translation type="unfinished"/>
<translation>ി ി ിി ി ി ി.</translation>
</message>
</context>
<context>
@ -3010,12 +3010,12 @@ Output:
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="71"/>
<source>Internal error in install-tracking.</source>
<translation type="unfinished"/>
<translation>-ിി ി ി.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="72"/>
<source>HTTP request timed out.</source>
<translation type="unfinished"/>
<translation>HTTP ിി ി.</translation>
</message>
</context>
<context>
@ -3023,28 +3023,28 @@ Output:
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="80"/>
<source>Machine feedback</source>
<translation type="unfinished"/>
<translation>ി ി ി</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="92"/>
<source>Configuring machine feedback.</source>
<translation type="unfinished"/>
<translation>ി ി ി ി.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="117"/>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="123"/>
<source>Error in machine feedback configuration.</source>
<translation type="unfinished"/>
<translation>ി ി ിി ി ി.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="118"/>
<source>Could not configure machine feedback correctly, script error %1.</source>
<translation type="unfinished"/>
<translation>ി ി ി ിി ിി. ി ി %1.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="124"/>
<source>Could not configure machine feedback correctly, Calamares error %1.</source>
<translation type="unfinished"/>
<translation>ി ി ി ിി ിി. ി %1.</translation>
</message>
</context>
<context>
@ -3057,22 +3057,22 @@ Output:
<message>
<location filename="../src/modules/tracking/page_trackingstep.ui" line="24"/>
<source>Placeholder</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/modules/tracking/page_trackingstep.ui" line="72"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;By selecting this, you will send &lt;span style=&quot; font-weight:600;&quot;&gt;no information at all&lt;/span&gt; about your installation.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; ിി, ി ി &lt;span style=&quot; font-weight:600;&quot;&gt; ി ി ി.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/modules/tracking/page_trackingstep.ui" line="271"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;placeholder&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;Click here for more information about user feedback&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;placeholder&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt; ിി ി ി ി&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingPage.cpp" line="44"/>
<source>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.</source>
<translation type="unfinished"/>
<translation> , ി %1 ( ) ി ി ി ി %1 ി ി. , ി ി ി.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingPage.cpp" line="49"/>
@ -3082,7 +3082,7 @@ Output:
<message>
<location filename="../src/modules/tracking/TrackingPage.cpp" line="51"/>
<source>By selecting this you will &lt;b&gt;periodically&lt;/b&gt; send information about your installation, hardware and applications, to %1.</source>
<translation type="unfinished"/>
<translation> ിി &lt;b&gt;ി&lt;/b&gt; ി ി ി %1 .</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingPage.cpp" line="54"/>
@ -3173,7 +3173,7 @@ Output:
<message>
<location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="20"/>
<source>List of Physical Volumes</source>
<translation type="unfinished"/>
<translation>ിി ി</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="30"/>
@ -3188,7 +3188,7 @@ Output:
<message>
<location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="56"/>
<source>Physical Extent Size:</source>
<translation type="unfinished"/>
<translation>ിി :</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="66"/>
@ -3213,7 +3213,7 @@ Output:
<message>
<location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="142"/>
<source>Quantity of LVs:</source>
<translation type="unfinished"/>
<translation>LVകളുട :</translation>
</message>
</context>
<context>
@ -3307,7 +3307,7 @@ Output:
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="269"/>
<source>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;&lt;strong&gt;%2&lt;br/&gt;for %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Copyright 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;Copyright 2017-2019 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;Thanks to &lt;a href=&quot;https://calamares.io/team/&quot;&gt;the Calamares team&lt;/a&gt; and the &lt;a href=&quot;https://www.transifex.com/calamares/calamares/&quot;&gt;Calamares translators team&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;https://calamares.io/&quot;&gt;Calamares&lt;/a&gt; development is sponsored by &lt;br/&gt;&lt;a href=&quot;http://www.blue-systems.com/&quot;&gt;Blue Systems&lt;/a&gt; - Liberating Software.</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;&lt;strong&gt;%2&lt;br/&gt;%3 &lt;/strong&gt;&lt;br/&gt;&lt;br/&gt; 2015-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt; 2018-2019 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;&lt;a href=&quot;https://calamares.io/team/&quot;&gt;കലാമരേസ് ടീമിനും&lt;/a&gt;&lt;a href=&quot;https://www.transifex.com/calamares/calamares/&quot;&gt;കലാമരേസ് പരിഭാഷാ ടീമിനും&lt;/a&gt; നന്ദി.&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;https://calamares.io/&quot;&gt;കലാമരേസ്&lt;/a&gt;വികസനം &lt;br/&gt;&lt;a href=&quot;http://www.blue-systems.com/&quot;&gt;Blue Systems&lt;/a&gt;- Liberating Software സ്പോൺസർ ചെയ്യുന്നതാണ്.</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="259"/>

View File

@ -4,17 +4,17 @@
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="71"/>
<source>The &lt;strong&gt;boot environment&lt;/strong&gt; of this system.&lt;br&gt;&lt;br&gt;Older x86 systems only support &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Modern systems usually use &lt;strong&gt;EFI&lt;/strong&gt;, but may also show up as BIOS if started in compatibility mode.</source>
<translation>Systemets &lt;strong&gt;uppstartsmiljö&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;Äldre x86-system stödjer endast &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Moderna system stödjer vanligen &lt;strong&gt;EFI&lt;/strong&gt;, men kan också vara i kompabilitetsläge för BIOS.</translation>
<translation>Systemets &lt;strong&gt;startmiljö&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;Äldre x86-system stöder endast &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Moderna system stöder vanligen &lt;strong&gt;EFI&lt;/strong&gt;, men kan också vara i kompatibilitetsläge för BIOS.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="81"/>
<source>This system was started with an &lt;strong&gt;EFI&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from an EFI environment, this installer must deploy a boot loader application, like &lt;strong&gt;GRUB&lt;/strong&gt; or &lt;strong&gt;systemd-boot&lt;/strong&gt; on an &lt;strong&gt;EFI System Partition&lt;/strong&gt;. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own.</source>
<translation>Detta system startades med en &lt;strong&gt;EFI-miljö&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;För att ställa in uppstart från en EFI-miljö måste en uppstartsladdare användas, t.ex. &lt;strong&gt;GRUB&lt;/strong&gt; eller &lt;strong&gt;systemd-boot&lt;/strong&gt; eller en &lt;strong&gt;EFI-systempartition&lt;/strong&gt;. Detta sker automatiskt, såvida du inte väljer att partitionera manuellt. Då måste du själv installera en uppstartsladdare.</translation>
<translation>Detta system startades med en &lt;strong&gt;EFI-miljö&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;För att ställa in start från en EFI-miljö måste en starthanterare användas, t.ex. &lt;strong&gt;GRUB&lt;/strong&gt; eller &lt;strong&gt;systemd-boot&lt;/strong&gt; på en &lt;strong&gt;EFI-systempartition&lt;/strong&gt;. Detta sker automatiskt, såvida du inte väljer att partitionera manuellt. Då måste du själv installera en starthanterare.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="93"/>
<source>This system was started with a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from a BIOS environment, this installer must install a boot loader, like &lt;strong&gt;GRUB&lt;/strong&gt;, either at the beginning of a partition or on the &lt;strong&gt;Master Boot Record&lt;/strong&gt; 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.</source>
<translation>Detta system startades med en &lt;strong&gt;BIOS-miljö&lt;/strong&gt;. &lt;br&gt;&lt;br&gt;För att ställa in uppstart från en BIOS-miljö måste en uppstartsladdare som t.ex. &lt;strong&gt;GRUB&lt;/strong&gt; installeras, antingen i början av en partition eller på &lt;strong&gt;huvudstartsektorn (MBR)&lt;/strong&gt; i början av partitionstabellen. Detta sker automatiskt, såvida du inte väljer manuell partitionering. Då måste du själv installera en uppstartsladdare.</translation>
<translation>Detta system startades med en &lt;strong&gt;BIOS-miljö&lt;/strong&gt;. &lt;br&gt;&lt;br&gt;För att ställa in start från en BIOS-miljö måste en starthanterare som t.ex. &lt;strong&gt;GRUB&lt;/strong&gt; installeras, antingen i början av en partition eller på &lt;strong&gt;huvudstartsektorn (MBR)&lt;/strong&gt; i början av partitionstabellen. Detta sker automatiskt, såvida du inte väljer manuell partitionering. Då måste du själv installera en starthanterare.</translation>
</message>
</context>
<context>
@ -27,7 +27,7 @@
<message>
<location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="104"/>
<source>Boot Partition</source>
<translation>Uppstartspartition</translation>
<translation>Startpartition</translation>
</message>
<message>
<location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="109"/>
@ -37,7 +37,7 @@
<message>
<location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="139"/>
<source>Do not install a boot loader</source>
<translation>Installera inte en uppstartsladdare</translation>
<translation>Installera inte någon starthanterare</translation>
</message>
<message>
<location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="156"/>
@ -210,12 +210,12 @@
<message numerus="yes">
<location filename="../src/libcalamaresui/modulesystem/RequirementsChecker.cpp" line="166"/>
<source>Waiting for %n module(s).</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Väntar %n modul(er).</numerusform><numerusform>Väntar %n modul(er).</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/libcalamaresui/modulesystem/RequirementsChecker.cpp" line="167"/>
<source>(%n second(s))</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>(%n sekund(er))</numerusform><numerusform>(%n sekund(er))</numerusform></translation>
</message>
<message>
<location filename="../src/libcalamaresui/modulesystem/RequirementsChecker.cpp" line="172"/>
@ -273,7 +273,7 @@
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="269"/>
<source>Calamares Initialization Failed</source>
<translation type="unfinished"/>
<translation>Initieringen av Calamares misslyckades</translation>
</message>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="270"/>
@ -283,7 +283,7 @@
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="276"/>
<source>&lt;br/&gt;The following modules could not be loaded:</source>
<translation type="unfinished"/>
<translation>&lt;br/&gt;Följande moduler kunde inte hämtas:</translation>
</message>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="337"/>
@ -363,7 +363,7 @@ Alla ändringar kommer att gå förlorade.</translation>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="342"/>
<source>The %1 installer is about to make changes to your disk in order to install %2.&lt;br/&gt;&lt;strong&gt;You will not be able to undo these changes.&lt;/strong&gt;</source>
<translation>%1-installeraren är väg att göra ändringar för att installera %2.&lt;br/&gt;&lt;strong&gt;Du kommer inte att kunna ångra dessa ändringar!strong&gt;</translation>
<translation>%1-installeraren är väg att göra ändringar för att installera %2.&lt;br/&gt;&lt;strong&gt;Du kommer inte att kunna ångra dessa ändringar.&lt;/strong&gt;</translation>
</message>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="345"/>
@ -474,7 +474,7 @@ Alla ändringar kommer att gå förlorade.</translation>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1024"/>
<source>Boot loader location:</source>
<translation>Sökväg till uppstartshanterare:</translation>
<translation>Sökväg till starthanterare:</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="152"/>
@ -522,7 +522,7 @@ Alla ändringar kommer att gå förlorade.</translation>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1146"/>
<source>EFI system partition:</source>
<translation>EFI system partition:</translation>
<translation>EFI-partition:</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1264"/>
@ -988,7 +988,7 @@ Alla ändringar kommer att gå förlorade.</translation>
<message>
<location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="149"/>
<source>Failed to open %1</source>
<translation type="unfinished"/>
<translation>Kunde inte öppna %1</translation>
</message>
</context>
<context>
@ -2637,12 +2637,12 @@ Output:
<message>
<location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="55"/>
<source>Resize &lt;strong&gt;%2MiB&lt;/strong&gt; partition &lt;strong&gt;%1&lt;/strong&gt; to &lt;strong&gt;%3MiB&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>Ändra &lt;strong&gt;%2MiB&lt;/strong&gt;-partitionen &lt;strong&gt;%1&lt;/strong&gt; till &lt;strong&gt;%3MB&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="66"/>
<source>Resizing %2MiB partition %1 to %3MiB.</source>
<translation type="unfinished"/>
<translation>Ändrar storlek partitionen %1 från %2MB till %3MB.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="85"/>
@ -2682,7 +2682,7 @@ Output:
<message>
<location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="96"/>
<source>This computer does not satisfy the minimum requirements for setting up %1.&lt;br/&gt;Setup cannot continue. &lt;a href=&quot;#details&quot;&gt;Details...&lt;/a&gt;</source>
<translation type="unfinished"/>
<translation>Datorn uppfyller inte minimikraven för inställning av %1.&lt;br/&gt;Inga inställningar kan inte göras. &lt;a href=&quot;#details&quot;&gt;Detaljer...&lt;/a&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="100"/>
@ -2692,7 +2692,7 @@ Output:
<message>
<location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="118"/>
<source>This computer does not satisfy some of the recommended requirements for setting up %1.&lt;br/&gt;Setup can continue, but some features might be disabled.</source>
<translation type="unfinished"/>
<translation>Några av kraven för inställning av %1 uppfylls inte av datorn.&lt;br/&gt;Inställningarna kan ändå göras men vissa funktioner kommer kanske inte att kunna användas.</translation>
</message>
<message>
<location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="122"/>
@ -2785,7 +2785,7 @@ Output:
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="331"/>
<source>Failed to write keyboard configuration to existing /etc/default directory.</source>
<translation type="unfinished"/>
<translation>Misslyckades med att skriva tangentbordskonfiguration till den existerande mappen /etc/default.</translation>
</message>
</context>
<context>
@ -2901,7 +2901,7 @@ Output:
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="124"/>
<source>passwd terminated with error code %1.</source>
<translation type="unfinished"/>
<translation>passwd stoppades med felkod %1.</translation>
</message>
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="139"/>
@ -3052,7 +3052,7 @@ Output:
<message>
<location filename="../src/modules/tracking/page_trackingstep.ui" line="24"/>
<source>Placeholder</source>
<translation type="unfinished"/>
<translation>Platshållare</translation>
</message>
<message>
<location filename="../src/modules/tracking/page_trackingstep.ui" line="72"/>
@ -3098,12 +3098,12 @@ Output:
<message>
<location filename="../src/modules/users/UsersPage.cpp" line="120"/>
<source>&lt;small&gt;If more than one person will use this computer, you can create multiple accounts after setup.&lt;/small&gt;</source>
<translation type="unfinished"/>
<translation>&lt;small&gt;Om mer än en person skall använda datorn kan du skapa flera användarkonton när inställningarna är klara.&lt;/small&gt;</translation>
</message>
<message>
<location filename="../src/modules/users/UsersPage.cpp" line="126"/>
<source>&lt;small&gt;If more than one person will use this computer, you can create multiple accounts after installation.&lt;/small&gt;</source>
<translation type="unfinished"/>
<translation>&lt;small&gt;Om mer än en person skall använda datorn kan du skapa flera användarkonton när installationen är klar.&lt;/small&gt;</translation>
</message>
<message>
<location filename="../src/modules/users/UsersPage.cpp" line="317"/>
@ -3134,7 +3134,7 @@ Output:
<location filename="../src/modules/users/UsersPage.cpp" line="401"/>
<location filename="../src/modules/users/UsersPage.cpp" line="445"/>
<source>Your passwords do not match!</source>
<translation>Dina lösenord matchar inte!</translation>
<translation>Lösenorden överensstämmer inte!</translation>
</message>
</context>
<context>
@ -3150,7 +3150,7 @@ Output:
<message>
<location filename="../src/calamares/VariantModel.cpp" line="241"/>
<source>Key</source>
<translation type="unfinished"/>
<translation>Nyckel</translation>
</message>
<message>
<location filename="../src/calamares/VariantModel.cpp" line="245"/>
@ -3237,22 +3237,22 @@ Output:
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="153"/>
<source>Open help and support website</source>
<translation type="unfinished"/>
<translation>Besök webbplatsen för hjälp och support</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="166"/>
<source>Open issues and bug-tracking website</source>
<translation type="unfinished"/>
<translation>Besök webbplatsen för problem och felsökning</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="179"/>
<source>Open release notes website</source>
<translation type="unfinished"/>
<translation>Besök webbplatsen för versionsinformation</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="182"/>
<source>&amp;Release notes</source>
<translation>Versionsinfomation</translation>
<translation>Versionsinformation, &amp;R</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="169"/>
@ -3262,22 +3262,22 @@ Output:
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="156"/>
<source>&amp;Support</source>
<translation>%Support</translation>
<translation>&amp;Support</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="130"/>
<source>&amp;About</source>
<translation>Om</translation>
<translation>Om, &amp;A</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="254"/>
<source>&lt;h1&gt;Welcome to the %1 installer.&lt;/h1&gt;</source>
<translation>&lt;h1&gt;V&amp;auml;lkommen till %1-installeraren.&lt;/h1&gt;</translation>
<translation>&lt;h1&gt;Välkommen till %1-installeraren.&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="253"/>
<source>&lt;h1&gt;Welcome to the Calamares installer for %1.&lt;/h1&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Välkommen till installationsprogrammet Calamares för %1.&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="247"/>
@ -3292,7 +3292,7 @@ Output:
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="266"/>
<source>About %1 setup</source>
<translation type="unfinished"/>
<translation>Om inställningarna för %1</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="266"/>

View File

@ -3257,7 +3257,7 @@ Kuruluma devam edebilirsiniz fakat bazı özellikler devre dışı kalabilir.</t
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="179"/>
<source>Open release notes website</source>
<translation type="unfinished"/>
<translation>Sürüm Notları web sitesini </translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.ui" line="182"/>

Binary file not shown.

View File

@ -92,11 +92,11 @@ msgstr ""
#: src/modules/umount/main.py:40
msgid "Unmount file systems."
msgstr "ファイルシステムをアンマウントする。"
msgstr "ファイルシステムをアンマウント。"
#: src/modules/unpackfs/main.py:41
msgid "Filling up filesystems."
msgstr "ファイルシステムを埋める。"
msgstr "ファイルシステムに書き込んでいます。"
#: src/modules/unpackfs/main.py:160
msgid "rsync failed with error code {}."
@ -201,7 +201,7 @@ msgstr "ディスプレイマネージャの設定が不完全です"
#: src/modules/initcpiocfg/main.py:36
msgid "Configuring mkinitcpio."
msgstr "mkinitcpioを設定"
msgstr "mkinitcpioを設定しています。"
#: src/modules/initcpiocfg/main.py:192
#: src/modules/luksopenswaphookcfg/main.py:100
@ -213,7 +213,7 @@ msgstr " <pre>{!s}</pre> を使用するのにルートマウントポイント
#: src/modules/luksopenswaphookcfg/main.py:35
msgid "Configuring encrypted swap."
msgstr "暗号化したswapを設定"
msgstr "暗号化したswapを設定しています。"
#: src/modules/rawfs/main.py:35
msgid "Installing data."
@ -274,7 +274,7 @@ msgstr "machine-id の生成"
#: src/modules/packages/main.py:62
#, python-format
msgid "Processing packages (%(count)d / %(total)d)"
msgstr "パッケージの処理中 (%(count)d / %(total)d)"
msgstr "パッケージを処理しています (%(count)d / %(total)d)"
#: src/modules/packages/main.py:64 src/modules/packages/main.py:74
msgid "Install packages."
@ -284,13 +284,13 @@ msgstr "パッケージのインストール"
#, python-format
msgid "Installing one package."
msgid_plural "Installing %(num)d packages."
msgstr[0] " %(num)d パッケージのインストール中。"
msgstr[0] " %(num)d パッケージをインストールしています。"
#: src/modules/packages/main.py:70
#, python-format
msgid "Removing one package."
msgid_plural "Removing %(num)d packages."
msgstr[0] " %(num)d パッケージの削除中。"
msgstr[0] " %(num)d パッケージを削除しています。"
#: src/modules/bootloader/main.py:51
msgid "Install bootloader."
@ -306,7 +306,7 @@ msgstr "ハードウェアクロックの設定"
#: src/modules/dracut/main.py:36
msgid "Creating initramfs with dracut."
msgstr "dracutとinitramfsを作成"
msgstr "dracutとinitramfsを作成しています。"
#: src/modules/dracut/main.py:58
msgid "Failed to run dracut on the target"
@ -318,15 +318,15 @@ msgstr "停止コードは {} でした"
#: src/modules/initramfscfg/main.py:41
msgid "Configuring initramfs."
msgstr "initramfsを設定"
msgstr "initramfsを設定しています。"
#: src/modules/openrcdmcryptcfg/main.py:34
msgid "Configuring OpenRC dmcrypt service."
msgstr "OpenRC dmcryptサービスを設定"
msgstr "OpenRC dmcryptサービスを設定しています。"
#: src/modules/fstab/main.py:38
msgid "Writing fstab."
msgstr "fstabを書き込み中"
msgstr "fstabを書き込んでいます。"
#: src/modules/dummypython/main.py:44
msgid "Dummy python job."
@ -338,8 +338,8 @@ msgstr "Dummy python step {}"
#: src/modules/localecfg/main.py:39
msgid "Configuring locales."
msgstr "ローカルを設定中"
msgstr "ロケールを設定しています。"
#: src/modules/networkcfg/main.py:37
msgid "Saving network configuration."
msgstr "ネットワーク設定を保存"
msgstr "ネットワーク設定を保存しています。"

View File

@ -5,7 +5,7 @@
#
# Translators:
# André Marcelo Alvarenga <alvarenga@kde.org>, 2019
# Guilherme Marçal Silva <guimarcalsilva@gmail.com>, 2019
# Guilherme <guimarcalsilva@gmail.com>, 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 Marçal Silva <guimarcalsilva@gmail.com>, 2019\n"
"Last-Translator: Guilherme <guimarcalsilva@gmail.com>, 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"

Binary file not shown.

View File

@ -3,6 +3,9 @@
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Jan-Olof Svensson, 2019
#
#, fuzzy
msgid ""
msgstr ""
@ -10,6 +13,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: Jan-Olof Svensson, 2019\n"
"Language-Team: Swedish (https://www.transifex.com/calamares/teams/20061/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -208,7 +212,7 @@ msgstr ""
#: src/modules/rawfs/main.py:35
msgid "Installing data."
msgstr ""
msgstr "Installerar data."
#: src/modules/services-openrc/main.py:38
msgid "Configure OpenRC services"
@ -268,21 +272,21 @@ msgstr ""
#: src/modules/packages/main.py:64 src/modules/packages/main.py:74
msgid "Install packages."
msgstr ""
msgstr "Installera paket."
#: src/modules/packages/main.py:67
#, python-format
msgid "Installing one package."
msgid_plural "Installing %(num)d packages."
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Installerar ett paket."
msgstr[1] "Installerar %(num)d paket."
#: src/modules/packages/main.py:70
#, python-format
msgid "Removing one package."
msgid_plural "Removing %(num)d packages."
msgstr[0] ""
msgstr[1] ""
msgstr[0] "Tar bort ett paket."
msgstr[1] "Tar bort %(num)d paket."
#: src/modules/bootloader/main.py:51
msgid "Install bootloader."
@ -294,7 +298,7 @@ msgstr ""
#: src/modules/hwclock/main.py:35
msgid "Setting hardware clock."
msgstr ""
msgstr "Ställer hårdvaruklockan."
#: src/modules/dracut/main.py:36
msgid "Creating initramfs with dracut."
@ -318,7 +322,7 @@ msgstr ""
#: src/modules/fstab/main.py:38
msgid "Writing fstab."
msgstr ""
msgstr "Skriver fstab."
#: src/modules/dummypython/main.py:44
msgid "Dummy python job."

View File

@ -75,26 +75,6 @@ setButtonIcon( QPushButton* button, const QString& name )
}
}
/** @brief Creates a button with a given icon-name
*
* Creates a new button as child of @p parent.
* Sets the named icon, if it exists, onto the button.
* Returns the new button.
*
* There is a QPushButton constructor that takes an icon,
* but it also needs a text and we've got translations
* to worry about as well as state.
*/
static inline QPushButton*
makeButton( QWidget* parent, const QString& name, const QString& label )
{
QPushButton* button = new QPushButton( parent );
button->setObjectName( name );
button->setText( label );
setButtonIcon( button, name );
return button;
}
ViewManager::ViewManager( QObject* parent )
: QObject( parent )
, m_currentStep( 0 )
@ -110,9 +90,12 @@ ViewManager::ViewManager( QObject* parent )
mainLayout->addWidget( m_stack );
// Create buttons and sets an initial icon; the icons may change
m_back = makeButton( m_widget, QStringLiteral( "go-previous" ), tr( "&Back" ) );
m_next = makeButton( m_widget, QStringLiteral( "go-next" ), tr( "&Next" ) );
m_quit = makeButton( m_widget, QStringLiteral( "dialog-cancel" ), tr( "&Cancel" ) );
m_back = new QPushButton( getButtonIcon( QStringLiteral( "go-previous" ) ), tr( "&Back" ), m_widget );
m_back->setObjectName( "view-button-back" );
m_next = new QPushButton( getButtonIcon( QStringLiteral( "go-next" ) ), tr( "&Next" ), m_widget );
m_next->setObjectName( "view-button-next" );
m_quit = new QPushButton( getButtonIcon( QStringLiteral( "dialog-cancel" ) ), tr( "&Cancel" ), m_widget );
m_quit->setObjectName( "view-button-cancel" );
CALAMARES_RETRANSLATE_SLOT( &ViewManager::updateButtonLabels )

View File

@ -5,7 +5,7 @@
#
# Translators:
# Rodrigo de Almeida Sottomaior Macedo <rmsolucoeseminformatic4@gmail.com>, 2017
# Guilherme Marçal Silva <guimarcalsilva@gmail.com>, 2018
# Guilherme <guimarcalsilva@gmail.com>, 2018
#
#, 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: 2016-12-16 12:18+0000\n"
"Last-Translator: Guilherme Marçal Silva <guimarcalsilva@gmail.com>, 2018\n"
"Last-Translator: Guilherme <guimarcalsilva@gmail.com>, 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"

View File

@ -32,12 +32,12 @@
PasswordCheck::PasswordCheck()
: m_message()
, m_accept( []( const QString& ){ return true; } )
, m_accept( []( const QString& ) { return true; } )
{
}
PasswordCheck::PasswordCheck( const QString& m, AcceptFunc a )
: m_message( [m](){ return m; } )
: m_message( [m]() { return m; } )
, m_accept( a )
{
}
@ -52,21 +52,14 @@ DEFINE_CHECK_FUNC( minLength )
{
int minLength = -1;
if ( value.canConvert( QVariant::Int ) )
{
minLength = value.toInt();
}
if ( minLength > 0 )
{
cDebug() << Logger::SubEntry << "minLength set to" << minLength;
checks.push_back(
PasswordCheck(
[]()
{
return QCoreApplication::translate( "PWQ", "Password is too short" );
},
[minLength]( const QString& s )
{
return s.length() >= minLength;
}
) );
checks.push_back( PasswordCheck( []() { return QCoreApplication::translate( "PWQ", "Password is too short" ); },
[minLength]( const QString& s ) { return s.length() >= minLength; } ) );
}
}
@ -74,21 +67,14 @@ DEFINE_CHECK_FUNC( maxLength )
{
int maxLength = -1;
if ( value.canConvert( QVariant::Int ) )
{
maxLength = value.toInt();
}
if ( maxLength > 0 )
{
cDebug() << Logger::SubEntry << "maxLength set to" << maxLength;
checks.push_back(
PasswordCheck(
[]()
{
return QCoreApplication::translate("PWQ", "Password is too long" );
},
[maxLength]( const QString& s )
{
return s.length() <= maxLength;
}
) );
checks.push_back( PasswordCheck( []() { return QCoreApplication::translate( "PWQ", "Password is too long" ); },
[maxLength]( const QString& s ) { return s.length() <= maxLength; } ) );
}
}
@ -101,15 +87,17 @@ DEFINE_CHECK_FUNC( maxLength )
*/
/// @brief Handle libpwquality using void* to represent a long
static inline long mungeLong( void* p )
static inline long
mungeLong( void* p )
{
return static_cast<long>( reinterpret_cast<intptr_t>( p ) );
return static_cast< long >( reinterpret_cast< intptr_t >( p ) );
}
/// @brief Handle libpwquality using void* to represent a char*
static inline const char* mungeString( void* p )
static inline const char*
mungeString( void* p )
{
return reinterpret_cast<const char*>( p );
return reinterpret_cast< const char* >( p );
}
/**
@ -128,16 +116,10 @@ public:
{
}
~PWSettingsHolder()
{
pwquality_free_settings( m_settings );
}
~PWSettingsHolder() { pwquality_free_settings( m_settings ); }
/// Sets an option via the configuration string @p v, <key>=<value> style.
int set( const QString& v )
{
return pwquality_set_option( m_settings, v.toUtf8().constData() );
}
int set( const QString& v ) { return pwquality_set_option( m_settings, v.toUtf8().constData() ); }
/// Checks the given password @p pwd against the current configuration
int check( const QString& pwd )
@ -148,10 +130,7 @@ public:
return r;
}
bool hasExplanation() const
{
return m_rv < 0;
}
bool hasExplanation() const { return m_rv < 0; }
/* This is roughly the same as the function pwquality_strerror,
* only with QStrings instead, and using the Qt translation scheme.
@ -164,16 +143,21 @@ public:
m_auxerror = nullptr;
if ( m_rv >= arbitrary_minimum_strength )
{
return QString();
}
if ( m_rv >= 0 )
return QCoreApplication::translate( "PWQ", "Password is too weak" );
{
return QCoreApplication::translate( "PWQ", "Password is too weak" );
}
switch ( m_rv )
{
case PWQ_ERROR_MEM_ALLOC:
if ( auxerror )
{
QString s = QCoreApplication::translate( "PWQ", "Memory allocation error when setting '%1'" ).arg( mungeString( auxerror ) );
QString s = QCoreApplication::translate( "PWQ", "Memory allocation error when setting '%1'" )
.arg( mungeString( auxerror ) );
free( auxerror );
return s;
}
@ -189,58 +173,94 @@ public:
case PWQ_ERROR_USER_CHECK:
return QCoreApplication::translate( "PWQ", "The password contains the user name in some form" );
case PWQ_ERROR_GECOS_CHECK:
return QCoreApplication::translate( "PWQ", "The password contains words from the real name of the user in some form" );
return QCoreApplication::translate(
"PWQ", "The password contains words from the real name of the user in some form" );
case PWQ_ERROR_BAD_WORDS:
return QCoreApplication::translate( "PWQ", "The password contains forbidden words in some form" );
case PWQ_ERROR_MIN_DIGITS:
if ( auxerror )
return QCoreApplication::translate( "PWQ", "The password contains less than %1 digits" ).arg( mungeLong( auxerror ) );
{
return QCoreApplication::translate( "PWQ", "The password contains less than %1 digits" )
.arg( mungeLong( auxerror ) );
}
return QCoreApplication::translate( "PWQ", "The password contains too few digits" );
case PWQ_ERROR_MIN_UPPERS:
if ( auxerror )
return QCoreApplication::translate( "PWQ", "The password contains less than %1 uppercase letters" ).arg( mungeLong( auxerror ) );
{
return QCoreApplication::translate( "PWQ", "The password contains less than %1 uppercase letters" )
.arg( mungeLong( auxerror ) );
}
return QCoreApplication::translate( "PWQ", "The password contains too few uppercase letters" );
case PWQ_ERROR_MIN_LOWERS:
if ( auxerror )
return QCoreApplication::translate( "PWQ", "The password contains less than %1 lowercase letters" ).arg( mungeLong( auxerror ) );
{
return QCoreApplication::translate( "PWQ", "The password contains less than %1 lowercase letters" )
.arg( mungeLong( auxerror ) );
}
return QCoreApplication::translate( "PWQ", "The password contains too few lowercase letters" );
case PWQ_ERROR_MIN_OTHERS:
if ( auxerror )
return QCoreApplication::translate( "PWQ", "The password contains less than %1 non-alphanumeric characters" ).arg( mungeLong( auxerror ) );
{
return QCoreApplication::translate( "PWQ",
"The password contains less than %1 non-alphanumeric characters" )
.arg( mungeLong( auxerror ) );
}
return QCoreApplication::translate( "PWQ", "The password contains too few non-alphanumeric characters" );
case PWQ_ERROR_MIN_LENGTH:
if ( auxerror )
return QCoreApplication::translate( "PWQ", "The password is shorter than %1 characters" ).arg( mungeLong( auxerror ) );
{
return QCoreApplication::translate( "PWQ", "The password is shorter than %1 characters" )
.arg( mungeLong( auxerror ) );
}
return QCoreApplication::translate( "PWQ", "The password is too short" );
case PWQ_ERROR_ROTATED:
return QCoreApplication::translate( "PWQ", "The password is just rotated old one" );
case PWQ_ERROR_MIN_CLASSES:
if ( auxerror )
return QCoreApplication::translate( "PWQ", "The password contains less than %1 character classes" ).arg( mungeLong( auxerror ) );
{
return QCoreApplication::translate( "PWQ", "The password contains less than %1 character classes" )
.arg( mungeLong( auxerror ) );
}
return QCoreApplication::translate( "PWQ", "The password does not contain enough character classes" );
case PWQ_ERROR_MAX_CONSECUTIVE:
if ( auxerror )
return QCoreApplication::translate( "PWQ", "The password contains more than %1 same characters consecutively" ).arg( mungeLong( auxerror ) );
{
return QCoreApplication::translate( "PWQ",
"The password contains more than %1 same characters consecutively" )
.arg( mungeLong( auxerror ) );
}
return QCoreApplication::translate( "PWQ", "The password contains too many same characters consecutively" );
case PWQ_ERROR_MAX_CLASS_REPEAT:
if ( auxerror )
return QCoreApplication::translate( "PWQ", "The password contains more than %1 characters of the same class consecutively" ).arg( mungeLong( auxerror ) );
return QCoreApplication::translate( "PWQ", "The password contains too many characters of the same class consecutively" );
{
return QCoreApplication::translate(
"PWQ", "The password contains more than %1 characters of the same class consecutively" )
.arg( mungeLong( auxerror ) );
}
return QCoreApplication::translate(
"PWQ", "The password contains too many characters of the same class consecutively" );
case PWQ_ERROR_MAX_SEQUENCE:
if ( auxerror )
return QCoreApplication::translate( "PWQ", "The password contains monotonic sequence longer than %1 characters" ).arg( mungeLong( auxerror ) );
return QCoreApplication::translate( "PWQ", "The password contains too long of a monotonic character sequence" );
{
return QCoreApplication::translate(
"PWQ", "The password contains monotonic sequence longer than %1 characters" )
.arg( mungeLong( auxerror ) );
}
return QCoreApplication::translate( "PWQ",
"The password contains too long of a monotonic character sequence" );
case PWQ_ERROR_EMPTY_PASSWORD:
return QCoreApplication::translate( "PWQ", "No password supplied" );
case PWQ_ERROR_RNG:
return QCoreApplication::translate( "PWQ", "Cannot obtain random numbers from the RNG device" );
case PWQ_ERROR_GENERATION_FAILED:
return QCoreApplication::translate( "PWQ", "Password generation failed - required entropy too low for settings" );
return QCoreApplication::translate( "PWQ",
"Password generation failed - required entropy too low for settings" );
case PWQ_ERROR_CRACKLIB_CHECK:
if ( auxerror )
{
/* Here the string comes from cracklib, don't free? */
return QCoreApplication::translate( "PWQ", "The password fails the dictionary check - %1" ).arg( mungeString( auxerror ) );
return QCoreApplication::translate( "PWQ", "The password fails the dictionary check - %1" )
.arg( mungeString( auxerror ) );
}
return QCoreApplication::translate( "PWQ", "The password fails the dictionary check" );
case PWQ_ERROR_UNKNOWN_SETTING:
@ -254,7 +274,8 @@ public:
case PWQ_ERROR_INTEGER:
if ( auxerror )
{
QString s = QCoreApplication::translate( "PWQ", "Bad integer value of setting - %1" ).arg( mungeString( auxerror ) );
QString s = QCoreApplication::translate( "PWQ", "Bad integer value of setting - %1" )
.arg( mungeString( auxerror ) );
free( auxerror );
return s;
}
@ -262,7 +283,8 @@ public:
case PWQ_ERROR_NON_INT_SETTING:
if ( auxerror )
{
QString s = QCoreApplication::translate( "PWQ", "Setting %1 is not of integer type" ).arg( mungeString( auxerror ) );
QString s = QCoreApplication::translate( "PWQ", "Setting %1 is not of integer type" )
.arg( mungeString( auxerror ) );
free( auxerror );
return s;
}
@ -270,7 +292,8 @@ public:
case PWQ_ERROR_NON_STR_SETTING:
if ( auxerror )
{
QString s = QCoreApplication::translate( "PWQ", "Setting %1 is not of string type" ).arg( mungeString( auxerror ) );
QString s = QCoreApplication::translate( "PWQ", "Setting %1 is not of string type" )
.arg( mungeString( auxerror ) );
free( auxerror );
return s;
}
@ -290,7 +313,7 @@ private:
pwquality_settings_t* m_settings;
int m_rv;
void* m_auxerror;
} ;
};
DEFINE_CHECK_FUNC( libpwquality )
{
@ -302,7 +325,7 @@ DEFINE_CHECK_FUNC( libpwquality )
QVariantList l = value.toList();
unsigned int requirement_count = 0;
auto settings = std::make_shared<PWSettingsHolder>();
auto settings = std::make_shared< PWSettingsHolder >();
for ( const auto& v : l )
{
if ( v.type() == QVariant::String )
@ -310,7 +333,9 @@ DEFINE_CHECK_FUNC( libpwquality )
QString option = v.toString();
int r = settings->set( option );
if ( r )
{
cWarning() << "unrecognized libpwquality setting" << option;
}
else
{
cDebug() << Logger::SubEntry << "libpwquality setting" << option;
@ -318,28 +343,27 @@ DEFINE_CHECK_FUNC( libpwquality )
}
}
else
{
cWarning() << "unrecognized libpwquality setting" << v;
}
}
/* Something actually added? */
if ( requirement_count )
{
checks.push_back(
PasswordCheck(
[settings]()
{
return settings->explanation();
},
[settings]( const QString& s )
{
int r = settings->check( s );
if ( r < 0 )
cWarning() << "libpwquality error" << r;
else if ( r < settings->arbitrary_minimum_strength )
cDebug() << "Password strength" << r << "too low";
return r >= settings->arbitrary_minimum_strength;
}
) );
checks.push_back( PasswordCheck( [settings]() { return settings->explanation(); },
[settings]( const QString& s ) {
int r = settings->check( s );
if ( r < 0 )
{
cWarning() << "libpwquality error" << r;
}
else if ( r < settings->arbitrary_minimum_strength )
{
cDebug() << "Password strength" << r << "too low";
}
return r >= settings->arbitrary_minimum_strength;
} ) );
}
}
#endif

View File

@ -35,8 +35,8 @@ class PasswordCheck
{
public:
/** Return true if the string is acceptable. */
using AcceptFunc = std::function<bool( const QString& )>;
using MessageFunc = std::function<QString()>;
using AcceptFunc = std::function< bool( const QString& ) >;
using MessageFunc = std::function< QString() >;
/** Generate a @p message if @p filter returns true */
PasswordCheck( MessageFunc message, AcceptFunc filter );
@ -50,17 +50,14 @@ public:
* according to this filter. Returns a message describing
* what is wrong if not.
*/
QString filter( const QString& s ) const
{
return m_accept( s ) ? QString() : m_message();
}
QString filter( const QString& s ) const { return m_accept( s ) ? QString() : m_message(); }
private:
MessageFunc m_message;
AcceptFunc m_accept;
} ;
};
using PasswordCheckList = QVector<PasswordCheck>;
using PasswordCheckList = QVector< PasswordCheck >;
/* Each of these functions adds a check (if possible) to the list
* of checks; they use the configuration value(s) from the
@ -68,16 +65,14 @@ using PasswordCheckList = QVector<PasswordCheck>;
* may skip adding a check, and do nothing (it should log
* an error, though).
*/
#define _xDEFINE_CHECK_FUNC(x) \
add_check_##x( PasswordCheckList& checks, const QVariant& value )
#define DEFINE_CHECK_FUNC(x) void _xDEFINE_CHECK_FUNC(x)
#define DECLARE_CHECK_FUNC(x) void _xDEFINE_CHECK_FUNC(x);
#define _xDEFINE_CHECK_FUNC( x ) add_check_##x( PasswordCheckList& checks, const QVariant& value )
#define DEFINE_CHECK_FUNC( x ) void _xDEFINE_CHECK_FUNC( x )
#define DECLARE_CHECK_FUNC( x ) void _xDEFINE_CHECK_FUNC( x );
DECLARE_CHECK_FUNC(minLength)
DECLARE_CHECK_FUNC(maxLength)
DECLARE_CHECK_FUNC( minLength )
DECLARE_CHECK_FUNC( maxLength )
#ifdef HAVE_LIBPWQUALITY
DECLARE_CHECK_FUNC(libpwquality)
DECLARE_CHECK_FUNC( libpwquality )
#endif
#endif

View File

@ -19,10 +19,10 @@
#include <CreateUserJob.h>
#include "JobQueue.h"
#include "GlobalStorage.h"
#include "utils/Logger.h"
#include "JobQueue.h"
#include "utils/CalamaresUtilsSystem.h"
#include "utils/Logger.h"
#include <QDateTime>
#include <QDir>
@ -72,17 +72,20 @@ CreateUserJob::exec()
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
QDir destDir( gs->value( "rootMountPoint" ).toString() );
if ( gs->contains( "sudoersGroup" ) &&
!gs->value( "sudoersGroup" ).toString().isEmpty() )
if ( gs->contains( "sudoersGroup" ) && !gs->value( "sudoersGroup" ).toString().isEmpty() )
{
QFileInfo sudoersFi( destDir.absoluteFilePath( "etc/sudoers.d/10-installer" ) );
if ( !sudoersFi.absoluteDir().exists() )
{
return Calamares::JobResult::error( tr( "Sudoers dir is not writable." ) );
}
QFile sudoersFile( sudoersFi.absoluteFilePath() );
if (!sudoersFile.open( QIODevice::WriteOnly | QIODevice::Text ) )
if ( !sudoersFile.open( QIODevice::WriteOnly | QIODevice::Text ) )
{
return Calamares::JobResult::error( tr( "Cannot create sudoers file for writing." ) );
}
QString sudoersGroup = gs->value( "sudoersGroup" ).toString();
@ -96,11 +99,12 @@ CreateUserJob::exec()
QFileInfo groupsFi( destDir.absoluteFilePath( "etc/group" ) );
QFile groupsFile( groupsFi.absoluteFilePath() );
if ( !groupsFile.open( QIODevice::ReadOnly | QIODevice::Text ) )
{
return Calamares::JobResult::error( tr( "Cannot open groups file for reading." ) );
}
QString groupsData = QString::fromLocal8Bit( groupsFile.readAll() );
QStringList groupsLines = groupsData.split( '\n' );
for ( QStringList::iterator it = groupsLines.begin();
it != groupsLines.end(); ++it )
for ( QStringList::iterator it = groupsLines.begin(); it != groupsLines.end(); ++it )
{
int indexOfFirstToDrop = it->indexOf( ':' );
it->truncate( indexOfFirstToDrop );
@ -108,15 +112,13 @@ CreateUserJob::exec()
foreach ( const QString& group, m_defaultGroups )
if ( !groupsLines.contains( group ) )
CalamaresUtils::System::instance()->
targetEnvCall( { "groupadd", group } );
CalamaresUtils::System::instance()->targetEnvCall( { "groupadd", group } );
QString defaultGroups = m_defaultGroups.join( ',' );
if ( m_autologin )
{
QString autologinGroup;
if ( gs->contains( "autologinGroup" ) &&
!gs->value( "autologinGroup" ).toString().isEmpty() )
if ( gs->contains( "autologinGroup" ) && !gs->value( "autologinGroup" ).toString().isEmpty() )
{
autologinGroup = gs->value( "autologinGroup" ).toString();
CalamaresUtils::System::instance()->targetEnvCall( { "groupadd", autologinGroup } );
@ -131,26 +133,20 @@ CreateUserJob::exec()
QDir existingHome( destDir.absolutePath() + shellFriendlyHome );
if ( existingHome.exists() )
{
QString backupDirName = "dotfiles_backup_" +
QDateTime::currentDateTime()
.toString( "yyyy-MM-dd_HH-mm-ss" );
QString backupDirName = "dotfiles_backup_" + QDateTime::currentDateTime().toString( "yyyy-MM-dd_HH-mm-ss" );
existingHome.mkdir( backupDirName );
CalamaresUtils::System::instance()->
targetEnvCall( { "sh",
"-c",
"mv -f " +
shellFriendlyHome + "/.* " +
shellFriendlyHome + "/" +
backupDirName
} );
CalamaresUtils::System::instance()->targetEnvCall(
{ "sh", "-c", "mv -f " + shellFriendlyHome + "/.* " + shellFriendlyHome + "/" + backupDirName } );
}
}
QStringList useradd{ "useradd", "-m", "-U" };
QStringList useradd { "useradd", "-m", "-U" };
QString shell = gs->value( "userShell" ).toString();
if ( !shell.isEmpty() )
{
useradd << "-s" << shell;
}
useradd << "-c" << m_fullName;
useradd << m_userName;
@ -161,8 +157,8 @@ CreateUserJob::exec()
return commandResult.explainProcess( useradd, std::chrono::seconds( 10 ) /* bogus timeout */ );
}
commandResult = CalamaresUtils::System::instance()->targetEnvCommand(
{ "usermod", "-aG", defaultGroups, m_userName } );
commandResult
= CalamaresUtils::System::instance()->targetEnvCommand( { "usermod", "-aG", defaultGroups, m_userName } );
if ( commandResult.getExitCode() )
{
cError() << "usermod failed" << commandResult.getExitCode();
@ -171,8 +167,7 @@ CreateUserJob::exec()
QString userGroup = QString( "%1:%2" ).arg( m_userName ).arg( m_userName );
QString homeDir = QString( "/home/%1" ).arg( m_userName );
commandResult = CalamaresUtils::System::instance()->targetEnvCommand(
{ "chown", "-R", userGroup, homeDir } );
commandResult = CalamaresUtils::System::instance()->targetEnvCommand( { "chown", "-R", userGroup, homeDir } );
if ( commandResult.getExitCode() )
{
cError() << "chown failed" << commandResult.getExitCode();

View File

@ -27,10 +27,7 @@ class CreateUserJob : public Calamares::Job
{
Q_OBJECT
public:
CreateUserJob( const QString& userName,
const QString& fullName,
bool autologin,
const QStringList& defaultGroups );
CreateUserJob( const QString& userName, const QString& fullName, bool autologin, const QStringList& defaultGroups );
QString prettyName() const override;
QString prettyDescription() const override;
QString prettyStatusMessage() const override;

View File

@ -24,13 +24,9 @@
QTEST_GUILESS_MAIN( PasswordTests )
PasswordTests::PasswordTests()
{
}
PasswordTests::PasswordTests() {}
PasswordTests::~PasswordTests()
{
}
PasswordTests::~PasswordTests() {}
void
PasswordTests::initTestCase()
@ -41,7 +37,7 @@ void
PasswordTests::testSalt()
{
QString s = SetPasswordJob::make_salt( 8 );
QCOMPARE( s.length(), 4 + 8 ); // 8 salt chars, plus $6$, plus trailing $
QCOMPARE( s.length(), 4 + 8 ); // 8 salt chars, plus $6$, plus trailing $
QVERIFY( s.startsWith( "$6$" ) );
QVERIFY( s.endsWith( '$' ) );
qDebug() << "Obtained salt" << s;

View File

@ -21,11 +21,11 @@
#include "SetHostNameJob.h"
#include "GlobalStorage.h"
#include "utils/Logger.h"
#include "JobQueue.h"
#include "utils/Logger.h"
#include <QFile>
#include <QDir>
#include <QFile>
SetHostNameJob::SetHostNameJob( const QString& hostname )
: Calamares::Job()
@ -33,7 +33,8 @@ SetHostNameJob::SetHostNameJob( const QString& hostname )
{
}
QString SetHostNameJob::prettyName() const
QString
SetHostNameJob::prettyName() const
{
return tr( "Set hostname %1" ).arg( m_hostname );
}
@ -52,7 +53,8 @@ SetHostNameJob::prettyStatusMessage() const
return tr( "Setting hostname %1." ).arg( m_hostname );
}
Calamares::JobResult SetHostNameJob::exec()
Calamares::JobResult
SetHostNameJob::exec()
{
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
@ -90,11 +92,21 @@ Calamares::JobResult SetHostNameJob::exec()
// We also need to write the appropriate entries for /etc/hosts
QTextStream hostsfileout( &hostsfile );
// ipv4 support
hostsfileout << "127.0.0.1" << "\t" << "localhost" << "\n";
hostsfileout << "127.0.1.1" << "\t" << m_hostname << "\n";
hostsfileout << "127.0.0.1"
<< "\t"
<< "localhost"
<< "\n";
hostsfileout << "127.0.1.1"
<< "\t" << m_hostname << "\n";
// ipv6 support
hostsfileout << "::1" << "\t" << "localhost ip6-localhost ip6-loopback" << "\n";
hostsfileout << "ff02::1 ip6-allnodes" << "\n" << "ff02::2 ip6-allrouters" << "\n";
hostsfileout << "::1"
<< "\t"
<< "localhost ip6-localhost ip6-loopback"
<< "\n";
hostsfileout << "ff02::1 ip6-allnodes"
<< "\n"
<< "ff02::2 ip6-allrouters"
<< "\n";
hostsfile.close();
return Calamares::JobResult::ok();

View File

@ -31,9 +31,10 @@ public:
QString prettyDescription() const override;
QString prettyStatusMessage() const override;
Calamares::JobResult exec() override;
private:
const QString m_hostname;
};
#endif // SETHOSTNAMEJOB_CPP_H
#endif // SETHOSTNAMEJOB_CPP_H

View File

@ -19,10 +19,10 @@
#include <SetPasswordJob.h>
#include "JobQueue.h"
#include "GlobalStorage.h"
#include "utils/Logger.h"
#include "JobQueue.h"
#include "utils/CalamaresUtilsSystem.h"
#include "utils/Logger.h"
#include <QDir>
@ -58,29 +58,27 @@ SetPasswordJob::prettyStatusMessage() const
/// Returns a modular hashing salt for method 6 (SHA512) with a 16 character random salt.
QString
SetPasswordJob::make_salt(int length)
SetPasswordJob::make_salt( int length )
{
Q_ASSERT(length >= 8);
Q_ASSERT(length <= 128);
Q_ASSERT( length >= 8 );
Q_ASSERT( length <= 128 );
static const char salt_chars[] = {
'.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
static const char salt_chars[] = { '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
static_assert( sizeof(salt_chars) == 64, "Missing salt_chars");
static_assert( sizeof( salt_chars ) == 64, "Missing salt_chars" );
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937_64 twister(seed);
std::seed_seq seed { r(), r(), r(), r(), r(), r(), r(), r() };
std::mt19937_64 twister( seed );
std::uint64_t next;
int current_length = 0;
QString salt_string;
salt_string.reserve(length + 10);
salt_string.reserve( length + 10 );
while ( current_length < length )
{
@ -89,11 +87,13 @@ SetPasswordJob::make_salt(int length)
// to a single salt character.
for ( unsigned int char_count = 0; char_count < 10; ++char_count )
{
char c = salt_chars[next & 0b0111111];
char c = salt_chars[ next & 0b0111111 ];
next >>= 6;
salt_string.append( c );
if (++current_length >= length)
if ( ++current_length >= length )
{
break;
}
}
}
@ -112,34 +112,21 @@ SetPasswordJob::exec()
return Calamares::JobResult::error( tr( "Bad destination system path." ),
tr( "rootMountPoint is %1" ).arg( destDir.absolutePath() ) );
if ( m_userName == "root" &&
m_newPassword.isEmpty() ) //special case for disabling root account
if ( m_userName == "root" && m_newPassword.isEmpty() ) //special case for disabling root account
{
int ec = CalamaresUtils::System::instance()->
targetEnvCall( { "passwd",
"-dl",
m_userName } );
int ec = CalamaresUtils::System::instance()->targetEnvCall( { "passwd", "-dl", m_userName } );
if ( ec )
return Calamares::JobResult::error( tr( "Cannot disable root account." ),
tr( "passwd terminated with error code %1." )
.arg( ec ) );
tr( "passwd terminated with error code %1." ).arg( ec ) );
return Calamares::JobResult::ok();
}
QString encrypted = QString::fromLatin1(
crypt( m_newPassword.toUtf8(),
make_salt( 16 ).toUtf8() ) );
QString encrypted = QString::fromLatin1( crypt( m_newPassword.toUtf8(), make_salt( 16 ).toUtf8() ) );
int ec = CalamaresUtils::System::instance()->
targetEnvCall( { "usermod",
"-p",
encrypted,
m_userName } );
int ec = CalamaresUtils::System::instance()->targetEnvCall( { "usermod", "-p", encrypted, m_userName } );
if ( ec )
return Calamares::JobResult::error( tr( "Cannot set password for user %1." )
.arg( m_userName ),
tr( "usermod terminated with error code %1." )
.arg( ec ) );
return Calamares::JobResult::error( tr( "Cannot set password for user %1." ).arg( m_userName ),
tr( "usermod terminated with error code %1." ).arg( ec ) );
return Calamares::JobResult::ok();
}

View File

@ -27,13 +27,12 @@ class SetPasswordJob : public Calamares::Job
{
Q_OBJECT
public:
SetPasswordJob( const QString& userName,
const QString& newPassword );
SetPasswordJob( const QString& userName, const QString& newPassword );
QString prettyName() const override;
QString prettyStatusMessage() const override;
Calamares::JobResult exec() override;
static QString make_salt(int length);
static QString make_salt( int length );
private:
QString m_userName;

View File

@ -27,8 +27,8 @@
#include "ui_page_usersetup.h"
#include "CreateUserJob.h"
#include "SetPasswordJob.h"
#include "SetHostNameJob.h"
#include "SetPasswordJob.h"
#include "GlobalStorage.h"
#include "JobQueue.h"
@ -45,12 +45,28 @@
#include <QRegExp>
#include <QRegExpValidator>
static const QRegExp USERNAME_RX( "^[a-z_][a-z0-9_-]*[$]?$" );
static const QRegExp HOSTNAME_RX( "^[a-zA-Z0-9][-a-zA-Z0-9_]*$" );
static constexpr const int USERNAME_MAX_LENGTH = 31;
static constexpr const int HOSTNAME_MIN_LENGTH = 2;
static constexpr const int HOSTNAME_MAX_LENGTH = 63;
/** @brief How bad is the error for labelError() ? */
enum class Badness
{
Fatal,
Warning
};
/** Add an error message and pixmap to a label. */
static inline void
labelError( QLabel* pix, QLabel* label, const QString& message )
labelError( QLabel* pix, QLabel* label, const QString& message, Badness bad = Badness::Fatal )
{
label->setText( message );
pix->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::No, CalamaresUtils::Original, label->size() ) );
pix->setPixmap( CalamaresUtils::defaultPixmap( ( bad == Badness::Fatal ) ? CalamaresUtils::StatusError
: CalamaresUtils::StatusWarning,
CalamaresUtils::Original,
label->size() ) );
}
/** Clear error, indicate OK on a label. */
@ -74,25 +90,20 @@ UsersPage::UsersPage( QWidget* parent )
ui->setupUi( this );
// Connect signals and slots
connect( ui->textBoxFullName, &QLineEdit::textEdited,
this, &UsersPage::onFullNameTextEdited );
connect( ui->textBoxUsername, &QLineEdit::textEdited,
this, &UsersPage::onUsernameTextEdited );
connect( ui->textBoxHostname, &QLineEdit::textEdited,
this, &UsersPage::onHostnameTextEdited );
connect( ui->textBoxUserPassword, &QLineEdit::textChanged,
this, &UsersPage::onPasswordTextChanged );
connect( ui->textBoxUserVerifiedPassword, &QLineEdit::textChanged,
this, &UsersPage::onPasswordTextChanged );
connect( ui->textBoxRootPassword, &QLineEdit::textChanged,
this, &UsersPage::onRootPasswordTextChanged );
connect( ui->textBoxVerifiedRootPassword, &QLineEdit::textChanged,
this, &UsersPage::onRootPasswordTextChanged );
connect( ui->checkBoxReusePassword, &QCheckBox::stateChanged,
this, [this]( int checked )
{
connect( ui->textBoxFullName, &QLineEdit::textEdited, this, &UsersPage::onFullNameTextEdited );
connect( ui->textBoxUsername, &QLineEdit::textEdited, this, &UsersPage::onUsernameTextEdited );
connect( ui->textBoxHostname, &QLineEdit::textEdited, this, &UsersPage::onHostnameTextEdited );
connect( ui->textBoxUserPassword, &QLineEdit::textChanged, this, &UsersPage::onPasswordTextChanged );
connect( ui->textBoxUserVerifiedPassword, &QLineEdit::textChanged, this, &UsersPage::onPasswordTextChanged );
connect( ui->textBoxRootPassword, &QLineEdit::textChanged, this, &UsersPage::onRootPasswordTextChanged );
connect( ui->textBoxVerifiedRootPassword, &QLineEdit::textChanged, this, &UsersPage::onRootPasswordTextChanged );
connect( ui->checkBoxValidatePassword, &QCheckBox::stateChanged, this, [this]( int checked ) {
onPasswordTextChanged( ui->textBoxUserPassword->text() );
onRootPasswordTextChanged( ui->textBoxRootPassword->text() );
checkReady( isReady() );
} );
connect( ui->checkBoxReusePassword, &QCheckBox::stateChanged, this, [this]( int checked ) {
ui->labelChooseRootPassword->setVisible( !checked );
ui->labelExtraRootPassword->setVisible( !checked );
ui->labelRootPassword->setVisible( !checked );
ui->labelRootPasswordError->setVisible( !checked );
ui->textBoxRootPassword->setVisible( !checked );
@ -105,47 +116,45 @@ UsersPage::UsersPage( QWidget* parent )
setWriteRootPassword( true );
ui->checkBoxReusePassword->setChecked( true );
ui->checkBoxValidatePassword->setChecked( true );
// Don't expand the explanations to "stupid wide", but keep them vaguely as-wide-as
// the things they are explaining.
int boxWidth = qMax( qMax( ui->textBoxUsername->width(), ui->textBoxHostname->width() ), ui->textBoxUserPassword->width() );
ui->username_extra_label_2->setMaximumWidth( 3 * boxWidth );
ui->hostname_extra_label_2->setMaximumWidth( 3 * boxWidth );
ui->password_extra_label_3->setMaximumWidth( 3 * boxWidth );
setPasswordCheckboxVisible( false );
CALAMARES_RETRANSLATE(
ui->retranslateUi( this );
if ( Calamares::Settings::instance()->isSetupMode() )
{
ui->username_extra_label_2->setText( tr( "<small>If more than one person will "
"use this computer, you can create multiple "
"accounts after setup.</small>" ) );
}
else
{
ui->username_extra_label_2->setText( tr( "<small>If more than one person will "
"use this computer, you can create multiple "
"accounts after installation.</small>" ) );
}
)
CALAMARES_RETRANSLATE_SLOT( &UsersPage::retranslate );
}
UsersPage::~UsersPage()
{
delete ui;
}
void
UsersPage::retranslate()
{
ui->retranslateUi( this );
if ( Calamares::Settings::instance()->isSetupMode() )
{
ui->textBoxUsername->setToolTip( tr( "<small>If more than one person will "
"use this computer, you can create multiple "
"accounts after setup.</small>" ) );
}
else
{
ui->textBoxUsername->setToolTip( tr( "<small>If more than one person will "
"use this computer, you can create multiple "
"accounts after installation.</small>" ) );
}
}
bool
UsersPage::isReady()
{
bool readyFields = m_readyFullName &&
m_readyHostname &&
m_readyPassword &&
m_readyUsername;
bool readyFields = m_readyFullName && m_readyHostname && m_readyPassword && m_readyUsername;
if ( !m_writeRootPassword || ui->checkBoxReusePassword->isChecked() )
{
return readyFields;
}
return readyFields && m_readyRootPassword;
}
@ -156,38 +165,40 @@ UsersPage::createJobs( const QStringList& defaultGroupsList )
{
QList< Calamares::job_ptr > list;
if ( !isReady() )
{
return list;
}
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
Calamares::Job* j;
j = new CreateUserJob( ui->textBoxUsername->text(),
ui->textBoxFullName->text().isEmpty() ?
ui->textBoxUsername->text() :
ui->textBoxFullName->text(),
ui->textBoxFullName->text().isEmpty() ? ui->textBoxUsername->text()
: ui->textBoxFullName->text(),
ui->checkBoxAutoLogin->isChecked(),
defaultGroupsList );
list.append( Calamares::job_ptr( j ) );
j = new SetPasswordJob( ui->textBoxUsername->text(),
ui->textBoxUserPassword->text() );
j = new SetPasswordJob( ui->textBoxUsername->text(), ui->textBoxUserPassword->text() );
list.append( Calamares::job_ptr( j ) );
if ( m_writeRootPassword )
{
gs->insert( "reuseRootPassword", ui->checkBoxReusePassword->isChecked() );
if ( ui->checkBoxReusePassword->isChecked() )
j = new SetPasswordJob( "root",
ui->textBoxUserPassword->text() );
{
j = new SetPasswordJob( "root", ui->textBoxUserPassword->text() );
}
else
j = new SetPasswordJob( "root",
ui->textBoxRootPassword->text() );
{
j = new SetPasswordJob( "root", ui->textBoxRootPassword->text() );
}
list.append( Calamares::job_ptr( j ) );
}
else
{
j = new SetPasswordJob( "root",
"" ); //explicitly disable root password
"" ); //explicitly disable root password
list.append( Calamares::job_ptr( j ) );
}
@ -196,7 +207,9 @@ UsersPage::createJobs( const QStringList& defaultGroupsList )
gs->insert( "hostname", ui->textBoxHostname->text() );
if ( ui->checkBoxAutoLogin->isChecked() )
{
gs->insert( "autologinUser", ui->textBoxUsername->text() );
}
gs->insert( "username", ui->textBoxUsername->text() );
gs->insert( "password", CalamaresUtils::obscure( ui->textBoxUserPassword->text() ) );
@ -228,16 +241,19 @@ UsersPage::onFullNameTextEdited( const QString& textRef )
ui->labelFullNameError->clear();
ui->labelFullName->clear();
if ( !m_customUsername )
{
ui->textBoxUsername->clear();
}
if ( !m_customHostname )
{
ui->textBoxHostname->clear();
}
m_readyFullName = false;
}
else
{
ui->labelFullName->setPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::Yes,
CalamaresUtils::Original,
ui->labelFullName->size() ) );
ui->labelFullName->setPixmap(
CalamaresUtils::defaultPixmap( CalamaresUtils::Yes, CalamaresUtils::Original, ui->labelFullName->size() ) );
m_readyFullName = true;
fillSuggestions();
}
@ -250,8 +266,7 @@ UsersPage::fillSuggestions()
{
QString fullName = ui->textBoxFullName->text();
QRegExp rx( "[^a-zA-Z0-9 ]", Qt::CaseInsensitive );
QString cleanName = CalamaresUtils::removeDiacritics( fullName )
.toLower().replace( rx, " " ).simplified();
QString cleanName = CalamaresUtils::removeDiacritics( fullName ).toLower().replace( rx, " " ).simplified();
QStringList cleanParts = cleanName.split( ' ' );
if ( !m_customUsername )
@ -262,7 +277,9 @@ UsersPage::fillSuggestions()
for ( int i = 1; i < cleanParts.length(); ++i )
{
if ( !cleanParts.value( i ).isEmpty() )
{
usernameSuggestion.append( cleanParts.value( i ).at( 0 ) );
}
}
if ( USERNAME_RX.indexIn( usernameSuggestion ) != -1 )
{
@ -301,8 +318,8 @@ void
UsersPage::validateUsernameText( const QString& textRef )
{
QString text( textRef );
QRegExp rx( USERNAME_RX );
QRegExpValidator val( rx );
QRegExpValidator val_whole( USERNAME_RX );
QRegExpValidator val_start( QRegExp( "[a-z_].*" ) ); // anchors are implicit in QRegExpValidator
int pos = -1;
if ( text.isEmpty() )
@ -313,14 +330,21 @@ UsersPage::validateUsernameText( const QString& textRef )
}
else if ( text.length() > USERNAME_MAX_LENGTH )
{
labelError( ui->labelUsername, ui->labelUsernameError,
tr( "Your username is too long." ) );
labelError( ui->labelUsername, ui->labelUsernameError, tr( "Your username is too long." ) );
m_readyUsername = false;
}
else if ( val.validate( text, pos ) == QValidator::Invalid )
else if ( val_start.validate( text, pos ) == QValidator::Invalid )
{
labelError( ui->labelUsername, ui->labelUsernameError,
tr( "Your username contains invalid characters. Only lowercase letters and numbers are allowed." ) );
labelError( ui->labelUsername,
ui->labelUsernameError,
tr( "Your username must start with a lowercase letter or underscore." ) );
m_readyUsername = false;
}
else if ( val_whole.validate( text, pos ) == QValidator::Invalid )
{
labelError( ui->labelUsername,
ui->labelUsernameError,
tr( "Only lowercase letters, numbers, underscore and hyphen are allowed." ) );
m_readyUsername = false;
}
else
@ -345,32 +369,30 @@ void
UsersPage::validateHostnameText( const QString& textRef )
{
QString text = textRef;
QRegExp rx( HOSTNAME_RX );
QRegExpValidator val( rx );
QRegExpValidator val( HOSTNAME_RX );
int pos = -1;
if ( text.isEmpty() )
{
ui->labelHostnameError->clear();
ui->labelHostname->clear();
m_readyHostname= false;
m_readyHostname = false;
}
else if ( text.length() < HOSTNAME_MIN_LENGTH )
{
labelError( ui->labelHostname, ui->labelHostnameError,
tr( "Your hostname is too short." ) );
labelError( ui->labelHostname, ui->labelHostnameError, tr( "Your hostname is too short." ) );
m_readyHostname = false;
}
else if ( text.length() > HOSTNAME_MAX_LENGTH )
{
labelError( ui->labelHostname, ui->labelHostnameError,
tr( "Your hostname is too long." ) );
labelError( ui->labelHostname, ui->labelHostnameError, tr( "Your hostname is too long." ) );
m_readyHostname = false;
}
else if ( val.validate( text, pos ) == QValidator::Invalid )
{
labelError( ui->labelHostname, ui->labelHostnameError,
tr( "Your hostname contains invalid characters. Only letters, numbers and dashes are allowed." ) );
labelError( ui->labelHostname,
ui->labelHostnameError,
tr( "Only letters, numbers, underscore and hyphen are allowed." ) );
m_readyHostname = false;
}
else
@ -382,46 +404,59 @@ UsersPage::validateHostnameText( const QString& textRef )
emit checkReady( isReady() );
}
void
UsersPage::onPasswordTextChanged( const QString& )
bool
UsersPage::checkPasswordAcceptance( const QString& pw1, const QString& pw2, QLabel* badge, QLabel* message )
{
QString pw1 = ui->textBoxUserPassword->text();
QString pw2 = ui->textBoxUserVerifiedPassword->text();
// TODO: 3.3: remove empty-check and leave it to passwordRequirements
if ( pw1.isEmpty() && pw2.isEmpty() )
{
ui->labelUserPasswordError->clear();
ui->labelUserPassword->clear();
m_readyPassword = false;
// Not exactly labelOk() because we also don't want a checkmark OK
badge->clear();
message->clear();
return false;
}
else if ( pw1 != pw2 )
{
labelError( ui->labelUserPassword, ui->labelUserPasswordError,
tr( "Your passwords do not match!" ) );
m_readyPassword = false;
labelError( badge, message, tr( "Your passwords do not match!" ) );
return false;
}
else
{
bool ok = true;
bool failureIsFatal = ui->checkBoxValidatePassword->isChecked();
bool failureFound = false;
for ( auto pc : m_passwordChecks )
{
QString s = pc.filter( pw1 );
if ( !s.isEmpty() )
{
labelError( ui->labelUserPassword, ui->labelUserPasswordError, s );
ok = false;
m_readyPassword = false;
break;
labelError( badge, message, s, failureIsFatal ? Badness::Fatal : Badness::Warning );
failureFound = true;
if ( failureIsFatal )
{
return false;
}
}
}
if ( ok )
if ( !failureFound )
{
labelOk( ui->labelUserPassword, ui->labelUserPasswordError );
m_readyPassword = true;
labelOk( badge, message );
}
// Here, if failureFound is true then we've found **warnings**,
// which is ok to continue but the user should know.
return true;
}
}
void
UsersPage::onPasswordTextChanged( const QString& )
{
m_readyPassword = checkPasswordAcceptance( ui->textBoxUserPassword->text(),
ui->textBoxUserVerifiedPassword->text(),
ui->labelUserPassword,
ui->labelUserPasswordError );
emit checkReady( isReady() );
}
@ -429,48 +464,27 @@ UsersPage::onPasswordTextChanged( const QString& )
void
UsersPage::onRootPasswordTextChanged( const QString& )
{
QString pw1 = ui->textBoxRootPassword->text();
QString pw2 = ui->textBoxVerifiedRootPassword->text();
// TODO: 3.3: remove empty-check and leave it to passwordRequirements
if ( pw1.isEmpty() && pw2.isEmpty() )
{
ui->labelRootPasswordError->clear();
ui->labelRootPassword->clear();
m_readyRootPassword = false;
}
else if ( pw1 != pw2 )
{
labelError( ui->labelRootPassword, ui->labelRootPasswordError,
tr( "Your passwords do not match!" ) );
m_readyRootPassword = false;
}
else
{
bool ok = true;
for ( auto pc : m_passwordChecks )
{
QString s = pc.filter( pw1 );
if ( !s.isEmpty() )
{
labelError( ui->labelRootPassword, ui->labelRootPasswordError, s );
ok = false;
m_readyRootPassword = false;
break;
}
}
if ( ok )
{
labelOk( ui->labelRootPassword, ui->labelRootPasswordError );
m_readyRootPassword = true;
}
}
m_readyRootPassword = checkPasswordAcceptance( ui->textBoxRootPassword->text(),
ui->textBoxVerifiedRootPassword->text(),
ui->labelRootPassword,
ui->labelRootPasswordError );
emit checkReady( isReady() );
}
void
UsersPage::setPasswordCheckboxVisible( bool visible )
{
ui->checkBoxValidatePassword->setVisible( visible );
}
void
UsersPage::setValidatePasswordDefault( bool checked )
{
ui->checkBoxValidatePassword->setChecked( checked );
emit checkReady( isReady() );
}
void
UsersPage::setAutologinDefault( bool checked )
{
@ -501,7 +515,9 @@ UsersPage::addPasswordCheck( const QString& key, const QVariant& value )
{
add_check_libpwquality( m_passwordChecks, value );
}
#endif
#endif // CHECK_PWQUALITY
else
{
cWarning() << "Unknown password-check key" << key;
}
}

View File

@ -29,6 +29,8 @@
#include <QWidget>
class QLabel;
namespace Ui
{
class Page_UserSetup;
@ -48,6 +50,8 @@ public:
void onActivate();
void setWriteRootPassword( bool show );
void setPasswordCheckboxVisible( bool visible );
void setValidatePasswordDefault( bool checked );
void setAutologinDefault( bool checked );
void setReusePasswordDefault( bool checked );
@ -73,16 +77,20 @@ signals:
void checkReady( bool );
private:
/** @brief Is the password acceptable?
*
* Checks the two copies of the password and places error messages in the
* given QLabels. Returns true (and clears the error messages) if the
* password is acceptable.
*/
bool checkPasswordAcceptance( const QString& pw1, const QString& pw2, QLabel* badge, QLabel* message );
void retranslate();
Ui::Page_UserSetup* ui;
PasswordCheckList m_passwordChecks;
const QRegExp USERNAME_RX = QRegExp( "^[a-z_][a-z0-9_-]*[$]?$" );
const QRegExp HOSTNAME_RX = QRegExp( "^[a-zA-Z0-9][-a-zA-Z0-9_]*$" );
const int USERNAME_MAX_LENGTH = 31;
const int HOSTNAME_MIN_LENGTH = 2;
const int HOSTNAME_MAX_LENGTH = 63;
bool m_readyFullName;
bool m_readyUsername;
bool m_customUsername;
@ -94,4 +102,4 @@ private:
bool m_writeRootPassword;
};
#endif // USERSPAGE_H
#endif // USERSPAGE_H

View File

@ -29,22 +29,23 @@
#include "GlobalStorage.h"
#include "JobQueue.h"
CALAMARES_PLUGIN_FACTORY_DEFINITION( UsersViewStepFactory, registerPlugin<UsersViewStep>(); )
CALAMARES_PLUGIN_FACTORY_DEFINITION( UsersViewStepFactory, registerPlugin< UsersViewStep >(); )
UsersViewStep::UsersViewStep( QObject* parent )
: Calamares::ViewStep( parent )
, m_widget( new UsersPage() )
{
emit nextStatusChanged( true );
connect( m_widget, &UsersPage::checkReady,
this, &UsersViewStep::nextStatusChanged );
connect( m_widget, &UsersPage::checkReady, this, &UsersViewStep::nextStatusChanged );
}
UsersViewStep::~UsersViewStep()
{
if ( m_widget && m_widget->parent() == nullptr )
{
m_widget->deleteLater();
}
}
@ -116,68 +117,71 @@ UsersViewStep::onLeave()
void
UsersViewStep::setConfigurationMap( const QVariantMap& configurationMap )
{
if ( configurationMap.contains( "defaultGroups" ) &&
configurationMap.value( "defaultGroups" ).type() == QVariant::List )
if ( configurationMap.contains( "defaultGroups" )
&& configurationMap.value( "defaultGroups" ).type() == QVariant::List )
{
m_defaultGroups = configurationMap.value( "defaultGroups" ).toStringList();
}
else
{
cWarning() << "Using fallback groups. Please check defaultGroups in users.conf";
m_defaultGroups = QStringList{ "lp", "video", "network", "storage", "wheel", "audio" };
m_defaultGroups = QStringList { "lp", "video", "network", "storage", "wheel", "audio" };
}
if ( configurationMap.contains( "autologinGroup" ) &&
configurationMap.value( "autologinGroup" ).type() == QVariant::String )
if ( configurationMap.contains( "autologinGroup" )
&& configurationMap.value( "autologinGroup" ).type() == QVariant::String )
{
Calamares::JobQueue::instance()->globalStorage()->insert( "autologinGroup",
configurationMap.value( "autologinGroup" ).toString() );
Calamares::JobQueue::instance()->globalStorage()->insert(
"autologinGroup", configurationMap.value( "autologinGroup" ).toString() );
}
if ( configurationMap.contains( "sudoersGroup" ) &&
configurationMap.value( "sudoersGroup" ).type() == QVariant::String )
if ( configurationMap.contains( "sudoersGroup" )
&& configurationMap.value( "sudoersGroup" ).type() == QVariant::String )
{
Calamares::JobQueue::instance()->globalStorage()->insert( "sudoersGroup",
configurationMap.value( "sudoersGroup" ).toString() );
configurationMap.value( "sudoersGroup" ).toString() );
}
if ( configurationMap.contains( "setRootPassword" ) &&
configurationMap.value( "setRootPassword" ).type() == QVariant::Bool )
if ( configurationMap.contains( "setRootPassword" )
&& configurationMap.value( "setRootPassword" ).type() == QVariant::Bool )
{
Calamares::JobQueue::instance()->globalStorage()->insert( "setRootPassword",
configurationMap.value( "setRootPassword" ).toBool() );
Calamares::JobQueue::instance()->globalStorage()->insert(
"setRootPassword", configurationMap.value( "setRootPassword" ).toBool() );
m_widget->setWriteRootPassword( configurationMap.value( "setRootPassword" ).toBool() );
}
if ( configurationMap.contains( "doAutologin" ) &&
configurationMap.value( "doAutologin" ).type() == QVariant::Bool )
if ( configurationMap.contains( "doAutologin" )
&& configurationMap.value( "doAutologin" ).type() == QVariant::Bool )
{
m_widget->setAutologinDefault( configurationMap.value( "doAutologin" ).toBool() );
}
if ( configurationMap.contains( "doReusePassword" ) &&
configurationMap.value( "doReusePassword" ).type() == QVariant::Bool )
if ( configurationMap.contains( "doReusePassword" )
&& configurationMap.value( "doReusePassword" ).type() == QVariant::Bool )
{
m_widget->setReusePasswordDefault( configurationMap.value( "doReusePassword" ).toBool() );
}
if ( configurationMap.contains( "passwordRequirements" ) &&
configurationMap.value( "passwordRequirements" ).type() == QVariant::Map )
if ( configurationMap.contains( "passwordRequirements" )
&& configurationMap.value( "passwordRequirements" ).type() == QVariant::Map )
{
auto pr_checks( configurationMap.value( "passwordRequirements" ).toMap() );
for (decltype(pr_checks)::const_iterator i = pr_checks.constBegin();
i != pr_checks.constEnd(); ++i)
for ( decltype( pr_checks )::const_iterator i = pr_checks.constBegin(); i != pr_checks.constEnd(); ++i )
{
m_widget->addPasswordCheck( i.key(), i.value() );
}
}
m_widget->setPasswordCheckboxVisible( CalamaresUtils::getBool( configurationMap, "allowWeakPasswords", false ) );
m_widget->setValidatePasswordDefault( !CalamaresUtils::getBool( configurationMap, "allowWeakPasswordsDefault", false) );
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
}
// Now it might be explicitly set to empty, which is ok
Calamares::JobQueue::instance()->globalStorage()->insert( "userShell", shell );
}

View File

@ -65,4 +65,4 @@ private:
CALAMARES_PLUGIN_FACTORY_DECLARATION( UsersViewStepFactory )
#endif // USERSPAGEPLUGIN_H
#endif // USERSPAGEPLUGIN_H

View File

@ -47,6 +47,9 @@
<height>0</height>
</size>
</property>
<property name="placeholderText">
<string>Your Full Name</string>
</property>
</widget>
</item>
<item>
@ -137,6 +140,9 @@
<height>0</height>
</size>
</property>
<property name="placeholderText">
<string>login</string>
</property>
</widget>
</item>
<item>
@ -191,19 +197,6 @@
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="username_extra_label_2">
<property name="styleSheet">
<string notr="true">font-weight: normal</string>
</property>
<property name="text">
<string notr="true">&lt;Username extra label 2 text&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
@ -246,6 +239,12 @@
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;small&gt;This name will be used if you make the computer visible to others on a network.&lt;/small&gt;</string>
</property>
<property name="placeholderText">
<string>Computer Name</string>
</property>
</widget>
</item>
<item>
@ -300,19 +299,6 @@
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="hostname_extra_label_2">
<property name="styleSheet">
<string notr="true">font-weight: normal</string>
</property>
<property name="text">
<string>&lt;small&gt;This name will be used if you make the computer visible to others on a network.&lt;/small&gt;</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
@ -355,9 +341,15 @@
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;small&gt;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.&lt;/small&gt;</string>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
<property name="placeholderText">
<string>Password</string>
</property>
</widget>
</item>
<item>
@ -374,9 +366,15 @@
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;small&gt;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.&lt;/small&gt;</string>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
<property name="placeholderText">
<string>Repeat Password</string>
</property>
</widget>
</item>
<item>
@ -431,19 +429,6 @@
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="password_extra_label_3">
<property name="styleSheet">
<string notr="true">font-weight: normal</string>
</property>
<property name="text">
<string>&lt;small&gt;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.&lt;/small&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_5">
<property name="orientation">
@ -460,6 +445,16 @@
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkBoxValidatePassword">
<property name="toolTip">
<string>When this box is checked, password-strength checking is done and you will not be able to use a weak password.</string>
</property>
<property name="text">
<string>Require strong passwords.</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxAutoLogin">
<property name="text">
@ -516,9 +511,15 @@
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;small&gt;Enter the same password twice, so that it can be checked for typing errors.&lt;/small&gt;</string>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
<property name="placeholderText">
<string>Password</string>
</property>
</widget>
</item>
<item>
@ -535,9 +536,15 @@
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;small&gt;Enter the same password twice, so that it can be checked for typing errors.&lt;/small&gt;</string>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
<property name="placeholderText">
<string>Repeat Password</string>
</property>
</widget>
</item>
<item>
@ -592,19 +599,6 @@
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="labelExtraRootPassword">
<property name="styleSheet">
<string notr="true">font-weight: normal</string>
</property>
<property name="text">
<string>&lt;small&gt;Enter the same password twice, so that it can be checked for typing errors.&lt;/small&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_7">
<property name="orientation">

View File

@ -27,26 +27,34 @@ defaultGroups:
# the desktop environment on boot.
# Disable when your Distribution does not require such a group.
autologinGroup: autologin
# You can control the initial state for the 'autologin checkbox' in UsersViewStep here.
# Possible values are: true to enable or false to disable the checkbox by default
# You can control the initial state for the 'autologin checkbox' here.
# Possible values are:
# - true to check or
# - false to uncheck
# These set the **initial** state of the checkbox.
doAutologin: true
# When set to a non-empty string, Calamares creates a sudoers file for the user.
# /etc/sudoers.d/10-installer
# Remember to add sudoersGroup to defaultGroups.
# When *sudoersGroup* is set to a non-empty string, Calamares creates a
# sudoers file for the user. This file is located at:
# `/etc/sudoers.d/10-installer`
# Remember to add the (value of) *sudoersGroup* to *defaultGroups*.
#
# If your Distribution already sets up a group of sudoers in its packaging,
# remove this setting (delete or comment out the line below). Otherwise,
# the setting will be duplicated in the /etc/sudoers.d/10-installer file,
# the setting will be duplicated in the `/etc/sudoers.d/10-installer` file,
# potentially confusing users.
sudoersGroup: wheel
# Setting this to false , causes the root account to be disabled.
setRootPassword: true
# You can control the initial state for the 'root password checkbox' in UsersViewStep here.
# Possible values are: true to enable or false to disable the checkbox by default.
# When enabled the user password is used for the root account too.
# NOTE: doReusePassword requires setRootPassword to be enabled.
# You can control the initial state for the 'reuse password for root'
# checkbox here. Possible values are:
# - true to check or
# - false to uncheck
#
# When checked, the user password is used for the root account too.
#
# NOTE: *doReusePassword* requires *setRootPassword* to be enabled.
doReusePassword: true
# These are optional password-requirements that a distro can enforce
@ -68,6 +76,13 @@ doReusePassword: true
#
# (additional checks may be implemented in CheckPWQuality.cpp and
# wired into UsersPage.cpp)
#
# - To disable specific password validations:
# comment out the relevant 'passwordRequirements' keys below.
# - To disable all password validations:
# set both 'allowWeakPasswords' and 'allowWeakPasswordsDefault' to true.
# (That will show the box *Allow weak passwords* in the user-
# interface, and check it by default).
passwordRequirements:
minLength: -1 # Password at least this many characters
maxLength: -1 # Password at most this many characters
@ -75,6 +90,23 @@ passwordRequirements:
- minlen=0
- minclass=0
# You can control the visibility of the 'strong passwords' checkbox here.
# Possible values are:
# - true to show or
# - false to hide (default)
# the checkbox. This checkbox allows the user to choose to disable
# password-strength-checks. By default the box is **hidden**, so
# that you have to pick a password that satisfies the checks.
allowWeakPasswords: false
# You can control the initial state for the 'strong passwords' checkbox here.
# Possible values are:
# - true to uncheck or
# - false to check (default)
# the checkbox by default. Since the box is labeled to enforce strong
# passwords, in order to **allow** weak ones by default, the box needs
# to be unchecked.
allowWeakPasswordsDefault: false
# Shell to be used for the regular user of the target system.
# There are three possible kinds of settings:
# - unset (i.e. commented out, the default), act as if set to /bin/bash