diff --git a/CHANGES-3.2 b/CHANGES-3.2 index 52342e95b932cfd59c2f724b94749433c669ceb9..cf02ff29d3a8ad1a8445244c69a0731d45c28cc7 100644 --- a/CHANGES-3.2 +++ b/CHANGES-3.2 @@ -7,22 +7,55 @@ 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.50 (unreleased) # +# 3.2.51 (unreleased) # This release contains contributions from (alphabetically by first name): + - No external contributors yet + +## Core ## + - No core changes yet + +## Modules ## + - The *umount* module has been re-written in C++. The copy-a-log-file + functionality has been removed. Use the *preservefiles* module for that. + + +# 3.2.50 (2022-01-18) # + +This release contains contributions from (alphabetically by first name): + - Anke Boersma - Erik Dubois + - Evan James + - Johannes Kamprad + - Taejun Park (new contributor, welcome!) + +**Replacement notice:** The *umount* module will be replaced by a C++ +implementation in the next release. The "preserve log file" feature +will be removed in that release. Use the *preservefiles* module instead. ## Core ## - No core changes yet ## Modules ## + - *initcpiocfg* mentioned a special kernel-name "all", which did not work, + and a special kernel-name "$uname" which cannot work. Fixed the former + and removed the "$uname" special key. (Thanks Evan) + - *luksswaphookcfg* has been converted to a C++ module. - *networkcfg* could fail to update the NetworkManager configuration if the SSID or username contained non-ASCII characters **and** the default Python text-file encoding was set to ASCII. The files are now read and written in UTF-8, explicitly. #1848 + - *partition* always sets *bigtime* option on XFS filesystems, if possible. + Requires sufficiently-recent xfsprogs. #1874 - *preservefiles* was missing some necessary features, needed for it to replace the deprecated log-file-saving functionality in the *umount* module. (Thanks Erik and Joe for testing) #1851 + - *umount* is now marked as an emergency module in the example configuration, + since it should **probably** be run as a cleanup. (Thanks Evan) + - *welcome* and *locale* could be confusing, together, and configure + the target system with a language that does not match the installer + language, even though the user did not make any explicit choice. + (Thanks Taejun) #1864 # 3.2.49.1 (2021-12-11) # diff --git a/CMakeLists.txt b/CMakeLists.txt index c8b233f5025a5723d79b44236cdd5697335f4c02..aec04f315713bf66f841a36833ffeb903a05f61a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,7 @@ # TODO:3.3: Require CMake 3.12 cmake_minimum_required( VERSION 3.3 FATAL_ERROR ) project( CALAMARES - VERSION 3.2.50 + VERSION 3.2.51 LANGUAGES C CXX ) diff --git a/ci/RELEASE.sh b/ci/RELEASE.sh index f09285fb7b66b22ce5624deaf2a98bd94f32fa09..e46ca2cc2ab2245719054bfb15772d74f18312ec 100755 --- a/ci/RELEASE.sh +++ b/ci/RELEASE.sh @@ -75,7 +75,7 @@ fi # # BUILDDIR=$(mktemp -d --suffix=-build --tmpdir=.) -KEY_ID="CFDDC96F12B1915C" +KEY_ID="328D742D8807A435" # Try to make gpg cache the signing key, so we can leave the process # to run and sign. diff --git a/lang/calamares_cs_CZ.ts b/lang/calamares_cs_CZ.ts index 4525d74189c53e580eda759d08f715bf22a841d1..b61f36b81b903509ec7e7ded4518d39d149af50f 100644 --- a/lang/calamares_cs_CZ.ts +++ b/lang/calamares_cs_CZ.ts @@ -693,27 +693,27 @@ Instalační program bude ukončen a všechny změny ztraceny.</translation> <message> <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="259"/> <source>Successfully unmounted %1.</source> - <translation type="unfinished"/> + <translation>Úspěšně odpojeno %1.</translation> </message> <message> <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="266"/> <source>Successfully disabled swap %1.</source> - <translation type="unfinished"/> + <translation>Úspěšně vypnut swap %1.</translation> </message> <message> <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="292"/> <source>Successfully cleared swap %1.</source> - <translation type="unfinished"/> + <translation>Úspěšně vyčištěn swap %1.</translation> </message> <message> <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="306"/> <source>Successfully closed mapper device %1.</source> - <translation type="unfinished"/> + <translation>Úspěšně zavřeno mapper zařízení %1.</translation> </message> <message> <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="319"/> <source>Successfully disabled volume group %1.</source> - <translation type="unfinished"/> + <translation>Úspěšně vypnuta skupina svazků %1.</translation> </message> <message> <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="358"/> diff --git a/lang/calamares_ja-Hira.ts b/lang/calamares_ja-Hira.ts new file mode 100644 index 0000000000000000000000000000000000000000..ce8d59bf4f2a168831a4ce09396a8b6e8a7fa2a5 --- /dev/null +++ b/lang/calamares_ja-Hira.ts @@ -0,0 +1,4366 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS language="ja-Hira" version="2.1"> + <context> + <name>AutoMountManagementJob</name> + <message> + <location filename="../src/modules/partition/jobs/AutoMountManagementJob.cpp" line="22"/> + <source>Manage auto-mount settings</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>BootInfoWidget</name> + <message> + <location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="62"/> + <source>The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="72"/> + <source>This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="84"/> + <source>This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>BootLoaderModel</name> + <message> + <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="59"/> + <source>Master Boot Record of %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="92"/> + <source>Boot Partition</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="99"/> + <source>System Partition</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="129"/> + <source>Do not install a boot loader</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="147"/> + <source>%1 (%2)</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Calamares::BlankViewStep</name> + <message> + <location filename="../src/libcalamaresui/viewpages/BlankViewStep.cpp" line="61"/> + <source>Blank Page</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Calamares::DebugWindow</name> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="18"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="28"/> + <source>GlobalStorage</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="38"/> + <source>JobQueue</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="48"/> + <source>Modules</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="61"/> + <source>Type:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="68"/> + <location filename="../src/calamares/DebugWindow.ui" line="82"/> + <source>none</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="75"/> + <source>Interface:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="102"/> + <source>Crashes Calamares, so that Dr. Konqui can look at it.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="115"/> + <source>Reloads the stylesheet from the branding directory.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="141"/> + <source>Uploads the session log to the configured pastebin.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="144"/> + <source>Send Session Log</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="118"/> + <source>Reload Stylesheet</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="128"/> + <source>Displays the tree of widget names in the log (for stylesheet debugging).</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.ui" line="131"/> + <source>Widget Tree</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/DebugWindow.cpp" line="221"/> + <source>Debug information</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Calamares::ExecutionViewStep</name> + <message> + <location filename="../src/libcalamaresui/viewpages/ExecutionViewStep.cpp" line="88"/> + <source>Set up</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/viewpages/ExecutionViewStep.cpp" line="88"/> + <source>Install</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Calamares::FailJob</name> + <message> + <location filename="../src/libcalamares/JobExample.cpp" line="29"/> + <source>Job failed (%1)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/JobExample.cpp" line="30"/> + <source>Programmed job failure was explicitly requested.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Calamares::JobThread</name> + <message> + <location filename="../src/libcalamares/JobQueue.cpp" line="201"/> + <source>Done</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Calamares::NamedJob</name> + <message> + <location filename="../src/libcalamares/JobExample.cpp" line="17"/> + <source>Example job (%1)</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Calamares::ProcessJob</name> + <message> + <location filename="../src/libcalamares/ProcessJob.cpp" line="43"/> + <source>Run command '%1' in target system.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/ProcessJob.cpp" line="43"/> + <source> Run command '%1'.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/ProcessJob.cpp" line="50"/> + <source>Running command %1 %2</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Calamares::PythonJob</name> + <message> + <location filename="../src/libcalamares/PythonJob.cpp" line="194"/> + <source>Running %1 operation.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/PythonJob.cpp" line="223"/> + <source>Bad working directory path</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/PythonJob.cpp" line="224"/> + <source>Working directory %1 for python job %2 is not readable.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/PythonJob.cpp" line="230"/> + <source>Bad main script file</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/PythonJob.cpp" line="231"/> + <source>Main script file %1 for python job %2 is not readable.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/PythonJob.cpp" line="304"/> + <source>Boost.Python error in job "%1".</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Calamares::QmlViewStep</name> + <message> + <location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="67"/> + <source>Loading ...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="88"/> + <source>QML Step <i>%1</i>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="268"/> + <source>Loading failed.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Calamares::RequirementsChecker</name> + <message> + <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="94"/> + <source>Requirements checking for module <i>%1</i> is complete.</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="115"/> + <source>Waiting for %n module(s).</source> + <translation type="unfinished"> + <numerusform/> + </translation> + </message> + <message numerus="yes"> + <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="116"/> + <source>(%n second(s))</source> + <translation type="unfinished"> + <numerusform/> + </translation> + </message> + <message> + <location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="121"/> + <source>System-requirements checking is complete.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Calamares::ViewManager</name> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="162"/> + <source>Setup Failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="162"/> + <source>Installation Failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="163"/> + <source>Would you like to paste the install log to the web?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="179"/> + <source>Error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="88"/> + <source>&Yes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="89"/> + <source>&No</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="90"/> + <source>&Close</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/utils/Paste.cpp" line="183"/> + <source>Install Log Paste URL</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/utils/Paste.cpp" line="165"/> + <source>The upload was unsuccessful. No web-paste was done.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/utils/Paste.cpp" line="177"/> + <source>Install log posted to + +%1 + +Link copied to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="211"/> + <source>Calamares Initialization Failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="212"/> + <source>%1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="218"/> + <source><br/>The following modules could not be loaded:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="332"/> + <source>Continue with setup?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="332"/> + <source>Continue with installation?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="334"/> + <source>The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="337"/> + <source>The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="340"/> + <source>&Set up now</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="340"/> + <source>&Install now</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="348"/> + <source>Go &back</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="398"/> + <source>&Set up</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="398"/> + <source>&Install</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="400"/> + <source>Setup is complete. Close the setup program.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="401"/> + <source>The installation is complete. Close the installer.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="403"/> + <source>Cancel setup without changing the system.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="404"/> + <source>Cancel installation without changing the system.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="414"/> + <source>&Next</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="419"/> + <source>&Back</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="425"/> + <source>&Done</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="444"/> + <source>&Cancel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="517"/> + <source>Cancel setup?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="517"/> + <source>Cancel installation?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="518"/> + <source>Do you really want to cancel the current setup process? +The setup program will quit and all changes will be lost.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/ViewManager.cpp" line="520"/> + <source>Do you really want to cancel the current install process? +The installer will quit and all changes will be lost.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>CalamaresPython::Helper</name> + <message> + <location filename="../src/libcalamares/PythonHelper.cpp" line="294"/> + <source>Unknown exception type</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/PythonHelper.cpp" line="312"/> + <source>unparseable Python error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/PythonHelper.cpp" line="356"/> + <source>unparseable Python traceback</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/PythonHelper.cpp" line="363"/> + <source>Unfetchable Python error.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>CalamaresWindow</name> + <message> + <location filename="../src/calamares/CalamaresWindow.cpp" line="370"/> + <source>%1 Setup Program</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/CalamaresWindow.cpp" line="371"/> + <source>%1 Installer</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ChangeFilesystemLabelJob</name> + <message> + <location filename="../src/modules/partition/jobs/ChangeFilesystemLabelJob.cpp" line="32"/> + <source>Set filesystem label on %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ChangeFilesystemLabelJob.cpp" line="39"/> + <source>Set filesystem label <strong>%1</strong> to partition <strong>%2</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ChangeFilesystemLabelJob.cpp" line="70"/> + <source>The installer failed to update partition table on disk '%1'.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>CheckerContainer</name> + <message> + <location filename="../src/modules/welcome/checker/CheckerContainer.cpp" line="38"/> + <source>Gathering system information...</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ChoicePage</name> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.ui" line="18"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="139"/> + <source>Select storage de&vice:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="140"/> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="996"/> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1042"/> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1133"/> + <source>Current:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="141"/> + <source>After:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1671"/> + <source><strong>Manual partitioning</strong><br/>You can create or resize partitions yourself.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="861"/> + <source>Reuse %1 as home partition for %2.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="997"/> + <source><strong>Select a partition to shrink, then drag the bottom bar to resize</strong></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1014"/> + <source>%1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1071"/> + <source>Boot loader location:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1124"/> + <source><strong>Select a partition to install on</strong></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1183"/> + <source>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1191"/> + <source>The EFI system partition at %1 will be used for starting %2.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1199"/> + <source>EFI system partition:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1334"/> + <source>This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1339"/> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1376"/> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1398"/> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1423"/> + <source><strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1343"/> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1372"/> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1394"/> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1419"/> + <source><strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1347"/> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1381"/> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1402"/> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1427"/> + <source><strong>Replace a partition</strong><br/>Replaces a partition with %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1366"/> + <source>This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1389"/> + <source>This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1414"/> + <source>This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1486"/> + <source>This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1509"/> + <source>This storage device has one of its partitions <strong>mounted</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1514"/> + <source>This storage device is a part of an <strong>inactive RAID</strong> device.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1641"/> + <source>No Swap</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1649"/> + <source>Reuse Swap</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1652"/> + <source>Swap (no Hibernate)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1655"/> + <source>Swap (with Hibernate)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1658"/> + <source>Swap to file</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ClearMountsJob</name> + <message> + <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="259"/> + <source>Successfully unmounted %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="266"/> + <source>Successfully disabled swap %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="292"/> + <source>Successfully cleared swap %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="306"/> + <source>Successfully closed mapper device %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="319"/> + <source>Successfully disabled volume group %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="358"/> + <source>Clear mounts for partitioning operations on %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="364"/> + <source>Clearing mounts for partitioning operations on %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="383"/> + <source>Cleared all mounts for %1</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ClearTempMountsJob</name> + <message> + <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="32"/> + <source>Clear all temporary mounts.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="39"/> + <source>Clearing all temporary mounts.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="52"/> + <source>Cannot get list of temporary mounts.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="97"/> + <source>Cleared all temporary mounts.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>CommandList</name> + <message> + <location filename="../src/libcalamares/utils/CommandList.cpp" line="142"/> + <location filename="../src/libcalamares/utils/CommandList.cpp" line="155"/> + <source>Could not run command.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CommandList.cpp" line="143"/> + <source>The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CommandList.cpp" line="156"/> + <source>The command needs to know the user's name, but no username is defined.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Config</name> + <message> + <location filename="../src/modules/keyboard/Config.cpp" line="354"/> + <source>Set keyboard model to %1.<br/></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/keyboard/Config.cpp" line="361"/> + <source>Set keyboard layout to %1/%2.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/Config.cpp" line="342"/> + <source>Set timezone to %1/%2.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/Config.cpp" line="380"/> + <source>The system language will be set to %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/Config.cpp" line="387"/> + <source>The numbers and dates locale will be set to %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/Config.cpp" line="53"/> + <source>Network Installation. (Disabled: Incorrect configuration)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/Config.cpp" line="55"/> + <source>Network Installation. (Disabled: Received invalid groups data)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/Config.cpp" line="57"/> + <source>Network Installation. (Disabled: Internal error)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/Config.cpp" line="61"/> + <source>Network Installation. (Disabled: No package list)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/Config.cpp" line="77"/> + <source>Package selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/Config.cpp" line="59"/> + <source>Network Installation. (Disabled: Unable to fetch package lists, check your network connection)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/Config.cpp" line="55"/> + <source>This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/Config.cpp" line="59"/> + <source>This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/Config.cpp" line="66"/> + <source>This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/Config.cpp" line="70"/> + <source>This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/Config.cpp" line="80"/> + <source>This program will ask you some questions and set up %2 on your computer.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/Config.cpp" line="250"/> + <source><h1>Welcome to the Calamares setup program for %1</h1></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/Config.cpp" line="251"/> + <source><h1>Welcome to %1 setup</h1></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/Config.cpp" line="255"/> + <source><h1>Welcome to the Calamares installer for %1</h1></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/Config.cpp" line="256"/> + <source><h1>Welcome to the %1 installer</h1></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/Config.cpp" line="217"/> + <source>Your username is too long.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/Config.cpp" line="223"/> + <source>'%1' is not allowed as username.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/Config.cpp" line="230"/> + <source>Your username must start with a lowercase letter or underscore.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/Config.cpp" line="234"/> + <source>Only lowercase letters, numbers, underscore and hyphen are allowed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/Config.cpp" line="279"/> + <source>Your hostname is too short.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/Config.cpp" line="283"/> + <source>Your hostname is too long.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/Config.cpp" line="289"/> + <source>'%1' is not allowed as hostname.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/Config.cpp" line="295"/> + <source>Only letters, numbers, underscore and hyphen are allowed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/Config.cpp" line="534"/> + <source>Your passwords do not match!</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/Config.cpp" line="548"/> + <source>OK!</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/Config.cpp" line="145"/> + <source>Setup Failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/Config.cpp" line="145"/> + <source>Installation Failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/Config.cpp" line="147"/> + <source>The setup of %1 did not complete successfully.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/Config.cpp" line="148"/> + <source>The installation of %1 did not complete successfully.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/Config.cpp" line="152"/> + <source>Setup Complete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/Config.cpp" line="153"/> + <source>Installation Complete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/Config.cpp" line="154"/> + <source>The setup of %1 is complete.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/Config.cpp" line="155"/> + <source>The installation of %1 is complete.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooser/Config.cpp" line="86"/> + <source>Package Selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooser/Config.cpp" line="88"/> + <source>Please pick a product from the list. The selected product will be installed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooser/Config.cpp" line="177"/> + <source>Install option: <strong>%1</strong></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooser/Config.cpp" line="177"/> + <source>None</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/summary/Config.cpp" line="94"/> + <source>Summary</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/summary/Config.cpp" line="98"/> + <source>This is an overview of what will happen once you start the setup procedure.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/summary/Config.cpp" line="103"/> + <source>This is an overview of what will happen once you start the install procedure.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ContextualProcessJob</name> + <message> + <location filename="../src/modules/contextualprocess/ContextualProcessJob.cpp" line="119"/> + <source>Contextual Processes Job</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>CreatePartitionDialog</name> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="18"/> + <source>Create a Partition</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="42"/> + <source>Si&ze:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="52"/> + <source> MiB</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="59"/> + <source>Partition &Type:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="71"/> + <source>&Primary</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="81"/> + <source>E&xtended</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="123"/> + <source>Fi&le System:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="155"/> + <source>LVM LV name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="165"/> + <source>&Mount Point:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="192"/> + <source>Flags:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="231"/> + <source>Label for the filesystem</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.ui" line="241"/> + <source>FS Label:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="65"/> + <source>En&crypt</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="191"/> + <source>Logical</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="196"/> + <source>Primary</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="215"/> + <source>GPT</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionDialog.cpp" line="301"/> + <source>Mountpoint already in use. Please select another one.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>CreatePartitionJob</name> + <message> + <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="113"/> + <source>Create new %1MiB partition on %3 (%2) with entries %4.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="121"/> + <source>Create new %1MiB partition on %3 (%2).</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="128"/> + <source>Create new %2MiB partition on %4 (%3) with file system %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="145"/> + <source>Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="154"/> + <source>Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2).</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="161"/> + <source>Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="186"/> + <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="189"/> + <source>Creating new %1 partition on %2.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="201"/> + <source>The installer failed to create partition on disk '%1'.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>CreatePartitionTableDialog</name> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="24"/> + <source>Create Partition Table</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="43"/> + <source>Creating a new partition table will delete all existing data on the disk.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="69"/> + <source>What kind of partition table do you want to create?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="76"/> + <source>Master Boot Record (MBR)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="86"/> + <source>GUID Partition Table (GPT)</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>CreatePartitionTableJob</name> + <message> + <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="39"/> + <source>Create new %1 partition table on %2.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="47"/> + <source>Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3).</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="57"/> + <source>Creating new %1 partition table on %2.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="67"/> + <source>The installer failed to create a partition table on %1.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>CreateUserJob</name> + <message> + <location filename="../src/modules/users/CreateUserJob.cpp" line="36"/> + <source>Create user %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CreateUserJob.cpp" line="43"/> + <source>Create user <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CreateUserJob.cpp" line="126"/> + <source>Preserving home directory</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CreateUserJob.cpp" line="50"/> + <location filename="../src/modules/users/CreateUserJob.cpp" line="143"/> + <source>Creating user %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CreateUserJob.cpp" line="151"/> + <source>Configuring user %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CreateUserJob.cpp" line="159"/> + <source>Setting file permissions</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>CreateVolumeGroupDialog</name> + <message> + <location filename="../src/modules/partition/gui/CreateVolumeGroupDialog.cpp" line="28"/> + <source>Create Volume Group</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>CreateVolumeGroupJob</name> + <message> + <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="31"/> + <source>Create new volume group named %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="37"/> + <source>Create new volume group named <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="43"/> + <source>Creating new volume group named %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/CreateVolumeGroupJob.cpp" line="55"/> + <source>The installer failed to create a volume group named '%1'.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>DeactivateVolumeGroupJob</name> + <message> + <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="24"/> + <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="36"/> + <source>Deactivate volume group named %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="30"/> + <source>Deactivate volume group named <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="48"/> + <source>The installer failed to deactivate a volume group named %1.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>DeletePartitionJob</name> + <message> + <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="71"/> + <source>Delete partition %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="78"/> + <source>Delete partition <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="85"/> + <source>Deleting partition %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="103"/> + <source>The installer failed to delete partition %1.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>DeviceInfoWidget</name> + <message> + <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="97"/> + <source>This device has a <strong>%1</strong> partition table.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="104"/> + <source>This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="111"/> + <source>This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="121"/> + <source><br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="127"/> + <source><br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="140"/> + <source>The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>DeviceModel</name> + <message> + <location filename="../src/modules/partition/core/DeviceModel.cpp" line="84"/> + <source>%1 - %2 (%3)</source> + <extracomment>device[name] - size[number] (device-node[name])</extracomment> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/core/DeviceModel.cpp" line="95"/> + <source>%1 - (%2)</source> + <extracomment>device[name] - (device-node[name])</extracomment> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>DracutLuksCfgJob</name> + <message> + <location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="117"/> + <source>Write LUKS configuration for Dracut to %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="121"/> + <source>Skip writing LUKS configuration for Dracut: "/" partition is not encrypted</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/dracutlukscfg/DracutLuksCfgJob.cpp" line="138"/> + <source>Failed to open %1</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>DummyCppJob</name> + <message> + <location filename="../src/modules/dummycpp/DummyCppJob.cpp" line="37"/> + <source>Dummy C++ Job</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>EditExistingPartitionDialog</name> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="24"/> + <source>Edit Existing Partition</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="54"/> + <source>Content:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="64"/> + <source>&Keep</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="74"/> + <source>Format</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="93"/> + <source>Warning: Formatting the partition will erase all existing data.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="103"/> + <source>&Mount Point:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="123"/> + <source>Si&ze:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="133"/> + <source> MiB</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="140"/> + <source>Fi&le System:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="153"/> + <source>Flags:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="186"/> + <source>Label for the filesystem</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.ui" line="196"/> + <source>FS Label:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EditExistingPartitionDialog.cpp" line="291"/> + <source>Mountpoint already in use. Please select another one.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>EncryptWidget</name> + <message> + <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="18"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="36"/> + <source>En&crypt system</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="46"/> + <source>Passphrase</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EncryptWidget.ui" line="56"/> + <source>Confirm passphrase</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/EncryptWidget.cpp" line="104"/> + <location filename="../src/modules/partition/gui/EncryptWidget.cpp" line="114"/> + <source>Please enter the same passphrase in both boxes.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>FillGlobalStorageJob</name> + <message> + <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="167"/> + <source>Set partition information</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="196"/> + <source>Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="204"/> + <source>Install %1 on <strong>new</strong> %2 system partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="213"/> + <source>Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="221"/> + <source>Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="235"/> + <source>Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="254"/> + <source>Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="263"/> + <source>Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="244"/> + <source>Install %2 on %3 system partition <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="278"/> + <source>Install boot loader on <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="287"/> + <source>Setting up mount points.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>FinishedPage</name> + <message> + <location filename="../src/modules/finished/FinishedPage.ui" line="18"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/FinishedPage.ui" line="102"/> + <source>&Restart now</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/FinishedPage.cpp" line="72"/> + <source><h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/FinishedPage.cpp" line="76"/> + <source><html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/FinishedPage.cpp" line="84"/> + <source><h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/FinishedPage.cpp" line="89"/> + <source><html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/FinishedPage.cpp" line="102"/> + <source><h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finished/FinishedPage.cpp" line="110"/> + <source><h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>FinishedQmlViewStep</name> + <message> + <location filename="../src/modules/finishedq/FinishedQmlViewStep.cpp" line="35"/> + <source>Finish</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>FinishedViewStep</name> + <message> + <location filename="../src/modules/finished/FinishedViewStep.cpp" line="46"/> + <source>Finish</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>FormatPartitionJob</name> + <message> + <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="36"/> + <source>Format partition %1 (file system: %2, size: %3 MiB) on %4.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="47"/> + <source>Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="58"/> + <source>Formatting partition %1 with file system %2.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="72"/> + <source>The installer failed to format partition %1 on disk '%2'.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>GeneralRequirements</name> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="155"/> + <source>has at least %1 GiB available drive space</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="157"/> + <source>There is not enough drive space. At least %1 GiB is required.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="166"/> + <source>has at least %1 GiB working memory</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="168"/> + <source>The system does not have enough working memory. At least %1 GiB is required.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="177"/> + <source>is plugged in to a power source</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="178"/> + <source>The system is not plugged in to a power source.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="185"/> + <source>is connected to the Internet</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="186"/> + <source>The system is not connected to the Internet.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="193"/> + <source>is running the installer as an administrator (root)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="196"/> + <source>The setup program is not running with administrator rights.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="197"/> + <source>The installer is not running with administrator rights.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="205"/> + <source>has a screen large enough to show the whole installer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="208"/> + <source>The screen is too small to display the setup program.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="209"/> + <source>The screen is too small to display the installer.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>HostInfoJob</name> + <message> + <location filename="../src/modules/hostinfo/HostInfoJob.cpp" line="42"/> + <source>Collecting information about your machine.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>IDJob</name> + <message> + <location filename="../src/modules/oemid/IDJob.cpp" line="30"/> + <location filename="../src/modules/oemid/IDJob.cpp" line="39"/> + <location filename="../src/modules/oemid/IDJob.cpp" line="52"/> + <location filename="../src/modules/oemid/IDJob.cpp" line="59"/> + <source>OEM Batch Identifier</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/oemid/IDJob.cpp" line="40"/> + <source>Could not create directories <code>%1</code>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/oemid/IDJob.cpp" line="53"/> + <source>Could not open file <code>%1</code>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/oemid/IDJob.cpp" line="60"/> + <source>Could not write to file <code>%1</code>.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>InitcpioJob</name> + <message> + <location filename="../src/modules/initcpio/InitcpioJob.cpp" line="31"/> + <source>Creating initramfs with mkinitcpio.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>InitramfsJob</name> + <message> + <location filename="../src/modules/initramfs/InitramfsJob.cpp" line="28"/> + <source>Creating initramfs.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>InteractiveTerminalPage</name> + <message> + <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="45"/> + <source>Konsole not installed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="45"/> + <source>Please install KDE Konsole and try again!</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="106"/> + <source>Executing script: &nbsp;<code>%1</code></source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>InteractiveTerminalViewStep</name> + <message> + <location filename="../src/modules/interactiveterminal/InteractiveTerminalViewStep.cpp" line="41"/> + <source>Script</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>KeyboardQmlViewStep</name> + <message> + <location filename="../src/modules/keyboardq/KeyboardQmlViewStep.cpp" line="32"/> + <source>Keyboard</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>KeyboardViewStep</name> + <message> + <location filename="../src/modules/keyboard/KeyboardViewStep.cpp" line="42"/> + <source>Keyboard</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>LCLocaleDialog</name> + <message> + <location filename="../src/modules/locale/LCLocaleDialog.cpp" line="23"/> + <source>System locale setting</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/LCLocaleDialog.cpp" line="30"/> + <source>The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/LCLocaleDialog.cpp" line="54"/> + <source>&Cancel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/LCLocaleDialog.cpp" line="55"/> + <source>&OK</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>LicensePage</name> + <message> + <location filename="../src/modules/license/LicensePage.ui" line="18"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicensePage.ui" line="26"/> + <source><h1>License Agreement</h1></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicensePage.cpp" line="135"/> + <source>I accept the terms and conditions above.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicensePage.cpp" line="137"/> + <source>Please review the End User License Agreements (EULAs).</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicensePage.cpp" line="142"/> + <source>This setup procedure will install proprietary software that is subject to licensing terms.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicensePage.cpp" line="145"/> + <source>If you do not agree with the terms, the setup procedure cannot continue.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicensePage.cpp" line="150"/> + <source>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"/> + </message> + <message> + <location filename="../src/modules/license/LicensePage.cpp" line="155"/> + <source>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"/> + </message> + </context> + <context> + <name>LicenseViewStep</name> + <message> + <location filename="../src/modules/license/LicenseViewStep.cpp" line="43"/> + <source>License</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>LicenseWidget</name> + <message> + <location filename="../src/modules/license/LicenseWidget.cpp" line="88"/> + <source>URL: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicenseWidget.cpp" line="109"/> + <source><strong>%1 driver</strong><br/>by %2</source> + <extracomment>%1 is an untranslatable product name, example: Creative Audigy driver</extracomment> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicenseWidget.cpp" line="116"/> + <source><strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font></source> + <extracomment>%1 is usually a vendor name, example: Nvidia graphics driver</extracomment> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicenseWidget.cpp" line="122"/> + <source><strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicenseWidget.cpp" line="128"/> + <source><strong>%1 codec</strong><br/><font color="Grey">by %2</font></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicenseWidget.cpp" line="134"/> + <source><strong>%1 package</strong><br/><font color="Grey">by %2</font></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicenseWidget.cpp" line="140"/> + <source><strong>%1</strong><br/><font color="Grey">by %2</font></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicenseWidget.cpp" line="163"/> + <source>File: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicenseWidget.cpp" line="186"/> + <source>Hide license text</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicenseWidget.cpp" line="186"/> + <source>Show the license text</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/license/LicenseWidget.cpp" line="190"/> + <source>Open license agreement in browser.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>LocalePage</name> + <message> + <location filename="../src/modules/locale/LocalePage.cpp" line="130"/> + <source>Region:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/LocalePage.cpp" line="131"/> + <source>Zone:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/LocalePage.cpp" line="132"/> + <location filename="../src/modules/locale/LocalePage.cpp" line="133"/> + <source>&Change...</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>LocaleQmlViewStep</name> + <message> + <location filename="../src/modules/localeq/LocaleQmlViewStep.cpp" line="32"/> + <source>Location</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>LocaleTests</name> + <message> + <location filename="../src/libcalamares/locale/Tests.cpp" line="273"/> + <source>Quit</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>LocaleViewStep</name> + <message> + <location filename="../src/modules/locale/LocaleViewStep.cpp" line="76"/> + <source>Location</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>LuksBootKeyFileJob</name> + <message> + <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="30"/> + <source>Configuring LUKS key file.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="186"/> + <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="194"/> + <source>No partitions are defined.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="229"/> + <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="236"/> + <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="244"/> + <source>Encrypted rootfs setup error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="230"/> + <source>Root partition %1 is LUKS but no passphrase has been set.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="237"/> + <source>Could not create LUKS key file for root partition %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp" line="245"/> + <source>Could not configure LUKS key file on partition %1.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>MachineIdJob</name> + <message> + <location filename="../src/modules/machineid/MachineIdJob.cpp" line="37"/> + <source>Generate machine-id.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/machineid/MachineIdJob.cpp" line="53"/> + <source>Configuration Error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/machineid/MachineIdJob.cpp" line="54"/> + <source>No root mount point is set for MachineId.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Map</name> + <message> + <location filename="../src/modules/localeq/Map.qml" line="243"/> + <source>Timezone: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/localeq/Map.qml" line="264"/> + <source>Please select your preferred location on the map so the installer can suggest the locale + and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging + to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>NetInstallViewStep</name> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="49"/> + <source>Package selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="50"/> + <source>Office software</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="51"/> + <source>Office package</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="52"/> + <source>Browser software</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="53"/> + <source>Browser package</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="54"/> + <source>Web browser</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="55"/> + <source>Kernel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="56"/> + <source>Services</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="57"/> + <source>Login</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="58"/> + <source>Desktop</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="59"/> + <source>Applications</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="60"/> + <source>Communication</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="61"/> + <source>Development</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="62"/> + <source>Office</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="63"/> + <source>Multimedia</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="64"/> + <source>Internet</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="65"/> + <source>Theming</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="66"/> + <source>Gaming</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/NetInstallViewStep.cpp" line="67"/> + <source>Utilities</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>NotesQmlViewStep</name> + <message> + <location filename="../src/modules/notesqml/NotesQmlViewStep.cpp" line="23"/> + <source>Notes</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>OEMPage</name> + <message> + <location filename="../src/modules/oemid/OEMPage.ui" line="32"/> + <source>Ba&tch:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/oemid/OEMPage.ui" line="42"/> + <source><html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/oemid/OEMPage.ui" line="52"/> + <source><html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html></source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>OEMViewStep</name> + <message> + <location filename="../src/modules/oemid/OEMViewStep.cpp" line="122"/> + <source>OEM Configuration</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/oemid/OEMViewStep.cpp" line="128"/> + <source>Set the OEM Batch Identifier to <code>%1</code>.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Offline</name> + <message> + <location filename="../src/modules/localeq/Offline.qml" line="41"/> + <source>Select your preferred Region, or use the default settings.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/localeq/Offline.qml" line="98"/> + <location filename="../src/modules/localeq/Offline.qml" line="173"/> + <location filename="../src/modules/localeq/Offline.qml" line="217"/> + <source>Timezone: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/localeq/Offline.qml" line="115"/> + <source>Select your preferred Zone within your Region.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/localeq/Offline.qml" line="186"/> + <source>Zones</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/localeq/Offline.qml" line="233"/> + <source>You can fine-tune Language and Locale settings below.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>PWQ</name> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="51"/> + <source>Password is too short</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="67"/> + <source>Password is too long</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="188"/> + <source>Password is too weak</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="196"/> + <source>Memory allocation error when setting '%1'</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="199"/> + <source>Memory allocation error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="201"/> + <source>The password is the same as the old one</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="203"/> + <source>The password is a palindrome</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="205"/> + <source>The password differs with case changes only</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="207"/> + <source>The password is too similar to the old one</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="209"/> + <source>The password contains the user name in some form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="211"/> + <source>The password contains words from the real name of the user in some form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="214"/> + <source>The password contains forbidden words in some form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="221"/> + <source>The password contains too few digits</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="228"/> + <source>The password contains too few uppercase letters</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="232"/> + <source>The password contains fewer than %n lowercase letters</source> + <translation type="unfinished"> + <numerusform/> + </translation> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="235"/> + <source>The password contains too few lowercase letters</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="242"/> + <source>The password contains too few non-alphanumeric characters</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="249"/> + <source>The password is too short</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="258"/> + <source>The password does not contain enough character classes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="265"/> + <source>The password contains too many same characters consecutively</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="275"/> + <source>The password contains too many characters of the same class consecutively</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="218"/> + <source>The password contains fewer than %n digits</source> + <translation type="unfinished"> + <numerusform/> + </translation> + </message> + <message numerus="yes"> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="225"/> + <source>The password contains fewer than %n uppercase letters</source> + <translation type="unfinished"> + <numerusform/> + </translation> + </message> + <message numerus="yes"> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="239"/> + <source>The password contains fewer than %n non-alphanumeric characters</source> + <translation type="unfinished"> + <numerusform/> + </translation> + </message> + <message numerus="yes"> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="246"/> + <source>The password is shorter than %n characters</source> + <translation type="unfinished"> + <numerusform/> + </translation> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="251"/> + <source>The password is a rotated version of the previous one</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="255"/> + <source>The password contains fewer than %n character classes</source> + <translation type="unfinished"> + <numerusform/> + </translation> + </message> + <message numerus="yes"> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="262"/> + <source>The password contains more than %n same characters consecutively</source> + <translation type="unfinished"> + <numerusform/> + </translation> + </message> + <message numerus="yes"> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="269"/> + <source>The password contains more than %n characters of the same class consecutively</source> + <translation type="unfinished"> + <numerusform/> + </translation> + </message> + <message numerus="yes"> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="280"/> + <source>The password contains monotonic sequence longer than %n characters</source> + <translation type="unfinished"> + <numerusform/> + </translation> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="286"/> + <source>The password contains too long of a monotonic character sequence</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="289"/> + <source>No password supplied</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="291"/> + <source>Cannot obtain random numbers from the RNG device</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="293"/> + <source>Password generation failed - required entropy too low for settings</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="298"/> + <source>The password fails the dictionary check - %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="301"/> + <source>The password fails the dictionary check</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="305"/> + <source>Unknown setting - %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="307"/> + <source>Unknown setting</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="311"/> + <source>Bad integer value of setting - %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="313"/> + <source>Bad integer value</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="317"/> + <source>Setting %1 is not of integer type</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="319"/> + <source>Setting is not of integer type</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="323"/> + <source>Setting %1 is not of string type</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="325"/> + <source>Setting is not of string type</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="327"/> + <source>Opening the configuration file failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="329"/> + <source>The configuration file is malformed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="331"/> + <source>Fatal failure</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/CheckPWQuality.cpp" line="333"/> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/Config.cpp" line="782"/> + <source>Password is empty</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>PackageChooserPage</name> + <message> + <location filename="../src/modules/packagechooser/page_package.ui" line="24"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooser/page_package.ui" line="50"/> + <source>Product Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooser/page_package.ui" line="63"/> + <source>TextLabel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooser/page_package.ui" line="79"/> + <source>Long Product Description</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooser/PackageChooserPage.cpp" line="25"/> + <source>Package Selection</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooser/PackageChooserPage.cpp" line="26"/> + <source>Please pick a product from the list. The selected product will be installed.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>PackageChooserQmlViewStep</name> + <message> + <location filename="../src/modules/packagechooserq/PackageChooserQmlViewStep.cpp" line="32"/> + <source>Packages</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>PackageChooserViewStep</name> + <message> + <location filename="../src/modules/packagechooser/PackageChooserViewStep.cpp" line="51"/> + <source>Packages</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>PackageModel</name> + <message> + <location filename="../src/modules/netinstall/PackageModel.cpp" line="168"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/netinstall/PackageModel.cpp" line="168"/> + <source>Description</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Page_Keyboard</name> + <message> + <location filename="../src/modules/keyboard/KeyboardPage.ui" line="18"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/keyboard/KeyboardPage.ui" line="74"/> + <source>Keyboard Model:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/keyboard/KeyboardPage.ui" line="135"/> + <source>Type here to test your keyboard</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Page_UserSetup</name> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="18"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="40"/> + <source>What is your name?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="55"/> + <source>Your Full Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="124"/> + <source>What name do you want to use to log in?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="148"/> + <source>login</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="223"/> + <source>What is the name of this computer?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="247"/> + <source><small>This name will be used if you make the computer visible to others on a network.</small></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="250"/> + <source>Computer Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="325"/> + <source>Choose a password to keep your account safe.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="349"/> + <location filename="../src/modules/users/page_usersetup.ui" line="374"/> + <source><small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="355"/> + <location filename="../src/modules/users/page_usersetup.ui" line="525"/> + <source>Password</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="380"/> + <location filename="../src/modules/users/page_usersetup.ui" line="550"/> + <source>Repeat Password</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="455"/> + <source>When this box is checked, password-strength checking is done and you will not be able to use a weak password.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="458"/> + <source>Require strong passwords.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="465"/> + <source>Log in automatically without asking for the password.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="472"/> + <source>Use the same password for the administrator account.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="495"/> + <source>Choose a password for the administrator account.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/page_usersetup.ui" line="519"/> + <location filename="../src/modules/users/page_usersetup.ui" line="544"/> + <source><small>Enter the same password twice, so that it can be checked for typing errors.</small></source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>PartitionLabelsView</name> + <message> + <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="190"/> + <source>Root</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="194"/> + <source>Home</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="198"/> + <source>Boot</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="203"/> + <source>EFI system</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="207"/> + <source>Swap</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="211"/> + <source>New partition for %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="215"/> + <source>New partition</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="239"/> + <source>%1 %2</source> + <extracomment>size[number] filesystem[name]</extracomment> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>PartitionModel</name> + <message> + <location filename="../src/modules/partition/core/PartitionModel.cpp" line="159"/> + <location filename="../src/modules/partition/core/PartitionModel.cpp" line="203"/> + <source>Free Space</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/core/PartitionModel.cpp" line="163"/> + <location filename="../src/modules/partition/core/PartitionModel.cpp" line="207"/> + <source>New partition</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/core/PartitionModel.cpp" line="300"/> + <source>Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/core/PartitionModel.cpp" line="302"/> + <source>File System</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/core/PartitionModel.cpp" line="304"/> + <source>File System Label</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/core/PartitionModel.cpp" line="306"/> + <source>Mount Point</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/core/PartitionModel.cpp" line="308"/> + <source>Size</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>PartitionPage</name> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.ui" line="18"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.ui" line="26"/> + <source>Storage de&vice:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.ui" line="55"/> + <source>&Revert All Changes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.ui" line="91"/> + <source>New Partition &Table</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.ui" line="111"/> + <source>Cre&ate</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.ui" line="118"/> + <source>&Edit</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.ui" line="125"/> + <source>&Delete</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.ui" line="136"/> + <source>New Volume Group</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.ui" line="143"/> + <source>Resize Volume Group</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.ui" line="150"/> + <source>Deactivate Volume Group</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.ui" line="157"/> + <source>Remove Volume Group</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.ui" line="184"/> + <source>I&nstall boot loader on:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="228"/> + <source>Are you sure you want to create a new partition table on %1?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="263"/> + <source>Can not create new partition</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionPage.cpp" line="264"/> + <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"/> + </message> + </context> + <context> + <name>PartitionViewStep</name> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="56"/> + <source>Gathering system information...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="111"/> + <source>Partitions</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="303"/> + <source>Current:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="321"/> + <source>After:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="530"/> + <source>No EFI system partition configured</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="534"/> + <source>EFI system partition configured incorrectly</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="539"/> + <source>An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="550"/> + <source>The filesystem must be mounted on <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="556"/> + <source>The filesystem must have type FAT32.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="564"/> + <source>The filesystem must be at least %1 MiB in size.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="570"/> + <source>The filesystem must have flag <strong>%1</strong> set.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="576"/> + <source>You can continue without setting up an EFI system partition but your system may fail to start.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="593"/> + <source>Option to use GPT on BIOS</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="594"/> + <source>A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>bios_grub</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="626"/> + <source>Boot partition not encrypted</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="627"/> + <source>A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="714"/> + <source>has at least one disk device available.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/PartitionViewStep.cpp" line="715"/> + <source>There are no partitions to install on.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>PlasmaLnfJob</name> + <message> + <location filename="../src/modules/plasmalnf/PlasmaLnfJob.cpp" line="33"/> + <source>Plasma Look-and-Feel Job</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/plasmalnf/PlasmaLnfJob.cpp" line="57"/> + <location filename="../src/modules/plasmalnf/PlasmaLnfJob.cpp" line="58"/> + <source>Could not select KDE Plasma Look-and-Feel package</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>PlasmaLnfPage</name> + <message> + <location filename="../src/modules/plasmalnf/page_plasmalnf.ui" line="18"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/plasmalnf/PlasmaLnfPage.cpp" line="79"/> + <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"/> + </message> + <message> + <location filename="../src/modules/plasmalnf/PlasmaLnfPage.cpp" line="84"/> + <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"/> + </message> + </context> + <context> + <name>PlasmaLnfViewStep</name> + <message> + <location filename="../src/modules/plasmalnf/PlasmaLnfViewStep.cpp" line="43"/> + <source>Look-and-Feel</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>PreserveFiles</name> + <message> + <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="79"/> + <source>Saving files for later ...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="118"/> + <source>No files configured to save for later.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/preservefiles/PreserveFiles.cpp" line="172"/> + <source>Not all of the configured files could be preserved.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ProcessResult</name> + <message> + <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="425"/> + <source> +There was no output from the command.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="426"/> + <source> +Output: +</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="430"/> + <source>External command crashed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="431"/> + <source>Command <i>%1</i> crashed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="436"/> + <source>External command failed to start.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="437"/> + <source>Command <i>%1</i> failed to start.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="441"/> + <source>Internal error when starting command.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="442"/> + <source>Bad parameters for process job call.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="446"/> + <source>External command failed to finish.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="447"/> + <source>Command <i>%1</i> failed to finish in %2 seconds.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="454"/> + <source>External command finished with errors.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/utils/CalamaresUtilsSystem.cpp" line="455"/> + <source>Command <i>%1</i> finished with exit code %2.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>QObject</name> + <message> + <location filename="../src/libcalamares/locale/Translation.cpp" line="74"/> + <source>%1 (%2)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/partition/FileSystem.cpp" line="28"/> + <source>unknown</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/partition/FileSystem.cpp" line="30"/> + <source>extended</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/partition/FileSystem.cpp" line="32"/> + <source>unformatted</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamares/partition/FileSystem.cpp" line="34"/> + <source>swap</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/keyboard/keyboardwidget/keyboardglobal.cpp" line="130"/> + <location filename="../src/modules/keyboard/keyboardwidget/keyboardglobal.cpp" line="167"/> + <source>Default</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/machineid/Workers.cpp" line="64"/> + <location filename="../src/modules/machineid/Workers.cpp" line="72"/> + <location filename="../src/modules/machineid/Workers.cpp" line="76"/> + <location filename="../src/modules/machineid/Workers.cpp" line="93"/> + <source>File not found</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/machineid/Workers.cpp" line="65"/> + <source>Path <pre>%1</pre> must be an absolute path.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/machineid/MachineIdJob.cpp" line="83"/> + <source>Directory not found</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/machineid/MachineIdJob.cpp" line="84"/> + <location filename="../src/modules/machineid/Workers.cpp" line="94"/> + <source>Could not create new random file <pre>%1</pre>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooser/PackageModel.cpp" line="63"/> + <source>No product</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooser/PackageModel.cpp" line="71"/> + <source>No description provided.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionDialogHelpers.cpp" line="44"/> + <source>(no mount point)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/PartitionLabelsView.cpp" line="41"/> + <source>Unpartitioned space or unknown partition table</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Recommended</name> + <message> + <location filename="../src/modules/welcomeq/Recommended.qml" line="40"/> + <source><p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> + Setup can continue, but some features might be disabled.</p></source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>RemoveUserJob</name> + <message> + <location filename="../src/modules/removeuser/RemoveUserJob.cpp" line="34"/> + <source>Remove live user from target system</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>RemoveVolumeGroupJob</name> + <message> + <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="24"/> + <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="36"/> + <source>Remove Volume Group named %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="30"/> + <source>Remove Volume Group named <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/RemoveVolumeGroupJob.cpp" line="48"/> + <source>The installer failed to remove a volume group named '%1'.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ReplaceWidget</name> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.ui" line="18"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="127"/> + <source>Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="149"/> + <source>The selected item does not appear to be a valid partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="157"/> + <source>%1 cannot be installed on empty space. Please select an existing partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="167"/> + <source>%1 cannot be installed on an extended partition. Please select an existing primary or logical partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="177"/> + <source>%1 cannot be installed on this partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="183"/> + <source>Data partition (%1)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="203"/> + <source>Unknown system partition (%1)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="207"/> + <source>%1 system partition (%2)</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="218"/> + <source><strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="240"/> + <source><strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="251"/> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="267"/> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="292"/> + <source><strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="259"/> + <source>The EFI system partition at %1 will be used for starting %2.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ReplaceWidget.cpp" line="275"/> + <source>EFI system partition:</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>Requirements</name> + <message> + <location filename="../src/modules/welcomeq/Requirements.qml" line="38"/> + <source><p>This computer does not satisfy the minimum requirements for installing %1.<br/> + Installation cannot continue.</p></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcomeq/Requirements.qml" line="40"/> + <source><p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> + Setup can continue, but some features might be disabled.</p></source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ResizeFSJob</name> + <message> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="46"/> + <source>Resize Filesystem Job</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="169"/> + <source>Invalid configuration</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="170"/> + <source>The file-system resize job has an invalid configuration and will not run.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="175"/> + <source>KPMCore not Available</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="176"/> + <source>Calamares cannot start KPMCore for the file-system resize job.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="184"/> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="193"/> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="204"/> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="213"/> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="231"/> + <source>Resize Failed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="186"/> + <source>The filesystem %1 could not be found in this system, and cannot be resized.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="187"/> + <source>The device %1 could not be found in this system, and cannot be resized.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="195"/> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="206"/> + <source>The filesystem %1 cannot be resized.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="196"/> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="207"/> + <source>The device %1 cannot be resized.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="214"/> + <source>The filesystem %1 must be resized, but cannot.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="215"/> + <source>The device %1 must be resized, but cannot</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ResizePartitionJob</name> + <message> + <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="40"/> + <source>Resize partition %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="47"/> + <source>Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="58"/> + <source>Resizing %2MiB partition %1 to %3MiB.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ResizePartitionJob.cpp" line="77"/> + <source>The installer failed to resize partition %1 on disk '%2'.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ResizeVolumeGroupDialog</name> + <message> + <location filename="../src/modules/partition/gui/ResizeVolumeGroupDialog.cpp" line="30"/> + <source>Resize Volume Group</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ResizeVolumeGroupJob</name> + <message> + <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="27"/> + <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="45"/> + <source>Resize volume group named %1 from %2 to %3.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="36"/> + <source>Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/ResizeVolumeGroupJob.cpp" line="60"/> + <source>The installer failed to resize a volume group named '%1'.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ResultsListDialog</name> + <message> + <location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="137"/> + <source>For best results, please ensure that this computer:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/checker/ResultsListWidget.cpp" line="138"/> + <source>System requirements</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ScanningDialog</name> + <message> + <location filename="../src/modules/partition/gui/ScanningDialog.cpp" line="64"/> + <source>Scanning storage devices...</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/ScanningDialog.cpp" line="64"/> + <source>Partitioning</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>SetHostNameJob</name> + <message> + <location filename="../src/modules/users/SetHostNameJob.cpp" line="37"/> + <source>Set hostname %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/SetHostNameJob.cpp" line="44"/> + <source>Set hostname <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/SetHostNameJob.cpp" line="51"/> + <source>Setting hostname %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/SetHostNameJob.cpp" line="122"/> + <location filename="../src/modules/users/SetHostNameJob.cpp" line="129"/> + <source>Internal Error</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/SetHostNameJob.cpp" line="137"/> + <location filename="../src/modules/users/SetHostNameJob.cpp" line="146"/> + <source>Cannot write hostname to target system</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>SetKeyboardLayoutJob</name> + <message> + <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="55"/> + <source>Set keyboard model to %1, layout to %2-%3</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="368"/> + <source>Failed to write keyboard configuration for the virtual console.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="369"/> + <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="397"/> + <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="414"/> + <source>Failed to write to %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="396"/> + <source>Failed to write keyboard configuration for X11.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="413"/> + <source>Failed to write keyboard configuration to existing /etc/default directory.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>SetPartFlagsJob</name> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="43"/> + <source>Set flags on partition %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="49"/> + <source>Set flags on %1MiB %2 partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="53"/> + <source>Set flags on new partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="65"/> + <source>Clear flags on partition <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="71"/> + <source>Clear flags on %1MiB <strong>%2</strong> partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="75"/> + <source>Clear flags on new partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="80"/> + <source>Flag partition <strong>%1</strong> as <strong>%2</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="89"/> + <source>Flag %1MiB <strong>%2</strong> partition as <strong>%3</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="96"/> + <source>Flag new partition as <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="108"/> + <source>Clearing flags on partition <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="114"/> + <source>Clearing flags on %1MiB <strong>%2</strong> partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="119"/> + <source>Clearing flags on new partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="124"/> + <source>Setting flags <strong>%2</strong> on partition <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="133"/> + <source>Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="140"/> + <source>Setting flags <strong>%1</strong> on new partition.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="157"/> + <source>The installer failed to set flags on partition %1.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>SetPasswordJob</name> + <message> + <location filename="../src/modules/users/SetPasswordJob.cpp" line="40"/> + <source>Set password for user %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/SetPasswordJob.cpp" line="47"/> + <source>Setting password for user %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/SetPasswordJob.cpp" line="81"/> + <source>Bad destination system path.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/SetPasswordJob.cpp" line="82"/> + <source>rootMountPoint is %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/SetPasswordJob.cpp" line="88"/> + <source>Cannot disable root account.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/SetPasswordJob.cpp" line="89"/> + <source>passwd terminated with error code %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/SetPasswordJob.cpp" line="97"/> + <source>Cannot set password for user %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/SetPasswordJob.cpp" line="98"/> + <source>usermod terminated with error code %1.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>SetTimezoneJob</name> + <message> + <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="34"/> + <source>Set timezone to %1/%2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="62"/> + <source>Cannot access selected timezone path.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="63"/> + <source>Bad path: %1</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="71"/> + <source>Cannot set timezone.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="72"/> + <source>Link creation failed, target: %1; link name: %2</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="77"/> + <source>Cannot set timezone,</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/locale/SetTimezoneJob.cpp" line="78"/> + <source>Cannot open /etc/timezone for writing</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>SetupGroupsJob</name> + <message> + <location filename="../src/modules/users/MiscJobs.cpp" line="166"/> + <source>Preparing groups.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/MiscJobs.cpp" line="178"/> + <location filename="../src/modules/users/MiscJobs.cpp" line="183"/> + <source>Could not create groups in target system</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/MiscJobs.cpp" line="184"/> + <source>These groups are missing in the target system: %1</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>SetupSudoJob</name> + <message> + <location filename="../src/modules/users/MiscJobs.cpp" line="33"/> + <source>Configure <pre>sudo</pre> users.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/MiscJobs.cpp" line="55"/> + <source>Cannot chmod sudoers file.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/MiscJobs.cpp" line="60"/> + <source>Cannot create sudoers file for writing.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>ShellProcessJob</name> + <message> + <location filename="../src/modules/shellprocess/ShellProcessJob.cpp" line="41"/> + <source>Shell Processes Job</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>SlideCounter</name> + <message> + <location filename="../src/qml/calamares/slideshow/SlideCounter.qml" line="27"/> + <source>%L1 / %L2</source> + <extracomment>slide counter, %1 of %2 (numeric)</extracomment> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>StandardButtons</name> + <message> + <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="28"/> + <source>&OK</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="29"/> + <source>&Yes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="30"/> + <source>&No</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="31"/> + <source>&Cancel</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/libcalamaresui/widgets/TranslationFix.cpp" line="32"/> + <source>&Close</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>TrackingInstallJob</name> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="102"/> + <source>Installation feedback</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="108"/> + <source>Sending installation feedback.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="125"/> + <source>Internal error in install-tracking.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="126"/> + <source>HTTP request timed out.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>TrackingKUserFeedbackJob</name> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="187"/> + <source>KDE user feedback</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="193"/> + <source>Configuring KDE user feedback.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="215"/> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="221"/> + <source>Error in KDE user feedback configuration.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="216"/> + <source>Could not configure KDE user feedback correctly, script error %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="222"/> + <source>Could not configure KDE user feedback correctly, Calamares error %1.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>TrackingMachineUpdateManagerJob</name> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="136"/> + <source>Machine feedback</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="142"/> + <source>Configuring machine feedback.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="165"/> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="171"/> + <source>Error in machine feedback configuration.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="166"/> + <source>Could not configure machine feedback correctly, script error %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingJobs.cpp" line="172"/> + <source>Could not configure machine feedback correctly, Calamares error %1.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>TrackingPage</name> + <message> + <location filename="../src/modules/tracking/page_trackingstep.ui" line="18"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/page_trackingstep.ui" line="28"/> + <source>Placeholder</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/page_trackingstep.ui" line="76"/> + <source><html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/page_trackingstep.ui" line="275"/> + <source><html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingPage.cpp" line="86"/> + <source>Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingPage.cpp" line="91"/> + <source>By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingPage.cpp" line="94"/> + <source>By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/tracking/TrackingPage.cpp" line="98"/> + <source>By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>TrackingViewStep</name> + <message> + <location filename="../src/modules/tracking/TrackingViewStep.cpp" line="49"/> + <source>Feedback</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>UsersPage</name> + <message> + <location filename="../src/modules/users/UsersPage.cpp" line="167"/> + <source><small>If more than one person will use this computer, you can create multiple accounts after setup.</small></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/users/UsersPage.cpp" line="173"/> + <source><small>If more than one person will use this computer, you can create multiple accounts after installation.</small></source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>UsersQmlViewStep</name> + <message> + <location filename="../src/modules/usersq/UsersQmlViewStep.cpp" line="35"/> + <source>Users</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>UsersViewStep</name> + <message> + <location filename="../src/modules/users/UsersViewStep.cpp" line="48"/> + <source>Users</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>VariantModel</name> + <message> + <location filename="../src/calamares/VariantModel.cpp" line="232"/> + <source>Key</source> + <comment>Column header for key/value</comment> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/calamares/VariantModel.cpp" line="236"/> + <source>Value</source> + <comment>Column header for key/value</comment> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>VolumeGroupBaseDialog</name> + <message> + <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="18"/> + <source>Create Volume Group</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="24"/> + <source>List of Physical Volumes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="34"/> + <source>Volume Group Name:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="47"/> + <source>Volume Group Type:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="60"/> + <source>Physical Extent Size:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="70"/> + <source> MiB</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="86"/> + <source>Total Size:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="106"/> + <source>Used Size:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="126"/> + <source>Total Sectors:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/partition/gui/VolumeGroupBaseDialog.ui" line="146"/> + <source>Quantity of LVs:</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>WelcomePage</name> + <message> + <location filename="../src/modules/welcome/WelcomePage.ui" line="18"/> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.ui" line="79"/> + <location filename="../src/modules/welcome/WelcomePage.ui" line="98"/> + <source>Select application and system language</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.ui" line="140"/> + <source>&About</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.ui" line="150"/> + <source>Open donations website</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.ui" line="153"/> + <source>&Donate</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.ui" line="163"/> + <source>Open help and support website</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.ui" line="166"/> + <source>&Support</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.ui" line="176"/> + <source>Open issues and bug-tracking website</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.ui" line="179"/> + <source>&Known issues</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.ui" line="189"/> + <source>Open release notes website</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.ui" line="192"/> + <source>&Release notes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.cpp" line="216"/> + <source><h1>Welcome to the Calamares setup program for %1.</h1></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.cpp" line="217"/> + <source><h1>Welcome to %1 setup.</h1></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.cpp" line="222"/> + <source><h1>Welcome to the Calamares installer for %1.</h1></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.cpp" line="223"/> + <source><h1>Welcome to the %1 installer.</h1></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.cpp" line="228"/> + <source>%1 support</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.cpp" line="235"/> + <source>About %1 setup</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.cpp" line="235"/> + <source>About %1 installer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcome/WelcomePage.cpp" line="238"/> + <source><h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>WelcomeQmlViewStep</name> + <message> + <location filename="../src/modules/welcomeq/WelcomeQmlViewStep.cpp" line="40"/> + <source>Welcome</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>WelcomeViewStep</name> + <message> + <location filename="../src/modules/welcome/WelcomeViewStep.cpp" line="46"/> + <source>Welcome</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>about</name> + <message> + <location filename="../src/modules/welcomeq/about.qml" line="47"/> + <source><h1>%1</h1><br/> + <strong>%2<br/> + for %3</strong><br/><br/> + Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/> + Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/> + Thanks to <a href='https://calamares.io/team/'>the Calamares team</a> + and the <a href='https://www.transifex.com/calamares/calamares/'>Calamares + translators team</a>.<br/><br/> + <a href='https://calamares.io/'>Calamares</a> + development is sponsored by <br/> + <a href='http://www.blue-systems.com/'>Blue Systems</a> - + Liberating Software.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcomeq/about.qml" line="96"/> + <source>Back</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>calamares-sidebar</name> + <message> + <location filename="../src/calamares/calamares-sidebar.qml" line="79"/> + <source>Show debug information</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>finishedq</name> + <message> + <location filename="../src/modules/finishedq/finishedq.qml" line="36"/> + <source>Installation Completed</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finishedq/finishedq.qml" line="43"/> + <source>%1 has been installed on your computer.<br/> + You may now restart into your new system, or continue using the Live environment.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finishedq/finishedq.qml" line="65"/> + <source>Close Installer</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finishedq/finishedq.qml" line="71"/> + <source>Restart System</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/finishedq/finishedq.qml" line="89"/> + <source><p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> + This log is copied to /var/log/installation.log of the target system.</p></source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>i18n</name> + <message> + <location filename="../src/modules/localeq/i18n.qml" line="50"/> + <source><h1>Languages</h1> </br> + The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/localeq/i18n.qml" line="123"/> + <source><h1>Locales</h1> </br> + The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/localeq/i18n.qml" line="189"/> + <source>Back</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>keyboardq</name> + <message> + <location filename="../src/modules/keyboardq/keyboardq.qml" line="60"/> + <source>To activate keyboard preview, select a layout.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/keyboardq/keyboardq.qml" line="86"/> + <source>Keyboard Model:</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/keyboardq/keyboardq.qml" line="254"/> + <source>Layouts</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/keyboardq/keyboardq.qml" line="263"/> + <source>Type here to test your keyboard</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/keyboardq/keyboardq.qml" line="179"/> + <source>Variants</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>localeq</name> + <message> + <location filename="../src/modules/localeq/localeq.qml" line="81"/> + <source>Change</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>notesqml</name> + <message> + <location filename="../src/modules/notesqml/notesqml.qml" line="50"/> + <source><h3>%1</h3> + <p>These are example release notes.</p></source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>packagechooserq</name> + <message> + <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="45"/> + <source>LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> + Default option.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="59"/> + <source>LibreOffice</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="108"/> + <source>If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="121"/> + <source>No Office Suite</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="172"/> + <source>Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="185"/> + <source>Minimal Install</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/packagechooserq/packagechooserq.qml" line="233"/> + <source>Please select an option for your install, or use the default: LibreOffice included.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>release_notes</name> + <message> + <location filename="../src/modules/welcomeq/release_notes.qml" line="45"/> + <source><h3>%1</h3> + <p>This an example QML file, showing options in RichText with Flickable content.</p> + + <p>QML with RichText can use HTML tags, Flickable content is useful for touchscreens.</p> + + <p><b>This is bold text</b></p> + <p><i>This is italic text</i></p> + <p><u>This is underlined text</u></p> + <p><center>This text will be center-aligned.</center></p> + <p><s>This is strikethrough</s></p> + + <p>Code example: + <code>ls -l /home</code></p> + + <p><b>Lists:</b></p> + <ul> + <li>Intel CPU systems</li> + <li>AMD CPU systems</li> + </ul> + + <p>The vertical scrollbar is adjustable, current width set to 10.</p></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcomeq/release_notes.qml" line="76"/> + <source>Back</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>usersq</name> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="43"/> + <source>Pick your user name and credentials to login and perform admin tasks</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="56"/> + <source>What is your name?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="63"/> + <source>Your Full Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="80"/> + <source>What name do you want to use to log in?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="87"/> + <source>Login Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="116"/> + <source>If more than one person will use this computer, you can create multiple accounts after installation.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="128"/> + <source>Only lowercase letters, numbers, underscore and hyphen are allowed.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="136"/> + <source>root is not allowed as username.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="145"/> + <source>What is the name of this computer?</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="151"/> + <source>Computer Name</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="178"/> + <source>This name will be used if you make the computer visible to others on a network.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="198"/> + <source>localhost is not allowed as hostname.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="207"/> + <source>Choose a password to keep your account safe.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="217"/> + <source>Password</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="234"/> + <source>Repeat Password</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="261"/> + <source>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.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="406"/> + <source>Validate passwords quality</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="416"/> + <source>When this box is checked, password-strength checking is done and you will not be able to use a weak password.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="398"/> + <source>Log in automatically without asking for the password</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="190"/> + <source>Only letters, numbers, underscore and hyphen are allowed, minimal of two characters.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="293"/> + <source>Reuse user password as root password</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="301"/> + <source>Use the same password for the administrator account.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="314"/> + <source>Choose a root password to keep your account safe.</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="324"/> + <source>Root Password</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="342"/> + <source>Repeat Root Password</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/usersq/usersq.qml" line="368"/> + <source>Enter the same password twice, so that it can be checked for typing errors.</source> + <translation type="unfinished"/> + </message> + </context> + <context> + <name>welcomeq</name> + <message> + <location filename="../src/modules/welcomeq/welcomeq.qml" line="35"/> + <source><h3>Welcome to the %1 <quote>%2</quote> installer</h3> + <p>This program will ask you some questions and set up %1 on your computer.</p></source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcomeq/welcomeq.qml" line="66"/> + <source>About</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcomeq/welcomeq.qml" line="80"/> + <source>Support</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcomeq/welcomeq.qml" line="91"/> + <source>Known issues</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcomeq/welcomeq.qml" line="102"/> + <source>Release notes</source> + <translation type="unfinished"/> + </message> + <message> + <location filename="../src/modules/welcomeq/welcomeq.qml" line="114"/> + <source>Donate</source> + <translation type="unfinished"/> + </message> + </context> +</TS> diff --git a/lang/calamares_pt_PT.ts b/lang/calamares_pt_PT.ts index 951645ab1559d2fd067838b49a628f43400e5780..3ec8b295e23b951d50efcac5a4e0e0cc379d9ae1 100644 --- a/lang/calamares_pt_PT.ts +++ b/lang/calamares_pt_PT.ts @@ -2014,7 +2014,7 @@ O instalador será encerrado e todas as alterações serão perdidas.</translati <source>Please select your preferred location on the map so the installer can suggest the locale and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming.</source> - <translation>Por favor selecione o seu local preferido no mapa para que o instalador possa sugerir a localização + <translation>Selecione o seu local preferido no mapa para que o instalador possa sugerir a localização e fuso horário para si. Pode ajustar as definições sugeridas abaixo. Procure no mapa arrastando para mover e utilizando os botões +/- para aumentar/diminuir ou utilize a roda do rato para dar zoom.</translation> </message> @@ -4003,7 +4003,7 @@ Saída de Dados: <message> <location filename="../src/modules/welcome/WelcomePage.cpp" line="238"/> <source><h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software.</source> - <translation><h1>%1</h1><br/><strong>%2<br/>para %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Obrigado à <a href="https://calamares.io/team/">equipa Calamares</a> e à <a href="https://www.transifex.com/calamares/calamares/">equipa de tradutores do Calamares</a>.<br/><br/>O desenvolvimento do <a href="https://calamares.io/">Calamares</a> é patrocinado pela <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software.</translation> + <translation><h1>%1</h1><br/><strong>%2<br/>para o %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Obrigado à <a href="https://calamares.io/team/">equipa Calamares</a> e à <a href="https://www.transifex.com/calamares/calamares/">equipa de tradutores do Calamares</a>.<br/><br/>O desenvolvimento do <a href="https://calamares.io/">Calamares</a> é patrocinado pela <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software.</translation> </message> </context> <context> diff --git a/lang/calamares_ro.ts b/lang/calamares_ro.ts index 39573886db8bcd17fe25a4804d0d58873cca3f44..a4ac28ce6d4230cf58b722b42d9338f0774bd7bf 100644 --- a/lang/calamares_ro.ts +++ b/lang/calamares_ro.ts @@ -104,17 +104,17 @@ <message> <location filename="../src/calamares/DebugWindow.ui" line="102"/> <source>Crashes Calamares, so that Dr. Konqui can look at it.</source> - <translation type="unfinished"/> + <translation>Dă crash lui Calamares, pentru ca doctorul Konqui să se uite la el.</translation> </message> <message> <location filename="../src/calamares/DebugWindow.ui" line="115"/> <source>Reloads the stylesheet from the branding directory.</source> - <translation type="unfinished"/> + <translation>Reîncarcă foaia de stil din directorul branding.</translation> </message> <message> <location filename="../src/calamares/DebugWindow.ui" line="141"/> <source>Uploads the session log to the configured pastebin.</source> - <translation type="unfinished"/> + <translation>Încarcă jurnalul sesiunii pe pastebin-ul configurat.</translation> </message> <message> <location filename="../src/calamares/DebugWindow.ui" line="144"/> @@ -134,7 +134,7 @@ <message> <location filename="../src/calamares/DebugWindow.ui" line="131"/> <source>Widget Tree</source> - <translation>Lista widget</translation> + <translation>Arborele de widget</translation> </message> <message> <location filename="../src/calamares/DebugWindow.cpp" line="221"/> diff --git a/lang/calamares_tg.ts b/lang/calamares_tg.ts index 1c64c5d8c35be02c97919fa56cec812abf2f0b67..b4124be17d861a45136b4898ff233b2c5b65a12c 100644 --- a/lang/calamares_tg.ts +++ b/lang/calamares_tg.ts @@ -6,7 +6,7 @@ <message> <location filename="../src/modules/partition/jobs/AutoMountManagementJob.cpp" line="22"/> <source>Manage auto-mount settings</source> - <translation type="unfinished"/> + <translation>Идора кардани танзимоти васлкунии худкор</translation> </message> </context> <context> diff --git a/lang/calamares_zh_CN.ts b/lang/calamares_zh_CN.ts index 5b58024ad7226b1a36bf16e3ade72b9bdae7188c..df04d1dd6acd8b56fc9da3ceeab563dce82ace38 100644 --- a/lang/calamares_zh_CN.ts +++ b/lang/calamares_zh_CN.ts @@ -688,27 +688,27 @@ The installer will quit and all changes will be lost.</source> <message> <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="259"/> <source>Successfully unmounted %1.</source> - <translation type="unfinished"/> + <translation>成功卸载了 %1。</translation> </message> <message> <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="266"/> <source>Successfully disabled swap %1.</source> - <translation type="unfinished"/> + <translation>成功禁用了交换空间 %1。</translation> </message> <message> <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="292"/> <source>Successfully cleared swap %1.</source> - <translation type="unfinished"/> + <translation>成功清理了交换空间 %1。</translation> </message> <message> <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="306"/> <source>Successfully closed mapper device %1.</source> - <translation type="unfinished"/> + <translation>成功关闭了映射设备 %1。</translation> </message> <message> <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="319"/> <source>Successfully disabled volume group %1.</source> - <translation type="unfinished"/> + <translation>成功禁用了卷组 %1。</translation> </message> <message> <location filename="../src/modules/partition/jobs/ClearMountsJob.cpp" line="358"/> diff --git a/lang/python/cs_CZ/LC_MESSAGES/python.po b/lang/python/cs_CZ/LC_MESSAGES/python.po index 70e9d5b77a4cf7d2c4113611aa41f8390e117c1f..23737551a60da93d239a47e4b6deaa1e9f2c4f80 100644 --- a/lang/python/cs_CZ/LC_MESSAGES/python.po +++ b/lang/python/cs_CZ/LC_MESSAGES/python.po @@ -6,7 +6,7 @@ # Translators: # pavelrz, 2017 # LiberteCzech <martin.kriz.czech@gmail.com>, 2020 -# Pavel Borecki <pavel.borecki@gmail.com>, 2021 +# Pavel Borecki <pavel.borecki@gmail.com>, 2022 # #, fuzzy msgid "" @@ -15,7 +15,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-11-02 15:45+0100\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>, 2021\n" +"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>, 2022\n" "Language-Team: Czech (Czech Republic) (https://www.transifex.com/calamares/teams/20061/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -331,7 +331,7 @@ msgstr "Nedaří se zapnout systemd službu <code>{name!s}</code>." #: src/modules/services-systemd/main.py:67 msgid "Cannot enable systemd timer <code>{name!s}</code>." -msgstr "" +msgstr "Nedaří se zapnout systemd časovač <code>{name!s}</code>." #: src/modules/services-systemd/main.py:71 msgid "Cannot disable systemd target <code>{name!s}</code>." @@ -413,6 +413,8 @@ msgid "" "Failed to find unsquashfs, make sure you have the squashfs-tools package " "installed." msgstr "" +"Nepodařilo se nalézt nástroj unsquashfs – ověřte, že je nainstalovaný " +"balíček squashfs-tools." #: src/modules/unpackfs/main.py:479 msgid "The destination \"{}\" in the target system is not a directory" diff --git a/lang/python/ja-Hira/LC_MESSAGES/python.po b/lang/python/ja-Hira/LC_MESSAGES/python.po new file mode 100644 index 0000000000000000000000000000000000000000..9a869c5bcd743194113d95beda208e42f1285bc8 --- /dev/null +++ b/lang/python/ja-Hira/LC_MESSAGES/python.po @@ -0,0 +1,385 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-11-02 15:45+0100\n" +"PO-Revision-Date: 2017-08-09 10:34+0000\n" +"Language-Team: Japanese (Hiragana) (https://www.transifex.com/calamares/teams/20061/ja-Hira/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja-Hira\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: src/modules/initramfscfg/main.py:32 +msgid "Configuring initramfs." +msgstr "" + +#: src/modules/initramfscfg/main.py:85 src/modules/initramfscfg/main.py:89 +#: src/modules/fstab/main.py:355 src/modules/fstab/main.py:361 +#: src/modules/fstab/main.py:388 src/modules/networkcfg/main.py:105 +#: src/modules/initcpiocfg/main.py:227 src/modules/initcpiocfg/main.py:231 +#: src/modules/localecfg/main.py:135 src/modules/mount/main.py:144 +#: src/modules/rawfs/main.py:164 src/modules/openrcdmcryptcfg/main.py:72 +#: src/modules/openrcdmcryptcfg/main.py:76 +#: src/modules/luksopenswaphookcfg/main.py:86 +#: src/modules/luksopenswaphookcfg/main.py:90 +msgid "Configuration Error" +msgstr "" + +#: src/modules/initramfscfg/main.py:86 src/modules/fstab/main.py:356 +#: src/modules/initcpiocfg/main.py:228 src/modules/mount/main.py:145 +#: src/modules/rawfs/main.py:165 src/modules/openrcdmcryptcfg/main.py:73 +#: src/modules/luksopenswaphookcfg/main.py:87 +msgid "No partitions are defined for <pre>{!s}</pre> to use." +msgstr "" + +#: src/modules/initramfscfg/main.py:90 src/modules/fstab/main.py:362 +#: src/modules/networkcfg/main.py:106 src/modules/initcpiocfg/main.py:232 +#: src/modules/localecfg/main.py:136 src/modules/openrcdmcryptcfg/main.py:77 +#: src/modules/luksopenswaphookcfg/main.py:91 +msgid "No root mount point is given for <pre>{!s}</pre> to use." +msgstr "" + +#: src/modules/grubcfg/main.py:28 +msgid "Configure GRUB." +msgstr "" + +#: src/modules/bootloader/main.py:43 +msgid "Install bootloader." +msgstr "" + +#: src/modules/bootloader/main.py:508 +msgid "Bootloader installation error" +msgstr "" + +#: src/modules/bootloader/main.py:509 +msgid "" +"The bootloader could not be installed. The installation command " +"<pre>{!s}</pre> returned error code {!s}." +msgstr "" + +#: src/modules/fstab/main.py:29 +msgid "Writing fstab." +msgstr "" + +#: src/modules/fstab/main.py:389 +msgid "No <pre>{!s}</pre> configuration is given for <pre>{!s}</pre> to use." +msgstr "" + +#: src/modules/dracut/main.py:27 +msgid "Creating initramfs with dracut." +msgstr "" + +#: src/modules/dracut/main.py:49 +msgid "Failed to run dracut on the target" +msgstr "" + +#: src/modules/dracut/main.py:50 src/modules/mkinitfs/main.py:50 +msgid "The exit code was {}" +msgstr "" + +#: src/modules/displaymanager/main.py:526 +msgid "Cannot write KDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:527 +msgid "KDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:588 +msgid "Cannot write LXDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:589 +msgid "LXDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:672 +msgid "Cannot write LightDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:673 +msgid "LightDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:747 +msgid "Cannot configure LightDM" +msgstr "" + +#: src/modules/displaymanager/main.py:748 +msgid "No LightDM greeter installed." +msgstr "" + +#: src/modules/displaymanager/main.py:779 +msgid "Cannot write SLIM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:780 +msgid "SLIM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:906 +msgid "No display managers selected for the displaymanager module." +msgstr "" + +#: src/modules/displaymanager/main.py:907 +msgid "" +"The displaymanagers list is empty or undefined in both globalstorage and " +"displaymanager.conf." +msgstr "" + +#: src/modules/displaymanager/main.py:989 +msgid "Display manager configuration was incomplete" +msgstr "" + +#: src/modules/services-openrc/main.py:29 +msgid "Configure OpenRC services" +msgstr "" + +#: src/modules/services-openrc/main.py:57 +msgid "Cannot add service {name!s} to run-level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:59 +msgid "Cannot remove service {name!s} from run-level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:61 +msgid "" +"Unknown service-action <code>{arg!s}</code> for service {name!s} in run-" +"level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:93 +#: src/modules/services-systemd/main.py:59 +msgid "Cannot modify service" +msgstr "" + +#: src/modules/services-openrc/main.py:94 +msgid "" +"<code>rc-update {arg!s}</code> call in chroot returned error code {num!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:101 +msgid "Target runlevel does not exist" +msgstr "" + +#: src/modules/services-openrc/main.py:102 +msgid "" +"The path for runlevel {level!s} is <code>{path!s}</code>, which does not " +"exist." +msgstr "" + +#: src/modules/services-openrc/main.py:110 +msgid "Target service does not exist" +msgstr "" + +#: src/modules/services-openrc/main.py:111 +msgid "" +"The path for service {name!s} is <code>{path!s}</code>, which does not " +"exist." +msgstr "" + +#: src/modules/networkcfg/main.py:29 +msgid "Saving network configuration." +msgstr "" + +#: src/modules/packages/main.py:50 src/modules/packages/main.py:59 +#: src/modules/packages/main.py:69 +msgid "Install packages." +msgstr "" + +#: src/modules/packages/main.py:57 +#, python-format +msgid "Processing packages (%(count)d / %(total)d)" +msgstr "" + +#: src/modules/packages/main.py:62 +#, python-format +msgid "Installing one package." +msgid_plural "Installing %(num)d packages." +msgstr[0] "" + +#: src/modules/packages/main.py:65 +#, python-format +msgid "Removing one package." +msgid_plural "Removing %(num)d packages." +msgstr[0] "" + +#: src/modules/packages/main.py:638 src/modules/packages/main.py:650 +#: src/modules/packages/main.py:678 +msgid "Package Manager error" +msgstr "" + +#: src/modules/packages/main.py:639 +msgid "" +"The package manager could not prepare updates. The command <pre>{!s}</pre> " +"returned error code {!s}." +msgstr "" + +#: src/modules/packages/main.py:651 +msgid "" +"The package manager could not update the system. The command <pre>{!s}</pre>" +" returned error code {!s}." +msgstr "" + +#: src/modules/packages/main.py:679 +msgid "" +"The package manager could not make changes to the installed system. The " +"command <pre>{!s}</pre> returned error code {!s}." +msgstr "" + +#: src/modules/plymouthcfg/main.py:27 +msgid "Configure Plymouth theme" +msgstr "" + +#: src/modules/initcpiocfg/main.py:28 +msgid "Configuring mkinitcpio." +msgstr "" + +#: src/modules/localecfg/main.py:30 +msgid "Configuring locales." +msgstr "" + +#: src/modules/mount/main.py:30 +msgid "Mounting partitions." +msgstr "" + +#: src/modules/rawfs/main.py:26 +msgid "Installing data." +msgstr "" + +#: src/modules/dummypython/main.py:35 +msgid "Dummy python job." +msgstr "" + +#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:93 +#: src/modules/dummypython/main.py:94 +msgid "Dummy python step {}" +msgstr "" + +#: src/modules/hwclock/main.py:26 +msgid "Setting hardware clock." +msgstr "" + +#: src/modules/umount/main.py:31 +msgid "Unmount file systems." +msgstr "" + +#: src/modules/openrcdmcryptcfg/main.py:26 +msgid "Configuring OpenRC dmcrypt service." +msgstr "" + +#: src/modules/services-systemd/main.py:26 +msgid "Configure systemd services" +msgstr "" + +#: src/modules/services-systemd/main.py:60 +msgid "" +"<code>systemctl {arg!s}</code> call in chroot returned error code {num!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:63 +#: src/modules/services-systemd/main.py:69 +msgid "Cannot enable systemd service <code>{name!s}</code>." +msgstr "" + +#: src/modules/services-systemd/main.py:65 +msgid "Cannot enable systemd target <code>{name!s}</code>." +msgstr "" + +#: src/modules/services-systemd/main.py:67 +msgid "Cannot enable systemd timer <code>{name!s}</code>." +msgstr "" + +#: src/modules/services-systemd/main.py:71 +msgid "Cannot disable systemd target <code>{name!s}</code>." +msgstr "" + +#: src/modules/services-systemd/main.py:73 +msgid "Cannot mask systemd unit <code>{name!s}</code>." +msgstr "" + +#: src/modules/services-systemd/main.py:75 +msgid "" +"Unknown systemd commands <code>{command!s}</code> and " +"<code>{suffix!s}</code> for unit {name!s}." +msgstr "" + +#: src/modules/mkinitfs/main.py:27 +msgid "Creating initramfs with mkinitfs." +msgstr "" + +#: src/modules/mkinitfs/main.py:49 +msgid "Failed to run mkinitfs on the target" +msgstr "" + +#: src/modules/unpackfs/main.py:34 +msgid "Filling up filesystems." +msgstr "" + +#: src/modules/unpackfs/main.py:254 +msgid "rsync failed with error code {}." +msgstr "" + +#: src/modules/unpackfs/main.py:299 +msgid "Unpacking image {}/{}, file {}/{}" +msgstr "" + +#: src/modules/unpackfs/main.py:314 +msgid "Starting to unpack {}" +msgstr "" + +#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:465 +msgid "Failed to unpack image \"{}\"" +msgstr "" + +#: src/modules/unpackfs/main.py:430 +msgid "No mount point for root partition" +msgstr "" + +#: src/modules/unpackfs/main.py:431 +msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing" +msgstr "" + +#: src/modules/unpackfs/main.py:436 +msgid "Bad mount point for root partition" +msgstr "" + +#: src/modules/unpackfs/main.py:437 +msgid "rootMountPoint is \"{}\", which does not exist, doing nothing" +msgstr "" + +#: src/modules/unpackfs/main.py:453 src/modules/unpackfs/main.py:457 +#: src/modules/unpackfs/main.py:463 src/modules/unpackfs/main.py:478 +msgid "Bad unsquash configuration" +msgstr "" + +#: src/modules/unpackfs/main.py:454 +msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel" +msgstr "" + +#: src/modules/unpackfs/main.py:458 +msgid "The source filesystem \"{}\" does not exist" +msgstr "" + +#: src/modules/unpackfs/main.py:464 +msgid "" +"Failed to find unsquashfs, make sure you have the squashfs-tools package " +"installed." +msgstr "" + +#: src/modules/unpackfs/main.py:479 +msgid "The destination \"{}\" in the target system is not a directory" +msgstr "" + +#: src/modules/luksopenswaphookcfg/main.py:26 +msgid "Configuring encrypted swap." +msgstr "" diff --git a/lang/python/zh_CN/LC_MESSAGES/python.po b/lang/python/zh_CN/LC_MESSAGES/python.po index 706b02d24419f78f524381fd48502ac60f1e3b12..c6972b0f5cf3845ae9981d9ea43bf08966178c5c 100644 --- a/lang/python/zh_CN/LC_MESSAGES/python.po +++ b/lang/python/zh_CN/LC_MESSAGES/python.po @@ -9,6 +9,7 @@ # Feng Chao <chaofeng111@qq.com>, 2020 # Bobby Rong <admin@bobby285271.top>, 2020 # 玉堂白鹤 <yjwork@qq.com>, 2021 +# Giovanni Schiano-Moriello, 2022 # #, fuzzy msgid "" @@ -17,7 +18,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-11-02 15:45+0100\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: 玉堂白鹤 <yjwork@qq.com>, 2021\n" +"Last-Translator: Giovanni Schiano-Moriello, 2022\n" "Language-Team: Chinese (China) (https://www.transifex.com/calamares/teams/20061/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -305,7 +306,7 @@ msgstr "无法启用 systemd 目标 <code>{name!s}</code>." #: src/modules/services-systemd/main.py:67 msgid "Cannot enable systemd timer <code>{name!s}</code>." -msgstr "" +msgstr "无法启用 systemd 计时器 <code>{name!s}</code>。" #: src/modules/services-systemd/main.py:71 msgid "Cannot disable systemd target <code>{name!s}</code>." @@ -384,7 +385,7 @@ msgstr "源文件系统 \"{}\" 不存在" msgid "" "Failed to find unsquashfs, make sure you have the squashfs-tools package " "installed." -msgstr "" +msgstr "寻找 unsquashfs 失败,请确定您已安装 squashfs-tools 软体包。" #: src/modules/unpackfs/main.py:479 msgid "The destination \"{}\" in the target system is not a directory" diff --git a/src/libcalamares/Job.h b/src/libcalamares/Job.h index 33965e15f43546fa6ceaa6d55258d40d6d8d96f4..dc89f1c495a607383f38c0cccc06ce027adf627e 100644 --- a/src/libcalamares/Job.h +++ b/src/libcalamares/Job.h @@ -47,7 +47,7 @@ public: /** @brief Is this JobResult a success? * - * Equivalent to errorCode() == 0, might be named isValid(). + * Equivalent to errorCode() == 0, see succeeded(). */ virtual operator bool() const; @@ -58,6 +58,11 @@ public: virtual void setDetails( const QString& details ); int errorCode() const { return m_number; } + /** @brief Is this JobResult a success? + * + * Equivalent to errorCode() == 0. + */ + bool succeeded() const { return this->operator bool(); } /// @brief an "ok status" result static JobResult ok(); diff --git a/src/libcalamares/PythonJob.cpp b/src/libcalamares/PythonJob.cpp index b1373f5f32a822457d575c0603985184be93d9ba..ec17c31f3e78e82a3e034e045f390553482e6639 100644 --- a/src/libcalamares/PythonJob.cpp +++ b/src/libcalamares/PythonJob.cpp @@ -100,7 +100,7 @@ BOOST_PYTHON_MODULE( libcalamares ) bp::args( "s" ), "Writes the given string to the Calamares warning stream." ); bp::def( - "error", &CalamaresPython::warning, bp::args( "s" ), "Writes the given string to the Calamares error stream." ); + "error", &CalamaresPython::error, bp::args( "s" ), "Writes the given string to the Calamares error stream." ); // .. YAML functions diff --git a/src/libcalamares/partition/Mount.cpp b/src/libcalamares/partition/Mount.cpp index 89e17a885ba49ccee2dbc1f07d41c5687d3dbf7a..6bc3a7cd2ffb3c21fd6a8c2754f1083d37141252 100644 --- a/src/libcalamares/partition/Mount.cpp +++ b/src/libcalamares/partition/Mount.cpp @@ -14,6 +14,7 @@ #include "partition/Sync.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" +#include "utils/String.h" #include <QDir> #include <QTemporaryDir> @@ -92,7 +93,7 @@ struct TemporaryMount::Private TemporaryMount::TemporaryMount( const QString& devicePath, const QString& filesystemName, const QString& options ) - : m_d( std::make_unique<Private>() ) + : m_d( std::make_unique< Private >() ) { m_d->m_devicePath = devicePath; m_d->m_mountDir.setAutoRemove( false ); @@ -123,5 +124,32 @@ TemporaryMount::path() const return m_d ? m_d->m_mountDir.path() : QString(); } +QList< MtabInfo > +MtabInfo::fromMtabFilteredByPrefix( const QString& mountPrefix, const QString& mtabPath ) +{ + QFile f( mtabPath.isEmpty() ? "/etc/mtab" : mtabPath ); + if ( !f.open( QIODevice::ReadOnly ) ) + { + return {}; + } + + QTextStream in( &f ); + QList< MtabInfo > l; + while ( !f.atEnd() ) + { + QStringList line = in.readLine().split( ' ', SplitSkipEmptyParts ); + if ( line.length() == 3 && !line[ 0 ].startsWith( '#' ) ) + { + // Lines have format: <device> <mountpoint> <options>, so check + // the mountpoint field. Everything starts with an empty string. + if ( line[ 1 ].startsWith( mountPrefix ) ) + { + l.append( { line[ 0 ], line[ 1 ] } ); + } + } + } + return l; +} + } // namespace Partition } // namespace CalamaresUtils diff --git a/src/libcalamares/partition/Mount.h b/src/libcalamares/partition/Mount.h index d088b108fcc127595d2aa5b41fd8795011ec2d8f..f772c33a4c18ada76dcfac96e1fabff6356c6559 100644 --- a/src/libcalamares/partition/Mount.h +++ b/src/libcalamares/partition/Mount.h @@ -14,6 +14,7 @@ #include "DllMacro.h" +#include <QList> #include <QString> #include <QStringList> @@ -50,6 +51,13 @@ DLLEXPORT int mount( const QString& devicePath, */ DLLEXPORT int unmount( const QString& path, const QStringList& options = QStringList() ); + +/** @brief Mount and automatically unmount a device + * + * The TemporaryMount object mounts a filesystem, and is like calling + * the mount() function, above. When the object is destroyed, unmount() + * is called with suitable options to undo the original mount. + */ class DLLEXPORT TemporaryMount { public: @@ -68,6 +76,36 @@ private: std::unique_ptr< Private > m_d; }; + +/** @brief Information about a mount point from /etc/mtab + * + * Entries in /etc/mtab are of the form: <device> <mountpoint> <other> + * This struct only stores device and mountpoint. + * + * The main way of getting these structs is to call fromMtab() to read + * an /etc/mtab-like file and storing all of the entries from it. + */ +struct DLLEXPORT MtabInfo +{ + QString device; + QString mountPoint; + + /** @brief Reads an mtab-like file and returns the entries from it + * + * When @p mtabPath is given, that file is read. If the given name is + * empty (e.g. the default) then /etc/mtab is read, instead. + * + * If @p mountPrefix is given, then only entries that have a mount point + * that starts with that prefix are returned. + */ + static QList< MtabInfo > fromMtabFilteredByPrefix( const QString& mountPrefix = QString(), + const QString& mtabPath = QString() ); + /// @brief Predicate to sort MtabInfo objects by device-name + static bool deviceOrder( const MtabInfo& a, const MtabInfo& b ) { return a.device > b.device; } + /// @brief Predicate to sort MtabInfo objects by mount-point + static bool mountPointOrder( const MtabInfo& a, const MtabInfo& b ) { return a.mountPoint > b.mountPoint; } +}; + } // namespace Partition } // namespace CalamaresUtils diff --git a/src/modules/README.md b/src/modules/README.md index 09696e66bedea990c49845d65fd7866a0b65dc3b..97a8556a1c1e3f6368446d462ad35b159fcbce49 100644 --- a/src/modules/README.md +++ b/src/modules/README.md @@ -67,7 +67,7 @@ Note that process modules are not recommended. Module descriptors **may** have the following keys: - *emergency* (a boolean value, set to true to mark the module - as an emergency module) + as an emergency module; see the section *Emergency Modules*, below) - *noconfig* (a boolean value, set to true to state that the module has no configuration file; defaults to false) - *requiredModules* (a list of modules which are required for this module @@ -102,8 +102,14 @@ to generate a suitable `module.desc`. For Python modules, manually add A module that is marked as an emergency module in its module.desc must **also** set the *emergency* key to *true* in its configuration file (see below). If it does not, the module is not considered to be an emergency -module after all (this is so that you can have modules that have several -instances, only some of which are actually needed for emergencies). +module after all. This is so that you can have modules that have several +instances, only some of which are actually needed for emergencies. + +In summary: +- in `module.desc`, write `emergency: true` to make it **possible** to + run the module in emergency mode, +- in `<modulename>.conf`, write `emergency: true` to make that specific + module run in emergency mode. ### Module-specific configuration @@ -112,6 +118,10 @@ named `<modulename>.conf`. If such a file is present in the module's directory, it can be shipped as a *default* configuration file. This only happens if the CMake-time option `INSTALL_CONFIG` is on. +The name of the configuration file for a given module can be +influenced by the `settings.conf` of the overall Calamares configuration. +By default, though, the module's own name is used. + Modules that have *noconfig* set to true will not attempt to read a configuration file, and will not warn that one is missing; conversely if *noconfig* is set to false (or is missing, since diff --git a/src/modules/bootloader/bootloader.conf b/src/modules/bootloader/bootloader.conf index 9f9ad84aabcc5a33b28522c357520e68031ba05e..b28412b0f1ba0022f79a4b1319e7d0540da38f66 100644 --- a/src/modules/bootloader/bootloader.conf +++ b/src/modules/bootloader/bootloader.conf @@ -46,6 +46,16 @@ efiBootMgr: "efibootmgr" # setting the option here, keep in mind that the name is sanitized # (problematic characters, see above, are replaced). # +# There are some special words possible at the end of *efiBootloaderId*: +# @@SERIAL@@ can be used to obtain a uniquely-numbered suffix +# that is added to the Id (yielding, e.g., `dirname1` or `dirname72`) +# @@RANDOM@@ can be used to obtain a unique 4-digit hex suffix +# @@PHRASE@@ can be used to obtain a unique 1-to-3-word suffix +# from a dictionary of space-themed words +# Note that these must be at the **end** of the *efiBootloaderId* value. +# There must also be at most one of them. If there is none, no suffix- +# processing is done and the *efiBootloaderId* is used unchanged. +# # efiBootloaderId: "dirname" # Optionally install a copy of the GRUB EFI bootloader as the EFI diff --git a/src/modules/bootloader/main.py b/src/modules/bootloader/main.py index 0182d1110a85be83e6d12408743423bae1805fd2..81e271a710b4d986ae655dcfcad46600e4132206 100644 --- a/src/modules/bootloader/main.py +++ b/src/modules/bootloader/main.py @@ -268,10 +268,166 @@ def create_loader(loader_path, entry): loader_file.write(line) -def efi_label(): +class suffix_iterator(object): + """ + Wrapper for one of the "generator" classes below to behave like + a proper Python iterator. The iterator is initialized with a + maximum number of attempts to generate a new suffix. + """ + def __init__(self, attempts, generator): + self.generator = generator + self.attempts = attempts + self.counter = 0 + + def __iter__(self): + return self + + def __next__(self): + self.counter += 1 + if self.counter <= self.attempts: + return self.generator.next() + raise StopIteration + + +class serialEfi(object): + """ + EFI Id generator that appends a serial number to the given name. + """ + def __init__(self, name): + self.name = name + # So the first call to next() will bump it to 0 + self.counter = -1 + + def next(self): + self.counter += 1 + if self.counter > 0: + return "{!s}{!s}".format(self.name, self.counter) + else: + return self.name + + +def render_in_base(value, base_values, length=-1): + """ + Renders @p value in base-N, where N is the number of + items in @p base_values. When rendering, use the items + of @p base_values (e.g. use "0123456789" to get regular decimal + rendering, or "ABCDEFGHIJ" for letters-as-numbers 'encoding'). + + If length is positive, pads out to at least that long with + leading "zeroes", whatever base_values[0] is. + """ + if value < 0: + raise ValueError("Cannot render negative values") + if len(base_values) < 2: + raise ValueError("Insufficient items for base-N rendering") + if length < 1: + length = 1 + digits = [] + base = len(base_values) + while value > 0: + place = value % base + value = value // base + digits.append(base_values[place]) + while len(digits) < length: + digits.append(base_values[0]) + return "".join(reversed(digits)) + + +class randomEfi(object): + """ + EFI Id generator that appends a random 4-digit hex number to the given name. + """ + def __init__(self, name): + self.name = name + # So the first call to next() will bump it to 0 + self.counter = -1 + + def next(self): + self.counter += 1 + if self.counter > 0: + import random + v = random.randint(0, 65535) # 16 bits + return "{!s}{!s}".format(self.name, render_in_base(v, "0123456789ABCDEF", 4)) + else: + return self.name + + +class phraseEfi(object): + """ + EFI Id generator that appends a random phrase to the given name. + """ + words = ("Sun", "Moon", "Mars", "Soyuz", "Falcon", "Kuaizhou", "Gaganyaan") + + def __init__(self, name): + self.name = name + # So the first call to next() will bump it to 0 + self.counter = -1 + + def next(self): + self.counter += 1 + if self.counter > 0: + import random + desired_length = 1 + self.counter // 5 + v = random.randint(0, len(self.words) ** desired_length) + return "{!s}{!s}".format(self.name, render_in_base(v, self.words)) + else: + return self.name + + +def get_efi_suffix_generator(name): + """ + Handle EFI bootloader Ids with @@<something>@@ for suffix-processing. + """ + if "@@" not in name: + raise ValueError("Misplaced call to get_efi_suffix_generator, no @@") + parts = name.split("@@") + if len(parts) != 3: + raise ValueError("EFI Id {!r} is malformed".format(name)) + if parts[2]: + # Supposed to be empty because the string ends with "@@" + raise ValueError("EFI Id {!r} is malformed".format(name)) + if parts[1] not in ("SERIAL", "RANDOM", "PHRASE"): + raise ValueError("EFI suffix {!r} is unknown".format(parts[1])) + + generator = None + if parts[1] == "SERIAL": + generator = serialEfi(parts[0]) + elif parts[1] == "RANDOM": + generator = randomEfi(parts[0]) + elif parts[1] == "PHRASE": + generator = phraseEfi(parts[0]) + if generator is None: + raise ValueError("EFI suffix {!r} is unsupported".format(parts[1])) + + return generator + + +def change_efi_suffix(efi_directory, bootloader_id): + """ + Returns a label based on @p bootloader_id that is usable within + @p efi_directory. If there is a @@<something>@@ suffix marker + in the given id, tries to generate a unique label. + """ + if bootloader_id.endswith("@@"): + # Do 10 attempts with any suffix generator + g = suffix_iterator(10, get_efi_suffix_generator(bootloader_id)) + else: + # Just one attempt + g = [bootloader_id] + + for candidate_name in g: + if not os.path.exists(os.path.join(efi_directory, candidate_name)): + return candidate_name + return bootloader_id + + +def efi_label(efi_directory): + """ + Returns a sanitized label, possibly unique, that can be + used within @p efi_directory. + """ if "efiBootloaderId" in libcalamares.job.configuration: - efi_bootloader_id = libcalamares.job.configuration[ - "efiBootloaderId"] + efi_bootloader_id = change_efi_suffix( efi_directory, calamares.job.configuration["efiBootloaderId"] ) else: branding = libcalamares.globalstorage.value("branding") efi_bootloader_id = branding["bootloaderEntryName"] @@ -390,7 +546,7 @@ def run_grub_mkconfig(partitions, output_file): check_target_env_call([libcalamares.job.configuration["grubMkconfig"], "-o", output_file]) -def run_grub_install(fw_type, partitions, efi_directory=None): +def run_grub_install(fw_type, partitions, efi_directory): """ Runs grub-install in the target environment @@ -407,7 +563,7 @@ def run_grub_install(fw_type, partitions, efi_directory=None): check_target_env_call(["sh", "-c", "echo ZPOOL_VDEV_NAME_PATH=1 >> /etc/environment"]) if fw_type == "efi": - efi_bootloader_id = efi_label() + efi_bootloader_id = efi_label(efi_directory) efi_target, efi_grub_file, efi_boot_file = get_grub_efi_parameters() if is_zfs: @@ -462,7 +618,7 @@ def install_grub(efi_directory, fw_type): if not os.path.isdir(install_efi_directory): os.makedirs(install_efi_directory) - efi_bootloader_id = efi_label() + efi_bootloader_id = efi_label(efi_directory) efi_target, efi_grub_file, efi_boot_file = get_grub_efi_parameters() @@ -506,7 +662,7 @@ def install_secureboot(efi_directory): """ Installs the secureboot shim in the system by calling efibootmgr. """ - efi_bootloader_id = efi_label() + efi_bootloader_id = efi_label(efi_directory) install_path = libcalamares.globalstorage.value("rootMountPoint") install_efi_directory = install_path + efi_directory diff --git a/src/modules/bootloader/tests/CMakeTests.txt b/src/modules/bootloader/tests/CMakeTests.txt new file mode 100644 index 0000000000000000000000000000000000000000..5b16d5009443bebff09e526eebb52b44e9648815 --- /dev/null +++ b/src/modules/bootloader/tests/CMakeTests.txt @@ -0,0 +1,7 @@ +# We have tests to exercise some of the module internals. +# Those tests conventionally live in Python files here in the tests/ directory. Add them. +add_test( + NAME test-bootloader-efiname + COMMAND env PYTHONPATH=.: python3 ${CMAKE_CURRENT_LIST_DIR}/test-bootloader-efiname.py + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} +) diff --git a/src/modules/bootloader/tests/test-bootloader-efiname.py b/src/modules/bootloader/tests/test-bootloader-efiname.py new file mode 100644 index 0000000000000000000000000000000000000000..67cb917471a9819b9aed23e2c61573f6859936f2 --- /dev/null +++ b/src/modules/bootloader/tests/test-bootloader-efiname.py @@ -0,0 +1,64 @@ +# Calamares Boilerplate +import libcalamares +libcalamares.globalstorage = libcalamares.GlobalStorage(None) +libcalamares.globalstorage.insert("testing", True) + +# Module prep-work +from src.modules.bootloader import main + +# Specific Bootloader test +g = main.get_efi_suffix_generator("derp@@SERIAL@@") +assert g is not None +assert g.next() == "derp" # First time, no suffix +for n in range(9): + print(g.next()) +# We called next() 10 times in total, starting from 0 +assert g.next() == "derp10" + +g = main.get_efi_suffix_generator("derp@@RANDOM@@") +assert g is not None +for n in range(10): + print(g.next()) +# it's random, nothing to assert + +g = main.get_efi_suffix_generator("derp@@PHRASE@@") +assert g is not None +for n in range(10): + print(g.next()) +# it's random, nothing to assert + +# Check invalid things +try: + g = main.get_efi_suffix_generator("derp") + raise TypeError("Shouldn't get generator (no indicator)") +except ValueError as e: + pass + +try: + g = main.get_efi_suffix_generator("derp@@HEX@@") + raise TypeError("Shouldn't get generator (unknown indicator)") +except ValueError as e: + pass + +try: + g = main.get_efi_suffix_generator("derp@@SERIAL@@x") + raise TypeError("Shouldn't get generator (trailing garbage)") +except ValueError as e: + pass + +try: + g = main.get_efi_suffix_generator("derp@@SERIAL@@@@RANDOM@@") + raise TypeError("Shouldn't get generator (multiple indicators)") +except ValueError as e: + pass + + +# Try the generator (assuming no calamares- test files exist in /tmp) +import os +assert "calamares-single" == main.change_efi_suffix("/tmp", "calamares-single") +assert "calamares-serial" == main.change_efi_suffix("/tmp", "calamares-serial@@SERIAL@@") +try: + os.makedirs("/tmp/calamares-serial", exist_ok=True) + assert "calamares-serial1" == main.change_efi_suffix("/tmp", "calamares-serial@@SERIAL@@") +finally: + os.rmdir("/tmp/calamares-serial") diff --git a/src/modules/initcpio/InitcpioJob.cpp b/src/modules/initcpio/InitcpioJob.cpp index b96f3b3168748b53ef8d5347a4802476516158d3..df995ccbf6df49e9379ccbc766c739475418038f 100644 --- a/src/modules/initcpio/InitcpioJob.cpp +++ b/src/modules/initcpio/InitcpioJob.cpp @@ -1,6 +1,7 @@ /* === This file is part of Calamares - <https://calamares.io> === * * SPDX-FileCopyrightText: 2019 Adriaan de Groot <groot@kde.org> + * SPDX-FileCopyrightText: 2022 Evan James <dalto@fastmail.com> * SPDX-License-Identifier: GPL-3.0-or-later * * Calamares is Free Software: see the License-Identifier above. @@ -31,15 +32,22 @@ InitcpioJob::prettyName() const return tr( "Creating initramfs with mkinitcpio." ); } +/** @brief Sets secure permissions on each initramfs + * + * Iterates over each initramfs contained directly in the directory @p d. + * For each initramfs found, the permissions are set to owner read/write only. + * + */ void fixPermissions( const QDir& d ) { - for ( const auto& fi : d.entryInfoList( { "initramfs*" }, QDir::Files ) ) + const auto initramList = d.entryInfoList( { "initramfs*" }, QDir::Files ); + for ( const auto& fi : initramList ) { QFile f( fi.absoluteFilePath() ); if ( f.exists() ) { - cDebug() << "initcpio fixing permissions for" << f.fileName(); + cDebug() << "initcpio setting permissions for" << f.fileName(); f.setPermissions( QFileDevice::ReadOwner | QFileDevice::WriteOwner ); } } @@ -63,9 +71,19 @@ InitcpioJob::exec() } } + // If the kernel option isn't set to a specific kernel, run mkinitcpio on all kernels + QStringList command = { "mkinitcpio" }; + if ( m_kernel.isEmpty() || m_kernel == "all" ) + { + command.append( "-P" ); + } + else + { + command.append( { "-p", m_kernel } ); + } + cDebug() << "Updating initramfs with kernel" << m_kernel; - auto r = CalamaresUtils::System::instance()->targetEnvCommand( - { "mkinitcpio", "-p", m_kernel }, QString(), QString() /* no timeout , 0 */ ); + auto r = CalamaresUtils::System::instance()->targetEnvCommand( command, QString(), QString() /* no timeout , 0 */ ); return r.explainProcess( "mkinitcpio", std::chrono::seconds( 10 ) /* fake timeout */ ); } @@ -73,28 +91,6 @@ void InitcpioJob::setConfigurationMap( const QVariantMap& configurationMap ) { m_kernel = CalamaresUtils::getString( configurationMap, "kernel" ); - if ( m_kernel.isEmpty() ) - { - m_kernel = QStringLiteral( "all" ); - } - else if ( m_kernel == "$uname" ) - { - auto r = CalamaresUtils::System::runCommand( CalamaresUtils::System::RunLocation::RunInHost, - { "/bin/uname", "-r" }, - QString(), - QString(), - std::chrono::seconds( 3 ) ); - if ( r.getExitCode() == 0 ) - { - m_kernel = r.getOutput(); - cDebug() << "*initcpio* using running kernel" << m_kernel; - } - else - { - cWarning() << "*initcpio* could not determine running kernel, using 'all'." << Logger::Continuation - << r.getExitCode() << r.getOutput(); - } - } m_unsafe = CalamaresUtils::getBool( configurationMap, "be_unsafe", false ); } diff --git a/src/modules/initcpio/initcpio.conf b/src/modules/initcpio/initcpio.conf index 717a511df71e4bdfb6144f502599b654e29292f5..d2a126864714fe16205df2acbea2e0fd7103d629 100644 --- a/src/modules/initcpio/initcpio.conf +++ b/src/modules/initcpio/initcpio.conf @@ -5,21 +5,22 @@ --- # This key defines the kernel to be loaded. # It can have the following values: -# - empty or unset, interpreted as "all" -# - the literal string "$uname" (without quotes, with dollar), -# which will use the output of `uname -r` to determine the -# running kernel, and use that. -# - any other string. +# - the name of a single mkinitcpio preset +# - empty or unset +# - the literal string "all" # -# Whatever is set, that string is passed as *preset* argument to the -# `-p` option of *mkinitcpio*. Take care that both "$uname" operates -# in the host system, and might not be correct if the target system is -# updated (to a newer kernel) as part of the installation. +# If kernel is set to "all" or empty/unset then mkinitpio is called for all +# kernels. Otherwise it is called with a single preset with the value +# contained in kernel. # -# Note that "all" is probably not a good preset to use either. -kernel: linux312 +kernel: linux # Set this to true to turn off mitigations for lax file # permissions on initramfs (which, in turn, can compromise # your LUKS encryption keys, CVS-2019-13179). +# +# If your initramfs are stored in the EFI partition or another non-POSIX +# filesystem, this has no effect as the file permissions cannot be changed. +# In this case, ensure the partition is mounted securely. +# be_unsafe: false diff --git a/src/modules/initcpiocfg/main.py b/src/modules/initcpiocfg/main.py index 8fc30582901e336e0791bf83ce23f87f9369b9fc..1fd4af714c37a9701df803406933523bf3cce23d 100644 --- a/src/modules/initcpiocfg/main.py +++ b/src/modules/initcpiocfg/main.py @@ -180,7 +180,8 @@ def find_initcpio_features(partitions, root_mount_point): if partition["fs"] == "btrfs": uses_btrfs = True - if partition["fs"] == "zfs": + # In addition to checking the filesystem, check to ensure that zfs is enabled + if partition["fs"] == "zfs" and libcalamares.globalstorage.contains("zfsPoolInfo"): uses_zfs = True if "lvm2" in partition["fs"]: diff --git a/src/modules/initramfs/InitramfsJob.cpp b/src/modules/initramfs/InitramfsJob.cpp index 1b10a1a05a7c23d978fc50f57485970683dc46f4..d83b4673cfe482671281f64bd1d295a81023e1ae 100644 --- a/src/modules/initramfs/InitramfsJob.cpp +++ b/src/modules/initramfs/InitramfsJob.cpp @@ -81,6 +81,7 @@ InitramfsJob::setConfigurationMap( const QVariantMap& configurationMap ) } else { + m_kernel = QStringLiteral( "all" ); cWarning() << "*initramfs* could not determine running kernel, using 'all'." << Logger::Continuation << r.getExitCode() << r.getOutput(); } diff --git a/src/modules/locale/Config.cpp b/src/modules/locale/Config.cpp index ce48edd8242db2f3cbc1cdbefd784972ea46a188..8593f83857853202d66f8a8b2f060cbb094b7ad4 100644 --- a/src/modules/locale/Config.cpp +++ b/src/modules/locale/Config.cpp @@ -221,6 +221,11 @@ Config::setCurrentLocation() { setCurrentLocation( m_startingTimezone.first, m_startingTimezone.second ); } + if ( !m_selectedLocaleConfiguration.explicit_lang ) + { + auto newLocale = automaticLocaleConfiguration(); + setLanguage( newLocale.language() ); + } } void @@ -252,15 +257,21 @@ Config::setCurrentLocation( const QString& regionName, const QString& zoneName ) void Config::setCurrentLocation( const CalamaresUtils::Locale::TimeZoneData* location ) { - if ( location != m_currentLocation ) + const bool updateLocation = ( location != m_currentLocation ); + if ( updateLocation ) { m_currentLocation = location; - // Overwrite those settings that have not been made explicit. - auto newLocale = automaticLocaleConfiguration(); - if ( !m_selectedLocaleConfiguration.explicit_lang ) - { - setLanguage( newLocale.language() ); - } + } + + // lang should be always be updated + auto newLocale = automaticLocaleConfiguration(); + if ( !m_selectedLocaleConfiguration.explicit_lang ) + { + setLanguage( newLocale.language() ); + } + + if ( updateLocation ) + { if ( !m_selectedLocaleConfiguration.explicit_lc ) { m_selectedLocaleConfiguration.lc_numeric = newLocale.lc_numeric; diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py index 10371777e6276b18882d2765265ca9bc51f01105..59777cedbc88dc0f2cf1bcfb7b68e21ce9a40c1f 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -382,7 +382,7 @@ class PMPacman(PackageManager): def line_cb(line): if line.startswith(":: "): - self.in_package_changes = "package changes" in line + self.in_package_changes = "package" in line or "hooks" in line else: if self.in_package_changes and line.endswith("...\n"): # Update the message, untranslated; do not change the @@ -392,7 +392,7 @@ class PMPacman(PackageManager): global custom_status_message custom_status_message = "pacman: " + line.strip() libcalamares.job.setprogress(self.progress_fraction) - libcalamares.utils.debug(line) + libcalamares.utils.debug(line) self.in_package_changes = False self.line_cb = line_cb @@ -444,8 +444,12 @@ class PMPacman(PackageManager): else: command.append("-S") + # Don't ask for user intervention, take the default action command.append("--noconfirm") + # Don't report download progress for each file + command.append("--noprogressbar") + if self.pacman_needed_only is True: command.append("--needed") diff --git a/src/modules/partition/jobs/ClearTempMountsJob.cpp b/src/modules/partition/jobs/ClearTempMountsJob.cpp index ffbc35044d14de7a5ba65f1925ae84e7c49aaa4f..6219de004a4698a8098ea1397c14d3ba0d1a60e3 100644 --- a/src/modules/partition/jobs/ClearTempMountsJob.cpp +++ b/src/modules/partition/jobs/ClearTempMountsJob.cpp @@ -9,6 +9,7 @@ #include "ClearTempMountsJob.h" +#include "partition/Mount.h" #include "utils/Logger.h" #include "utils/String.h" @@ -45,51 +46,23 @@ ClearTempMountsJob::exec() { Logger::Once o; // Fetch a list of current mounts to Calamares temporary directories. - QList< QPair< QString, QString > > lst; - QFile mtab( "/etc/mtab" ); - if ( !mtab.open( QFile::ReadOnly | QFile::Text ) ) - { - return Calamares::JobResult::error( tr( "Cannot get list of temporary mounts." ) ); - } + using MtabInfo = CalamaresUtils::Partition::MtabInfo; + auto targetMounts = MtabInfo::fromMtabFilteredByPrefix( QStringLiteral( "/tmp/calamares-" ) ); - cVerbose() << o << "Opened mtab. Lines:"; - QTextStream in( &mtab ); - QString lineIn = in.readLine(); - while ( !lineIn.isNull() ) - { - QStringList line = lineIn.split( ' ', SplitSkipEmptyParts ); - cVerbose() << o << line.join( ' ' ); - QString device = line.at( 0 ); - QString mountPoint = line.at( 1 ); - if ( mountPoint.startsWith( "/tmp/calamares-" ) ) - { - lst.append( qMakePair( device, mountPoint ) ); - } - lineIn = in.readLine(); - } - - if ( lst.empty() ) + if ( targetMounts.isEmpty() ) { return Calamares::JobResult::ok(); } - - std::sort( - lst.begin(), lst.end(), []( const QPair< QString, QString >& a, const QPair< QString, QString >& b ) -> bool { - return a.first > b.first; - } ); + std::sort( targetMounts.begin(), targetMounts.end(), MtabInfo::mountPointOrder ); QStringList goodNews; - QProcess process; - - for ( const auto& line : qAsConst( lst ) ) + for ( const auto& m : qAsConst( targetMounts ) ) { - QString partPath = line.second; - cDebug() << o << "Will try to umount path" << partPath; - process.start( "umount", { "-lv", partPath } ); - process.waitForFinished(); - if ( process.exitCode() == 0 ) + cDebug() << o << "Will try to umount path" << m.mountPoint; + if ( CalamaresUtils::Partition::unmount( m.mountPoint, { "-lv" } ) == 0 ) { - goodNews.append( QString( "Successfully unmounted %1." ).arg( partPath ) ); + // Returns the program's exit code, so 0 is success + goodNews.append( QString( "Successfully unmounted %1." ).arg( m.mountPoint ) ); } } diff --git a/src/modules/partition/jobs/FormatPartitionJob.cpp b/src/modules/partition/jobs/FormatPartitionJob.cpp index 1ccc6e61796bc82e4f47ff0d1e70c4ce0fd42abb..63d23342616ceb65cd97be314b3dc2def6392c2a 100644 --- a/src/modules/partition/jobs/FormatPartitionJob.cpp +++ b/src/modules/partition/jobs/FormatPartitionJob.cpp @@ -14,6 +14,7 @@ #include "core/KPMHelpers.h" #include "partition/FileSystem.h" +#include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" #include <kpmcore/core/device.h> @@ -67,7 +68,18 @@ FormatPartitionJob::prettyStatusMessage() const Calamares::JobResult FormatPartitionJob::exec() { - return KPMHelpers::execute( CreateFileSystemOperation( *m_device, *m_partition, m_partition->fileSystem().type() ), - tr( "The installer failed to format partition %1 on disk '%2'." ) - .arg( m_partition->partitionPath(), m_device->name() ) ); + const auto fsType = m_partition->fileSystem().type(); + auto r = KPMHelpers::execute( CreateFileSystemOperation( *m_device, *m_partition, fsType ), + tr( "The installer failed to format partition %1 on disk '%2'." ) + .arg( m_partition->partitionPath(), m_device->name() ) ); + if ( fsType == FileSystem::Xfs && r.succeeded() ) + { + // We are going to try to set modern timestamps for the filesystem, + // (ignoring whether this succeeds). Requires a sufficiently-new + // xfs_admin and xfs_repair and might be made obsolete by newer + // kpmcore releases. + CalamaresUtils::System::runCommand( { "xfs_admin", "-O", "bigtime=1", m_partition->partitionPath() }, + std::chrono::seconds( 60 ) ); + } + return r; } diff --git a/src/modules/umount/CMakeLists.txt b/src/modules/umount/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..d728470073150cbcc4923392e37ffa801594fb58 --- /dev/null +++ b/src/modules/umount/CMakeLists.txt @@ -0,0 +1,19 @@ +# === This file is part of Calamares - <https://calamares.io> === +# +# SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org> +# SPDX-License-Identifier: BSD-2-Clause +# +calamares_add_plugin( umount + TYPE job + EXPORT_MACRO PLUGINDLLEXPORT_PRO + SOURCES + UmountJob.cpp + SHARED_LIB + EMERGENCY +) + +calamares_add_test( + umounttest + SOURCES + Tests.cpp +) diff --git a/src/modules/umount/Tests.cpp b/src/modules/umount/Tests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dc0198619cfc19e420964fc0ddab29e0a440ddba --- /dev/null +++ b/src/modules/umount/Tests.cpp @@ -0,0 +1,52 @@ +/* === This file is part of Calamares - <https://calamares.io> === + * + * SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org> + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Calamares is Free Software: see the License-Identifier above. + * + */ + +#include "UmountJob.h" + +#include "GlobalStorage.h" +#include "JobQueue.h" +#include "utils/CalamaresUtilsSystem.h" +#include "utils/Logger.h" + +#include <QDir> +#include <QFile> +#include <QtTest/QtTest> + +// Internals of UmountJob.cpp + +// Actual tests +class UmountTests : public QObject +{ + Q_OBJECT +public: + UmountTests() {} + ~UmountTests() override {} + +private Q_SLOTS: + void initTestCase(); + void testTrue(); +}; + +void +UmountTests::initTestCase() +{ + Logger::setupLogLevel( Logger::LOGDEBUG ); +} + +void +UmountTests::testTrue() +{ + QVERIFY( true ); +} + +QTEST_GUILESS_MAIN( UmountTests ) + +#include "utils/moc-warnings.h" + +#include "Tests.moc" diff --git a/src/modules/umount/UmountJob.cpp b/src/modules/umount/UmountJob.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b9d92fa87c345b59db39c5efba57bbe6a7a380e3 --- /dev/null +++ b/src/modules/umount/UmountJob.cpp @@ -0,0 +1,158 @@ +/* === This file is part of Calamares - <https://calamares.io> === + * + * Tags from the Python version of this module: + * SPDX-FileCopyrightText: 2014 Aurélien Gâteau <agateau@kde.org> + * SPDX-FileCopyrightText: 2016 Anke Boersma <demm@kaosx.us> + * SPDX-FileCopyrightText: 2018 Adriaan de Groot <groot@kde.org> + * Tags for the C++ version of this module: + * SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org> + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Calamares is Free Software: see the License-Identifier above. + * + */ + +#include "UmountJob.h" + +#include "partition/Mount.h" +#include "utils/CalamaresUtilsSystem.h" +#include "utils/Logger.h" +#include "utils/Variant.h" + +#include "GlobalStorage.h" +#include "JobQueue.h" + +#include <QCoreApplication> +#include <QDir> +#include <QList> + +UmountJob::UmountJob( QObject* parent ) + : Calamares::CppJob( parent ) +{ +} + +UmountJob::~UmountJob() {} + +QString +UmountJob::prettyName() const +{ + return tr( "Unmount file systems." ); +} + +static Calamares::JobResult +unmountTargetMounts( const QString& rootMountPoint ) +{ + QDir targetMount( rootMountPoint ); + if ( !targetMount.exists() ) + { + return Calamares::JobResult::internalError( + QCoreApplication::translate( UmountJob::staticMetaObject.className(), "Could not unmount target system." ), + QCoreApplication::translate( UmountJob::staticMetaObject.className(), + "The target system is not mounted at '%1'." ) + .arg( rootMountPoint ), + Calamares::JobResult::GenericError ); + } + QString targetMountPath = targetMount.absolutePath(); + if ( !targetMountPath.endsWith( '/' ) ) + { + targetMountPath.append( '/' ); + } + + using MtabInfo = CalamaresUtils::Partition::MtabInfo; + auto targetMounts = MtabInfo::fromMtabFilteredByPrefix( targetMountPath ); + std::sort( targetMounts.begin(), targetMounts.end(), MtabInfo::mountPointOrder ); + + for ( const auto& m : qAsConst( targetMounts ) ) + { + if ( CalamaresUtils::Partition::unmount( m.mountPoint, { "-lv" } ) ) + { + // Returns the program's exit code, so 0 is success + return Calamares::JobResult::error( + QCoreApplication::translate( UmountJob::staticMetaObject.className(), + "Could not unmount target system." ), + QCoreApplication::translate( UmountJob::staticMetaObject.className(), + "The device '%1' is mounted in the target system. It is mounted at '%2'. " + "The device could not be unmounted." ) + .arg( m.device, m.mountPoint ) ); + } + } + return Calamares::JobResult::ok(); +} + +static Calamares::JobResult +exportZFSPools( const QString& rootMountPoint ) +{ + auto* gs = Calamares::JobQueue::instance()->globalStorage(); + QStringList poolNames; + { + // The pools are dictionaries / VariantMaps + auto zfs_pool_list = gs->value( "zfsPoolInfo" ).toList(); + for ( const auto& v : zfs_pool_list ) + { + auto m = v.toMap(); + QString poolName = m.value( "poolName" ).toString(); + if ( !poolName.isEmpty() ) + { + poolNames.append( poolName ); + } + } + poolNames.sort(); + } + + for ( const auto& poolName : poolNames ) + { + auto result = CalamaresUtils::System::runCommand( { "zpool", "export", poolName }, std::chrono::seconds( 30 ) ); + if ( result.getExitCode() ) + { + cWarning() << "Failed to export pool" << result.getOutput(); + } + } + // Exporting ZFS pools does not cause the install to fail + return Calamares::JobResult::ok(); +} + + +Calamares::JobResult +UmountJob::exec() +{ + const auto* sys = CalamaresUtils::System::instance(); + if ( !sys ) + { + return Calamares::JobResult::internalError( + "UMount", tr( "No target system available." ), Calamares::JobResult::InvalidConfiguration ); + } + + Calamares::GlobalStorage* gs + = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr; + if ( !gs || gs->value( "rootMountPoint" ).toString().isEmpty() ) + { + return Calamares::JobResult::internalError( + "UMount", tr( "No rootMountPoint is set." ), Calamares::JobResult::InvalidConfiguration ); + } + + // Do the unmounting of target-system filesystems + { + auto r = unmountTargetMounts( gs->value( "rootMountPoint" ).toString() ); + if ( !r ) + { + return r; + } + } + // For ZFS systems, export the pools + { + auto r = exportZFSPools( gs->value( "rootMountPoint" ).toString() ); + if ( !r ) + { + return r; + } + } + + return Calamares::JobResult::ok(); +} + +void +UmountJob::setConfigurationMap( const QVariantMap& map ) +{ +} + +CALAMARES_PLUGIN_FACTORY_DEFINITION( UmountJobFactory, registerPlugin< UmountJob >(); ) diff --git a/src/modules/umount/UmountJob.h b/src/modules/umount/UmountJob.h new file mode 100644 index 0000000000000000000000000000000000000000..6ca5428bc9a6dce48a1f7dc4424e5859ee23d12c --- /dev/null +++ b/src/modules/umount/UmountJob.h @@ -0,0 +1,41 @@ +/* === This file is part of Calamares - <https://calamares.io> === + * + * SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org> + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Calamares is Free Software: see the License-Identifier above. + * + */ + +#ifndef UMOUNTJOB_H +#define UMOUNTJOB_H + +#include "CppJob.h" +#include "DllMacro.h" +#include "utils/PluginFactory.h" + +#include <QObject> +#include <QStringList> +#include <QVariantMap> + +/** @brief Write 'random' data: machine id, entropy, UUIDs + * + */ +class PLUGINDLLEXPORT UmountJob : public Calamares::CppJob +{ + Q_OBJECT + +public: + explicit UmountJob( QObject* parent = nullptr ); + ~UmountJob() override; + + QString prettyName() const override; + + Calamares::JobResult exec() override; + + void setConfigurationMap( const QVariantMap& configurationMap ) override; +}; + +CALAMARES_PLUGIN_FACTORY_DECLARATION( UmountJobFactory ) + +#endif // UMOUNTJOB_H diff --git a/src/modules/umount/main.py b/src/modules/umount/main.py deleted file mode 100644 index 5fdb360148df24d92a05e79295df723f9debf2d9..0000000000000000000000000000000000000000 --- a/src/modules/umount/main.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# === This file is part of Calamares - <https://calamares.io> === -# -# SPDX-FileCopyrightText: 2014 Aurélien Gâteau <agateau@kde.org> -# SPDX-FileCopyrightText: 2016 Anke Boersma <demm@kaosx.us> -# SPDX-FileCopyrightText: 2018 Adriaan de Groot <groot@kde.org> -# SPDX-License-Identifier: GPL-3.0-or-later -# -# Calamares is Free Software: see the License-Identifier above. -# - -import os -import subprocess -import shutil - -import libcalamares -from libcalamares.utils import gettext_path, gettext_languages - -import gettext -_translation = gettext.translation("calamares-python", - localedir=gettext_path(), - languages=gettext_languages(), - fallback=True) -_ = _translation.gettext -_n = _translation.ngettext - - -def pretty_name(): - return _( "Unmount file systems." ) - - -def list_mounts(root_mount_point): - """ List mount points. - - :param root_mount_point: - :return: - """ - lst = [] - - root_mount_point = os.path.normpath(root_mount_point) - for line in open("/etc/mtab").readlines(): - device, mount_point, _ = line.split(" ", 2) - - if os.path.commonprefix([root_mount_point, mount_point]) == root_mount_point: - lst.append((device, mount_point)) - - return lst - - -def export_zpools(root_mount_point): - """ Exports the zpools if defined in global storage - - :param root_mount_point: The absolute path to the root of the install - :return: - """ - try: - zfs_pool_list = libcalamares.globalstorage.value("zfsPoolInfo") - zfs_pool_list.sort(reverse=True, key=lambda x: x["poolName"]) - if zfs_pool_list: - for zfs_pool in zfs_pool_list: - try: - libcalamares.utils.host_env_process_output(['zpool', 'export', zfs_pool["poolName"]]) - except subprocess.CalledProcessError: - libcalamares.utils.warning("Failed to export zpool") - except Exception as e: - # If this fails it shouldn't cause the installation to fail - libcalamares.utils.warning("Received exception while exporting zpools: " + format(e)) - pass - - -def run(): - """ Unmounts given mountpoints in decreasing order. - - :return: - """ - root_mount_point = libcalamares.globalstorage.value("rootMountPoint") - - if(libcalamares.job.configuration and - "srcLog" in libcalamares.job.configuration and - "destLog" in libcalamares.job.configuration): - libcalamares.utils.warning("Log-file preserving is **deprecated** in the *umount* module") - log_source = libcalamares.job.configuration["srcLog"] - log_destination = libcalamares.job.configuration["destLog"] - # Relocate log_destination into target system - log_destination = '{!s}/{!s}'.format(root_mount_point, log_destination) - # Make sure source is a string - log_source = '{!s}'.format(log_source) - - # copy installation log before umount - if os.path.exists(log_source): - try: - shutil.copy2(log_source, log_destination) - except Exception as e: - libcalamares.utils.warning("Could not preserve file {!s}, " - "error {!s}".format(log_source, e)) - - if not root_mount_point: - return ("No mount point for root partition in globalstorage", - "globalstorage does not contain a \"rootMountPoint\" key, " - "doing nothing") - - if not os.path.exists(root_mount_point): - return ("Bad mount point for root partition in globalstorage", - "globalstorage[\"rootMountPoint\"] is \"{}\", which does not " - "exist, doing nothing".format(root_mount_point)) - - lst = list_mounts(root_mount_point) - # Sort the list by mount point in decreasing order. This way we can be sure - # we unmount deeper dirs first. - lst.sort(key=lambda x: x[1], reverse=True) - - for device, mount_point in lst: - # On success, no output; if the command fails, its output is - # in the exception object. - subprocess.check_output(["umount", "-lv", mount_point], stderr=subprocess.STDOUT) - - export_zpools(root_mount_point) - - os.rmdir(root_mount_point) - - return None diff --git a/src/modules/umount/module.desc b/src/modules/umount/module.desc deleted file mode 100644 index a1c189a6207bf8c8718815ae63bbaa35215ed16c..0000000000000000000000000000000000000000 --- a/src/modules/umount/module.desc +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-FileCopyrightText: no -# SPDX-License-Identifier: CC0-1.0 ---- -type: "job" -name: "umount" -interface: "python" -script: "main.py" diff --git a/src/modules/umount/umount.conf b/src/modules/umount/umount.conf index 7c11f4db64ab6750c604a47eb060340a4b020e06..9fb9227406e95c5b0583f8143b1cadecf3d73e49 100644 --- a/src/modules/umount/umount.conf +++ b/src/modules/umount/umount.conf @@ -4,27 +4,11 @@ ### Umount Module # # This module represents the last part of the installation, the unmounting -# of partitions used for the install. It is also the last place where it -# is possible to copy files to the target system. -# -# The "copy log files" functionality is deprecated; use the *preservefiles* -# module instead, which is more flexible. -# +# of partitions used for the install. After this, there is no regular way +# to modify the target system anymore. # --- -# This is a **deprecated** example. Use the *preservefiles* module -# instead, where the equivalent configuration is this: -# -# files: -# - from: log -# dest: /var/log/installation.log -# -# Note that the "equivalent configuration" always finds the log, -# and is not dependent on specific user names or the vagaries of -# polkit configuration -- so it is a **better** "equivalent". -# -# example when using a log created by `sudo calamares -d`: -#srcLog: "/home/live/installation.log" -#destLog: "/var/log/installation.log" -srcLog: "/bogus/just/do/not/use/this/anymore.txt" +# Setting emergency to true will make it so this module is still run +# when a prior module fails +emergency: false diff --git a/src/modules/umount/umount.schema.yaml b/src/modules/umount/umount.schema.yaml index 9b81db3d9cd5f6c6099739682af044b9f966e98d..37771e5f622c9b96852965196bae8d37ae01955a 100644 --- a/src/modules/umount/umount.schema.yaml +++ b/src/modules/umount/umount.schema.yaml @@ -6,5 +6,4 @@ $id: https://calamares.io/schemas/umount additionalProperties: false type: object properties: - srcLog: { type: string } - destLog: { type: string } + emergency: { type: boolean } diff --git a/src/modules/unpackfs/main.py b/src/modules/unpackfs/main.py index 9f1bd822c9de84f17cc8eae359607eca354d28c2..0330738818c995abcdd24e072ed493f43474c428 100644 --- a/src/modules/unpackfs/main.py +++ b/src/modules/unpackfs/main.py @@ -428,14 +428,16 @@ def run(): if not root_mount_point: libcalamares.utils.warning("No mount point for root partition") return (_("No mount point for root partition"), - _("globalstorage does not contain a \"rootMountPoint\" key, " - "doing nothing")) - + _("globalstorage does not contain a \"rootMountPoint\" key.")) if not os.path.exists(root_mount_point): libcalamares.utils.warning("Bad root mount point \"{}\"".format(root_mount_point)) return (_("Bad mount point for root partition"), - _("rootMountPoint is \"{}\", which does not " - "exist, doing nothing").format(root_mount_point)) + _("rootMountPoint is \"{}\", which does not exist.".format(root_mount_point))) + + if libcalamares.job.configuration.get("unpack", None) is None: + libcalamares.utils.warning("No *unpack* key in job configuration.") + return (_("Bad unpackfs configuration"), + _("There is no configuration information.")) supported_filesystems = get_supported_filesystems() @@ -450,17 +452,17 @@ def run(): if sourcefs not in supported_filesystems: libcalamares.utils.warning("The filesystem for \"{}\" ({}) is not supported by your current kernel".format(source, sourcefs)) libcalamares.utils.warning(" ... modprobe {} may solve the problem".format(sourcefs)) - return (_("Bad unsquash configuration"), + return (_("Bad unpackfs configuration"), _("The filesystem for \"{}\" ({}) is not supported by your current kernel").format(source, sourcefs)) if not os.path.exists(source): libcalamares.utils.warning("The source filesystem \"{}\" does not exist".format(source)) - return (_("Bad unsquash configuration"), + return (_("Bad unpackfs configuration"), _("The source filesystem \"{}\" does not exist").format(source)) if sourcefs == "squashfs": if shutil.which("unsquashfs") is None: libcalamares.utils.warning("Failed to find unsquashfs") - return (_("Bad unsquash configuration"), + return (_("Bad unpackfs configuration"), _("Failed to find unsquashfs, make sure you have the squashfs-tools package installed.") + " " + _("Failed to unpack image \"{}\"").format(source)) @@ -475,7 +477,7 @@ def run(): if not os.path.isdir(destination) and sourcefs != "file": libcalamares.utils.warning(("The destination \"{}\" in the target system is not a directory").format(destination)) if is_first: - return (_("Bad unsquash configuration"), + return (_("Bad unpackfs configuration"), _("The destination \"{}\" in the target system is not a directory").format(destination)) else: libcalamares.utils.debug(".. assuming that the previous targets will create that directory.")