diff --git a/.clang-format b/.clang-format index 997ad379b..cc430e627 100644 --- a/.clang-format +++ b/.clang-format @@ -1,33 +1,32 @@ ---- +--- BasedOnStyle: WebKit AlignAfterOpenBracket: Align -AllowAllParametersOfDeclarationOnNextLine: 'false' +AlignEscapedNewlines: DontAlign +AllowAllParametersOfDeclarationOnNextLine: "false" AllowShortFunctionsOnASingleLine: Inline -AllowShortIfStatementsOnASingleLine: 'false' -AllowShortLoopsOnASingleLine: 'false' +AllowShortIfStatementsOnASingleLine: "false" +AllowShortLoopsOnASingleLine: "false" AlwaysBreakAfterReturnType: TopLevelDefinitions AlwaysBreakTemplateDeclarations: Yes -BinPackArguments: 'false' -BinPackParameters: 'false' +BinPackArguments: "false" +BinPackParameters: "false" BreakBeforeBraces: Allman -BreakBeforeTernaryOperators: 'true' +BreakBeforeTernaryOperators: "true" BreakConstructorInitializers: BeforeComma ColumnLimit: 120 -Cpp11BracedListStyle: 'false' -FixNamespaceComments: 'true' +Cpp11BracedListStyle: "false" +FixNamespaceComments: "true" IncludeBlocks: Preserve -IndentWidth: '4' -MaxEmptyLinesToKeep: '2' +IndentWidth: "4" +MaxEmptyLinesToKeep: "2" NamespaceIndentation: None PointerAlignment: Left -ReflowComments: 'false' -SortIncludes: 'true' -SpaceAfterCStyleCast: 'false' -SpacesBeforeTrailingComments: '2' -SpacesInAngles: 'true' -SpacesInParentheses: 'true' -SpacesInSquareBrackets: 'true' +ReflowComments: "false" +SortIncludes: "true" +SpaceAfterCStyleCast: "false" +SpacesBeforeTrailingComments: "2" +SpacesInAngles: "true" +SpacesInParentheses: "true" +SpacesInSquareBrackets: "true" Standard: Cpp11 - -... diff --git a/src/libcalamares/kdsingleapplicationguard/LICENSE.LGPL.txt b/3rdparty/kdsingleapplicationguard/LICENSE.LGPL.txt similarity index 100% rename from src/libcalamares/kdsingleapplicationguard/LICENSE.LGPL.txt rename to 3rdparty/kdsingleapplicationguard/LICENSE.LGPL.txt diff --git a/src/libcalamares/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp b/3rdparty/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp similarity index 98% rename from src/libcalamares/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp rename to 3rdparty/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp index 56ab8ebe4..77e95e649 100644 --- a/src/libcalamares/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp +++ b/3rdparty/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp @@ -1,3 +1,9 @@ +/* + * SPDX-License-Identifier: LGPL-2.0-only + * License-Filename: LICENSES/LGPLv2-KDAB + * + * The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. + */ #include "kdlockedsharedmemorypointer.h" #if QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN ) diff --git a/src/libcalamares/kdsingleapplicationguard/kdlockedsharedmemorypointer.h b/3rdparty/kdsingleapplicationguard/kdlockedsharedmemorypointer.h similarity index 95% rename from src/libcalamares/kdsingleapplicationguard/kdlockedsharedmemorypointer.h rename to 3rdparty/kdsingleapplicationguard/kdlockedsharedmemorypointer.h index df0ea4998..b9c5d588f 100644 --- a/src/libcalamares/kdsingleapplicationguard/kdlockedsharedmemorypointer.h +++ b/3rdparty/kdsingleapplicationguard/kdlockedsharedmemorypointer.h @@ -1,3 +1,9 @@ +/* + * SPDX-License-Identifier: LGPL-2.0-only + * License-Filename: LICENSES/LGPLv2-KDAB + * + * The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. + */ #ifndef __KDTOOLS__CORE__KDLOCKEDSHAREDMEMORYPOINTER_H__ #define __KDTOOLS__CORE__KDLOCKEDSHAREDMEMORYPOINTER_H__ @@ -74,7 +80,7 @@ public: typedef const T* const_iterator; typedef std::reverse_iterator< const_iterator > const_reverse_iterator; typedef std::reverse_iterator< iterator > reverse_iterator; - + iterator begin() { return get(); } const_iterator begin() const { return get(); } diff --git a/src/libcalamares/kdsingleapplicationguard/kdsharedmemorylocker.cpp b/3rdparty/kdsingleapplicationguard/kdsharedmemorylocker.cpp similarity index 83% rename from src/libcalamares/kdsingleapplicationguard/kdsharedmemorylocker.cpp rename to 3rdparty/kdsingleapplicationguard/kdsharedmemorylocker.cpp index 0c99b8fff..a13a45a27 100644 --- a/src/libcalamares/kdsingleapplicationguard/kdsharedmemorylocker.cpp +++ b/3rdparty/kdsingleapplicationguard/kdsharedmemorylocker.cpp @@ -1,3 +1,9 @@ +/* + * SPDX-License-Identifier: LGPL-2.0-only + * License-Filename: LICENSES/LGPLv2-KDAB + * + * The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. + */ #include "kdsharedmemorylocker.h" #if QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN ) diff --git a/src/libcalamares/kdsingleapplicationguard/kdsharedmemorylocker.h b/3rdparty/kdsingleapplicationguard/kdsharedmemorylocker.h similarity index 77% rename from src/libcalamares/kdsingleapplicationguard/kdsharedmemorylocker.h rename to 3rdparty/kdsingleapplicationguard/kdsharedmemorylocker.h index 7ae83e771..82b759283 100644 --- a/src/libcalamares/kdsingleapplicationguard/kdsharedmemorylocker.h +++ b/3rdparty/kdsingleapplicationguard/kdsharedmemorylocker.h @@ -1,3 +1,9 @@ +/* + * SPDX-License-Identifier: LGPL-2.0-only + * License-Filename: LICENSES/LGPLv2-KDAB + * + * The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. + */ #ifndef __KDTOOLS__CORE__KDSHAREDMEMORYLOCKER_H #define __KDTOOLS__CORE__KDSHAREDMEMORYLOCKER_H diff --git a/src/libcalamares/kdsingleapplicationguard/kdsingleapplicationguard.cpp b/3rdparty/kdsingleapplicationguard/kdsingleapplicationguard.cpp similarity index 99% rename from src/libcalamares/kdsingleapplicationguard/kdsingleapplicationguard.cpp rename to 3rdparty/kdsingleapplicationguard/kdsingleapplicationguard.cpp index ea8ccce33..4c13e1da0 100644 --- a/src/libcalamares/kdsingleapplicationguard/kdsingleapplicationguard.cpp +++ b/3rdparty/kdsingleapplicationguard/kdsingleapplicationguard.cpp @@ -1,3 +1,9 @@ +/* + * SPDX-License-Identifier: LGPL-2.0-only + * License-Filename: LICENSES/LGPLv2-KDAB + * + * The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. + */ #include "kdsingleapplicationguard.h" #if QT_VERSION >= 0x040400 || defined(DOXYGEN_RUN) diff --git a/src/libcalamares/kdsingleapplicationguard/kdsingleapplicationguard.h b/3rdparty/kdsingleapplicationguard/kdsingleapplicationguard.h similarity index 95% rename from src/libcalamares/kdsingleapplicationguard/kdsingleapplicationguard.h rename to 3rdparty/kdsingleapplicationguard/kdsingleapplicationguard.h index d529fdb3e..8ac411a68 100644 --- a/src/libcalamares/kdsingleapplicationguard/kdsingleapplicationguard.h +++ b/3rdparty/kdsingleapplicationguard/kdsingleapplicationguard.h @@ -1,3 +1,9 @@ +/* + * SPDX-License-Identifier: LGPL-2.0-only + * License-Filename: LICENSES/LGPLv2-KDAB + * + * The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. + */ #ifndef KDTOOLSCORE_KDSINGLEAPPLICATIONGUARD_H #define KDTOOLSCORE_KDSINGLEAPPLICATIONGUARD_H diff --git a/src/libcalamares/kdsingleapplicationguard/kdtoolsglobal.cpp b/3rdparty/kdsingleapplicationguard/kdtoolsglobal.cpp similarity index 89% rename from src/libcalamares/kdsingleapplicationguard/kdtoolsglobal.cpp rename to 3rdparty/kdsingleapplicationguard/kdtoolsglobal.cpp index f530cc85b..d3405e82f 100644 --- a/src/libcalamares/kdsingleapplicationguard/kdtoolsglobal.cpp +++ b/3rdparty/kdsingleapplicationguard/kdtoolsglobal.cpp @@ -1,3 +1,9 @@ +/* + * SPDX-License-Identifier: LGPL-2.0-only + * License-Filename: LICENSES/LGPLv2-KDAB + * + * The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. + */ #include "kdtoolsglobal.h" #include diff --git a/src/libcalamares/kdsingleapplicationguard/kdtoolsglobal.h b/3rdparty/kdsingleapplicationguard/kdtoolsglobal.h similarity index 96% rename from src/libcalamares/kdsingleapplicationguard/kdtoolsglobal.h rename to 3rdparty/kdsingleapplicationguard/kdtoolsglobal.h index c0e37ac76..37ca5857e 100644 --- a/src/libcalamares/kdsingleapplicationguard/kdtoolsglobal.h +++ b/3rdparty/kdsingleapplicationguard/kdtoolsglobal.h @@ -1,3 +1,9 @@ +/* + * SPDX-License-Identifier: LGPL-2.0-only + * License-Filename: LICENSES/LGPLv2-KDAB + * + * The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. + */ #ifndef KDTOOLS_KDTOOLSGLOBAL_H #define KDTOOLS_KDTOOLSGLOBAL_H diff --git a/src/libcalamares/kdsingleapplicationguard/pimpl_ptr.cpp b/3rdparty/kdsingleapplicationguard/pimpl_ptr.cpp similarity index 94% rename from src/libcalamares/kdsingleapplicationguard/pimpl_ptr.cpp rename to 3rdparty/kdsingleapplicationguard/pimpl_ptr.cpp index 3045ebc2a..35b52d419 100644 --- a/src/libcalamares/kdsingleapplicationguard/pimpl_ptr.cpp +++ b/3rdparty/kdsingleapplicationguard/pimpl_ptr.cpp @@ -1,3 +1,9 @@ +/* + * SPDX-License-Identifier: LGPL-2.0-only + * License-Filename: LICENSES/LGPLv2-KDAB + * + * The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. + */ #include "pimpl_ptr.h" /*! @@ -9,7 +15,7 @@ (The exception safety of this class has not been evaluated yet.) pimpl_ptr is a smart immutable pointer, which owns the contained object. Unlike other smart pointers, - it creates a standard constructed object when instanciated via the + it creates a standard constructed object when instanciated via the \link pimpl_ptr() standard constructor\endlink. Additionally, pimpl_ptr respects constness of the pointer object and returns \c const \c T* for a const pimpl_ptr object. @@ -126,7 +132,7 @@ */ /*! - \fn T * pimpl_ptr::operator->() + \fn T * pimpl_ptr::operator->() Member-by-pointer operator. Returns get(). */ @@ -163,7 +169,7 @@ KDAB_UNITTEST_SIMPLE( pimpl_ptr, "kdcoretools" ) { } - { + { QPointer< QObject > o; { kdtools::pimpl_ptr< QObject > qobject( new QObject ); @@ -174,7 +180,7 @@ KDAB_UNITTEST_SIMPLE( pimpl_ptr, "kdcoretools" ) { assertNull( o ); } - { + { const kdtools::pimpl_ptr< QObject > qobject( new QObject ); const QObject* o = qobject.get(); assertEqual( o, qobject.operator->() ); diff --git a/src/libcalamares/kdsingleapplicationguard/pimpl_ptr.h b/3rdparty/kdsingleapplicationguard/pimpl_ptr.h similarity index 86% rename from src/libcalamares/kdsingleapplicationguard/pimpl_ptr.h rename to 3rdparty/kdsingleapplicationguard/pimpl_ptr.h index b66bd11a2..41b33b582 100644 --- a/src/libcalamares/kdsingleapplicationguard/pimpl_ptr.h +++ b/3rdparty/kdsingleapplicationguard/pimpl_ptr.h @@ -1,3 +1,9 @@ +/* + * SPDX-License-Identifier: LGPL-2.0-only + * License-Filename: LICENSES/LGPLv2-KDAB + * + * The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. + */ #ifndef KDTOOLSCORE_PIMPL_PTR_H #define KDTOOLSCORE_PIMPL_PTR_H diff --git a/src/libcalamaresui/widgets/waitingspinnerwidget.cpp b/3rdparty/waitingspinnerwidget.cpp similarity index 99% rename from src/libcalamaresui/widgets/waitingspinnerwidget.cpp rename to 3rdparty/waitingspinnerwidget.cpp index 317d83807..45c689019 100644 --- a/src/libcalamaresui/widgets/waitingspinnerwidget.cpp +++ b/3rdparty/waitingspinnerwidget.cpp @@ -1,5 +1,4 @@ -/* === This file is part of Calamares - === - * +/* * SPDX-License-Identifier: MIT * License-Filename: LICENSES/MIT-QtWaitingSpinner */ diff --git a/src/libcalamaresui/widgets/waitingspinnerwidget.h b/3rdparty/waitingspinnerwidget.h similarity index 98% rename from src/libcalamaresui/widgets/waitingspinnerwidget.h rename to 3rdparty/waitingspinnerwidget.h index d71976ef8..b3e8df9a0 100644 --- a/src/libcalamaresui/widgets/waitingspinnerwidget.h +++ b/3rdparty/waitingspinnerwidget.h @@ -1,5 +1,4 @@ -/* === This file is part of Calamares - === - * +/* * SPDX-License-Identifier: MIT * License-Filename: LICENSES/MIT-QtWaitingSpinner */ diff --git a/CHANGES b/CHANGES index 37dc7a71c..ad985b1e4 100644 --- a/CHANGES +++ b/CHANGES @@ -3,7 +3,90 @@ 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.11 (unreleased) # + +# 3.2.14 (unreleased) # + +This release contains contributions from (alphabetically by first name): + +## Core ## + +## Modules ## + + +# 3.2.13 (2019-08-30) # + +This release contains contributions from (alphabetically by first name): + - Arnaud Ferraris + - Arnaud Rebillout + - Bill Auger + - Kevin Kofler + +## Core ## + +- The Calamares standard coding style -- embodied in `ci/calamaresstyle` + has had a few updates and has now been consistently applied across + the core codebase (e.g. libcalamares, libcalamaresui, calamares, but + not the modules). +- *KCoreAddons* is now a required dependency. This lets us drop a chunk + of code that was copied from KCoreAddons years ago, and use the + (maintained!) upstream version instead. It also gives us KMacroExpander + everywhere, which will simplify code for handling substitutions + in configuration files. +- *Slideshows* now have a new property *activatedInCalamares* which + controls the keyboard shortcuts (and can control timers and other + properties of the slideshow, too). + +## Modules ## + +- The *packagechooser* module can load data from the config-file, + from AppData XML files referred by the config-file, and (new) also + from AppStream caches by referring to an application's AppStream id. #1212 +- The *partition* module now understands the units *KB*, *MB*, *GB* which + are powers-of-ten sizes, alongside the powers-of-two sizes that it already + used. (thanks to Arnaud) +- The *welcome* module now supports a *Donate* button if *showDonateUrl* + is set to a non-empty URL. #1197 +- The *welcome* module can have URLs for the various buttons configured + directly in the module configuration (rather than in `branding.desc`). + + +# 3.2.12 (2019-08-07) # + +This release contains contributions from (alphabetically by first name): + - apt-ghetto + - Bill Auger + - embar + +## Core ## + + - Preliminary work to allow jobs to have a *weight* assigned to them + has been added. This will allow the progress bar to better reflect + progress by the amount of work done rather than purely by the + number of jobs. (Thanks to Bill Auger) + - Preliminary work has been added to post the installation log to a + pastebin for bug reporting. (Thanks to Bill Auger) + - Support for translated human-readable strings in Calamares + config files has been added. This is used only in the *packagechooser* + module (see below) but will expand to those modules that need + user-visible strings from the configuration file (existing + solutions need either gettext or Qt support). + - Esperanto is now available when Qt version 5.12.2 or later is used. + +## Modules ## + + - *fstab* A new configuration key *efiMountOptions* has been added, to + allow setting filesystem options specifically for the EFI partition. + (Thanks to apt-ghetto) + - *packagechooser* is a new module for low-density package choices, + e.g. for selecting a default desktop environment, or adding some + proprietary drivers, or chosing browsers of office suites. It presents + **one** collection of items -- at most ten or so, because of the UI -- + and the user can select zero or more of them. The behavior is + configurable, and package information can be set through the Calamares + configuration file or by reading AppData files for the packages. #426 + + +# 3.2.11 (2019-07-06) # This release contains contributions from (alphabetically by first name): - No other contributors this time around. diff --git a/CMakeLists.txt b/CMakeLists.txt index 054be5f88..f48dda135 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,9 @@ # SKIP_MODULES : a space or semicolon-separated list of directory names # under src/modules that should not be built. # USE_ : fills in SKIP_MODULES for modules called - +# WITH_ : try to enable (these usually default to ON). For +# a list of WITH_ grep CMakeCache.txt after running +# CMake once. # BUILD_ : choose additional things to build # DEBUG_ : special developer flags for debugging # @@ -35,9 +38,9 @@ # One special target is "show-version", which can be built # to obtain the version number from here. -cmake_minimum_required( VERSION 3.2 FATAL_ERROR ) +cmake_minimum_required( VERSION 3.3 FATAL_ERROR ) project( CALAMARES - VERSION 3.2.11 + VERSION 3.2.13 LANGUAGES C CXX ) set( CALAMARES_VERSION_RC 0 ) # Set to 0 during release cycle, 1 during development @@ -96,21 +99,23 @@ set( CALAMARES_DESCRIPTION_SUMMARY # (sr@latin in particular) may need special handling in CalamaresUtils.cpp. # # TODO: drop the es_ES translation from Transifex -# TODO: move eo (Esperanto) to _ok once Qt can actually create a -# locale for it. # -# NOTE: when updating the list from Transifex, copy these four lines +# NOTE: move eo (Esperanto) to _ok once Qt can actually create a +# locale for it. (Qt 5.12.2 can, see check later on). +# NOTE: update these lines by running txstats.py, or copy these four lines # and prefix each variable name with "p", so that the automatic # checks for new languages and misspelled ones are done (that is, # copy these four lines to four backup lines, add "p", and then update # the original four lines with the current translations). -set( _tx_complete ca cs_CZ da de fr he hr hu ko lt pt_BR sq tr_TR - zh_TW ) -set( _tx_good ast en_GB es es_MX et fi_FI gl id it_IT ja nl pl - pt_PT ro ru sk zh_CN ) -set( _tx_ok ar bg el es_PR eu hi is mr nb sl sr sr@latin sv th - uk ) -set( _tx_incomplete be ca@valencia eo fa fr_CH gu kk kn lo mk ne_NP ur uz ) +# +# Total 60 languages +set( _tx_complete ca cs_CZ da de fi_FI fr he hi hr hu ja ko lt + pt_BR sq tr_TR zh_TW ) +set( _tx_good ast en_GB es es_MX et gl id it_IT nl pl pt_PT ru sk + zh_CN ) +set( _tx_ok ar bg el es_PR eu is mr nb ro sl sr sr@latin sv th uk ) +set( _tx_incomplete be ca@valencia eo fa fr_CH gu kk kn lo mk ne_NP + ur uz ) ### Required versions # @@ -126,6 +131,10 @@ set( BOOSTPYTHON_VERSION 1.55.0 ) # set( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeModules" ) +# Enable IN_LIST +if( POLICY CMP0057 ) + cmake_policy( SET CMP0057 NEW ) +endif() # CMake 3.9, 3.10 compatibility if( POLICY CMP0071 ) cmake_policy( SET CMP0071 NEW ) @@ -189,10 +198,11 @@ if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) -Wno-missing-prototypes -Wno-documentation-unknown-command -Wno-unknown-warning-option + -Werror=return-type ) string( APPEND CMAKE_CXX_FLAGS " ${CLANG_WARNINGS}" ) endforeach() - set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOTREACHED='//'" ) + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOTREACHED='//' -DFALLTHRU='[[clang::fallthrough]]'") # Third-party code where we don't care so much about compiler warnings # (because it's uncomfortable to patch) get different flags; use @@ -219,7 +229,7 @@ else() set( SUPPRESS_3RDPARTY_WARNINGS "" ) set( SUPPRESS_BOOST_WARNINGS "" ) - set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOTREACHED='__builtin_unreachable();'" ) + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOTREACHED='__builtin_unreachable();' -DFALLTHRU='/* */'" ) endif() # Use mark_thirdparty_code() to reduce warnings from the compiler @@ -247,6 +257,17 @@ include( CMakeColors ) ### DEPENDENCIES # find_package( Qt5 ${QT_VERSION} CONFIG REQUIRED Concurrent Core Gui Widgets LinguistTools Svg Quick QuickWidgets ) +if( Qt5_VERSION VERSION_GREATER 5.12.1 ) + # At least Qt 5.12.2 seems to support Esperanto in QLocale + if( "eo" IN_LIST _tx_incomplete ) + message(STATUS "Esperanto support since Qt 5.12.2, enabling Esperanto locale") + list( REMOVE_ITEM _tx_incomplete "eo" ) + list( APPEND _tx_ok "eo" ) + endif() +endif() +# Optional Qt parts +find_package( Qt5DBus CONFIG ) + find_package( YAMLCPP ${YAMLCPP_VERSION} REQUIRED ) if( INSTALL_POLKIT ) find_package( PolkitQt5-1 REQUIRED ) @@ -276,7 +297,14 @@ if( ECM_FOUND ) include(KDEInstallDirs) endif() -find_package( KF5 COMPONENTS CoreAddons Crash ) +find_package( KF5 QUIET COMPONENTS CoreAddons Crash ) +set_package_properties( + KF5::CoreAddons PROPERTIES + TYPE REQUIRED + DESCRIPTION "Classes built on QtCore for About Data" + URL "https://api.kde.org/frameworks/kcoreaddons/" + PURPOSE "About Calamares" +) if( NOT KF5Crash_FOUND ) set( WITH_KF5Crash OFF ) endif() @@ -575,11 +603,25 @@ add_custom_target( uninstall ### CMAKE SUMMARY REPORT # -feature_summary(WHAT ALL) - get_directory_property( SKIPPED_MODULES DIRECTORY src/modules DEFINITION LIST_SKIPPED_MODULES ) calamares_explain_skipped_modules( ${SKIPPED_MODULES} ) +feature_summary( + WHAT DISABLED_FEATURES + DESCRIPTION "The following features have been disabled:" + QUIET_ON_EMPTY +) +feature_summary( + WHAT OPTIONAL_PACKAGES_NOT_FOUND + DESCRIPTION "The following OPTIONAL packages were not found:" + QUIET_ON_EMPTY +) +feature_summary( + WHAT REQUIRED_PACKAGES_NOT_FOUND + FATAL_ON_MISSING_REQUIRED_PACKAGES + DESCRIPTION "The following REQUIRED packages were not found:" + QUIET_ON_EMPTY +) diff --git a/CMakeModules/CalamaresAddPlugin.cmake b/CMakeModules/CalamaresAddPlugin.cmake index 1d749d51c..9c7b9d90e 100644 --- a/CMakeModules/CalamaresAddPlugin.cmake +++ b/CMakeModules/CalamaresAddPlugin.cmake @@ -21,8 +21,8 @@ # Convenience function for creating a C++ (qtplugin) module for Calamares. # This function provides cmake-time feedback about the plugin, adds # targets for compilation and boilerplate information, and creates -# a module.desc with standard values if none is provided (which only -# happens for very unusual plugins). +# a module.desc with standard values (if the module.desc file exists, +# that one is used instead, which happens only for unusual plugins). # # Usage: # @@ -34,16 +34,35 @@ # UI ui-file... # LINK_LIBRARIES lib... # LINK_PRIVATE_LIBRARIES lib... -# COMPILE_DEFINITIONS def... -# RESOURCES resource-file +# [COMPILE_DEFINITIONS def...] +# [RESOURCES resource-file] +# [REQUIRES module-name...] # [NO_INSTALL] # [SHARED_LIB] # [EMERGENCY] # ) # -# The COMPILE_DEFINITIONS are set on the resulting module with a suitable -# flag (i.e. `-D`) so only state the name (optionally, also the value) -# without a `-D` prefixed to it. +# Function parameters: +# - COMPILE_DEFINITIONS +# Definitions are set on the resulting module with a suitable +# flag (i.e. `-D`) so only state the name (optionally, also the value) +# without a `-D` prefixed to it. +# - RESOURCES +# One (single!) filename for the RCC file for the plugin. +# - REQUIRES +# One or more names of modules which are added to the *requiredModules* +# key in the descriptor. See *Module Requirements* in the module +# documentation. +# - NO_INSTALL +# If this is set, the module is not installed by default; use this to +# build testing modules or unit-testing modules. +# - SHARED_LIB +# In unusual circumstances, this function is used to add a library +# rather than a normal Calamares module / plugin. +# - EMERGENCY +# If this is set, the module is marked as an *emergency* module in the +# descriptor. See *Emergency Modules* in the module documentation. +# include( CMakeParseArguments ) include( CalamaresAddLibrary ) @@ -54,7 +73,7 @@ function( calamares_add_plugin ) set( NAME ${ARGV0} ) set( options NO_INSTALL SHARED_LIB EMERGENCY ) set( oneValueArgs NAME TYPE EXPORT_MACRO RESOURCES ) - set( multiValueArgs SOURCES UI LINK_LIBRARIES LINK_PRIVATE_LIBRARIES COMPILE_DEFINITIONS ) + set( multiValueArgs SOURCES UI LINK_LIBRARIES LINK_PRIVATE_LIBRARIES COMPILE_DEFINITIONS REQUIRES ) cmake_parse_arguments( PLUGIN "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) set( PLUGIN_NAME ${NAME} ) set( PLUGIN_DESTINATION ${CMAKE_INSTALL_LIBDIR}/calamares/modules/${PLUGIN_NAME} ) @@ -142,6 +161,12 @@ function( calamares_add_plugin ) set( _type ${PLUGIN_TYPE} ) file( WRITE ${_file} "# AUTO-GENERATED metadata file\n# Syntax is YAML 1.2\n---\n" ) file( APPEND ${_file} "type: \"${_type}\"\nname: \"${PLUGIN_NAME}\"\ninterface: \"qtplugin\"\nload: \"lib${target}.so\"\n" ) + if ( PLUGIN_REQUIRES ) + file( APPEND ${_file} "requiredModules:\n" ) + foreach( _r ${PLUGIN_REQUIRES} ) + file( APPEND ${_file} " - ${_r}\n" ) + endforeach() + endif() if ( PLUGIN_EMERGENCY ) file( APPEND ${_file} "emergency: true\n" ) endif() diff --git a/LICENSES/GPLv3+-QJsonModel b/LICENSES/GPLv3+-QJsonModel deleted file mode 100644 index 8a8e272c0..000000000 --- a/LICENSES/GPLv3+-QJsonModel +++ /dev/null @@ -1,18 +0,0 @@ -/*********************************************** - Copyright (C) 2014 Schutz Sacha - This file is part of QJsonModel (https://github.com/dridk/QJsonmodel). - - QJsonModel is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - QJsonModel is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with QJsonModel. If not, see . - -**********************************************/ diff --git a/LICENSES/LGPLv2-KDAB b/LICENSES/LGPLv2-KDAB new file mode 100644 index 000000000..df942b1ff --- /dev/null +++ b/LICENSES/LGPLv2-KDAB @@ -0,0 +1,488 @@ + + The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB. + + You may use, distribute and copy the KD Tools Library under the terms of + GNU Library General Public License version 2, which is displayed below. + +------------------------------------------------------------------------- + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/README.md b/README.md index f35b012c8..e2e87fddf 100644 --- a/README.md +++ b/README.md @@ -13,28 +13,23 @@ ### Dependencies Main: -* Compiler with C++11 support: GCC >= 4.9.0 or Clang >= 3.5.1 -* CMake >= 3.2 -* Qt >= 5.7 +* Compiler with C++14 support: GCC >= 5 or Clang >= 3.5.1 +* CMake >= 3.3 +* Qt >= 5.9 * yaml-cpp >= 0.5.1 * Python >= 3.3 (required for some modules) -* Boost.Python >= 1.55.0 (recommended, or PythonQt; one is required for some modules) -* PythonQt (recommended, or Boost.Python; one is required for some modules) -* extra-cmake-modules >= 5.18 (recommended; required for some modules) +* Boost.Python >= 1.55.0 (required for some modules) +* KDE extra-cmake-modules >= 5.18 (recommended; required for some modules; + required for some tests) +* KDE Frameworks KCoreAddons (>= 5.58 recommended) +* PythonQt (optional, deprecated) Modules: -* welcome: - * NetworkManager - * UPower (optional, runtime) -* partition: - * extra-cmake-modules - * KF5: KCoreAddons, KConfig, KI18n, KService, KWidgetsAddons - * KPMcore >= 3.3 -* bootloader: - * systemd-boot or GRUB -* unpackfs: - * squashfs-tools - * rsync +* Individual modules may have their own requirements; + these are listed in CMake output. Particular requirements (not complete): +* *fsresizer* KPMCore >= 3.3 +* *partition* KPMCore >= 3.3 +* *users* LibPWQuality (optional) ### Building diff --git a/calamares.desktop b/calamares.desktop index 954c77123..47dd281e5 100644 --- a/calamares.desktop +++ b/calamares.desktop @@ -3,7 +3,7 @@ Type=Application Version=1.0 Name=Install System GenericName=System Installer -Keywords=calamares;system;installer +Keywords=calamares;system;installer; TryExec=calamares Exec=pkexec /usr/bin/calamares Comment=Calamares — System Installer diff --git a/calamares.desktop.in b/calamares.desktop.in index 0c4041bcb..9bfbf8fd9 100644 --- a/calamares.desktop.in +++ b/calamares.desktop.in @@ -3,7 +3,7 @@ Type=Application Version=1.0 Name=Install System GenericName=System Installer -Keywords=calamares;system;installer +Keywords=calamares;system;installer; TryExec=calamares Exec=pkexec /usr/bin/calamares Comment=Calamares — System Installer diff --git a/ci/AppImage.sh b/ci/AppImage.sh old mode 100644 new mode 100755 diff --git a/ci/RELEASE.sh b/ci/RELEASE.sh old mode 100644 new mode 100755 index dfb65cfeb..78fc1f7ce --- a/ci/RELEASE.sh +++ b/ci/RELEASE.sh @@ -54,7 +54,7 @@ if test "x$BUILD_CLANG" = "xtrue" ; then rm -rf "$BUILDDIR" mkdir "$BUILDDIR" || { echo "Could not create build directory." ; exit 1 ; } ( cd "$BUILDDIR" && CC=clang CXX=clang++ cmake .. && make -j4 ) || { echo "Could not perform test-build in $BUILDDIR." ; exit 1 ; } - ( cd "$BUILDDIR" && make test ) || { echo "Tests failed in $BUILDDIR." ; exit 1 ; } + ( cd "$BUILDDIR" && make test ) || { echo "Tests failed in $BUILDDIR (clang)." ; exit 1 ; } fi fi @@ -93,7 +93,7 @@ TMPDIR=$(mktemp -d --suffix="-calamares-$D") test -d "$TMPDIR" || { echo "Could not create tarball-build directory." ; exit 1 ; } tar xzf "$TAR_FILE" -C "$TMPDIR" || { echo "Could not unpack tarball." ; exit 1 ; } test -d "$TMPDIR/$TAR_V" || { echo "Tarball did not contain source directory." ; exit 1 ; } -( cd "$TMPDIR/$TAR_V" && cmake . && make -j4 && make test ) || { echo "Tarball build failed." ; exit 1 ; } +( cd "$TMPDIR/$TAR_V" && cmake . && make -j4 && make test ) || { echo "Tarball build failed in $TMPDIR." ; exit 1 ; } ### Cleanup # diff --git a/ci/calamaresstyle b/ci/calamaresstyle index a877de7d1..46acbdc3d 100755 --- a/ci/calamaresstyle +++ b/ci/calamaresstyle @@ -37,7 +37,7 @@ style_some() if test "x$any_dirs" = "xyes" ; then for d in "$@" do - if test -d "$@" ; then + if test -d "$d" ; then style_some $( find "$d" -maxdepth 1 -type f -name '*.cpp' -o -name '*.h' ) else style_some "$d" diff --git a/ci/txstats.py b/ci/txstats.py old mode 100644 new mode 100755 index d29e7dc75..34ef4fc97 --- a/ci/txstats.py +++ b/ci/txstats.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#! /usr/bin/env python3 # # Uses the Transifex API to get a list of enabled languages, # and outputs CMake settings for inclusion into CMakeLists.txt. @@ -56,6 +56,11 @@ def get_tx_stats(token): return 1 suppressed_languages = ( "es_ES", ) # In Transifex, but not used + # Some languages go into the "incomplete" list by definition, + # regardless of their completion status: this can have various reasons. + incomplete_languages = ( + "eo", # Not supported by QLocale + ) all_langs = [] @@ -66,6 +71,8 @@ def get_tx_stats(token): if lang_name in suppressed_languages: continue stats = languages[lang_name]["translated"]["percentage"] + if lang_name in incomplete_languages: + stats = 0.0 all_langs.append((stats, lang_name)) output_langs(all_langs, "complete", lambda s : s == 1.0) diff --git a/data/images/help-donate.svg b/data/images/help-donate.svg new file mode 100644 index 000000000..2370c127e --- /dev/null +++ b/data/images/help-donate.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/io.calamares.calamares.appdata.xml b/io.calamares.calamares.appdata.xml new file mode 100644 index 000000000..355f485c2 --- /dev/null +++ b/io.calamares.calamares.appdata.xml @@ -0,0 +1,29 @@ + + + io.calamares.calamares.desktop + CC0-1.0 + GPL-3.0+ + Calamares + Calamares + Calamares + Calamares + Calamares Linux Installer + Calamares Linux Installer + Linux Installatieprogramma Calamares + +

Calamares is an installer program for Linux distributions.

+

Calamares is een installatieprogramma voor Linux distributies.

+
+ https://calamares.io + https://https://github.com/calamares/calamares/issues/ + https://github.com/calamares/calamares/wiki + + + Calamares Welcome + https://calamares.io/images/cal_640.png + + + + calamares + +
diff --git a/lang/calamares_ar.ts b/lang/calamares_ar.ts index 60f47f127..c512e316b 100644 --- a/lang/calamares_ar.ts +++ b/lang/calamares_ar.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &رجوع - - + &Next &التالي - - + &Cancel &إلغاء - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. الغاء الـ تثبيت من دون احداث تغيير في النظام - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install &ثبت - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? إلغاء التثبيت؟ - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. أتريد إلغاء عمليّة التّثبيت الحاليّة؟ سيخرج المثبّت وتضيع كلّ التّغييرات. - + &Yes &نعم - + &No &لا - + &Close &اغلاق - + Continue with setup? الإستمرار في التثبيت؟ - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> مثبّت %1 على وشك بإجراء تعديلات على قرصك لتثبيت %2.<br/><strong>لن تستطيع التّراجع عن هذا.</strong> - + &Install now &ثبت الأن - + Go &back &إرجع - + &Done - + The installation is complete. Close the installer. اكتمل التثبيت , اغلق المثبِت - + Error خطأ - + Installation Failed فشل التثبيت @@ -1289,6 +1285,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ The installer will quit and all changes will be lost. الموقع + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,65 +2267,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. معاملات نداء المهمة سيّئة. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2326,7 +2374,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_ast.ts b/lang/calamares_ast.ts index f3a613d35..a9a310990 100644 --- a/lang/calamares_ast.ts +++ b/lang/calamares_ast.ts @@ -117,7 +117,7 @@ Set up - + Configuración @@ -135,7 +135,7 @@ Programmed job failure was explicitly requested. - + El fallu del trabayu programáu solicitóse esplicitamente. @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Esperando por %n móduluEsperando por %n módulos - + (%n second(s)) (%n segundu)(%n segundos) - + System-requirements checking is complete. Completóse la comprobación de los requirimientos del sistema. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Atrás - - + &Next &Siguiente - - + &Cancel &Encaboxar - - + Cancel setup without changing the system. - + Encaboxa la configuración ensin camudar el sistema. - - + Cancel installation without changing the system. Encaboxa la instalación ensin camudar el sistema. - + Setup Failed - + Falló la configuración - + Calamares Initialization Failed Falló l'aniciu de Calamares - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 nun pue instalase. Calamares nun foi a cargar tolos módulos configuraos. Esto ye un problema col mou nel que la distribución usa Calamares. - + <br/>The following modules could not be loaded: <br/>Nun pudieron cargase los módulos de darréu: - + Continue with installation? ¿Siguir cola instalación? - + 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> El programa d'instalación de %1 ta a piques de facer cambeos nel discu pa configurar %2.<br/><strong>Nun vas ser a desfacer estos cambeos.<strong> - + &Set up now - + &Configurar agora - + &Set up - + &Configurar - + &Install &Instalar - + Setup is complete. Close the setup program. Completóse la configuración. Zarra'l programa de configuración. - + Cancel setup? ¿Encaboxar la configuración? - + Cancel installation? ¿Encaboxar la instalación? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. ¿De xuru que quies encaboxar el procesu actual de configuración? El programa de configuración va colar y van perdese tolos cambeos. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. ¿De xuru que quies encaboxar el procesu actual d'instalación? L'instalador va colar y van perdese tolos cambeos. - + &Yes &Sí - + &No &Non - + &Close &Zarrar - + Continue with setup? ¿Siguir cola instalación? - + 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> L'instalador de %1 ta a piques de facer cambeos nel discu pa instalar %2.<br/><strong>Nun vas ser a desfacer esos cambeos.</strong> - + &Install now &Instalar agora - + Go &back Dir p'&atrás - + &Done &Fecho - + The installation is complete. Close the installer. Completóse la instalación. Zarra l'instalador. - + Error Fallu - + Installation Failed Falló la instalación @@ -412,7 +408,7 @@ L'instalador va colar y van perdese tolos cambeos. %1 Setup Program - + Programa de configuración de %1 @@ -481,7 +477,7 @@ L'instalador va colar y van perdese tolos cambeos. %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. - + %1 va redimensionase a %2MB y va crease una partición nueva de %3MB pa %4. @@ -1206,22 +1202,22 @@ L'instalador va colar y van perdese tolos cambeos. has at least %1 GiB available drive space - + tien polo menos %1 GiB d'espaciu disponible nel discu There is not enough drive space. At least %1 GiB is required. - + Nun hai espaciu abondu nel discu. Ríquense polo menos %1 GiB. has at least %1 GiB working memory - + tien polo menos %1 GiB memoria de trabayu The system does not have enough working memory. At least %1 GiB is required. - + El sistema nun tien abonda memoria de trabayu. Ríquense polo menos %1 GiB. @@ -1290,6 +1286,22 @@ L'instalador va colar y van perdese tolos cambeos. Nun pudo escribise nel ficheru <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ L'instalador va colar y van perdese tolos cambeos. Allugamientu + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2220,14 +2268,14 @@ L'instalador va colar y van perdese tolos cambeos. ProcessResult - + There was no output from the command. El comandu nun produxo denguna salida. - + Output: @@ -2236,52 +2284,52 @@ Salida: - + External command crashed. El comandu esternu cascó. - + Command <i>%1</i> crashed. El comandu <i>%1</i> cascó. - + External command failed to start. El comandu esternu falló al aniciar. - + Command <i>%1</i> failed to start. El comandu <i>%1</i> falló al aniciar. - + Internal error when starting command. Fallu internu al aniciar el comandu. - + Bad parameters for process job call. Los parámetros son incorreutos pa la llamada del trabayu de procesos. - + External command failed to finish. El comandu esternu finó al finar. - + Command <i>%1</i> failed to finish in %2 seconds. El comandu <i>%1</i> falló al finar en %2 segundos. - + External command finished with errors. El comandu esternu finó con fallos. - + Command <i>%1</i> finished with exit code %2. El comandu <i>%1</i> finó col códigu de salida %2. @@ -2330,7 +2378,7 @@ Salida: - + Requirements checking for module <i>%1</i> is complete. Completóse la comprobación de requirimientos del módulu <i>%1</i> @@ -2853,7 +2901,7 @@ Salida: This is an overview of what will happen once you start the setup procedure. - + Esto ye una previsualización de lo que va asoceder nel momentu qu'anicies el procesu de configuración. diff --git a/lang/calamares_be.ts b/lang/calamares_be.ts index 4fe3c6da9..71b4c9da1 100644 --- a/lang/calamares_be.ts +++ b/lang/calamares_be.ts @@ -22,27 +22,27 @@ Master Boot Record of %1 - + Галоўны загрузачны запіс %1 Boot Partition - + Загрузачны раздзел System Partition - + Сістэмны раздзел Do not install a boot loader - + Не ўсталёўваць загрузчык %1 (%2) - + %1 (%2) @@ -50,7 +50,7 @@ Blank Page - + Пустая старонка @@ -58,58 +58,58 @@ Form - + Форма GlobalStorage - + Глабальнае сховішча JobQueue - + Чарга задач Modules - + Модулі Type: - + Тып: none - + няма Interface: - + Інтэрфейс: Tools - + Інструменты Reload Stylesheet - + Перазагрузіць табліцу стыляў Widget Tree - + Дрэва віджэтаў Debug information - + Адладачная інфармацыя @@ -117,12 +117,12 @@ Set up - + Наладзіць Install - + Усталяваць @@ -130,7 +130,7 @@ Job failed (%1) - + Задача схібіла (%1) @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back - - + &Next - - + &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error - + Installation Failed @@ -436,7 +432,7 @@ The installer will quit and all changes will be lost. Form - + Форма @@ -1039,7 +1035,7 @@ The installer will quit and all changes will be lost. Form - + Форма @@ -1105,7 +1101,7 @@ The installer will quit and all changes will be lost. Form - + Форма @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1363,7 +1375,7 @@ The installer will quit and all changes will be lost. Form - + Форма @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -1821,7 +1869,7 @@ The installer will quit and all changes will be lost. Form - + Форма @@ -1839,7 +1887,7 @@ The installer will quit and all changes will be lost. Form - + Форма @@ -1976,7 +2024,7 @@ The installer will quit and all changes will be lost. Form - + Форма @@ -2176,7 +2224,7 @@ The installer will quit and all changes will be lost. Form - + Форма @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. @@ -2333,7 +2381,7 @@ Output: %1 (%2) language[name] (country[name]) - + %1 (%2) @@ -2360,7 +2408,7 @@ Output: Form - + Форма @@ -2921,7 +2969,7 @@ Output: Form - + Форма @@ -3077,7 +3125,7 @@ Output: Form - + Форма diff --git a/lang/calamares_bg.ts b/lang/calamares_bg.ts index b69a56a67..b4d466017 100644 --- a/lang/calamares_bg.ts +++ b/lang/calamares_bg.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Назад - - + &Next &Напред - - + &Cancel &Отказ - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Отказ от инсталацията без промяна на системата. - + Setup Failed - + Calamares Initialization Failed Инициализацията на Calamares се провали - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 не може да се инсталира. Calamares не можа да зареди всичките конфигурирани модули. Това е проблем с начина, по който Calamares е използван от дистрибуцията. - + <br/>The following modules could not be loaded: <br/>Следните модули не могат да се заредят: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install &Инсталирай - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Отмяна на инсталацията? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Наистина ли искате да отмените текущият процес на инсталиране? Инсталатора ще прекъсне и всичките промени ще бъдат загубени. - + &Yes &Да - + &No &Не - + &Close &Затвори - + Continue with setup? Продължаване? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Инсталатора на %1 ще направи промени по вашия диск за да инсталира %2. <br><strong>Промените ще бъдат окончателни.</strong> - + &Install now &Инсталирай сега - + Go &back В&ръщане - + &Done &Готово - + The installation is complete. Close the installer. Инсталацията е завършена. Затворете инсталаторa. - + Error Грешка - + Installation Failed Неуспешна инсталация @@ -1289,6 +1285,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ The installer will quit and all changes will be lost. Местоположение + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,13 +2267,13 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: @@ -2234,52 +2282,52 @@ Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. Невалидни параметри за извикване на задача за процес. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2328,7 +2376,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_ca.ts b/lang/calamares_ca.ts index 7272159c7..de88d550c 100644 --- a/lang/calamares_ca.ts +++ b/lang/calamares_ca.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). S'espera %n mòdul.S'esperen %n mòduls. - + (%n second(s)) (%n segon)(%n segons) - + System-requirements checking is complete. S'ha completat la comprovació dels requeriments del sistema. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Enrere - - + &Next &Següent - - + &Cancel &Cancel·la - - + Cancel setup without changing the system. Cancel·la la configuració sense canviar el sistema. - - + Cancel installation without changing the system. Cancel·leu la instal·lació sense canviar el sistema. - + Setup Failed Ha fallat la configuració. - + Calamares Initialization Failed Ha fallat la inicialització de Calamares - + %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. No es pot instal·lar %1. El Calamares no ha pogut carregar tots els mòduls configurats. Aquest és un problema amb la manera com el Calamares és utilitzat per la distribució. - + <br/>The following modules could not be loaded: <br/>No s'han pogut carregar els mòduls següents: - + Continue with installation? Voleu continuar la instal·lació? - + 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> El programa de configuració %1 està a punt de fer canvis al disc per tal de configurar %2.<br/><strong>No podreu desfer aquests canvis.</strong> - + &Set up now Con&figura-ho ara - + &Set up Con&figura-ho - + &Install &Instal·la - + Setup is complete. Close the setup program. La configuració s'ha acabat. Tanqueu el programa de configuració. - + Cancel setup? Voleu cancel·lar la configuració? - + Cancel installation? Cancel·lar la instal·lació? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Realment voleu cancel·lar el procés de configuració actual? El programa de configuració es tancarà i es perdran tots els canvis. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Voleu cancel·lar el procés d'instal·lació actual? L'instal·lador es tancarà i tots els canvis es perdran. - + &Yes &Sí - + &No &No - + &Close Tan&ca - + Continue with setup? Voleu continuar la configuració? - + 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> L'instal·lador de %1 està a punt de fer canvis al disc per tal d'instal·lar-hi %2.<br/><strong>No podreu desfer aquests canvis.</strong> - + &Install now &Instal·la ara - + Go &back Ves &enrere - + &Done &Fet - + The installation is complete. Close the installer. La instal·lació s'ha acabat. Tanqueu l'instal·lador. - + Error Error - + Installation Failed La instal·lació ha fallat @@ -1290,6 +1286,22 @@ L'instal·lador es tancarà i tots els canvis es perdran. No s'ha pogut escriure al fitxer <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Es creen initramfs amb mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + Es creen initramfs. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ L'instal·lador es tancarà i tots els canvis es perdran. Ubicació + + LuksBootKeyFileJob + + + Configuring LUKS key file. + Es configura el fitxer de clau LUKS. + + + + + No partitions are defined. + No s'ha definit cap partició. + + + + + + Encrypted rootfs setup error + Error de configuració de rootfs encriptat. + + + + Root partition %1 is LUKS but no passphrase has been set. + La partició d'arrel %1 és LUKS però no se n'ha establert cap contrasenya. + + + + Could not create LUKS key file for root partition %1. + No s'ha pogut crear el fitxer de clau de LUKS per a la partició d'arrel %1. + + + + Could configure LUKS key file on partition %1. + S'ha pogut configurar el fitxer de clau de LUKS a la partició %1. + + NetInstallPage @@ -2220,14 +2268,14 @@ L'instal·lador es tancarà i tots els canvis es perdran. ProcessResult - + There was no output from the command. No hi ha hagut sortida de l'ordre. - + Output: @@ -2236,52 +2284,52 @@ Sortida: - + External command crashed. L'ordre externa ha fallat. - + Command <i>%1</i> crashed. L'ordre <i>%1</i> ha fallat. - + External command failed to start. L'ordre externa no s'ha pogut iniciar. - + Command <i>%1</i> failed to start. L'ordre <i>%1</i> no s'ha pogut iniciar. - + Internal error when starting command. Error intern en iniciar l'ordre. - + Bad parameters for process job call. Paràmetres incorrectes per a la crida de la tasca del procés. - + External command failed to finish. L'ordre externa no ha acabat correctament. - + Command <i>%1</i> failed to finish in %2 seconds. L'ordre <i>%1</i> no ha pogut acabar en %2 segons. - + External command finished with errors. L'ordre externa ha acabat amb errors. - + Command <i>%1</i> finished with exit code %2. L'ordre <i>%1</i> ha acabat amb el codi de sortida %2. @@ -2330,7 +2378,7 @@ Sortida: (sense punt de muntatge) - + Requirements checking for module <i>%1</i> is complete. S'ha completat la comprovació dels requeriments per al mòdul <i>%1</i>. diff --git a/lang/calamares_ca@valencia.ts b/lang/calamares_ca@valencia.ts index f3a9b1166..3d7448670 100644 --- a/lang/calamares_ca@valencia.ts +++ b/lang/calamares_ca@valencia.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back - - + &Next - - + &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error - + Installation Failed @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_cs_CZ.ts b/lang/calamares_cs_CZ.ts index 1f6ef2129..0b82ac35a 100644 --- a/lang/calamares_cs_CZ.ts +++ b/lang/calamares_cs_CZ.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Čeká se na %n modulČeká se na %n modulyČeká se na %n modulůČeká se na %n moduly - + (%n second(s)) (%n sekundu)(%n sekundy)(%n sekund)(%n sekundy) - + System-requirements checking is complete. Kontrola požadavků na systém dokončena. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Zpět - - + &Next &Další - - + &Cancel &Storno - - + Cancel setup without changing the system. Zrušit nastavení bez změny v systému. - - + Cancel installation without changing the system. Zrušení instalace bez provedení změn systému. - + Setup Failed Nastavení se nezdařilo - + Calamares Initialization Failed Inicializace Calamares se nezdařila - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 nemůže být nainstalováno. Calamares se nepodařilo načíst všechny nastavené moduly. Toto je problém způsobu použití Calamares ve vámi používané distribuci. - + <br/>The following modules could not be loaded: <br/> Následující moduly se nepodařilo načíst: - + Continue with installation? Pokračovat v instalaci? - + 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> Instalátor %1 provede změny na datovém úložišti, aby bylo nainstalováno %2.<br/><strong>Změny nebude možné vrátit zpět.</strong> - + &Set up now Na&stavit nyní - + &Set up Na&stavit - + &Install Na&instalovat - + Setup is complete. Close the setup program. Nastavení je dokončeno. Ukončete nastavovací program. - + Cancel setup? Zrušit nastavování? - + Cancel installation? Přerušit instalaci? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Opravdu chcete přerušit instalaci? Instalační program bude ukončen a všechny změny ztraceny. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Opravdu chcete instalaci přerušit? Instalační program bude ukončen a všechny změny ztraceny. - + &Yes &Ano - + &No &Ne - + &Close &Zavřít - + Continue with setup? Pokračovat s instalací? - + 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> Instalátor %1 provede změny na datovém úložišti, aby bylo nainstalováno %2.<br/><strong>Změny nebude možné vrátit zpět.</strong> - + &Install now &Spustit instalaci - + Go &back Jít &zpět - + &Done &Hotovo - + The installation is complete. Close the installer. Instalace je dokončena. Ukončete instalátor. - + Error Chyba - + Installation Failed Instalace se nezdařila @@ -1290,6 +1286,22 @@ Instalační program bude ukončen a všechny změny ztraceny. Nedaří se zapsat do souboru <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Vytváření initramfs pomocí mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + Vytváření initramfs. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ Instalační program bude ukončen a všechny změny ztraceny. Poloha + + LuksBootKeyFileJob + + + Configuring LUKS key file. + Nastavování souboru s klíčem pro LUKS šifrování. + + + + + No partitions are defined. + Nejsou definovány žádné oddíly. + + + + + + Encrypted rootfs setup error + Chyba nastavení šifrovaného kořenového oddílu + + + + Root partition %1 is LUKS but no passphrase has been set. + Kořenový oddíl %1 je LUKS, ale nebyla nastavena žádná heslová fráze. + + + + Could not create LUKS key file for root partition %1. + Nedaří se vytvořit LUKS klíč pro kořenový oddíl %1. + + + + Could configure LUKS key file on partition %1. + Nedaří se nastavit LUKS klíč pro oddíl %1. + + NetInstallPage @@ -2220,14 +2268,14 @@ Instalační program bude ukončen a všechny změny ztraceny. ProcessResult - + There was no output from the command. Příkaz neposkytl žádný výstup. - + Output: @@ -2236,52 +2284,52 @@ Výstup: - + External command crashed. Vnější příkaz byl neočekávaně ukončen. - + Command <i>%1</i> crashed. Příkaz <i>%1</i> byl neočekávaně ukončen. - + External command failed to start. Vnější příkaz se nepodařilo spustit. - + Command <i>%1</i> failed to start. Příkaz <i>%1</i> se nepodařilo spustit. - + Internal error when starting command. Vnitřní chyba při spouštění příkazu. - + Bad parameters for process job call. Chybné parametry volání úlohy procesu. - + External command failed to finish. Vnější příkaz se nepodařilo dokončit. - + Command <i>%1</i> failed to finish in %2 seconds. Příkaz <i>%1</i> se nepodařilo dokončit do %2 sekund. - + External command finished with errors. Vnější příkaz skončil s chybami. - + Command <i>%1</i> finished with exit code %2. Příkaz <i>%1</i> skončil s návratovým kódem %2. @@ -2330,7 +2378,7 @@ Výstup: (žádný přípojný bod) - + Requirements checking for module <i>%1</i> is complete. Kontrola požadavků pro modul <i>%1</i> dokončena. diff --git a/lang/calamares_da.ts b/lang/calamares_da.ts index 1787fe3bf..c4e9a0456 100644 --- a/lang/calamares_da.ts +++ b/lang/calamares_da.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Venter på %n modul.Venter på %n moduler. - + (%n second(s)) (%n sekund)(%n sekunder) - + System-requirements checking is complete. Tjek af systemkrav er fuldført. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Tilbage - - + &Next &Næste - - + &Cancel &Annullér - - + Cancel setup without changing the system. Annullér opsætningen uden at ændre systemet. - - + Cancel installation without changing the system. Annullér installation uden at ændre systemet. - + Setup Failed Opsætningen mislykkedes - + Calamares Initialization Failed Initiering af Calamares mislykkedes - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 kan ikke installeres. Calamares kunne ikke indlæse alle de konfigurerede moduler. Det er et problem med den måde Calamares bruges på af distributionen. - + <br/>The following modules could not be loaded: <br/>Følgende moduler kunne ikke indlæses: - + Continue with installation? Fortsæt installationen? - + 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> %1-opsætningsprogrammet er ved at foretage ændringer til din disk for at opsætte %2.<br/><strong>Det vil ikke være muligt at fortryde ændringerne.</strong> - + &Set up now &Sæt op nu - + &Set up &Sæt op - + &Install &Installér - + Setup is complete. Close the setup program. Opsætningen er fuldført. Luk opsætningsprogrammet. - + Cancel setup? Annullér opsætningen? - + Cancel installation? Annullér installationen? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Vil du virkelig annullere den igangværende opsætningsproces? Opsætningsprogrammet vil stoppe og alle ændringer vil gå tabt. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Vil du virkelig annullere den igangværende installationsproces? Installationsprogrammet vil stoppe og alle ændringer vil gå tabt. - + &Yes &Ja - + &No &Nej - + &Close &Luk - + Continue with setup? Fortsæt med opsætningen? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1-installationsprogrammet er ved at foretage ændringer til din disk for at installere %2.<br/><strong>Det vil ikke være muligt at fortryde ændringerne.</strong> - + &Install now &Installér nu - + Go &back Gå &tilbage - + &Done &Færdig - + The installation is complete. Close the installer. Installationen er fuldført. Luk installationsprogrammet. - + Error Fejl - + Installation Failed Installation mislykkedes @@ -1290,6 +1286,22 @@ Installationsprogrammet vil stoppe og alle ændringer vil gå tabt.Kunne ikke skrive til filen <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Opretter initramfs med mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + Opretter initramfs. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ Installationsprogrammet vil stoppe og alle ændringer vil gå tabt.Placering + + LuksBootKeyFileJob + + + Configuring LUKS key file. + Konfigurerer LUKS-nøglefil. + + + + + No partitions are defined. + Der er ikke defineret nogen partitioner. + + + + + + Encrypted rootfs setup error + Fejl ved opsætning af krypteret rootfs + + + + Root partition %1 is LUKS but no passphrase has been set. + Rodpartitionen %1 er LUKS men der er ikke indstillet nogen adgangskode. + + + + Could not create LUKS key file for root partition %1. + Kunne ikke oprette LUKS-nøglefil for rodpartitionen %1. + + + + Could configure LUKS key file on partition %1. + Kunne ikke konfigurere LUKS-nøglefil på partitionen %1. + + NetInstallPage @@ -2220,14 +2268,14 @@ Installationsprogrammet vil stoppe og alle ændringer vil gå tabt. ProcessResult - + There was no output from the command. Der var ikke nogen output fra kommandoen. - + Output: @@ -2236,52 +2284,52 @@ Output: - + External command crashed. Ekstern kommando holdt op med at virke. - + Command <i>%1</i> crashed. Kommandoen <i>%1</i> holdte op med at virke. - + External command failed to start. Ekstern kommando kunne ikke starte. - + Command <i>%1</i> failed to start. Kommandoen <i>%1</i> kunne ikke starte. - + Internal error when starting command. Intern fejl ved start af kommando. - + Bad parameters for process job call. Ugyldige parametre til kald af procesjob. - + External command failed to finish. Ekstern kommando blev ikke færdig. - + Command <i>%1</i> failed to finish in %2 seconds. Kommandoen <i>%1</i> blev ikke færdig på %2 sekunder. - + External command finished with errors. Ekstern kommando blev færdig med fejl. - + Command <i>%1</i> finished with exit code %2. Kommandoen <i>%1</i> blev færdig med afslutningskoden %2. @@ -2330,7 +2378,7 @@ Output: (intet monteringspunkt) - + Requirements checking for module <i>%1</i> is complete. Tjek at krav for modulet <i>%1</i> er fuldført. diff --git a/lang/calamares_de.ts b/lang/calamares_de.ts index ce0435f95..997fb8f02 100644 --- a/lang/calamares_de.ts +++ b/lang/calamares_de.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Warten auf %n Modul.Warten auf %n Modul(e). - + (%n second(s)) (%n Sekunde)(%n Sekunde(n)) - + System-requirements checking is complete. Die Überprüfung der Systemvoraussetzungen ist abgeschlossen. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Zurück - - + &Next &Weiter - - + &Cancel &Abbrechen - - + Cancel setup without changing the system. Brechen Sie die Installation ab, ohne das System zu verändern. - - + Cancel installation without changing the system. Installation abbrechen, ohne das System zu verändern. - + Setup Failed Setup fehlgeschlagen - + Calamares Initialization Failed Initialisierung von Calamares fehlgeschlagen - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 kann nicht installiert werden. Calamares war nicht in der Lage, alle konfigurierten Module zu laden. Dieses Problem hängt mit der Art und Weise zusammen, wie Calamares von der jeweiligen Distribution eingesetzt wird. - + <br/>The following modules could not be loaded: <br/>Die folgenden Module konnten nicht geladen werden: - + Continue with installation? Installation fortsetzen? - + 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> Das %1 Installationsprogramm ist dabei, Änderungen an Ihrer Festplatte vorzunehmen, um %2 einzurichten.<br/><strong> Sie werden diese Änderungen nicht rückgängig machen können.</strong> - + &Set up now &Jetzt einrichten - + &Set up &Einrichten - + &Install &Installieren - + Setup is complete. Close the setup program. Setup ist abgeschlossen. Schließe das Installationsprogramm. - + Cancel setup? Installation abbrechen? - + Cancel installation? Installation abbrechen? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Wollen Sie wirklich die aktuelle Installation abbrechen? Dies wird das Installationsprogramm beenden und alle Änderungen gehen verloren. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Wollen Sie wirklich die aktuelle Installation abbrechen? Dies wird das Installationsprogramm beenden und alle Änderungen gehen verloren. - + &Yes &Ja - + &No &Nein - + &Close &Schließen - + Continue with setup? Setup fortsetzen? - + 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> Das %1 Installationsprogramm wird Änderungen an Ihrer Festplatte vornehmen, um %2 zu installieren.<br/><strong>Diese Änderungen können nicht rückgängig gemacht werden.</strong> - + &Install now Jetzt &installieren - + Go &back Gehe &zurück - + &Done &Erledigt - + The installation is complete. Close the installer. Die Installation ist abgeschlossen. Schließe das Installationsprogramm. - + Error Fehler - + Installation Failed Installation gescheitert @@ -1160,7 +1156,7 @@ Dies wird das Installationsprogramm beenden und alle Änderungen gehen verloren. Setup Complete - Installation komplett + Installation abgeschlossen @@ -1290,6 +1286,22 @@ Dies wird das Installationsprogramm beenden und alle Änderungen gehen verloren. Konnte nicht in die Datei <code>%1</code> schreiben. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Erstelle initramfs mit mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + Erstelle initramfs. + + InteractiveTerminalPage @@ -1438,7 +1450,7 @@ Dies wird das Installationsprogramm beenden und alle Änderungen gehen verloren. Shows the complete license text - Zeigt den vollständigen Lizenztext an. + Zeigt den vollständigen Lizenztext an @@ -1513,6 +1525,42 @@ Dies wird das Installationsprogramm beenden und alle Änderungen gehen verloren. Standort + + LuksBootKeyFileJob + + + Configuring LUKS key file. + LUKS-Schlüsseldatei konfigurieren. + + + + + No partitions are defined. + Keine Partitionen definiert. + + + + + + Encrypted rootfs setup error + Verschlüsselter Rootfs-Setup-Fehler + + + + Root partition %1 is LUKS but no passphrase has been set. + Root-Partition %1 ist mit LUKS verschlüsselt, aber es wurde kein Passwort gesetzt. + + + + Could not create LUKS key file for root partition %1. + Konnte die LUKS-Schlüsseldatei für die Root-Partition %1 nicht erstellen. + + + + Could configure LUKS key file on partition %1. + Konnte die LUKS-Schlüsseldatei auf der Root-Partition %1 konfigurieren. + + NetInstallPage @@ -2220,14 +2268,14 @@ Dies wird das Installationsprogramm beenden und alle Änderungen gehen verloren. ProcessResult - + There was no output from the command. Dieser Befehl hat keine Ausgabe erzeugt. - + Output: @@ -2236,52 +2284,52 @@ Ausgabe: - + External command crashed. Externes Programm abgestürzt. - + Command <i>%1</i> crashed. Programm <i>%1</i> abgestürzt. - + External command failed to start. Externes Programm konnte nicht gestartet werden. - + Command <i>%1</i> failed to start. Das Programm <i>%1</i> konnte nicht gestartet werden. - + Internal error when starting command. Interner Fehler beim Starten des Programms. - + Bad parameters for process job call. Ungültige Parameter für Prozessaufruf. - + External command failed to finish. Externes Programm konnte nicht abgeschlossen werden. - + Command <i>%1</i> failed to finish in %2 seconds. Programm <i>%1</i> konnte nicht innerhalb von %2 Sekunden abgeschlossen werden. - + External command finished with errors. Externes Programm mit Fehlern beendet. - + Command <i>%1</i> finished with exit code %2. Befehl <i>%1</i> beendet mit Exit-Code %2. @@ -2330,7 +2378,7 @@ Ausgabe: (kein Einhängepunkt) - + Requirements checking for module <i>%1</i> is complete. Die Anforderungsprüfung für das Modul <i>%1</i> ist abgeschlossen. @@ -2462,7 +2510,7 @@ Ausgabe: Calamares cannot start KPMCore for the file-system resize job. - Calamares konnte KPMCore nicht zur Änderung der Dateisystemgröße starten. + Calamares kann KPMCore zur Änderung der Dateisystemgröße nicht starten. diff --git a/lang/calamares_el.ts b/lang/calamares_el.ts index e7b4d8131..f6351f912 100644 --- a/lang/calamares_el.ts +++ b/lang/calamares_el.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Προηγούμενο - - + &Next &Επόμενο - - + &Cancel &Ακύρωση - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Ακύρωση της εγκατάστασης χωρίς αλλαγές στο σύστημα. - + Setup Failed - + Calamares Initialization Failed Η αρχικοποίηση του Calamares απέτυχε - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install &Εγκατάσταση - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Ακύρωση της εγκατάστασης; - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Θέλετε πραγματικά να ακυρώσετε τη διαδικασία εγκατάστασης; Το πρόγραμμα εγκατάστασης θα τερματιστεί και όλες οι αλλαγές θα χαθούν. - + &Yes &Ναι - + &No &Όχι - + &Close &Κλείσιμο - + Continue with setup? Συνέχεια με την εγκατάσταση; - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Το πρόγραμμα εγκατάστασης %1 θα κάνει αλλαγές στον δίσκο για να εγκαταστήσετε το %2.<br/><strong>Δεν θα είστε σε θέση να αναιρέσετε τις αλλαγές.</strong> - + &Install now &Εγκατάσταση τώρα - + Go &back Μετάβαση &πίσω - + &Done &Ολοκληρώθηκε - + The installation is complete. Close the installer. Η εγκτάσταση ολοκληρώθηκε. Κλείστε το πρόγραμμα εγκατάστασης. - + Error Σφάλμα - + Installation Failed Η εγκατάσταση απέτυχε @@ -1289,6 +1285,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ The installer will quit and all changes will be lost. Τοποθεσία + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,65 +2267,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. Λανθασμένοι παράμετροι για την κλήση διεργασίας. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2326,7 +2374,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_en.ts b/lang/calamares_en.ts index 66d90f109..628f22a83 100644 --- a/lang/calamares_en.ts +++ b/lang/calamares_en.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Waiting for %n module(s).Waiting for %n module(s). - + (%n second(s)) (%n second(s))(%n second(s)) - + System-requirements checking is complete. System-requirements checking is complete. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Back - - + &Next &Next - - + &Cancel &Cancel - - + Cancel setup without changing the system. Cancel setup without changing the system. - - + Cancel installation without changing the system. Cancel installation without changing the system. - + Setup Failed Setup Failed - + Calamares Initialization Failed Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: <br/>The following modules could not be loaded: - + Continue with installation? Continue with installation? - + 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> 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> - + &Set up now &Set up now - + &Set up &Set up - + &Install &Install - + Setup is complete. Close the setup program. Setup is complete. Close the setup program. - + Cancel setup? Cancel setup? - + Cancel installation? Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes &Yes - + &No &No - + &Close &Close - + Continue with setup? Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now &Install now - + Go &back Go &back - + &Done &Done - + The installation is complete. Close the installer. The installation is complete. Close the installer. - + Error Error - + Installation Failed Installation Failed @@ -1290,6 +1286,22 @@ The installer will quit and all changes will be lost. Could not write to file <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Creating initramfs with mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + Creating initramfs. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ The installer will quit and all changes will be lost. Location + + LuksBootKeyFileJob + + + Configuring LUKS key file. + Configuring LUKS key file. + + + + + No partitions are defined. + No partitions are defined. + + + + + + Encrypted rootfs setup error + Encrypted rootfs setup error + + + + Root partition %1 is LUKS but no passphrase has been set. + Root partition %1 is LUKS but no passphrase has been set. + + + + Could not create LUKS key file for root partition %1. + Could not create LUKS key file for root partition %1. + + + + Could configure LUKS key file on partition %1. + Could configure LUKS key file on partition %1. + + NetInstallPage @@ -2220,14 +2268,14 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. There was no output from the command. - + Output: @@ -2236,52 +2284,52 @@ Output: - + External command crashed. External command crashed. - + Command <i>%1</i> crashed. Command <i>%1</i> crashed. - + External command failed to start. External command failed to start. - + Command <i>%1</i> failed to start. Command <i>%1</i> failed to start. - + Internal error when starting command. Internal error when starting command. - + Bad parameters for process job call. Bad parameters for process job call. - + External command failed to finish. External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. External command finished with errors. - + Command <i>%1</i> finished with exit code %2. Command <i>%1</i> finished with exit code %2. @@ -2330,7 +2378,7 @@ Output: (no mount point) - + Requirements checking for module <i>%1</i> is complete. Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_en_GB.ts b/lang/calamares_en_GB.ts index 366b778b9..61d62d04a 100644 --- a/lang/calamares_en_GB.ts +++ b/lang/calamares_en_GB.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Back - - + &Next &Next - - + &Cancel &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed Calamares Initialisation Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes &Yes - + &No &No - + &Close &Close - + Continue with setup? Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now &Install now - + Go &back Go &back - + &Done &Done - + The installation is complete. Close the installer. The installation is complete. Close the installer. - + Error Error - + Installation Failed Installation Failed @@ -1289,6 +1285,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ The installer will quit and all changes will be lost. Location + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,14 +2267,14 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. There was no output from the command. - + Output: @@ -2235,52 +2283,52 @@ Output: - + External command crashed. External command crashed. - + Command <i>%1</i> crashed. Command <i>%1</i> crashed. - + External command failed to start. External command failed to start. - + Command <i>%1</i> failed to start. Command <i>%1</i> failed to start. - + Internal error when starting command. Internal error when starting command. - + Bad parameters for process job call. Bad parameters for process job call. - + External command failed to finish. External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. External command finished with errors. - + Command <i>%1</i> finished with exit code %2. Command <i>%1</i> finished with exit code %2. @@ -2329,7 +2377,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_eo.ts b/lang/calamares_eo.ts index 86685fe8f..725791019 100644 --- a/lang/calamares_eo.ts +++ b/lang/calamares_eo.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back - - + &Next - - + &Cancel &Nuligi - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Nuligi instalado sen ŝanĝante la sistemo. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install &Instali - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Nuligi instalado? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Ĉu vi vere volas nuligi la instalan procedon? La instalilo forlasos kaj ĉiuj ŝanĝoj perdos. - + &Yes &Jes - + &No &Ne - + &Close &Fermi - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now &Instali nun - + Go &back - + &Done &Finita - + The installation is complete. Close the installer. - + Error Eraro - + Installation Failed @@ -1289,6 +1285,22 @@ La instalilo forlasos kaj ĉiuj ŝanĝoj perdos. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ La instalilo forlasos kaj ĉiuj ŝanĝoj perdos. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,65 +2267,65 @@ La instalilo forlasos kaj ĉiuj ŝanĝoj perdos. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2326,7 +2374,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_es.ts b/lang/calamares_es.ts index 2af1459f3..8c367e353 100644 --- a/lang/calamares_es.ts +++ b/lang/calamares_es.ts @@ -209,17 +209,17 @@ Para configurar el arranque desde un entorno BIOS, este instalador debe instalar Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -227,159 +227,155 @@ Para configurar el arranque desde un entorno BIOS, este instalador debe instalar Calamares::ViewManager - + &Back &Atrás - - + &Next &Siguiente - - + &Cancel &Cancelar - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Cancelar instalación sin cambiar el sistema. - + Setup Failed - + Calamares Initialization Failed La inicialización de Calamares falló - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 no se pudo instalar. Calamares no fue capaz de cargar todos los módulos configurados. Esto es un problema con la forma en que Calamares es usado por la distribución - + <br/>The following modules could not be loaded: Los siguientes módulos no se pudieron cargar: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install &Instalar - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? ¿Cancelar la instalación? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. ¿Realmente quiere cancelar el proceso de instalación? Saldrá del instalador y se perderán todos los cambios. - + &Yes &Sí - + &No &No - + &Close &Cerrar - + Continue with setup? ¿Continuar con la configuración? - + 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> El instalador %1 va a realizar cambios en su disco para instalar %2.<br/><strong>No podrá deshacer estos cambios.</strong> - + &Install now &Instalar ahora - + Go &back Regresar - + &Done &Hecho - + The installation is complete. Close the installer. La instalación se ha completado. Cierre el instalador. - + Error Error - + Installation Failed Error en la Instalación @@ -1290,6 +1286,22 @@ Saldrá del instalador y se perderán todos los cambios. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ Saldrá del instalador y se perderán todos los cambios. Ubicación + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2220,14 +2268,14 @@ Saldrá del instalador y se perderán todos los cambios. ProcessResult - + There was no output from the command. No hubo salida del comando. - + Output: @@ -2236,52 +2284,52 @@ Salida: - + External command crashed. El comando externo falló. - + Command <i>%1</i> crashed. El comando <i>%1</i> falló. - + External command failed to start. El comando externo no se pudo iniciar. - + Command <i>%1</i> failed to start. El comando <i>%1</i> no se pudo iniciar. - + Internal error when starting command. Error interno al iniciar el comando. - + Bad parameters for process job call. Parámetros erróneos para la llamada de la tarea del procreso. - + External command failed to finish. El comando externo no se pudo finalizar. - + Command <i>%1</i> failed to finish in %2 seconds. El comando <i>%1</i> no se pudo finalizar en %2 segundos. - + External command finished with errors. El comando externo finalizó con errores. - + Command <i>%1</i> finished with exit code %2. El comando <i>%1</i> finalizó con un código de salida %2. @@ -2330,7 +2378,7 @@ Salida: (sin punto de montaje) - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_es_MX.ts b/lang/calamares_es_MX.ts index 4a698bd18..f3a9b2db1 100644 --- a/lang/calamares_es_MX.ts +++ b/lang/calamares_es_MX.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. Chequeo de requerimientos del sistema completado. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Atrás - - + &Next &Siguiente - - + &Cancel &Cancelar - - + Cancel setup without changing the system. Cancelar la configuración sin cambiar el sistema. - - + Cancel installation without changing the system. Cancelar instalación sin cambiar el sistema. - + Setup Failed Fallo en la configuración. - + Calamares Initialization Failed La inicialización de Calamares ha fallado - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 no pudo ser instalado. Calamares no pudo cargar todos los módulos configurados. Este es un problema con la forma en que Calamares esta siendo usada por la distribución. - + <br/>The following modules could not be loaded: <br/>Los siguientes módulos no pudieron ser cargados: - + Continue with installation? ¿Continuar con la instalación? - + 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> El %1 programa de instalación esta a punto de realizar cambios a su disco con el fin de establecer %2.<br/><strong>Usted no podrá deshacer estos cambios.</strong> - + &Set up now &Configurar ahora - + &Set up &Configurar - + &Install &Instalar - + Setup is complete. Close the setup program. Configuración completa. Cierre el programa de instalación. - + Cancel setup? ¿Cancelar la configuración? - + Cancel installation? ¿Cancelar la instalación? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. ¿Realmente desea cancelar el actual proceso de configuración? El programa de instalación se cerrará y todos los cambios se perderán. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. ¿Realmente desea cancelar el proceso de instalación actual? El instalador terminará y se perderán todos los cambios. - + &Yes &Si - + &No &No - + &Close &Cerrar - + Continue with setup? ¿Continuar con la instalación? - + 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> El instalador %1 va a realizar cambios en su disco para instalar %2.<br/><strong>No podrá deshacer estos cambios.</strong> - + &Install now &Instalar ahora - + Go &back &Regresar - + &Done &Hecho - + The installation is complete. Close the installer. Instalación completa. Cierre el instalador. - + Error Error - + Installation Failed Instalación Fallida @@ -1291,6 +1287,22 @@ El instalador terminará y se perderán todos los cambios. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1514,6 +1526,42 @@ El instalador terminará y se perderán todos los cambios. Ubicación + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2221,14 +2269,14 @@ El instalador terminará y se perderán todos los cambios. ProcessResult - + There was no output from the command. No hubo salida desde el comando. - + Output: @@ -2237,52 +2285,52 @@ Salida - + External command crashed. El comando externo ha fallado. - + Command <i>%1</i> crashed. El comando <i>%1</i> ha fallado. - + External command failed to start. El comando externo falló al iniciar. - + Command <i>%1</i> failed to start. El comando <i>%1</i> Falló al iniciar. - + Internal error when starting command. Error interno al iniciar el comando. - + Bad parameters for process job call. Parámetros erróneos en la llamada al proceso. - + External command failed to finish. Comando externo falla al finalizar - + Command <i>%1</i> failed to finish in %2 seconds. Comando <i>%1</i> falló al finalizar en %2 segundos. - + External command finished with errors. Comando externo finalizado con errores - + Command <i>%1</i> finished with exit code %2. Comando <i>%1</i> finalizó con código de salida %2. @@ -2331,7 +2379,7 @@ Salida - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_es_PR.ts b/lang/calamares_es_PR.ts index 29df800cc..4eacba4a9 100644 --- a/lang/calamares_es_PR.ts +++ b/lang/calamares_es_PR.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back &Atrás - - + &Next &Próximo - - + &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error Error - + Installation Failed Falló la instalación @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. Ubicación + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. Parámetros erróneos para el trabajo en proceso. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_et.ts b/lang/calamares_et.ts index ccff140ab..82674b075 100644 --- a/lang/calamares_et.ts +++ b/lang/calamares_et.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Tagasi - - + &Next &Edasi - - + &Cancel &Tühista - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Tühista paigaldamine ilma süsteemi muutmata. - + Setup Failed - + Calamares Initialization Failed Calamarese alglaadimine ebaõnnestus - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 ei saa paigaldada. Calamares ei saanud laadida kõiki konfigureeritud mooduleid. See on distributsiooni põhjustatud Calamarese kasutamise viga. - + <br/>The following modules could not be loaded: <br/>Järgnevaid mooduleid ei saanud laadida: - + Continue with installation? - + 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> - + &Set up now - + &Seadista kohe - + &Set up - + &Seadista - + &Install &Paigalda - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Tühista paigaldamine? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Kas sa tõesti soovid tühistada praeguse paigaldusprotsessi? Paigaldaja sulgub ning kõik muutused kaovad. - + &Yes &Jah - + &No &Ei - + &Close &Sulge - + Continue with setup? Jätka seadistusega? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 paigaldaja on tegemas muudatusi sinu kettale, et paigaldada %2.<br/><strong>Sa ei saa neid muudatusi tagasi võtta.</strong> - + &Install now &Paigalda kohe - + Go &back Mine &tagasi - + &Done &Valmis - + The installation is complete. Close the installer. Paigaldamine on lõpetatud. Sulge paigaldaja. - + Error Viga - + Installation Failed Paigaldamine ebaõnnestus @@ -1111,7 +1107,7 @@ Paigaldaja sulgub ning kõik muutused kaovad. <Restart checkbox tooltip> - + <Restart checkbox tooltip> @@ -1159,7 +1155,7 @@ Paigaldaja sulgub ning kõik muutused kaovad. Setup Complete - + Seadistus valmis @@ -1289,6 +1285,22 @@ Paigaldaja sulgub ning kõik muutused kaovad. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ Paigaldaja sulgub ning kõik muutused kaovad. Asukoht + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,14 +2267,14 @@ Paigaldaja sulgub ning kõik muutused kaovad. ProcessResult - + There was no output from the command. Käsul polnud väljundit. - + Output: @@ -2235,52 +2283,52 @@ Väljund: - + External command crashed. Väline käsk jooksis kokku. - + Command <i>%1</i> crashed. Käsk <i>%1</i> jooksis kokku. - + External command failed to start. Välise käsu käivitamine ebaõnnestus. - + Command <i>%1</i> failed to start. Käsu <i>%1</i> käivitamine ebaõnnestus. - + Internal error when starting command. Käsu käivitamisel esines sisemine viga. - + Bad parameters for process job call. Protsessi töö kutsel olid halvad parameetrid. - + External command failed to finish. Väline käsk ei suutnud lõpetada. - + Command <i>%1</i> failed to finish in %2 seconds. Käsk <i>%1</i> ei suutnud lõpetada %2 sekundi jooksul. - + External command finished with errors. Väline käsk lõpetas vigadega. - + Command <i>%1</i> finished with exit code %2. Käsk <i>%1</i> lõpetas sulgemiskoodiga %2. @@ -2329,7 +2377,7 @@ Väljund: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_eu.ts b/lang/calamares_eu.ts index 7365976a6..0698b7b78 100644 --- a/lang/calamares_eu.ts +++ b/lang/calamares_eu.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Atzera - - + &Next &Hurrengoa - - + &Cancel &Utzi - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Instalazioa bertan behera utsi da sisteman aldaketarik gabe. - + Setup Failed - + Calamares Initialization Failed Calamares instalazioak huts egin du - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 ezin da instalatu. Calamares ez da gai konfiguratutako modulu guztiak kargatzeko. Arazao hau banaketak Calamares erabiltzen duen eragatik da. - + <br/>The following modules could not be loaded: <br/> Ondorengo moduluak ezin izan dira kargatu: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install &Instalatu - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Bertan behera utzi instalazioa? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Ziur uneko instalazio prozesua bertan behera utzi nahi duzula? Instalatzailea irten egingo da eta aldaketa guztiak galduko dira. - + &Yes &Bai - + &No &Ez - + &Close &Itxi - + Continue with setup? Ezarpenarekin jarraitu? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 instalatzailea zure diskoan aldaketak egitera doa %2 instalatzeko.<br/><strong>Ezingo dituzu desegin aldaketa hauek.</strong> - + &Install now &Instalatu orain - + Go &back &Atzera - + &Done E&ginda - + The installation is complete. Close the installer. Instalazioa burutu da. Itxi instalatzailea. - + Error Akatsa - + Installation Failed Instalazioak huts egin du @@ -1289,6 +1285,22 @@ Instalatzailea irten egingo da eta aldaketa guztiak galduko dira. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ Instalatzailea irten egingo da eta aldaketa guztiak galduko dira. Kokapena + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,13 +2267,13 @@ Instalatzailea irten egingo da eta aldaketa guztiak galduko dira. ProcessResult - + There was no output from the command. - + Output: @@ -2234,52 +2282,52 @@ Irteera: - + External command crashed. Kanpo-komandoak huts egin du. - + Command <i>%1</i> crashed. <i>%1</i> komandoak huts egin du. - + External command failed to start. Ezin izan da %1 kanpo-komandoa abiarazi. - + Command <i>%1</i> failed to start. Ezin izan da <i>%1</i> komandoa abiarazi. - + Internal error when starting command. Barne-akatsa komandoa abiarazterakoan. - + Bad parameters for process job call. - + External command failed to finish. Kanpo-komandoa ez da bukatu. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. Kanpo-komandoak akatsekin bukatu da. - + Command <i>%1</i> finished with exit code %2. @@ -2328,7 +2376,7 @@ Irteera: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_fa.ts b/lang/calamares_fa.ts index 1b2cbf823..43c251241 100644 --- a/lang/calamares_fa.ts +++ b/lang/calamares_fa.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back - - + &Next - - + &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error - + Installation Failed @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_fi_FI.ts b/lang/calamares_fi_FI.ts index be8928448..047a6fbaf 100644 --- a/lang/calamares_fi_FI.ts +++ b/lang/calamares_fi_FI.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Odotetaan %n moduuli(t).Odotetaan %n moduuli(t). - + (%n second(s)) (%n sekunttia(s))(%n sekunttia(s)) - + System-requirements checking is complete. Järjestelmävaatimusten tarkistus on valmis. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Takaisin - - + &Next &Seuraava - - + &Cancel &Peruuta - - + Cancel setup without changing the system. Peruuta asennus muuttamatta järjestelmää. - - + Cancel installation without changing the system. Peruuta asennus tekemättä muutoksia järjestelmään. - + Setup Failed Asennus epäonnistui - + Calamares Initialization Failed Calamares-alustustaminen epäonnistui - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 ei voida asentaa. Calamares ei voinut ladata kaikkia määritettyjä moduuleja. Ongelma on siinä, miten jakelu käyttää Calamaresia. - + <br/>The following modules could not be loaded: <br/>Seuraavia moduuleja ei voitu ladata: - + Continue with installation? Jatka asennusta? - + 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> %1 asennusohjelma on aikeissa tehdä muutoksia levylle, jotta voit määrittää kohteen %2.<br/><strong>Et voi kumota näitä muutoksia.</strong> - + &Set up now &Määritä nyt - + &Set up &Määritä - + &Install &Asenna - + Setup is complete. Close the setup program. Asennus on valmis. Sulje asennusohjelma. - + Cancel setup? Peruuta asennus? - + Cancel installation? Peruuta asennus? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Haluatko todella peruuttaa nykyisen asennuksen? Asennusohjelma lopetetaan ja kaikki muutokset menetetään. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Oletko varma että haluat peruuttaa käynnissä olevan asennusprosessin? Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. - + &Yes &Kyllä - + &No &Ei - + &Close &Sulje - + Continue with setup? Jatka asennusta? - + 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> Asennus ohjelman %1 on tehtävä muutoksia levylle, jotta %2 voidaan asentaa.<br/><strong>Et voi kumota näitä muutoksia.</strong> - + &Install now &Asenna nyt - + Go &back Mene &takaisin - + &Done &Valmis - + The installation is complete. Close the installer. Asennus on valmis. Sulje asennusohjelma. - + Error Virhe - + Installation Failed Asennus Epäonnistui @@ -1290,6 +1286,22 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. Tiedostoon ei voitu kirjoittaa <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Initramfs luominen mkinitcpion avulla. + + + + InitramfsJob + + + Creating initramfs. + Luodaan initramfs. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. Sijainti + + LuksBootKeyFileJob + + + Configuring LUKS key file. + LUKS-avaintiedoston määrittäminen. + + + + + No partitions are defined. + Osioita ei ole määritelty. + + + + + + Encrypted rootfs setup error + Salattu rootfs asennusvirhe + + + + Root partition %1 is LUKS but no passphrase has been set. + Juuriosio %1 on LUKS, mutta salasanaa ei ole asetettu. + + + + Could not create LUKS key file for root partition %1. + LUKS-avaintiedostoa ei voitu luoda juuriosioon %1. + + + + Could configure LUKS key file on partition %1. + Voit määrittää LUKS-avaimen osioon %1. + + NetInstallPage @@ -2220,14 +2268,14 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat. ProcessResult - + There was no output from the command. Komentoa ei voitu ajaa. - + Output: @@ -2236,52 +2284,52 @@ Ulostulo: - + External command crashed. Ulkoinen komento kaatui. - + Command <i>%1</i> crashed. Komento <i>%1</i> kaatui. - + External command failed to start. Ulkoisen komennon käynnistäminen epäonnistui. - + Command <i>%1</i> failed to start. Komennon <i>%1</i> käynnistäminen epäonnistui. - + Internal error when starting command. Sisäinen virhe käynnistettäessä komentoa. - + Bad parameters for process job call. Huonot parametrit prosessin kutsuun. - + External command failed to finish. Ulkoinen komento ei onnistunut. - + Command <i>%1</i> failed to finish in %2 seconds. Komento <i>%1</i> epäonnistui %2 sekunnissa. - + External command finished with errors. Ulkoinen komento päättyi virheisiin. - + Command <i>%1</i> finished with exit code %2. Komento <i>%1</i> päättyi koodiin %2. @@ -2330,7 +2378,7 @@ Ulostulo: (ei liitoskohtaa) - + Requirements checking for module <i>%1</i> is complete. Moduulin vaatimusten tarkistaminen <i>%1</i> on valmis. diff --git a/lang/calamares_fr.ts b/lang/calamares_fr.ts index d6d2f0017..b3e8f620c 100644 --- a/lang/calamares_fr.ts +++ b/lang/calamares_fr.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). En attente de %n module(s).En attente de %n module(s). - + (%n second(s)) (%n seconde(s))(%n seconde(s)) - + System-requirements checking is complete. La vérification des prérequis système est terminée. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Précédent - - + &Next &Suivant - - + &Cancel &Annuler - - + Cancel setup without changing the system. Annuler la configuration sans toucher au système. - - + Cancel installation without changing the system. Annuler l'installation sans modifier votre système. - + Setup Failed Échec de la configuration - + Calamares Initialization Failed L'initialisation de Calamares a échoué - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 n'a pas pu être installé. Calamares n'a pas pu charger tous les modules configurés. C'est un problème avec la façon dont Calamares est utilisé par la distribution. - + <br/>The following modules could not be loaded: Les modules suivants n'ont pas pu être chargés : - + Continue with installation? Continuer avec l'installation ? - + 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> Le programme de configuration de %1 est sur le point de procéder aux changements sur le disque afin de configurer %2.<br/> <strong>Vous ne pourrez pas annulez ces changements.</strong> - + &Set up now &Configurer maintenant - + &Set up &Configurer - + &Install &Installer - + Setup is complete. Close the setup program. La configuration est terminée. Fermer le programme de configuration. - + Cancel setup? Annuler la configuration ? - + Cancel installation? Abandonner l'installation ? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Voulez-vous réellement abandonner le processus de configuration ? Le programme de configuration se fermera et les changements seront perdus. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Voulez-vous réellement abandonner le processus d'installation ? L'installateur se fermera et les changements seront perdus. - + &Yes &Oui - + &No &Non - + &Close &Fermer - + Continue with setup? Poursuivre la configuration ? - + 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> L'installateur %1 est sur le point de procéder aux changements sur le disque afin d'installer %2.<br/> <strong>Vous ne pourrez pas annulez ces changements.<strong> - + &Install now &Installer maintenant - + Go &back &Retour - + &Done &Terminé - + The installation is complete. Close the installer. L'installation est terminée. Fermer l'installateur. - + Error Erreur - + Installation Failed L'installation a échoué @@ -1290,6 +1286,22 @@ L'installateur se fermera et les changements seront perdus. Impossible d'écrire dans le fichier <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Création de l'initramfs avec mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + création du initramfs + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ L'installateur se fermera et les changements seront perdus. Localisation + + LuksBootKeyFileJob + + + Configuring LUKS key file. + Configuration de la clé de fichier LUKS. + + + + + No partitions are defined. + Aucune partition n'est définie. + + + + + + Encrypted rootfs setup error + Erreur du chiffrement du setup rootfs + + + + Root partition %1 is LUKS but no passphrase has been set. + La partition racine %1 est LUKS mais aucune passphrase n'a été configurée. + + + + Could not create LUKS key file for root partition %1. + Impossible de créer le fichier de clé LUKS pour la partition racine %1. + + + + Could configure LUKS key file on partition %1. + Succès de la création du fichier de clé LUKS pour la partition racine %1. + + NetInstallPage @@ -2221,14 +2269,14 @@ Vous pouvez obtenir un aperçu des différentes apparences en cliquant sur celle ProcessResult - + There was no output from the command. Il y a eu aucune sortie de la commande - + Output: @@ -2237,52 +2285,52 @@ Sortie - + External command crashed. La commande externe s'est mal terminée. - + Command <i>%1</i> crashed. La commande <i>%1</i> s'est arrêtée inopinément. - + External command failed to start. La commande externe n'a pas pu être lancée. - + Command <i>%1</i> failed to start. La commande <i>%1</i> n'a pas pu être lancée. - + Internal error when starting command. Erreur interne au lancement de la commande - + Bad parameters for process job call. Mauvais paramètres pour l'appel au processus de job. - + External command failed to finish. La commande externe ne s'est pas terminée. - + Command <i>%1</i> failed to finish in %2 seconds. La commande <i>%1</i> ne s'est pas terminée en %2 secondes. - + External command finished with errors. La commande externe s'est terminée avec des erreurs. - + Command <i>%1</i> finished with exit code %2. La commande <i>%1</i> s'est terminée avec le code de sortie %2. @@ -2331,7 +2379,7 @@ Sortie (aucun point de montage) - + Requirements checking for module <i>%1</i> is complete. La vérification des prérequis pour le module <i>%1</i> est terminée. diff --git a/lang/calamares_fr_CH.ts b/lang/calamares_fr_CH.ts index 7d8969f66..abd87a2ca 100644 --- a/lang/calamares_fr_CH.ts +++ b/lang/calamares_fr_CH.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back - - + &Next - - + &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error - + Installation Failed @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_gl.ts b/lang/calamares_gl.ts index befb59012..d8bd5006d 100644 --- a/lang/calamares_gl.ts +++ b/lang/calamares_gl.ts @@ -209,17 +209,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -227,159 +227,155 @@ Calamares::ViewManager - + &Back &Atrás - - + &Next &Seguinte - - + &Cancel &Cancelar - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Cancelar a instalación sen cambiar o sistema - + Setup Failed - + Calamares Initialization Failed Fallou a inicialización do Calamares - + %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. Non é posíbel instalar %1. O calamares non foi quen de cargar todos os módulos configurados. Este é un problema relacionado con como esta distribución utiliza o Calamares. - + <br/>The following modules could not be loaded: <br/> Non foi posíbel cargar os módulos seguintes: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install &Instalar - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Cancelar a instalación? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Desexa realmente cancelar o proceso actual de instalación? O instalador pecharase e perderanse todos os cambios. - + &Yes &Si - + &No &Non - + &Close &Pechar - + Continue with setup? Continuar coa posta en marcha? - + 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> O %1 instalador está a piques de realizar cambios no seu disco para instalar %2.<br/><strong>Estes cambios non poderán desfacerse.</strong> - + &Install now &Instalar agora - + Go &back Ir &atrás - + &Done &Feito - + The installation is complete. Close the installer. Completouse a instalacion. Peche o instalador - + Error Erro - + Installation Failed Erro na instalación @@ -1290,6 +1286,22 @@ O instalador pecharase e perderanse todos os cambios. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ O instalador pecharase e perderanse todos os cambios. Localización... + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2220,14 +2268,14 @@ O instalador pecharase e perderanse todos os cambios. ProcessResult - + There was no output from the command. A saída non produciu ningunha saída. - + Output: @@ -2236,52 +2284,52 @@ Saída: - + External command crashed. A orde externa fallou - + Command <i>%1</i> crashed. A orde <i>%1</i> fallou. - + External command failed to start. Non foi posíbel iniciar a orde externa. - + Command <i>%1</i> failed to start. Non foi posíbel iniciar a orde <i>%1</i>. - + Internal error when starting command. Produciuse un erro interno ao iniciar a orde. - + Bad parameters for process job call. Erro nos parámetros ao chamar o traballo - + External command failed to finish. A orde externa non se puido rematar. - + Command <i>%1</i> failed to finish in %2 seconds. A orde <i>%1</i> non se puido rematar en %2s segundos. - + External command finished with errors. A orde externa rematou con erros. - + Command <i>%1</i> finished with exit code %2. A orde <i>%1</i> rematou co código de erro %2. @@ -2330,7 +2378,7 @@ Saída: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_gu.ts b/lang/calamares_gu.ts index 1e9c71185..79c880be9 100644 --- a/lang/calamares_gu.ts +++ b/lang/calamares_gu.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back - - + &Next - - + &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error - + Installation Failed @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_he.ts b/lang/calamares_he.ts index 3dc37fd5f..bba1c30e8 100644 --- a/lang/calamares_he.ts +++ b/lang/calamares_he.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). בהמתנה למודול אחד.בהמתנה לשני מודולים.בהמתנה ל־%n מודולים.בהמתנה ל־%n מודולים. - + (%n second(s)) ((שנייה אחת)(שתי שניות)(%n שניות)(%n שניות) - + System-requirements checking is complete. בדיקת דרישות המערכת הושלמה. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back ה&קודם - - + &Next הב&א - - + &Cancel &ביטול - - + Cancel setup without changing the system. ביטול ההתקנה ללא שינוי המערכת. - - + Cancel installation without changing the system. ביטול התקנה ללא ביצוע שינוי במערכת. - + Setup Failed ההתקנה נכשלה - + Calamares Initialization Failed הפעלת Calamares נכשלה - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. אין אפשרות להתקין את %1. ל־Calamares אין אפשרות לטעון את המודולים המוגדרים. מדובר בתקלה באופן בו ההפצה משתמשת ב־Calamares. - + <br/>The following modules could not be loaded: <br/>לא ניתן לטעון את המודולים הבאים: - + Continue with installation? להמשיך בהתקנה? - + 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> תכנית ההתקנה של %1 עומדת לבצע שינויים בכונן הקשיח שלך לטובת התקנת %2.<br/><strong>לא תהיה לך אפשרות לבטל את השינויים האלה.</strong> - + &Set up now להת&קין כעת - + &Set up להת&קין - + &Install הת&קנה - + Setup is complete. Close the setup program. ההתקנה הושלמה. נא לסגור את תכנית ההתקנה. - + Cancel setup? לבטל את ההתקנה? - + Cancel installation? לבטל את ההתקנה? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. לבטל את תהליך ההתקנה הנוכחי? תכנית ההתקנה תצא וכל השינויים יאבדו. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. לבטל את תהליך ההתקנה? אשף ההתקנה ייסגר וכל השינויים יאבדו. - + &Yes &כן - + &No &לא - + &Close &סגירה - + Continue with setup? להמשיך בהתקנה? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> אשף ההתקנה של %1 הולך לבצע שינויים בכונן שלך לטובת התקנת %2.<br/><strong>לא תוכל לבטל את השינויים הללו.</strong> - + &Install now להת&קין כעת - + Go &back ח&זרה - + &Done &סיום - + The installation is complete. Close the installer. תהליך ההתקנה הושלם. נא לסגור את אשף ההתקנה. - + Error שגיאה - + Installation Failed ההתקנה נכשלה @@ -1290,6 +1286,22 @@ The installer will quit and all changes will be lost. לא ניתן לכתוב לקובץ <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + נוצר initramfs עם mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + נוצר initramfs. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ The installer will quit and all changes will be lost. מיקום + + LuksBootKeyFileJob + + + Configuring LUKS key file. + קובץ מפתח ה־LUKS מוגדר. + + + + + No partitions are defined. + לא הוגדרו מחיצות. + + + + + + Encrypted rootfs setup error + שגיאת התקנת מחיצת שורש מוצפנת + + + + Root partition %1 is LUKS but no passphrase has been set. + מחיצת השורש %1 היא LUKS אבל לא הוגדרה מילת צופן. + + + + Could not create LUKS key file for root partition %1. + לא ניתן ליצור קובץ מפתח LUKS למחיצת השורש %1. + + + + Could configure LUKS key file on partition %1. + לא ניתן להגדיר קובץ מפתח LUKS למחיצה %1. + + NetInstallPage @@ -2220,14 +2268,14 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. לא היה פלט מהפקודה. - + Output: @@ -2236,52 +2284,52 @@ Output: - + External command crashed. הפקודה החיצונית נכשלה. - + Command <i>%1</i> crashed. הפקודה <i>%1</i> קרסה. - + External command failed to start. הפעלת הפעולה החיצונית נכשלה. - + Command <i>%1</i> failed to start. הפעלת הפקודה <i>%1</i> נכשלה. - + Internal error when starting command. שגיאה פנימית בעת הפעלת פקודה. - + Bad parameters for process job call. פרמטרים לא תקינים עבור קריאת עיבוד פעולה. - + External command failed to finish. סיום הפקודה החיצונית נכשל. - + Command <i>%1</i> failed to finish in %2 seconds. הפקודה <i>%1</i> לא הסתיימה תוך %2 שניות. - + External command finished with errors. הפקודה החיצונית הסתיימה עם שגיאות. - + Command <i>%1</i> finished with exit code %2. הפקודה <i>%1</i> הסתיימה עם קוד היציאה %2. @@ -2330,7 +2378,7 @@ Output: (אין נקודת עגינה) - + Requirements checking for module <i>%1</i> is complete. בדיקת הדרישות למודול <i>%1</i> הושלמה. diff --git a/lang/calamares_hi.ts b/lang/calamares_hi.ts index 8fcd48dcb..127346027 100644 --- a/lang/calamares_hi.ts +++ b/lang/calamares_hi.ts @@ -14,7 +14,7 @@ This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. - यह सिस्टम <strong>BIOS</strong>बूट वातावरण के साथ शुरू किया गया।<br><br>BIOS वातावरण से स्टार्टअप विन्यस्त करने के लिए इंस्टॉलर को <strong>GRUB</strong> जैसे बूट लोडर को, या तो विभाजन की शुरुआत में या फिर <strong>Master Boot Record</strong> पर विभाजन तालिका की शुरुआत में इंस्टॉल (सुझाया जाता है) करना होगा। यह स्वत: होता है, परंतु अगर आप मैनुअल विभाजन करना चुनते है; तो आपको इसे खुद ही बनाना होगा। + यह सिस्टम <strong>BIOS</strong>बूट वातावरण के साथ शुरू किया गया।<br><br>BIOS वातावरण से स्टार्टअप विन्यस्त करने के लिए इंस्टॉलर को <strong>GRUB</strong> जैसे बूट लोडर को, या तो विभाजन की शुरुआत में या फिर <strong>मास्टर बूट रिकॉर्ड</strong> पर विभाजन तालिका की शुरुआत में इंस्टॉल (सुझाया जाता है) करना होगा। यह स्वत: होता है, परंतु अगर आप मैनुअल विभाजन करना चुनते है; तो आपको इसे खुद ही बनाना होगा। @@ -22,7 +22,7 @@ Master Boot Record of %1 - %1 का Master Boot Record + %1 का मास्टर बूट रिकॉर्ड @@ -63,22 +63,22 @@ GlobalStorage - GlobalStorage + ग्लोबल स्टोरेज JobQueue - JobQueue + कार्य पंक्ति Modules - मापांक + मॉड्यूल Type: - प्रकार + प्रकार : @@ -89,7 +89,7 @@ Interface: - अंतरफलक : + इंटरफ़ेस : @@ -99,17 +99,17 @@ Reload Stylesheet - + शैली पत्रक पुनः लोड करें Widget Tree - + विजेट ट्री Debug information - डीबग संबंधी जानकारी + डीबग जानकारी @@ -117,7 +117,7 @@ Set up - + सेटअप @@ -130,12 +130,12 @@ Job failed (%1) - + कार्य विफल रहा (%1) Programmed job failure was explicitly requested. - + प्रोग्राम किए गए कार्य की विफलता स्पष्ट रूप से अनुरोध की गई थी। @@ -143,7 +143,7 @@ Done - पूर्ण + पूर्ण हुआ @@ -151,7 +151,7 @@ Example job (%1) - + उदाहरण कार्य (%1) @@ -159,12 +159,12 @@ Run command '%1' in target system. - + लक्षित सिस्टम में कमांड '%1' चलाएँ। Run command '%1'. - + कमांड '%1' चलाएँ। @@ -187,200 +187,197 @@ Working directory %1 for python job %2 is not readable. - Python job %2 के लिए कार्यरत डायरेक्टरी %1 रीड करने योग्य नहीं है। + पाइथन कार्य %2 के लिए कार्यरत डायरेक्टरी %1 रीड करने योग्य नहीं है। Bad main script file - मुख्य स्क्रिप्ट फ़ाइल गलत है + ख़राब मुख्य स्क्रिप्ट फ़ाइल Main script file %1 for python job %2 is not readable. - Python job %2 के लिए मुख्य स्क्रिप्ट फ़ाइल %1 रीड करने योग्य नहीं है। + पाइथन कार्य %2 हेतु मुख्य स्क्रिप्ट फ़ाइल %1 रीड करने योग्य नहीं है। Boost.Python error in job "%1". - Job "%1" में Boost.Python त्रुटि। + कार्य "%1" में Boost.Python त्रुटि। Calamares::RequirementsChecker - + Waiting for %n module(s). - + %n मॉड्यूल की प्रतीक्षा में।%n मॉड्यूल की प्रतीक्षा में। - + (%n second(s)) - + (%n सेकंड)(%n सेकंड) - + System-requirements checking is complete. - + सिस्टम हेतु आवश्यकताओं की जाँच पूर्ण हुई। Calamares::ViewManager - + &Back वापस (&B) - - + &Next आगे (&N) - - + &Cancel रद्द करें (&C) - - + Cancel setup without changing the system. - + सिस्टम में बदलाव किये बिना सेटअप रद्द करें। - - + Cancel installation without changing the system. सिस्टम में बदलाव किये बिना इंस्टॉल रद्द करें। - + Setup Failed - + सेटअप विफल रहा - + Calamares Initialization Failed Calamares का आरंभीकरण विफल रहा - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - %1 को इंस्टॉल नहीं किया जा सका। Calamares सारे विन्यस्त मापांकों को लोड करने में विफल रहा। इस समस्या का कारण लिनक्स-वितरण द्वारा Calamares के उपयोग-संबंधी कोई त्रुटि है। + %1 को इनस्टॉल नहीं किया जा सका। Calamares सभी विन्यस्त मापांकों को लोड करने में विफल रहा। यह आपके लिनक्स वितरण द्वारा Calamares के उपयोग से संबंधित एक समस्या है। - + <br/>The following modules could not be loaded: <br/>निम्नलिखित मापांक लोड नहीं हो सकें : - + Continue with installation? - + इंस्टॉल प्रक्रिया जारी रखें? - + 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> - + %2 सेटअप करने हेतु %1 सेटअप प्रोग्राम आपकी डिस्क में बदलाव करने वाला है।<br/><strong>आप इन बदलावों को पूर्ववत नहीं कर पाएंगे।</strong> - + &Set up now - + अभी सेटअप करें (&S) - + &Set up - + सेटअप करें (&S) - + &Install इंस्टॉल करें (&I) - + Setup is complete. Close the setup program. - + सेटअप पूर्ण हुआ। सेटअप प्रोग्राम बंद कर दें। - + Cancel setup? - + सेटअप रद्द करें? - + Cancel installation? इंस्टॉल रद्द करें? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + क्या आप वाकई वर्तमान सेटअप प्रक्रिया रद्द करना चाहते हैं? +सेटअप प्रोग्राम बंद हो जाएगा व सभी बदलाव नष्ट। - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. क्या आप वाकई वर्तमान इंस्टॉल प्रक्रिया रद्द करना चाहते हैं? इंस्टॉलर बंद हो जाएगा व सभी बदलाव नष्ट। - + &Yes हाँ (&Y) - + &No नहीं (&N) - + &Close बंद करें (&C) - + Continue with setup? सेटअप करना जारी रखें? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - %2 इंस्टॉल करने के लिए %1 इंस्टॉलर आपकी डिस्क में बदलाव करने वाला है।<br/><strong>आप इन बदलावों को पूर्ववत नहीं कर पाएंगे।</strong> + %2 इंस्टॉल करने हेतु %1 इंस्टॉलर आपकी डिस्क में बदलाव करने वाला है।<br/><strong>आप इन बदलावों को पूर्ववत नहीं कर पाएंगे।</strong> - + &Install now अभी इंस्टॉल करें (&I) - + Go &back वापस जाएँ (&b) - + &Done - पूर्ण हुआ (&D) + हो गया (&D) - + The installation is complete. Close the installer. - इंस्टॉल पूर्ण हुआ। अब इंस्टॉलर को बंद करें। + इंस्टॉल पूर्ण हुआ।अब इंस्टॉलर को बंद करें। - + Error त्रुटि - + Installation Failed - इंस्टॉल विफल रहा। + इंस्टॉल विफल रहा @@ -388,22 +385,22 @@ The installer will quit and all changes will be lost. Unknown exception type - अपवाद का प्रकार अज्ञात है + अपवाद का प्रकार अज्ञात unparseable Python error - unparseable Python त्रुटि + अप्राप्य पाइथन त्रुटि unparseable Python traceback - unparseable Python traceback + अप्राप्य पाइथन ट्रेसबैक Unfetchable Python error. - Unfetchable Python त्रुटि। + पहुँच से बाहर पाइथन त्रुटि। @@ -411,7 +408,7 @@ The installer will quit and all changes will be lost. %1 Setup Program - + %1 सेटअप प्रोग्राम @@ -421,7 +418,7 @@ The installer will quit and all changes will be lost. Show debug information - डीबग संबंधी जानकारी दिखाएँ + डीबग जानकारी दिखाएँ @@ -442,7 +439,7 @@ The installer will quit and all changes will be lost. After: - बाद में: + बाद में : @@ -452,7 +449,7 @@ The installer will quit and all changes will be lost. Boot loader location: - बूट लोडर का स्थान: + बूट लोडर का स्थान : @@ -475,17 +472,17 @@ The installer will quit and all changes will be lost. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> - <strong>छोटा करने के लिए विभाजन चुनें, फिर नीचे bar से उसका आकर सेट करें</strong> + <strong>छोटा करने हेतु विभाजन चुनें, फिर नीचे bar से उसका आकर सेट करें</strong> %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. - + %1 को छोटा करके %2MiB किया जाएगा व %4 हेतु %3MiB का एक नया विभाजन बनेगा। <strong>Select a partition to install on</strong> - <strong>इंस्टॉल के लिए विभाजन चुनें</strong> + <strong>इंस्टॉल हेतु विभाजन चुनें</strong> @@ -523,27 +520,27 @@ The installer will quit and all changes will be lost. No Swap - + कोई स्वैप नहीं Reuse Swap - + स्वैप पुनः उपयोग करें Swap (no Hibernate) - + स्वैप (हाइबरनेशन/सिस्टम सुप्त रहित) Swap (with Hibernate) - + स्वैप (हाइबरनेशन/सिस्टम सुप्त सहित) Swap to file - + स्वैप फाइल बनाएं @@ -587,7 +584,7 @@ The installer will quit and all changes will be lost. Cleared all mounts for %1 - %1 के लिए सभी माउंट हटा दिए गए + %1 हेतु सभी माउंट हटा दिए गए @@ -624,12 +621,12 @@ The installer will quit and all changes will be lost. The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + होस्ट वातावरण में कमांड हेतु रुट पथ जानना आवश्यक है परन्तु कोई रूट माउंट पॉइंट परिभाषित नहीं किया गया है। The command needs to know the user's name, but no username is defined. - + कमांड हेतु उपयोक्ता का नाम आवश्यक है परन्तु कोई नाम परिभाषित नहीं है। @@ -637,7 +634,7 @@ The installer will quit and all changes will be lost. Contextual Processes Job - Contextual Processes Job + प्रासंगिक प्रक्रिया कार्य @@ -680,7 +677,7 @@ The installer will quit and all changes will be lost. Flags: - Flags: + फ्लैग : @@ -723,12 +720,12 @@ The installer will quit and all changes will be lost. Create new %2MiB partition on %4 (%3) with file system %1. - + फ़ाइल सिस्टम %1 के साथ %4 (%3) पर नया %2MiB का विभाजन बनाएँ। Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. - + फ़ाइल सिस्टम <strong>%1</strong> के साथ <strong>%4</strong> (%3) पर नया <strong>%2MiB</strong> का विभाजन बनाएँ। @@ -761,7 +758,7 @@ The installer will quit and all changes will be lost. Master Boot Record (MBR) - Master Boot Record (MBR) + मास्टर बूट रिकॉर्ड (MBR) @@ -835,7 +832,7 @@ The installer will quit and all changes will be lost. Create Volume Group - + वॉल्यूम समूह बनाएँ @@ -843,22 +840,22 @@ The installer will quit and all changes will be lost. Create new volume group named %1. - + %1 नामक नया वॉल्यूम समूह बनाएं। Create new volume group named <strong>%1</strong>. - + <strong>%1</strong> नामक नया वॉल्यूम समूह बनाएं। Creating new volume group named %1. - + %1 नामक नया वॉल्यूम समूह बनाया जा रहा है। The installer failed to create a volume group named '%1'. - + इंस्टालर '%1' नामक वॉल्यूम समूह को बनाने में विफल रहा। @@ -867,17 +864,17 @@ The installer will quit and all changes will be lost. Deactivate volume group named %1. - + %1 नामक वॉल्यूम समूह को निष्क्रिय करें। Deactivate volume group named <strong>%1</strong>. - + <strong>%1</strong> नामक वॉल्यूम समूह को निष्क्रिय करें। The installer failed to deactivate a volume group named %1. - + इंस्टॉलर %1 नामक वॉल्यूम समूह को निष्क्रिय करने में विफल रहा। @@ -948,7 +945,7 @@ The installer will quit and all changes will be lost. %1 - (%2) device[name] - (device-node[name]) - + %1 - (%2) @@ -956,12 +953,12 @@ The installer will quit and all changes will be lost. Write LUKS configuration for Dracut to %1 - + Dracut हेतु LUKS विन्यास %1 पर राइट करना Skip writing LUKS configuration for Dracut: "/" partition is not encrypted - + Dracut हेतु LUKS विन्यास %1 पर राइट करना छोड़ें : "/" विभाजन एन्क्रिप्टेड नहीं है @@ -974,7 +971,7 @@ The installer will quit and all changes will be lost. Dummy C++ Job - Dummy C++ Job + डमी सी++ कार्य @@ -1027,7 +1024,7 @@ The installer will quit and all changes will be lost. Flags: - Flags: + फ्लैग : @@ -1111,7 +1108,7 @@ The installer will quit and all changes will be lost. <Restart checkbox tooltip> - + <Restart checkbox tooltip> @@ -1121,12 +1118,12 @@ The installer will quit and all changes will be lost. <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. - + <h1>सब हो गया।</h1><br/>आपके कंप्यूटर पर %1 को सेटअप कर दिया गया है।<br/>अब आप अपने नए सिस्टम का उपयोग कर सकते है। <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> - + <html><head/><body><p>यह विकल्प चयनित होने पर आपका सिस्टम तुरंत पुनः आरंभ हो जाएगा जब आप <span style="font-style:italic;">हो गया</span>पर क्लिक करेंगे या सेटअप प्रोग्राम को बंद करेंगे।</p></body></html> @@ -1136,12 +1133,12 @@ The installer will quit and all changes will be lost. <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> - + <html><head/><body><p>यह विकल्प चयनित होने पर आपका सिस्टम तुरंत पुनः आरंभ हो जाएगा जब आप <span style="font-style:italic;">हो गया</span>पर क्लिक करेंगे या इंस्टॉलर बंद करेंगे।</p></body></html> <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. - + <h1>सेटअप विफल रहा</h1><br/>%1 आपके कंप्यूटर पर सेटअप नहीं हुआ।<br/>त्रुटि संदेश : %2। @@ -1159,7 +1156,7 @@ The installer will quit and all changes will be lost. Setup Complete - + सेटअप पूर्ण हुआ @@ -1169,7 +1166,7 @@ The installer will quit and all changes will be lost. The setup of %1 is complete. - + %1 का सेटअप पूर्ण हुआ। @@ -1182,12 +1179,12 @@ The installer will quit and all changes will be lost. Format partition %1 (file system: %2, size: %3 MiB) on %4. - + विभाजन %1 (फ़ाइल सिस्टम: %2, आकार: %3 MiB) को %4 पर फॉर्मेट करें। Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. - + फ़ाइल सिस्टम <strong>%2</strong> के साथ <strong>%3MiB</strong> के विभाजन <strong>%1</strong> को फॉर्मेट करें। @@ -1205,37 +1202,37 @@ The installer will quit and all changes will be lost. has at least %1 GiB available drive space - + कम-से-कम %1 GiB स्पेस ड्राइव पर उपलब्ध हो There is not enough drive space. At least %1 GiB is required. - + ड्राइव में पर्याप्त स्पेस नहीं है। कम-से-कम %1 GiB होना आवश्यक है। has at least %1 GiB working memory - + कम-से-कम %1 GiB मेमोरी उपलब्ध हो The system does not have enough working memory. At least %1 GiB is required. - + सिस्टम में पर्याप्त मेमोरी नहीं है। कम-से-कम %1 GiB होनी आवश्यक है। is plugged in to a power source - बिजली से कनेक्ट है। + पॉवर के स्रोत से कनेक्ट है The system is not plugged in to a power source. - सिस्टम बिजली से कनेक्ट नहीं है। + सिस्टम पॉवर के स्रोत से कनेक्ट नहीं है। is connected to the Internet - इंटरनेट से कनेक्ट है। + इंटरनेट से कनेक्ट है @@ -1245,7 +1242,7 @@ The installer will quit and all changes will be lost. The setup program is not running with administrator rights. - + सेटअप प्रोग्राम के पास प्रबंधक अधिकार नहीं है। @@ -1255,12 +1252,12 @@ The installer will quit and all changes will be lost. The screen is too small to display the setup program. - + सेटअप प्रोग्राम प्रदर्शित करने हेतु स्क्रीन काफ़ी छोटी है। The screen is too small to display the installer. - इंस्टॉलर दिखाने के लिए स्क्रीन बहुत छोटी है। + इंस्टॉलर प्रदर्शित करने हेतु स्क्रीन काफ़ी छोटी है। @@ -1271,22 +1268,38 @@ The installer will quit and all changes will be lost. OEM Batch Identifier - + OEM (मूल उपकरण निर्माता) बैच पहचानकर्ता Could not create directories <code>%1</code>. - + <code>%1</code> डायरेक्टरी बनाई नहीं जा सकीं। Could not open file <code>%1</code>. - + <code>%1</code> फाइल खोली नहीं जा सकीं। Could not write to file <code>%1</code>. - + <code>%1</code> फाइल पर राइट नहीं किया जा सका। + + + + InitcpioJob + + + Creating initramfs with mkinitcpio. + mkinitcpio के साथ initramfs बनाना। + + + + InitramfsJob + + + Creating initramfs. + initramfs बनाना। @@ -1304,7 +1317,7 @@ The installer will quit and all changes will be lost. Executing script: &nbsp;<code>%1</code> - + निष्पादित स्क्रिप्ट : &nbsp;<code>%1</code> @@ -1312,7 +1325,7 @@ The installer will quit and all changes will be lost. Script - Script + स्क्रिप्ट @@ -1369,7 +1382,7 @@ The installer will quit and all changes will be lost. I accept the terms and conditions above. - मैं उपर्युक्त नियम व शर्तें स्वीकार करता हूँ। + मैं उपरोक्त नियम व शर्तें स्वीकार करता हूँ। @@ -1384,7 +1397,7 @@ The installer will quit and all changes will be lost. <h1>License Agreement</h1>This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. - + <h1>लाइसेंस अनुबंध</h1> यह सेटअप प्रक्रिया अतिरिक्त सुविधाएँ प्रदान करने व उपयोक्ता अनुभव में वृद्धि हेतु लाइसेंस शर्तों के अधीन अमुक्त सॉफ्टवेयर को इंस्टॉल कर सकती है। @@ -1437,32 +1450,32 @@ The installer will quit and all changes will be lost. Shows the complete license text - + लाइसेंस को उसके पूर्ण स्वरुप में दिखाएँ Hide license text - + लाइसेंस लेख छिपाएँ Show license agreement - + लाइसेंस अनुबंध दिखाएँ Hide license agreement - + लाइसेंस अनुबंध छिपाएँ Opens the license agreement in a browser window. - + लाइसेंस अनुबंध को ब्राउज़र विंडो में खोलें। <a href="%1">View license agreement</a> - + <a href="%1">लाइसेंस अनुबंध देखें</a> @@ -1485,7 +1498,7 @@ The installer will quit and all changes will be lost. Zone: - क्षेत्र : + ज़ोन : @@ -1504,7 +1517,7 @@ The installer will quit and all changes will be lost. Loading location data... - स्थान संबंधी डाटा लोड किया जा रहा है... + स्थान संबंधी डाटा लोड हो रहा है... @@ -1512,6 +1525,42 @@ The installer will quit and all changes will be lost. स्थान + + LuksBootKeyFileJob + + + Configuring LUKS key file. + LUKS कुंजी फाइल विन्यस्त करना। + + + + + No partitions are defined. + कोई विभाजन परिभाषित नहीं हैं। + + + + + + Encrypted rootfs setup error + एन्क्रिप्टेड rootfs सेटअप में त्रुटि + + + + Root partition %1 is LUKS but no passphrase has been set. + रूट विभाजन %1 LUKS है, लेकिन कोई कूटशब्द सेट नहीं किया गया है। + + + + Could not create LUKS key file for root partition %1. + रूट विभाजन %1 हेतु LUKS कुंजी फाइल बनाने में विफल। + + + + Could configure LUKS key file on partition %1. + विभाजन %1 पर LUKS कुंजी फ़ाइल को विन्यस्त कर सकता है। + + NetInstallPage @@ -1527,12 +1576,12 @@ The installer will quit and all changes will be lost. Network Installation. (Disabled: Unable to fetch package lists, check your network connection) - + नेटवर्क इंस्टॉल। (निष्क्रिय है : पैकेज सूची प्राप्त करने में असमर्थ, अपना नेटवर्क कनेक्शन जाँचें) Network Installation. (Disabled: Received invalid groups data) - + नेटवर्क इंस्टॉल (निष्क्रिय है : प्राप्त किया गया समूह डाटा अमान्य है) @@ -1548,17 +1597,17 @@ The installer will quit and all changes will be lost. Ba&tch: - + बैच (&t) : <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> - + <html><head/><body><p>यहां एक बैच-पहचानकर्ता दर्ज करें। इसे लक्षित सिस्टम में संचित किया जाएगा।</p></body></html> <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> - + <html><head/><body><h1>OEM (मूल उपकरण निर्माता) विन्यास सेटिंग्स</h1><p>लक्षित सिस्टम को विन्यस्त करते समय Calamares OEM (मूल उपकरण निर्माता) सेटिंग्स का उपयोग करेगा।</p></body></html> @@ -1566,12 +1615,12 @@ The installer will quit and all changes will be lost. OEM Configuration - + OEM (मूल उपकरण निर्माता) विन्यास सेटिंग्स Set the OEM Batch Identifier to <code>%1</code>. - + OEM (मूल उपकरण निर्माता) बैच पहचानकर्ता को <code>%1</code>पर सेट करें। @@ -1579,17 +1628,17 @@ The installer will quit and all changes will be lost. Password is too short - कूटशब्द बहुत छोटा है + कूटशब्द काफ़ी छोटा है Password is too long - कूटशब्द बहुत लंबा है + कूटशब्द काफ़ी लंबा है Password is too weak - कूटशब्द बहुत कमज़ोर है + कूटशब्द काफ़ी कमज़ोर है @@ -1684,7 +1733,7 @@ The installer will quit and all changes will be lost. The password is too short - कूटशब्द बहुत छोटा है + कूटशब्द काफ़ी छोटा है @@ -1744,7 +1793,7 @@ The installer will quit and all changes will be lost. Password generation failed - required entropy too low for settings - कूटशब्द बनाना विफल रहा - सेटिंग्स के लिए आवश्यक entropy बहुत कम है + कूटशब्द बनाना विफल रहा - सेटिंग्स के लिए आवश्यक एन्ट्रापी काफ़ी कम है @@ -1769,32 +1818,32 @@ The installer will quit and all changes will be lost. Bad integer value of setting - %1 - सेटिंग का गलत integer मान - %1 + सेटिंग का गलत पूर्णांक मान - %1 Bad integer value - गलत integer मान + गलत पूर्णांक मान Setting %1 is not of integer type - सेटिंग %1 integer नहीं है + सेटिंग %1 पूर्णांक नहीं है Setting is not of integer type - सेटिंग integer नहीं है + सेटिंग पूर्णांक नहीं है Setting %1 is not of string type - सेटिंग %1 string नहीं है + सेटिंग %1 स्ट्रिंग नहीं है Setting is not of string type - सेटिंग string नहीं है + सेटिंग स्ट्रिंग नहीं है @@ -1855,12 +1904,12 @@ The installer will quit and all changes will be lost. Choose a password to keep your account safe. - अपना अकाउंट सुरक्षित रखने के लिए पासवर्ड चुनें । + अपना अकाउंट सुरक्षित रखने हेतु कूटशब्द चुनें। <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> - <small>एक ही कूटशब्द दो बार दर्ज़ करें, ताकि उसे टाइप त्रुटि के लिए जांचा जा सके । एक अच्छे कूटशब्द में अक्षर, अंक व विराम चिन्हों का मेल होता है, उसमें कम-से-कम आठ अक्षर होने चाहिए, और उसे नियमित अंतराल पर बदलते रहना चाहिए।</small> + <small>एक ही कूटशब्द दो बार दर्ज़ करें, ताकि उसे टाइप त्रुटि के लिए जांचा जा सके। एक उचित कूटशब्द में अक्षर, अंक व विराम चिन्हों का मेल होता है, उसमें कम-से-कम आठ अक्षर होने चाहिए, और उसे नियमित अंतराल पर बदलते रहना चाहिए।</small> @@ -1875,7 +1924,7 @@ The installer will quit and all changes will be lost. Log in automatically without asking for the password. - कूटशब्द बिना पूछे ही स्वतः लॉग इन करें। + कूटशब्द पूछे बिना स्वतः लॉग इन करें। @@ -1885,7 +1934,7 @@ The installer will quit and all changes will be lost. Choose a password for the administrator account. - प्रबंधक अकाउंट के लिए कूटशब्द चुनें। + प्रबंधक अकाउंट हेतु कूटशब्द चुनें। @@ -1943,7 +1992,7 @@ The installer will quit and all changes will be lost. Free Space - खाली स्पेस + रिक्त स्पेस @@ -1982,7 +2031,7 @@ The installer will quit and all changes will be lost. Storage de&vice: - डिवाइस (&v): + स्टोरेज डिवाइस (&v): @@ -2012,27 +2061,27 @@ The installer will quit and all changes will be lost. New Volume Group - + नया वॉल्यूम समूह Resize Volume Group - + वॉल्यूम समूह का आकार बदलें Deactivate Volume Group - + वॉल्यूम समूह को निष्क्रिय करें Remove Volume Group - + वॉल्यूम समूह को हटाएँ I&nstall boot loader on: - + बूट लोडर इंस्टॉल करें (&l) : @@ -2042,12 +2091,12 @@ The installer will quit and all changes will be lost. Can not create new partition - नया विभाजन नहीं बनाया जा सकता + नया विभाजन बनाया नहीं जा सका The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. - + %1 पर विभाजन तालिका में पहले से ही %2 मुख्य विभाजन हैं व और अधिक नहीं जोड़ें जा सकते। कृपया एक मुख्य विभाजन को हटाकर उसके स्थान पर एक विस्तृत विभाजन जोड़ें। @@ -2115,7 +2164,7 @@ The installer will quit and all changes will be lost. After: - बाद में: + बाद में : @@ -2130,12 +2179,12 @@ The installer will quit and all changes will be lost. EFI system partition flag not set - EFI सिस्टम विभाजन flag सेट नहीं है + EFI सिस्टम विभाजन फ्लैग सेट नहीं है An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. - %1 को शुरू करने हेतु EFI सिस्टम विभाजन ज़रूरी है।<br/><br/>विभाजन को माउंट पॉइंट <strong>%2</strong> के साथ विन्यस्त किया गया परंतु उसका <strong>esp</strong> flag सेट नहीं था।<br/> Flag सेट करने के लिए, वापस जाएँ और विभाजन को edit करें।<br/><br/>आप बिना सेट भी आगे बढ़ सकते है पर सिस्टम चालू नहीं होगा। + %1 को शुरू करने हेतु EFI सिस्टम विभाजन ज़रूरी है।<br/><br/>विभाजन को माउंट पॉइंट <strong>%2</strong> के साथ विन्यस्त किया गया परंतु उसका <strong>esp</strong> फ्लैग सेट नहीं था।<br/> फ्लैग सेट करने के लिए, वापस जाएँ और विभाजन को edit करें।<br/><br/>आप बिना सेट भी आगे बढ़ सकते है पर सिस्टम चालू नहीं होगा। @@ -2150,12 +2199,12 @@ The installer will quit and all changes will be lost. has at least one disk device available. - + कम-से-कम एक डिस्क डिवाइस उपलब्ध हो। There are no partitons to install on. - + इनस्टॉल हेतु कोई विभाजन नहीं हैं। @@ -2182,7 +2231,7 @@ The installer will quit and all changes will be lost. 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. - + कृपया केडीई प्लाज़्मा डेस्कटॉप के लिए एक look-and-feel चुनें। आप अभी इस चरण को छोड़ सकते हैं व सिस्टम सेटअप होने के उपरांत इसे सेट कर सकते हैं। look-and-feel विकल्पों पर क्लिक कर आप चयनित look-and-feel का तुरंत ही पूर्वावलोकन कर सकते हैं। @@ -2203,84 +2252,84 @@ The installer will quit and all changes will be lost. Saving files for later ... - + बाद के लिए फाइलों को संचित किया जा है... No files configured to save for later. - + बाद में संचित करने हेतु कोई फाइल विन्यस्त नहीं की गई है। Not all of the configured files could be preserved. - + विन्यस्त की गई सभी फाइलें संचित नहीं की जा सकी। ProcessResult - + There was no output from the command. कमांड से कोई आउटपुट नहीं मिला। - + Output: -आउटपुट: +आउटपुट : - + External command crashed. बाह्य कमांड क्रैश हो गई। - + Command <i>%1</i> crashed. कमांड <i>%1</i> क्रैश हो गई। - + External command failed to start. बाह्य​ कमांड शुरू होने में विफल। - + Command <i>%1</i> failed to start. कमांड <i>%1</i> शुरू होने में विफल। - + Internal error when starting command. कमांड शुरू करते समय आंतरिक त्रुटि। - + Bad parameters for process job call. प्रक्रिया कार्य कॉल के लिए गलत मापदंड। - + External command failed to finish. बाहरी कमांड समाप्त करने में विफल। - + Command <i>%1</i> failed to finish in %2 seconds. कमांड <i>%1</i> %2 सेकंड में समाप्त होने में विफल। - + External command finished with errors. बाहरी कमांड त्रुटि के साथ समाप्त। - + Command <i>%1</i> finished with exit code %2. कमांड <i>%1</i> exit कोड %2 के साथ समाप्त। @@ -2326,12 +2375,12 @@ Output: (no mount point) - + (कोई माउंट पॉइंट नहीं) - + Requirements checking for module <i>%1</i> is complete. - + मापांक <i>%1</i> हेतु आवश्यकताओं की जाँच पूर्ण हुई। @@ -2346,17 +2395,17 @@ Output: Remove Volume Group named %1. - + %1 नामक वॉल्यूम समूह हटाएँ। Remove Volume Group named <strong>%1</strong>. - + <strong>%1</strong> नामक वॉल्यूम समूह हटाएँ। The installer failed to remove a volume group named '%1'. - + इंस्टालर '%1' नामक वॉल्यूम समूह को हटाने में विफल रहा। @@ -2369,7 +2418,7 @@ Output: Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. - चुनें कि %1 को कहाँ इंस्टॉल करना है।<br/><font color="red">चेतावनी: </font> यह चयनित विभाजन पर मौजूद सभी फ़ाइलों को हटा देगा। + चुनें कि %1 को कहाँ इंस्टॉल करना है।<br/><font color="red">चेतावनी : </font> यह चयनित विभाजन पर मौजूद सभी फ़ाइलों को हटा देगा। @@ -2379,12 +2428,12 @@ Output: %1 cannot be installed on empty space. Please select an existing partition. - %1 को खाली स्पेस पर इंस्टॉल नहीं किया जा सकता।कृपया कोई मौजूदा विभाजन चुनें। + %1 को खाली स्पेस पर इंस्टॉल नहीं किया जा सकता। कृपया कोई मौजूदा विभाजन चुनें। %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. - %1 को विस्तृत विभाजन पर इंस्टॉल नहीं किया जा सकता।कृपया कोई मौजूदा मुख्य या तार्किक विभाजन चुनें। + %1 को विस्तृत विभाजन पर इंस्टॉल नहीं किया जा सकता। कृपया कोई मौजूदा मुख्य या तार्किक विभाजन चुनें। @@ -2409,7 +2458,7 @@ Output: <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. - <strong>%4</strong><br/><br/>%2 के लिए विभाजन %1 बहुत छोटा है।कृपया कम-से-कम %3 GiB की क्षमता वाला कोई विभाजन चुनें । + <strong>%4</strong><br/><br/>%2 के लिए विभाजन %1 काफ़ी छोटा है। कृपया कम-से-कम %3 GiB की क्षमता वाला कोई विभाजन चुनें। @@ -2431,7 +2480,7 @@ Output: EFI system partition: - EFI सिस्टम विभाजन: + EFI सिस्टम विभाजन : @@ -2439,29 +2488,29 @@ Output: Resize Filesystem Job - + फ़ाइल सिस्टम कार्य का आकार बदलें Invalid configuration - + अमान्य विन्यास The file-system resize job has an invalid configuration and will not run. - + फाइल सिस्टम का आकार बदलने हेतु कार्य का विन्यास अमान्य है व यह नहीं चलेगा। KPMCore not Available - + KPMCore उपलब्ध नहीं है Calamares cannot start KPMCore for the file-system resize job. - + Calamares फाइल सिस्टम का आकार बदलने कार्य हेतु KPMCore को आरंभ नहीं कर सका। @@ -2470,39 +2519,39 @@ Output: Resize Failed - + आकार बदलना विफल रहा The filesystem %1 could not be found in this system, and cannot be resized. - + इस सिस्टम पर फाइल सिस्टम %1 नहीं मिला, व उसका आकार बदला नहीं जा सकता। The device %1 could not be found in this system, and cannot be resized. - + इस सिस्टम पर डिवाइस %1 नहीं मिला, व उसका आकार बदला नहीं जा सकता। The filesystem %1 cannot be resized. - + फाइल सिस्टम %1 का आकार बदला नहीं जा सकता। The device %1 cannot be resized. - + डिवाइस %1 का आकार बदला नहीं जा सकता। The filesystem %1 must be resized, but cannot. - + फाइल सिस्टम %1 का आकार बदला जाना चाहिए लेकिन बदला नहीं जा सकता। The device %1 must be resized, but cannot - + डिवाइस %1 का आकार बदला जाना चाहिए लेकिन बदला नहीं जा सकता @@ -2515,12 +2564,12 @@ Output: Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong>. - + <strong>%2MiB</strong> के <strong>%1</strong> विभाजन का आकार बदलकर <strong>%3MiB</strong> करें। Resizing %2MiB partition %1 to %3MiB. - + %2MiB के %1 विभाजन का आकार बदलकर %3MiB किया जा रहा है। @@ -2533,7 +2582,7 @@ Output: Resize Volume Group - + वॉल्यूम समूह का आकार बदलें @@ -2542,17 +2591,17 @@ Output: Resize volume group named %1 from %2 to %3. - + %1 नामक वॉल्यूम समूह का आकार %2 से बदलकर %3 करें। Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong>. - + <strong>%1</strong> नामक वॉल्यूम समूह का आकार <strong>%2</strong> से बदलकर <strong>%3</strong> करें। The installer failed to resize a volume group named '%1'. - + इंस्टालर '%1' नाम के वॉल्यूम समूह का आकार बदलने में विफल रहा। @@ -2560,7 +2609,7 @@ Output: This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> - + यह कंप्यूटर %1 को सेटअप करने की न्यूनतम आवश्यकताओं को पूरा नहीं करता।<br/>सेटअप जारी नहीं रखा जा सकता।<a href="#details">विवरण...</a> @@ -2570,22 +2619,22 @@ Output: This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. - + यह कंप्यूटर %1 को सेटअप करने हेतु सुझाई गई आवश्यकताओं को पूरा नहीं करता।<br/>सेटअप जारी रखा जा सकता है, लेकिन कुछ विशेषताएँ को निष्क्रिय किया जा सकता हैं। This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. - यह कंप्यूटर %1 को इंस्टॉल करने की सुझायी गई आवश्यकताओं को पूरा नहीं करता।<br/>इंस्टॉल जारी रखा जा सकता, लेकिन कुछ विशेषताएँ निष्क्रिय हो सकती हैं। + यह कंप्यूटर %1 को इंस्टॉल करने हेतु सुझाई गई आवश्यकताओं को पूरा नहीं करता।<br/>इंस्टॉल जारी रखा जा सकता है, लेकिन कुछ विशेषताएँ को निष्क्रिय किया जा सकता हैं। This program will ask you some questions and set up %2 on your computer. - यह प्रोग्राम आपसे कुछ सवाल पूछ आपके कंप्यूटर पर %2 को सेट करेगा। + यह प्रोग्राम एक प्रश्नावली के आधार पर आपके कंप्यूटर पर %2 को सेट करेगा। For best results, please ensure that this computer: - उत्तम परिणामों के लिए, कृपया सुनिश्चित करें कि यह कंप्यूटर: + उत्तम परिणाम हेतु, कृपया सुनिश्चित करें कि यह कंप्यूटर : @@ -2646,7 +2695,7 @@ Output: Failed to write keyboard configuration for the virtual console. - Virtual console हेतु कुंजीपटल की सेटिंग्स राइट करने में विफल रहा। + वर्चुअल कंसोल हेतु कुंजीपटल की सेटिंग्स राइट करने में विफल रहा। @@ -2663,7 +2712,7 @@ Output: Failed to write keyboard configuration to existing /etc/default directory. - मौजूदा /etc /default डायरेक्टरी में कुंजीपटल की सेटिंग्स write करने में विफल रहा। + मौजूदा /etc /default डायरेक्टरी में कुंजीपटल की सेटिंग्स राइट करने में विफल रहा। @@ -2671,82 +2720,82 @@ Output: Set flags on partition %1. - %1 विभाजन पर flag सेट करें। + %1 विभाजन पर फ्लैग सेट करें। Set flags on %1MiB %2 partition. - + %1MiB के %2 विभाजन पर फ्लैग सेट करें। Set flags on new partition. - नए विभाजन पर flag सेट करें। + नए विभाजन पर फ्लैग सेट करें। Clear flags on partition <strong>%1</strong>. - <strong>%1</strong> विभाजन पर से flag हटाएँ। + <strong>%1</strong> विभाजन पर से फ्लैग हटाएँ। Clear flags on %1MiB <strong>%2</strong> partition. - + %1MiB के <strong>%2</strong> विभाजन पर से फ्लैग हटाएँ। Flag %1MiB <strong>%2</strong> partition as <strong>%3</strong>. - + %1MiB के <strong>%2</strong> विभाजन पर <strong>%3</strong> का फ्लैग लगाएँ। Clearing flags on %1MiB <strong>%2</strong> partition. - + %1MiB के <strong>%2</strong> विभाजन पर से फ्लैग हटाएँ जा रहे हैं। Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition. - + %1MiB के <strong>%2</strong> विभाजन पर फ्लैग <strong>%3</strong> सेट किए जा रहे हैं। Clear flags on new partition. - नए विभाजन पर से flag हटाएँ। + नए विभाजन पर से फ्लैग हटाएँ। Flag partition <strong>%1</strong> as <strong>%2</strong>. - <strong>%1</strong> विभाजन पर <strong>%2</strong> का flag लगाएँ। + <strong>%1</strong> विभाजन पर <strong>%2</strong> का फ्लैग लगाएँ। Flag new partition as <strong>%1</strong>. - नए विभाजन पर<strong>%1</strong>का flag लगाएँ। + नए विभाजन पर<strong>%1</strong>का फ्लैग लगाएँ। Clearing flags on partition <strong>%1</strong>. - <strong>%1</strong> विभाजन पर से flag हटाएँ जा रहे हैं। + <strong>%1</strong> विभाजन पर से फ्लैग हटाएँ जा रहे हैं। Clearing flags on new partition. - नए विभाजन पर से flag हटाएँ जा रहे हैं। + नए विभाजन पर से फ्लैग हटाएँ जा रहे हैं। Setting flags <strong>%2</strong> on partition <strong>%1</strong>. - <strong>%1</strong> विभाजन पर flag <strong>%2</strong> सेट किए जा रहे हैं। + <strong>%1</strong> विभाजन पर फ्लैग <strong>%2</strong> सेट किए जा रहे हैं। Setting flags <strong>%1</strong> on new partition. - नए विभाजन पर flag <strong>%1</strong> सेट किए जा रहे हैं। + नए विभाजन पर फ्लैग <strong>%1</strong> सेट किए जा रहे हैं। The installer failed to set flags on partition %1. - इंस्टॉलर विभाजन %1 पर flag सेट करने में विफल रहा। + इंस्टॉलर विभाजन %1 पर फ्लैग सेट करने में विफल रहा। @@ -2769,7 +2818,7 @@ Output: rootMountPoint is %1 - rootMountPoint %1 है + रूट माउंट पॉइंट %1 है @@ -2784,7 +2833,7 @@ Output: Cannot set password for user %1. - उपयोक्ता %1 के लिए पासवर्ड सेट नहीं किया जा सकता। + उपयोक्ता %1 हेतु पासवर्ड सेट नहीं किया जा सकता। @@ -2822,12 +2871,12 @@ Output: Cannot set timezone, - समय क्षेत्र सेट नहीं हो सका। + समय क्षेत्र सेट नहीं हो सका, Cannot open /etc/timezone for writing - राइट करने हेतु /etc /timezone खोला नहीं जा सका। + राइट करने हेतु /etc /timezone खोला नहीं जा सका @@ -2835,7 +2884,7 @@ Output: Shell Processes Job - + शेल प्रक्रिया कार्य @@ -2852,7 +2901,7 @@ Output: This is an overview of what will happen once you start the setup procedure. - + यह एक अवलोकन है कि सेटअप प्रक्रिया आरंभ होने के उपरांत क्या होगा। @@ -2865,7 +2914,7 @@ Output: Summary - सार + सारांश @@ -2873,22 +2922,22 @@ Output: Installation feedback - + इंस्टॉल संबंधी प्रतिक्रिया Sending installation feedback. - + इंस्टॉल संबंधी प्रतिक्रिया भेजना। Internal error in install-tracking. - + इंस्टॉल-ट्रैकिंग में आंतरिक त्रुटि। HTTP request timed out. - + एचटीटीपी अनुरोध हेतु समय समाप्त। @@ -2896,28 +2945,28 @@ Output: Machine feedback - + मशीन संबंधी प्रतिक्रिया Configuring machine feedback. - + मशीन संबंधी प्रतिक्रिया विन्यस्त करना। Error in machine feedback configuration. - + मशीन संबंधी प्रतिक्रिया विन्यास में त्रुटि। Could not configure machine feedback correctly, script error %1. - + मशीन प्रतिक्रिया को सही रूप से विन्यस्त नहीं किया जा सका, स्क्रिप्ट त्रुटि %1। Could not configure machine feedback correctly, Calamares error %1. - + मशीन प्रतिक्रिया को सही रूप से विन्यस्त नहीं किया जा सका, Calamares त्रुटि %1। @@ -2930,37 +2979,37 @@ Output: Placeholder - Placeholder + प्लेसहोल्डर <html><head/><body><p>By selecting this, you will send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> - + <html><head/><body><p>इसे चयनित करने पर, आपके इंस्टॉल संबंधी <span style=" font-weight:600;">किसी प्रकार की कोई जानकारी नहीं </span>भेजी जाएँगी।</p></body></html> <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> - + <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">उपयोक्ता प्रतिक्रिया के बारे में अधिक जानकारी हेतु यहाँ क्लिक करें</span></a></p></body></html> Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with the last two options below), get continuous information about preferred applications. To see what will be sent, please click the help icon next to each area. - + इंस्टॉल की ट्रैकिंग करने से %1 को यह जानने में सहायता मिलती है कि उनके कितने उपयोक्ता हैं, वे किस हार्डवेयर पर %1 को इंस्टॉल करते हैं एवं (नीचे दिए अंतिम दो विकल्पों सहित), पसंदीदा अनुप्रयोगों के बारे में निरंतर जानकारी प्राप्त करते हैं। यह जानने हेतु कि क्या भेजा जाएगा, कृपया प्रत्येक क्षेत्र के साथ में दिए सहायता आइकन पर क्लिक करें। By selecting this you will send information about your installation and hardware. This information will <b>only be sent once</b> after the installation finishes. - + इसे चयनित करने पर आपके इंस्टॉल व हार्डवेयर संबंधी जानकारी भेजी जाएँगी। यह जानकारी इंस्टॉल समाप्त हो जाने के उपरांत <b>केवल एक बार ही</b> भेजी जाएगी। By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. - + इसे चयनित करने पर आपके इंस्टॉल, हार्डवेयर व अनुप्रयोगों संबंधी जानकारी <b>समय-समय पर</b>, %1 को भेजी जाएँगी। By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. - + इसे चयनित करने पर आपके इंस्टॉल, हार्डवेयर, अनुप्रयोगों व उपयोक्ता प्रतिमानों संबंधी जानकारी <b>समय-समय पर</b>, %1 को भेजी जाएँगी। @@ -2968,7 +3017,7 @@ Output: Feedback - + प्रतिक्रिया @@ -2976,37 +3025,37 @@ Output: <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> - + <small>यदि एक से अधिक व्यक्ति इस कंप्यूटर का उपयोग करेंगे, तो आप सेटअप के उपरांत एकाधिक अकाउंट बना सकते हैं।</small> <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> - + <small>यदि एक से अधिक व्यक्ति इस कंप्यूटर का उपयोग करेंगे, तो आप इंस्टॉल के उपरांत एकाधिक अकाउंट बना सकते हैं।</small> Your username is too long. - आपका उपयोक्ता नाम बहुत लंबा है। + आपका उपयोक्ता नाम काफ़ी लंबा है। Your username contains invalid characters. Only lowercase letters and numbers are allowed. - आपके होस्ट नाम में अमान्य अक्षर हैं । केवल lowercase अक्षरों व संख्याओं की ही अनुमति है । + आपके होस्ट नाम में अमान्य अक्षर हैं । केवल lowercase अक्षरों व संख्याओं की अनुमति है । Your hostname is too short. - आपका होस्ट नाम बहुत छोटा है। + आपका होस्ट नाम काफ़ी छोटा है। Your hostname is too long. - आपका होस्ट नाम बहुत लंबा है। + आपका होस्ट नाम काफ़ी लंबा है। Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. - आपके होस्ट नाम में अमान्य अक्षर हैं । केवल अक्षरों, संख्याओं व dash की ही अनुमति है । + आपके होस्ट नाम में अमान्य अक्षर हैं । केवल अक्षरों, संख्याओं व dash की अनुमति है । @@ -3028,52 +3077,52 @@ Output: Create Volume Group - + वॉल्यूम समूह बनाएँ List of Physical Volumes - + वॉल्यूम समूहों की सूची Volume Group Name: - + वॉल्यूम समूह का नाम : Volume Group Type: - + वॉल्यूम समूह का प्रकार : Physical Extent Size: - + डिस्क ब्लॉक की आकार सीमा : MiB - MiB + MiB Total Size: - + कुल आकार : Used Size: - + प्रयुक्त आकार : Total Sectors: - + कुल सेक्टर : Quantity of LVs: - + तार्किक वॉल्यूम की मात्रा : @@ -3097,7 +3146,7 @@ Output: Select language - + भाषा चुनें @@ -3122,17 +3171,17 @@ Output: <h1>Welcome to the Calamares setup program for %1.</h1> - + <h1>%1 हेतु Calamares सेटअप में आपका स्वागत है।</h1> <h1>Welcome to %1 setup.</h1> - + <h1>%1 सेटअप में आपका स्वागत है।</h1> About %1 setup - + %1 सेटअप के बारे में @@ -3142,7 +3191,7 @@ Output: <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2019 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. - + <h1>%1</h1><br/><strong>%2<br/>के लिए %3</strong><br/><br/>प्रतिलिप्याधिकार 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>प्रतिलिप्याधिकार 2017-2019 Adriaan de Groot &lt;groot@kde.org&gt;<br/><a href="https://calamares.io/team/">Calamares टीम</a> व <a href="https://www.transifex.com/calamares/calamares/">Calamares अनुवादक टीम</a> का धन्यवाद।<br/><br/><a href="https://calamares.io/">Calamares</a> का विकास <br/><a href="http://www.blue-systems.com/">ब्लू सिस्टम्स</a> - लिब्रेटिंग सॉफ्टवेयर द्वारा प्रायोजित है। @@ -3155,7 +3204,7 @@ Output: Welcome - स्वागतं + स्वागत है \ No newline at end of file diff --git a/lang/calamares_hr.ts b/lang/calamares_hr.ts index 89862d76e..372e94597 100644 --- a/lang/calamares_hr.ts +++ b/lang/calamares_hr.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Čekam %1 modul(a).Čekam %1 modul(a).Čekam %1 modul(a). - + (%n second(s)) (%n sekunda(e))(%n sekunda(e))(%n sekunda(e)) - + System-requirements checking is complete. Provjera zahtjeva za instalaciju sustava je dovršena. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Natrag - - + &Next &Sljedeće - - + &Cancel &Odustani - - + Cancel setup without changing the system. Odustanite od instalacije bez promjena na sustavu. - - + Cancel installation without changing the system. Odustanite od instalacije bez promjena na sustavu. - + Setup Failed Instalacija nije uspjela - + Calamares Initialization Failed Inicijalizacija Calamares-a nije uspjela - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 se ne može se instalirati. Calamares nije mogao učitati sve konfigurirane module. Ovo je problem s načinom na koji se Calamares koristi u distribuciji. - + <br/>The following modules could not be loaded: <br/>Sljedeći moduli se nisu mogli učitati: - + Continue with installation? Nastaviti sa instalacijom? - + 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> Instalacijski program %1 će izvršiti promjene na vašem disku kako bi postavio %2. <br/><strong>Ne možete poništiti te promjene.</strong> - + &Set up now &Postaviti odmah - + &Set up &Postaviti - + &Install &Instaliraj - + Setup is complete. Close the setup program. Instalacija je završena. Zatvorite instalacijski program. - + Cancel setup? Prekinuti instalaciju? - + Cancel installation? Prekinuti instalaciju? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Stvarno želite prekinuti instalacijski proces? Instalacijski program će izaći i sve promjene će biti izgubljene. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Stvarno želite prekinuti instalacijski proces? Instalacijski program će izaći i sve promjene će biti izgubljene. - + &Yes &Da - + &No &Ne - + &Close &Zatvori - + Continue with setup? Nastaviti s postavljanjem? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 instalacijski program će napraviti promjene na disku kako bi instalirao %2.<br/><strong>Nećete moći vratiti te promjene.</strong> - + &Install now &Instaliraj sada - + Go &back Idi &natrag - + &Done &Gotovo - + The installation is complete. Close the installer. Instalacija je završena. Zatvorite instalacijski program. - + Error Greška - + Installation Failed Instalacija nije uspjela @@ -1290,6 +1286,22 @@ Instalacijski program će izaći i sve promjene će biti izgubljene.Nije moguće pisati u datoteku <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Stvaranje initramfs s mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + Stvaranje initramfs. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ Instalacijski program će izaći i sve promjene će biti izgubljene.Lokacija + + LuksBootKeyFileJob + + + Configuring LUKS key file. + Konfiguriranje LUKS ključne datoteke. + + + + + No partitions are defined. + Nema definiranih particija. + + + + + + Encrypted rootfs setup error + Pogreška postavljanja šifriranog rootfs-a + + + + Root partition %1 is LUKS but no passphrase has been set. + Root particija %1 je LUKS, ali nije postavljena zaporka. + + + + Could not create LUKS key file for root partition %1. + Nije moguće kreirati LUKS ključnu datoteku za root particiju %1. + + + + Could configure LUKS key file on partition %1. + Moguće je konfigurirati LUKS ključnu datoteku na particiji %1. + + NetInstallPage @@ -2220,14 +2268,14 @@ Instalacijski program će izaći i sve promjene će biti izgubljene. ProcessResult - + There was no output from the command. Nema izlazne informacije od naredbe. - + Output: @@ -2236,52 +2284,52 @@ Izlaz: - + External command crashed. Vanjska naredba je prekinula s radom. - + Command <i>%1</i> crashed. Naredba <i>%1</i> je prekinula s radom. - + External command failed to start. Vanjska naredba nije uspješno pokrenuta. - + Command <i>%1</i> failed to start. Naredba <i>%1</i> nije uspješno pokrenuta. - + Internal error when starting command. Unutrašnja greška pri pokretanju naredbe. - + Bad parameters for process job call. Krivi parametri za proces poziva posla. - + External command failed to finish. Vanjska naredba se nije uspjela izvršiti. - + Command <i>%1</i> failed to finish in %2 seconds. Naredba <i>%1</i> nije uspjela završiti za %2 sekundi. - + External command finished with errors. Vanjska naredba je završila sa pogreškama. - + Command <i>%1</i> finished with exit code %2. Naredba <i>%1</i> je završila sa izlaznim kodom %2. @@ -2330,7 +2378,7 @@ Izlaz: (nema točke montiranja) - + Requirements checking for module <i>%1</i> is complete. Provjera zahtjeva za modul <i>%1</i> je dovršena. diff --git a/lang/calamares_hu.ts b/lang/calamares_hu.ts index cf8e907f7..cdf120890 100644 --- a/lang/calamares_hu.ts +++ b/lang/calamares_hu.ts @@ -99,12 +99,12 @@ Reload Stylesheet - + Stílusok újratöltése Widget Tree - + Modul- fa @@ -159,12 +159,12 @@ Run command '%1' in target system. - + '%1' parancs futtatása a cél rendszeren. Run command '%1'. - + '%1' parancs futtatása. @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Várakozás a %n modulokra.Várakozás %n modulokra. - + (%n second(s)) (%n másodperc)(%n másodperc) - + System-requirements checking is complete. Rendszerkövetelmények ellenőrzése kész. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Vissza - - + &Next &Következő - - + &Cancel &Mégse - - + Cancel setup without changing the system. Telepítés megszakítása a rendszer módosítása nélkül. - - + Cancel installation without changing the system. Kilépés a telepítőből a rendszer megváltoztatása nélkül. - + Setup Failed Telepítési hiba - + Calamares Initialization Failed A Calamares előkészítése meghiúsult - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. A(z) %1 nem telepíthető. A Calamares nem tudta betölteni a konfigurált modulokat. Ez a probléma abból fakad, ahogy a disztribúció a Calamarest használja. - + <br/>The following modules could not be loaded: <br/>A következő modulok nem tölthetőek be: - + Continue with installation? Folytatja a telepítést? - + 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> A %1 telepítő változtatásokat fog végrehajtani a lemezen a %2 telepítéséhez. <br/><strong>Ezután már nem tudja visszavonni a változtatásokat.</strong> - + &Set up now &Telepítés most - + &Set up &Telepítés - + &Install &Telepítés - + Setup is complete. Close the setup program. Telepítés sikerült. Zárja be a telepítőt. - + Cancel setup? Megszakítja a telepítést? - + Cancel installation? Abbahagyod a telepítést? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Valóban megszakítod a telepítési eljárást? A telepítő ki fog lépni és minden változtatás elveszik. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Biztos abba szeretnéd hagyni a telepítést? Minden változtatás elveszik, ha kilépsz a telepítőből. - + &Yes &Igen - + &No &Nem - + &Close &Bezár - + Continue with setup? Folytatod a telepítéssel? - + 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> A %1 telepítő változtatásokat fog elvégezni, hogy telepítse a következőt: %2.<br/><strong>A változtatások visszavonhatatlanok lesznek.</strong> - + &Install now &Telepítés most - + Go &back Menj &vissza - + &Done &Befejez - + The installation is complete. Close the installer. A telepítés befejeződött, Bezárhatod a telepítőt. - + Error Hiba - + Installation Failed Telepítés nem sikerült @@ -1290,6 +1286,22 @@ Minden változtatás elveszik, ha kilépsz a telepítőből. Sikertelen fájl írás <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + initramfs létrehozása mkinitcpio utasítással. + + + + InitramfsJob + + + Creating initramfs. + initramfs létrehozása. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ Minden változtatás elveszik, ha kilépsz a telepítőből. Hely + + LuksBootKeyFileJob + + + Configuring LUKS key file. + LUKS kulcs fájl konfigurálása. + + + + + No partitions are defined. + Nincsenek partíciók definiálva. + + + + + + Encrypted rootfs setup error + Titkosított rootfs telepítési hiba + + + + Root partition %1 is LUKS but no passphrase has been set. + A %1 root partíció LUKS de beállítva nincs kulcs. + + + + Could not create LUKS key file for root partition %1. + Nem sikerült létrehozni a LUKS kulcs fájlt a %1 root partícióhoz + + + + Could configure LUKS key file on partition %1. + Nem sikerült beállítani a LUKS kulcs fájlt a %1 root partíción. + + NetInstallPage @@ -2220,14 +2268,14 @@ Minden változtatás elveszik, ha kilépsz a telepítőből. ProcessResult - + There was no output from the command. A parancsnak nem volt kimenete. - + Output: @@ -2236,52 +2284,52 @@ Kimenet: - + External command crashed. Külső parancs összeomlott. - + Command <i>%1</i> crashed. Parancs <i>%1</i> összeomlott. - + External command failed to start. A külső parancsot nem sikerült elindítani. - + Command <i>%1</i> failed to start. A(z) <i>%1</i> parancsot nem sikerült elindítani. - + Internal error when starting command. Belső hiba a parancs végrehajtásakor. - + Bad parameters for process job call. Hibás paraméterek a folyamat hívásához. - + External command failed to finish. Külső parancs nem fejeződött be. - + Command <i>%1</i> failed to finish in %2 seconds. A(z) <i>%1</i> parancsot nem sikerült befejezni %2 másodperc alatt. - + External command finished with errors. A külső parancs hibával fejeződött be. - + Command <i>%1</i> finished with exit code %2. A(z) <i>%1</i> parancs hibakóddal lépett ki: %2. @@ -2330,7 +2378,7 @@ Kimenet: (nincs csatolási pont) - + Requirements checking for module <i>%1</i> is complete. Követelmények ellenőrzése a <i>%1</i>modulhoz kész. diff --git a/lang/calamares_id.ts b/lang/calamares_id.ts index 5557114ef..bc3a72586 100644 --- a/lang/calamares_id.ts +++ b/lang/calamares_id.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Kembali - - + &Next &Berikutnya - - + &Cancel &Batal - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Batalkan instalasi tanpa mengubah sistem yang ada. - + Setup Failed - + Calamares Initialization Failed Inisialisasi Calamares Gagal - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 tidak dapat terinstal. Calamares tidak dapat memuat seluruh modul konfigurasi. Terdapat masalah dengan Calamares karena sedang digunakan oleh distribusi. - + <br/>The following modules could not be loaded: <br/>Modul berikut tidak dapat dimuat. - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install &Instal - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Batalkan instalasi? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Apakah Anda benar-benar ingin membatalkan proses instalasi ini? Instalasi akan ditutup dan semua perubahan akan hilang. - + &Yes &Ya - + &No &Tidak - + &Close &Tutup - + Continue with setup? Lanjutkan dengan setelan ini? - + 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> Installer %1 akan membuat perubahan ke disk Anda untuk memasang %2.<br/><strong>Anda tidak dapat membatalkan perubahan tersebut.</strong> - + &Install now &Instal sekarang - + Go &back &Kembali - + &Done &Kelar - + The installation is complete. Close the installer. Instalasi sudah lengkap. Tutup installer. - + Error Kesalahan - + Installation Failed Instalasi Gagal @@ -1289,6 +1285,22 @@ Instalasi akan ditutup dan semua perubahan akan hilang. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ Instalasi akan ditutup dan semua perubahan akan hilang. Lokasi + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,14 +2267,14 @@ Instalasi akan ditutup dan semua perubahan akan hilang. ProcessResult - + There was no output from the command. Tidak ada keluaran dari perintah. - + Output: @@ -2235,52 +2283,52 @@ Keluaran: - + External command crashed. Perintah eksternal rusak. - + Command <i>%1</i> crashed. Perintah <i>%1</i> mogok. - + External command failed to start. Perintah eksternal gagal dimulai - + Command <i>%1</i> failed to start. Perintah <i>%1</i> gagal dimulai. - + Internal error when starting command. Terjadi kesalahan internal saat menjalankan perintah. - + Bad parameters for process job call. Parameter buruk untuk memproses panggilan tugas, - + External command failed to finish. Perintah eksternal gagal diselesaikan . - + Command <i>%1</i> failed to finish in %2 seconds. Perintah <i>%1</i> gagal untuk diselesaikan dalam %2 detik. - + External command finished with errors. Perintah eksternal diselesaikan dengan kesalahan . - + Command <i>%1</i> finished with exit code %2. Perintah <i>%1</i> diselesaikan dengan kode keluar %2. @@ -2329,7 +2377,7 @@ Keluaran: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_is.ts b/lang/calamares_is.ts index 921ce91cd..04a4eb0fe 100644 --- a/lang/calamares_is.ts +++ b/lang/calamares_is.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Til baka - - + &Next &Næst - - + &Cancel &Hætta við - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Hætta við uppsetningu ánþess að breyta kerfinu. - + Setup Failed - + Calamares Initialization Failed Calamares uppsetning mistókst - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install &Setja upp - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Hætta við uppsetningu? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Viltu virkilega að hætta við núverandi uppsetningarferli? Uppsetningarforritið mun hætta og allar breytingar tapast. - + &Yes &Já - + &No &Nei - + &Close &Loka - + Continue with setup? Halda áfram með uppsetningu? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 uppsetningarforritið er um það bil að gera breytingar á diskinum til að setja upp %2.<br/><strong>Þú munt ekki geta afturkallað þessar breytingar.</strong> - + &Install now Setja &inn núna - + Go &back Fara til &baka - + &Done &Búið - + The installation is complete. Close the installer. Uppsetning er lokið. Lokaðu uppsetningarforritinu. - + Error Villa - + Installation Failed Uppsetning mistókst @@ -1289,6 +1285,22 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. Staðsetning + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,65 +2267,65 @@ Uppsetningarforritið mun hætta og allar breytingar tapast. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2326,7 +2374,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_it_IT.ts b/lang/calamares_it_IT.ts index 5d075f1ac..37ed30e6c 100644 --- a/lang/calamares_it_IT.ts +++ b/lang/calamares_it_IT.ts @@ -117,7 +117,7 @@ Set up - + Installazione @@ -159,12 +159,12 @@ Run command '%1' in target system. - + Esegui il comando '%1' sul sistema di destinazione Run command '%1'. - + Esegui il comando '1%' @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. Il controllo dei requisiti di sistema è completo. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Indietro - - + &Next &Avanti - - + &Cancel &Annulla - - + Cancel setup without changing the system. - + Annulla l'installazione senza modificare il computer - - + Cancel installation without changing the system. Annullare l'installazione senza modificare il sistema. - + Setup Failed - + Installazione fallita - + Calamares Initialization Failed Inizializzazione di Calamares Fallita - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 non può essere installato. Calamares non è stato in grado di caricare tutti i moduli configurati. Questo è un problema del modo in cui Calamares viene utilizzato dalla distribuzione. - + <br/>The following modules could not be loaded: <br/>Non è stato possibile caricare il seguente modulo: - + Continue with installation? - + Continuare l'installazione? - + 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> - + Il %1 programma di installazione sta per fare dei cambiamenti sul tuo disco per installare %2. Non sarà possibile annullare questi cambiamenti. - + &Set up now - + &Installa adesso - + &Set up - + &Installazione - + &Install &Installa - + Setup is complete. Close the setup program. - + Installazione completata. Chiudere il programma di installazione. - + Cancel setup? - + Annullare l'installazione? - + Cancel installation? Annullare l'installazione? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Vuoi davvero annullare il processo di installazione? Il programma di installazione verrrà terminato e tutti i cambiamenti verranno persi. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Si vuole davvero annullare l'installazione in corso? Il programma d'installazione sarà terminato e tutte le modifiche andranno perse. - + &Yes &Si - + &No &No - + &Close &Chiudi - + Continue with setup? Procedere con la configurazione? - + 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> Il programma d'nstallazione %1 sta per eseguire delle modifiche al tuo disco per poter installare %2.<br/><strong> Non sarà possibile annullare tali modifiche.</strong> - + &Install now &Installa adesso - + Go &back &Indietro - + &Done &Fatto - + The installation is complete. Close the installer. L'installazione è terminata. Chiudere il programma d'installazione. - + Error Errore - + Installation Failed Installazione non riuscita @@ -411,7 +407,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno %1 Setup Program - + %1 Programma di installazione @@ -480,7 +476,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. - + %1 sarà ridotta a %2MiB ed una nuova partizione di %3MiB sarà creata per %4 @@ -723,7 +719,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno Create new %2MiB partition on %4 (%3) with file system %1. - + Crea una nuova partizione da %2MiB su %4 (%3) con file system %1 @@ -1159,7 +1155,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno Setup Complete - + Installazione completata @@ -1169,7 +1165,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno The setup of %1 is complete. - + L'installazione di %1 è completa @@ -1205,22 +1201,22 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno has at least %1 GiB available drive space - + ha almeno %1 GiB di spazio disponibile There is not enough drive space. At least %1 GiB is required. - + Non c'è abbastanza spazio sul disco. E' richiesto almeno %1 GiB has at least %1 GiB working memory - + ha almeno %1 GiB di memoria The system does not have enough working memory. At least %1 GiB is required. - + Il sistema non ha abbastanza memoria. E' richiesto almeno %1 GiB @@ -1245,7 +1241,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno The setup program is not running with administrator rights. - + Il programma di installazione non è stato lanciato con i permessi di amministratore. @@ -1255,7 +1251,7 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno The screen is too small to display the setup program. - + Lo schermo è troppo piccolo per mostrare il programma di installazione @@ -1289,6 +1285,22 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno Posizione + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,13 +2267,13 @@ Il programma d'installazione sarà terminato e tutte le modifiche andranno ProcessResult - + There was no output from the command. Non c'era output dal comando. - + Output: @@ -2234,53 +2282,53 @@ Output: - + External command crashed. Il comando esterno si è arrestato. - + Command <i>%1</i> crashed. Il comando <i>%1</i> si è arrestato. - + External command failed to start. Il comando esterno non si è avviato. - + Command <i>%1</i> failed to start. Il comando %1 non si è avviato. - + Internal error when starting command. Errore interno all'avvio del comando. - + Bad parameters for process job call. Parametri errati per elaborare la chiamata al job. - + External command failed to finish. Il comando esterno non è stato portato a termine. - + Command <i>%1</i> failed to finish in %2 seconds. Il comando <i>%1</i> non è stato portato a termine in %2 secondi. - + External command finished with errors. Il comando esterno è terminato con errori. - + Command <i>%1</i> finished with exit code %2. Il comando <i>%1</i> è terminato con codice di uscita %2. @@ -2329,7 +2377,7 @@ Output: (nessun mount point) - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_ja.ts b/lang/calamares_ja.ts index 8a631a3a4..65a73d4b7 100644 --- a/lang/calamares_ja.ts +++ b/lang/calamares_ja.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). %n モジュールを待機中。 - + (%n second(s)) (%n 秒(s)) - + System-requirements checking is complete. 要求されるシステムの確認を終了しました。 @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back 戻る (&B) - - + &Next 次へ (&N) - - + &Cancel 中止 (&C) - - + Cancel setup without changing the system. システムを変更することなくセットアップを中断します。 - - + Cancel installation without changing the system. システムを変更しないでインストールを中止します。 - + Setup Failed セットアップに失敗しました。 - + Calamares Initialization Failed Calamares によるインストールに失敗しました。 - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 をインストールできません。Calamares はすべてのモジュールをロードすることをできませんでした。これは、Calamares のこのディストリビューションでの使用法による問題です。 - + <br/>The following modules could not be loaded: <br/>以下のモジュールがロードできませんでした。: - + Continue with installation? インストールを続行しますか? - + 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> %1 のセットアッププログラムは %2 のセットアップのためディスクの内容を変更します。<br/><strong>これらの変更は取り消しできません。</strong> - + &Set up now セットアップ中(&S) - + &Set up セットアップ (&S) - + &Install インストール (&I) - + Setup is complete. Close the setup program. セットアップが完了しました。プログラムを閉じます。 - + Cancel setup? セットアップを中止しますか? - + Cancel installation? インストールを中止しますか? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. 本当に現在のセットアップのプロセスを中止しますか? すべての変更が取り消されます。 - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. 本当に現在の作業を中止しますか? すべての変更が取り消されます。 - + &Yes はい (&Y) - + &No いいえ (&N) - + &Close 閉じる (&C) - + Continue with setup? セットアップを続行しますか? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 インストーラーは %2 をインストールするためディスクの内容を変更しようとしています。<br/><strong>これらの変更は取り消せません。</strong> - + &Install now 今すぐインストール (&I) - + Go &back 戻る (&B) - + &Done 実行 (&D) - + The installation is complete. Close the installer. インストールが完了しました。インストーラーを閉じます。 - + Error エラー - + Installation Failed インストールに失敗 @@ -1291,6 +1287,22 @@ The installer will quit and all changes will be lost. ファイル <code>%1</code>に書き込めません。 + + InitcpioJob + + + Creating initramfs with mkinitcpio. + mkinitcpioとinitramfsを作成中 + + + + InitramfsJob + + + Creating initramfs. + initramfsを作成中 + + InteractiveTerminalPage @@ -1514,6 +1526,42 @@ The installer will quit and all changes will be lost. ロケーション + + LuksBootKeyFileJob + + + Configuring LUKS key file. + LUKSキーファイルを設定中 + + + + + No partitions are defined. + パーティションが定義されていません。 + + + + + + Encrypted rootfs setup error + 暗号化したrootfsセットアップエラー + + + + Root partition %1 is LUKS but no passphrase has been set. + ルートパーティション %1 はLUKSですが、パスワードが設定されていません。 + + + + Could not create LUKS key file for root partition %1. + ルートパーティション %1 のLUKSキーファイルを作成できませんでした。 + + + + Could configure LUKS key file on partition %1. + パーティション %1 にLUKSキーファイルを設定できました。 + + NetInstallPage @@ -2221,14 +2269,14 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. コマンドから出力するものがありませんでした。 - + Output: @@ -2237,52 +2285,52 @@ Output: - + External command crashed. 外部コマンドがクラッシュしました。 - + Command <i>%1</i> crashed. コマンド <i>%1</i> がクラッシュしました。 - + External command failed to start. 外部コマンドの起動に失敗しました。 - + Command <i>%1</i> failed to start. コマンド <i>%1</i> の起動に失敗しました。 - + Internal error when starting command. コマンドが起動する際に内部エラーが発生しました。 - + Bad parameters for process job call. ジョブ呼び出しにおける不正なパラメータ - + External command failed to finish. 外部コマンドの終了に失敗しました。 - + Command <i>%1</i> failed to finish in %2 seconds. コマンド<i>%1</i> %2 秒以内に終了することに失敗しました。 - + External command finished with errors. 外部のコマンドがエラーで停止しました。 - + Command <i>%1</i> finished with exit code %2. コマンド <i>%1</i> が終了コード %2 で終了しました。. @@ -2331,7 +2379,7 @@ Output: (マウントポイントなし) - + Requirements checking for module <i>%1</i> is complete. モジュール <i>%1</i> に必要なパッケージの確認が完了しました。 diff --git a/lang/calamares_kk.ts b/lang/calamares_kk.ts index 214321ce4..92b22ea2d 100644 --- a/lang/calamares_kk.ts +++ b/lang/calamares_kk.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back А&ртқа - - + &Next &Алға - - + &Cancel Ба&с тарту - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Орнатудан бас тарту керек пе? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error - + Installation Failed @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_kn.ts b/lang/calamares_kn.ts index 199db8626..7b8d93e9d 100644 --- a/lang/calamares_kn.ts +++ b/lang/calamares_kn.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back ಹಿಂದಿನ - - + &Next ಮುಂದಿನ - - + &Cancel ರದ್ದುಗೊಳಿಸು - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? ಅನುಸ್ಥಾಪನೆಯನ್ನು ರದ್ದುಮಾಡುವುದೇ? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes ಹೌದು - + &No ಇಲ್ಲ - + &Close ಮುಚ್ಚಿರಿ - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error ದೋಷ - + Installation Failed ಅನುಸ್ಥಾಪನೆ ವಿಫಲವಾಗಿದೆ @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_ko.ts b/lang/calamares_ko.ts index 235f3070d..944380431 100644 --- a/lang/calamares_ko.ts +++ b/lang/calamares_ko.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). %n 모듈(들)을 기다리는 중. - + (%n second(s)) (%n 초) - + System-requirements checking is complete. 시스템 요구사항 검사가 완료 되었습니다. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back 뒤로 (&B) - - + &Next 다음 (&N) - - + &Cancel 취소 (&C) - - + Cancel setup without changing the system. 시스템을 변경 하지 않고 설치를 취소합니다. - - + Cancel installation without changing the system. 시스템 변경 없이 설치를 취소합니다. - + Setup Failed 설치 실패 - + Calamares Initialization Failed Calamares 초기화 실패 - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 가 설치될 수 없습니다. Calamares가 모든 구성된 모듈을 불러올 수 없었습니다. 이것은 Calamares가 분포에 의해 사용되는 방식에서 비롯된 문제입니다. - + <br/>The following modules could not be loaded: 다음 모듈 불러오기 실패: - + Continue with installation? 설치를 계속하시겠습니까? - + 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> %1 설치 프로그램이 %2을(를) 설정하기 위해 디스크를 변경하려고 하는 중입니다.<br/><strong>이러한 변경은 취소할 수 없습니다.</strong> - + &Set up now 지금 설치 (&S) - + &Set up 설치 (&S) - + &Install 설치(&I) - + Setup is complete. Close the setup program. 설치가 완료 되었습니다. 설치 프로그램을 닫습니다. - + Cancel setup? 설치를 취소 하시겠습니까? - + Cancel installation? 설치를 취소하시겠습니까? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. 현재 설정 프로세스를 취소하시겠습니까? 설치 프로그램이 종료되고 모든 변경 내용이 손실됩니다. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. 정말로 현재 설치 프로세스를 취소하시겠습니까? 설치 관리자가 종료되며 모든 변경은 반영되지 않습니다. - + &Yes 예(&Y) - + &No 아니오(&N) - + &Close 닫기(&C) - + Continue with setup? 설치를 계속하시겠습니까? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 인스톨러가 %2를 설치하기 위해 사용자의 디스크의 내용을 변경하려고 합니다. <br/> <strong>이 변경 작업은 되돌릴 수 없습니다.</strong> - + &Install now 지금 설치 (&I) - + Go &back 뒤로 이동 (&b) - + &Done 완료 (&D) - + The installation is complete. Close the installer. 설치가 완료되었습니다. 설치 관리자를 닫습니다. - + Error 오류 - + Installation Failed 설치 실패 @@ -1290,6 +1286,22 @@ The installer will quit and all changes will be lost. <code>%1</code> 파일에 쓸 수 없습니다. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + mkinitcpio를 사용하여 initramfs 만드는 중. + + + + InitramfsJob + + + Creating initramfs. + initramfs를 만드는 중. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ The installer will quit and all changes will be lost. 위치 + + LuksBootKeyFileJob + + + Configuring LUKS key file. + LUKS 키 파일 구성 중. + + + + + No partitions are defined. + 파티션이 정의되지 않았습니다. + + + + + + Encrypted rootfs setup error + 암호화된 rootfs 설정 오류 + + + + Root partition %1 is LUKS but no passphrase has been set. + 루트 파티션 %1이(가) LUKS이지만 암호가 설정되지 않았습니다. + + + + Could not create LUKS key file for root partition %1. + 루트 파티션 %1에 대한 LUKS 키 파일을 생성할 수 없습니다. + + + + Could configure LUKS key file on partition %1. + %1 파티션에서 LUKS 키 파일을 구성할 수 있습니다. + + NetInstallPage @@ -2220,14 +2268,14 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. 명령으로부터 아무런 출력이 없습니다. - + Output: @@ -2236,52 +2284,52 @@ Output: - + External command crashed. 외부 명령이 실패했습니다. - + Command <i>%1</i> crashed. <i>%1</i> 명령이 실패했습니다. - + External command failed to start. 외부 명령을 시작하지 못했습니다. - + Command <i>%1</i> failed to start. <i>%1</i> 명령을 시작하지 못했습니다. - + Internal error when starting command. 명령을 시작하는 중에 내부 오류가 발생했습니다. - + Bad parameters for process job call. 프로세스 작업 호출에 대한 잘못된 매개 변수입니다. - + External command failed to finish. 외부 명령을 완료하지 못했습니다. - + Command <i>%1</i> failed to finish in %2 seconds. <i>%1</i> 명령을 %2초 안에 완료하지 못했습니다. - + External command finished with errors. 외부 명령이 오류와 함께 완료되었습니다. - + Command <i>%1</i> finished with exit code %2. <i>%1</i> 명령이 종료 코드 %2와 함께 완료되었습니다. @@ -2330,7 +2378,7 @@ Output: (마운트 위치 없음) - + Requirements checking for module <i>%1</i> is complete. <i>%1</i> 모듈에 대한 요구사항 검사가 완료되었습니다. diff --git a/lang/calamares_lo.ts b/lang/calamares_lo.ts index d5a333062..d0a03a73e 100644 --- a/lang/calamares_lo.ts +++ b/lang/calamares_lo.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back - - + &Next - - + &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error - + Installation Failed @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_lt.ts b/lang/calamares_lt.ts index 2bd6a6621..f53552226 100644 --- a/lang/calamares_lt.ts +++ b/lang/calamares_lt.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Laukiama %n modulio.Laukiama %n modulių.Laukiama %n modulių.Laukiama %n modulio. - + (%n second(s)) (%n sekundė)(%n sekundės)(%n sekundžių)(%n sekundė) - + System-requirements checking is complete. Sistemos reikalavimų tikrinimas yra užbaigtas. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Atgal - - + &Next &Toliau - - + &Cancel A&tsisakyti - - + Cancel setup without changing the system. Atsisakyti sąrankos, nieko sistemoje nekeičiant. - - + Cancel installation without changing the system. Atsisakyti diegimo, nieko sistemoje nekeičiant. - + Setup Failed Sąranka patyrė nesėkmę - + Calamares Initialization Failed Calamares inicijavimas nepavyko - + %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. Nepavyksta įdiegti %1. Calamares nepavyko įkelti visų sukonfigūruotų modulių. Tai yra problema, susijusi su tuo, kaip distribucija naudoja diegimo programą Calamares. - + <br/>The following modules could not be loaded: <br/>Nepavyko įkelti šių modulių: - + Continue with installation? Tęsti diegimą? - + 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> %1 sąrankos programa, siekdama nustatyti %2, ketina atlikti pakeitimus diske.<br/><strong>Šių pakeitimų nebegalėsite atšaukti.</strong> - + &Set up now Nu&statyti dabar - + &Set up Nu&statyti - + &Install Į&diegti - + Setup is complete. Close the setup program. Sąranka užbaigta. Užverkite sąrankos programą. - + Cancel setup? Atsisakyti sąrankos? - + Cancel installation? Atsisakyti diegimo? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Ar tikrai norite atsisakyti dabartinio sąrankos proceso? Sąrankos programa užbaigs darbą ir visi pakeitimai bus prarasti. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Ar tikrai norite atsisakyti dabartinio diegimo proceso? Diegimo programa užbaigs darbą ir visi pakeitimai bus prarasti. - + &Yes &Taip - + &No &Ne - + &Close &Užverti - + Continue with setup? Tęsti sąranką? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 diegimo programa, siekdama įdiegti %2, ketina atlikti pakeitimus diske.<br/><strong>Šių pakeitimų nebegalėsite atšaukti.</strong> - + &Install now Į&diegti dabar - + Go &back &Grįžti - + &Done A&tlikta - + The installation is complete. Close the installer. Diegimas užbaigtas. Užverkite diegimo programą. - + Error Klaida - + Installation Failed Diegimas nepavyko @@ -1290,6 +1286,22 @@ Diegimo programa užbaigs darbą ir visi pakeitimai bus prarasti. Nepavyko rašyti į failą <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Sukuriama initramfs naudojant mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + Sukuriama initramfs. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ Diegimo programa užbaigs darbą ir visi pakeitimai bus prarasti. Vieta + + LuksBootKeyFileJob + + + Configuring LUKS key file. + Konfigūruojamas LUKS raktų failas. + + + + + No partitions are defined. + Nėra jokių apibrėžtų skaidinių. + + + + + + Encrypted rootfs setup error + Šifruoto rootfs sąrankos klaida + + + + Root partition %1 is LUKS but no passphrase has been set. + Šaknies skaidinys %1 yra LUKS, tačiau nebuvo nustatyta jokia slaptafrazė. + + + + Could not create LUKS key file for root partition %1. + Nepavyko šaknies skaidiniui %1 sukurti LUKS rakto failo. + + + + Could configure LUKS key file on partition %1. + Nepavyko konfigūruoti LUKS rakto failo skaidinyje %1. + + NetInstallPage @@ -2220,14 +2268,14 @@ Diegimo programa užbaigs darbą ir visi pakeitimai bus prarasti. ProcessResult - + There was no output from the command. Nebuvo jokios išvesties iš komandos. - + Output: @@ -2236,52 +2284,52 @@ Išvestis: - + External command crashed. Išorinė komanda užstrigo. - + Command <i>%1</i> crashed. Komanda <i>%1</i> užstrigo. - + External command failed to start. Nepavyko paleisti išorinės komandos. - + Command <i>%1</i> failed to start. Nepavyko paleisti komandos <i>%1</i>. - + Internal error when starting command. Paleidžiant komandą, įvyko vidinė klaida. - + Bad parameters for process job call. Blogi parametrai proceso užduoties iškvietai. - + External command failed to finish. Nepavyko pabaigti išorinės komandos. - + Command <i>%1</i> failed to finish in %2 seconds. Nepavyko per %2 sek. pabaigti komandos <i>%1</i>. - + External command finished with errors. Išorinė komanda pabaigta su klaidomis. - + Command <i>%1</i> finished with exit code %2. Komanda <i>%1</i> pabaigta su išėjimo kodu %2. @@ -2330,7 +2378,7 @@ Išvestis: (nėra prijungimo taško) - + Requirements checking for module <i>%1</i> is complete. Reikalavimų tikrinimas <i>%1</i> moduliui yra užbaigtas. diff --git a/lang/calamares_mk.ts b/lang/calamares_mk.ts index f591f3d63..6058b1059 100644 --- a/lang/calamares_mk.ts +++ b/lang/calamares_mk.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back - - + &Next - - + &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. Инсталацијата е готова. Исклучете го инсталерот. - + Error Грешка - + Installation Failed @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_mr.ts b/lang/calamares_mr.ts index 887d2b0b5..f4d005f92 100644 --- a/lang/calamares_mr.ts +++ b/lang/calamares_mr.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back &मागे - - + &Next &पुढे - - + &Cancel &रद्द करा - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. प्रणालीत बदल न करता अधिष्टापना रद्द करा. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? अधिष्ठापना रद्द करायचे? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes &होय - + &No &नाही - + &Close &बंद करा - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now &आता अधिष्ठापित करा - + Go &back &मागे जा - + &Done &पूर्ण झाली - + The installation is complete. Close the installer. अधिष्ठापना संपूर्ण झाली. अधिष्ठापक बंद करा. - + Error त्रुटी - + Installation Failed अधिष्ठापना अयशस्वी झाली @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_nb.ts b/lang/calamares_nb.ts index e6c0bb3cf..1ed2dd4aa 100644 --- a/lang/calamares_nb.ts +++ b/lang/calamares_nb.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Tilbake - - + &Next &Neste - - + &Cancel &Avbryt - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Avbryte installasjon? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Vil du virkelig avbryte installasjonen? Installasjonsprogrammet vil avsluttes og alle endringer vil gå tapt. - + &Yes &Ja - + &No &Nei - + &Close &Lukk - + Continue with setup? Fortsette å sette opp? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 vil nå gjøre endringer på harddisken, for å installere %2. <br/><strong>Du vil ikke kunne omgjøre disse endringene.</strong> - + &Install now &Installer nå - + Go &back Gå &tilbake - + &Done &Ferdig - + The installation is complete. Close the installer. Installasjonen er fullført. Lukk installeringsprogrammet. - + Error Feil - + Installation Failed Installasjon feilet @@ -1289,6 +1285,22 @@ Installasjonsprogrammet vil avsluttes og alle endringer vil gå tapt. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ Installasjonsprogrammet vil avsluttes og alle endringer vil gå tapt.Plassering + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,65 +2267,65 @@ Installasjonsprogrammet vil avsluttes og alle endringer vil gå tapt. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. Ugyldige parametere for prosessens oppgavekall - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2326,7 +2374,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_ne_NP.ts b/lang/calamares_ne_NP.ts index 069c082a9..53f88b1b2 100644 --- a/lang/calamares_ne_NP.ts +++ b/lang/calamares_ne_NP.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back - - + &Next - - + &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error - + Installation Failed @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_nl.ts b/lang/calamares_nl.ts index ce02fcd02..039ef6f49 100644 --- a/lang/calamares_nl.ts +++ b/lang/calamares_nl.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Terug - - + &Next &Volgende - - + &Cancel &Afbreken - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Installatie afbreken zonder aanpassingen aan het systeem. - + Setup Failed - + Calamares Initialization Failed Calamares Initialisatie mislukt - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 kan niet worden geïnstalleerd. Calamares kon niet alle geconfigureerde modules laden. Dit is een probleem met hoe Calamares wordt gebruikt door de distributie. - + <br/>The following modules could not be loaded: <br/>The volgende modules konden niet worden geladen: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install &Installeer - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Installatie afbreken? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Wil je het huidige installatieproces echt afbreken? Het installatieprogramma zal afsluiten en alle wijzigingen zullen verloren gaan. - + &Yes &ja - + &No &Nee - + &Close &Sluiten - + Continue with setup? Doorgaan met installatie? - + 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> Het %1 installatieprogramma zal nu aanpassingen maken aan je schijf om %2 te installeren.<br/><strong>Deze veranderingen kunnen niet ongedaan gemaakt worden.</strong> - + &Install now Nu &installeren - + Go &back Ga &terug - + &Done Voltooi&d - + The installation is complete. Close the installer. De installatie is voltooid. Sluit het installatie-programma. - + Error Fout - + Installation Failed Installatie Mislukt @@ -1289,6 +1285,22 @@ Het installatieprogramma zal afsluiten en alle wijzigingen zullen verloren gaan. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ Het installatieprogramma zal afsluiten en alle wijzigingen zullen verloren gaan. Locatie + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,14 +2267,14 @@ Het installatieprogramma zal afsluiten en alle wijzigingen zullen verloren gaan. ProcessResult - + There was no output from the command. Er was geen uitvoer van de opdracht. - + Output: @@ -2235,52 +2283,52 @@ Uitvoer: - + External command crashed. Externe opdracht is vastgelopen. - + Command <i>%1</i> crashed. Opdracht <i>%1</i> is vastgelopen. - + External command failed to start. Externe opdracht kon niet worden gestart. - + Command <i>%1</i> failed to start. Opdracht <i>%1</i> kon niet worden gestart. - + Internal error when starting command. Interne fout bij het starten van de opdracht. - + Bad parameters for process job call. Onjuiste parameters voor procestaak - + External command failed to finish. Externe opdracht is niet correct beëindigd. - + Command <i>%1</i> failed to finish in %2 seconds. Opdracht <i>%1</i> is niet beëindigd in %2 seconden. - + External command finished with errors. Externe opdracht beëindigd met fouten. - + Command <i>%1</i> finished with exit code %2. Opdracht <i>%1</i> beëindigd met foutcode %2. @@ -2329,7 +2377,7 @@ Uitvoer: (geen aankoppelpunt) - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_pl.ts b/lang/calamares_pl.ts index c3beb76f3..68639ced1 100644 --- a/lang/calamares_pl.ts +++ b/lang/calamares_pl.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Wstecz - - + &Next &Dalej - - + &Cancel &Anuluj - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Anuluj instalację bez dokonywania zmian w systemie. - + Setup Failed - + Calamares Initialization Failed Błąd inicjacji programu Calamares - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 nie może zostać zainstalowany. Calamares nie mógł wczytać wszystkich skonfigurowanych modułów. Jest to problem ze sposobem, w jaki Calamares jest używany przez dystrybucję. - + <br/>The following modules could not be loaded: <br/>Następujące moduły nie mogły zostać wczytane: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install Za&instaluj - + Setup is complete. Close the setup program. - + Cancel setup? Anulować ustawianie? - + Cancel installation? Anulować instalację? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Czy na pewno chcesz anulować obecny proces instalacji? Instalator zostanie zamknięty i wszystkie zmiany zostaną utracone. - + &Yes &Tak - + &No &Nie - + &Close Zam&knij - + Continue with setup? Kontynuować z programem instalacyjnym? - + 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> Instalator %1 zamierza przeprowadzić zmiany na Twoim dysku, aby zainstalować %2.<br/><strong>Nie będziesz mógł cofnąć tych zmian.</strong> - + &Install now &Zainstaluj teraz - + Go &back &Cofnij się - + &Done &Ukończono - + The installation is complete. Close the installer. Instalacja ukończona pomyślnie. Możesz zamknąć instalator. - + Error Błąd - + Installation Failed Wystąpił błąd instalacji @@ -1289,6 +1285,22 @@ Instalator zostanie zamknięty i wszystkie zmiany zostaną utracone. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Tworzenie initramfs z mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + Tworzenie initramfs. + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ Instalator zostanie zamknięty i wszystkie zmiany zostaną utracone.Położenie + + LuksBootKeyFileJob + + + Configuring LUKS key file. + Konfigurowanie pliku klucza LUKS. + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,14 +2267,14 @@ Instalator zostanie zamknięty i wszystkie zmiany zostaną utracone. ProcessResult - + There was no output from the command. W wyniku polecenia nie ma żadnego rezultatu. - + Output: @@ -2235,52 +2283,52 @@ Wyjście: - + External command crashed. Zewnętrzne polecenie zakończone niepowodzeniem. - + Command <i>%1</i> crashed. Wykonanie polecenia <i>%1</i> nie powiodło się. - + External command failed to start. Nie udało się uruchomić zewnętrznego polecenia. - + Command <i>%1</i> failed to start. Polecenie <i>%1</i> nie zostało uruchomione. - + Internal error when starting command. Wystąpił wewnętrzny błąd podczas uruchamiania polecenia. - + Bad parameters for process job call. Błędne parametry wywołania zadania. - + External command failed to finish. Nie udało się ukończyć zewnętrznego polecenia. - + Command <i>%1</i> failed to finish in %2 seconds. Nie udało się ukończyć polecenia <i>%1</i> w ciągu %2 sekund. - + External command finished with errors. Ukończono zewnętrzne polecenie z błędami. - + Command <i>%1</i> finished with exit code %2. Polecenie <i>%1</i> zostało ukończone z błędem o kodzie %2. @@ -2329,7 +2377,7 @@ Wyjście: (brak punktu montowania) - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_pt_BR.ts b/lang/calamares_pt_BR.ts index 2e0809b87..533541556 100644 --- a/lang/calamares_pt_BR.ts +++ b/lang/calamares_pt_BR.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Esperando por %n módulo.Esperando por %n módulos. - + (%n second(s)) (%n segundo)(%n segundos) - + System-requirements checking is complete. Verificação de requerimentos do sistema completa. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Voltar - - + &Next &Próximo - - + &Cancel &Cancelar - - + Cancel setup without changing the system. Cancelar configuração sem alterar o sistema. - - + Cancel installation without changing the system. Cancelar instalação sem modificar o sistema. - + Setup Failed A Configuração Falhou - + Calamares Initialization Failed Falha na inicialização do Calamares - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 não pôde ser instalado. O Calamares não conseguiu carregar todos os módulos configurados. Este é um problema com o modo em que o Calamares está sendo utilizado pela distribuição. - + <br/>The following modules could not be loaded: <br/>Os seguintes módulos não puderam ser carregados: - + Continue with installation? Continuar com a instalação? - + 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> O programa de configuração %1 está prestes a fazer mudanças no seu disco de modo a configurar %2.<br/><strong>Você não será capaz de desfazer estas mudanças.</strong> - + &Set up now &Configurar agora - + &Set up &Configurar - + &Install &Instalar - + Setup is complete. Close the setup program. A configuração está completa. Feche o programa de configuração. - + Cancel setup? Cancelar a configuração? - + Cancel installation? Cancelar a instalação? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Você realmente quer cancelar o processo atual de configuração? O programa de configuração será fechado e todas as mudanças serão perdidas. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Você deseja realmente cancelar a instalação atual? O instalador será fechado e todas as alterações serão perdidas. - + &Yes &Sim - + &No &Não - + &Close Fe&char - + Continue with setup? Continuar com configuração? - + 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> O instalador %1 está prestes a fazer alterações no disco a fim de instalar %2.<br/><strong>Você não será capaz de desfazer estas mudanças.</strong> - + &Install now &Instalar agora - + Go &back &Voltar - + &Done Concluí&do - + The installation is complete. Close the installer. A instalação está completa. Feche o instalador. - + Error Erro - + Installation Failed Falha na Instalação @@ -1290,6 +1286,22 @@ O instalador será fechado e todas as alterações serão perdidas.Não foi possível escrever no arquivo <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Criando initramfs com mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + Criando initramfs. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ O instalador será fechado e todas as alterações serão perdidas.Localização + + LuksBootKeyFileJob + + + Configuring LUKS key file. + Configurando o arquivo de chave do LUKS. + + + + + No partitions are defined. + Nenhuma partição está definida. + + + + + + Encrypted rootfs setup error + Erro de configuração de rootfs encriptado + + + + Root partition %1 is LUKS but no passphrase has been set. + A partição raiz %1 é LUKS, mas nenhuma senha foi definida. + + + + Could not create LUKS key file for root partition %1. + Não foi possível criar o arquivo de chave LUKS para a partição raiz %1. + + + + Could configure LUKS key file on partition %1. + Pode configurar o arquivo de chave LUKS na partição% 1. + + NetInstallPage @@ -2220,14 +2268,14 @@ O instalador será fechado e todas as alterações serão perdidas. ProcessResult - + There was no output from the command. Não houve saída do comando. - + Output: @@ -2236,52 +2284,52 @@ Saída: - + External command crashed. O comando externo falhou. - + Command <i>%1</i> crashed. O comando <i>%1</i> falhou. - + External command failed to start. O comando externo falhou ao iniciar. - + Command <i>%1</i> failed to start. O comando <i>%1</i> falhou ao iniciar. - + Internal error when starting command. Erro interno ao iniciar o comando. - + Bad parameters for process job call. Parâmetros ruins para a chamada da tarefa do processo. - + External command failed to finish. O comando externo falhou ao finalizar. - + Command <i>%1</i> failed to finish in %2 seconds. O comando <i>%1</i> falhou ao finalizar em %2 segundos. - + External command finished with errors. O comando externo foi concluído com erros. - + Command <i>%1</i> finished with exit code %2. O comando <i>%1</i> foi concluído com o código %2. @@ -2330,7 +2378,7 @@ Saída: (sem ponto de montagem) - + Requirements checking for module <i>%1</i> is complete. A verificação de requerimentos para o módulo <i>%1</i> está completa. diff --git a/lang/calamares_pt_PT.ts b/lang/calamares_pt_PT.ts index e1d49f242..c8d680dda 100644 --- a/lang/calamares_pt_PT.ts +++ b/lang/calamares_pt_PT.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). A aguardar por %n módulo(s).A aguardar por %n módulo(s). - + (%n second(s)) (%n segundo(s))(%n segundo(s)) - + System-requirements checking is complete. A verificação de requisitos de sistema está completa. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Voltar - - + &Next &Próximo - - + &Cancel &Cancelar - - + Cancel setup without changing the system. Cancelar instalação sem alterar o sistema. - - + Cancel installation without changing the system. Cancelar instalar instalação sem modificar o sistema. - + Setup Failed Falha de Instalação - + Calamares Initialization Failed Falha na Inicialização do Calamares - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 não pode ser instalado. O Calamares não foi capaz de carregar todos os módulos configurados. Isto é um problema da maneira como o Calamares é usado pela distribuição. - + <br/>The following modules could not be loaded: <br/>Os módulos seguintes não puderam ser carregados: - + Continue with installation? Continuar com a instalação? - + 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> - + &Set up now &Instalar agora - + &Set up &Instalar - + &Install &Instalar - + Setup is complete. Close the setup program. Instalação completa. Feche o programa de instalação. - + Cancel setup? Cancelar instalação? - + Cancel installation? Cancelar a instalação? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Quer mesmo cancelar o processo de instalação atual? O programa de instalação irá fechar todas as alterações serão perdidas. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Tem a certeza que pretende cancelar o atual processo de instalação? O instalador será encerrado e todas as alterações serão perdidas. - + &Yes &Sim - + &No &Não - + &Close &Fechar - + Continue with setup? Continuar com a configuração? - + 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> O %1 instalador está prestes a fazer alterações ao seu disco em ordem para instalar %2.<br/><strong>Não será capaz de desfazer estas alterações.</strong> - + &Install now &Instalar agora - + Go &back Voltar &atrás - + &Done &Feito - + The installation is complete. Close the installer. A instalação está completa. Feche o instalador. - + Error Erro - + Installation Failed Falha na Instalação @@ -1290,6 +1286,22 @@ O instalador será encerrado e todas as alterações serão perdidas.Não foi possível escrever para o ficheiro <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + A criar o initramfs. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ O instalador será encerrado e todas as alterações serão perdidas.Localização + + LuksBootKeyFileJob + + + Configuring LUKS key file. + A configurar o ficheiro chave do LUKS. + + + + + No partitions are defined. + Nenhuma partição é definida. + + + + + + Encrypted rootfs setup error + Erro de configuração do rootfs criptografado + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2220,14 +2268,14 @@ O instalador será encerrado e todas as alterações serão perdidas. ProcessResult - + There was no output from the command. O comando não produziu saída de dados. - + Output: @@ -2236,52 +2284,52 @@ Saída de Dados: - + External command crashed. O comando externo "crashou". - + Command <i>%1</i> crashed. Comando <i>%1</i> "crashou". - + External command failed to start. Comando externo falhou ao iniciar. - + Command <i>%1</i> failed to start. Comando <i>%1</i> falhou a inicialização. - + Internal error when starting command. Erro interno ao iniciar comando. - + Bad parameters for process job call. Maus parâmetros para chamada de processamento de tarefa. - + External command failed to finish. Comando externo falhou a finalização. - + Command <i>%1</i> failed to finish in %2 seconds. Comando <i>%1</i> falhou ao finalizar em %2 segundos. - + External command finished with errors. Comando externo finalizou com erros. - + Command <i>%1</i> finished with exit code %2. Comando <i>%1</i> finalizou com código de saída %2. @@ -2330,7 +2378,7 @@ Saída de Dados: (sem ponto de montagem) - + Requirements checking for module <i>%1</i> is complete. A verificação de requisitos para módulo <i>%1</i> está completa. diff --git a/lang/calamares_ro.ts b/lang/calamares_ro.ts index fbc795e6a..b979ba4c8 100644 --- a/lang/calamares_ro.ts +++ b/lang/calamares_ro.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Înapoi - - + &Next &Următorul - - + &Cancel &Anulează - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. Anulează instalarea fără schimbarea sistemului. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install Instalează - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Anulez instalarea? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Doriți să anulați procesul curent de instalare? Programul de instalare va ieși, iar toate modificările vor fi pierdute. - + &Yes &Da - + &No &Nu - + &Close În&chide - + Continue with setup? Continuați configurarea? - + 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> Programul de instalare %1 este pregătit să facă schimbări pe discul dumneavoastră pentru a instala %2.<br/><strong>Nu veți putea anula aceste schimbări.</strong> - + &Install now &Instalează acum - + Go &back Î&napoi - + &Done &Gata - + The installation is complete. Close the installer. Instalarea este completă. Închide instalatorul. - + Error Eroare - + Installation Failed Instalare eșuată @@ -1289,6 +1285,22 @@ Programul de instalare va ieși, iar toate modificările vor fi pierdute. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ Programul de instalare va ieși, iar toate modificările vor fi pierdute.Locație + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2222,14 +2270,14 @@ Programul de instalare va ieși, iar toate modificările vor fi pierdute. ProcessResult - + There was no output from the command. Nu a existat nici o iesire din comanda - + Output: @@ -2238,52 +2286,52 @@ Output - + External command crashed. Comanda externă a eșuat. - + Command <i>%1</i> crashed. Comanda <i>%1</i> a eșuat. - + External command failed to start. Comanda externă nu a putut fi pornită. - + Command <i>%1</i> failed to start. Comanda <i>%1</i> nu a putut fi pornită. - + Internal error when starting command. Eroare internă la pornirea comenzii. - + Bad parameters for process job call. Parametri proști pentru apelul sarcinii de proces. - + External command failed to finish. Finalizarea comenzii externe a eșuat. - + Command <i>%1</i> failed to finish in %2 seconds. Comanda <i>%1</i> nu a putut fi finalizată în %2 secunde. - + External command finished with errors. Comanda externă finalizată cu erori. - + Command <i>%1</i> finished with exit code %2. Comanda <i>%1</i> finalizată cu codul de ieșire %2. @@ -2332,7 +2380,7 @@ Output - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_ru.ts b/lang/calamares_ru.ts index aaf4c34a5..b61661e1a 100644 --- a/lang/calamares_ru.ts +++ b/lang/calamares_ru.ts @@ -99,7 +99,7 @@ Reload Stylesheet - + Перезагрузить таблицу стилей @@ -130,7 +130,7 @@ Job failed (%1) - + Задание не успешно (%1) @@ -208,176 +208,173 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. - + Проверка соответствия системным требованиям завершена. Calamares::ViewManager - + &Back &Назад - - + &Next &Далее - - + &Cancel О&тмена - - + Cancel setup without changing the system. - + Отменить установку без изменения системы. - - + Cancel installation without changing the system. Отменить установку без изменения системы. - + Setup Failed - + Сбой установки - + Calamares Initialization Failed Ошибка инициализации Calamares - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. Не удалось установить %1. Calamares не удалось загрузить все сконфигурированные модули. Эта проблема вызвана тем, как ваш дистрибутив использует Calamares. - + <br/>The following modules could not be loaded: <br/>Не удалось загрузить следующие модули: - + Continue with installation? - + Продолжить установку? - + 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> - + Программа установки %1 готова внести изменения на Ваш диск, чтобы установить %2.<br/><strong>Отменить эти изменения будет невозможно.</strong> - + &Set up now - + &Set up - + &Install &Установить - + Setup is complete. Close the setup program. - + Установка завершена. Закройте программу установки. - + Cancel setup? - + Отменить установку? - + Cancel installation? Отменить установку? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Прервать процесс установки? +Программа установки прекратит работу и все изменения будут потеряны. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Действительно прервать процесс установки? Программа установки сразу прекратит работу, все изменения будут потеряны. - + &Yes &Да - + &No &Нет - + &Close &Закрыть - + Continue with setup? Продолжить установку? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Программа установки %1 готова внести изменения на Ваш диск, чтобы установить %2.<br/><strong>Отменить эти изменения будет невозможно.</strong> - + &Install now Приступить к &установке - + Go &back &Назад - + &Done &Готово - + The installation is complete. Close the installer. Установка завершена. Закройте установщик. - + Error Ошибка - + Installation Failed Установка завершилась неудачей @@ -410,7 +407,7 @@ The installer will quit and all changes will be lost. %1 Setup Program - + Программа установки %1 @@ -479,7 +476,7 @@ The installer will quit and all changes will be lost. %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. - + %1 будет уменьшен до %2MB и новый раздел %3MB будет создан для %4. @@ -522,12 +519,12 @@ The installer will quit and all changes will be lost. No Swap - + Без раздела подкачки Reuse Swap - + Использовать существующий раздел подкачки @@ -722,12 +719,12 @@ The installer will quit and all changes will be lost. Create new %2MiB partition on %4 (%3) with file system %1. - + Создать новый раздел %2 MB на %4 (%3) с файловой системой %1. Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. - + Создать новый раздел <strong>%2 MB</strong> на <strong>%4</strong> (%3) с файловой системой <strong>%1</strong>. @@ -834,7 +831,7 @@ The installer will quit and all changes will be lost. Create Volume Group - + Создать группу томов @@ -1110,7 +1107,7 @@ The installer will quit and all changes will be lost. <Restart checkbox tooltip> - + <Restart checkbox tooltip> @@ -1120,12 +1117,12 @@ The installer will quit and all changes will be lost. <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. - + <h1>Готово.</h1><br/>Система %1 установлена на ваш компьютер.<br/>Можете перезагрузить компьютер и начать использовать вашу новую систему. <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> - + <html><head/><body><p>Если этот флажок установлен, ваша система будет перезагружена сразу после нажатия кнопки <span style="font-style:italic;">Готово</span> или закрытия программы установки.</p></body></html> @@ -1135,12 +1132,12 @@ The installer will quit and all changes will be lost. <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> - + <html><head/><body><p>Если этот флажок установлен, ваша система будет перезагружена сразу после нажатия кнопки <span style=" font-style:italic;">Готово</span> или закрытия программы установки.</p></body></html> <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. - + <h1>Сбой установки</h1><br/>Система %1 не была установлена на ваш компьютер.<br/>Сообщение об ошибке: %2. @@ -1158,7 +1155,7 @@ The installer will quit and all changes will be lost. Setup Complete - + Установка завершена @@ -1168,7 +1165,7 @@ The installer will quit and all changes will be lost. The setup of %1 is complete. - + Установка %1 завершена. @@ -1181,12 +1178,12 @@ The installer will quit and all changes will be lost. Format partition %1 (file system: %2, size: %3 MiB) on %4. - + Форматировать раздел %1 (файловая система: %2, размер: %3 МБ) на %4. Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. - + Форматировать раздел <strong>%1</strong> размером <strong>%3MB</strong> с файловой системой <strong>%2</strong>. @@ -1204,22 +1201,22 @@ The installer will quit and all changes will be lost. has at least %1 GiB available drive space - + доступно как минимум %1 ГБ свободного дискового пространства There is not enough drive space. At least %1 GiB is required. - + Недостаточно места на дисках. Необходимо как минимум %1 ГБ. has at least %1 GiB working memory - + доступно как минимум %1 ГБ оперативной памяти The system does not have enough working memory. At least %1 GiB is required. - + Недостаточно оперативной памяти. Необходимо как минимум %1 ГБ. @@ -1244,7 +1241,7 @@ The installer will quit and all changes will be lost. The setup program is not running with administrator rights. - + Программа установки запущена без прав администратора. @@ -1254,7 +1251,7 @@ The installer will quit and all changes will be lost. The screen is too small to display the setup program. - + Экран слишком маленький, чтобы отобразить программу установки. @@ -1275,17 +1272,33 @@ The installer will quit and all changes will be lost. Could not create directories <code>%1</code>. - + Не удалось создать директории <code>%1</code>. Could not open file <code>%1</code>. - + Не удалось открыть файл <code>%1</code>. Could not write to file <code>%1</code>. - + Не удалась запись в файл <code>%1</code>. + + + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Создание initramfs при помощи mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + Создание initramfs. @@ -1436,32 +1449,32 @@ The installer will quit and all changes will be lost. Shows the complete license text - + Показывает полный текст лицензии Hide license text - + Скрыть текст лицензии Show license agreement - + Показать лицензионное соглашение Hide license agreement - + Скрыть лицензионное соглашение Opens the license agreement in a browser window. - + Открывает лицензионное соглашение в окне браузера. <a href="%1">View license agreement</a> - + <a href="%1">Просмотреть лицензионное соглашение</a> @@ -1511,6 +1524,42 @@ The installer will quit and all changes will be lost. Местоположение + + LuksBootKeyFileJob + + + Configuring LUKS key file. + Конфигурация файла ключа LUKS. + + + + + No partitions are defined. + Разделы не были заданы. + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + Корневой раздел %1 это LUKS, но ключ шифрования не был задан. + + + + Could not create LUKS key file for root partition %1. + Не удалось создать файл ключа LUKS для корневого раздела %1. + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2149,12 +2198,12 @@ The installer will quit and all changes will be lost. has at least one disk device available. - + имеет как минимум одно доступное дисковое устройство. There are no partitons to install on. - + Нет разделов для установки. @@ -2218,14 +2267,14 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. Вывода из команды не последовало. - + Output: @@ -2234,52 +2283,52 @@ Output: - + External command crashed. Сбой внешней команды. - + Command <i>%1</i> crashed. Сбой команды <i>%1</i>. - + External command failed to start. Не удалось запустить внешнюю команду. - + Command <i>%1</i> failed to start. Не удалось запустить команду <i>%1</i>. - + Internal error when starting command. Внутренняя ошибка при запуске команды. - + Bad parameters for process job call. Неверные параметры для вызова процесса. - + External command failed to finish. Не удалось завершить внешнюю команду. - + Command <i>%1</i> failed to finish in %2 seconds. Команда <i>%1</i> не завершилась за %2 с. - + External command finished with errors. Внешняя команда завершилась с ошибками - + Command <i>%1</i> finished with exit code %2. Команда <i>%1</i> завершилась с кодом %2. @@ -2325,12 +2374,12 @@ Output: (no mount point) - + (без точки монтирования) - + Requirements checking for module <i>%1</i> is complete. - + Проверка требований для модуля <i>%1</i> завершена. @@ -2485,23 +2534,23 @@ Output: The filesystem %1 cannot be resized. - + Невозможно изменить размер файловой системы %1. The device %1 cannot be resized. - + Невозможно изменить размер устройства %1. The filesystem %1 must be resized, but cannot. - + Необходимо, но не удаётся изменить размер файловой системы %1 The device %1 must be resized, but cannot - + Необходимо, но не удаётся изменить размер устройства %1 @@ -2514,12 +2563,12 @@ Output: Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong>. - + Изменить размер <strong>%2MB</strong> раздела <strong>%1</strong> на <strong>%3MB</strong>. Resizing %2MiB partition %1 to %3MiB. - + Изменение размера раздела %1 с %2MB на %3MB. @@ -2541,17 +2590,17 @@ Output: Resize volume group named %1 from %2 to %3. - + Изменить размер группы томов под именем %1 с %2 на %3. Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong>. - + Изменить размер группы томов под именем <strong>%1</strong> с <strong>%2</strong> на <strong>%3</strong>. The installer failed to resize a volume group named '%1'. - + Программе установки не удалось изменить размер группы томов под именем '%1'. @@ -2559,7 +2608,7 @@ Output: This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> - + Этот компьютер не соответствует минимальным требованиям для установки %1.<br/>Невозможно продолжить установку. <a href="#details">Подробнее...</a> @@ -2569,7 +2618,7 @@ Output: This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. - + Этот компьютер соответствует не всем рекомендуемым требованиям для установки %1.<br/>Можно продолжить установку, но некоторые возможности могут быть недоступны. @@ -2675,7 +2724,7 @@ Output: Set flags on %1MiB %2 partition. - + Установить флаги %1MiB раздела %2. @@ -2690,22 +2739,22 @@ Output: Clear flags on %1MiB <strong>%2</strong> partition. - + Снять флаги %1MiB раздела <strong>%2</strong>. Flag %1MiB <strong>%2</strong> partition as <strong>%3</strong>. - + Отметить %1MB раздел <strong>%2</strong> флагом как <strong>%3</strong>. Clearing flags on %1MiB <strong>%2</strong> partition. - + Снятие флагов %1MiB раздела <strong>%2</strong>. Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition. - + Установка флагов <strong>%3</strong> %1MiB раздела <strong>%2</strong>. @@ -2851,7 +2900,7 @@ Output: This is an overview of what will happen once you start the setup procedure. - + Это обзор изменений, которые будут применены при запуске процедуры установки. @@ -2949,17 +2998,17 @@ Output: By selecting this you will send information about your installation and hardware. This information will <b>only be sent once</b> after the installation finishes. - + Отметив этот пункт, вы поделитесь информацией о установке и своем оборудовании. Эта информация <b>будет отправлена только один раз</b> после завершения установки. By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. - + Отметив этот пункт, вы будете <b>периодически</b> отправлять %1 информацию о своей установке, оборудовании и приложениях. By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. - + Отметив этот пункт, вы будете <b>регулярно</b> отправлять %1 информацию о своей установке, оборудовании, приложениях и паттернах их использования. @@ -2975,12 +3024,12 @@ Output: <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> - + <small>Если этот компьютер будет использоваться несколькими людьми, вы сможете создать учетные записи для них после установки.</small> <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> - + <small>Если этот компьютер используется несколькими людьми, Вы сможете создать соответствующие учетные записи сразу после установки.</small> @@ -3027,7 +3076,7 @@ Output: Create Volume Group - + Создать группу томов @@ -3037,12 +3086,12 @@ Output: Volume Group Name: - + Имя группы томов: Volume Group Type: - + Тип группы томов: @@ -3057,17 +3106,17 @@ Output: Total Size: - + Общий объём: Used Size: - + Использованный объём: Total Sectors: - + Всего секторов: @@ -3096,7 +3145,7 @@ Output: Select language - + Выберите язык @@ -3106,7 +3155,7 @@ Output: &About - + &О программе @@ -3121,17 +3170,17 @@ Output: <h1>Welcome to the Calamares setup program for %1.</h1> - + <h1>Добро пожаловать в программу установки Calamares для %1 .</h1> <h1>Welcome to %1 setup.</h1> - + <h1>Добро пожаловать в программу установки %1 .</h1> About %1 setup - + О установке %1 diff --git a/lang/calamares_sk.ts b/lang/calamares_sk.ts index 00a03251c..04f9e4fd9 100644 --- a/lang/calamares_sk.ts +++ b/lang/calamares_sk.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Čaká sa na %n modul.Čaká sa na %n moduly.Čaká sa na %n modulov.Čaká sa na %n modulov. - + (%n second(s)) (%n sekunda)(%n sekundy)(%n sekúnd)(%n sekúnd) - + System-requirements checking is complete. Kontrola systémových požiadaviek je dokončená. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Späť - - + &Next Ď&alej - - + &Cancel &Zrušiť - - + Cancel setup without changing the system. Zrušenie inštalácie bez zmien v systéme. - - + Cancel installation without changing the system. Zruší inštaláciu bez zmeny systému. - + Setup Failed Inštalácia zlyhala - + Calamares Initialization Failed Zlyhala inicializácia inštalátora Calamares - + %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. Nie je možné nainštalovať %1. Calamares nemohol načítať všetky konfigurované moduly. Je problém s tým, ako sa Calamares používa pri distribúcii. - + <br/>The following modules could not be loaded: <br/>Nebolo možné načítať nasledujúce moduly - + Continue with installation? Pokračovať v inštalácii? - + 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> - + &Set up now - + &Set up - + &Install _Inštalovať - + Setup is complete. Close the setup program. - + Cancel setup? Zrušiť inštaláciu? - + Cancel installation? Zrušiť inštaláciu? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Naozaj chcete zrušiť aktuálny priebeh inštalácie? Inštalačný program bude ukončený a zmeny budú stratené. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Skutočne chcete zrušiť aktuálny priebeh inštalácie? Inštalátor sa ukončí a všetky zmeny budú stratené. - + &Yes _Áno - + &No _Nie - + &Close _Zavrieť - + Continue with setup? Pokračovať v inštalácii? - + 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> Inštalátor distribúcie %1 sa chystá vykonať zmeny na vašom disku, aby nainštaloval distribúciu %2. <br/><strong>Tieto zmeny nebudete môcť vrátiť späť.</strong> - + &Install now &Inštalovať teraz - + Go &back Prejsť s&päť - + &Done _Dokončiť - + The installation is complete. Close the installer. Inštalácia je dokončená. Zatvorí inštalátor. - + Error Chyba - + Installation Failed Inštalácia zlyhala @@ -1290,6 +1286,22 @@ Inštalátor sa ukončí a všetky zmeny budú stratené. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ Inštalátor sa ukončí a všetky zmeny budú stratené. Umiestnenie + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2220,14 +2268,14 @@ Inštalátor sa ukončí a všetky zmeny budú stratené. ProcessResult - + There was no output from the command. Žiadny výstup z príkazu. - + Output: @@ -2236,52 +2284,52 @@ Výstup: - + External command crashed. Externý príkaz nečakane skončil. - + Command <i>%1</i> crashed. Príkaz <i>%1</i> nečakane skončil. - + External command failed to start. Zlyhalo spustenie externého príkazu. - + Command <i>%1</i> failed to start. Zlyhalo spustenie príkazu <i>%1</i> . - + Internal error when starting command. Počas spúšťania príkazu sa vyskytla interná chyba. - + Bad parameters for process job call. Nesprávne parametre pre volanie úlohy procesu. - + External command failed to finish. Zlyhalo dokončenie externého príkazu. - + Command <i>%1</i> failed to finish in %2 seconds. Zlyhalo dokončenie príkazu <i>%1</i> počas doby %2 sekúnd. - + External command finished with errors. Externý príkaz bol dokončený s chybami. - + Command <i>%1</i> finished with exit code %2. Príkaz <i>%1</i> skončil s ukončovacím kódom %2. @@ -2330,7 +2378,7 @@ Výstup: (žiadny bod pripojenia) - + Requirements checking for module <i>%1</i> is complete. Kontrola požiadaviek modulu <i>%1</i> je dokončená. diff --git a/lang/calamares_sl.ts b/lang/calamares_sl.ts index ce6069495..35ebd55f6 100644 --- a/lang/calamares_sl.ts +++ b/lang/calamares_sl.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Nazaj - - + &Next &Naprej - - + &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Preklic namestitve? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Ali res želite preklicati trenutni namestitveni proces? Namestilni program se bo končal in vse spremembe bodo izgubljene. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error Napaka - + Installation Failed Namestitev je spodletela @@ -1289,6 +1285,22 @@ Namestilni program se bo končal in vse spremembe bodo izgubljene. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ Namestilni program se bo končal in vse spremembe bodo izgubljene. Položaj + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,65 +2267,65 @@ Namestilni program se bo končal in vse spremembe bodo izgubljene. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. Nepravilni parametri za klic procesa opravila. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2326,7 +2374,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_sq.ts b/lang/calamares_sq.ts index e41229a34..e843247c7 100644 --- a/lang/calamares_sq.ts +++ b/lang/calamares_sq.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Po pritet për %n modul(e).Po pritet për %n modul(e). - + (%n second(s)) (%n sekondë(a))(%n sekondë(a)) - + System-requirements checking is complete. Kontrolli i domosdoshmërive të sistemit u plotësua. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Mbrapsht - - + &Next &Pasuesi - - + &Cancel &Anuloje - - + Cancel setup without changing the system. Anuloje rregullimin pa ndryshuar sistemin. - - + Cancel installation without changing the system. Anuloje instalimin pa ndryshuar sistemin. - + Setup Failed Rregullimi Dështoi - + Calamares Initialization Failed Gatitja e Calamares-it Dështoi - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 s’mund të instalohet. Calamares s’qe në gjendje të ngarkonte krejt modulet e konfiguruar. Ky është një problem që lidhet me mënyrën se si përdoret Calamares nga shpërndarja. - + <br/>The following modules could not be loaded: <br/>S’u ngarkuan dot modulet vijues: - + Continue with installation? Të vazhdohet me instalimin? - + 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> Programi i rregullimit %1 është një hap larg nga bërja e ndryshimeve në diskun tuaj, që të mund të rregullojë %2.<br/><strong>S’do të jeni në gjendje t’i zhbëni këto ndryshime.</strong> - + &Set up now &Rregulloje tani - + &Set up &Rregulloje - + &Install &Instaloje - + Setup is complete. Close the setup program. Rregullimi është i plotë. Mbylleni programin e rregullimit. - + Cancel setup? Të anulohet rregullimi? - + Cancel installation? Të anulohet instalimi? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Doni vërtet të anulohet procesi i tanishëm i rregullimit? Programi i rregullimit do të mbyllet dhe krejt ndryshimet do të humbin. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Doni vërtet të anulohet procesi i tanishëm i instalimit? Instaluesi do të mbyllet dhe krejt ndryshimet do të hidhen tej. - + &Yes &Po - + &No &Jo - + &Close &Mbylle - + Continue with setup? Të vazhdohet me rregullimin? - + 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> Instaluesi %1 është një hap larg nga bërja e ndryshimeve në diskun tuaj, që të mund të instalojë %2.<br/><strong>S’do të jeni në gjendje t’i zhbëni këto ndryshime.</strong> - + &Install now &Instaloje tani - + Go &back Kthehu &mbrapsht - + &Done &U bë - + The installation is complete. Close the installer. Instalimi u plotësua. Mbylle instaluesin. - + Error Gabim - + Installation Failed Instalimi Dështoi @@ -1290,6 +1286,22 @@ Instaluesi do të mbyllet dhe krejt ndryshimet do të hidhen tej. S’u shkrua dot te kartelë <code>%1</code>. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Po krijohet initramfs me mkinitcpio. + + + + InitramfsJob + + + Creating initramfs. + Po krijohet initramfs. + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ Instaluesi do të mbyllet dhe krejt ndryshimet do të hidhen tej. Vendndodhje + + LuksBootKeyFileJob + + + Configuring LUKS key file. + Po formësohet kartelë kyçesh LUKS. + + + + + No partitions are defined. + S’ka pjesë të përkufizuara. + + + + + + Encrypted rootfs setup error + Gabim ujdisjeje rootfs të fshehtëzuar + + + + Root partition %1 is LUKS but no passphrase has been set. + Pjesa rrënjë %1 është LUKS, por s’është caktuar frazëkalim. + + + + Could not create LUKS key file for root partition %1. + S’u krijua dot kartelë kyçi LUKS për ndarjen rrënjë %1. + + + + Could configure LUKS key file on partition %1. + Mund të formësohej kartelë kyçesh LUKS në pjesën %1. + + NetInstallPage @@ -2220,14 +2268,14 @@ Instaluesi do të mbyllet dhe krejt ndryshimet do të hidhen tej. ProcessResult - + There was no output from the command. S’pati përfundim nga urdhri. - + Output: @@ -2236,52 +2284,52 @@ Përfundim: - + External command crashed. Urdhri i jashtëm u vithis. - + Command <i>%1</i> crashed. Urdhri <i>%1</i> u vithis. - + External command failed to start. Dështoi nisja e urdhrit të jashtëm. - + Command <i>%1</i> failed to start. Dështoi nisja e urdhrit <i>%1</i>. - + Internal error when starting command. Gabim i brendshëm kur niset urdhri. - + Bad parameters for process job call. Parametra të gabuar për thirrje akti procesi. - + External command failed to finish. S’u arrit të përfundohej urdhër i jashtëm. - + Command <i>%1</i> failed to finish in %2 seconds. Urdhri <i>%1</i> s’arriti të përfundohej në %2 sekonda. - + External command finished with errors. Urdhri i jashtë përfundoi me gabime. - + Command <i>%1</i> finished with exit code %2. Urdhri <i>%1</i> përfundoi me kod daljeje %2. @@ -2330,7 +2378,7 @@ Përfundim: (s’ka pikë montimi) - + Requirements checking for module <i>%1</i> is complete. Kontrolli i domosdoshmërive për modulin <i>%1</i> u plotësua. diff --git a/lang/calamares_sr.ts b/lang/calamares_sr.ts index d9265925b..d92da1ad1 100644 --- a/lang/calamares_sr.ts +++ b/lang/calamares_sr.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Назад - - + &Next &Следеће - - + &Cancel &Откажи - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Отказати инсталацију? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Да ли стварно желите да прекинете текући процес инсталације? Инсталер ће бити затворен и све промене ће бити изгубљене. - + &Yes - + &No - + &Close - + Continue with setup? Наставити са подешавањем? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now &Инсталирај сада - + Go &back Иди &назад - + &Done - + The installation is complete. Close the installer. - + Error Грешка - + Installation Failed Инсталација није успела @@ -1289,6 +1285,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ The installer will quit and all changes will be lost. Локација + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,65 +2267,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. Лоши параметри при позиву посла процеса. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2326,7 +2374,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_sr@latin.ts b/lang/calamares_sr@latin.ts index 1d383195f..0ef4a34af 100644 --- a/lang/calamares_sr@latin.ts +++ b/lang/calamares_sr@latin.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Nazad - - + &Next &Dalje - - + &Cancel &Prekini - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Prekini instalaciju? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Da li stvarno želite prekinuti trenutni proces instalacije? Instaler će se zatvoriti i sve promjene će biti izgubljene. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error Greška - + Installation Failed Neuspješna instalacija @@ -1289,6 +1285,22 @@ Instaler će se zatvoriti i sve promjene će biti izgubljene. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ Instaler će se zatvoriti i sve promjene će biti izgubljene. Lokacija + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,65 +2267,65 @@ Instaler će se zatvoriti i sve promjene će biti izgubljene. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. Pogrešni parametri kod poziva funkcije u procesu. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2326,7 +2374,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_sv.ts b/lang/calamares_sv.ts index 610ac5cda..85045517b 100644 --- a/lang/calamares_sv.ts +++ b/lang/calamares_sv.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Bakåt - - + &Next &Nästa - - + &Cancel Avbryt - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? Avbryt installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Är du säker på att du vill avsluta installationen i förtid? Alla ändringar kommer att gå förlorade. - + &Yes - + &No - + &Close - + Continue with setup? Fortsätt med installation? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1-installeraren är på väg att göra ändringar för att installera %2.<br/><strong>Du kommer inte att kunna ångra dessa ändringar!strong> - + &Install now &Installera nu - + Go &back Gå &bakåt - + &Done - + The installation is complete. Close the installer. - + Error Fel - + Installation Failed Installationen misslyckades @@ -1289,6 +1285,22 @@ Alla ändringar kommer att gå förlorade. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ Alla ändringar kommer att gå förlorade. Plats + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,65 +2267,65 @@ Alla ändringar kommer att gå förlorade. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. Ogiltiga parametrar för processens uppgiftsanrop. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2326,7 +2374,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_th.ts b/lang/calamares_th.ts index 52b50460d..927770c31 100644 --- a/lang/calamares_th.ts +++ b/lang/calamares_th.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &B ย้อนกลับ - - + &Next &N ถัดไป - - + &Cancel &C ยกเลิก - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? ยกเลิกการติดตั้ง? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. คุณต้องการยกเลิกกระบวนการติดตั้งที่กำลังดำเนินการอยู่หรือไม่? ตัวติดตั้งจะสิ้นสุดการทำงานและไม่บันทึกการเปลี่ยนแปลงที่ได้ดำเนินการก่อนหน้านี้ - + &Yes - + &No - + &Close - + Continue with setup? ดำเนินการติดตั้งต่อหรือไม่? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> ตัวติดตั้ง %1 กำลังพยายามที่จะทำการเปลี่ยนแปลงในดิสก์ของคุณเพื่อติดตั้ง %2<br/><strong>คุณจะไม่สามารถยกเลิกการเปลี่ยนแปลงเหล่านี้ได้</strong> - + &Install now &ติดตั้งตอนนี้ - + Go &back กลั&บไป - + &Done - + The installation is complete. Close the installer. - + Error ข้อผิดพลาด - + Installation Failed การติดตั้งล้มเหลว @@ -1289,6 +1285,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ The installer will quit and all changes will be lost. ตำแหน่ง + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2219,65 +2267,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. พารามิเตอร์ไม่ถูกต้องสำหรับการเรียกการทำงาน - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2326,7 +2374,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_tr_TR.ts b/lang/calamares_tr_TR.ts index 15a17eefd..730bb881a 100644 --- a/lang/calamares_tr_TR.ts +++ b/lang/calamares_tr_TR.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). %n modülü bekleniyor.%n modül(leri) bekleniyor. - + (%n second(s)) (%n saniye(ler))(%n saniye) - + System-requirements checking is complete. Sistem gereksinimleri kontrolü tamamlandı. @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back &Geri - - + &Next &Sonraki - - + &Cancel &Vazgeç - - + Cancel setup without changing the system. Sistemi değiştirmeden kurulumu iptal edin. - - + Cancel installation without changing the system. Sistemi değiştirmeden kurulumu iptal edin. - + Setup Failed Kurulum Başarısız - + Calamares Initialization Failed Calamares Başlatılamadı - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 yüklenemedi. Calamares yapılandırılmış modüllerin bazılarını yükleyemedi. Bu, Calamares'in kullandığınız dağıtıma uyarlamasından kaynaklanan bir sorundur. - + <br/>The following modules could not be loaded: <br/>Aşağıdaki modüller yüklenemedi: - + Continue with installation? Kuruluma devam edilsin mi? - + 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> %1 sistem kurulum uygulaması,%2 ayarlamak için diskinizde değişiklik yapmak üzere. <br/><strong>Bu değişiklikleri geri alamayacaksınız.</strong> - + &Set up now &Şimdi kur - + &Set up &Kur - + &Install &Yükle - + Setup is complete. Close the setup program. Kurulum tamamlandı. Kurulum programını kapatın. - + Cancel setup? Kurulum iptal edilsin mi? - + Cancel installation? Yüklemeyi iptal et? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Mevcut kurulum işlemini gerçekten iptal etmek istiyor musunuz? Kurulum uygulaması sonlandırılacak ve tüm değişiklikler kaybedilecek. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Yükleme işlemini gerçekten iptal etmek istiyor musunuz? Yükleyiciden çıkınca tüm değişiklikler kaybedilecek. - + &Yes &Evet - + &No &Hayır - + &Close &Kapat - + Continue with setup? Kuruluma devam et? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 sistem yükleyici %2 yüklemek için diskinizde değişiklik yapacak.<br/><strong>Bu değişiklikleri geri almak mümkün olmayacak.</strong> - + &Install now &Şimdi yükle - + Go &back Geri &git - + &Done &Tamam - + The installation is complete. Close the installer. Yükleme işi tamamlandı. Sistem yükleyiciyi kapatın. - + Error Hata - + Installation Failed Kurulum Başarısız @@ -1292,6 +1288,22 @@ Sistem güç kaynağına bağlı değil. <code>%1</code> dosyasına yazılamadı. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + Mkinitcpio ile initramfs oluşturuluyor. + + + + InitramfsJob + + + Creating initramfs. + Initramfs oluşturuluyor. + + InteractiveTerminalPage @@ -1515,6 +1527,42 @@ Sistem güç kaynağına bağlı değil. Sistem Yereli + + LuksBootKeyFileJob + + + Configuring LUKS key file. + LUKS anahtar dosyası yapılandırılıyor. + + + + + No partitions are defined. + Hiçbir disk bölümü tanımlanmadı. + + + + + + Encrypted rootfs setup error + Şifrelenmiş rootfs kurulum hatası + + + + Root partition %1 is LUKS but no passphrase has been set. + %1 kök disk bölümü LUKS olacak fakat bunun için parola belirlenmedi. + + + + Could not create LUKS key file for root partition %1. + %1 kök disk bölümü için LUKS anahtar dosyası oluşturulamadı. + + + + Could configure LUKS key file on partition %1. + %1 disk bölümü LUKS anahtar dosyası yapılandırılabilir. + + NetInstallPage @@ -2223,14 +2271,14 @@ Sistem güç kaynağına bağlı değil. ProcessResult - + There was no output from the command. Komut çıktısı yok. - + Output: @@ -2239,52 +2287,52 @@ Output: - + External command crashed. Harici komut çöktü. - + Command <i>%1</i> crashed. Komut <i>%1</i> çöktü. - + External command failed to start. Harici komut başlatılamadı. - + Command <i>%1</i> failed to start. Komut <i>%1</i> başlatılamadı. - + Internal error when starting command. Komut başlatılırken dahili hata. - + Bad parameters for process job call. Çalışma adımları başarısız oldu. - + External command failed to finish. Harici komut başarısız oldu. - + Command <i>%1</i> failed to finish in %2 seconds. Komut <i>%1</i> %2 saniyede başarısız oldu. - + External command finished with errors. Harici komut hatalarla bitti. - + Command <i>%1</i> finished with exit code %2. Komut <i>%1</i> %2 çıkış kodu ile tamamlandı @@ -2333,7 +2381,7 @@ Output: (bağlama noktası yok) - + Requirements checking for module <i>%1</i> is complete. <i>%1</i> modülü için gerekenler tamamlandı. diff --git a/lang/calamares_uk.ts b/lang/calamares_uk.ts index 0c97745d8..b21f16d51 100644 --- a/lang/calamares_uk.ts +++ b/lang/calamares_uk.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). Очікування %n модулю.Очікування %n модулів.Очікування %n модулів.Очікування %n модулів. - + (%n second(s)) (%n секунда)(%n секунди)(%n секунд(и))(%n секунд(и)) - + System-requirements checking is complete. Перевірка системних вимог завершена. @@ -226,159 +226,155 @@ Calamares::ViewManager - + &Back &Назад - - + &Next &Вперед - - + &Cancel &Скасувати - - + Cancel setup without changing the system. Скасувати налаштування без зміни системи. - - + Cancel installation without changing the system. Скасувати встановлення без зміни системи. - + Setup Failed Помилка встановлення - + Calamares Initialization Failed Помилка ініціалізації Calamares - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 неможливо встановити. Calamares не зміг завантажити всі налаштовані модулі. Ця проблема зв'язана з тим, як Calamares використовується дистрибутивом. - + <br/>The following modules could not be loaded: <br/>Не вдалося завантажити наступні модулі: - + Continue with installation? Продовжити встановлення? - + 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> Програма налаштування %1 збирається внести зміни до вашого диска, щоб налаштувати %2. <br/><strong> Ви не зможете скасувати ці зміни.</strong> - + &Set up now &Налаштувати зараз - + &Set up &Налаштувати - + &Install &Встановити - + Setup is complete. Close the setup program. Встановлення виконано. Закрити програму встановлення. - + Cancel setup? Скасувати налаштування? - + Cancel installation? Скасувати встановлення? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Чи ви насправді бажаєте скасувати процес встановлення? Установник закриється і всі зміни буде втрачено. - + &Yes &Так - + &No &Ні - + &Close &Закрити - + Continue with setup? Продовжити встановлення? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> Установник %1 збирається зробити зміни на вашому диску, щоб встановити %2.<br/><strong>Ці зміни неможливо буде повернути.</strong> - + &Install now &Встановити зараз - + Go &back Перейти &назад - + &Done &Закінчити - + The installation is complete. Close the installer. Встановлення виконано. Закрити установник. - + Error Помилка - + Installation Failed Втановлення завершилося невдачею @@ -1289,6 +1285,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1512,6 +1524,42 @@ The installer will quit and all changes will be lost. Місцезнаходження + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2220,65 +2268,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. Неправильні параметри визову завдання обробки. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2327,7 +2375,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_ur.ts b/lang/calamares_ur.ts index 3d6e51b22..cb4d80715 100644 --- a/lang/calamares_ur.ts +++ b/lang/calamares_ur.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back - - + &Next - - + &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error - + Installation Failed @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_uz.ts b/lang/calamares_uz.ts index b7b12e55a..7cd148c37 100644 --- a/lang/calamares_uz.ts +++ b/lang/calamares_uz.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -226,158 +226,154 @@ Calamares::ViewManager - + &Back - - + &Next - - + &Cancel - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. - + Setup Failed - + Calamares Initialization Failed - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. - + <br/>The following modules could not be loaded: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - + &Yes - + &No - + &Close - + Continue with setup? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Install now - + Go &back - + &Done - + The installation is complete. Close the installer. - + Error - + Installation Failed @@ -1288,6 +1284,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1511,6 +1523,42 @@ The installer will quit and all changes will be lost. + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2218,65 +2266,65 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. - + Output: - + External command crashed. - + Command <i>%1</i> crashed. - + External command failed to start. - + Command <i>%1</i> failed to start. - + Internal error when starting command. - + Bad parameters for process job call. - + External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. - + Command <i>%1</i> finished with exit code %2. @@ -2325,7 +2373,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_zh_CN.ts b/lang/calamares_zh_CN.ts index 192c8c380..9cd30f582 100644 --- a/lang/calamares_zh_CN.ts +++ b/lang/calamares_zh_CN.ts @@ -209,17 +209,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). - + (%n second(s)) - + System-requirements checking is complete. @@ -227,159 +227,155 @@ Calamares::ViewManager - + &Back 后退(&B) - - + &Next 下一步(&N) - - + &Cancel 取消(&C) - - + Cancel setup without changing the system. - - + Cancel installation without changing the system. 取消安装,并不做任何更改。 - + Setup Failed - + Calamares Initialization Failed Calamares安装失败 - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1无法安装。 Calamares无法加载所有已配置的模块。这是分配使用Calamares的方式的问题。 - + <br/>The following modules could not be loaded: <br/>无法加载以下模块: - + Continue with installation? - + 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> - + &Set up now - + &Set up - + &Install 安装(&I) - + Setup is complete. Close the setup program. - + Cancel setup? - + Cancel installation? 取消安装? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. 确定要取消当前的安装吗? 安装程序将退出,所有修改都会丢失。 - + &Yes &是 - + &No &否 - + &Close &关闭 - + Continue with setup? 要继续安装吗? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 安装程序将在您的磁盘上做出变更以安装 %2。<br/><strong>您将无法复原这些变更。</strong> - + &Install now 现在安装 (&I) - + Go &back 返回 (&B) - + &Done &完成 - + The installation is complete. Close the installer. 安装已完成。请关闭安装程序。 - + Error 错误 - + Installation Failed 安装失败 @@ -1291,6 +1287,22 @@ The installer will quit and all changes will be lost. + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + InteractiveTerminalPage @@ -1514,6 +1526,42 @@ The installer will quit and all changes will be lost. 位置 + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could configure LUKS key file on partition %1. + + + NetInstallPage @@ -2221,14 +2269,14 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. 命令没有输出。 - + Output: @@ -2237,52 +2285,52 @@ Output: - + External command crashed. 外部命令已崩溃。 - + Command <i>%1</i> crashed. 命令 <i>%1</i> 已崩溃。 - + External command failed to start. 无法启动外部命令。 - + Command <i>%1</i> failed to start. 无法启动命令 <i>%1</i>。 - + Internal error when starting command. 启动命令时出现内部错误。 - + Bad parameters for process job call. 呼叫进程任务出现错误参数 - + External command failed to finish. 外部命令未成功完成。 - + Command <i>%1</i> failed to finish in %2 seconds. 命令 <i>%1</i> 未能在 %2 秒内完成。 - + External command finished with errors. 外部命令已完成,但出现了错误。 - + Command <i>%1</i> finished with exit code %2. 命令 <i>%1</i> 以退出代码 %2 完成。 @@ -2331,7 +2379,7 @@ Output: - + Requirements checking for module <i>%1</i> is complete. diff --git a/lang/calamares_zh_TW.ts b/lang/calamares_zh_TW.ts index d69d780d9..efdea35b3 100644 --- a/lang/calamares_zh_TW.ts +++ b/lang/calamares_zh_TW.ts @@ -208,17 +208,17 @@ Calamares::RequirementsChecker - + Waiting for %n module(s). 正在等待 %n 個模組。 - + (%n second(s)) (%n 秒) - + System-requirements checking is complete. 系統需求檢查完成。 @@ -226,160 +226,156 @@ Calamares::ViewManager - + &Back 返回 (&B) - - + &Next 下一步 (&N) - - + &Cancel 取消(&C) - - + Cancel setup without changing the system. 取消安裝,不更改系統。 - - + Cancel installation without changing the system. 不變更系統並取消安裝。 - + Setup Failed 設定失敗 - + Calamares Initialization Failed Calamares 初始化失敗 - + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. %1 無法安裝。Calamares 無法載入所有已設定的模組。散佈版使用 Calamares 的方式有問題。 - + <br/>The following modules could not be loaded: <br/>以下的模組無法載入: - + Continue with installation? 繼續安裝? - + 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> %1 設定程式將在您的磁碟上做出變更以設定 %2。<br/><strong>您將無法復原這些變更。</strong> - + &Set up now 現在進行設定 (&S) - + &Set up 設定 (&S) - + &Install 安裝(&I) - + Setup is complete. Close the setup program. 設定完成。關閉設定程式。 - + Cancel setup? 取消設定? - + Cancel installation? 取消安裝? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. 您真的想要取消目前的設定程序嗎? 設定程式將會結束,所有變更都將會遺失。 - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. 您真的想要取消目前的安裝程序嗎? 安裝程式將會退出且所有變動將會遺失。 - + &Yes 是(&Y) - + &No 否(&N) - + &Close 關閉(&C) - + Continue with setup? 繼續安裝? - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> %1 安裝程式將在您的磁碟上做出變更以安裝 %2。<br/><strong>您將無法復原這些變更。</strong> - + &Install now 現在安裝 (&I) - + Go &back 上一步 (&B) - + &Done 完成(&D) - + The installation is complete. Close the installer. 安裝完成。關閉安裝程式。 - + Error 錯誤 - + Installation Failed 安裝失敗 @@ -1290,6 +1286,22 @@ The installer will quit and all changes will be lost. 無法寫入至檔案 <code>%1</code>。 + + InitcpioJob + + + Creating initramfs with mkinitcpio. + 正在使用 mkinitcpio 建立 initramfs。 + + + + InitramfsJob + + + Creating initramfs. + 正在建立 initramfs。 + + InteractiveTerminalPage @@ -1513,6 +1525,42 @@ The installer will quit and all changes will be lost. 位置 + + LuksBootKeyFileJob + + + Configuring LUKS key file. + 正在設定 LUKS 金鑰檔案。 + + + + + No partitions are defined. + 沒有已定義的分割區。 + + + + + + Encrypted rootfs setup error + 已加密的 rootfs 設定錯誤 + + + + Root partition %1 is LUKS but no passphrase has been set. + 根分割區 %1 為 LUKS 但沒有設定密碼。 + + + + Could not create LUKS key file for root partition %1. + 無法為根分割區 %1 建立 LUKS 金鑰檔。 + + + + Could configure LUKS key file on partition %1. + 無法在分割區 %1 設定 LUKS 金鑰檔。 + + NetInstallPage @@ -2220,14 +2268,14 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. 指令沒有輸出。 - + Output: @@ -2236,52 +2284,52 @@ Output: - + External command crashed. 外部指令當機。 - + Command <i>%1</i> crashed. 指令 <i>%1</i> 已當機。 - + External command failed to start. 外部指令啟動失敗。 - + Command <i>%1</i> failed to start. 指令 <i>%1</i> 啟動失敗。 - + Internal error when starting command. 當啟動指令時發生內部錯誤。 - + Bad parameters for process job call. 呼叫程序的參數無效。 - + External command failed to finish. 外部指令結束失敗。 - + Command <i>%1</i> failed to finish in %2 seconds. 指令 <i>%1</i> 在結束 %2 秒內失敗。 - + External command finished with errors. 外部指令結束時發生錯誤。 - + Command <i>%1</i> finished with exit code %2. 指令 <i>%1</i> 結束時有錯誤碼 %2。 @@ -2330,7 +2378,7 @@ Output: (沒有掛載點) - + Requirements checking for module <i>%1</i> is complete. 模組 <i>%1</i> 需求檢查完成。 diff --git a/lang/python.pot b/lang/python.pot index f159d4752..b31490417 100644 --- a/lang/python.pot +++ b/lang/python.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -32,8 +32,7 @@ msgstr "Mounting partitions." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -42,7 +41,7 @@ msgstr "Configuration Error" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "No partitions are defined for
{!s}
to use." @@ -211,22 +210,6 @@ msgstr "Configuring mkinitcpio." msgid "No root mount point is given for
{!s}
to use." msgstr "No root mount point is given for
{!s}
to use." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Creating initramfs with mkinitcpio." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "Process Failed" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Configuring encrypted swap." @@ -324,18 +307,6 @@ msgstr "Install bootloader." msgid "Remove live user from target system" msgstr "Remove live user from target system" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "Creating initramfs." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "Failed to run update-initramfs on the target" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "The exit code was {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Setting hardware clock." @@ -348,6 +319,10 @@ msgstr "Creating initramfs with dracut." msgid "Failed to run dracut on the target" msgstr "Failed to run dracut on the target" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "The exit code was {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "Configuring initramfs." @@ -356,18 +331,6 @@ msgstr "Configuring initramfs." msgid "Configuring OpenRC dmcrypt service." msgstr "Configuring OpenRC dmcrypt service." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "Configuring LUKS key file." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Encrypted rootfs setup error" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "Rootfs partition {!s} is LUKS but no passphrase found." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Writing fstab." diff --git a/lang/python/ar/LC_MESSAGES/python.mo b/lang/python/ar/LC_MESSAGES/python.mo index d44bd3613..75d05ea24 100644 Binary files a/lang/python/ar/LC_MESSAGES/python.mo and b/lang/python/ar/LC_MESSAGES/python.mo differ diff --git a/lang/python/ar/LC_MESSAGES/python.po b/lang/python/ar/LC_MESSAGES/python.po index e226bf074..11dc09b36 100644 --- a/lang/python/ar/LC_MESSAGES/python.po +++ b/lang/python/ar/LC_MESSAGES/python.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: aboodilankaboot, 2019\n" "Language-Team: Arabic (https://www.transifex.com/calamares/teams/20061/ar/)\n" @@ -36,8 +36,7 @@ msgstr "جاري تركيب الأقسام" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -46,7 +45,7 @@ msgstr "خطأ في الضبط" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -208,20 +207,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "العملية فشلت" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -320,18 +305,6 @@ msgstr "تثبيت محمل الإقلاع" msgid "Remove live user from target system" msgstr "إزالة المستخدم المباشر من النظام الهدف" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "كود الخروج كان {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "جاري إعداد ساعة الهاردوير" @@ -344,6 +317,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "كود الخروج كان {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -352,18 +329,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/ast/LC_MESSAGES/python.mo b/lang/python/ast/LC_MESSAGES/python.mo index 6cacaf7af..a349964df 100644 Binary files a/lang/python/ast/LC_MESSAGES/python.mo and b/lang/python/ast/LC_MESSAGES/python.mo differ diff --git a/lang/python/ast/LC_MESSAGES/python.po b/lang/python/ast/LC_MESSAGES/python.po index d5c40ef55..ad2ec77e2 100644 --- a/lang/python/ast/LC_MESSAGES/python.po +++ b/lang/python/ast/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: enolp , 2019\n" "Language-Team: Asturian (https://www.transifex.com/calamares/teams/20061/ast/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -212,20 +211,6 @@ msgstr "Configurando mkinitcpio." msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Configurando l'intercambéu cifráu." @@ -317,18 +302,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "Fallu al executar update-initramfs nel destín" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "El códigu de salida foi {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Configurando'l reló de hardware." @@ -341,6 +314,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "Fallu al executar dracut nel destín" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "El códigu de salida foi {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -349,18 +326,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "Configurando'l serviciu dmcrypt d'OpenRC." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/be/LC_MESSAGES/python.mo b/lang/python/be/LC_MESSAGES/python.mo index f068d4290..475d252c5 100644 Binary files a/lang/python/be/LC_MESSAGES/python.mo and b/lang/python/be/LC_MESSAGES/python.mo differ diff --git a/lang/python/be/LC_MESSAGES/python.po b/lang/python/be/LC_MESSAGES/python.po index c44a1f531..5baed9bac 100644 --- a/lang/python/be/LC_MESSAGES/python.po +++ b/lang/python/be/LC_MESSAGES/python.po @@ -3,13 +3,17 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # +# Translators: +# Zmicer Turok , 2019 +# #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" +"Last-Translator: Zmicer Turok , 2019\n" "Language-Team: Belarusian (https://www.transifex.com/calamares/teams/20061/be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,11 +23,11 @@ msgstr "" #: src/modules/grubcfg/main.py:37 msgid "Configure GRUB." -msgstr "" +msgstr "Наладзіць GRUB." #: src/modules/mount/main.py:38 msgid "Mounting partitions." -msgstr "" +msgstr "Мантаванне раздзелаў." #: src/modules/mount/main.py:150 src/modules/initcpiocfg/main.py:187 #: src/modules/initcpiocfg/main.py:191 @@ -31,169 +35,174 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" -msgstr "" +msgstr "Памылка канфігурацыі" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." -msgstr "" +msgstr "Раздзелы для
{!s}
не вызначаныя." #: src/modules/services-systemd/main.py:35 msgid "Configure systemd services" -msgstr "" +msgstr "Наладзіць службы systemd" #: src/modules/services-systemd/main.py:68 #: src/modules/services-openrc/main.py:102 msgid "Cannot modify service" -msgstr "" +msgstr "Немагчыма наладзіць службу" #: src/modules/services-systemd/main.py:69 msgid "" "systemctl {arg!s} call in chroot returned error code {num!s}." -msgstr "" +msgstr "systemctl {arg!s} у chroot вярнуў код памылкі {num!s}." #: src/modules/services-systemd/main.py:72 #: src/modules/services-systemd/main.py:76 msgid "Cannot enable systemd service {name!s}." -msgstr "" +msgstr "Немагчыма ўключыць службу systemd {name!s}." #: src/modules/services-systemd/main.py:74 msgid "Cannot enable systemd target {name!s}." -msgstr "" +msgstr "Немагчыма ўключыць мэту systemd {name!s}." #: src/modules/services-systemd/main.py:78 msgid "Cannot disable systemd target {name!s}." -msgstr "" +msgstr "Немагчыма выключыць мэту systemd {name!s}." #: src/modules/services-systemd/main.py:80 msgid "Cannot mask systemd unit {name!s}." -msgstr "" +msgstr "Немагчыма замаскаваць юніт systemd {name!s}. " #: src/modules/services-systemd/main.py:82 msgid "" "Unknown systemd commands {command!s} and " "{suffix!s} for unit {name!s}." msgstr "" +"Невядомыя systemd загады {command!s} і {suffix!s} " +"для юніта {name!s}." #: src/modules/umount/main.py:40 msgid "Unmount file systems." -msgstr "" +msgstr "Адмантаваць файлавыя сістэмы." #: src/modules/unpackfs/main.py:41 msgid "Filling up filesystems." -msgstr "" +msgstr "Запаўненне файлавых сістэм." #: src/modules/unpackfs/main.py:159 msgid "rsync failed with error code {}." -msgstr "" +msgstr "памылка rsync з кодам {}." #: src/modules/unpackfs/main.py:220 src/modules/unpackfs/main.py:238 msgid "Failed to unpack image \"{}\"" -msgstr "" +msgstr "Не атрымалася распакаваць вобраз \"{}\"" #: src/modules/unpackfs/main.py:221 msgid "" "Failed to find unsquashfs, make sure you have the squashfs-tools package " "installed" msgstr "" +"Не атрымалася знайсці unsquashfs, праверце ці ўсталяваны ў вас пакунак " +"squashfs-tools" #: src/modules/unpackfs/main.py:320 msgid "No mount point for root partition" -msgstr "" +msgstr "Для каранёвага раздзела няма пункта мантавання" #: src/modules/unpackfs/main.py:321 msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing" -msgstr "" +msgstr "globalstorage не змяшчае ключа \"rootMountPoint\", нічога не выконваецца" #: src/modules/unpackfs/main.py:326 msgid "Bad mount point for root partition" -msgstr "" +msgstr "Хібны пункт мантавання для каранёвага раздзела" #: src/modules/unpackfs/main.py:327 msgid "rootMountPoint is \"{}\", which does not exist, doing nothing" -msgstr "" +msgstr "rootMountPoint \"{}\" не існуе, нічога не выконваецца" #: src/modules/unpackfs/main.py:340 src/modules/unpackfs/main.py:347 #: src/modules/unpackfs/main.py:352 msgid "Bad unsquash configuration" -msgstr "" +msgstr "Хібная канфігурацыя unsquash" #: src/modules/unpackfs/main.py:341 msgid "The filesystem for \"{}\" ({}) is not supported" -msgstr "" +msgstr "Файлавая сістэма для \"{}\" ({}) не падтрымліваецца" #: src/modules/unpackfs/main.py:348 msgid "The source filesystem \"{}\" does not exist" -msgstr "" +msgstr "Зыходная файлавая сістэма \"{}\" не існуе" #: src/modules/unpackfs/main.py:353 msgid "The destination \"{}\" in the target system is not a directory" -msgstr "" +msgstr "Пункт прызначэння \"{}\" у мэтавай сістэме не з’яўляецца каталогам" #: src/modules/displaymanager/main.py:381 msgid "Cannot write KDM configuration file" -msgstr "" +msgstr "Немагчыма запісаць файл канфігурацыі KDM" #: src/modules/displaymanager/main.py:382 msgid "KDM config file {!s} does not exist" -msgstr "" +msgstr "Файл канфігурацыі KDM {!s} не існуе" #: src/modules/displaymanager/main.py:443 msgid "Cannot write LXDM configuration file" -msgstr "" +msgstr "Немагчыма запісаць файл канфігурацыі LXDM" #: src/modules/displaymanager/main.py:444 msgid "LXDM config file {!s} does not exist" -msgstr "" +msgstr "Файл канфігурацыі LXDM {!s} не існуе" #: src/modules/displaymanager/main.py:527 msgid "Cannot write LightDM configuration file" -msgstr "" +msgstr "Немагчыма запісаць файл канфігурацыі LightDM" #: src/modules/displaymanager/main.py:528 msgid "LightDM config file {!s} does not exist" -msgstr "" +msgstr "Файл канфігурацыі LightDM {!s} не існуе" #: src/modules/displaymanager/main.py:602 msgid "Cannot configure LightDM" -msgstr "" +msgstr "Немагчыма наладзіць LightDM" #: src/modules/displaymanager/main.py:603 msgid "No LightDM greeter installed." -msgstr "" +msgstr "LightDM greeter не ўсталяваны." #: src/modules/displaymanager/main.py:634 msgid "Cannot write SLIM configuration file" -msgstr "" +msgstr "Немагчыма запісаць файл канфігурацыі SLIM" #: src/modules/displaymanager/main.py:635 msgid "SLIM config file {!s} does not exist" -msgstr "" +msgstr "Файл канфігурацыі SLIM {!s} не існуе" #: src/modules/displaymanager/main.py:750 msgid "No display managers selected for the displaymanager module." -msgstr "" +msgstr "У модулі дысплейных кіраўнікоў нічога не абрана." #: src/modules/displaymanager/main.py:751 msgid "" "The displaymanagers list is empty or undefined in bothglobalstorage and " "displaymanager.conf." msgstr "" +"Спіс дысплейных кіраўнікоў пусты альбо не вызначаны ў bothglobalstorage і " +"displaymanager.conf." #: src/modules/displaymanager/main.py:831 msgid "Display manager configuration was incomplete" -msgstr "" +msgstr "Наладка дысплейнага кіраўніка не завершаная." #: src/modules/initcpiocfg/main.py:36 msgid "Configuring mkinitcpio." -msgstr "" +msgstr "Наладка mkinitcpio." #: src/modules/initcpiocfg/main.py:192 #: src/modules/luksopenswaphookcfg/main.py:100 @@ -201,176 +210,145 @@ msgstr "" #: src/modules/openrcdmcryptcfg/main.py:83 src/modules/fstab/main.py:317 #: src/modules/localecfg/main.py:145 src/modules/networkcfg/main.py:49 msgid "No root mount point is given for
{!s}
to use." -msgstr "" - -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" +msgstr "Каранёвы пункт мантавання для
{!s}
не пададзены." #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." -msgstr "" +msgstr "Наладка зашыфраванага swap." #: src/modules/rawfs/main.py:35 msgid "Installing data." -msgstr "" +msgstr "Усталёўка даных." #: src/modules/services-openrc/main.py:38 msgid "Configure OpenRC services" -msgstr "" +msgstr "Наладзіць службы OpenRC" #: src/modules/services-openrc/main.py:66 msgid "Cannot add service {name!s} to run-level {level!s}." -msgstr "" +msgstr "Не атрымалася дадаць службу {name!s} на ўзровень запуску {level!s}." #: src/modules/services-openrc/main.py:68 msgid "Cannot remove service {name!s} from run-level {level!s}." -msgstr "" +msgstr "Не атрымалася выдаліць службу {name!s} з узроўня запуску {level!s}." #: src/modules/services-openrc/main.py:70 msgid "" "Unknown service-action {arg!s} for service {name!s} in run-" "level {level!s}." msgstr "" +"Невядомае дзеянне {arg!s} для службы {name!s} на ўзроўні " +"запуску {level!s}." #: src/modules/services-openrc/main.py:103 msgid "" "rc-update {arg!s} call in chroot returned error code {num!s}." msgstr "" +"rc-update {arg!s} пад chroot вярнуўся з кодам памылкі {num!s}." #: src/modules/services-openrc/main.py:110 msgid "Target runlevel does not exist" -msgstr "" +msgstr "Мэтавы ўзровень запуску не існуе" #: src/modules/services-openrc/main.py:111 msgid "" "The path for runlevel {level!s} is {path!s}, which does not " "exist." -msgstr "" +msgstr "Шлях {path!s} да ўзроўня запуску {level!s} не існуе." #: src/modules/services-openrc/main.py:119 msgid "Target service does not exist" -msgstr "" +msgstr "Мэтавая служба не існуе" #: src/modules/services-openrc/main.py:120 msgid "" "The path for service {name!s} is {path!s}, which does not " "exist." -msgstr "" +msgstr "Шлях {path!s} да службы {level!s} не існуе." #: src/modules/plymouthcfg/main.py:36 msgid "Configure Plymouth theme" -msgstr "" +msgstr "Наладзіць тэму Plymouth" #: src/modules/machineid/main.py:36 msgid "Generate machine-id." -msgstr "" +msgstr "Стварыць machine-id." #: src/modules/packages/main.py:62 #, python-format msgid "Processing packages (%(count)d / %(total)d)" -msgstr "" +msgstr "Апрацоўка пакункаў (%(count)d / %(total)d)" #: src/modules/packages/main.py:64 src/modules/packages/main.py:74 msgid "Install packages." -msgstr "" +msgstr "Усталяваць пакункі." #: src/modules/packages/main.py:67 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "Усталёўка аднаго пакунка." +msgstr[1] "Усталёўка %(num)d пакункаў." +msgstr[2] "Усталёўка %(num)d пакункаў." +msgstr[3] "Усталёўка%(num)d пакункаў." #: src/modules/packages/main.py:70 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "Выдаленне аднаго пакунка." +msgstr[1] "Выдаленне %(num)d пакункаў." +msgstr[2] "Выдаленне %(num)d пакункаў." +msgstr[3] "Выдаленне %(num)d пакункаў." #: src/modules/bootloader/main.py:51 msgid "Install bootloader." -msgstr "" +msgstr "Усталяваць загрузчык." #: src/modules/removeuser/main.py:34 msgid "Remove live user from target system" -msgstr "" - -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" +msgstr "Выдаліць часовага карыстальніка з мэтавай сістэмы" #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." -msgstr "" +msgstr "Наладка апаратнага гадзінніка." #: src/modules/dracut/main.py:36 msgid "Creating initramfs with dracut." -msgstr "" +msgstr "Стварэнне initramfs з dracut." #: src/modules/dracut/main.py:58 msgid "Failed to run dracut on the target" -msgstr "" +msgstr "Не атрымалася запусціць dracut у пункце прызначэння" + +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "Код выхаду {}" #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." -msgstr "" +msgstr "Наладка initramfs." #: src/modules/openrcdmcryptcfg/main.py:34 msgid "Configuring OpenRC dmcrypt service." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" +msgstr "Наладка OpenRC dmcrypt." #: src/modules/fstab/main.py:38 msgid "Writing fstab." -msgstr "" +msgstr "Запіс fstab." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." -msgstr "" +msgstr "Задача Dummy python." #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" -msgstr "" +msgstr "Крок Dummy python {}" #: src/modules/localecfg/main.py:39 msgid "Configuring locales." -msgstr "" +msgstr "Наладка лакаляў." #: src/modules/networkcfg/main.py:37 msgid "Saving network configuration." -msgstr "" +msgstr "Захаванне сеткавай канфігурацыі." diff --git a/lang/python/bg/LC_MESSAGES/python.po b/lang/python/bg/LC_MESSAGES/python.po index 23cc5301c..7742ffbd5 100644 --- a/lang/python/bg/LC_MESSAGES/python.po +++ b/lang/python/bg/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Georgi Georgiev , 2018\n" "Language-Team: Bulgarian (https://www.transifex.com/calamares/teams/20061/bg/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -207,20 +206,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -311,18 +296,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -335,6 +308,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -343,18 +320,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/ca/LC_MESSAGES/python.mo b/lang/python/ca/LC_MESSAGES/python.mo index 52cfde3ed..d235d0590 100644 Binary files a/lang/python/ca/LC_MESSAGES/python.mo and b/lang/python/ca/LC_MESSAGES/python.mo differ diff --git a/lang/python/ca/LC_MESSAGES/python.po b/lang/python/ca/LC_MESSAGES/python.po index b9fd96871..d8ff64f9f 100644 --- a/lang/python/ca/LC_MESSAGES/python.po +++ b/lang/python/ca/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Davidmp , 2019\n" "Language-Team: Catalan (https://www.transifex.com/calamares/teams/20061/ca/)\n" @@ -35,8 +35,7 @@ msgstr "Es munten les particions." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "Error de configuració" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "No s'han definit particions perquè les usi
{!s}
." @@ -217,22 +216,6 @@ msgid "No root mount point is given for
{!s}
to use." msgstr "" "No s'ha proporcionat el punt de muntatge perquè l'usi
{!s}
." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Es creen initramfs amb mkinitcpio." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "Ha fallat el procés." - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"El procés
mkinitcpio
ha fallat amb el codi d'error {!s}. L'ordre " -"era
{!s}
." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Es configura l'intercanvi encriptat." @@ -331,18 +314,6 @@ msgstr "S'instal·la el carregador d'arrencada." msgid "Remove live user from target system" msgstr "Suprimeix l'usuari de la sessió autònoma del sistema de destinació" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "Es creen initramfs." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "Ha fallat executar update-initramfs a la destinació." - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "El codi de sortida ha estat {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "S'estableix el rellotge del maquinari." @@ -355,6 +326,10 @@ msgstr "Es creen initramfs amb dracut." msgid "Failed to run dracut on the target" msgstr "Ha fallat executar dracut a la destinació." +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "El codi de sortida ha estat {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "Es configuren initramfs." @@ -363,19 +338,6 @@ msgstr "Es configuren initramfs." msgid "Configuring OpenRC dmcrypt service." msgstr "Es configura el sevei OpenRC dmcrypt." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "Es configura el fitxer de clau LUKS." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Error de configuració de rootfs encriptat." - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" -"La partició de rootfs {!s} és LUKS però no se n'ha trobat cap contrasenya." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "S'escriu fstab." diff --git a/lang/python/ca@valencia/LC_MESSAGES/python.po b/lang/python/ca@valencia/LC_MESSAGES/python.po index 41bb10c11..5c242bf1b 100644 --- a/lang/python/ca@valencia/LC_MESSAGES/python.po +++ b/lang/python/ca@valencia/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Catalan (Valencian) (https://www.transifex.com/calamares/teams/20061/ca@valencia/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -307,18 +292,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -331,6 +304,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -339,18 +316,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/cs_CZ/LC_MESSAGES/python.mo b/lang/python/cs_CZ/LC_MESSAGES/python.mo index 508870063..0ec2c6aef 100644 Binary files a/lang/python/cs_CZ/LC_MESSAGES/python.mo and b/lang/python/cs_CZ/LC_MESSAGES/python.mo differ diff --git a/lang/python/cs_CZ/LC_MESSAGES/python.po b/lang/python/cs_CZ/LC_MESSAGES/python.po index 752a7c60d..9215054e0 100644 --- a/lang/python/cs_CZ/LC_MESSAGES/python.po +++ b/lang/python/cs_CZ/LC_MESSAGES/python.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Pavel Borecki , 2019\n" "Language-Team: Czech (Czech Republic) (https://www.transifex.com/calamares/teams/20061/cs_CZ/)\n" @@ -36,8 +36,7 @@ msgstr "Připojování oddílů." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -46,7 +45,7 @@ msgstr "Chyba nastavení" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "Pro
{!s}
nejsou zadány žádné oddíly." @@ -215,22 +214,6 @@ msgstr "Nastavování mkinitcpio." msgid "No root mount point is given for
{!s}
to use." msgstr "Pro
{!s}
není zadán žádný přípojný bod." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Vytváření initramfs pomocí mkinitcpio." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "Proces zhavaroval" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"Proces
mkinitcpio
zhavaroval kódem chyby {!s}. Příkaz byl " -"
{!s}
." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Nastavování šifrovaného prostoru pro odkládání stránek paměti." @@ -334,18 +317,6 @@ msgstr "Instalace zavaděče systému." msgid "Remove live user from target system" msgstr "Odebrat uživatele živé relace z cílového systému" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "Vytváření initramfs." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "Na cíli se nepodařilo spustit update-initramfs" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "Návratový kód byl {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Nastavování hardwarových hodin." @@ -358,6 +329,10 @@ msgstr "Vytváření initramfs s dracut." msgid "Failed to run dracut on the target" msgstr "Na cíli se nepodařilo spustit dracut" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "Návratový kód byl {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "Nastavování initramfs." @@ -366,18 +341,6 @@ msgstr "Nastavování initramfs." msgid "Configuring OpenRC dmcrypt service." msgstr "Nastavování služby OpenRC dmcrypt." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "Nastavování souboru s klíčem pro LUKS šifrování." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Chyba nastavení šifrovaného kořenového oddílu" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "Kořenový oddíl {!s} je LUKS ale nebyla nalezena žádná heslová fráze." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Zapisování fstab." diff --git a/lang/python/da/LC_MESSAGES/python.mo b/lang/python/da/LC_MESSAGES/python.mo index 60e2bdda8..81024c8f7 100644 Binary files a/lang/python/da/LC_MESSAGES/python.mo and b/lang/python/da/LC_MESSAGES/python.mo differ diff --git a/lang/python/da/LC_MESSAGES/python.po b/lang/python/da/LC_MESSAGES/python.po index 8d340296c..1e7afa8a0 100644 --- a/lang/python/da/LC_MESSAGES/python.po +++ b/lang/python/da/LC_MESSAGES/python.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: scootergrisen, 2019\n" "Language-Team: Danish (https://www.transifex.com/calamares/teams/20061/da/)\n" @@ -36,8 +36,7 @@ msgstr "Monterer partitioner." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -46,7 +45,7 @@ msgstr "Fejl ved konfiguration" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "Der er ikke angivet nogle partitioner som
{!s}
skal bruge." @@ -217,22 +216,6 @@ msgid "No root mount point is given for
{!s}
to use." msgstr "" "Der er ikke angivet noget rodmonteringspunkt som
{!s}
skal bruge." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Opretter initramfs med mkinitcpio." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "Processen mislykkedes" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"Processen
mkinitcpio
mislykkedes med fejlkoden {!s}. Kommandoen " -"blev
{!s}
." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Konfigurerer krypteret swap." @@ -329,18 +312,6 @@ msgstr "Installér bootloader." msgid "Remove live user from target system" msgstr "Fjern livebruger fra målsystemet" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "Opretter initramfs." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "Kunne ikke køre update-initramfs på målet" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "Afslutningskoden var {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Indstiller hardwareur." @@ -353,6 +324,10 @@ msgstr "Opretter initramfs med dracut." msgid "Failed to run dracut on the target" msgstr "Kunne ikke køre dracut på målet" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "Afslutningskoden var {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "Konfigurerer initramfs." @@ -361,19 +336,6 @@ msgstr "Konfigurerer initramfs." msgid "Configuring OpenRC dmcrypt service." msgstr "Konfigurerer OpenRC dmcrypt-tjeneste." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "Konfigurerer LUKS-nøglefil." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Fejl ved opsætning af krypteret rootfs" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" -"Rootfs-partitionen {!s} er LUKS men der blev ikke fundet nogen adgangskode." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Skriver fstab." diff --git a/lang/python/de/LC_MESSAGES/python.mo b/lang/python/de/LC_MESSAGES/python.mo index d0f2e4e58..7196846bc 100644 Binary files a/lang/python/de/LC_MESSAGES/python.mo and b/lang/python/de/LC_MESSAGES/python.mo differ diff --git a/lang/python/de/LC_MESSAGES/python.po b/lang/python/de/LC_MESSAGES/python.po index e315fb242..43cb42650 100644 --- a/lang/python/de/LC_MESSAGES/python.po +++ b/lang/python/de/LC_MESSAGES/python.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Andreas Eitel , 2019\n" "Language-Team: German (https://www.transifex.com/calamares/teams/20061/de/)\n" @@ -37,8 +37,7 @@ msgstr "Partitionen mounten." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -47,7 +46,7 @@ msgstr "Konfigurationsfehler" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" "Es sind keine Partitionen für
{!s}
zur Verwendung definiert." @@ -219,22 +218,6 @@ msgid "No root mount point is given for
{!s}
to use." msgstr "" "Es ist kein Root-Mount-Punkt für
{!s}
zur Verwendung angegeben." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Erstelle initramfs mit mkinitcpio." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "Prozess fehlgeschlagen" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"Der Prozess
mkinitcpio
ist mit dem Fehlercode {!s} " -"fehlgeschlagen. Der Befehl war
{!s}
." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Konfiguriere verschlüsseltes swap." @@ -331,18 +314,6 @@ msgstr "Installiere Bootloader." msgid "Remove live user from target system" msgstr "Entferne Live-Benutzer aus dem Zielsystem" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "Erstelle initramfs." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "Ausführen von update-initramfs auf dem Ziel schlug fehl" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "Der Exit-Code war {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Einstellen der Hardware-Uhr." @@ -355,6 +326,10 @@ msgstr "Erstelle initramfs mit dracut." msgid "Failed to run dracut on the target" msgstr "Ausführen von dracut auf dem Ziel schlug fehl" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "Der Exit-Code war {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "initramfs konfigurieren." @@ -363,18 +338,6 @@ msgstr "initramfs konfigurieren." msgid "Configuring OpenRC dmcrypt service." msgstr "Konfiguration des OpenRC dmcrypt-Dienstes." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "LUKS-Schlüsseldatei konfigurieren." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Verschlüsselter Rootfs-Setup-Fehler" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "Rootfs-Partition {!s} ist LUKS, aber keine Passphrase gefunden." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Schreibe fstab." diff --git a/lang/python/el/LC_MESSAGES/python.po b/lang/python/el/LC_MESSAGES/python.po index fb9bd2e00..c4af77ef6 100644 --- a/lang/python/el/LC_MESSAGES/python.po +++ b/lang/python/el/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Efstathios Iosifidis , 2017\n" "Language-Team: Greek (https://www.transifex.com/calamares/teams/20061/el/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -207,20 +206,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -311,18 +296,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -335,6 +308,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -343,18 +320,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/en_GB/LC_MESSAGES/python.po b/lang/python/en_GB/LC_MESSAGES/python.po index eb43ab0e1..5eef9a059 100644 --- a/lang/python/en_GB/LC_MESSAGES/python.po +++ b/lang/python/en_GB/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Jason Collins , 2018\n" "Language-Team: English (United Kingdom) (https://www.transifex.com/calamares/teams/20061/en_GB/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -207,20 +206,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -311,18 +296,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -335,6 +308,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -343,18 +320,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/eo/LC_MESSAGES/python.po b/lang/python/eo/LC_MESSAGES/python.po index d03d672fa..f6e2ef898 100644 --- a/lang/python/eo/LC_MESSAGES/python.po +++ b/lang/python/eo/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Kurt Ankh Phoenix , 2018\n" "Language-Team: Esperanto (https://www.transifex.com/calamares/teams/20061/eo/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -207,20 +206,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -311,18 +296,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -335,6 +308,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -343,18 +320,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/es/LC_MESSAGES/python.mo b/lang/python/es/LC_MESSAGES/python.mo index 5f74bc29c..5dac1ae94 100644 Binary files a/lang/python/es/LC_MESSAGES/python.mo and b/lang/python/es/LC_MESSAGES/python.mo differ diff --git a/lang/python/es/LC_MESSAGES/python.po b/lang/python/es/LC_MESSAGES/python.po index 271bdaeb5..928549662 100644 --- a/lang/python/es/LC_MESSAGES/python.po +++ b/lang/python/es/LC_MESSAGES/python.po @@ -7,16 +7,16 @@ # strel, 2018 # Francisco Sánchez López de Lerma , 2018 # Guido Grasso , 2018 -# Fito JB, 2019 +# Adolfo Jayme-Barrientos, 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Fito JB, 2019\n" +"Last-Translator: Adolfo Jayme-Barrientos, 2019\n" "Language-Team: Spanish (https://www.transifex.com/calamares/teams/20061/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -38,8 +38,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -48,7 +47,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -214,20 +213,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -318,18 +303,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -342,6 +315,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -350,18 +327,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/es_MX/LC_MESSAGES/python.po b/lang/python/es_MX/LC_MESSAGES/python.po index 34103cda5..bc02a0f42 100644 --- a/lang/python/es_MX/LC_MESSAGES/python.po +++ b/lang/python/es_MX/LC_MESSAGES/python.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Logan 8192 , 2018\n" "Language-Team: Spanish (Mexico) (https://www.transifex.com/calamares/teams/20061/es_MX/)\n" @@ -36,8 +36,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -46,7 +45,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -208,20 +207,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -312,18 +297,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -336,6 +309,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -344,18 +321,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/es_PR/LC_MESSAGES/python.po b/lang/python/es_PR/LC_MESSAGES/python.po index 644265373..54151ce05 100644 --- a/lang/python/es_PR/LC_MESSAGES/python.po +++ b/lang/python/es_PR/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Spanish (Puerto Rico) (https://www.transifex.com/calamares/teams/20061/es_PR/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -307,18 +292,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -331,6 +304,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -339,18 +316,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/et/LC_MESSAGES/python.mo b/lang/python/et/LC_MESSAGES/python.mo index ba6dcdd14..8f796c2df 100644 Binary files a/lang/python/et/LC_MESSAGES/python.mo and b/lang/python/et/LC_MESSAGES/python.mo differ diff --git a/lang/python/et/LC_MESSAGES/python.po b/lang/python/et/LC_MESSAGES/python.po index e36f9c39d..03705c5fb 100644 --- a/lang/python/et/LC_MESSAGES/python.po +++ b/lang/python/et/LC_MESSAGES/python.po @@ -4,16 +4,16 @@ # FIRST AUTHOR , YEAR. # # Translators: -# Madis, 2019 +# Madis Otenurm, 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Madis, 2019\n" +"Last-Translator: Madis Otenurm, 2019\n" "Language-Team: Estonian (https://www.transifex.com/calamares/teams/20061/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -207,20 +206,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -311,18 +296,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -335,6 +308,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -343,18 +320,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/eu/LC_MESSAGES/python.po b/lang/python/eu/LC_MESSAGES/python.po index c015db10b..5ced4ff83 100644 --- a/lang/python/eu/LC_MESSAGES/python.po +++ b/lang/python/eu/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Ander Elortondo, 2019\n" "Language-Team: Basque (https://www.transifex.com/calamares/teams/20061/eu/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -210,20 +209,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -314,18 +299,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -338,6 +311,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -346,18 +323,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/fa/LC_MESSAGES/python.po b/lang/python/fa/LC_MESSAGES/python.po index 2e3707b34..85cab6ca6 100644 --- a/lang/python/fa/LC_MESSAGES/python.po +++ b/lang/python/fa/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Persian (https://www.transifex.com/calamares/teams/20061/fa/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -307,18 +292,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -331,6 +304,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -339,18 +316,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/fi_FI/LC_MESSAGES/python.mo b/lang/python/fi_FI/LC_MESSAGES/python.mo index b46237dde..07df78902 100644 Binary files a/lang/python/fi_FI/LC_MESSAGES/python.mo and b/lang/python/fi_FI/LC_MESSAGES/python.mo differ diff --git a/lang/python/fi_FI/LC_MESSAGES/python.po b/lang/python/fi_FI/LC_MESSAGES/python.po index 9db305c83..0958195b1 100644 --- a/lang/python/fi_FI/LC_MESSAGES/python.po +++ b/lang/python/fi_FI/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Kimmo Kujansuu , 2019\n" "Language-Team: Finnish (Finland) (https://www.transifex.com/calamares/teams/20061/fi_FI/)\n" @@ -35,8 +35,7 @@ msgstr "Yhdistä osiot." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "Määritysvirhe" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "Ei ole määritetty käyttämään osioita
{!s}
." @@ -214,22 +213,6 @@ msgid "No root mount point is given for
{!s}
to use." msgstr "" "Root-juuri kiinnityspistettä
{!s}
ei ole annettu käytettäväksi." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Initramfs luominen mkinitcpion avulla." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "Prosessi epäonnistui" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"Prosessi
mkinitcpio
epäonnistui virhekoodilla {!s}. Komento oli " -"
{!s}
." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Salatun swapin määrittäminen." @@ -324,18 +307,6 @@ msgstr "Asenna bootloader." msgid "Remove live user from target system" msgstr "Poista Live-käyttäjä kohdejärjestelmästä" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "Luodaan initramfs." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "Kohteen update-initramfs suorittaminen epäonnistui" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "Poistumiskoodi oli {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Laitteiston kellon asettaminen." @@ -348,6 +319,10 @@ msgstr "Initramfs luominen dracut:lla." msgid "Failed to run dracut on the target" msgstr "Dracut-ohjelman suorittaminen ei onnistunut" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "Poistumiskoodi oli {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "Määritetään initramfs." @@ -356,18 +331,6 @@ msgstr "Määritetään initramfs." msgid "Configuring OpenRC dmcrypt service." msgstr "OpenRC dmcrypt-palvelun määrittäminen." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "LUKS-avaintiedoston määrittäminen." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Salattu rootfs asennusvirhe" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "Rootfs-osio {!s} on LUKS, mutta salasanaa ei löydy." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Fstab kirjoittaminen." diff --git a/lang/python/fr/LC_MESSAGES/python.mo b/lang/python/fr/LC_MESSAGES/python.mo index 9919ffc53..9595cd801 100644 Binary files a/lang/python/fr/LC_MESSAGES/python.mo and b/lang/python/fr/LC_MESSAGES/python.mo differ diff --git a/lang/python/fr/LC_MESSAGES/python.po b/lang/python/fr/LC_MESSAGES/python.po index b8f7ba816..e96f3a136 100644 --- a/lang/python/fr/LC_MESSAGES/python.po +++ b/lang/python/fr/LC_MESSAGES/python.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Arnaud Ferraris , 2019\n" "Language-Team: French (https://www.transifex.com/calamares/teams/20061/fr/)\n" @@ -43,8 +43,7 @@ msgstr "Montage des partitions." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -53,7 +52,7 @@ msgstr "Erreur de configuration" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" "Aucune partition n'est définie pour être utilisée par
{!s}
." @@ -228,22 +227,6 @@ msgstr "" "Aucun point de montage racine n'a été donné pour être utilisé par " "
{!s}
." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Création de l'initramfs avec mkinitcpio." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "Échec du processus" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"Le processus
mkinitcpio
a échoué avec le code d'erreur {!s}. La " -"commande était
{!s}
." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Configuration du swap chiffrée." @@ -342,18 +325,6 @@ msgstr "Installation du bootloader." msgid "Remove live user from target system" msgstr "Supprimer l'utilisateur live du système cible" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "création du initramfs" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "Erreur d'exécution de update-initramfs sur la cible." - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "Le code de sortie était {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Configuration de l'horloge matériel." @@ -366,6 +337,10 @@ msgstr "Configuration du initramfs avec dracut." msgid "Failed to run dracut on the target" msgstr "Erreur d'exécution de dracut sur la cible." +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "Le code de sortie était {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "Configuration du initramfs." @@ -374,20 +349,6 @@ msgstr "Configuration du initramfs." msgid "Configuring OpenRC dmcrypt service." msgstr "Configuration du service OpenRC dmcrypt." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "Configuration de la clé de fichier LUKS." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Erreur du chiffrement du setup rootfs" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" -"La partition racine {!s} est de type LUKS mais aucune phrase de passe n'a " -"été trouvée." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Écriture du fstab." diff --git a/lang/python/fr_CH/LC_MESSAGES/python.po b/lang/python/fr_CH/LC_MESSAGES/python.po index 47ed6f847..fbda54e3c 100644 --- a/lang/python/fr_CH/LC_MESSAGES/python.po +++ b/lang/python/fr_CH/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: French (Switzerland) (https://www.transifex.com/calamares/teams/20061/fr_CH/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -307,18 +292,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -331,6 +304,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -339,18 +316,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/gl/LC_MESSAGES/python.po b/lang/python/gl/LC_MESSAGES/python.po index 817d036e4..089d3dd63 100644 --- a/lang/python/gl/LC_MESSAGES/python.po +++ b/lang/python/gl/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Xosé, 2018\n" "Language-Team: Galician (https://www.transifex.com/calamares/teams/20061/gl/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -210,20 +209,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -314,18 +299,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -338,6 +311,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -346,18 +323,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/gu/LC_MESSAGES/python.po b/lang/python/gu/LC_MESSAGES/python.po index d591c8d01..84a31ec50 100644 --- a/lang/python/gu/LC_MESSAGES/python.po +++ b/lang/python/gu/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Gujarati (https://www.transifex.com/calamares/teams/20061/gu/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -307,18 +292,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -331,6 +304,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -339,18 +316,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/he/LC_MESSAGES/python.mo b/lang/python/he/LC_MESSAGES/python.mo index 6028c7920..423f053a9 100644 Binary files a/lang/python/he/LC_MESSAGES/python.mo and b/lang/python/he/LC_MESSAGES/python.mo differ diff --git a/lang/python/he/LC_MESSAGES/python.po b/lang/python/he/LC_MESSAGES/python.po index 61b5fdf83..d5b473aa4 100644 --- a/lang/python/he/LC_MESSAGES/python.po +++ b/lang/python/he/LC_MESSAGES/python.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Yaron Shahrabani , 2019\n" "Language-Team: Hebrew (https://www.transifex.com/calamares/teams/20061/he/)\n" @@ -36,8 +36,7 @@ msgstr "מחיצות מעוגנות." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -46,7 +45,7 @@ msgstr "שגיאת הגדרות" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "לא הוגדרו מחיצות לשימוש של
{!s}
." @@ -213,22 +212,6 @@ msgstr "mkinitcpio מותקן." msgid "No root mount point is given for
{!s}
to use." msgstr "לא סופקה נקודת עגינת שורש לשימוש של
{!s}
." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "נוצר initramfs עם mkinitcpio." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "התהליך נכשל" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"התהליך
mkinitcpio
נכשל עם קוד השגיאה {!s}. הפקודה הייתה " -"
{!s}
." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "מוגדר שטח החלפה מוצפן." @@ -328,18 +311,6 @@ msgstr "התקנת מנהל אתחול." msgid "Remove live user from target system" msgstr "הסרת משתמש חי ממערכת היעד" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "נוצר initramfs." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "הרצת update-initramfs על היעד נכשלה" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "קוד היציאה היה {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "שעון החומרה מוגדר." @@ -352,6 +323,10 @@ msgstr "נוצר initramfs עם dracut." msgid "Failed to run dracut on the target" msgstr "הרצת dracut על היעד נכשלה" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "קוד היציאה היה {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "initramfs מוגדר." @@ -360,18 +335,6 @@ msgstr "initramfs מוגדר." msgid "Configuring OpenRC dmcrypt service." msgstr "שירות dmcrypt ל־OpenRC מוגדר." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "קובץ מפתח ה־LUKS מוגדר." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "שגיאת התקנת מחיצת שורש מוצפנת" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "מחיצת השורש {!s} היא מסוג LUKS אך לא נמצאה מילת צופן." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "fstab נכתב." diff --git a/lang/python/hi/LC_MESSAGES/python.mo b/lang/python/hi/LC_MESSAGES/python.mo index 91f4c0932..3d3912fe5 100644 Binary files a/lang/python/hi/LC_MESSAGES/python.mo and b/lang/python/hi/LC_MESSAGES/python.mo differ diff --git a/lang/python/hi/LC_MESSAGES/python.po b/lang/python/hi/LC_MESSAGES/python.po index c826795f3..55e9bebe8 100644 --- a/lang/python/hi/LC_MESSAGES/python.po +++ b/lang/python/hi/LC_MESSAGES/python.po @@ -4,16 +4,16 @@ # FIRST AUTHOR , YEAR. # # Translators: -# Panwar108 , 2018 +# Panwar108 , 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Panwar108 , 2018\n" +"Last-Translator: Panwar108 , 2019\n" "Language-Team: Hindi (https://www.transifex.com/calamares/teams/20061/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,11 +23,11 @@ msgstr "" #: src/modules/grubcfg/main.py:37 msgid "Configure GRUB." -msgstr "" +msgstr "GRUB विन्यस्त करना।" #: src/modules/mount/main.py:38 msgid "Mounting partitions." -msgstr "" +msgstr "विभाजन माउंट करना।" #: src/modules/mount/main.py:150 src/modules/initcpiocfg/main.py:187 #: src/modules/initcpiocfg/main.py:191 @@ -35,169 +35,173 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" -msgstr "" +msgstr "विन्यास त्रुटि" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." -msgstr "" +msgstr "
{!s}
के उपयोग हेतु कोई विभाजन परिभाषित नहीं हैं।" #: src/modules/services-systemd/main.py:35 msgid "Configure systemd services" -msgstr "" +msgstr "systemd सेवाएँ विन्यस्त करना" #: src/modules/services-systemd/main.py:68 #: src/modules/services-openrc/main.py:102 msgid "Cannot modify service" -msgstr "" +msgstr "सेवा को संशोधित नहीं किया जा सकता" #: src/modules/services-systemd/main.py:69 msgid "" "systemctl {arg!s} call in chroot returned error code {num!s}." -msgstr "" +msgstr "chroot में systemctl {arg!s} कॉल त्रुटि कोड {num!s}।" #: src/modules/services-systemd/main.py:72 #: src/modules/services-systemd/main.py:76 msgid "Cannot enable systemd service {name!s}." -msgstr "" +msgstr "systemd सेवा {name!s} को सक्रिय नहीं किया जा सकता।" #: src/modules/services-systemd/main.py:74 msgid "Cannot enable systemd target {name!s}." -msgstr "" +msgstr "systemd टारगेट {name!s} को सक्रिय नहीं किया जा सकता।" #: src/modules/services-systemd/main.py:78 msgid "Cannot disable systemd target {name!s}." -msgstr "" +msgstr "systemd टारगेट {name!s} को निष्क्रिय नहीं किया जा सकता।" #: src/modules/services-systemd/main.py:80 msgid "Cannot mask systemd unit {name!s}." -msgstr "" +msgstr "systemd यूनिट {name!s} को मास्क नहीं किया जा सकता।" #: src/modules/services-systemd/main.py:82 msgid "" "Unknown systemd commands {command!s} and " "{suffix!s} for unit {name!s}." msgstr "" +"यूनिट {name!s} हेतु अज्ञात systemd कमांड {command!s} व " +"{suffix!s}।" #: src/modules/umount/main.py:40 msgid "Unmount file systems." -msgstr "फ़ाइल सिस्टम माउंट से हटाएँ।" +msgstr "फ़ाइल सिस्टम माउंट से हटाना।" #: src/modules/unpackfs/main.py:41 msgid "Filling up filesystems." -msgstr "" +msgstr "फाइल सिस्टम भरना।" #: src/modules/unpackfs/main.py:159 msgid "rsync failed with error code {}." -msgstr "" +msgstr "rsync त्रुटि कोड {} के साथ विफल।" #: src/modules/unpackfs/main.py:220 src/modules/unpackfs/main.py:238 msgid "Failed to unpack image \"{}\"" -msgstr "" +msgstr "इमेज फ़ाइल \"{}\" को खोलने में विफल" #: src/modules/unpackfs/main.py:221 msgid "" "Failed to find unsquashfs, make sure you have the squashfs-tools package " "installed" msgstr "" +"unsqaushfs खोजने में विफल, सुनिश्चित करें कि squashfs-tools पैकेज इंस्टॉल है" #: src/modules/unpackfs/main.py:320 msgid "No mount point for root partition" -msgstr "" +msgstr "रुट विभाजन हेतु कोई माउंट पॉइंट नहीं है" #: src/modules/unpackfs/main.py:321 msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing" -msgstr "" +msgstr "globalstorage में \"rootMountPoint\" कुंजी नहीं है, कुछ नहीं किया जाएगा" #: src/modules/unpackfs/main.py:326 msgid "Bad mount point for root partition" -msgstr "" +msgstr "रुट विभाजन हेतु ख़राब माउंट पॉइंट" #: src/modules/unpackfs/main.py:327 msgid "rootMountPoint is \"{}\", which does not exist, doing nothing" -msgstr "" +msgstr "रुट माउंट पॉइंट \"{}\" है, जो कि मौजूद नहीं है, कुछ नहीं किया जाएगा" #: src/modules/unpackfs/main.py:340 src/modules/unpackfs/main.py:347 #: src/modules/unpackfs/main.py:352 msgid "Bad unsquash configuration" -msgstr "" +msgstr "ख़राब unsquash विन्यास सेटिंग्स" #: src/modules/unpackfs/main.py:341 msgid "The filesystem for \"{}\" ({}) is not supported" -msgstr "" +msgstr "\"{}\" ({}) हेतु फ़ाइल सिस्टम समर्थित नहीं है" #: src/modules/unpackfs/main.py:348 msgid "The source filesystem \"{}\" does not exist" -msgstr "" +msgstr "\"{}\" स्रोत फ़ाइल सिस्टम मौजूद नहीं है" #: src/modules/unpackfs/main.py:353 msgid "The destination \"{}\" in the target system is not a directory" -msgstr "" +msgstr "लक्षित सिस्टम में \"{}\" स्थान कोई डायरेक्टरी नहीं है" #: src/modules/displaymanager/main.py:381 msgid "Cannot write KDM configuration file" -msgstr "" +msgstr "KDM विन्यास फ़ाइल राइट नहीं की जा सकती" #: src/modules/displaymanager/main.py:382 msgid "KDM config file {!s} does not exist" -msgstr "" +msgstr "KDM विन्यास फ़ाइल {!s} मौजूद नहीं है" #: src/modules/displaymanager/main.py:443 msgid "Cannot write LXDM configuration file" -msgstr "" +msgstr "LXDM विन्यास फ़ाइल राइट नहीं की जा सकती" #: src/modules/displaymanager/main.py:444 msgid "LXDM config file {!s} does not exist" -msgstr "" +msgstr "LXDM विन्यास फ़ाइल {!s} मौजूद नहीं है" #: src/modules/displaymanager/main.py:527 msgid "Cannot write LightDM configuration file" -msgstr "" +msgstr "LightDM विन्यास फ़ाइल राइट नहीं की जा सकती" #: src/modules/displaymanager/main.py:528 msgid "LightDM config file {!s} does not exist" -msgstr "" +msgstr "LightDM विन्यास फ़ाइल {!s} मौजूद नहीं है" #: src/modules/displaymanager/main.py:602 msgid "Cannot configure LightDM" -msgstr "" +msgstr "LightDM को विन्यस्त नहीं किया जा सकता" #: src/modules/displaymanager/main.py:603 msgid "No LightDM greeter installed." -msgstr "" +msgstr "कोई LightDM लॉगिन स्क्रीन इंस्टॉल नहीं है।" #: src/modules/displaymanager/main.py:634 msgid "Cannot write SLIM configuration file" -msgstr "" +msgstr "SLIM विन्यास फ़ाइल राइट नहीं की जा सकती" #: src/modules/displaymanager/main.py:635 msgid "SLIM config file {!s} does not exist" -msgstr "" +msgstr "SLIM विन्यास फ़ाइल {!s} मौजूद नहीं है" #: src/modules/displaymanager/main.py:750 msgid "No display managers selected for the displaymanager module." -msgstr "" +msgstr "चयनित डिस्प्ले प्रबंधक मॉड्यूल हेतु कोई डिस्प्ले प्रबंधक नहीं मिला।" #: src/modules/displaymanager/main.py:751 msgid "" "The displaymanagers list is empty or undefined in bothglobalstorage and " "displaymanager.conf." msgstr "" +"bothglobalstorage एवं displaymanager.conf में डिस्प्ले प्रबंधक सूची रिक्त या" +" अपरिभाषित है।" #: src/modules/displaymanager/main.py:831 msgid "Display manager configuration was incomplete" -msgstr "" +msgstr "डिस्प्ले प्रबंधक विन्यास अधूरा था" #: src/modules/initcpiocfg/main.py:36 msgid "Configuring mkinitcpio." -msgstr "" +msgstr "mkinitcpio को विन्यस्त करना।" #: src/modules/initcpiocfg/main.py:192 #: src/modules/luksopenswaphookcfg/main.py:100 @@ -206,79 +210,69 @@ msgstr "" #: src/modules/localecfg/main.py:145 src/modules/networkcfg/main.py:49 msgid "No root mount point is given for
{!s}
to use." msgstr "" - -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" +"
{!s}
के उपयोग हेतु कोई रुट माउंट पॉइंट प्रदान नहीं किया गया।" #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." -msgstr "" +msgstr "एन्क्रिप्टेड स्वैप को विन्यस्त करना।" #: src/modules/rawfs/main.py:35 msgid "Installing data." -msgstr "" +msgstr "डाटा इंस्टॉल करना।" #: src/modules/services-openrc/main.py:38 msgid "Configure OpenRC services" -msgstr "" +msgstr "OpenRC सेवाएँ विन्यस्त करना" #: src/modules/services-openrc/main.py:66 msgid "Cannot add service {name!s} to run-level {level!s}." -msgstr "" +msgstr "रन-लेवल {level!s} में सेवा {name!s} को जोड़ा नहीं जा सका।" #: src/modules/services-openrc/main.py:68 msgid "Cannot remove service {name!s} from run-level {level!s}." -msgstr "" +msgstr "रन-लेवल {level!s} में सेवा {name!s} को हटाया नहीं जा सका।" #: src/modules/services-openrc/main.py:70 msgid "" "Unknown service-action {arg!s} for service {name!s} in run-" "level {level!s}." msgstr "" +"रन-लेवल {level!s} में सेवा {name!s} हेतु अज्ञात सेवा-कार्य " +"{arg!s}।" #: src/modules/services-openrc/main.py:103 msgid "" "rc-update {arg!s} call in chroot returned error code {num!s}." -msgstr "" +msgstr "chroot में rc-update {arg!s} कॉल त्रुटि कोड {num!s}।" #: src/modules/services-openrc/main.py:110 msgid "Target runlevel does not exist" -msgstr "" +msgstr "लक्षित रनलेवल मौजूद नहीं है" #: src/modules/services-openrc/main.py:111 msgid "" "The path for runlevel {level!s} is {path!s}, which does not " "exist." msgstr "" +"रनलेवल {level!s} हेतु पथ {path!s} है, जो कि मौजूद नहीं है।" #: src/modules/services-openrc/main.py:119 msgid "Target service does not exist" -msgstr "" +msgstr "लक्षित सेवा मौजूद नहीं है" #: src/modules/services-openrc/main.py:120 msgid "" "The path for service {name!s} is {path!s}, which does not " "exist." -msgstr "" +msgstr "सेवा {name!s} हेतु पथ {path!s} है, जो कि मौजूद नहीं है।" #: src/modules/plymouthcfg/main.py:36 msgid "Configure Plymouth theme" -msgstr "" +msgstr "Plymouth थीम विन्यस्त करना " #: src/modules/machineid/main.py:36 msgid "Generate machine-id." -msgstr "मशीन-आईडी उत्पन्न करें।" +msgstr "मशीन-आईडी उत्पन्न करना।" #: src/modules/packages/main.py:62 #, python-format @@ -287,7 +281,7 @@ msgstr "पैकेज (%(count)d / %(total)d) संसाधित किए #: src/modules/packages/main.py:64 src/modules/packages/main.py:74 msgid "Install packages." -msgstr "पैकेज इंस्टॉल करें।" +msgstr "पैकेज इंस्टॉल करना।" #: src/modules/packages/main.py:67 #, python-format @@ -305,59 +299,39 @@ msgstr[1] "%(num)d पैकेज हटाए जा रहे हैं।" #: src/modules/bootloader/main.py:51 msgid "Install bootloader." -msgstr "" +msgstr "बूट लोडर इंस्टॉल करना।" #: src/modules/removeuser/main.py:34 msgid "Remove live user from target system" -msgstr "" - -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" +msgstr "लक्षित सिस्टम से लाइव उपयोक्ता को हटाना" #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." -msgstr "" +msgstr "हार्डवेयर घड़ी सेट करना।" #: src/modules/dracut/main.py:36 msgid "Creating initramfs with dracut." -msgstr "" +msgstr "dracut के साथ initramfs बनाना।" #: src/modules/dracut/main.py:58 msgid "Failed to run dracut on the target" -msgstr "" +msgstr "टारगेट पर dracut चलाने में विफल" + +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "त्रुटि कोड {}" #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." -msgstr "" +msgstr "initramfs को विन्यस्त करना। " #: src/modules/openrcdmcryptcfg/main.py:34 msgid "Configuring OpenRC dmcrypt service." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" +msgstr "OpenRC dmcrypt सेवा को विन्यस्त करना।" #: src/modules/fstab/main.py:38 msgid "Writing fstab." -msgstr "" +msgstr "fstab पर राइट करना।" #: src/modules/dummypython/main.py:44 msgid "Dummy python job." @@ -369,8 +343,8 @@ msgstr "डमी पाइथन प्रक्रिया की चरण #: src/modules/localecfg/main.py:39 msgid "Configuring locales." -msgstr "" +msgstr "स्थानिकी को विन्यस्त करना।" #: src/modules/networkcfg/main.py:37 msgid "Saving network configuration." -msgstr "" +msgstr "नेटवर्क विन्यास सेटिंग्स संचित करना।" diff --git a/lang/python/hr/LC_MESSAGES/python.mo b/lang/python/hr/LC_MESSAGES/python.mo index ad429694e..7bbf2f3f2 100644 Binary files a/lang/python/hr/LC_MESSAGES/python.mo and b/lang/python/hr/LC_MESSAGES/python.mo differ diff --git a/lang/python/hr/LC_MESSAGES/python.po b/lang/python/hr/LC_MESSAGES/python.po index 43b67a4b1..94461e40e 100644 --- a/lang/python/hr/LC_MESSAGES/python.po +++ b/lang/python/hr/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Lovro Kudelić , 2019\n" "Language-Team: Croatian (https://www.transifex.com/calamares/teams/20061/hr/)\n" @@ -35,8 +35,7 @@ msgstr "Montiranje particija." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "Greška konfiguracije" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "Nema definiranih particija za
{!s}
korištenje." @@ -216,22 +215,6 @@ msgid "No root mount point is given for
{!s}
to use." msgstr "" "Nijedna root točka montiranja nije definirana za
{!s}
korištenje." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Stvaranje initramfs s mkinitcpio." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "Proces nije uspio" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"Proces
mkinitcpio
nije uspio s kodom pogreške {!s}. Naredba je " -"bila
{!s}
." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Konfiguriranje šifriranog swapa." @@ -331,18 +314,6 @@ msgstr "Instalirajte bootloader." msgid "Remove live user from target system" msgstr "Uklonite live korisnika iz ciljnog sustava" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "Stvaranje initramfs." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "Pokretanje ažuriranja-initramfs na ciljanom sustavu nije uspjelo" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "Izlazni kod bio je {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Postavljanje hardverskog sata." @@ -355,6 +326,10 @@ msgstr "Stvaranje initramfs s dracut." msgid "Failed to run dracut on the target" msgstr "Nije uspjelo pokretanje dracuta na ciljanom sustavu" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "Izlazni kod bio je {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "Konfiguriranje initramfs." @@ -363,18 +338,6 @@ msgstr "Konfiguriranje initramfs." msgid "Configuring OpenRC dmcrypt service." msgstr "Konfiguriranje servisa OpenRC dmcrypt." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "Konfiguriranje LUKS ključne datoteke." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Pogreška postavljanja šifriranog rootfs-a" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "Rootfs particija {!s} je LUKS, ali nije pronađena zaporka." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Zapisujem fstab." diff --git a/lang/python/hu/LC_MESSAGES/python.mo b/lang/python/hu/LC_MESSAGES/python.mo index c56dc4aec..a77df9a5a 100644 Binary files a/lang/python/hu/LC_MESSAGES/python.mo and b/lang/python/hu/LC_MESSAGES/python.mo differ diff --git a/lang/python/hu/LC_MESSAGES/python.po b/lang/python/hu/LC_MESSAGES/python.po index 49fb56a47..5482de441 100644 --- a/lang/python/hu/LC_MESSAGES/python.po +++ b/lang/python/hu/LC_MESSAGES/python.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Lajos Pasztor , 2019\n" "Language-Team: Hungarian (https://www.transifex.com/calamares/teams/20061/hu/)\n" @@ -38,8 +38,7 @@ msgstr "Partíciók csatolása." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -48,7 +47,7 @@ msgstr "Konfigurációs hiba" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "Nincsenek partíciók meghatározva a
{!s}
használatához." @@ -219,22 +218,6 @@ msgstr "mkinitcpio konfigurálása." msgid "No root mount point is given for
{!s}
to use." msgstr "Nincs root csatolási pont megadva a
{!s}
használatához." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "initramfs létrehozása mkinitcpio utasítással." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "Folyamat elhalt" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"
mkinitcpio
folyamat elhalt, hibakód {!s}. A parancs " -"
{!s}
volt." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Titkosított swap konfigurálása." @@ -331,18 +314,6 @@ msgstr "Rendszerbetöltő telepítése." msgid "Remove live user from target system" msgstr "Éles felhasználó eltávolítása a cél rendszerből" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "initramfs létrehozása." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "Nem sikerült futtatni update-initramfs a célon." - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "A kilépési kód {} volt." - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Rendszeridő beállítása." @@ -355,6 +326,10 @@ msgstr "initramfs létrehozása ezzel: dracut." msgid "Failed to run dracut on the target" msgstr "dracut futtatása nem sikerült a célon." +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "A kilépési kód {} volt." + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "initramfs konfigurálása." @@ -363,18 +338,6 @@ msgstr "initramfs konfigurálása." msgid "Configuring OpenRC dmcrypt service." msgstr "OpenRC dmcrypt szolgáltatás konfigurálása." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "LUKS kulcs fájl konfigurálása." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Titkosított rootfs telepítési hiba" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "A rootfs partíció {!s} az LUKS de nem található a jelszó." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "fstab írása." diff --git a/lang/python/id/LC_MESSAGES/python.po b/lang/python/id/LC_MESSAGES/python.po index 4763d81fb..f06076b0a 100644 --- a/lang/python/id/LC_MESSAGES/python.po +++ b/lang/python/id/LC_MESSAGES/python.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Wantoyo , 2018\n" "Language-Team: Indonesian (https://www.transifex.com/calamares/teams/20061/id/)\n" @@ -37,8 +37,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -47,7 +46,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -211,20 +210,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -313,18 +298,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -337,6 +310,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -345,18 +322,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/is/LC_MESSAGES/python.po b/lang/python/is/LC_MESSAGES/python.po index 8aa035ee5..fdfb49daa 100644 --- a/lang/python/is/LC_MESSAGES/python.po +++ b/lang/python/is/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Kristján Magnússon, 2018\n" "Language-Team: Icelandic (https://www.transifex.com/calamares/teams/20061/is/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -207,20 +206,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -311,18 +296,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -335,6 +308,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -343,18 +320,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/it_IT/LC_MESSAGES/python.po b/lang/python/it_IT/LC_MESSAGES/python.po index 4ff0f84e3..bd9ed4338 100644 --- a/lang/python/it_IT/LC_MESSAGES/python.po +++ b/lang/python/it_IT/LC_MESSAGES/python.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Pierfrancesco Passerini , 2019\n" "Language-Team: Italian (Italy) (https://www.transifex.com/calamares/teams/20061/it_IT/)\n" @@ -37,8 +37,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -47,7 +46,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -214,20 +213,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -320,18 +305,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "Rimuovi l'utente live dal sistema di destinazione" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -344,6 +317,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -352,18 +329,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/ja/LC_MESSAGES/python.mo b/lang/python/ja/LC_MESSAGES/python.mo index c49f8a384..462a4d73c 100644 Binary files a/lang/python/ja/LC_MESSAGES/python.mo and b/lang/python/ja/LC_MESSAGES/python.mo differ diff --git a/lang/python/ja/LC_MESSAGES/python.po b/lang/python/ja/LC_MESSAGES/python.po index 1513c077b..73acce210 100644 --- a/lang/python/ja/LC_MESSAGES/python.po +++ b/lang/python/ja/LC_MESSAGES/python.po @@ -4,18 +4,18 @@ # FIRST AUTHOR , YEAR. # # Translators: -# UTUMI Hirosi , 2019 # ブラシックデービッド, 2019 # Takefumi Nagata, 2019 +# UTUMI Hirosi , 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Takefumi Nagata, 2019\n" +"Last-Translator: UTUMI Hirosi , 2019\n" "Language-Team: Japanese (https://www.transifex.com/calamares/teams/20061/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -37,8 +37,7 @@ msgstr "パーティションのマウント。" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -47,9 +46,9 @@ msgstr "コンフィグレーションエラー" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." -msgstr "" +msgstr "
{!s}
に使用するパーティションが定義されていません。" #: src/modules/services-systemd/main.py:35 msgid "Configure systemd services" @@ -64,6 +63,7 @@ msgstr "サービスが変更できません" msgid "" "systemctl {arg!s} call in chroot returned error code {num!s}." msgstr "" +"chroot で systemctl {arg!s} を呼び出すと、エラーコード {num!s} が返されました。" #: src/modules/services-systemd/main.py:72 #: src/modules/services-systemd/main.py:76 @@ -80,13 +80,15 @@ msgstr "systemd でターゲット {name!s}が停止できません #: src/modules/services-systemd/main.py:80 msgid "Cannot mask systemd unit {name!s}." -msgstr "" +msgstr "systemd ユニット {name!s} をマスクできません。" #: src/modules/services-systemd/main.py:82 msgid "" "Unknown systemd commands {command!s} and " "{suffix!s} for unit {name!s}." msgstr "" +"ユニット {name!s} に対する未知の systemd コマンド {command!s} と " +"{suffix!s}。" #: src/modules/umount/main.py:40 msgid "Unmount file systems." @@ -94,7 +96,7 @@ msgstr "ファイルシステムをアンマウントする。" #: src/modules/unpackfs/main.py:41 msgid "Filling up filesystems." -msgstr "" +msgstr "ファイルシステムを埋める。" #: src/modules/unpackfs/main.py:159 msgid "rsync failed with error code {}." @@ -209,21 +211,6 @@ msgstr "mkinitcpioを設定中" msgid "No root mount point is given for
{!s}
to use." msgstr "
{!s}
を使用するのにルートマウントポイントが与えられていません。" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "mkinitcpioとinitramfsを作成中" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "プロセスを失敗しました" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"
mkinitcpio
プロセスがエラーコード {!s} により失敗しました。 コマンドは
{!s}
でした。" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "暗号化したswapを設定中" @@ -249,11 +236,12 @@ msgid "" "Unknown service-action {arg!s} for service {name!s} in run-" "level {level!s}." msgstr "" +"ランレベル {level!s} 内のサービス {name!s} に対する未知のサービスアクション {arg!s}。" #: src/modules/services-openrc/main.py:103 msgid "" "rc-update {arg!s} call in chroot returned error code {num!s}." -msgstr "" +msgstr "chrootで rc-update {arg!s} を呼び出すとエラーコード {num!s} が返されました。" #: src/modules/services-openrc/main.py:110 msgid "Target runlevel does not exist" @@ -263,7 +251,7 @@ msgstr "ターゲットとするランレベルは存在しません" msgid "" "The path for runlevel {level!s} is {path!s}, which does not " "exist." -msgstr "" +msgstr "ランレベル {level!s} のパスが {path!s} です。これは存在しません。" #: src/modules/services-openrc/main.py:119 msgid "Target service does not exist" @@ -273,7 +261,7 @@ msgstr "ターゲットとするサービスは存在しません" msgid "" "The path for service {name!s} is {path!s}, which does not " "exist." -msgstr "" +msgstr "サービス {name!s} のパスが {path!s} です。これは存在しません。" #: src/modules/plymouthcfg/main.py:36 msgid "Configure Plymouth theme" @@ -312,18 +300,6 @@ msgstr "ブートローダーをインストール" msgid "Remove live user from target system" msgstr "ターゲットシステムからliveユーザーを消去" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "initramfsを作成中" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "ターゲット上の initramfs のアップデートに失敗" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "停止コードは {} でした" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "ハードウェアクロックの設定" @@ -336,6 +312,10 @@ msgstr "dracutとinitramfsを作成中" msgid "Failed to run dracut on the target" msgstr "ターゲット上で dracut の実行に失敗" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "停止コードは {} でした" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "initramfsを設定中" @@ -344,18 +324,6 @@ msgstr "initramfsを設定中" msgid "Configuring OpenRC dmcrypt service." msgstr "OpenRC dmcryptサービスを設定中" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "LUKSキーファイルを設定中" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "暗号化したrootfsセットアップエラー" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "Rootfs のパーティションは {!s} LUKS ですが、パスフレーズが見つかりません。" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "fstabを書き込み中" diff --git a/lang/python/kk/LC_MESSAGES/python.po b/lang/python/kk/LC_MESSAGES/python.po index 3e98b3368..6d0bc8364 100644 --- a/lang/python/kk/LC_MESSAGES/python.po +++ b/lang/python/kk/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Kazakh (https://www.transifex.com/calamares/teams/20061/kk/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -307,18 +292,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -331,6 +304,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -339,18 +316,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/kn/LC_MESSAGES/python.po b/lang/python/kn/LC_MESSAGES/python.po index b73c03f02..0f5e704ca 100644 --- a/lang/python/kn/LC_MESSAGES/python.po +++ b/lang/python/kn/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Kannada (https://www.transifex.com/calamares/teams/20061/kn/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -307,18 +292,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -331,6 +304,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -339,18 +316,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/ko/LC_MESSAGES/python.mo b/lang/python/ko/LC_MESSAGES/python.mo index 5a79cb0a1..fc0658fd0 100644 Binary files a/lang/python/ko/LC_MESSAGES/python.mo and b/lang/python/ko/LC_MESSAGES/python.mo differ diff --git a/lang/python/ko/LC_MESSAGES/python.po b/lang/python/ko/LC_MESSAGES/python.po index 35ed87bb2..9663a1755 100644 --- a/lang/python/ko/LC_MESSAGES/python.po +++ b/lang/python/ko/LC_MESSAGES/python.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: 이정희 , 2019\n" "Language-Team: Korean (https://www.transifex.com/calamares/teams/20061/ko/)\n" @@ -36,8 +36,7 @@ msgstr "파티션 마운트 중." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -46,7 +45,7 @@ msgstr "구성 오류" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "사용할
{!s}
에 대해 정의된 파티션이 없음." @@ -211,22 +210,6 @@ msgstr "mkinitcpio 구성 중." msgid "No root mount point is given for
{!s}
to use." msgstr "
{!s}
에서 사용할 루트 마운트 지점이 제공되지 않음." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "mkinitcpio를 사용하여 initramfs 만드는 중." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "프로세스 실패" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"오류 코드 {!s}이(가) 포함된 프로세스
mkinitcpio
가 실패했습니다. 명령은 " -"
{!s}
입니다" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "암호화된 스왑 구성 중." @@ -317,18 +300,6 @@ msgstr "부트로더 설치." msgid "Remove live user from target system" msgstr "대상 시스템에서 라이브 사용자 제거" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "initramfs를 만드는 중." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "대상에서 update-initramfs 실행 실패" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "종료 코드 {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "하드웨어 클럭 설정 중." @@ -341,6 +312,10 @@ msgstr "dracut을 사용하여 initramfs 만들기." msgid "Failed to run dracut on the target" msgstr "대상에서 dracut을 실행하지 못함" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "종료 코드 {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "initramfs 구성 중." @@ -349,18 +324,6 @@ msgstr "initramfs 구성 중." msgid "Configuring OpenRC dmcrypt service." msgstr "OpenRC dmcrypt 서비스 구성 중." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "LUKS 키 파일 구성 중." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "암호화된 rootfs 설정 오류" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "Rootfs 파티션 {!s}은(는) LUKS이지만 암호구문을 찾을 수 없음." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "fstab 쓰기." diff --git a/lang/python/lo/LC_MESSAGES/python.po b/lang/python/lo/LC_MESSAGES/python.po index 1671e9608..d61c2778f 100644 --- a/lang/python/lo/LC_MESSAGES/python.po +++ b/lang/python/lo/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Lao (https://www.transifex.com/calamares/teams/20061/lo/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -305,18 +290,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -329,6 +302,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -337,18 +314,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/lt/LC_MESSAGES/python.mo b/lang/python/lt/LC_MESSAGES/python.mo index e2d60c86f..2bd7d661b 100644 Binary files a/lang/python/lt/LC_MESSAGES/python.mo and b/lang/python/lt/LC_MESSAGES/python.mo differ diff --git a/lang/python/lt/LC_MESSAGES/python.po b/lang/python/lt/LC_MESSAGES/python.po index 2a876e187..40932607b 100644 --- a/lang/python/lt/LC_MESSAGES/python.po +++ b/lang/python/lt/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Moo, 2019\n" "Language-Team: Lithuanian (https://www.transifex.com/calamares/teams/20061/lt/)\n" @@ -35,8 +35,7 @@ msgstr "Prijungiami skaidiniai." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "Konfigūracijos klaida" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "Nėra apibrėžta jokių skaidinių, skirtų
{!s}
naudojimui." @@ -217,22 +216,6 @@ msgstr "" "Nėra nurodyta jokių šaknies prijungimo taškų, skirtų
{!s}
" "naudojimui." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Sukuriama initramfs naudojant mkinitcpio." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "Procesas patyrė nesėkmę" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"Procesas
mkinitcpio
patyrė nesėkmę su klaidos kodu {!s}. Komanda " -"buvo
{!s}
." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Konfigūruojamas šifruotas sukeitimų skaidinys." @@ -334,18 +317,6 @@ msgstr "Įdiegti paleidyklę." msgid "Remove live user from target system" msgstr "Šalinti demonstracinį naudotoją iš paskirties sistemos" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "Sukuriama initramfs." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "Nepavyko paskirties vietoje paleisti update-initramfs" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "Išėjimo kodas buvo {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Nustatomas aparatinės įrangos laikrodis." @@ -358,6 +329,10 @@ msgstr "Sukuriama initramfs naudojant dracut." msgid "Failed to run dracut on the target" msgstr "Nepavyko paskirties vietoje paleisti dracut" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "Išėjimo kodas buvo {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "Konfigūruojama initramfs." @@ -366,18 +341,6 @@ msgstr "Konfigūruojama initramfs." msgid "Configuring OpenRC dmcrypt service." msgstr "Konfigūruojama OpenRC dmcrypt tarnyba." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "Konfigūruojamas LUKS raktų failas." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Šifruoto rootfs sąrankos klaida" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "Rootfs skaidinys {!s} yra LUKS, tačiau nerasta jokios slaptafrazės." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Rašoma fstab." diff --git a/lang/python/mk/LC_MESSAGES/python.po b/lang/python/mk/LC_MESSAGES/python.po index b847e7f10..188a74ad9 100644 --- a/lang/python/mk/LC_MESSAGES/python.po +++ b/lang/python/mk/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Martin Ristovski , 2018\n" "Language-Team: Macedonian (https://www.transifex.com/calamares/teams/20061/mk/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -207,20 +206,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -311,18 +296,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -335,6 +308,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -343,18 +320,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/mr/LC_MESSAGES/python.po b/lang/python/mr/LC_MESSAGES/python.po index d8b4f1cac..3c570148e 100644 --- a/lang/python/mr/LC_MESSAGES/python.po +++ b/lang/python/mr/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Marathi (https://www.transifex.com/calamares/teams/20061/mr/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -307,18 +292,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -331,6 +304,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -339,18 +316,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/nb/LC_MESSAGES/python.po b/lang/python/nb/LC_MESSAGES/python.po index b9ab8b7b9..cd50bfad6 100644 --- a/lang/python/nb/LC_MESSAGES/python.po +++ b/lang/python/nb/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Tyler Moss , 2017\n" "Language-Team: Norwegian Bokmål (https://www.transifex.com/calamares/teams/20061/nb/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -207,20 +206,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -311,18 +296,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -335,6 +308,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -343,18 +320,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/ne_NP/LC_MESSAGES/python.po b/lang/python/ne_NP/LC_MESSAGES/python.po index 0f63dcd5d..0377c110f 100644 --- a/lang/python/ne_NP/LC_MESSAGES/python.po +++ b/lang/python/ne_NP/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Nepali (Nepal) (https://www.transifex.com/calamares/teams/20061/ne_NP/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -307,18 +292,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -331,6 +304,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -339,18 +316,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/nl/LC_MESSAGES/python.po b/lang/python/nl/LC_MESSAGES/python.po index eb7e6a754..0a7c305fb 100644 --- a/lang/python/nl/LC_MESSAGES/python.po +++ b/lang/python/nl/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Adriaan de Groot , 2019\n" "Language-Team: Dutch (https://www.transifex.com/calamares/teams/20061/nl/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -209,20 +208,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -313,18 +298,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -337,6 +310,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -345,18 +322,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/pl/LC_MESSAGES/python.mo b/lang/python/pl/LC_MESSAGES/python.mo index ea1d34269..79c4cbd7d 100644 Binary files a/lang/python/pl/LC_MESSAGES/python.mo and b/lang/python/pl/LC_MESSAGES/python.mo differ diff --git a/lang/python/pl/LC_MESSAGES/python.po b/lang/python/pl/LC_MESSAGES/python.po index b2cefeae6..d4b5c7ed5 100644 --- a/lang/python/pl/LC_MESSAGES/python.po +++ b/lang/python/pl/LC_MESSAGES/python.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Piotr Strębski , 2019\n" "Language-Team: Polish (https://www.transifex.com/calamares/teams/20061/pl/)\n" @@ -37,8 +37,7 @@ msgstr "Montowanie partycji." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -47,7 +46,7 @@ msgstr "Błąd konfiguracji" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -217,20 +216,6 @@ msgstr "Konfigurowanie mkinitcpio." msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Tworzenie initramfs z mkinitcpio." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "Błąd procesu" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -325,18 +310,6 @@ msgstr "Instalacja programu rozruchowego." msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "Tworzenie initramfs." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -349,6 +322,10 @@ msgstr "Tworzenie initramfs z dracut." msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "Konfigurowanie initramfs." @@ -357,18 +334,6 @@ msgstr "Konfigurowanie initramfs." msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "Konfigurowanie pliku klucza LUKS." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Zapisywanie fstab." diff --git a/lang/python/pt_BR/LC_MESSAGES/python.mo b/lang/python/pt_BR/LC_MESSAGES/python.mo index 39de8487c..a004f563d 100644 Binary files a/lang/python/pt_BR/LC_MESSAGES/python.mo and b/lang/python/pt_BR/LC_MESSAGES/python.mo differ diff --git a/lang/python/pt_BR/LC_MESSAGES/python.po b/lang/python/pt_BR/LC_MESSAGES/python.po index 9059b758f..f9630896b 100644 --- a/lang/python/pt_BR/LC_MESSAGES/python.po +++ b/lang/python/pt_BR/LC_MESSAGES/python.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Guilherme , 2019\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/calamares/teams/20061/pt_BR/)\n" @@ -36,8 +36,7 @@ msgstr "Montando partições." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -46,7 +45,7 @@ msgstr "Erro de Configuração." #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "Sem partições definidas para uso por
{!s}
." @@ -218,22 +217,6 @@ msgid "No root mount point is given for
{!s}
to use." msgstr "" "Nenhum ponto de montagem para o root fornecido para uso por
{!s}
." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Criando initramfs com mkinitcpio." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "O Processo Falhou" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"O processo
mkinitcpio
falhou com o código de erro {!s}. O comando" -" foi
{!s}
." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Configurando swap encriptada." @@ -334,18 +317,6 @@ msgstr "Instalar bootloader." msgid "Remove live user from target system" msgstr "Remover usuário live do sistema de destino" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "Criando initramfs." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "Erro ao executar update-initramfs no alvo" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "O código de saída foi {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Configurando relógio de hardware." @@ -358,6 +329,10 @@ msgstr "Criando initramfs com dracut." msgid "Failed to run dracut on the target" msgstr "Erro ao executar dracut no alvo" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "O código de saída foi {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "Configurando initramfs." @@ -366,18 +341,6 @@ msgstr "Configurando initramfs." msgid "Configuring OpenRC dmcrypt service." msgstr "Configurando serviço dmcrypt do OpenRC." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "Configurando o arquivo de chave do LUKS." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Erro de configuração de rootfs encriptado" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "A partição Rootfs {!s} é LUKS mas nenhuma frase-chave foi encontrada." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Escrevendo fstab." diff --git a/lang/python/pt_PT/LC_MESSAGES/python.mo b/lang/python/pt_PT/LC_MESSAGES/python.mo index a1760e7bd..9ac0dcef1 100644 Binary files a/lang/python/pt_PT/LC_MESSAGES/python.mo and b/lang/python/pt_PT/LC_MESSAGES/python.mo differ diff --git a/lang/python/pt_PT/LC_MESSAGES/python.po b/lang/python/pt_PT/LC_MESSAGES/python.po index 3fb39b9e6..b5ba4bfc4 100644 --- a/lang/python/pt_PT/LC_MESSAGES/python.po +++ b/lang/python/pt_PT/LC_MESSAGES/python.po @@ -5,17 +5,17 @@ # # Translators: # Nuno Amorim , 2018 -# Hugo Carvalho , 2019 # Ricardo Simões , 2019 +# Hugo Carvalho , 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Ricardo Simões , 2019\n" +"Last-Translator: Hugo Carvalho , 2019\n" "Language-Team: Portuguese (Portugal) (https://www.transifex.com/calamares/teams/20061/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -37,8 +37,7 @@ msgstr "A montar partições." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -47,7 +46,7 @@ msgstr "Erro de configuração" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "Nenhuma partição está definida para
{!s}
usar." @@ -94,7 +93,7 @@ msgstr "" #: src/modules/umount/main.py:40 msgid "Unmount file systems." -msgstr "Desmontar sistemas de ficheiro." +msgstr "Desmontar sistemas de ficheiros." #: src/modules/unpackfs/main.py:41 msgid "Filling up filesystems." @@ -147,7 +146,7 @@ msgstr "O sistema de ficheiros fonte \"{}\" não existe" #: src/modules/unpackfs/main.py:353 msgid "The destination \"{}\" in the target system is not a directory" -msgstr "O destino \"{}\" no sistema alvo não é uma diretoria" +msgstr "O destino \"{}\" no sistema de destino não é um diretório" #: src/modules/displaymanager/main.py:381 msgid "Cannot write KDM configuration file" @@ -216,25 +215,11 @@ msgstr "A configurar o mkintcpio." #: src/modules/openrcdmcryptcfg/main.py:83 src/modules/fstab/main.py:317 #: src/modules/localecfg/main.py:145 src/modules/networkcfg/main.py:49 msgid "No root mount point is given for
{!s}
to use." -msgstr "" - -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" +msgstr "Nenhum ponto de montagem root é fornecido para
{!s}
usar." #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." -msgstr "" +msgstr "Configurando a swap criptografada." #: src/modules/rawfs/main.py:35 msgid "Installing data." @@ -325,35 +310,27 @@ msgstr[1] "A remover %(num)d pacotes." #: src/modules/bootloader/main.py:51 msgid "Install bootloader." -msgstr "" +msgstr "Instalar o carregador de arranque." #: src/modules/removeuser/main.py:34 msgid "Remove live user from target system" msgstr "Remover utilizador ativo do sistema de destino" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." -msgstr "" +msgstr "A definir o relógio do hardware." #: src/modules/dracut/main.py:36 msgid "Creating initramfs with dracut." -msgstr "" +msgstr "Criando o initramfs com o dracut." #: src/modules/dracut/main.py:58 msgid "Failed to run dracut on the target" -msgstr "" +msgstr "Falha ao executar o dracut no destino" + +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "O código de saída foi {}" #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." @@ -361,23 +338,11 @@ msgstr "A configurar o initramfs." #: src/modules/openrcdmcryptcfg/main.py:34 msgid "Configuring OpenRC dmcrypt service." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" +msgstr "A configurar o serviço OpenRC dmcrypt." #: src/modules/fstab/main.py:38 msgid "Writing fstab." -msgstr "" +msgstr "A escrever o fstab." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." @@ -389,8 +354,8 @@ msgstr "Passo Dummy python {}" #: src/modules/localecfg/main.py:39 msgid "Configuring locales." -msgstr "" +msgstr "A configurar a localização." #: src/modules/networkcfg/main.py:37 msgid "Saving network configuration." -msgstr "" +msgstr "A guardar a configuração de rede." diff --git a/lang/python/ro/LC_MESSAGES/python.po b/lang/python/ro/LC_MESSAGES/python.po index d5866ca40..36a8ba3d0 100644 --- a/lang/python/ro/LC_MESSAGES/python.po +++ b/lang/python/ro/LC_MESSAGES/python.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Sebastian Brici , 2018\n" "Language-Team: Romanian (https://www.transifex.com/calamares/teams/20061/ro/)\n" @@ -36,8 +36,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -46,7 +45,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -208,20 +207,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -314,18 +299,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -338,6 +311,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -346,18 +323,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/ru/LC_MESSAGES/python.po b/lang/python/ru/LC_MESSAGES/python.po index d4198ca14..46e90df6c 100644 --- a/lang/python/ru/LC_MESSAGES/python.po +++ b/lang/python/ru/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Aleksey Kabanov , 2018\n" "Language-Team: Russian (https://www.transifex.com/calamares/teams/20061/ru/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -207,20 +206,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -315,18 +300,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -339,6 +312,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -347,18 +324,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/sk/LC_MESSAGES/python.po b/lang/python/sk/LC_MESSAGES/python.po index 955951f29..82bab4642 100644 --- a/lang/python/sk/LC_MESSAGES/python.po +++ b/lang/python/sk/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Dušan Kazik , 2018\n" "Language-Team: Slovak (https://www.transifex.com/calamares/teams/20061/sk/)\n" @@ -35,8 +35,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -207,20 +206,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -315,18 +300,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -339,6 +312,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -347,18 +324,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/sl/LC_MESSAGES/python.po b/lang/python/sl/LC_MESSAGES/python.po index 9ed9c5784..6c3f25699 100644 --- a/lang/python/sl/LC_MESSAGES/python.po +++ b/lang/python/sl/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Slovenian (https://www.transifex.com/calamares/teams/20061/sl/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -311,18 +296,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -335,6 +308,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -343,18 +320,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/sq/LC_MESSAGES/python.mo b/lang/python/sq/LC_MESSAGES/python.mo index 64347c01f..1ae01a16e 100644 Binary files a/lang/python/sq/LC_MESSAGES/python.mo and b/lang/python/sq/LC_MESSAGES/python.mo differ diff --git a/lang/python/sq/LC_MESSAGES/python.po b/lang/python/sq/LC_MESSAGES/python.po index 5ba1cbf07..2eaca42fc 100644 --- a/lang/python/sq/LC_MESSAGES/python.po +++ b/lang/python/sq/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Besnik , 2019\n" "Language-Team: Albanian (https://www.transifex.com/calamares/teams/20061/sq/)\n" @@ -35,8 +35,7 @@ msgstr "Po montohen pjesë." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "Gabim Formësimi" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "S’ka pjesë të përkufizuara për
{!s}
për t’u përdorur." @@ -216,22 +215,6 @@ msgid "No root mount point is given for
{!s}
to use." msgstr "" "S’është dhënë pikë montimi rrënjë për
{!s}
për t’u përdorur." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Po krijohet initramfs me mkinitcpio." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "Procesi Dështoi" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"Procesi
mkinitcpio
dështoi me kod gabimi {!s}. Urdhri qe " -"
{!s}
." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Po formësohet pjesë swap e fshehtëzuar." @@ -330,18 +313,6 @@ msgstr "Instalo ngarkues nisjesh." msgid "Remove live user from target system" msgstr "Hiq përdoruesin live nga sistemi i synuar" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "Po krijohet initramfs." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "S’u arrit të xhirohej update-initramfs mbi objektivin" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "Kodi i daljes qe {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Po caktohet ora hardware." @@ -354,6 +325,10 @@ msgstr "Po krijohet initramfs me dracut." msgid "Failed to run dracut on the target" msgstr "S’u arrit të xhirohej dracut mbi objektivin" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "Kodi i daljes qe {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "Po formësohet initramfs." @@ -362,18 +337,6 @@ msgstr "Po formësohet initramfs." msgid "Configuring OpenRC dmcrypt service." msgstr "Po formësohet shërbim OpenRC dmcrypt." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "Po formësohet kartelë kyçesh LUKS." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Gabim ujdisjeje rootfs të fshehtëzuar" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "Pjesa rootfs {!s} është LUKS, por s’u gjet frazëkalim." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Po shkruhet fstab." diff --git a/lang/python/sr/LC_MESSAGES/python.po b/lang/python/sr/LC_MESSAGES/python.po index ed037af81..7ee71668a 100644 --- a/lang/python/sr/LC_MESSAGES/python.po +++ b/lang/python/sr/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Slobodan Simić , 2019\n" "Language-Team: Serbian (https://www.transifex.com/calamares/teams/20061/sr/)\n" @@ -35,8 +35,7 @@ msgstr "Монтирање партиција." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "Грешка поставе" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -207,20 +206,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -313,18 +298,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -337,6 +310,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -345,18 +322,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Уписивање fstab." diff --git a/lang/python/sr@latin/LC_MESSAGES/python.po b/lang/python/sr@latin/LC_MESSAGES/python.po index 1f08cddfd..74c8f2782 100644 --- a/lang/python/sr@latin/LC_MESSAGES/python.po +++ b/lang/python/sr@latin/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Serbian (Latin) (https://www.transifex.com/calamares/teams/20061/sr@latin/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -309,18 +294,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -333,6 +306,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -341,18 +318,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/sv/LC_MESSAGES/python.po b/lang/python/sv/LC_MESSAGES/python.po index f618e8767..1e83eabe8 100644 --- a/lang/python/sv/LC_MESSAGES/python.po +++ b/lang/python/sv/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Swedish (https://www.transifex.com/calamares/teams/20061/sv/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -307,18 +292,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -331,6 +304,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -339,18 +316,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/th/LC_MESSAGES/python.po b/lang/python/th/LC_MESSAGES/python.po index e584eb538..a41b2ac35 100644 --- a/lang/python/th/LC_MESSAGES/python.po +++ b/lang/python/th/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Thai (https://www.transifex.com/calamares/teams/20061/th/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -305,18 +290,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -329,6 +302,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -337,18 +314,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/tr_TR/LC_MESSAGES/python.mo b/lang/python/tr_TR/LC_MESSAGES/python.mo index 1e461e370..1197e1a65 100644 Binary files a/lang/python/tr_TR/LC_MESSAGES/python.mo and b/lang/python/tr_TR/LC_MESSAGES/python.mo differ diff --git a/lang/python/tr_TR/LC_MESSAGES/python.po b/lang/python/tr_TR/LC_MESSAGES/python.po index d61c4cc2b..1167251a8 100644 --- a/lang/python/tr_TR/LC_MESSAGES/python.po +++ b/lang/python/tr_TR/LC_MESSAGES/python.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Demiray Muhterem , 2019\n" "Language-Team: Turkish (Turkey) (https://www.transifex.com/calamares/teams/20061/tr_TR/)\n" @@ -35,8 +35,7 @@ msgstr "Disk bölümleri bağlanıyor." #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "Yapılandırma Hatası" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "
{!s}
kullanması için hiçbir bölüm tanımlanmadı." @@ -215,22 +214,6 @@ msgstr "Mkinitcpio yapılandırılıyor." msgid "No root mount point is given for
{!s}
to use." msgstr "
{!s}
kullanması için kök bağlama noktası verilmedi." -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "Mkinitcpio ile initramfs oluşturuluyor." - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "İşlem Başarısız" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" -"
Mkinitcpio
işlemi {!s} hata koduyla başarısız oldu. Komut " -"
{!s}
idi." - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "Şifreli takas alanı yapılandırılıyor." @@ -325,18 +308,6 @@ msgstr "Önyükleyici kur." msgid "Remove live user from target system" msgstr "Liveuser kullanıcısını hedef sistemden kaldırın" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "Initramfs oluşturuluyor." - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "update-initramfs hedefte çalıştırılamadı" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "Çıkış kodu {} idi" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "Donanım saati ayarlanıyor." @@ -349,6 +320,10 @@ msgstr "Dracut ile initramfs oluşturuluyor." msgid "Failed to run dracut on the target" msgstr "Hedef üzerinde dracut çalıştırılamadı" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "Çıkış kodu {} idi" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "Initramfs yapılandırılıyor." @@ -357,18 +332,6 @@ msgstr "Initramfs yapılandırılıyor." msgid "Configuring OpenRC dmcrypt service." msgstr "OpenRC dmcrypt servisi yapılandırılıyor." -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "LUKS anahtar dosyası yapılandırılıyor." - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "Şifrelenmiş rootfs kurulum hatası" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "Rootfs disk bölümü {!s} LUKS, fakat parola bulunamadı." - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "Fstab dosyasına yazılıyor." diff --git a/lang/python/uk/LC_MESSAGES/python.po b/lang/python/uk/LC_MESSAGES/python.po index 47033db11..98788d9c3 100644 --- a/lang/python/uk/LC_MESSAGES/python.po +++ b/lang/python/uk/LC_MESSAGES/python.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: Paul S , 2019\n" "Language-Team: Ukrainian (https://www.transifex.com/calamares/teams/20061/uk/)\n" @@ -36,8 +36,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -46,7 +45,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -214,20 +213,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -322,18 +307,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -346,6 +319,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -354,18 +331,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/ur/LC_MESSAGES/python.po b/lang/python/ur/LC_MESSAGES/python.po index b4415d41c..48d98d4dd 100644 --- a/lang/python/ur/LC_MESSAGES/python.po +++ b/lang/python/ur/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Urdu (https://www.transifex.com/calamares/teams/20061/ur/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -307,18 +292,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -331,6 +304,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -339,18 +316,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/uz/LC_MESSAGES/python.po b/lang/python/uz/LC_MESSAGES/python.po index 415882529..f174f0ce5 100644 --- a/lang/python/uz/LC_MESSAGES/python.po +++ b/lang/python/uz/LC_MESSAGES/python.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Language-Team: Uzbek (https://www.transifex.com/calamares/teams/20061/uz/)\n" "MIME-Version: 1.0\n" @@ -31,8 +31,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -41,7 +40,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -203,20 +202,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -305,18 +290,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -329,6 +302,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -337,18 +314,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/zh_CN/LC_MESSAGES/python.po b/lang/python/zh_CN/LC_MESSAGES/python.po index eae99810e..a7760096f 100644 --- a/lang/python/zh_CN/LC_MESSAGES/python.po +++ b/lang/python/zh_CN/LC_MESSAGES/python.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" "Last-Translator: leonfeng , 2018\n" "Language-Team: Chinese (China) (https://www.transifex.com/calamares/teams/20061/zh_CN/)\n" @@ -37,8 +37,7 @@ msgstr "" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -47,7 +46,7 @@ msgstr "" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "" @@ -209,20 +208,6 @@ msgstr "" msgid "No root mount point is given for
{!s}
to use." msgstr "" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "" @@ -311,18 +296,6 @@ msgstr "" msgid "Remove live user from target system" msgstr "" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "" @@ -335,6 +308,10 @@ msgstr "" msgid "Failed to run dracut on the target" msgstr "" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "" @@ -343,18 +320,6 @@ msgstr "" msgid "Configuring OpenRC dmcrypt service." msgstr "" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "" diff --git a/lang/python/zh_TW/LC_MESSAGES/python.mo b/lang/python/zh_TW/LC_MESSAGES/python.mo index 54b7a3555..d1525888b 100644 Binary files a/lang/python/zh_TW/LC_MESSAGES/python.mo and b/lang/python/zh_TW/LC_MESSAGES/python.mo differ diff --git a/lang/python/zh_TW/LC_MESSAGES/python.po b/lang/python/zh_TW/LC_MESSAGES/python.po index 061367581..883246529 100644 --- a/lang/python/zh_TW/LC_MESSAGES/python.po +++ b/lang/python/zh_TW/LC_MESSAGES/python.po @@ -4,16 +4,16 @@ # FIRST AUTHOR , YEAR. # # Translators: -# Jeff Huang , 2019 +# 黃柏諺 , 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-18 15:54+0200\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Jeff Huang , 2019\n" +"Last-Translator: 黃柏諺 , 2019\n" "Language-Team: Chinese (Taiwan) (https://www.transifex.com/calamares/teams/20061/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -35,8 +35,7 @@ msgstr "正在掛載分割區。" #: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:171 #: src/modules/machineid/main.py:49 src/modules/initramfscfg/main.py:94 #: src/modules/initramfscfg/main.py:98 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 -#: src/modules/luksbootkeyfile/main.py:51 src/modules/fstab/main.py:312 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:312 #: src/modules/fstab/main.py:316 src/modules/localecfg/main.py:144 #: src/modules/networkcfg/main.py:48 msgid "Configuration Error" @@ -45,7 +44,7 @@ msgstr "設定錯誤" #: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:188 #: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:172 #: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/luksbootkeyfile/main.py:52 src/modules/fstab/main.py:313 +#: src/modules/fstab/main.py:313 msgid "No partitions are defined for
{!s}
to use." msgstr "沒有分割區被定義為
{!s}
以供使用。" @@ -209,20 +208,6 @@ msgstr "正在設定 mkinitcpio。" msgid "No root mount point is given for
{!s}
to use." msgstr "沒有給定的根掛載點
{!s}
以供使用。" -#: src/modules/initcpio/main.py:33 -msgid "Creating initramfs with mkinitcpio." -msgstr "正在使用 mkinitcpio 建立 initramfs。" - -#: src/modules/initcpio/main.py:47 -msgid "Process Failed" -msgstr "處理失敗" - -#: src/modules/initcpio/main.py:48 -msgid "" -"Process
mkinitcpio
failed with error code {!s}. The command was " -"
{!s}
." -msgstr "處理程序
mkinitcpio
帶著錯誤代碼 {!s} 失敗。指令為
{!s}
。" - #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." msgstr "正在設定已加密的 swap。" @@ -311,18 +296,6 @@ msgstr "安裝開機載入程式。" msgid "Remove live user from target system" msgstr "從目標系統移除 live 使用者" -#: src/modules/initramfs/main.py:35 -msgid "Creating initramfs." -msgstr "正在建立 initramfs。" - -#: src/modules/initramfs/main.py:49 -msgid "Failed to run update-initramfs on the target" -msgstr "在目標上執行 update-initramfs 失敗" - -#: src/modules/initramfs/main.py:50 src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "結束碼為 {}" - #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." msgstr "正在設定硬體時鐘。" @@ -335,6 +308,10 @@ msgstr "正在使用 dracut 建立 initramfs。" msgid "Failed to run dracut on the target" msgstr "在目標上執行 dracut 失敗" +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "結束碼為 {}" + #: src/modules/initramfscfg/main.py:41 msgid "Configuring initramfs." msgstr "正在設定 initramfs。" @@ -343,18 +320,6 @@ msgstr "正在設定 initramfs。" msgid "Configuring OpenRC dmcrypt service." msgstr "正在設定 OpenRC dmcrypt 服務。" -#: src/modules/luksbootkeyfile/main.py:35 -msgid "Configuring LUKS key file." -msgstr "正在設定 LUKS 金鑰檔案。" - -#: src/modules/luksbootkeyfile/main.py:74 -msgid "Encrypted rootfs setup error" -msgstr "已加密的 rootfs 設定錯誤" - -#: src/modules/luksbootkeyfile/main.py:75 -msgid "Rootfs partition {!s} is LUKS but no passphrase found." -msgstr "Rootfs 分割區 {!s} 是 LUKS 但找不到通關密語。" - #: src/modules/fstab/main.py:38 msgid "Writing fstab." msgstr "正在寫入 fstab。" diff --git a/settings.conf b/settings.conf index 3d2ce4b93..d13963c24 100644 --- a/settings.conf +++ b/settings.conf @@ -86,38 +86,38 @@ modules-search: [ local ] # YAML: list of lists of strings. sequence: - show: - - welcome - - locale - - keyboard - - partition - - users - - summary + - welcome + - locale + - keyboard + - partition + - users + - summary - exec: - - partition - - mount - - unpackfs - - machineid - - fstab - - locale - - keyboard - - localecfg - - luksopenswaphookcfg - - luksbootkeyfile - - plymouthcfg - - initcpiocfg - - initcpio - - users - - displaymanager - - mhwdcfg - - networkcfg - - hwclock - - services-systemd - - grubcfg - - bootloader - - postcfg - - umount + - partition + - mount + - unpackfs + - machineid + - fstab + - locale + - keyboard + - localecfg + - luksopenswaphookcfg + - luksbootkeyfile + - plymouthcfg + - initcpiocfg + - initcpio + - users + - displaymanager + - mhwdcfg + - networkcfg + - hwclock + - services-systemd + - grubcfg + - bootloader + - postcfg + - umount - show: - - finished + - finished # A branding component is a directory, either in SHARE/calamares/branding or # in /etc/calamares/branding (the latter takes precedence). The directory must diff --git a/src/branding/README.md b/src/branding/README.md index 1b9eb57fd..099163836 100644 --- a/src/branding/README.md +++ b/src/branding/README.md @@ -66,6 +66,16 @@ The setting *slideshowAPI* in `branding.desc` indicates which one to use for a given branding slideshow. Which API to use is really a function of the QML. Expect the version 1 API to be deprecated in the course of Calamares 3.3. +In Calamares 3.2.13 support for activation notification to the QML +parts is improved: + - If the root object has a property *activatedInCalamares* (the examples do), + then that property is set to *true* when the slideshow becomes visible + (activated) and is set to *false* when the slideshow is hidden (e.g. + when the installation phase is done). + - The *actvatedInCalamares* property can be used to set up timers also in V1. + - The keyboard shortcuts in the example slideshow are enabled only while + the slideshow is visible. + ## Translations diff --git a/src/branding/default/branding.desc b/src/branding/default/branding.desc index 1bd76cd29..5d9b29c69 100644 --- a/src/branding/default/branding.desc +++ b/src/branding/default/branding.desc @@ -56,6 +56,10 @@ windowSize: 800px,520px # Note that ANSI_COLOR and CPE_NAME don't make sense here, and # are not supported (the rest are). Remember to quote the string # if it contains substitutions, or you'll get YAML exceptions. +# +# The *Url* entries are used on the welcome page, and they +# are visible as buttons there if the corresponding *show* keys +# are set to "true" (they can also be overridden). strings: productName: "@{NAME}" shortProductName: Generic @@ -84,7 +88,7 @@ strings: # the window. Use `welcomeExpandingLogo` to make it non-scaled. # Recommended size is 320x150. # -# These strings can also use substitutions from os-release (see above). +# These filenames can also use substitutions from os-release (see above). images: productLogo: "squid.png" productIcon: "squid.png" diff --git a/src/branding/default/lang/calamares-default_ar.ts b/src/branding/default/lang/calamares-default_ar.ts index 05463dd72..3c4fe0933 100644 --- a/src/branding/default/lang/calamares-default_ar.ts +++ b/src/branding/default/lang/calamares-default_ar.ts @@ -1,6 +1,6 @@ - + show @@ -11,7 +11,7 @@ This is a third Slide element. - عرض الثالث + عرض الثالث diff --git a/src/branding/default/lang/calamares-default_en.ts b/src/branding/default/lang/calamares-default_en.ts index 30474fc02..b02dbd5b1 100644 --- a/src/branding/default/lang/calamares-default_en.ts +++ b/src/branding/default/lang/calamares-default_en.ts @@ -1,6 +1,6 @@ - + show diff --git a/src/branding/default/lang/calamares-default_eo.ts b/src/branding/default/lang/calamares-default_eo.ts new file mode 100644 index 000000000..7d1ef4e82 --- /dev/null +++ b/src/branding/default/lang/calamares-default_eo.ts @@ -0,0 +1,17 @@ + + + + + show + + + This is a second Slide element. + Ĉi tio estas la dua gliteja. + + + + This is a third Slide element. + Ĉi tio estas la tria gliteja. + + + diff --git a/src/branding/default/lang/calamares-default_fr.ts b/src/branding/default/lang/calamares-default_fr.ts index 9329e61ee..ec5e0411a 100644 --- a/src/branding/default/lang/calamares-default_fr.ts +++ b/src/branding/default/lang/calamares-default_fr.ts @@ -1,6 +1,6 @@ - + show @@ -11,7 +11,7 @@ This is a third Slide element. - La troisième affice ce trouve ici. + La troisième affice ce trouve ici. diff --git a/src/branding/default/lang/calamares-default_nl.ts b/src/branding/default/lang/calamares-default_nl.ts index aad00eaf7..19fd58361 100644 --- a/src/branding/default/lang/calamares-default_nl.ts +++ b/src/branding/default/lang/calamares-default_nl.ts @@ -11,7 +11,7 @@ This is a third Slide element. - Dit is het derde Dia element. + Dit is het derde Dia element. diff --git a/src/branding/default/show.qml b/src/branding/default/show.qml index c989676dd..dcb0f9257 100644 --- a/src/branding/default/show.qml +++ b/src/branding/default/show.qml @@ -25,14 +25,14 @@ Presentation id: presentation function nextSlide() { - console.log("Next slide"); + console.log("QML Component (default slideshow) Next slide"); presentation.goToNextSlide(); } Timer { id: advanceTimer interval: 1000 - running: false + running: presentation.activatedInCalamares repeat: true onTriggered: nextSlide() } @@ -68,9 +68,19 @@ Presentation centeredText: qsTr("This is a third Slide element.") } + // When this slideshow is loaded as a V1 slideshow, only + // activatedInCalamares is set, which starts the timer (see above). + // + // In V2, also the onActivate() and onLeave() methods are called. + // These example functions log a message (and re-start the slides + // from the first). function onActivate() { - presentation.currentSlide = 0; - advanceTimer.running = true console.log("QML Component (default slideshow) activated"); + presentation.currentSlide = 0; } + + function onLeave() { + console.log("QML Component (default slideshow) deactivated"); + } + } diff --git a/src/calamares/CMakeLists.txt b/src/calamares/CMakeLists.txt index 5159916e8..a55e26b6d 100644 --- a/src/calamares/CMakeLists.txt +++ b/src/calamares/CMakeLists.txt @@ -5,6 +5,9 @@ set( calamaresSources CalamaresApplication.cpp CalamaresWindow.cpp + DebugWindow.cpp + VariantModel.cpp + progresstree/ProgressTreeDelegate.cpp progresstree/ProgressTreeItem.cpp progresstree/ProgressTreeModel.cpp @@ -17,8 +20,9 @@ include_directories( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/../libcalamares - ../libcalamares - ../libcalamaresui + ${CMAKE_SOURCE_DIR}/src/libcalamares + ${CMAKE_SOURCE_DIR}/src//libcalamaresui + ${CMAKE_SOURCE_DIR} ) # Translations @@ -34,6 +38,7 @@ set_target_properties(calamares_bin RUNTIME_OUTPUT_NAME calamares ) calamares_automoc( calamares_bin ) +calamares_autouic( calamares_bin ) target_link_libraries( calamares_bin PRIVATE @@ -41,11 +46,11 @@ target_link_libraries( calamares_bin calamaresui Qt5::Core Qt5::Widgets + KF5::CoreAddons ) if( WITH_KF5Crash ) target_link_libraries( calamares_bin PRIVATE - KF5::CoreAddons KF5::Crash ) target_compile_definitions( calamares_bin PRIVATE WITH_KF5Crash ) diff --git a/src/calamares/CalamaresVersion.h.in b/src/calamares/CalamaresVersion.h.in index 13a8c9e2e..4ac7ee1d1 100644 --- a/src/calamares/CalamaresVersion.h.in +++ b/src/calamares/CalamaresVersion.h.in @@ -14,4 +14,4 @@ #cmakedefine CALAMARES_TRANSLATION_LANGUAGES "${CALAMARES_TRANSLATION_LANGUAGES}" -#endif // CALAMARES_VERSION_H +#endif // CALAMARES_VERSION_H diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index d80b6cb67..ac00bafd4 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -22,11 +22,11 @@ #include "CalamaresWindow.h" #include "Branding.h" +#include "DebugWindow.h" #include "Settings.h" #include "ViewManager.h" #include "progresstree/ProgressTreeView.h" #include "utils/CalamaresUtilsGui.h" -#include "utils/DebugWindow.h" #include "utils/Logger.h" #include "utils/Retranslator.h" @@ -48,11 +48,11 @@ windowDimensionToPixels( const Calamares::Branding::WindowDimension& u ) } if ( u.unit() == Calamares::Branding::WindowDimensionUnit::Pixies ) { - return u.value(); + return static_cast< int >( u.value() ); } if ( u.unit() == Calamares::Branding::WindowDimensionUnit::Fonties ) { - return u.value() * CalamaresUtils::defaultFontHeight(); + return static_cast< int >( u.value() * CalamaresUtils::defaultFontHeight() ); } return 0; } diff --git a/src/libcalamaresui/utils/DebugWindow.cpp b/src/calamares/DebugWindow.cpp similarity index 58% rename from src/libcalamaresui/utils/DebugWindow.cpp rename to src/calamares/DebugWindow.cpp index ed016dd97..6891851a7 100644 --- a/src/libcalamaresui/utils/DebugWindow.cpp +++ b/src/calamares/DebugWindow.cpp @@ -20,10 +20,11 @@ #include "DebugWindow.h" #include "ui_DebugWindow.h" +#include "VariantModel.h" + #include "Branding.h" #include "modulesystem/Module.h" #include "modulesystem/ModuleManager.h" -#include "utils/qjsonmodel.h" #include "GlobalStorage.h" #include "Job.h" @@ -31,17 +32,17 @@ #include "utils/Logger.h" #include "utils/Retranslator.h" - #ifdef WITH_PYTHONQT -#include #include "ViewManager.h" #include "viewpages/PythonQtViewStep.h" + +#include #endif -#include #include #include #include +#include /** * @brief crash makes Calamares crash immediately. @@ -54,50 +55,56 @@ crash() } /// @brief Print out the widget tree (names) in indented form. -static void dumpWidgetTree( QDebug& deb, const QWidget* widget, int depth ) +static void +dumpWidgetTree( QDebug& deb, const QWidget* widget, int depth ) { if ( !widget ) + { return; + } deb << Logger::Continuation; - for (int i = 0; i < depth; ++i ) + for ( int i = 0; i < depth; ++i ) + { deb << ' '; + } deb << widget->objectName(); - for ( const auto* w : widget->findChildren( QString(), Qt::FindDirectChildrenOnly ) ) - dumpWidgetTree( deb, w, depth+1 ); + for ( const auto* w : widget->findChildren< QWidget* >( QString(), Qt::FindDirectChildrenOnly ) ) + { + dumpWidgetTree( deb, w, depth + 1 ); + } } -namespace Calamares { +namespace Calamares +{ DebugWindow::DebugWindow() : QWidget( nullptr ) , m_ui( new Ui::DebugWindow ) + , m_globals( JobQueue::instance()->globalStorage()->data() ) + , m_globals_model( std::make_unique< VariantModel >( &m_globals ) ) + , m_module_model( std::make_unique< VariantModel >( &m_module ) ) { - m_ui->setupUi( this ); - - // GlobalStorage page - QJsonModel* jsonModel = new QJsonModel( this ); - - m_ui->globalStorageView->setModel( jsonModel ); GlobalStorage* gs = JobQueue::instance()->globalStorage(); - connect( gs, &GlobalStorage::changed, - this, [ = ] - { - jsonModel->loadJson( QJsonDocument::fromVariant( gs->m ).toJson() ); + m_ui->setupUi( this ); + + m_ui->globalStorageView->setModel( m_globals_model.get() ); + m_ui->globalStorageView->expandAll(); + + // Do above when the GS changes, too + connect( gs, &GlobalStorage::changed, this, [=] { + m_globals = JobQueue::instance()->globalStorage()->data(); + m_globals_model->reload(); m_ui->globalStorageView->expandAll(); } ); - jsonModel->loadJson( QJsonDocument::fromVariant( gs->m ).toJson() ); - m_ui->globalStorageView->expandAll(); // JobQueue page m_ui->jobQueueText->setReadOnly( true ); - connect( JobQueue::instance(), &JobQueue::queueChanged, - this, [ this ]( const JobList& jobs ) - { + connect( JobQueue::instance(), &JobQueue::queueChanged, this, [this]( const JobList& jobs ) { QStringList text; - for ( const auto &job : jobs ) + for ( const auto& job : jobs ) { text.append( job->prettyName() ); } @@ -110,8 +117,7 @@ DebugWindow::DebugWindow() m_ui->modulesListView->setModel( modulesModel ); m_ui->modulesListView->setSelectionMode( QAbstractItemView::SingleSelection ); - QJsonModel* moduleConfigModel = new QJsonModel( this ); - m_ui->moduleConfigView->setModel( moduleConfigModel ); + m_ui->moduleConfigView->setModel( m_module_model.get() ); #ifdef WITH_PYTHONQT QPushButton* pythonConsoleButton = new QPushButton; @@ -119,21 +125,17 @@ DebugWindow::DebugWindow() m_ui->modulesVerticalLayout->insertWidget( 1, pythonConsoleButton ); pythonConsoleButton->hide(); - QObject::connect( pythonConsoleButton, &QPushButton::clicked, - this, [ this, moduleConfigModel ] - { + QObject::connect( pythonConsoleButton, &QPushButton::clicked, this, [this, moduleConfigModel] { QString moduleName = m_ui->modulesListView->currentIndex().data().toString(); Module* module = ModuleManager::instance()->moduleInstance( moduleName ); - if ( module->interface() != Module::Interface::PythonQt || - module->type() != Module::Type::View ) + if ( module->interface() != Module::Interface::PythonQt || module->type() != Module::Type::View ) return; for ( ViewStep* step : ViewManager::instance()->viewSteps() ) { if ( step->moduleInstanceKey() == module->instanceKey() ) { - PythonQtViewStep* pqvs = - qobject_cast< PythonQtViewStep* >( step ); + PythonQtViewStep* pqvs = qobject_cast< PythonQtViewStep* >( step ); if ( pqvs ) { QWidget* consoleWindow = new QWidget; @@ -150,23 +152,17 @@ DebugWindow::DebugWindow() QLabel* bottomLabel = new QLabel( consoleWindow ); bottomLayout->addWidget( bottomLabel ); - QString line = - QString( "Module: %1
" - "Python class: %2" ) - .arg( module->instanceKey() ) - .arg( console->property( "classname" ).toString() ); + QString line = QString( "Module: %1
" + "Python class: %2" ) + .arg( module->instanceKey() ) + .arg( console->property( "classname" ).toString() ); bottomLabel->setText( line ); QPushButton* closeButton = new QPushButton( consoleWindow ); closeButton->setText( "&Close" ); - QObject::connect( closeButton, &QPushButton::clicked, - [ consoleWindow ] - { - consoleWindow->close(); - } ); + QObject::connect( closeButton, &QPushButton::clicked, [consoleWindow] { consoleWindow->close(); } ); bottomLayout->addWidget( closeButton ); - bottomLabel->setSizePolicy( QSizePolicy::Expanding, - QSizePolicy::Preferred ); + bottomLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); consoleWindow->setParent( this ); consoleWindow->setWindowFlags( Qt::Window ); @@ -181,57 +177,52 @@ DebugWindow::DebugWindow() #endif - connect( m_ui->modulesListView->selectionModel(), &QItemSelectionModel::selectionChanged, - this, [ this, moduleConfigModel + connect( m_ui->modulesListView->selectionModel(), + &QItemSelectionModel::selectionChanged, + this, + [this #ifdef WITH_PYTHONQT - , pythonConsoleButton + , + pythonConsoleButton #endif - ] - { - QString moduleName = m_ui->modulesListView->currentIndex().data().toString(); - Module* module = ModuleManager::instance()->moduleInstance( moduleName ); - if ( module ) - { - moduleConfigModel->loadJson( QJsonDocument::fromVariant( module->configurationMap() ).toJson() ); - m_ui->moduleConfigView->expandAll(); - m_ui->moduleTypeLabel->setText( module->typeString() ); - m_ui->moduleInterfaceLabel->setText( module->interfaceString() ); + ] { + QString moduleName = m_ui->modulesListView->currentIndex().data().toString(); + Module* module = ModuleManager::instance()->moduleInstance( moduleName ); + if ( module ) + { + m_module = module->configurationMap(); + m_module_model->reload(); + m_ui->moduleConfigView->expandAll(); + m_ui->moduleTypeLabel->setText( module->typeString() ); + m_ui->moduleInterfaceLabel->setText( module->interfaceString() ); #ifdef WITH_PYTHONQT - pythonConsoleButton->setVisible( - module->interface() == Module::Interface::PythonQt && - module->type() == Module::Type::View ); + pythonConsoleButton->setVisible( module->interface() == Module::Interface::PythonQt + && module->type() == Module::Type::View ); #endif - } - } ); + } + } ); // Tools page connect( m_ui->crashButton, &QPushButton::clicked, this, [] { ::crash(); } ); - connect( m_ui->reloadStylesheetButton, &QPushButton::clicked, - []() - { - for ( auto* w : qApp->topLevelWidgets() ) - { - // Needs to match what's set in CalamaresWindow - if ( w->objectName() == QStringLiteral( "mainApp" ) ) - { - w->setStyleSheet( Calamares::Branding::instance()->stylesheet() ); - } - } - }); - connect( m_ui->widgetTreeButton, &QPushButton::clicked, - []() - { - for ( auto* w : qApp->topLevelWidgets() ) - { - Logger::CDebug deb; - dumpWidgetTree( deb, w, 0 ); - } - }); + connect( m_ui->reloadStylesheetButton, &QPushButton::clicked, []() { + for ( auto* w : qApp->topLevelWidgets() ) + { + // Needs to match what's set in CalamaresWindow + if ( w->objectName() == QStringLiteral( "mainApp" ) ) + { + w->setStyleSheet( Calamares::Branding::instance()->stylesheet() ); + } + } + } ); + connect( m_ui->widgetTreeButton, &QPushButton::clicked, []() { + for ( auto* w : qApp->topLevelWidgets() ) + { + Logger::CDebug deb; + dumpWidgetTree( deb, w, 0 ); + } + } ); - CALAMARES_RETRANSLATE( - m_ui->retranslateUi( this ); - setWindowTitle( tr( "Debug information" ) ); - ) + CALAMARES_RETRANSLATE( m_ui->retranslateUi( this ); setWindowTitle( tr( "Debug information" ) ); ) } @@ -242,4 +233,4 @@ DebugWindow::closeEvent( QCloseEvent* e ) emit closed(); } -} // namespace Calamares +} // namespace Calamares diff --git a/src/libcalamaresui/utils/DebugWindow.h b/src/calamares/DebugWindow.h similarity index 78% rename from src/libcalamaresui/utils/DebugWindow.h rename to src/calamares/DebugWindow.h index e97f5727b..764a141c2 100644 --- a/src/libcalamaresui/utils/DebugWindow.h +++ b/src/calamares/DebugWindow.h @@ -20,15 +20,20 @@ #ifndef CALAMARES_DEBUGWINDOW_H #define CALAMARES_DEBUGWINDOW_H +#include "VariantModel.h" + +#include #include +#include -namespace Calamares { +namespace Calamares +{ // From the .ui file namespace Ui { - class DebugWindow; +class DebugWindow; } class DebugWindow : public QWidget @@ -45,9 +50,13 @@ protected: void closeEvent( QCloseEvent* e ) override; private: - Ui::DebugWindow *m_ui; + Ui::DebugWindow* m_ui; + QVariant m_globals; + QVariant m_module; + std::unique_ptr< VariantModel > m_globals_model; + std::unique_ptr< VariantModel > m_module_model; }; -} // namespace +} // namespace Calamares #endif diff --git a/src/libcalamaresui/utils/DebugWindow.ui b/src/calamares/DebugWindow.ui similarity index 100% rename from src/libcalamaresui/utils/DebugWindow.ui rename to src/calamares/DebugWindow.ui diff --git a/src/calamares/VariantModel.cpp b/src/calamares/VariantModel.cpp new file mode 100644 index 000000000..2d8313665 --- /dev/null +++ b/src/calamares/VariantModel.cpp @@ -0,0 +1,280 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "VariantModel.h" + +static void +overallLength( const QVariant& item, quintptr& c, quintptr parent, VariantModel::IndexVector* skiplist ) +{ + if ( skiplist ) + { + skiplist->append( parent ); + } + + parent = c++; + if ( item.canConvert< QVariantList >() ) + { + for ( const auto& subitem : item.toList() ) + { + overallLength( subitem, c, parent, skiplist ); + } + } + else if ( item.canConvert< QVariantMap >() ) + { + for ( const auto& subitem : item.toMap() ) + { + overallLength( subitem, c, parent, skiplist ); + } + } +} + +static quintptr +findNth( const VariantModel::IndexVector& skiplist, quintptr value, int n ) +{ + constexpr const quintptr invalid_index = static_cast< quintptr >( -1 ); + + if ( n < 0 ) + { + return invalid_index; + } + + int index = static_cast< int >( value ); + while ( ( n >= 0 ) && ( index < skiplist.count() ) ) + { + if ( skiplist[ index ] == value ) + { + if ( --n < 0 ) + { + // It's bigger than 0 + return static_cast< quintptr >( index ); + } + } + index++; + } + return invalid_index; +} + + +VariantModel::VariantModel( const QVariant* p ) + : m_p( p ) +{ + reload(); +} + +VariantModel::~VariantModel() {} + +void +VariantModel::reload() +{ + constexpr const quintptr invalid_index = static_cast< quintptr >( -1 ); + + quintptr x = 0; + m_rows.clear(); // Start over + if ( m_rows.capacity() < 64 ) + { + m_rows.reserve( 64 ); // Start reasonably-sized + } + overallLength( *m_p, x, invalid_index, &m_rows ); +} + +int +VariantModel::columnCount( const QModelIndex& ) const +{ + return 2; +} + +int +VariantModel::rowCount( const QModelIndex& index ) const +{ + quintptr p = index.isValid() ? index.internalId() : 0; + return m_rows.count( p ); +} + +QModelIndex +VariantModel::index( int row, int column, const QModelIndex& parent ) const +{ + quintptr p = 0; + + if ( parent.isValid() ) + { + if ( inRange( parent ) ) + { + p = parent.internalId(); + } + } + + return createIndex( row, column, findNth( m_rows, p, row ) ); +} + +static inline quintptr +deref( const VariantModel::IndexVector& v, quintptr i ) +{ + return v[ static_cast< int >( i ) ]; +} + +QModelIndex +VariantModel::parent( const QModelIndex& index ) const +{ + if ( !index.isValid() || !inRange( index ) ) + { + return QModelIndex(); + } + + quintptr p = deref( m_rows, index.internalId() ); + if ( p == 0 ) + { + return QModelIndex(); + } + + if ( !inRange( p ) ) + { + return QModelIndex(); + } + quintptr p_pid = deref( m_rows, p ); + int row = 0; + for ( int i = static_cast< int >( p_pid ); i < static_cast< int >( p ); ++i ) + { + if ( m_rows[ i ] == p_pid ) + { + row++; + } + } + + return createIndex( row, index.column(), p ); +} + +QVariant +VariantModel::data( const QModelIndex& index, int role ) const +{ + if ( role != Qt::DisplayRole ) + { + return QVariant(); + } + + if ( !index.isValid() ) + { + return QVariant(); + } + + if ( ( index.column() < 0 ) || ( index.column() > 1 ) ) + { + return QVariant(); + } + + if ( !inRange( index ) ) + { + return QVariant(); + } + + const QVariant thing = underlying( parent( index ) ); + + if ( !thing.isValid() ) + { + return QVariant(); + } + + if ( thing.canConvert< QVariantMap >() ) + { + QVariantMap the_map = thing.toMap(); + const auto key = the_map.keys().at( index.row() ); + if ( index.column() == 0 ) + { + return key; + } + else + { + return the_map[ key ]; + } + } + else if ( thing.canConvert< QVariantList >() ) + { + if ( index.column() == 0 ) + { + return index.row(); + } + else + { + QVariantList the_list = thing.toList(); + return the_list.at( index.row() ); + } + } + else + { + if ( index.column() == 0 ) + { + return QVariant(); + } + else + { + return thing; + } + } +} + +QVariant +VariantModel::headerData( int section, Qt::Orientation orientation, int role ) const +{ + if ( role != Qt::DisplayRole ) + { + return QVariant(); + } + + if ( orientation == Qt::Horizontal ) + { + if ( section == 0 ) + { + return tr( "Key" ); + } + else if ( section == 1 ) + { + return tr( "Value" ); + } + else + { + return QVariant(); + } + } + else + { + return QVariant(); + } +} + +const QVariant +VariantModel::underlying( const QModelIndex& index ) const +{ + if ( !index.isValid() ) + { + return *m_p; + } + + const auto& thing = underlying( parent( index ) ); + if ( thing.canConvert< QVariantMap >() ) + { + const auto& the_map = thing.toMap(); + return the_map[ the_map.keys()[ index.row() ] ]; + } + else if ( thing.canConvert< QVariantList >() ) + { + return thing.toList()[ index.row() ]; + } + else + { + return thing; + } +} diff --git a/src/calamares/VariantModel.h b/src/calamares/VariantModel.h new file mode 100644 index 000000000..bdf6da866 --- /dev/null +++ b/src/calamares/VariantModel.h @@ -0,0 +1,112 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef VARIANTMODEL_H +#define VARIANTMODEL_H + +#include +#include +#include + +/** @brief A model that operates directly on a QVariant + * + * A VariantModel operates directly on an underlying + * QVariant, treating QVariantMap and QVariantList as + * nodes with multiple children. In general, putting + * a QVariantMap into a QVariant and passing that into + * the model will get you a tree-like model of the + * VariantMap's data structure. + * + * Take care of object lifetimes and that the underlying + * QVariant does not change during use. If the QVariant + * **does** change, call reload() to re-build the internal + * representation of the tree. + */ +class VariantModel : public QAbstractItemModel +{ +public: + /** @brief Auxiliary data + * + * The nodes of the tree are enumerated into a vector + * (of length equal to the number of nodes in the tree + 1) + * which are used to do index and parent calculations. + */ + using IndexVector = QVector< quintptr >; + + /** @brief Constructor + * + * The QVariant's lifetime is **not** affected by the model, + * so take care that the QVariant lives at least as long as + * the model). Also, don't change the QVariant underneath the model. + */ + VariantModel( const QVariant* p ); + + ~VariantModel() override; + + /** @brief Re-build the internal tree + * + * Call this when the underlying variant is changed, which + * might impact how the tree is laid out. + */ + void reload(); + + int columnCount( const QModelIndex& index ) const override; + int rowCount( const QModelIndex& index ) const override; + + QModelIndex index( int row, int column, const QModelIndex& parent ) const override; + QModelIndex parent( const QModelIndex& index ) const override; + QVariant data( const QModelIndex& index, int role ) const override; + QVariant headerData( int section, Qt::Orientation orientation, int role ) const override; + +private: + const QVariant* const m_p; + + /** @brief Tree representation of the variant. + * + * At index 0 in the vector , we store -1 to indicate the root. + * + * Then we enumerate all the elements in the tree (by traversing + * the variant and using QVariantMap and QVariantList as having + * children, and everything else being a leaf node) and at the index + * for a child, store the index of its parent. This means that direct + * children of the root store a 0 in their indexes, children of the first + * child of the root store a 1, and we can "pointer chase" from an index + * through parents back to index 0. + * + * Because of this structure, the value stored at index i must be + * less than i (except for index 0, which is special). This makes it + * slightly easier to search for a given value *p*, because we can start + * at index *p* (or even *p+1*). + * + * Given an index *i* into the vector corresponding to a child, we know the + * parent, but can also count which row this child should have, by counting + * *other* indexes before *i* with the same parent (and by the ordering + * of values, we can start counting at index *parent-index*). + * + */ + IndexVector m_rows; + + /// @brief Implementation of walking an index through the variant-tree + const QVariant underlying( const QModelIndex& index ) const; + + /// @brief Helpers for range-checking + inline bool inRange( quintptr p ) const { return p < static_cast< quintptr >( m_rows.count() ); } + inline bool inRange( const QModelIndex& index ) const { return inRange( index.internalId() ); } +}; + +#endif diff --git a/src/calamares/main.cpp b/src/calamares/main.cpp index d463b789d..caf1f6cfd 100644 --- a/src/calamares/main.cpp +++ b/src/calamares/main.cpp @@ -21,12 +21,13 @@ #include "CalamaresApplication.h" #include "CalamaresConfig.h" -#include "kdsingleapplicationguard/kdsingleapplicationguard.h" #include "utils/Dirs.h" #include "utils/Logger.h" -#ifdef WITH_KF5Crash +#include "3rdparty/kdsingleapplicationguard/kdsingleapplicationguard.h" + #include +#ifdef WITH_KF5Crash #include #endif @@ -92,7 +93,6 @@ main( int argc, char* argv[] ) { CalamaresApplication a( argc, argv ); -#ifdef WITH_KF5Crash KAboutData aboutData( "calamares", "Calamares", a.applicationVersion(), @@ -103,12 +103,14 @@ main( int argc, char* argv[] ) "https://calamares.io", "https://github.com/calamares/calamares/issues" ); KAboutData::setApplicationData( aboutData ); + a.setApplicationDisplayName( QString() ); // To avoid putting an extra "Calamares/" into the log-file + +#ifdef WITH_KF5Crash KCrash::initialize(); // KCrash::setCrashHandler(); KCrash::setDrKonqiEnabled( true ); KCrash::setFlags( KCrash::SaferDialog | KCrash::AlwaysDirectly ); // TODO: umount anything in /tmp/calamares-... as an emergency save function - a.setApplicationDisplayName( QString() ); #endif handle_args( a ); diff --git a/src/calamares/progresstree/ProgressTreeView.cpp b/src/calamares/progresstree/ProgressTreeView.cpp index 5c81e3851..d4f652363 100644 --- a/src/calamares/progresstree/ProgressTreeView.cpp +++ b/src/calamares/progresstree/ProgressTreeView.cpp @@ -76,9 +76,10 @@ ProgressTreeView::setModel( QAbstractItemModel* model ) QTreeView::setModel( model ); expandAll(); - connect( Calamares::ViewManager::instance(), - &Calamares::ViewManager::currentStepChanged, - this, - [this]() { viewport()->update(); }, - Qt::UniqueConnection ); + connect( + Calamares::ViewManager::instance(), + &Calamares::ViewManager::currentStepChanged, + this, + [this]() { viewport()->update(); }, + Qt::UniqueConnection ); } diff --git a/src/calamares/testmain.cpp b/src/calamares/testmain.cpp index 0f07e6e13..885915041 100644 --- a/src/calamares/testmain.cpp +++ b/src/calamares/testmain.cpp @@ -26,52 +26,45 @@ #include "utils/Logger.h" #include "utils/Yaml.h" +#include "Branding.h" #include "GlobalStorage.h" #include "Job.h" #include "JobQueue.h" #include "Settings.h" +#include "ViewManager.h" +#include "modulesystem/ModuleManager.h" + +#include #include #include #include #include +#include +#include #include struct ModuleConfig { - QString - moduleName() const - { - return m_module; - } - QString - configFile() const - { - return m_jobConfig; - } - QString - language() const - { - return m_language; - } - QString - globalConfigFile() const - { - return m_globalConfig; - } + QString moduleName() const { return m_module; } + QString configFile() const { return m_jobConfig; } + QString language() const { return m_language; } + QString globalConfigFile() const { return m_globalConfig; } QString m_module; QString m_jobConfig; QString m_globalConfig; QString m_language; + QString m_branding; + bool m_ui; }; static ModuleConfig handle_args( QCoreApplication& a ) { QCommandLineOption debugLevelOption( - QStringLiteral( "D" ), "Verbose output for debugging purposes (0-8).", "level" ); + QStringLiteral( "D" ), "Verbose output for debugging purposes (0-8), ignored.", "level" ); QCommandLineOption globalOption( QStringList() << QStringLiteral( "g" ) << QStringLiteral( "global " ), QStringLiteral( "Global settings document" ), "global.yaml" ); @@ -81,6 +74,12 @@ handle_args( QCoreApplication& a ) QCommandLineOption langOption( QStringList() << QStringLiteral( "l" ) << QStringLiteral( "language" ), QStringLiteral( "Language (global)" ), "languagecode" ); + QCommandLineOption brandOption( QStringList() << QStringLiteral( "b" ) << QStringLiteral( "branding" ), + QStringLiteral( "Branding directory" ), + "path/to/branding.desc", + "src/branding/default/branding.desc" ); + QCommandLineOption uiOption( QStringList() << QStringLiteral( "U" ) << QStringLiteral( "ui" ), + QStringLiteral( "Enable UI" ) ); QCommandLineParser parser; parser.setApplicationDescription( "Calamares module tester" ); @@ -91,27 +90,13 @@ handle_args( QCoreApplication& a ) parser.addOption( globalOption ); parser.addOption( jobOption ); parser.addOption( langOption ); + parser.addOption( brandOption ); + parser.addOption( uiOption ); parser.addPositionalArgument( "module", "Path or name of module to run." ); parser.addPositionalArgument( "job.yaml", "Path of job settings document to use.", "[job.yaml]" ); parser.process( a ); - if ( parser.isSet( debugLevelOption ) ) - { - bool ok = true; - unsigned int l = parser.value( debugLevelOption ).toUInt( &ok ); - unsigned int dlevel = 0; - if ( !ok ) - { - dlevel = Logger::LOGVERBOSE; - } - else - { - dlevel = l; - } - Logger::setupLogLevel( dlevel ); - } - const QStringList args = parser.positionalArguments(); if ( args.isEmpty() ) { @@ -131,7 +116,12 @@ handle_args( QCoreApplication& a ) jobSettings = args.at( 1 ); } - return ModuleConfig { args.first(), jobSettings, parser.value( globalOption ), parser.value( langOption ) }; + return ModuleConfig { args.first(), + jobSettings, + parser.value( globalOption ), + parser.value( langOption ), + parser.value( brandOption ), + parser.isSet( uiOption ) }; } } @@ -198,12 +188,38 @@ load_module( const ModuleConfig& moduleConfig ) return module; } +/** @brief Create the right kind of QApplication + * + * Does primitive parsing of argv[] to find the --ui option and returns + * a UI-enabled application if it does. + * + * @p argc must be a reference (to main's argc) because the QCoreApplication + * constructors take a reference as well, and that would otherwise be a + * reference to a temporary. + */ +QCoreApplication* +createApplication( int& argc, char* argv[] ) +{ + for ( int i = 1; i < argc; ++i ) + { + if ( !qstrcmp( argv[ i ], "--ui" ) || !qstrcmp( argv[ i ], "-U" ) ) + { + auto* aw = new QApplication( argc, argv ); + aw->setQuitOnLastWindowClosed( true ); + return aw; + } + } + return new QCoreApplication( argc, argv ); +} + int main( int argc, char* argv[] ) { - QCoreApplication a( argc, argv ); + QCoreApplication* aw = createApplication( argc, argv ); - ModuleConfig module = handle_args( a ); + Logger::setupLogLevel( Logger::LOGVERBOSE ); + + ModuleConfig module = handle_args( *aw ); if ( module.moduleName().isEmpty() ) { return 1; @@ -211,6 +227,7 @@ main( int argc, char* argv[] ) std::unique_ptr< Calamares::Settings > settings_p( new Calamares::Settings( QString(), true ) ); std::unique_ptr< Calamares::JobQueue > jobqueue_p( new Calamares::JobQueue( nullptr ) ); + QMainWindow* mw = nullptr; auto gs = jobqueue_p->globalStorage(); if ( !module.globalConfigFile().isEmpty() ) @@ -233,6 +250,16 @@ main( int argc, char* argv[] ) return 1; } + cDebug() << " .. got" << m->name() << m->typeString() << m->interfaceString(); + if ( m->type() == Calamares::Module::Type::View ) + { + mw = module.m_ui ? new QMainWindow() : nullptr; + + (void)new Calamares::Branding( module.m_branding ); + (void)new Calamares::ModuleManager( QStringList(), nullptr ); + (void)Calamares::ViewManager::instance( mw ); + } + if ( !m->isLoaded() ) { m->loadSelf(); @@ -244,6 +271,16 @@ main( int argc, char* argv[] ) return 1; } + if ( mw ) + { + QWidget* w = Calamares::ViewManager::instance()->currentStep()->widget(); + w->setParent( mw ); + mw->setCentralWidget( w ); + w->show(); + mw->show(); + return aw->exec(); + } + using TR = Logger::DebugRow< const char*, const QString >; cDebug() << "Module metadata" << TR( "name", m->name() ) << TR( "type", m->typeString() ) @@ -268,5 +305,10 @@ main( int argc, char* argv[] ) ++count; } + if ( aw ) + { + delete aw; + } + return failure_count ? 1 : 0; } diff --git a/src/libcalamares/CMakeLists.txt b/src/libcalamares/CMakeLists.txt index 19bcc921d..87338ae6c 100644 --- a/src/libcalamares/CMakeLists.txt +++ b/src/libcalamares/CMakeLists.txt @@ -34,6 +34,10 @@ set( libSources locale/Label.cpp locale/LabelModel.cpp locale/Lookup.cpp + locale/TranslatableConfiguration.cpp + + # Network service + network/Manager.cpp # Partition service partition/PartitionSize.cpp @@ -50,12 +54,16 @@ set( libSources utils/Variant.cpp utils/Yaml.cpp ) -set( kdsagSources +set( _kdsagSources kdsingleapplicationguard/kdsingleapplicationguard.cpp kdsingleapplicationguard/kdsharedmemorylocker.cpp kdsingleapplicationguard/kdtoolsglobal.cpp kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp ) +set( kdsagSources "" ) +foreach( _s ${_kdsagSources} ) + list( APPEND kdsagSources ${CMAKE_SOURCE_DIR}/3rdparty/${_s} ) +endforeach() mark_thirdparty_code( ${kdsagSources} ) include_directories( @@ -115,6 +123,7 @@ target_link_libraries( calamares LINK_PUBLIC ${YAMLCPP_LIBRARY} Qt5::Core + KF5::CoreAddons ${OPTIONAL_PUBLIC_LIBRARIES} ) @@ -188,6 +197,16 @@ if ( ECM_FOUND AND BUILD_TESTING ) Qt5::Test ) calamares_automoc( libcalamareslocaletest ) + + ecm_add_test( + network/Tests.cpp + TEST_NAME + libcalamaresnetworktest + LINK_LIBRARIES + calamares + Qt5::Test + ) + calamares_automoc( libcalamaresnetworktest ) endif() if( BUILD_TESTING ) diff --git a/src/libcalamares/CalamaresConfig.h.in b/src/libcalamares/CalamaresConfig.h.in index 6fbab422c..55468cf15 100644 --- a/src/libcalamares/CalamaresConfig.h.in +++ b/src/libcalamares/CalamaresConfig.h.in @@ -12,4 +12,4 @@ #cmakedefine WITH_PYTHON #cmakedefine WITH_PYTHONQT -#endif // CALAMARESCONFIG_H +#endif // CALAMARESCONFIG_H diff --git a/src/libcalamares/CppJob.cpp b/src/libcalamares/CppJob.cpp index 0512df377..82af344dd 100644 --- a/src/libcalamares/CppJob.cpp +++ b/src/libcalamares/CppJob.cpp @@ -24,11 +24,11 @@ namespace Calamares CppJob::CppJob( QObject* parent ) : Job( parent ) -{} +{ +} -CppJob::~CppJob() -{} +CppJob::~CppJob() {} void @@ -44,4 +44,4 @@ CppJob::setConfigurationMap( const QVariantMap& configurationMap ) Q_UNUSED( configurationMap ) } -} +} // namespace Calamares diff --git a/src/libcalamares/CppJob.h b/src/libcalamares/CppJob.h index 36116b3e7..10ab71649 100644 --- a/src/libcalamares/CppJob.h +++ b/src/libcalamares/CppJob.h @@ -45,6 +45,6 @@ protected: QString m_instanceKey; }; -} +} // namespace Calamares -#endif // CALAMARES_CPPJOB_H +#endif // CALAMARES_CPPJOB_H diff --git a/src/libcalamares/DllMacro.h b/src/libcalamares/DllMacro.h index e0281d7a7..d3e1c8098 100644 --- a/src/libcalamares/DllMacro.h +++ b/src/libcalamares/DllMacro.h @@ -22,11 +22,11 @@ #include #ifndef DLLEXPORT -# if defined (DLLEXPORT_PRO) -# define DLLEXPORT Q_DECL_EXPORT -# else -# define DLLEXPORT Q_DECL_IMPORT -# endif +#if defined( DLLEXPORT_PRO ) +#define DLLEXPORT Q_DECL_EXPORT +#else +#define DLLEXPORT Q_DECL_IMPORT +#endif #endif #endif diff --git a/src/libcalamares/GlobalStorage.cpp b/src/libcalamares/GlobalStorage.cpp index 73236a311..5094ad2fd 100644 --- a/src/libcalamares/GlobalStorage.cpp +++ b/src/libcalamares/GlobalStorage.cpp @@ -21,6 +21,7 @@ #include "JobQueue.h" #include "utils/Logger.h" +#include "utils/Units.h" #include "utils/Yaml.h" #include @@ -37,7 +38,10 @@ namespace bp = boost::python; #endif -namespace Calamares { +using CalamaresUtils::operator""_MiB; + +namespace Calamares +{ GlobalStorage::GlobalStorage() : QObject( nullptr ) @@ -99,17 +103,49 @@ GlobalStorage::debugDump() const } bool -GlobalStorage::save(const QString& filename) +GlobalStorage::save( const QString& filename ) { QFile f( filename ); if ( !f.open( QFile::WriteOnly ) ) + { return false; + } - f.write( QJsonDocument::fromVariant( m ).toJson() ) ; + f.write( QJsonDocument::fromVariant( m ).toJson() ); f.close(); return true; } +bool +GlobalStorage::load( const QString& filename ) +{ + QFile f( filename ); + if ( !f.open( QFile::ReadOnly ) ) + { + return false; + } + + QJsonParseError e; + QJsonDocument d = QJsonDocument::fromJson( f.read( 1_MiB ), &e ); + if ( d.isNull() ) + { + cWarning() << filename << e.errorString(); + } + else if ( !d.isObject() ) + { + cWarning() << filename << "Not suitable JSON."; + } + else + { + auto map = d.toVariant().toMap(); + for ( auto i = map.constBegin(); i != map.constEnd(); ++i ) + { + insert( i.key(), *i ); + } + return true; + } + return false; +} bool GlobalStorage::saveYaml( const QString& filename ) @@ -123,12 +159,14 @@ GlobalStorage::loadYaml( const QString& filename ) bool ok = false; auto gs = CalamaresUtils::loadYaml( filename, &ok ); if ( ok ) + { m = gs; + } return ok; } -} // namespace Calamares +} // namespace Calamares #ifdef WITH_PYTHON @@ -145,7 +183,7 @@ Calamares::GlobalStorage* GlobalStoragePythonWrapper::s_gs_instance = nullptr; GlobalStoragePythonWrapper::GlobalStoragePythonWrapper( Calamares::GlobalStorage* gs ) : m_gs( gs ? gs : s_gs_instance ) { - if (!m_gs) + if ( !m_gs ) { s_gs_instance = new Calamares::GlobalStorage; m_gs = s_gs_instance; @@ -167,11 +205,9 @@ GlobalStoragePythonWrapper::count() const void -GlobalStoragePythonWrapper::insert( const std::string& key, - const bp::object& value ) +GlobalStoragePythonWrapper::insert( const std::string& key, const bp::object& value ) { - m_gs->insert( QString::fromStdString( key ), - CalamaresPython::variantFromPyObject( value ) ); + m_gs->insert( QString::fromStdString( key ), CalamaresPython::variantFromPyObject( value ) ); } bp::list @@ -180,7 +216,9 @@ GlobalStoragePythonWrapper::keys() const bp::list pyList; const auto keys = m_gs->keys(); for ( const QString& key : keys ) + { pyList.append( key.toStdString() ); + } return pyList; } @@ -198,6 +236,6 @@ GlobalStoragePythonWrapper::value( const std::string& key ) const return CalamaresPython::variantToPyObject( m_gs->value( QString::fromStdString( key ) ) ); } -} // namespace CalamaresPython +} // namespace CalamaresPython -#endif // WITH_PYTHON +#endif // WITH_PYTHON diff --git a/src/libcalamares/GlobalStorage.h b/src/libcalamares/GlobalStorage.h index 2c31a8f47..b070e23f6 100644 --- a/src/libcalamares/GlobalStorage.h +++ b/src/libcalamares/GlobalStorage.h @@ -22,6 +22,8 @@ #include "CalamaresConfig.h" +#include +#include #include #ifdef WITH_PYTHON @@ -34,8 +36,8 @@ namespace api class object; } class list; -} -} +} // namespace python +} // namespace boost #endif namespace Calamares @@ -70,6 +72,14 @@ public: */ bool save( const QString& filename ); + /** @brief Adds the keys from the given JSON file + * + * No tidying, sanitization, or censoring is done. + * The JSON file is read and each key is added as a value to + * the global storage. + */ + bool load( const QString& filename ); + /** @brief write as YAML to the given filename * * See also save(), above. @@ -79,16 +89,22 @@ public: /// @brief reads settings from the given filename bool loadYaml( const QString& filename ); + /** @brief Get internal mapping as a constant object + * + * Note that the VariantMap underneath may change, because + * it's not constant in itself. Connect to the changed() + * signal for notifications. + */ + const QVariantMap& data() const { return m; } + signals: void changed(); private: QVariantMap m; - - friend DebugWindow; }; -} // namespace Calamares +} // namespace Calamares #ifdef WITH_PYTHON namespace CalamaresPython @@ -116,7 +132,7 @@ private: static Calamares::GlobalStorage* s_gs_instance; // See globalStorageInstance() }; -} // namespace CalamaresPython +} // namespace CalamaresPython #endif -#endif // CALAMARES_GLOBALSTORAGE_H +#endif // CALAMARES_GLOBALSTORAGE_H diff --git a/src/libcalamares/Job.cpp b/src/libcalamares/Job.cpp index d2118451f..d074a18cb 100644 --- a/src/libcalamares/Job.cpp +++ b/src/libcalamares/Job.cpp @@ -84,7 +84,8 @@ JobResult::JobResult( const QString& message, const QString& details, int number : m_message( message ) , m_details( details ) , m_number( number ) -{} +{ +} Job::Job( QObject* parent ) @@ -93,8 +94,14 @@ Job::Job( QObject* parent ) } -Job::~Job() -{} +Job::~Job() {} + + +qreal +Job::getJobWeight() const +{ + return qreal( 1.0 ); +} QString @@ -111,4 +118,4 @@ Job::prettyStatusMessage() const } -} // namespace Calamares +} // namespace Calamares diff --git a/src/libcalamares/Job.h b/src/libcalamares/Job.h index f590ef0ee..3eaa251ef 100644 --- a/src/libcalamares/Job.h +++ b/src/libcalamares/Job.h @@ -25,7 +25,8 @@ #include #include -namespace Calamares { +namespace Calamares +{ class DLLEXPORT JobResult { @@ -43,7 +44,7 @@ public: GenericError = -1, PythonUncaughtException = 1, InvalidConfiguration = 2 - } ; + }; JobResult( const JobResult& rhs ) = delete; JobResult( JobResult&& rhs ); @@ -83,6 +84,7 @@ public: explicit Job( QObject* parent = nullptr ); virtual ~Job(); + virtual qreal getJobWeight() const; virtual QString prettyName() const = 0; virtual QString prettyDescription() const; virtual QString prettyStatusMessage() const; @@ -101,6 +103,6 @@ private: using job_ptr = QSharedPointer< Job >; using JobList = QList< job_ptr >; -} // namespace Calamares +} // namespace Calamares -#endif // CALAMARES_JOB_H +#endif // CALAMARES_JOB_H diff --git a/src/libcalamares/JobExample.cpp b/src/libcalamares/JobExample.cpp index 83259ae6d..83da2b1e1 100644 --- a/src/libcalamares/JobExample.cpp +++ b/src/libcalamares/JobExample.cpp @@ -36,7 +36,8 @@ GoodJob::exec() JobResult FailJob::exec() { - return JobResult::error( tr( "Job failed (%1)" ).arg( m_name ), tr( "Programmed job failure was explicitly requested." ) ); + return JobResult::error( tr( "Job failed (%1)" ).arg( m_name ), + tr( "Programmed job failure was explicitly requested." ) ); } -} // namespace +} // namespace Calamares diff --git a/src/libcalamares/JobExample.h b/src/libcalamares/JobExample.h index fd5eea109..92f8f8fb6 100644 --- a/src/libcalamares/JobExample.h +++ b/src/libcalamares/JobExample.h @@ -21,7 +21,8 @@ #include "Job.h" -namespace Calamares { +namespace Calamares +{ /** @brief A Job with a name * @@ -39,9 +40,10 @@ public: } virtual QString prettyName() const override; + protected: const QString m_name; -} ; +}; /// @brief Job does nothing, always succeeds class DLLEXPORT GoodJob : public NamedJob @@ -53,7 +55,7 @@ public: } virtual JobResult exec() override; -} ; +}; /// @brief Job does nothing, always fails @@ -66,8 +68,8 @@ public: } virtual JobResult exec() override; -} ; +}; -} // namespace Calamares +} // namespace Calamares -#endif // CALAMARES_JOB_EXAMPLE_H +#endif // CALAMARES_JOB_EXAMPLE_H diff --git a/src/libcalamares/JobQueue.cpp b/src/libcalamares/JobQueue.cpp index 3a76aa099..6772671b7 100644 --- a/src/libcalamares/JobQueue.cpp +++ b/src/libcalamares/JobQueue.cpp @@ -19,8 +19,8 @@ #include "JobQueue.h" -#include "Job.h" #include "GlobalStorage.h" +#include "Job.h" #include "utils/Logger.h" #include "CalamaresConfig.h" @@ -48,6 +48,17 @@ public: void setJobs( const JobList& jobs ) { m_jobs = jobs; + + qreal totalJobsWeight = 0.0; + for ( auto job : m_jobs ) + { + totalJobsWeight += job->getJobWeight(); + } + for ( auto job : m_jobs ) + { + qreal jobWeight = qreal( job->getJobWeight() / totalJobsWeight ); + m_jobWeights.append( jobWeight ); + } } void run() override @@ -57,7 +68,7 @@ public: QString details; m_jobIndex = 0; - for( auto job : m_jobs ) + for ( auto job : m_jobs ) { if ( anyFailed && !job->isEmergency() ) { @@ -76,17 +87,24 @@ public: details = result.details(); } if ( !anyFailed ) + { ++m_jobIndex; + } } if ( anyFailed ) + { emitFailed( message, details ); + } else + { emitProgress(); + } emitFinished(); } private: JobList m_jobs; + QList< qreal > m_jobWeights; JobQueue* m_queue; int m_jobIndex; @@ -97,35 +115,39 @@ private: jobPercent = qBound( qreal( 0 ), jobPercent, qreal( 1 ) ); int jobCount = m_jobs.size(); - QString message = m_jobIndex < jobCount - ? m_jobs.at( m_jobIndex )->prettyStatusMessage() - : tr( "Done" ); + QString message = m_jobIndex < jobCount ? m_jobs.at( m_jobIndex )->prettyStatusMessage() : tr( "Done" ); - qreal percent = ( m_jobIndex + jobPercent ) / qreal( jobCount ); + qreal cumulativeProgress = 0.0; + for ( auto jobWeight : m_jobWeights.mid( 0, m_jobIndex ) ) + { + cumulativeProgress += jobWeight; + } + qreal percent + = m_jobIndex < jobCount ? cumulativeProgress + ( ( m_jobWeights.at( m_jobIndex ) ) * jobPercent ) : 1.0; - QMetaObject::invokeMethod( m_queue, "progress", Qt::QueuedConnection, - Q_ARG( qreal, percent ), - Q_ARG( QString, message ) - ); + if ( m_jobIndex < jobCount ) + { + cDebug( Logger::LOGVERBOSE ) << "[JOBQUEUE]: Progress for Job[" << m_jobIndex + << "]: " << ( jobPercent * 100 ) << "% completed"; + cDebug( Logger::LOGVERBOSE ) << "[JOBQUEUE]: Progress Overall: " << ( cumulativeProgress * 100 ) + << "% (accumulated) + " + << ( ( ( m_jobWeights.at( m_jobIndex ) ) * jobPercent ) * 100 ) + << "% (this job) = " << ( percent * 100 ) << "% (total)"; + } + QMetaObject::invokeMethod( + m_queue, "progress", Qt::QueuedConnection, Q_ARG( qreal, percent ), Q_ARG( QString, message ) ); } void emitFailed( const QString& message, const QString& details ) { - QMetaObject::invokeMethod( m_queue, "failed", Qt::QueuedConnection, - Q_ARG( QString, message ), - Q_ARG( QString, details ) - ); + QMetaObject::invokeMethod( + m_queue, "failed", Qt::QueuedConnection, Q_ARG( QString, message ), Q_ARG( QString, details ) ); } - void emitFinished() - { - QMetaObject::invokeMethod( m_queue, "finished", Qt::QueuedConnection ); - } + void emitFinished() { QMetaObject::invokeMethod( m_queue, "finished", Qt::QueuedConnection ); } }; -JobThread::~JobThread() -{ -} +JobThread::~JobThread() {} JobQueue* JobQueue::s_instance = nullptr; @@ -160,8 +182,10 @@ JobQueue::~JobQueue() if ( m_thread->isRunning() ) { m_thread->terminate(); - if ( !m_thread->wait(300) ) + if ( !m_thread->wait( 300 ) ) + { cError() << "Could not terminate job thread (expect a crash now)."; + } delete m_thread; } @@ -196,4 +220,4 @@ JobQueue::enqueue( const JobList& jobs ) emit queueChanged( m_jobs ); } -} // namespace Calamares +} // namespace Calamares diff --git a/src/libcalamares/JobQueue.h b/src/libcalamares/JobQueue.h index 4e5dffe8a..a58b873d9 100644 --- a/src/libcalamares/JobQueue.h +++ b/src/libcalamares/JobQueue.h @@ -59,6 +59,6 @@ private: GlobalStorage* m_storage; }; -} +} // namespace Calamares -#endif // CALAMARES_JOBQUEUE_H +#endif // CALAMARES_JOBQUEUE_H diff --git a/src/libcalamares/PluginDllMacro.h b/src/libcalamares/PluginDllMacro.h index cabe09887..d790230b9 100644 --- a/src/libcalamares/PluginDllMacro.h +++ b/src/libcalamares/PluginDllMacro.h @@ -22,11 +22,11 @@ #include #ifndef PLUGINDLLEXPORT -# if defined (PLUGINDLLEXPORT_PRO) -# define PLUGINDLLEXPORT Q_DECL_EXPORT -# else -# define PLUGINDLLEXPORT Q_DECL_IMPORT -# endif +#if defined( PLUGINDLLEXPORT_PRO ) +#define PLUGINDLLEXPORT Q_DECL_EXPORT +#else +#define PLUGINDLLEXPORT Q_DECL_IMPORT +#endif #endif #endif diff --git a/src/libcalamares/ProcessJob.cpp b/src/libcalamares/ProcessJob.cpp index 47fcee05d..744f5f9bf 100644 --- a/src/libcalamares/ProcessJob.cpp +++ b/src/libcalamares/ProcessJob.cpp @@ -25,40 +25,38 @@ #include #include -namespace Calamares { +namespace Calamares +{ ProcessJob::ProcessJob( const QString& command, const QString& workingPath, bool runInChroot, - int secondsTimeout, + std::chrono::seconds secondsTimeout, QObject* parent ) : Job( parent ) , m_command( command ) , m_workingPath( workingPath ) , m_runInChroot( runInChroot ) , m_timeoutSec( secondsTimeout ) -{} +{ +} -ProcessJob::~ProcessJob() -{} +ProcessJob::~ProcessJob() {} QString ProcessJob::prettyName() const { - return ( m_runInChroot ? tr( "Run command '%1' in target system." ) : tr( " Run command '%1'." ) ) - .arg( m_command ); + return ( m_runInChroot ? tr( "Run command '%1' in target system." ) : tr( " Run command '%1'." ) ).arg( m_command ); } QString ProcessJob::prettyStatusMessage() const { - return tr( "Running command %1 %2" ) - .arg( m_command ) - .arg( m_runInChroot ? "in chroot." : " ." ); + return tr( "Running command %1 %2" ).arg( m_command ).arg( m_runInChroot ? "in chroot." : " ." ); } @@ -68,20 +66,16 @@ ProcessJob::exec() using CalamaresUtils::System; if ( m_runInChroot ) - return CalamaresUtils::System::instance()-> - targetEnvCommand( { m_command }, - m_workingPath, - QString(), - m_timeoutSec ) - .explainProcess( m_command, m_timeoutSec ); + return CalamaresUtils::System::instance() + ->targetEnvCommand( { m_command }, m_workingPath, QString(), m_timeoutSec ) + .explainProcess( m_command, m_timeoutSec ); else - return - System::runCommand( System::RunLocation::RunInHost, - { "/bin/sh", "-c", m_command }, - m_workingPath, - QString(), - m_timeoutSec ) + return System::runCommand( System::RunLocation::RunInHost, + { "/bin/sh", "-c", m_command }, + m_workingPath, + QString(), + m_timeoutSec ) .explainProcess( m_command, m_timeoutSec ); } -} // namespace Calamares +} // namespace Calamares diff --git a/src/libcalamares/ProcessJob.h b/src/libcalamares/ProcessJob.h index 224ebdaf0..e826acb1d 100644 --- a/src/libcalamares/ProcessJob.h +++ b/src/libcalamares/ProcessJob.h @@ -22,7 +22,10 @@ #include "Job.h" -namespace Calamares { +#include + +namespace Calamares +{ class ProcessJob : public Job { @@ -31,7 +34,7 @@ public: explicit ProcessJob( const QString& command, const QString& workingPath, bool runInChroot = false, - int secondsTimeout = 30, + std::chrono::seconds secondsTimeout = std::chrono::seconds( 30 ), QObject* parent = nullptr ); virtual ~ProcessJob() override; @@ -43,9 +46,9 @@ private: QString m_command; QString m_workingPath; bool m_runInChroot; - int m_timeoutSec; + std::chrono::seconds m_timeoutSec; }; -} // namespace Calamares +} // namespace Calamares -#endif // CALAMARES_PROCESSJOB_H +#endif // CALAMARES_PROCESSJOB_H diff --git a/src/libcalamares/PythonHelper.cpp b/src/libcalamares/PythonHelper.cpp index 3c4d1cca6..670390d6c 100644 --- a/src/libcalamares/PythonHelper.cpp +++ b/src/libcalamares/PythonHelper.cpp @@ -52,6 +52,9 @@ variantToPyObject( const QVariant& variant ) case QVariant::Int: return bp::object( variant.toInt() ); + case QVariant::LongLong: + return bp::object( variant.toLongLong() ); + case QVariant::Double: return bp::object( variant.toDouble() ); @@ -72,25 +75,39 @@ variantFromPyObject( const boost::python::object& pyObject ) { std::string pyType = bp::extract< std::string >( pyObject.attr( "__class__" ).attr( "__name__" ) ); if ( pyType == "dict" ) + { return variantMapFromPyDict( bp::extract< bp::dict >( pyObject ) ); + } else if ( pyType == "list" ) + { return variantListFromPyList( bp::extract< bp::list >( pyObject ) ); + } else if ( pyType == "int" ) + { return QVariant( bp::extract< int >( pyObject ) ); + } else if ( pyType == "float" ) + { return QVariant( bp::extract< double >( pyObject ) ); + } else if ( pyType == "str" ) + { return QVariant( QString::fromStdString( bp::extract< std::string >( pyObject ) ) ); + } else if ( pyType == "bool" ) + { return QVariant( bp::extract< bool >( pyObject ) ); + } else + { return QVariant(); + } } @@ -99,7 +116,9 @@ variantListToPyList( const QVariantList& variantList ) { bp::list pyList; for ( const QVariant& variant : variantList ) + { pyList.append( variantToPyObject( variant ) ); + } return pyList; } @@ -109,7 +128,9 @@ variantListFromPyList( const boost::python::list& pyList ) { QVariantList list; for ( int i = 0; i < bp::len( pyList ); ++i ) + { list.append( variantFromPyObject( pyList[ i ] ) ); + } return list; } @@ -119,7 +140,9 @@ variantMapToPyDict( const QVariantMap& variantMap ) { bp::dict pyDict; for ( auto it = variantMap.constBegin(); it != variantMap.constEnd(); ++it ) + { pyDict[ it.key().toStdString() ] = variantToPyObject( it.value() ); + } return pyDict; } @@ -152,7 +175,9 @@ variantHashToPyDict( const QVariantHash& variantHash ) { bp::dict pyDict; for ( auto it = variantHash.constBegin(); it != variantHash.constEnd(); ++it ) + { pyDict[ it.key().toStdString() ] = variantToPyObject( it.value() ); + } return pyDict; } @@ -181,17 +206,21 @@ variantHashFromPyDict( const boost::python::dict& pyDict ) } - Helper* Helper::s_instance = nullptr; -static inline void add_if_lib_exists( const QDir& dir, const char* name, QStringList& list ) +static inline void +add_if_lib_exists( const QDir& dir, const char* name, QStringList& list ) { - if ( ! ( dir.exists() && dir.isReadable() ) ) + if ( !( dir.exists() && dir.isReadable() ) ) + { return; + } QFileInfo fi( dir.absoluteFilePath( name ) ); if ( fi.exists() && fi.isReadable() ) + { list.append( fi.dir().absolutePath() ); + } } Helper::Helper( QObject* parent ) @@ -201,7 +230,9 @@ Helper::Helper( QObject* parent ) if ( !s_instance ) { if ( !Py_IsInitialized() ) + { Py_Initialize(); + } m_mainModule = bp::import( "__main__" ); m_mainNamespace = m_mainModule.attr( "__dict__" ); @@ -209,8 +240,7 @@ Helper::Helper( QObject* parent ) // If we're running from the build dir add_if_lib_exists( QDir::current(), "libcalamares.so", m_pythonPaths ); - QDir calaPythonPath( CalamaresUtils::systemLibDir().absolutePath() + - QDir::separator() + "calamares" ); + QDir calaPythonPath( CalamaresUtils::systemLibDir().absolutePath() + QDir::separator() + "calamares" ); add_if_lib_exists( calaPythonPath, "libcalamares.so", m_pythonPaths ); bp::object sys = bp::import( "sys" ); @@ -251,7 +281,7 @@ Helper::createCleanNamespace() QString Helper::handleLastError() { - PyObject* type = nullptr, *val = nullptr, *traceback_p = nullptr; + PyObject *type = nullptr, *val = nullptr, *traceback_p = nullptr; PyErr_Fetch( &type, &val, &traceback_p ); Logger::CDebug debug; @@ -264,10 +294,14 @@ Helper::handleLastError() bp::str pystr( h_type ); bp::extract< std::string > extracted( pystr ); if ( extracted.check() ) + { typeMsg = QString::fromStdString( extracted() ).trimmed(); + } if ( typeMsg.isEmpty() ) + { typeMsg = tr( "Unknown exception type" ); + } debug << typeMsg << '\n'; } @@ -278,10 +312,14 @@ Helper::handleLastError() bp::str pystr( h_val ); bp::extract< std::string > extracted( pystr ); if ( extracted.check() ) + { valMsg = QString::fromStdString( extracted() ).trimmed(); + } if ( valMsg.isEmpty() ) + { valMsg = tr( "unparseable Python error" ); + } // Special-case: CalledProcessError has an attribute "output" with the command output, // add that to the printed message. @@ -318,22 +356,32 @@ Helper::handleLastError() bp::object pystr( bp::str( "\n" ).join( tb_list ) ); bp::extract< std::string > extracted( pystr ); if ( extracted.check() ) + { tbMsg = QString::fromStdString( extracted() ).trimmed(); + } if ( tbMsg.isEmpty() ) + { tbMsg = tr( "unparseable Python traceback" ); + } debug << tbMsg << '\n'; } if ( typeMsg.isEmpty() && valMsg.isEmpty() && tbMsg.isEmpty() ) + { return tr( "Unfetchable Python error." ); + } QStringList msgList; if ( !typeMsg.isEmpty() ) + { msgList.append( QString( "%1" ).arg( typeMsg.toHtmlEscaped() ) ); + } if ( !valMsg.isEmpty() ) + { msgList.append( valMsg.toHtmlEscaped() ); + } if ( !tbMsg.isEmpty() ) { @@ -346,4 +394,4 @@ Helper::handleLastError() } -} // namespace CalamaresPython +} // namespace CalamaresPython diff --git a/src/libcalamares/PythonHelper.h b/src/libcalamares/PythonHelper.h index 693d80d8b..667a08614 100644 --- a/src/libcalamares/PythonHelper.h +++ b/src/libcalamares/PythonHelper.h @@ -32,17 +32,17 @@ namespace CalamaresPython { -boost::python::object variantToPyObject( const QVariant& variant ); -QVariant variantFromPyObject( const boost::python::object& pyObject ); +boost::python::object variantToPyObject( const QVariant& variant ); +QVariant variantFromPyObject( const boost::python::object& pyObject ); -boost::python::list variantListToPyList( const QVariantList& variantList ); -QVariantList variantListFromPyList( const boost::python::list& pyList ); +boost::python::list variantListToPyList( const QVariantList& variantList ); +QVariantList variantListFromPyList( const boost::python::list& pyList ); -boost::python::dict variantMapToPyDict( const QVariantMap& variantMap ); -QVariantMap variantMapFromPyDict( const boost::python::dict& pyDict ); +boost::python::dict variantMapToPyDict( const QVariantMap& variantMap ); +QVariantMap variantMapFromPyDict( const boost::python::dict& pyDict ); -boost::python::dict variantHashToPyDict( const QVariantHash& variantHash ); -QVariantHash variantHashFromPyDict( const boost::python::dict& pyDict ); +boost::python::dict variantHashToPyDict( const QVariantHash& variantHash ); +QVariantHash variantHashFromPyDict( const boost::python::dict& pyDict ); class Helper : public QObject @@ -66,6 +66,6 @@ private: QStringList m_pythonPaths; }; -} // namespace Calamares +} // namespace CalamaresPython -#endif // CALAMARES_PYTHONJOBHELPER_H +#endif // CALAMARES_PYTHONJOBHELPER_H diff --git a/src/libcalamares/PythonJob.cpp b/src/libcalamares/PythonJob.cpp index 32792e737..39f500194 100644 --- a/src/libcalamares/PythonJob.cpp +++ b/src/libcalamares/PythonJob.cpp @@ -19,10 +19,10 @@ #include "PythonJob.h" -#include "PythonHelper.h" -#include "utils/Logger.h" #include "GlobalStorage.h" #include "JobQueue.h" +#include "PythonHelper.h" +#include "utils/Logger.h" #include @@ -35,27 +35,19 @@ namespace bp = boost::python; -BOOST_PYTHON_FUNCTION_OVERLOADS( mount_overloads, - CalamaresPython::mount, - 2, 4 ); -BOOST_PYTHON_FUNCTION_OVERLOADS( target_env_call_str_overloads, - CalamaresPython::target_env_call, - 1, 3 ); -BOOST_PYTHON_FUNCTION_OVERLOADS( target_env_call_list_overloads, - CalamaresPython::target_env_call, - 1, 3 ); -BOOST_PYTHON_FUNCTION_OVERLOADS( check_target_env_call_str_overloads, - CalamaresPython::check_target_env_call, - 1, 3 ); -BOOST_PYTHON_FUNCTION_OVERLOADS( check_target_env_call_list_overloads, - CalamaresPython::check_target_env_call, - 1, 3 ); +BOOST_PYTHON_FUNCTION_OVERLOADS( mount_overloads, CalamaresPython::mount, 2, 4 ); +BOOST_PYTHON_FUNCTION_OVERLOADS( target_env_call_str_overloads, CalamaresPython::target_env_call, 1, 3 ); +BOOST_PYTHON_FUNCTION_OVERLOADS( target_env_call_list_overloads, CalamaresPython::target_env_call, 1, 3 ); +BOOST_PYTHON_FUNCTION_OVERLOADS( check_target_env_call_str_overloads, CalamaresPython::check_target_env_call, 1, 3 ); +BOOST_PYTHON_FUNCTION_OVERLOADS( check_target_env_call_list_overloads, CalamaresPython::check_target_env_call, 1, 3 ); BOOST_PYTHON_FUNCTION_OVERLOADS( check_target_env_output_str_overloads, CalamaresPython::check_target_env_output, - 1, 3 ); + 1, + 3 ); BOOST_PYTHON_FUNCTION_OVERLOADS( check_target_env_output_list_overloads, CalamaresPython::check_target_env_output, - 1, 3 ); + 1, + 3 ); BOOST_PYTHON_MODULE( libcalamares ) { bp::object package = bp::scope(); @@ -68,25 +60,24 @@ BOOST_PYTHON_MODULE( libcalamares ) bp::scope().attr( "VERSION_SHORT" ) = CALAMARES_VERSION_SHORT; bp::class_< CalamaresPython::PythonJobInterface >( "Job", bp::init< Calamares::PythonJob* >() ) - .def_readonly( "module_name", &CalamaresPython::PythonJobInterface::moduleName ) - .def_readonly( "pretty_name", &CalamaresPython::PythonJobInterface::prettyName ) - .def_readonly( "working_path", &CalamaresPython::PythonJobInterface::workingPath ) + .def_readonly( "module_name", &CalamaresPython::PythonJobInterface::moduleName ) + .def_readonly( "pretty_name", &CalamaresPython::PythonJobInterface::prettyName ) + .def_readonly( "working_path", &CalamaresPython::PythonJobInterface::workingPath ) .def_readonly( "configuration", &CalamaresPython::PythonJobInterface::configuration ) - .def( - "setprogress", - &CalamaresPython::PythonJobInterface::setprogress, - bp::args( "progress" ), - "Reports the progress status of this job to Calamares, " - "as a real number between 0 and 1." - ); + .def( "setprogress", + &CalamaresPython::PythonJobInterface::setprogress, + bp::args( "progress" ), + "Reports the progress status of this job to Calamares, " + "as a real number between 0 and 1." ); - bp::class_< CalamaresPython::GlobalStoragePythonWrapper >( "GlobalStorage", bp::init< Calamares::GlobalStorage* >() ) - .def( "contains", &CalamaresPython::GlobalStoragePythonWrapper::contains ) - .def( "count", &CalamaresPython::GlobalStoragePythonWrapper::count ) - .def( "insert", &CalamaresPython::GlobalStoragePythonWrapper::insert ) - .def( "keys", &CalamaresPython::GlobalStoragePythonWrapper::keys ) - .def( "remove", &CalamaresPython::GlobalStoragePythonWrapper::remove ) - .def( "value", &CalamaresPython::GlobalStoragePythonWrapper::value ); + bp::class_< CalamaresPython::GlobalStoragePythonWrapper >( "GlobalStorage", + bp::init< Calamares::GlobalStorage* >() ) + .def( "contains", &CalamaresPython::GlobalStoragePythonWrapper::contains ) + .def( "count", &CalamaresPython::GlobalStoragePythonWrapper::count ) + .def( "insert", &CalamaresPython::GlobalStoragePythonWrapper::insert ) + .def( "keys", &CalamaresPython::GlobalStoragePythonWrapper::keys ) + .def( "remove", &CalamaresPython::GlobalStoragePythonWrapper::remove ) + .def( "value", &CalamaresPython::GlobalStoragePythonWrapper::value ); // libcalamares.utils submodule starts here bp::object utilsModule( bp::handle<>( bp::borrowed( PyImport_AddModule( "libcalamares.utils" ) ) ) ); @@ -95,151 +86,88 @@ BOOST_PYTHON_MODULE( libcalamares ) Q_UNUSED( utilsScope ) bp::def( - "debug", - &CalamaresPython::debug, - bp::args( "s" ), - "Writes the given string to the Calamares debug stream." - ); - bp::def( - "warning", - &CalamaresPython::warning, - bp::args( "s" ), - "Writes the given string to the Calamares warning stream." - ); + "debug", &CalamaresPython::debug, bp::args( "s" ), "Writes the given string to the Calamares debug stream." ); + bp::def( "warning", + &CalamaresPython::warning, + bp::args( "s" ), + "Writes the given string to the Calamares warning stream." ); - bp::def( - "mount", - &CalamaresPython::mount, - mount_overloads( - bp::args( "device_path", - "mount_point", - "filesystem_name", - "options" ), - "Runs the mount utility with the specified parameters.\n" - "Returns the program's exit code, or:\n" - "-1 = QProcess crash\n" - "-2 = QProcess cannot start\n" - "-3 = bad arguments" - ) - ); + bp::def( "mount", + &CalamaresPython::mount, + mount_overloads( bp::args( "device_path", "mount_point", "filesystem_name", "options" ), + "Runs the mount utility with the specified parameters.\n" + "Returns the program's exit code, or:\n" + "-1 = QProcess crash\n" + "-2 = QProcess cannot start\n" + "-3 = bad arguments" ) ); bp::def( "target_env_call", - static_cast< int (*)( const std::string&, - const std::string&, - int ) >( &CalamaresPython::target_env_call ), - target_env_call_str_overloads( - bp::args( "command", - "stdin", - "timeout" ), - "Runs the specified command in the chroot of the target system.\n" - "Returns the program's exit code, or:\n" - "-1 = QProcess crash\n" - "-2 = QProcess cannot start\n" - "-3 = bad arguments\n" - "-4 = QProcess timeout" - ) - ); - bp::def( - "target_env_call", - static_cast< int (*)( const bp::list&, - const std::string&, - int ) >( &CalamaresPython::target_env_call ), - target_env_call_list_overloads( - bp::args( "args", - "stdin", - "timeout" ), - "Runs the specified command in the chroot of the target system.\n" - "Returns the program's exit code, or:\n" - "-1 = QProcess crash\n" - "-2 = QProcess cannot start\n" - "-3 = bad arguments\n" - "-4 = QProcess timeout" - ) - ); + static_cast< int ( * )( const std::string&, const std::string&, int ) >( &CalamaresPython::target_env_call ), + target_env_call_str_overloads( bp::args( "command", "stdin", "timeout" ), + "Runs the specified command in the chroot of the target system.\n" + "Returns the program's exit code, or:\n" + "-1 = QProcess crash\n" + "-2 = QProcess cannot start\n" + "-3 = bad arguments\n" + "-4 = QProcess timeout" ) ); + bp::def( "target_env_call", + static_cast< int ( * )( const bp::list&, const std::string&, int ) >( &CalamaresPython::target_env_call ), + target_env_call_list_overloads( bp::args( "args", "stdin", "timeout" ), + "Runs the specified command in the chroot of the target system.\n" + "Returns the program's exit code, or:\n" + "-1 = QProcess crash\n" + "-2 = QProcess cannot start\n" + "-3 = bad arguments\n" + "-4 = QProcess timeout" ) ); + bp::def( "check_target_env_call", + static_cast< int ( * )( const std::string&, const std::string&, int ) >( + &CalamaresPython::check_target_env_call ), + check_target_env_call_str_overloads( bp::args( "command", "stdin", "timeout" ), + "Runs the specified command in the chroot of the target system.\n" + "Returns 0, which is program's exit code if the program exited " + "successfully, or raises a subprocess.CalledProcessError." ) ); bp::def( "check_target_env_call", - static_cast< int (*)( const std::string&, - const std::string&, - int ) >( &CalamaresPython::check_target_env_call ), - check_target_env_call_str_overloads( - bp::args( "command", - "stdin", - "timeout" ), - "Runs the specified command in the chroot of the target system.\n" - "Returns 0, which is program's exit code if the program exited " - "successfully, or raises a subprocess.CalledProcessError." - ) - ); - bp::def( - "check_target_env_call", - static_cast< int (*)( const bp::list&, - const std::string&, - int ) >( &CalamaresPython::check_target_env_call ), - check_target_env_call_list_overloads( - bp::args( "args", - "stdin", - "timeout" ), - "Runs the specified command in the chroot of the target system.\n" - "Returns 0, which is program's exit code if the program exited " - "successfully, or raises a subprocess.CalledProcessError." - ) - ); + static_cast< int ( * )( const bp::list&, const std::string&, int ) >( &CalamaresPython::check_target_env_call ), + check_target_env_call_list_overloads( bp::args( "args", "stdin", "timeout" ), + "Runs the specified command in the chroot of the target system.\n" + "Returns 0, which is program's exit code if the program exited " + "successfully, or raises a subprocess.CalledProcessError." ) ); - bp::def( - "check_target_env_output", - static_cast< std::string (*)( const std::string&, - const std::string&, - int ) >( &CalamaresPython::check_target_env_output ), - check_target_env_output_str_overloads( - bp::args( "command", - "stdin", - "timeout" ), - "Runs the specified command in the chroot of the target system.\n" - "Returns the program's standard output, and raises a " - "subprocess.CalledProcessError if something went wrong." - ) - ); - bp::def( - "check_target_env_output", - static_cast< std::string (*)( const bp::list&, - const std::string&, - int ) >( &CalamaresPython::check_target_env_output ), - check_target_env_output_list_overloads( - bp::args( "args", - "stdin", - "timeout" ), - "Runs the specified command in the chroot of the target system.\n" - "Returns the program's standard output, and raises a " - "subprocess.CalledProcessError if something went wrong." - ) - ); - bp::def( - "obscure", - &CalamaresPython::obscure, - bp::args( "s" ), - "Simple string obfuscation function based on KStringHandler::obscure.\n" - "Returns a string, generated using a simple symmetric encryption.\n" - "Applying the function to a string obscured by this function will result " - "in the original string." - ); + bp::def( "check_target_env_output", + static_cast< std::string ( * )( const std::string&, const std::string&, int ) >( + &CalamaresPython::check_target_env_output ), + check_target_env_output_str_overloads( bp::args( "command", "stdin", "timeout" ), + "Runs the specified command in the chroot of the target system.\n" + "Returns the program's standard output, and raises a " + "subprocess.CalledProcessError if something went wrong." ) ); + bp::def( "check_target_env_output", + static_cast< std::string ( * )( const bp::list&, const std::string&, int ) >( + &CalamaresPython::check_target_env_output ), + check_target_env_output_list_overloads( bp::args( "args", "stdin", "timeout" ), + "Runs the specified command in the chroot of the target system.\n" + "Returns the program's standard output, and raises a " + "subprocess.CalledProcessError if something went wrong." ) ); + bp::def( "obscure", + &CalamaresPython::obscure, + bp::args( "s" ), + "Simple string obfuscation function based on KStringHandler::obscure.\n" + "Returns a string, generated using a simple symmetric encryption.\n" + "Applying the function to a string obscured by this function will result " + "in the original string." ); - bp::def( - "gettext_languages", - &CalamaresPython::gettext_languages, - "Returns list of languages (most to least-specific) for gettext." - ); + bp::def( "gettext_languages", + &CalamaresPython::gettext_languages, + "Returns list of languages (most to least-specific) for gettext." ); - bp::def( - "gettext_path", - &CalamaresPython::gettext_path, - "Returns path for gettext search." - ); + bp::def( "gettext_path", &CalamaresPython::gettext_path, "Returns path for gettext search." ); } -namespace Calamares { +namespace Calamares +{ PythonJob::PythonJob( const QString& scriptFile, @@ -255,8 +183,7 @@ PythonJob::PythonJob( const QString& scriptFile, } -PythonJob::~PythonJob() -{} +PythonJob::~PythonJob() {} QString @@ -270,10 +197,13 @@ QString PythonJob::prettyStatusMessage() const { if ( m_description.isEmpty() ) - return tr( "Running %1 operation." ) - .arg( QDir( m_workingPath ).dirName() ); + { + return tr( "Running %1 operation." ).arg( QDir( m_workingPath ).dirName() ); + } else + { return m_description; + } } @@ -282,24 +212,20 @@ PythonJob::exec() { // We assume m_scriptFile to be relative to m_workingPath. QDir workingDir( m_workingPath ); - if ( !workingDir.exists() || - !workingDir.isReadable() ) + if ( !workingDir.exists() || !workingDir.isReadable() ) { - return JobResult::error( tr( "Bad working directory path" ), - tr( "Working directory %1 for python job %2 is not readable." ) - .arg( m_workingPath ) - .arg( prettyName() ) ); + return JobResult::error( + tr( "Bad working directory path" ), + tr( "Working directory %1 for python job %2 is not readable." ).arg( m_workingPath ).arg( prettyName() ) ); } QFileInfo scriptFI( workingDir.absoluteFilePath( m_scriptFile ) ); - if ( !scriptFI.exists() || - !scriptFI.isFile() || - !scriptFI.isReadable() ) + if ( !scriptFI.exists() || !scriptFI.isFile() || !scriptFI.isReadable() ) { return JobResult::error( tr( "Bad main script file" ), tr( "Main script file %1 for python job %2 is not readable." ) - .arg( scriptFI.absoluteFilePath() ) - .arg( prettyName() ) ); + .arg( scriptFI.absoluteFilePath() ) + .arg( prettyName() ) ); } try @@ -310,15 +236,14 @@ PythonJob::exec() bp::dict calamaresNamespace = bp::extract< bp::dict >( calamaresModule.attr( "__dict__" ) ); calamaresNamespace[ "job" ] = CalamaresPython::PythonJobInterface( this ); - calamaresNamespace[ "globalstorage" ] = CalamaresPython::GlobalStoragePythonWrapper( - JobQueue::instance()->globalStorage() ); + calamaresNamespace[ "globalstorage" ] + = CalamaresPython::GlobalStoragePythonWrapper( JobQueue::instance()->globalStorage() ); - bp::object execResult = bp::exec_file( scriptFI.absoluteFilePath().toLocal8Bit().data(), - scriptNamespace, - scriptNamespace ); + bp::object execResult + = bp::exec_file( scriptFI.absoluteFilePath().toLocal8Bit().data(), scriptNamespace, scriptNamespace ); bp::object entryPoint = scriptNamespace[ "run" ]; - bp::object prettyNameFunc = scriptNamespace.get("pretty_name", bp::object()); + bp::object prettyNameFunc = scriptNamespace.get( "pretty_name", bp::object() ); cDebug() << "Job file" << scriptFI.absoluteFilePath(); if ( !prettyNameFunc.is_none() ) @@ -337,14 +262,16 @@ PythonJob::exec() if ( m_description.isEmpty() ) { - bp::extract< std::string > entryPoint_doc_attr(entryPoint.attr( "__doc__" ) ); + bp::extract< std::string > entryPoint_doc_attr( entryPoint.attr( "__doc__" ) ); if ( entryPoint_doc_attr.check() ) { m_description = QString::fromStdString( entryPoint_doc_attr() ).trimmed(); - auto i_newline = m_description.indexOf('\n'); + auto i_newline = m_description.indexOf( '\n' ); if ( i_newline > 0 ) + { m_description.truncate( i_newline ); + } cDebug() << "Job description from __doc__" << prettyName() << "=" << m_description; emit progress( 0 ); } @@ -356,7 +283,7 @@ PythonJob::exec() { return JobResult::ok(); } - else // Something happened in the Python job + else // Something happened in the Python job { bp::tuple resultTuple = bp::extract< bp::tuple >( runResult ); QString message = QString::fromStdString( bp::extract< std::string >( resultTuple[ 0 ] ) ); @@ -374,9 +301,7 @@ PythonJob::exec() bp::handle_exception(); PyErr_Clear(); return JobResult::internalError( - tr( "Boost.Python error in job \"%1\"." ).arg( prettyName() ), - msg, - JobResult::PythonUncaughtException ); + tr( "Boost.Python error in job \"%1\"." ).arg( prettyName() ), msg, JobResult::PythonUncaughtException ); } } @@ -392,10 +317,12 @@ CalamaresPython::Helper* PythonJob::helper() { auto ptr = CalamaresPython::Helper::s_instance; - if (!ptr) + if ( !ptr ) + { ptr = new CalamaresPython::Helper; + } return ptr; } -} // namespace Calamares +} // namespace Calamares diff --git a/src/libcalamares/PythonJob.h b/src/libcalamares/PythonJob.h index c3b447472..a2bdf171c 100644 --- a/src/libcalamares/PythonJob.h +++ b/src/libcalamares/PythonJob.h @@ -27,9 +27,10 @@ namespace CalamaresPython { class PythonJobInterface; class Helper; -} +} // namespace CalamaresPython -namespace Calamares { +namespace Calamares +{ class PythonJob : public Job { @@ -57,6 +58,6 @@ private: QVariantMap m_configurationMap; }; -} // namespace Calamares +} // namespace Calamares -#endif // CALAMARES_PYTHONJOB_H +#endif // CALAMARES_PYTHONJOB_H diff --git a/src/libcalamares/PythonJobApi.cpp b/src/libcalamares/PythonJobApi.cpp index 8e8b8b2ab..610003492 100644 --- a/src/libcalamares/PythonJobApi.cpp +++ b/src/libcalamares/PythonJobApi.cpp @@ -20,8 +20,8 @@ #include "PythonJobApi.h" #include "PythonHelper.h" -#include "utils/Logger.h" #include "utils/CalamaresUtilsSystem.h" +#include "utils/Logger.h" #include "utils/String.h" #include "GlobalStorage.h" @@ -40,15 +40,19 @@ static int _handle_check_target_env_call_error( const CalamaresUtils::ProcessResult& ec, const QString& cmd ) { if ( !ec.first ) + { return ec.first; + } QString raise = QString( "import subprocess\n" "e = subprocess.CalledProcessError(%1,\"%2\")\n" ) - .arg( ec.first ) - .arg( cmd ); + .arg( ec.first ) + .arg( cmd ); if ( !ec.second.isEmpty() ) - raise.append( QStringLiteral("e.output = \"\"\"%1\"\"\"\n").arg( ec.second ) ); - raise.append("raise e"); + { + raise.append( QStringLiteral( "e.output = \"\"\"%1\"\"\"\n" ).arg( ec.second ) ); + } + raise.append( "raise e" ); bp::exec( raise.toStdString().c_str() ); bp::throw_error_already_set(); return ec.first; @@ -63,11 +67,10 @@ mount( const std::string& device_path, const std::string& filesystem_name, const std::string& options ) { - return CalamaresUtils::System::instance()-> - mount( QString::fromStdString( device_path ), - QString::fromStdString( mount_point ), - QString::fromStdString( filesystem_name ), - QString::fromStdString( options ) ); + return CalamaresUtils::System::instance()->mount( QString::fromStdString( device_path ), + QString::fromStdString( mount_point ), + QString::fromStdString( filesystem_name ), + QString::fromStdString( options ) ); } @@ -77,64 +80,50 @@ _bp_list_to_qstringlist( const bp::list& args ) QStringList list; for ( int i = 0; i < bp::len( args ); ++i ) { - list.append( QString::fromStdString( - bp::extract< std::string >( args[ i ] ) ) ); + list.append( QString::fromStdString( bp::extract< std::string >( args[ i ] ) ) ); } return list; } static inline CalamaresUtils::ProcessResult -_target_env_command( - const QStringList& args, - const std::string& stdin, - int timeout ) +_target_env_command( const QStringList& args, const std::string& stdin, int timeout ) { - return CalamaresUtils::System::instance()-> - targetEnvCommand( args, - QString(), - QString::fromStdString( stdin ), - timeout ); + // Since Python doesn't give us the type system for distinguishing + // seconds from other integral types, massage to seconds here. + return CalamaresUtils::System::instance()->targetEnvCommand( + args, QString(), QString::fromStdString( stdin ), std::chrono::seconds( timeout ) ); } int -target_env_call( const std::string& command, - const std::string& stdin, - int timeout ) +target_env_call( const std::string& command, const std::string& stdin, int timeout ) { - return _target_env_command( - QStringList{ QString::fromStdString( command ) }, stdin, timeout ).first; + return _target_env_command( QStringList { QString::fromStdString( command ) }, stdin, timeout ).first; } int -target_env_call( const bp::list& args, - const std::string& stdin, - int timeout ) +target_env_call( const bp::list& args, const std::string& stdin, int timeout ) { - return _target_env_command( - _bp_list_to_qstringlist( args ), stdin, timeout ).first; + return _target_env_command( _bp_list_to_qstringlist( args ), stdin, timeout ).first; } int -check_target_env_call( const std::string& command, - const std::string& stdin, - int timeout ) +check_target_env_call( const std::string& command, const std::string& stdin, int timeout ) { - auto ec = _target_env_command( - QStringList{ QString::fromStdString( command ) }, stdin, timeout ); + auto ec = _target_env_command( QStringList { QString::fromStdString( command ) }, stdin, timeout ); return _handle_check_target_env_call_error( ec, QString::fromStdString( command ) ); } int -check_target_env_call( const bp::list& args, - const std::string& stdin, - int timeout ) +check_target_env_call( const bp::list& args, const std::string& stdin, int timeout ) { auto ec = _target_env_command( _bp_list_to_qstringlist( args ), stdin, timeout ); if ( !ec.first ) + { return ec.first; + } QStringList failedCmdList = _bp_list_to_qstringlist( args ); return _handle_check_target_env_call_error( ec, failedCmdList.join( ' ' ) ); @@ -142,25 +131,19 @@ check_target_env_call( const bp::list& args, std::string -check_target_env_output( const std::string& command, - const std::string& stdin, - int timeout ) +check_target_env_output( const std::string& command, const std::string& stdin, int timeout ) { - auto ec = _target_env_command( - QStringList{ QString::fromStdString( command ) }, stdin, timeout ); + auto ec = _target_env_command( QStringList { QString::fromStdString( command ) }, stdin, timeout ); _handle_check_target_env_call_error( ec, QString::fromStdString( command ) ); return ec.second.toStdString(); } std::string -check_target_env_output( const bp::list& args, - const std::string& stdin, - int timeout ) +check_target_env_output( const bp::list& args, const std::string& stdin, int timeout ) { QStringList list = _bp_list_to_qstringlist( args ); - auto ec = _target_env_command( - list, stdin, timeout ); + auto ec = _target_env_command( list, stdin, timeout ); _handle_check_target_env_call_error( ec, list.join( ' ' ) ); return ec.second.toStdString(); } @@ -192,7 +175,9 @@ void PythonJobInterface::setprogress( qreal progress ) { if ( progress >= 0 && progress <= 1 ) + { m_parent->emitProgress( progress ); + } } @@ -214,7 +199,8 @@ _gettext_languages() // own GlobalStoragePythonWrapper, which then holds a // GlobalStorage object for all of Python. Calamares::JobQueue* jq = Calamares::JobQueue::instance(); - Calamares::GlobalStorage* gs = jq ? jq->globalStorage() : CalamaresPython::GlobalStoragePythonWrapper::globalStorageInstance(); + Calamares::GlobalStorage* gs + = jq ? jq->globalStorage() : CalamaresPython::GlobalStoragePythonWrapper::globalStorageInstance(); QVariant localeConf_ = gs->value( "localeConf" ); if ( localeConf_.canConvert< QVariantMap >() ) @@ -244,7 +230,9 @@ gettext_languages() { bp::list pyList; for ( auto lang : _gettext_languages() ) + { pyList.append( lang.toStdString() ); + } return pyList; } @@ -255,7 +243,9 @@ _add_localedirs( QStringList& pathList, const QString& candidate ) { pathList.prepend( candidate ); if ( QDir( candidate ).cd( "lang" ) ) + { pathList.prepend( candidate + "/lang" ); + } } } @@ -264,16 +254,19 @@ gettext_path() { // TODO: distinguish between -d runs and normal runs // TODO: can we detect DESTDIR-installs? - QStringList candidatePaths = QStandardPaths::locateAll( QStandardPaths::GenericDataLocation, "locale", QStandardPaths::LocateDirectory ); + QStringList candidatePaths + = QStandardPaths::locateAll( QStandardPaths::GenericDataLocation, "locale", QStandardPaths::LocateDirectory ); QString extra = QCoreApplication::applicationDirPath(); - _add_localedirs( candidatePaths, extra ); // Often /usr/local/bin + _add_localedirs( candidatePaths, extra ); // Often /usr/local/bin if ( !extra.isEmpty() ) { QDir d( extra ); - if ( d.cd( "../share/locale" ) ) // Often /usr/local/bin/../share/locale -> /usr/local/share/locale + if ( d.cd( "../share/locale" ) ) // Often /usr/local/bin/../share/locale -> /usr/local/share/locale + { _add_localedirs( candidatePaths, d.canonicalPath() ); + } } - _add_localedirs( candidatePaths, QDir().canonicalPath() ); // . + _add_localedirs( candidatePaths, QDir().canonicalPath() ); // . cDebug() << "Determining gettext path from" << candidatePaths; @@ -294,4 +287,4 @@ gettext_path() } -} +} // namespace CalamaresPython diff --git a/src/libcalamares/PythonJobApi.h b/src/libcalamares/PythonJobApi.h index a19a0581b..3d3783f5f 100644 --- a/src/libcalamares/PythonJobApi.h +++ b/src/libcalamares/PythonJobApi.h @@ -35,29 +35,19 @@ int mount( const std::string& device_path, const std::string& filesystem_name = std::string(), const std::string& options = std::string() ); -int target_env_call( const std::string& command, - const std::string& stdin = std::string(), - int timeout = 0 ); +int target_env_call( const std::string& command, const std::string& stdin = std::string(), int timeout = 0 ); -int target_env_call( const boost::python::list& args, - const std::string& stdin = std::string(), - int timeout = 0 ); +int target_env_call( const boost::python::list& args, const std::string& stdin = std::string(), int timeout = 0 ); -int check_target_env_call( const std::string& command, - const std::string& stdin = std::string(), - int timeout = 0 ); +int check_target_env_call( const std::string& command, const std::string& stdin = std::string(), int timeout = 0 ); -int check_target_env_call( const boost::python::list& args, - const std::string& stdin = std::string(), - int timeout = 0 ); +int check_target_env_call( const boost::python::list& args, const std::string& stdin = std::string(), int timeout = 0 ); -std::string check_target_env_output( const std::string& command, - const std::string& stdin = std::string(), - int timeout = 0 ); +std::string +check_target_env_output( const std::string& command, const std::string& stdin = std::string(), int timeout = 0 ); -std::string check_target_env_output( const boost::python::list& args, - const std::string& stdin = std::string(), - int timeout = 0 ); +std::string +check_target_env_output( const boost::python::list& args, const std::string& stdin = std::string(), int timeout = 0 ); std::string obscure( const std::string& string ); @@ -85,6 +75,6 @@ private: Calamares::PythonJob* m_parent; }; -} +} // namespace CalamaresPython -#endif // PYTHONJOBAPI_H +#endif // PYTHONJOBAPI_H diff --git a/src/libcalamares/Settings.cpp b/src/libcalamares/Settings.cpp index 71825b1e5..b55292bd4 100644 --- a/src/libcalamares/Settings.cpp +++ b/src/libcalamares/Settings.cpp @@ -40,8 +40,10 @@ static QString requireString( const YAML::Node& config, const char* key ) { auto v = config[ key ]; - if ( hasValue(v) ) + if ( hasValue( v ) ) + { return QString::fromStdString( v.as< std::string >() ); + } else { cWarning() << Logger::SubEntry << "Required settings.conf key" << key << "is missing."; @@ -54,8 +56,10 @@ static bool requireBool( const YAML::Node& config, const char* key, bool d ) { auto v = config[ key ]; - if ( hasValue(v) ) + if ( hasValue( v ) ) + { return v.as< bool >(); + } else { cWarning() << Logger::SubEntry << "Required settings.conf key" << key << "is missing."; @@ -86,17 +90,17 @@ interpretModulesSearch( const bool debugMode, const QStringList& rawPaths, QStri // module search path in the build dir. if ( debugMode ) { - QString buildDirModules = QDir::current().absolutePath() + - QDir::separator() + "src" + - QDir::separator() + "modules"; + QString buildDirModules + = QDir::current().absolutePath() + QDir::separator() + "src" + QDir::separator() + "modules"; if ( QDir( buildDirModules ).exists() ) + { output.append( buildDirModules ); + } } // Install path is set in CalamaresAddPlugin.cmake - output.append( CalamaresUtils::systemLibDir().absolutePath() + - QDir::separator() + "calamares" + - QDir::separator() + "modules" ); + output.append( CalamaresUtils::systemLibDir().absolutePath() + QDir::separator() + "calamares" + + QDir::separator() + "modules" ); } else { @@ -106,7 +110,9 @@ interpretModulesSearch( const bool debugMode, const QStringList& rawPaths, QStri output.append( d.absolutePath() ); } else + { cDebug() << Logger::SubEntry << "module-search entry non-existent" << path; + } } } } @@ -124,15 +130,17 @@ interpretInstances( const YAML::Node& node, Settings::InstanceDescriptionList& c for ( const QVariant& instancesVListItem : instances ) { if ( instancesVListItem.type() != QVariant::Map ) + { continue; - QVariantMap instancesVListItemMap = - instancesVListItem.toMap(); + } + QVariantMap instancesVListItemMap = instancesVListItem.toMap(); Settings::InstanceDescription instanceMap; - for ( auto it = instancesVListItemMap.constBegin(); - it != instancesVListItemMap.constEnd(); ++it ) + for ( auto it = instancesVListItemMap.constBegin(); it != instancesVListItemMap.constEnd(); ++it ) { if ( it.value().type() != QVariant::String ) + { continue; + } instanceMap.insert( it.key(), it.value().toString() ); } customInstances.append( instanceMap ); @@ -149,37 +157,43 @@ interpretSequence( const YAML::Node& node, Settings::ModuleSequence& moduleSeque { QVariant sequenceV = CalamaresUtils::yamlToVariant( node ); if ( !( sequenceV.type() == QVariant::List ) ) + { throw YAML::Exception( YAML::Mark(), "sequence key does not have a list-value" ); + } const auto sequence = sequenceV.toList(); for ( const QVariant& sequenceVListItem : sequence ) { if ( sequenceVListItem.type() != QVariant::Map ) + { continue; + } QString thisActionS = sequenceVListItem.toMap().firstKey(); ModuleAction thisAction; if ( thisActionS == "show" ) + { thisAction = ModuleAction::Show; + } else if ( thisActionS == "exec" ) + { thisAction = ModuleAction::Exec; + } else + { continue; + } - QStringList thisActionRoster = sequenceVListItem - .toMap() - .value( thisActionS ) - .toStringList(); - moduleSequence.append( qMakePair( thisAction, - thisActionRoster ) ); + QStringList thisActionRoster = sequenceVListItem.toMap().value( thisActionS ).toStringList(); + moduleSequence.append( qMakePair( thisAction, thisActionRoster ) ); } } else + { throw YAML::Exception( YAML::Mark(), "sequence key is missing" ); + } } -Settings::Settings( const QString& settingsFilePath, - bool debugMode, - QObject* parent ) +Settings::Settings( const QString& settingsFilePath, bool debugMode, QObject* parent ) : QObject( parent ) , m_debug( debugMode ) , m_doChroot( true ) @@ -198,7 +212,8 @@ Settings::Settings( const QString& settingsFilePath, YAML::Node config = YAML::Load( ba.constData() ); Q_ASSERT( config.IsMap() ); - interpretModulesSearch( debugMode, CalamaresUtils::yamlToStringList( config[ "modules-search" ] ), m_modulesSearchPaths ); + interpretModulesSearch( + debugMode, CalamaresUtils::yamlToStringList( config[ "modules-search" ] ), m_modulesSearchPaths ); interpretInstances( config[ "instances" ], m_customModuleInstances ); interpretSequence( config[ "sequence" ], m_modulesSequence ); @@ -283,4 +298,4 @@ Settings::disableCancelDuringExec() const } -} +} // namespace Calamares diff --git a/src/libcalamares/Settings.h b/src/libcalamares/Settings.h index a095ee567..a52eac82e 100644 --- a/src/libcalamares/Settings.h +++ b/src/libcalamares/Settings.h @@ -36,9 +36,7 @@ class DLLEXPORT Settings : public QObject { Q_OBJECT public: - explicit Settings( const QString& settingsFilePath, - bool debugMode, - QObject* parent = nullptr ); + explicit Settings( const QString& settingsFilePath, bool debugMode, QObject* parent = nullptr ); static Settings* instance(); @@ -88,6 +86,6 @@ private: bool m_disableCancelDuringExec; }; -} +} // namespace Calamares -#endif // SETTINGS_H +#endif // SETTINGS_H diff --git a/src/libcalamares/geoip/GeoIPJSON.cpp b/src/libcalamares/geoip/GeoIPJSON.cpp index 4b7562d7e..85dc79619 100644 --- a/src/libcalamares/geoip/GeoIPJSON.cpp +++ b/src/libcalamares/geoip/GeoIPJSON.cpp @@ -30,7 +30,7 @@ namespace CalamaresUtils namespace GeoIP { -GeoIPJSON::GeoIPJSON(const QString& attribute) +GeoIPJSON::GeoIPJSON( const QString& attribute ) : Interface( attribute.isEmpty() ? QStringLiteral( "time_zone" ) : attribute ) { } @@ -42,19 +42,25 @@ GeoIPJSON::GeoIPJSON(const QString& attribute) * "foo" of @p m, like a regular JSON lookup would. */ static QString -selectMap( const QVariantMap& m, const QStringList& l, int index) +selectMap( const QVariantMap& m, const QStringList& l, int index ) { if ( index >= l.count() ) + { return QString(); + } - QString attributeName = l[index]; + QString attributeName = l[ index ]; if ( index == l.count() - 1 ) + { return CalamaresUtils::getString( m, attributeName ); + } else { bool success = false; // bogus if ( m.contains( attributeName ) ) - return selectMap( CalamaresUtils::getSubMap( m, attributeName, success ), l, index+1 ); + { + return selectMap( CalamaresUtils::getSubMap( m, attributeName, success ), l, index + 1 ); + } return QString(); } } @@ -67,18 +73,18 @@ GeoIPJSON::rawReply( const QByteArray& data ) YAML::Node doc = YAML::Load( data ); QVariant var = CalamaresUtils::yamlToVariant( doc ); - if ( !var.isNull() && - var.isValid() && - var.type() == QVariant::Map ) + if ( !var.isNull() && var.isValid() && var.type() == QVariant::Map ) { - return selectMap( var.toMap(), m_element.split('.'), 0 ); + return selectMap( var.toMap(), m_element.split( '.' ), 0 ); } else + { cWarning() << "Invalid YAML data for GeoIPJSON"; + } } catch ( YAML::Exception& e ) { - CalamaresUtils::explainYamlException( e, data, "GeoIP data"); + CalamaresUtils::explainYamlException( e, data, "GeoIP data" ); } return QString(); @@ -90,5 +96,5 @@ GeoIPJSON::processReply( const QByteArray& data ) return splitTZString( rawReply( data ) ); } -} -} // namespace +} // namespace GeoIP +} // namespace CalamaresUtils diff --git a/src/libcalamares/geoip/GeoIPJSON.h b/src/libcalamares/geoip/GeoIPJSON.h index 4d7ded631..3f7756dd8 100644 --- a/src/libcalamares/geoip/GeoIPJSON.h +++ b/src/libcalamares/geoip/GeoIPJSON.h @@ -45,9 +45,9 @@ public: explicit GeoIPJSON( const QString& attribute = QString() ); virtual RegionZonePair processReply( const QByteArray& ) override; - virtual QString rawReply(const QByteArray & ) override; -} ; + virtual QString rawReply( const QByteArray& ) override; +}; -} -} // namespace +} // namespace GeoIP +} // namespace CalamaresUtils #endif diff --git a/src/libcalamares/geoip/GeoIPTests.cpp b/src/libcalamares/geoip/GeoIPTests.cpp index ec7511370..3400bb24f 100644 --- a/src/libcalamares/geoip/GeoIPTests.cpp +++ b/src/libcalamares/geoip/GeoIPTests.cpp @@ -24,9 +24,7 @@ #endif #include "Handler.h" -#include -#include -#include +#include "network/Manager.h" #include @@ -34,21 +32,16 @@ QTEST_GUILESS_MAIN( GeoIPTests ) using namespace CalamaresUtils::GeoIP; -GeoIPTests::GeoIPTests() -{ -} +GeoIPTests::GeoIPTests() {} -GeoIPTests::~GeoIPTests() -{ -} +GeoIPTests::~GeoIPTests() {} void GeoIPTests::initTestCase() { } -static const char json_data_attribute[] = - "{\"time_zone\":\"Europe/Amsterdam\"}"; +static const char json_data_attribute[] = "{\"time_zone\":\"Europe/Amsterdam\"}"; void GeoIPTests::testJSON() @@ -67,7 +60,8 @@ GeoIPTests::testJSON() QCOMPARE( tz.first, QStringLiteral( "America" ) ); } -void GeoIPTests::testJSONalt() +void +GeoIPTests::testJSONalt() { GeoIPJSON handler( "zona_de_hora" ); @@ -102,7 +96,7 @@ GeoIPTests::testJSONbad() static const char xml_data_ubiquity[] = - R"( + R"( 85.150.1.1 OK NL @@ -133,8 +127,8 @@ GeoIPTests::testXML() void GeoIPTests::testXML2() { - static const char data[] = - "America/North Dakota/Beulah"; // With a space! + static const char data[] + = "America/North Dakota/Beulah"; // With a space! #ifdef QT_XML_LIB GeoIPXML handler; @@ -146,7 +140,8 @@ GeoIPTests::testXML2() } -void GeoIPTests::testXMLalt() +void +GeoIPTests::testXMLalt() { #ifdef QT_XML_LIB GeoIPXML handler( "ZT" ); @@ -173,63 +168,47 @@ GeoIPTests::testXMLbad() #endif } -void GeoIPTests::testSplitTZ() +void +GeoIPTests::testSplitTZ() { using namespace CalamaresUtils::GeoIP; - auto tz = splitTZString( QStringLiteral("Moon/Dark_side") ); - QCOMPARE( tz.first, QStringLiteral("Moon") ); - QCOMPARE( tz.second, QStringLiteral("Dark_side") ); + auto tz = splitTZString( QStringLiteral( "Moon/Dark_side" ) ); + QCOMPARE( tz.first, QStringLiteral( "Moon" ) ); + QCOMPARE( tz.second, QStringLiteral( "Dark_side" ) ); // Some providers return weirdly escaped data - tz = splitTZString( QStringLiteral("America\\/NewYork") ); - QCOMPARE( tz.first, QStringLiteral("America") ); - QCOMPARE( tz.second, QStringLiteral("NewYork") ); // That's not actually the zone name + tz = splitTZString( QStringLiteral( "America\\/NewYork" ) ); + QCOMPARE( tz.first, QStringLiteral( "America" ) ); + QCOMPARE( tz.second, QStringLiteral( "NewYork" ) ); // That's not actually the zone name // Check that bogus data fails tz = splitTZString( QString() ); QCOMPARE( tz.first, QString() ); - tz = splitTZString( QStringLiteral("America.NewYork") ); + tz = splitTZString( QStringLiteral( "America.NewYork" ) ); QCOMPARE( tz.first, QString() ); // Check that three-level is split properly and space is replaced - tz = splitTZString( QStringLiteral("America/North Dakota/Beulah") ); - QCOMPARE( tz.first, QStringLiteral("America") ); - QCOMPARE( tz.second, QStringLiteral("North_Dakota/Beulah") ); + tz = splitTZString( QStringLiteral( "America/North Dakota/Beulah" ) ); + QCOMPARE( tz.first, QStringLiteral( "America" ) ); + QCOMPARE( tz.second, QStringLiteral( "North_Dakota/Beulah" ) ); } -static QByteArray -synchronous_get( const char* urlstring ) -{ - QUrl url( urlstring ); - QNetworkAccessManager manager; - QEventLoop loop; - - qDebug() << "Fetching" << url; - - QObject::connect( &manager, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit ); - - QNetworkRequest request( url ); - QNetworkReply* reply = manager.get( request ); - loop.exec(); - reply->deleteLater(); - return reply->readAll(); -} - -#define CHECK_GET(t, selector, url) \ +#define CHECK_GET( t, selector, url ) \ { \ - auto tz = GeoIP##t( selector ).processReply( synchronous_get( url ) ); \ + auto tz = GeoIP##t( selector ).processReply( CalamaresUtils::Network::Manager::instance().synchronousGet( QUrl( url ) ) ); \ qDebug() << tz; \ QCOMPARE( default_tz, tz ); \ - auto tz2 = CalamaresUtils::GeoIP::Handler( ""#t, url, selector ).get(); \ + auto tz2 = CalamaresUtils::GeoIP::Handler( "" #t, url, selector ).get(); \ qDebug() << tz2; \ QCOMPARE( default_tz, tz2 ); \ } -void GeoIPTests::testGet() +void +GeoIPTests::testGet() { - if ( !QProcessEnvironment::systemEnvironment().contains( QStringLiteral("TEST_HTTP_GET") ) ) + if ( !QProcessEnvironment::systemEnvironment().contains( QStringLiteral( "TEST_HTTP_GET" ) ) ) { qDebug() << "Skipping HTTP GET tests, set TEST_HTTP_GET environment variable to enable"; return; @@ -237,7 +216,7 @@ void GeoIPTests::testGet() GeoIPJSON default_handler; // Call the KDE service the definitive source. - auto default_tz = default_handler.processReply( synchronous_get( "https://geoip.kde.org/v1/calamares" ) ); + auto default_tz = default_handler.processReply( CalamaresUtils::Network::Manager::instance().synchronousGet( QUrl( "https://geoip.kde.org/v1/calamares" ) ) ); // This is bogus, because the test isn't always run by me // QCOMPARE( default_tz.first, QStringLiteral("Europe") ); @@ -248,14 +227,14 @@ void GeoIPTests::testGet() // Each expansion of CHECK_GET does a synchronous GET, then checks that // the TZ data is the same as the default_tz; this is fragile if the // services don't agree on the location of where the test is run. - CHECK_GET( JSON, QString(), "https://geoip.kde.org/v1/calamares" ) // Check it's consistent - CHECK_GET( JSON, QStringLiteral("timezone"), "https://ipapi.co/json" ) // Different JSON - CHECK_GET( JSON, QStringLiteral("timezone"), "http://ip-api.com/json" ) + CHECK_GET( JSON, QString(), "https://geoip.kde.org/v1/calamares" ) // Check it's consistent + CHECK_GET( JSON, QStringLiteral( "timezone" ), "https://ipapi.co/json" ) // Different JSON + CHECK_GET( JSON, QStringLiteral( "timezone" ), "http://ip-api.com/json" ) - CHECK_GET( JSON, QStringLiteral("Location.TimeZone"), "https://geoip.kde.org/debug" ) // 2-level JSON + CHECK_GET( JSON, QStringLiteral( "Location.TimeZone" ), "https://geoip.kde.org/debug" ) // 2-level JSON #ifdef QT_XML_LIB CHECK_GET( XML, QString(), "http://geoip.ubuntu.com/lookup" ) // Ubiquity's XML format - CHECK_GET( XML, QString(), "https://geoip.kde.org/v1/ubiquity" ) // Temporary KDE service + CHECK_GET( XML, QString(), "https://geoip.kde.org/v1/ubiquity" ) // Temporary KDE service #endif } diff --git a/src/libcalamares/geoip/GeoIPXML.cpp b/src/libcalamares/geoip/GeoIPXML.cpp index b658042bf..d84eb3b21 100644 --- a/src/libcalamares/geoip/GeoIPXML.cpp +++ b/src/libcalamares/geoip/GeoIPXML.cpp @@ -48,10 +48,12 @@ getElementTexts( const QByteArray& data, const QString& tag ) cDebug() << "GeoIP found" << tzElements.length() << "elements"; for ( int it = 0; it < tzElements.length(); ++it ) { - auto e = tzElements.at(it).toElement(); + auto e = tzElements.at( it ).toElement(); auto e_text = e.text(); if ( !e_text.isEmpty() ) + { elements.append( e_text ); + } } } else @@ -60,7 +62,9 @@ getElementTexts( const QByteArray& data, const QString& tag ) } if ( elements.count() < 1 ) + { cWarning() << "GeopIP XML had no non-empty elements" << tag; + } return elements; } @@ -71,7 +75,9 @@ GeoIPXML::rawReply( const QByteArray& data ) { for ( const auto& e : getElementTexts( data, m_element ) ) if ( !e.isEmpty() ) + { return e; + } return QString(); } @@ -83,11 +89,13 @@ GeoIPXML::processReply( const QByteArray& data ) { auto tz = splitTZString( e ); if ( !tz.first.isEmpty() ) + { return tz; + } } return RegionZonePair(); } -} -} // namespace +} // namespace GeoIP +} // namespace CalamaresUtils diff --git a/src/libcalamares/geoip/GeoIPXML.h b/src/libcalamares/geoip/GeoIPXML.h index 356e88b12..73147ff91 100644 --- a/src/libcalamares/geoip/GeoIPXML.h +++ b/src/libcalamares/geoip/GeoIPXML.h @@ -45,9 +45,9 @@ public: explicit GeoIPXML( const QString& element = QString() ); virtual RegionZonePair processReply( const QByteArray& ) override; - virtual QString rawReply(const QByteArray & ) override; -} ; + virtual QString rawReply( const QByteArray& ) override; +}; -} -} // namespace +} // namespace GeoIP +} // namespace CalamaresUtils #endif diff --git a/src/libcalamares/geoip/Handler.cpp b/src/libcalamares/geoip/Handler.cpp index df033f476..99e55e926 100644 --- a/src/libcalamares/geoip/Handler.cpp +++ b/src/libcalamares/geoip/Handler.cpp @@ -19,18 +19,15 @@ #include "Handler.h" #include "GeoIPJSON.h" -#if defined(QT_XML_LIB) +#if defined( QT_XML_LIB ) #include "GeoIPXML.h" #endif +#include "network/Manager.h" #include "utils/Logger.h" #include "utils/NamedEnum.h" #include "utils/Variant.h" -#include -#include -#include - #include static const NamedEnumTable< CalamaresUtils::GeoIP::Handler::Type >& @@ -38,11 +35,15 @@ handlerTypes() { using Type = CalamaresUtils::GeoIP::Handler::Type; + // *INDENT-OFF* + // clang-format off static const NamedEnumTable names{ - { QStringLiteral( "none" ), Type::None}, - { QStringLiteral( "json" ), Type::JSON}, - { QStringLiteral( "xml" ), Type::XML} + { QStringLiteral( "none" ), Type::None }, + { QStringLiteral( "json" ), Type::JSON }, + { QStringLiteral( "xml" ), Type::XML } }; + // *INDENT-ON* + // clang-format on return names; } @@ -72,7 +73,7 @@ Handler::Handler( const QString& implementation, const QString& url, const QStri { cWarning() << "GeoIP style *none* does not do anything."; } -#if !defined(QT_XML_LIB) +#if !defined( QT_XML_LIB ) else if ( m_type == Type::XML ) { m_type = Type::None; @@ -81,40 +82,22 @@ Handler::Handler( const QString& implementation, const QString& url, const QStri #endif } -Handler::~Handler() -{ -} - -static QByteArray -synchronous_get( const QString& urlstring ) -{ - QUrl url( urlstring ); - QNetworkAccessManager manager; - QEventLoop loop; - - QObject::connect( &manager, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit ); - - QNetworkRequest request( url ); - QNetworkReply* reply = manager.get( request ); - loop.exec(); - reply->deleteLater(); - return reply->readAll(); -} +Handler::~Handler() {} static std::unique_ptr< Interface > create_interface( Handler::Type t, const QString& selector ) { - switch( t ) + switch ( t ) { - case Handler::Type::None: - return nullptr; - case Handler::Type::JSON: - return std::make_unique< GeoIPJSON >( selector ); - case Handler::Type::XML: -#if defined(QT_XML_LIB) - return std::make_unique< GeoIPXML >( selector ); + case Handler::Type::None: + return nullptr; + case Handler::Type::JSON: + return std::make_unique< GeoIPJSON >( selector ); + case Handler::Type::XML: +#if defined( QT_XML_LIB ) + return std::make_unique< GeoIPXML >( selector ); #else - return nullptr; + return nullptr; #endif } NOTREACHED return nullptr; @@ -125,9 +108,11 @@ do_query( Handler::Type type, const QString& url, const QString& selector ) { const auto interface = create_interface( type, selector ); if ( !interface ) + { return RegionZonePair(); + } - return interface->processReply( synchronous_get( url ) ); + return interface->processReply( CalamaresUtils::Network::Manager::instance().synchronousGet( url ) ); } static QString @@ -135,16 +120,20 @@ do_raw_query( Handler::Type type, const QString& url, const QString& selector ) { const auto interface = create_interface( type, selector ); if ( !interface ) + { return QString(); + } - return interface->rawReply( synchronous_get( url ) ); + return interface->rawReply( CalamaresUtils::Network::Manager::instance().synchronousGet( url ) ); } RegionZonePair Handler::get() const { if ( !isValid() ) + { return RegionZonePair(); + } return do_query( m_type, m_url, m_selector ); } @@ -156,17 +145,16 @@ Handler::query() const QString url = m_url; QString selector = m_selector; - return QtConcurrent::run( [=] - { - return do_query( type, url, selector ); - } ); + return QtConcurrent::run( [=] { return do_query( type, url, selector ); } ); } QString Handler::getRaw() const { if ( !isValid() ) + { return QString(); + } return do_raw_query( m_type, m_url, m_selector ); } @@ -178,11 +166,8 @@ Handler::queryRaw() const QString url = m_url; QString selector = m_selector; - return QtConcurrent::run( [=] - { - return do_raw_query( type, url, selector ); - } ); + return QtConcurrent::run( [=] { return do_raw_query( type, url, selector ); } ); } -} -} // namespace +} // namespace GeoIP +} // namespace CalamaresUtils diff --git a/src/libcalamares/geoip/Handler.h b/src/libcalamares/geoip/Handler.h index 8e435b5b7..518964caf 100644 --- a/src/libcalamares/geoip/Handler.h +++ b/src/libcalamares/geoip/Handler.h @@ -21,9 +21,9 @@ #include "Interface.h" -#include #include #include +#include namespace CalamaresUtils { @@ -46,7 +46,7 @@ public: None, JSON, XML - } ; + }; /** @brief An unconfigured handler; this always returns errors. */ Handler(); @@ -89,7 +89,6 @@ private: const QString m_selector; }; -} -} // namespace +} // namespace GeoIP +} // namespace CalamaresUtils #endif - diff --git a/src/libcalamares/geoip/Interface.cpp b/src/libcalamares/geoip/Interface.cpp index 36e680aab..2cecb63c5 100644 --- a/src/libcalamares/geoip/Interface.cpp +++ b/src/libcalamares/geoip/Interface.cpp @@ -25,14 +25,12 @@ namespace CalamaresUtils namespace GeoIP { -Interface::Interface(const QString& e) +Interface::Interface( const QString& e ) : m_element( e ) { } -Interface::~Interface() -{ -} +Interface::~Interface() {} RegionZonePair splitTZString( const QString& tz ) @@ -53,5 +51,5 @@ splitTZString( const QString& tz ) return RegionZonePair( QString(), QString() ); } -} -} // namespace +} // namespace GeoIP +} // namespace CalamaresUtils diff --git a/src/libcalamares/geoip/Interface.h b/src/libcalamares/geoip/Interface.h index 7db8c4c91..1a9beaa41 100644 --- a/src/libcalamares/geoip/Interface.h +++ b/src/libcalamares/geoip/Interface.h @@ -27,7 +27,7 @@ class QByteArray; -namespace CalamaresUtils +namespace CalamaresUtils { namespace GeoIP { @@ -38,18 +38,27 @@ namespace GeoIP * pasting the strings back together with a "/" is the right thing to * do. The Zone **may** contain a "/" (e.g. "Kentucky/Monticello"). */ -class DLLEXPORT RegionZonePair : public QPair +class DLLEXPORT RegionZonePair : public QPair< QString, QString > { public: /** @brief Construct from an existing pair. */ - explicit RegionZonePair( const QPair& p ) : QPair(p) { } + explicit RegionZonePair( const QPair& p ) + : QPair( p ) + { + } /** @brief Construct from two strings, like qMakePair(). */ - RegionZonePair( const QString& region, const QString& zone ) : QPair( region, zone ) { } + RegionZonePair( const QString& region, const QString& zone ) + : QPair( region, zone ) + { + } /** @brief An invalid zone pair (empty strings). */ - RegionZonePair() : QPair( QString(), QString() ) { } + RegionZonePair() + : QPair( QString(), QString() ) + { + } bool isValid() const { return !first.isEmpty(); } -} ; +}; /** @brief Splits a region/zone string into a pair. * @@ -60,8 +69,7 @@ public: * pair of empty QStrings if it can't. (e.g. America/North Dakota/Beulah * will return "America", "North_Dakota/Beulah"). */ -DLLEXPORT RegionZonePair -splitTZString( const QString& s ); +DLLEXPORT RegionZonePair splitTZString( const QString& s ); /** * @brief Interface for GeoIP retrievers. @@ -93,8 +101,8 @@ protected: Interface( const QString& e = QString() ); QString m_element; // string for selecting from data -} ; +}; -} -} // namespace +} // namespace GeoIP +} // namespace CalamaresUtils #endif diff --git a/src/libcalamares/geoip/test_geoip.cpp b/src/libcalamares/geoip/test_geoip.cpp index 5f7ab935c..32c6f4e24 100644 --- a/src/libcalamares/geoip/test_geoip.cpp +++ b/src/libcalamares/geoip/test_geoip.cpp @@ -30,34 +30,40 @@ using std::cerr; using namespace CalamaresUtils::GeoIP; -int main(int argc, char** argv) +int +main( int argc, char** argv ) { - if (argc != 2) + if ( argc != 2 ) { cerr << "Usage: curl url | test_geoip \n"; return 1; } Interface* handler = nullptr; - if ( QStringLiteral( "json" ) == argv[1] ) + if ( QStringLiteral( "json" ) == argv[ 1 ] ) + { handler = new GeoIPJSON; + } #ifdef QT_XML_LIB - else if ( QStringLiteral( "xml" ) == argv[1] ) + else if ( QStringLiteral( "xml" ) == argv[ 1 ] ) + { handler = new GeoIPXML; + } #endif if ( !handler ) { - cerr << "Unknown format '" << argv[1] << "'\n"; + cerr << "Unknown format '" << argv[ 1 ] << "'\n"; return 1; } QByteArray ba; - while( !std::cin.eof() ) { - char arr[1024]; - std::cin.read(arr, sizeof(arr)); - int s = static_cast( std::cin.gcount() ); - ba.append(arr, s); + while ( !std::cin.eof() ) + { + char arr[ 1024 ]; + std::cin.read( arr, sizeof( arr ) ); + int s = static_cast< int >( std::cin.gcount() ); + ba.append( arr, s ); } auto tz = handler->processReply( ba ); @@ -67,7 +73,8 @@ int main(int argc, char** argv) } else { - std::cout << "TimeZone Region=" << tz.first.toLatin1().constData() << "\nTimeZone Zone=" << tz.second.toLatin1().constData() << '\n'; + std::cout << "TimeZone Region=" << tz.first.toLatin1().constData() + << "\nTimeZone Zone=" << tz.second.toLatin1().constData() << '\n'; } return 0; diff --git a/src/libcalamares/locale/CountryData_p.cpp b/src/libcalamares/locale/CountryData_p.cpp index a6e9b3a95..f4736fa2e 100644 --- a/src/libcalamares/locale/CountryData_p.cpp +++ b/src/libcalamares/locale/CountryData_p.cpp @@ -10,12 +10,14 @@ * Unicode Data Files ("DATA FILES") include all data files under the directories: * https://www.unicode.org/Public/ * C. Terms of Use -* 2. Any person is hereby authorized, without fee, to view, use, reproduce, -* and distribute all documents and files, subject to the Terms and +* 2. Any person is hereby authorized, without fee, to view, use, reproduce, +* and distribute all documents and files, subject to the Terms and * Conditions herein. */ // BEGIN Generated from CLDR data +// *INDENT-OFF* +// clang-format off struct CountryData diff --git a/src/libcalamares/locale/Label.cpp b/src/libcalamares/locale/Label.cpp index 8d3cd443f..58c19101d 100644 --- a/src/libcalamares/locale/Label.cpp +++ b/src/libcalamares/locale/Label.cpp @@ -50,18 +50,24 @@ Label::setLabels( const QString& locale, LabelFormat format ) QString countryName; if ( languageName.isEmpty() ) + { languageName = QString( "* %1 (%2)" ).arg( locale, englishName ); + } - bool needsCountryName = ( format == LabelFormat::AlwaysWithCountry ) || - (locale.contains( '_' ) && QLocale::countriesForLanguage( m_locale.language() ).count() > 1 ); + bool needsCountryName = ( format == LabelFormat::AlwaysWithCountry ) + || ( locale.contains( '_' ) && QLocale::countriesForLanguage( m_locale.language() ).count() > 1 ); if ( needsCountryName ) + { countryName = m_locale.nativeCountryName(); + } m_label = needsCountryName ? longFormat.arg( languageName, countryName ) : languageName; - m_englishLabel = needsCountryName ? longFormat.arg( englishName, QLocale::countryToString( m_locale.country() ) ) : englishName; + m_englishLabel = needsCountryName ? longFormat.arg( englishName, QLocale::countryToString( m_locale.country() ) ) + : englishName; } -QLocale Label::getLocale( const QString& localeName ) +QLocale +Label::getLocale( const QString& localeName ) { if ( localeName.contains( "@latin" ) ) { @@ -69,8 +75,10 @@ QLocale Label::getLocale( const QString& localeName ) return QLocale( loc.language(), QLocale::Script::LatinScript, loc.country() ); } else + { return QLocale( localeName ); + } } -} -} // namespace +} // namespace Locale +} // namespace CalamaresUtils diff --git a/src/libcalamares/locale/Label.h b/src/libcalamares/locale/Label.h index 7935b0880..0fe61d909 100644 --- a/src/libcalamares/locale/Label.h +++ b/src/libcalamares/locale/Label.h @@ -23,7 +23,7 @@ #include #include -namespace CalamaresUtils +namespace CalamaresUtils { namespace Locale { @@ -39,7 +39,11 @@ class Label { public: /** @brief Formatting option for label -- add (country) to label. */ - enum class LabelFormat { AlwaysWithCountry, IfNeededWithCountry } ; + enum class LabelFormat + { + AlwaysWithCountry, + IfNeededWithCountry + }; /** @brief Empty locale. This uses the system-default locale. */ Label(); @@ -54,56 +58,33 @@ public: /** @brief Define a sorting order. * - * English (@see isEnglish() -- it means en_US) is sorted at the top. + * Locales are sorted by their id, which means the ISO 2-letter code + country. */ - bool operator <( const Label& other ) const - { - return m_localeId < other.m_localeId; - } + bool operator<( const Label& other ) const { return m_localeId < other.m_localeId; } /** @brief Is this locale English? * * en_US and en (American English) is defined as English. The Queen's * English -- proper English -- is relegated to non-English status. */ - bool isEnglish() const - { - return m_localeId == QLatin1Literal( "en_US" ) || m_localeId == QLatin1Literal( "en" ); - } + bool isEnglish() const { return m_localeId == QLatin1Literal( "en_US" ) || m_localeId == QLatin1Literal( "en" ); } /** @brief Get the human-readable name for this locale. */ - QString label() const - { - return m_label; - } + QString label() const { return m_label; } /** @brief Get the *English* human-readable name for this locale. */ - QString englishLabel() const - { - return m_englishLabel; - } + QString englishLabel() const { return m_englishLabel; } /** @brief Get the Qt locale. */ - QLocale locale() const - { - return m_locale; - } + QLocale locale() const { return m_locale; } - QString name() const - { - return m_locale.name(); - } + QString name() const { return m_locale.name(); } + QString id() const { return m_localeId; } /// @brief Convenience accessor to the language part of the locale - QLocale::Language language() const - { - return m_locale.language(); - } + QLocale::Language language() const { return m_locale.language(); } /// @brief Convenience accessor to the country part (if any) of the locale - QLocale::Country country() const - { - return m_locale.country(); - } + QLocale::Country country() const { return m_locale.country(); } /** @brief Get a Qt locale for the given @p localeName * @@ -119,9 +100,9 @@ protected: QString m_localeId; // the locale identifier, e.g. "en_GB" QString m_label; // the native name of the locale QString m_englishLabel; -} ; +}; -} -} // namespace +} // namespace Locale +} // namespace CalamaresUtils #endif diff --git a/src/libcalamares/locale/LabelModel.cpp b/src/libcalamares/locale/LabelModel.cpp index 79ff5d67b..bcb8af057 100644 --- a/src/libcalamares/locale/LabelModel.cpp +++ b/src/libcalamares/locale/LabelModel.cpp @@ -29,17 +29,18 @@ namespace Locale LabelModel::LabelModel( const QStringList& locales, QObject* parent ) : QAbstractListModel( parent ) + , m_localeIds( locales ) { Q_ASSERT( locales.count() > 0 ); m_locales.reserve( locales.count() ); for ( const auto& l : locales ) + { m_locales.push_back( Label( l ) ); + } } -LabelModel::~LabelModel() -{ -} +LabelModel::~LabelModel() {} int LabelModel::rowCount( const QModelIndex& ) const @@ -51,10 +52,14 @@ QVariant LabelModel::data( const QModelIndex& index, int role ) const { if ( ( role != LabelRole ) && ( role != EnglishLabelRole ) ) + { return QVariant(); + } if ( !index.isValid() ) + { return QVariant(); + } const auto& locale = m_locales.at( index.row() ); switch ( role ) @@ -75,59 +80,62 @@ LabelModel::locale( int row ) const { for ( const auto& l : m_locales ) if ( l.isEnglish() ) + { return l; - return m_locales[0]; + } + return m_locales[ 0 ]; } - return m_locales[row]; + return m_locales[ row ]; } int -LabelModel::find( std::function predicate ) const +LabelModel::find( std::function< bool( const Label& ) > predicate ) const { - for ( int row = 0; row < m_locales.count() ; ++row ) + for ( int row = 0; row < m_locales.count(); ++row ) { - if ( predicate( m_locales[row] ) ) + if ( predicate( m_locales[ row ] ) ) + { return row; + } } return -1; } int -LabelModel::find( std::function predicate ) const +LabelModel::find( std::function< bool( const QLocale& ) > predicate ) const { - return find( [&]( const Label& l ) - { - return predicate( l.locale() ); - } ); + return find( [&]( const Label& l ) { return predicate( l.locale() ); } ); } int LabelModel::find( const QLocale& locale ) const { - return find( [&]( const Label& l ) - { - return locale == l.locale(); - } ); + return find( [&]( const Label& l ) { return locale == l.locale(); } ); } int LabelModel::find( const QString& countryCode ) const { if ( countryCode.length() != 2 ) + { return -1; + } auto c_l = countryData( countryCode ); - int r = find( [&]( const Label& l ){ return ( l.language() == c_l.second ) && ( l.country() == c_l.first ); } ); + int r = find( [&]( const Label& l ) { return ( l.language() == c_l.second ) && ( l.country() == c_l.first ); } ); if ( r >= 0 ) + { return r; - return find( [&]( const Label& l ){ return l.language() == c_l.second; } ); + } + return find( [&]( const Label& l ) { return l.language() == c_l.second; } ); } -LabelModel* availableTranslations() +LabelModel* +availableTranslations() { - static LabelModel* model = new LabelModel( QString( CALAMARES_TRANSLATION_LANGUAGES ).split( ';') ); + static LabelModel* model = new LabelModel( QStringLiteral( CALAMARES_TRANSLATION_LANGUAGES ).split( ';' ) ); return model; } -} -} // namespace +} // namespace Locale +} // namespace CalamaresUtils diff --git a/src/libcalamares/locale/LabelModel.h b/src/libcalamares/locale/LabelModel.h index 2f3bee629..03daddbf3 100644 --- a/src/libcalamares/locale/LabelModel.h +++ b/src/libcalamares/locale/LabelModel.h @@ -26,7 +26,7 @@ #include -namespace CalamaresUtils +namespace CalamaresUtils { namespace Locale { @@ -54,12 +54,15 @@ public: */ const Label& locale( int row ) const; + /// @brief Returns all of the locale Ids (e.g. en_US) put into this model. + const QStringList& localeIds() const { return m_localeIds; } + /** @brief Searches for an item that matches @p predicate * * Returns the row number of the first match, or -1 if there isn't one. */ - int find( std::function predicate ) const; - int find( std::function predicate ) const; + int find( std::function< bool( const QLocale& ) > predicate ) const; + int find( std::function< bool( const Label& ) > predicate ) const; /// @brief Looks for an item using the same locale, -1 if there isn't one int find( const QLocale& ) const; /// @brief Looks for an item that best matches the 2-letter country code @@ -67,7 +70,8 @@ public: private: QVector< Label > m_locales; -} ; + QStringList m_localeIds; +}; /** @brief Returns a model with all available translations. * @@ -80,6 +84,6 @@ private: * NOTE: While the model is not typed const, it should be. Do not modify. */ DLLEXPORT LabelModel* availableTranslations(); -} -} // namespace +} // namespace Locale +} // namespace CalamaresUtils #endif diff --git a/src/libcalamares/locale/Lookup.cpp b/src/libcalamares/locale/Lookup.cpp index 73d706de6..baa3ce5b1 100644 --- a/src/libcalamares/locale/Lookup.cpp +++ b/src/libcalamares/locale/Lookup.cpp @@ -28,13 +28,13 @@ namespace Locale struct TwoChar { TwoChar( const QString& code ) - : cc1(0) - , cc2(0) + : cc1( 0 ) + , cc2( 0 ) { if ( code.length() == 2 ) { - cc1 = code[0].toLatin1(); - cc2 = code[1].toLatin1(); + cc1 = code[ 0 ].toLatin1(); + cc2 = code[ 1 ].toLatin1(); } } @@ -42,52 +42,65 @@ struct TwoChar char cc2; }; -static const CountryData* lookup( TwoChar c ) +static const CountryData* +lookup( TwoChar c ) { if ( !c.cc1 ) + { return nullptr; + } - const CountryData* p = std::find_if(country_data_table, country_data_table + country_data_size, - [c=c]( const CountryData& d ){ return (d.cc1 == c.cc1) && (d.cc2 == c.cc2); } - ); + const CountryData* p + = std::find_if( country_data_table, country_data_table + country_data_size, [c = c]( const CountryData& d ) { + return ( d.cc1 == c.cc1 ) && ( d.cc2 == c.cc2 ); + } ); if ( p == country_data_table + country_data_size ) + { return nullptr; + } return p; } -QLocale::Country countryForCode(const QString& code) +QLocale::Country +countryForCode( const QString& code ) { const CountryData* p = lookup( TwoChar( code ) ); return p ? p->c : QLocale::Country::AnyCountry; } -QLocale::Language languageForCountry(const QString& code) +QLocale::Language +languageForCountry( const QString& code ) { const CountryData* p = lookup( TwoChar( code ) ); return p ? p->l : QLocale::Language::AnyLanguage; } -QPair countryData(const QString& code) +QPair< QLocale::Country, QLocale::Language > +countryData( const QString& code ) { const CountryData* p = lookup( TwoChar( code ) ); return p ? qMakePair( p->c, p->l ) : qMakePair( QLocale::Country::AnyCountry, QLocale::Language::AnyLanguage ); } -QLocale countryLocale(const QString& code) +QLocale +countryLocale( const QString& code ) { auto p = countryData( code ); return QLocale( p.second, p.first ); } -QLocale::Language languageForCountry(QLocale::Country country) +QLocale::Language +languageForCountry( QLocale::Country country ) { - const CountryData* p = std::find_if(country_data_table, country_data_table + country_data_size, - [c=country]( const CountryData& d ){ return d.c == c; } - ); + const CountryData* p = std::find_if( country_data_table, + country_data_table + country_data_size, + [c = country]( const CountryData& d ) { return d.c == c; } ); if ( p == country_data_table + country_data_size ) + { return QLocale::Language::AnyLanguage; + } return p->l; } -} -} // namespace +} // namespace Locale +} // namespace CalamaresUtils diff --git a/src/libcalamares/locale/Lookup.h b/src/libcalamares/locale/Lookup.h index 9d1c23cd8..abcee0ed3 100644 --- a/src/libcalamares/locale/Lookup.h +++ b/src/libcalamares/locale/Lookup.h @@ -24,32 +24,32 @@ #include #include -namespace CalamaresUtils +namespace CalamaresUtils { namespace Locale { - /* All the functions in this file do lookups of locale data - * based on CLDR tables; these are lookups that you can't (easily) - * do with just QLocale (e.g. from 2-letter country code to a likely - * locale). - */ +/* All the functions in this file do lookups of locale data + * based on CLDR tables; these are lookups that you can't (easily) + * do with just QLocale (e.g. from 2-letter country code to a likely + * locale). + */ - /// @brief Map a 2-letter code to a Country, or AnyCountry if not found - DLLEXPORT QLocale::Country countryForCode( const QString& code ); - /** @brief Map a Country to a Language, or AnyLanguage if not found - * - * This is a *likely* language for the given country, based on the - * CLDR tables. For instance, this maps Belgium to Dutch. - */ - DLLEXPORT QLocale::Language languageForCountry( QLocale::Country country ); - /// @brief Map a 2-letter code to a Language, or AnyLanguage if not found - DLLEXPORT QLocale::Language languageForCountry( const QString& code ); +/// @brief Map a 2-letter code to a Country, or AnyCountry if not found +DLLEXPORT QLocale::Country countryForCode( const QString& code ); +/** @brief Map a Country to a Language, or AnyLanguage if not found + * + * This is a *likely* language for the given country, based on the + * CLDR tables. For instance, this maps Belgium to Dutch. + */ +DLLEXPORT QLocale::Language languageForCountry( QLocale::Country country ); +/// @brief Map a 2-letter code to a Language, or AnyLanguage if not found +DLLEXPORT QLocale::Language languageForCountry( const QString& code ); - /// @brief Get both Country and Language for a 2-letter code - DLLEXPORT QPair< QLocale::Country, QLocale::Language > countryData( const QString& code ); - /// @brief Get a likely locale for a 2-letter country code - DLLEXPORT QLocale countryLocale( const QString& code ); -} -} // namespace +/// @brief Get both Country and Language for a 2-letter code +DLLEXPORT QPair< QLocale::Country, QLocale::Language > countryData( const QString& code ); +/// @brief Get a likely locale for a 2-letter country code +DLLEXPORT QLocale countryLocale( const QString& code ); +} // namespace Locale +} // namespace CalamaresUtils #endif diff --git a/src/libcalamares/locale/Tests.cpp b/src/libcalamares/locale/Tests.cpp index 6fd0f3e61..a9e5e7399 100644 --- a/src/libcalamares/locale/Tests.cpp +++ b/src/libcalamares/locale/Tests.cpp @@ -19,23 +19,24 @@ #include "Tests.h" #include "locale/LabelModel.h" +#include "locale/TranslatableConfiguration.h" + +#include "CalamaresVersion.h" #include "utils/Logger.h" #include QTEST_GUILESS_MAIN( LocaleTests ) -LocaleTests::LocaleTests() -{ -} +LocaleTests::LocaleTests() {} -LocaleTests::~LocaleTests() -{ -} +LocaleTests::~LocaleTests() {} void LocaleTests::initTestCase() { + // Otherwise plain get() is dubious in the TranslatableConfiguration tests + QVERIFY( ( QLocale().name() == "C" ) || ( QLocale().name() == "en_US" ) ); } void @@ -82,6 +83,119 @@ LocaleTests::testEsperanto() QVERIFY( locale.language() == QLocale::Lithuanian ? locale.country() == QLocale::Lithuania : true ); QVERIFY( locale.language() != QLocale::C ); } - +#if QT_VERSION < QT_VERSION_CHECK( 5, 12, 2 ) QCOMPARE( QLocale( "eo" ).language(), QLocale::C ); +#else + QCOMPARE( QLocale( "eo" ).language(), QLocale::Esperanto ); +#endif +} + +static const QStringList& +someLanguages() +{ + static QStringList languages { "nl", "de", "da", "nb", "sr@latin", "ar", "ru" }; + return languages; +} + + +/** @brief Check consistency of test data + * Check that all the languages used in testing, are actually enabled + * in Calamares translations. + */ +void +LocaleTests::testTranslatableLanguages() +{ + QStringList availableLanguages = QString( CALAMARES_TRANSLATION_LANGUAGES ).split( ';' ); + cDebug() << "Translation languages:" << availableLanguages; + for ( const auto& language : someLanguages() ) + { + // Could be QVERIFY, but then we don't see what language code fails + QCOMPARE( availableLanguages.contains( language ) ? language : QString(), language ); + } +} + +/** @brief Test strings with no translations + */ +void +LocaleTests::testTranslatableConfig1() +{ + CalamaresUtils::Locale::TranslatedString ts0; + QVERIFY( ts0.isEmpty() ); + QCOMPARE( ts0.count(), 1 ); // the empty string + + CalamaresUtils::Locale::TranslatedString ts1( "Hello" ); + QCOMPARE( ts1.count(), 1 ); + QVERIFY( !ts1.isEmpty() ); + + QCOMPARE( ts1.get(), "Hello" ); + QCOMPARE( ts1.get( QLocale( "nl" ) ), "Hello" ); + + QVariantMap map; + map.insert( "description", "description (no language)" ); + CalamaresUtils::Locale::TranslatedString ts2( map, "description" ); + QCOMPARE( ts2.count(), 1 ); + QVERIFY( !ts2.isEmpty() ); + + QCOMPARE( ts2.get(), "description (no language)" ); + QCOMPARE( ts2.get( QLocale( "nl" ) ), "description (no language)" ); +} + +/** @bref Test strings with translations. + */ +void +LocaleTests::testTranslatableConfig2() +{ + QVariantMap map; + + for ( const auto& language : someLanguages() ) + { + map.insert( QString( "description[%1]" ).arg( language ), + QString( "description (language %1)" ).arg( language ) ); + if ( language != "nl" ) + { + map.insert( QString( "name[%1]" ).arg( language ), QString( "name (language %1)" ).arg( language ) ); + } + } + + // If there's no untranslated string in the map, it is considered empty + CalamaresUtils::Locale::TranslatedString ts0( map, "description" ); + QVERIFY( ts0.isEmpty() ); // Because no untranslated string + QCOMPARE( ts0.count(), + someLanguages().count() + 1 ); // But there are entries for the translations, plus an empty string + + // expand the map with untranslated entries + map.insert( QString( "description" ), "description (no language)" ); + map.insert( QString( "name" ), "name (no language)" ); + + CalamaresUtils::Locale::TranslatedString ts1( map, "description" ); + // The +1 is because "" is always also inserted + QCOMPARE( ts1.count(), someLanguages().count() + 1 ); + QVERIFY( !ts1.isEmpty() ); + + QCOMPARE( ts1.get(), "description (no language)" ); // it wasn't set + QCOMPARE( ts1.get( QLocale( "nl" ) ), "description (language nl)" ); + for ( const auto& language : someLanguages() ) + { + // Skip Serbian (latin) because QLocale() constructed with it + // doesn't retain the @latin part. + if ( language == "sr@latin" ) + { + continue; + } + // Could be QVERIFY, but then we don't see what language code fails + QCOMPARE( ts1.get( language ) == QString( "description (language %1)" ).arg( language ) ? language : QString(), + language ); + } + QCOMPARE( ts1.get( QLocale( QLocale::Language::Serbian, QLocale::Script::LatinScript, QLocale::Country::Serbia ) ), + "description (language sr@latin)" ); + + CalamaresUtils::Locale::TranslatedString ts2( map, "name" ); + // We skipped dutch this time + QCOMPARE( ts2.count(), someLanguages().count() ); + QVERIFY( !ts2.isEmpty() ); + + // This key doesn't exist + CalamaresUtils::Locale::TranslatedString ts3( map, "front" ); + QVERIFY( ts3.isEmpty() ); + QCOMPARE( ts3.count(), 1 ); // The empty string } diff --git a/src/libcalamares/locale/Tests.h b/src/libcalamares/locale/Tests.h index be712388f..c6949f3e4 100644 --- a/src/libcalamares/locale/Tests.h +++ b/src/libcalamares/locale/Tests.h @@ -33,6 +33,9 @@ private Q_SLOTS: void testLanguageModelCount(); void testEsperanto(); + void testTranslatableLanguages(); + void testTranslatableConfig1(); + void testTranslatableConfig2(); }; #endif diff --git a/src/libcalamares/locale/TranslatableConfiguration.cpp b/src/libcalamares/locale/TranslatableConfiguration.cpp new file mode 100644 index 000000000..bc39c398e --- /dev/null +++ b/src/libcalamares/locale/TranslatableConfiguration.cpp @@ -0,0 +1,107 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "TranslatableConfiguration.h" + +#include "LabelModel.h" + +#include "utils/Logger.h" +#include "utils/Variant.h" + +#include +#include + +namespace CalamaresUtils +{ +namespace Locale +{ +TranslatedString::TranslatedString( const QString& string ) +{ + m_strings[ QString() ] = string; +} +TranslatedString::TranslatedString( const QVariantMap& map, const QString& key ) +{ + // Get the un-decorated value for the key + QString value = CalamaresUtils::getString( map, key ); + m_strings[ QString() ] = value; + + for ( auto it = map.constBegin(); it != map.constEnd(); ++it ) + { + QString subkey = it.key(); + if ( subkey == key ) + { + // Already obtained, above + } + else if ( subkey.startsWith( key ) ) + { + QRegularExpressionMatch match; + if ( subkey.indexOf( QRegularExpression( "\\[([a-zA-Z_@]*)\\]" ), 0, &match ) > 0 ) + { + QString language = match.captured( 1 ); + m_strings[ language ] = it.value().toString(); + } + } + } +} + +QString +TranslatedString::get() const +{ + return get( QLocale() ); +} + +QString +TranslatedString::get( const QLocale& locale ) const +{ + QString localeName = locale.name(); + // Special case, sr@latin doesn't have the @latin reflected in the name + if ( locale.language() == QLocale::Language::Serbian && locale.script() == QLocale::Script::LatinScript ) + { + localeName = QStringLiteral( "sr@latin" ); + } + + if ( m_strings.contains( localeName ) ) + { + return m_strings[ localeName ]; + } + int index = localeName.indexOf( '@' ); + if ( index > 0 ) + { + localeName.truncate( index ); + if ( m_strings.contains( localeName ) ) + { + return m_strings[ localeName ]; + } + } + + index = localeName.indexOf( '_' ); + if ( index > 0 ) + { + localeName.truncate( index ); + if ( m_strings.contains( localeName ) ) + { + return m_strings[ localeName ]; + } + } + + return m_strings[ QString() ]; +} + + +} // namespace Locale +} // namespace CalamaresUtils diff --git a/src/libcalamares/locale/TranslatableConfiguration.h b/src/libcalamares/locale/TranslatableConfiguration.h new file mode 100644 index 000000000..45679bce0 --- /dev/null +++ b/src/libcalamares/locale/TranslatableConfiguration.h @@ -0,0 +1,80 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef LOCALE_TRANSLATABLECONFIGURATION_H +#define LOCALE_TRANSLATABLECONFIGURATION_H + +#include "DllMacro.h" + +#include +#include +#include + +namespace CalamaresUtils +{ +namespace Locale +{ +/** @brief A human-readable string from a configuration file + * + * The configuration files can contain human-readable strings, + * but those need their own translations and are not supported + * by QObject::tr or anything else. + */ +class DLLEXPORT TranslatedString +{ +public: + /** @brief Get all the translations connected to @p key + */ + TranslatedString( const QVariantMap& map, const QString& key ); + /** @brief Not-actually-translated string. + */ + TranslatedString( const QString& string ); + /// @brief Empty string + TranslatedString() + : TranslatedString( QString() ) + { + } + + /** @brief How many strings (translations) are there? + * + * This is always at least 1 (for the untranslated string), + * but may be more than 1 even when isEmpty() is true -- + * if there is no untranslated version, for instance. + */ + int count() const { return m_strings.count(); } + /** @brief Consider this string empty? + * + * Only the state of the untranslated string is considered, + * so count() may be more than 1 even while the string is empty. + */ + bool isEmpty() const { return m_strings[ QString() ].isEmpty(); } + + /// @brief Gets the string in the current locale + QString get() const; + + /// @brief Gets the string from the given locale + QString get( const QLocale& ) const; + +private: + // Maps locale name to human-readable string, "" is English + QMap< QString, QString > m_strings; +}; +} // namespace Locale +} // namespace CalamaresUtils + +#endif diff --git a/src/libcalamares/locale/cldr-extractor.py b/src/libcalamares/locale/cldr-extractor.py index 4e279337b..aae71ed1d 100644 --- a/src/libcalamares/locale/cldr-extractor.py +++ b/src/libcalamares/locale/cldr-extractor.py @@ -225,12 +225,14 @@ cpp_header_comment = """/* GENERATED FILE DO NOT EDIT * Unicode Data Files ("DATA FILES") include all data files under the directories: * https://www.unicode.org/Public/ * C. Terms of Use -* 2. Any person is hereby authorized, without fee, to view, use, reproduce, -* and distribute all documents and files, subject to the Terms and +* 2. Any person is hereby authorized, without fee, to view, use, reproduce, +* and distribute all documents and files, subject to the Terms and * Conditions herein. */ // BEGIN Generated from CLDR data +// *INDENT-OFF* +// clang-format off """ diff --git a/src/libcalamares/network/Manager.cpp b/src/libcalamares/network/Manager.cpp new file mode 100644 index 000000000..6c2d6caab --- /dev/null +++ b/src/libcalamares/network/Manager.cpp @@ -0,0 +1,177 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "Manager.h" + +#include +#include +#include +#include +#include + +namespace CalamaresUtils +{ +namespace Network +{ +void +RequestOptions::applyToRequest( QNetworkRequest* request ) const +{ + if ( m_flags & Flag::FollowRedirect ) + { + // Follows all redirects except unsafe ones (https to http). + request->setAttribute( QNetworkRequest::FollowRedirectsAttribute, true ); + } + + if ( m_flags & Flag::FakeUserAgent ) + { + // Not everybody likes the default User Agent used by this class (looking at you, + // sourceforge.net), so let's set a more descriptive one. + request->setRawHeader( "User-Agent", "Mozilla/5.0 (compatible; Calamares)" ); + } +} + +struct Manager::Private +{ + std::unique_ptr< QNetworkAccessManager > m_nam; + QUrl m_hasInternetUrl; + bool m_hasInternet; + + Private(); +}; + +Manager::Private::Private() + : m_nam( std::make_unique< QNetworkAccessManager >() ) + , m_hasInternet( false ) +{ +} + +Manager::Manager() + : d( std::make_unique< Private >() ) +{ +} + +Manager::~Manager() {} + +Manager& +Manager::instance() +{ + static auto* s_manager = new Manager(); + return *s_manager; +} + +bool +Manager::hasInternet() +{ + return d->m_hasInternet; +} + +bool +Manager::checkHasInternet() +{ + bool hasInternet = d->m_nam->networkAccessible() == QNetworkAccessManager::Accessible; + + if ( !hasInternet && ( d->m_nam->networkAccessible() == QNetworkAccessManager::UnknownAccessibility ) ) + { + hasInternet = synchronousPing( d->m_hasInternetUrl ); + } + d->m_hasInternet = hasInternet; + return hasInternet; +} + +void +Manager::setCheckHasInternetUrl( const QUrl& url ) +{ + d->m_hasInternetUrl = url; +} + +/** @brief Does a request synchronously, returns the request itself + * + * The extra options for the request are taken from @p options, + * including the timeout setting. + * + * On failure, returns nullptr (e.g. bad URL, timeout). The request + * is marked for later automatic deletion, so don't store the pointer. + */ +static QPair< RequestStatus, QNetworkReply* > +synchronousRun( const std::unique_ptr< QNetworkAccessManager >& nam, const QUrl& url, const RequestOptions& options ) +{ + QNetworkRequest request = QNetworkRequest( url ); + QNetworkReply* reply = nam->get( request ); + QEventLoop loop; + QTimer timer; + + // Bail out early if the request is bad + if ( reply->error() ) + { + reply->deleteLater(); + return qMakePair( RequestStatus( RequestStatus::Failed ), nullptr ); + } + + options.applyToRequest( &request ); + if ( options.hasTimeout() ) + { + timer.setSingleShot( true ); + QObject::connect( &timer, &QTimer::timeout, &loop, &QEventLoop::quit ); + timer.start( options.timeout() ); + } + + QObject::connect( reply, &QNetworkReply::finished, &loop, &QEventLoop::quit ); + loop.exec(); + if ( options.hasTimeout() && !timer.isActive() ) + { + reply->deleteLater(); + return qMakePair( RequestStatus( RequestStatus::Timeout ), nullptr ); + } + + reply->deleteLater(); + return qMakePair( RequestStatus( RequestStatus::Ok ), reply ); +} + +RequestStatus +Manager::synchronousPing( const QUrl& url, const RequestOptions& options ) +{ + if ( !url.isValid() ) + { + return RequestStatus::Failed; + } + + auto reply = synchronousRun( d->m_nam, url, options ); + if ( reply.first ) + { + return reply.second->bytesAvailable() ? RequestStatus::Ok : RequestStatus::Empty; + } + else + { + return reply.first; + } +} + +QByteArray +Manager::synchronousGet( const QUrl& url, const RequestOptions& options ) +{ + if ( !url.isValid() ) + { + return QByteArray(); + } + + auto reply = synchronousRun( d->m_nam, url, options ); + return reply.first ? reply.second->readAll() : QByteArray(); +} + +} // namespace Network +} // namespace CalamaresUtils diff --git a/src/libcalamares/network/Manager.h b/src/libcalamares/network/Manager.h new file mode 100644 index 000000000..041314f13 --- /dev/null +++ b/src/libcalamares/network/Manager.h @@ -0,0 +1,148 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef LIBCALAMARES_NETWORK_MANAGER_H +#define LIBCALAMARES_NETWORK_MANAGER_H + +#include "DllMacro.h" + +#include +#include +#include + +#include +#include + +class QNetworkRequest; + +namespace CalamaresUtils +{ +namespace Network +{ +class DLLEXPORT RequestOptions +{ +public: + using milliseconds = std::chrono::milliseconds; + + enum Flag + { + FollowRedirect = 0x1, + FakeUserAgent = 0x100 + }; + Q_DECLARE_FLAGS( Flags, Flag ) + + RequestOptions() + : m_flags( Flags() ) + , m_timeout( -1 ) + { + } + + RequestOptions( Flags f, milliseconds timeout = milliseconds( -1 ) ) + : m_flags( f ) + , m_timeout( timeout ) + { + } + + void applyToRequest( QNetworkRequest* ) const; + + bool hasTimeout() const { return m_timeout > milliseconds( 0 ); } + auto timeout() const { return m_timeout; } + +private: + Flags m_flags; + milliseconds m_timeout; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS( RequestOptions::Flags ); + +struct RequestStatus +{ + enum State + { + Ok, + Timeout, // Timeout exceeded + Failed, // bad Url + Empty // for ping(), response is empty + }; + + RequestStatus( State s = Ok ) + : status( s ) + { + } + operator bool() const { return status == Ok; } + + State status; +}; + +class DLLEXPORT Manager : QObject +{ + Q_OBJECT + + Manager(); + +public: + /** @brief Gets the single Manager instance. + * + * Typical code will use `auto& nam = Manager::instance();` + * to keep the reference. + */ + static Manager& instance(); + virtual ~Manager(); + + /** @brief Checks if the given @p url returns data. + * + * Returns a RequestStatus, which converts to @c true if the ping + * was successful. Other status reasons convert to @c false, + * typically because of no data, a Url error or no network access. + * + * May return Empty if the request was successful but returned + * no data at all. + */ + RequestStatus synchronousPing( const QUrl& url, const RequestOptions& options = RequestOptions() ); + + /** @brief Downloads the data from a given @p url + * + * Returns the data as a QByteArray, or an empty + * array if any error occurred (or no data was returned). + */ + QByteArray synchronousGet( const QUrl& url, const RequestOptions& options = RequestOptions() ); + + /// @brief Set the URL which is used for the general "is there internet" check. + void setCheckHasInternetUrl( const QUrl& url ); + /** @brief Do an explicit check for internet connectivity. + * + * This **may** do a ping to the configured check URL, but can also + * use other mechanisms. + */ + bool checkHasInternet(); + /** @brief Is there internet connectivity? + * + * This returns the result of the last explicit check, or if there + * is other information about the state of the internet connection, + * whatever is known. @c true means you can expect (all) internet + * connectivity to be present. + */ + bool hasInternet(); + +private: + struct Private; + std::unique_ptr< Private > d; +}; +} // namespace Network +} // namespace CalamaresUtils +#endif // LIBCALAMARES_NETWORK_MANAGER_H diff --git a/src/libcalamares/network/Tests.cpp b/src/libcalamares/network/Tests.cpp new file mode 100644 index 000000000..559a955fe --- /dev/null +++ b/src/libcalamares/network/Tests.cpp @@ -0,0 +1,48 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "Tests.h" + +#include "Manager.h" + +#include + +QTEST_GUILESS_MAIN( NetworkTests ) + +NetworkTests::NetworkTests() {} + +NetworkTests::~NetworkTests() {} + +void +NetworkTests::initTestCase() +{ +} + +void +NetworkTests::testInstance() +{ + auto& nam = CalamaresUtils::Network::Manager::instance(); + QVERIFY( !nam.hasInternet() ); +} + +void +NetworkTests::testPing() +{ + auto& nam = CalamaresUtils::Network::Manager::instance(); + QVERIFY( nam.synchronousPing( QUrl( "https://www.kde.org" ) ) ); +} diff --git a/src/libcalamares/network/Tests.h b/src/libcalamares/network/Tests.h new file mode 100644 index 000000000..b63f7eff0 --- /dev/null +++ b/src/libcalamares/network/Tests.h @@ -0,0 +1,38 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef LIBCALAMARES_NETWORK_TESTS_H +#define LIBCALAMARES_NETWORK_TESTS_H + +#include + +class NetworkTests : public QObject +{ + Q_OBJECT +public: + NetworkTests(); + ~NetworkTests() override; + +private Q_SLOTS: + void initTestCase(); + + void testInstance(); + void testPing(); +}; + +#endif diff --git a/src/libcalamares/partition/PartitionSize.cpp b/src/libcalamares/partition/PartitionSize.cpp index ee3d4c80b..fc8d72582 100644 --- a/src/libcalamares/partition/PartitionSize.cpp +++ b/src/libcalamares/partition/PartitionSize.cpp @@ -26,18 +26,25 @@ namespace CalamaresUtils namespace Partition { -static const NamedEnumTable& +static const NamedEnumTable< SizeUnit >& unitSuffixes() { - static const NamedEnumTable names{ + // *INDENT-OFF* + // clang-format off + static const NamedEnumTable< SizeUnit > names { { QStringLiteral( "%" ), SizeUnit::Percent }, { QStringLiteral( "K" ), SizeUnit::KiB }, { QStringLiteral( "KiB" ), SizeUnit::KiB }, { QStringLiteral( "M" ), SizeUnit::MiB }, { QStringLiteral( "MiB" ), SizeUnit::MiB }, { QStringLiteral( "G" ), SizeUnit::GiB }, - { QStringLiteral( "GiB" ), SizeUnit::GiB } + { QStringLiteral( "GiB" ), SizeUnit::GiB }, + { QStringLiteral( "KB" ), SizeUnit::KB }, + { QStringLiteral( "MB" ), SizeUnit::MB }, + { QStringLiteral( "GB" ), SizeUnit::GB } }; + // clang-format on + // *INDENT-ON* return names; } @@ -53,9 +60,11 @@ PartitionSize::PartitionSize( const QString& s ) if ( m_unit == SizeUnit::None ) { - m_value = s.toInt(); + m_value = s.toLongLong(); if ( m_value > 0 ) + { m_unit = SizeUnit::Byte; + } } if ( m_value <= 0 ) @@ -69,9 +78,13 @@ qint64 PartitionSize::toSectors( qint64 totalSectors, qint64 sectorSize ) const { if ( !isValid() ) + { return -1; + } if ( totalSectors < 1 || sectorSize < 1 ) + { return -1; + } switch ( m_unit ) { @@ -79,14 +92,21 @@ PartitionSize::toSectors( qint64 totalSectors, qint64 sectorSize ) const return -1; case SizeUnit::Percent: if ( value() == 100 ) + { return totalSectors; // Common-case, avoid futzing around + } else + { return totalSectors * value() / 100; + } case SizeUnit::Byte: + case SizeUnit::KB: case SizeUnit::KiB: + case SizeUnit::MB: case SizeUnit::MiB: + case SizeUnit::GB: case SizeUnit::GiB: - return CalamaresUtils::bytesToSectors ( toBytes(), sectorSize ); + return CalamaresUtils::bytesToSectors( toBytes(), sectorSize ); } return -1; @@ -96,7 +116,9 @@ qint64 PartitionSize::toBytes( qint64 totalSectors, qint64 sectorSize ) const { if ( !isValid() ) + { return -1; + } switch ( m_unit ) { @@ -104,14 +126,23 @@ PartitionSize::toBytes( qint64 totalSectors, qint64 sectorSize ) const return -1; case SizeUnit::Percent: if ( totalSectors < 1 || sectorSize < 1 ) + { return -1; + } if ( value() == 100 ) + { return totalSectors * sectorSize; // Common-case, avoid futzing around + } else + { return totalSectors * value() / 100; + } case SizeUnit::Byte: + case SizeUnit::KB: case SizeUnit::KiB: + case SizeUnit::MB: case SizeUnit::MiB: + case SizeUnit::GB: case SizeUnit::GiB: return toBytes(); } @@ -124,7 +155,9 @@ qint64 PartitionSize::toBytes( qint64 totalBytes ) const { if ( !isValid() ) + { return -1; + } switch ( m_unit ) { @@ -132,14 +165,23 @@ PartitionSize::toBytes( qint64 totalBytes ) const return -1; case SizeUnit::Percent: if ( totalBytes < 1 ) + { return -1; + } if ( value() == 100 ) + { return totalBytes; // Common-case, avoid futzing around + } else + { return totalBytes * value() / 100; + } case SizeUnit::Byte: + case SizeUnit::KB: case SizeUnit::KiB: + case SizeUnit::MB: case SizeUnit::MiB: + case SizeUnit::GB: case SizeUnit::GiB: return toBytes(); } @@ -152,7 +194,9 @@ qint64 PartitionSize::toBytes() const { if ( !isValid() ) + { return -1; + } switch ( m_unit ) { @@ -161,21 +205,29 @@ PartitionSize::toBytes() const return -1; case SizeUnit::Byte: return value(); + case SizeUnit::KB: + return CalamaresUtils::KBtoBytes( static_cast< unsigned long long >( value() ) ); case SizeUnit::KiB: - return CalamaresUtils::KiBtoBytes( static_cast( value() ) ); + return CalamaresUtils::KiBtoBytes( static_cast< unsigned long long >( value() ) ); + case SizeUnit::MB: + return CalamaresUtils::MBtoBytes( static_cast< unsigned long long >( value() ) ); case SizeUnit::MiB: - return CalamaresUtils::MiBtoBytes( static_cast( value() ) ); + return CalamaresUtils::MiBtoBytes( static_cast< unsigned long long >( value() ) ); + case SizeUnit::GB: + return CalamaresUtils::GBtoBytes( static_cast< unsigned long long >( value() ) ); case SizeUnit::GiB: - return CalamaresUtils::GiBtoBytes( static_cast( value() ) ); + return CalamaresUtils::GiBtoBytes( static_cast< unsigned long long >( value() ) ); } NOTREACHED return -1; } bool -PartitionSize::operator< ( const PartitionSize& other ) const +PartitionSize::operator<( const PartitionSize& other ) const { if ( !unitsComparable( m_unit, other.m_unit ) ) + { return false; + } switch ( m_unit ) { @@ -184,19 +236,24 @@ PartitionSize::operator< ( const PartitionSize& other ) const case SizeUnit::Percent: return ( m_value < other.m_value ); case SizeUnit::Byte: + case SizeUnit::KB: case SizeUnit::KiB: + case SizeUnit::MB: case SizeUnit::MiB: + case SizeUnit::GB: case SizeUnit::GiB: - return ( toBytes() < other.toBytes () ); + return ( toBytes() < other.toBytes() ); } NOTREACHED return false; } bool -PartitionSize::operator> ( const PartitionSize& other ) const +PartitionSize::operator>( const PartitionSize& other ) const { if ( !unitsComparable( m_unit, other.m_unit ) ) + { return false; + } switch ( m_unit ) { @@ -205,19 +262,24 @@ PartitionSize::operator> ( const PartitionSize& other ) const case SizeUnit::Percent: return ( m_value > other.m_value ); case SizeUnit::Byte: + case SizeUnit::KB: case SizeUnit::KiB: + case SizeUnit::MB: case SizeUnit::MiB: + case SizeUnit::GB: case SizeUnit::GiB: - return ( toBytes() > other.toBytes () ); + return ( toBytes() > other.toBytes() ); } NOTREACHED return false; } bool -PartitionSize::operator== ( const PartitionSize& other ) const +PartitionSize::operator==( const PartitionSize& other ) const { if ( !unitsComparable( m_unit, other.m_unit ) ) + { return false; + } switch ( m_unit ) { @@ -226,13 +288,16 @@ PartitionSize::operator== ( const PartitionSize& other ) const case SizeUnit::Percent: return ( m_value == other.m_value ); case SizeUnit::Byte: + case SizeUnit::KB: case SizeUnit::KiB: + case SizeUnit::MB: case SizeUnit::MiB: + case SizeUnit::GB: case SizeUnit::GiB: - return ( toBytes() == other.toBytes () ); + return ( toBytes() == other.toBytes() ); } NOTREACHED return false; } -} -} // namespace +} // namespace Partition +} // namespace CalamaresUtils diff --git a/src/libcalamares/partition/PartitionSize.h b/src/libcalamares/partition/PartitionSize.h index d8d5593a6..b22698e55 100644 --- a/src/libcalamares/partition/PartitionSize.h +++ b/src/libcalamares/partition/PartitionSize.h @@ -20,8 +20,8 @@ #ifndef PARTITION_PARTITIONSIZE_H #define PARTITION_PARTITIONSIZE_H -#include "utils/Units.h" #include "utils/NamedSuffix.h" +#include "utils/Units.h" // Qt #include @@ -36,8 +36,11 @@ enum class SizeUnit None, Percent, Byte, + KB, KiB, + MB, MiB, + GB, GiB }; @@ -47,21 +50,24 @@ enum class SizeUnit * the available drive space are on). This class handles parsing * of such strings from the config file. */ -class PartitionSize : public NamedSuffix +class PartitionSize : public NamedSuffix< SizeUnit, SizeUnit::None > { public: - PartitionSize() : NamedSuffix() { } - PartitionSize( int v, SizeUnit u ) : NamedSuffix( v, u ) { } + PartitionSize() + : NamedSuffix() + { + } + PartitionSize( int v, SizeUnit u ) + : NamedSuffix( v, u ) + { + } PartitionSize( const QString& ); - bool isValid() const - { - return ( unit() != SizeUnit::None ) && ( value() > 0 ); - } + bool isValid() const { return ( unit() != SizeUnit::None ) && ( value() > 0 ); } - bool operator< ( const PartitionSize& other ) const; - bool operator> ( const PartitionSize& other ) const; - bool operator== ( const PartitionSize& other ) const; + bool operator<( const PartitionSize& other ) const; + bool operator>( const PartitionSize& other ) const; + bool operator==( const PartitionSize& other ) const; /** @brief Convert the size to the number of sectors @p totalSectors . * @@ -109,14 +115,13 @@ public: */ static constexpr bool unitsComparable( const SizeUnit u1, const SizeUnit u2 ) { - return !( ( u1 == SizeUnit::None || u2 == SizeUnit::None ) || - ( u1 == SizeUnit::Percent && u2 != SizeUnit::Percent ) || - ( u1 != SizeUnit::Percent && u2 == SizeUnit::Percent ) ); + return !( ( u1 == SizeUnit::None || u2 == SizeUnit::None ) + || ( u1 == SizeUnit::Percent && u2 != SizeUnit::Percent ) + || ( u1 != SizeUnit::Percent && u2 == SizeUnit::Percent ) ); } - }; -} -} // namespace +} // namespace Partition +} // namespace CalamaresUtils -#endif // PARTITION_PARTITIONSIZE_H +#endif // PARTITION_PARTITIONSIZE_H diff --git a/src/libcalamares/partition/Tests.cpp b/src/libcalamares/partition/Tests.cpp index c0eb5206a..0800fa455 100644 --- a/src/libcalamares/partition/Tests.cpp +++ b/src/libcalamares/partition/Tests.cpp @@ -31,13 +31,9 @@ Q_DECLARE_METATYPE( SizeUnit ) QTEST_GUILESS_MAIN( PartitionSizeTests ) -PartitionSizeTests::PartitionSizeTests() -{ -} +PartitionSizeTests::PartitionSizeTests() {} -PartitionSizeTests::~PartitionSizeTests() -{ -} +PartitionSizeTests::~PartitionSizeTests() {} void PartitionSizeTests::initTestCase() @@ -47,36 +43,38 @@ PartitionSizeTests::initTestCase() void PartitionSizeTests::testUnitComparison_data() { - QTest::addColumn("u1"); - QTest::addColumn("u2"); - QTest::addColumn("comparable"); + QTest::addColumn< SizeUnit >( "u1" ); + QTest::addColumn< SizeUnit >( "u2" ); + QTest::addColumn< bool >( "comparable" ); - QTest::newRow("nones") << SizeUnit::None << SizeUnit::None << false; - QTest::newRow("none+%") << SizeUnit::None << SizeUnit::Percent<< false; - QTest::newRow("%+none") << SizeUnit::Percent << SizeUnit::None << false; - QTest::newRow("KiB+none") << SizeUnit::KiB << SizeUnit::None << false; - QTest::newRow("none+MiB") << SizeUnit::None << SizeUnit::MiB << false; + QTest::newRow( "nones" ) << SizeUnit::None << SizeUnit::None << false; + QTest::newRow( "none+%" ) << SizeUnit::None << SizeUnit::Percent << false; + QTest::newRow( "%+none" ) << SizeUnit::Percent << SizeUnit::None << false; + QTest::newRow( "KiB+none" ) << SizeUnit::KiB << SizeUnit::None << false; + QTest::newRow( "none+MiB" ) << SizeUnit::None << SizeUnit::MiB << false; - QTest::newRow("KiB+KiB") << SizeUnit::KiB << SizeUnit::KiB << true; - QTest::newRow("KiB+MiB") << SizeUnit::KiB << SizeUnit::MiB << true; - QTest::newRow("KiB+GiB") << SizeUnit::KiB << SizeUnit::GiB << true; - QTest::newRow("MiB+MiB") << SizeUnit::MiB << SizeUnit::MiB << true; - QTest::newRow("MiB+GiB") << SizeUnit::MiB << SizeUnit::GiB << true; - QTest::newRow("GiB+GiB") << SizeUnit::GiB << SizeUnit::GiB << true; + QTest::newRow( "KiB+KiB" ) << SizeUnit::KiB << SizeUnit::KiB << true; + QTest::newRow( "KiB+MiB" ) << SizeUnit::KiB << SizeUnit::MiB << true; + QTest::newRow( "KiB+GiB" ) << SizeUnit::KiB << SizeUnit::GiB << true; + QTest::newRow( "MiB+MiB" ) << SizeUnit::MiB << SizeUnit::MiB << true; + QTest::newRow( "MiB+GiB" ) << SizeUnit::MiB << SizeUnit::GiB << true; + QTest::newRow( "GiB+GiB" ) << SizeUnit::GiB << SizeUnit::GiB << true; - QTest::newRow("%+None") << SizeUnit::Percent << SizeUnit::None << false; - QTest::newRow("%+%") << SizeUnit::Percent << SizeUnit::Percent << true; - QTest::newRow("%+KiB") << SizeUnit::Percent << SizeUnit::KiB << false; + QTest::newRow( "%+None" ) << SizeUnit::Percent << SizeUnit::None << false; + QTest::newRow( "%+%" ) << SizeUnit::Percent << SizeUnit::Percent << true; + QTest::newRow( "%+KiB" ) << SizeUnit::Percent << SizeUnit::KiB << false; } static bool original_compare( SizeUnit m_unit, SizeUnit other_m_unit ) { - if ( ( m_unit == SizeUnit::None || other_m_unit == SizeUnit::None ) || - ( m_unit == SizeUnit::Percent && other_m_unit != SizeUnit::Percent ) || - ( m_unit != SizeUnit::Percent && other_m_unit == SizeUnit::Percent ) ) + if ( ( m_unit == SizeUnit::None || other_m_unit == SizeUnit::None ) + || ( m_unit == SizeUnit::Percent && other_m_unit != SizeUnit::Percent ) + || ( m_unit != SizeUnit::Percent && other_m_unit == SizeUnit::Percent ) ) + { return false; + } return true; } @@ -104,33 +102,33 @@ PartitionSizeTests::testUnitComparison() void PartitionSizeTests::testUnitNormalisation_data() { - QTest::addColumn("u1"); - QTest::addColumn("v"); - QTest::addColumn("bytes"); + QTest::addColumn< SizeUnit >( "u1" ); + QTest::addColumn< int >( "v" ); + QTest::addColumn< long >( "bytes" ); - QTest::newRow("none") << SizeUnit::None << 16 << -1L; - QTest::newRow("none") << SizeUnit::None << 0 << -1L; - QTest::newRow("none") << SizeUnit::None << -2 << -1L; + QTest::newRow( "none" ) << SizeUnit::None << 16 << -1L; + QTest::newRow( "none" ) << SizeUnit::None << 0 << -1L; + QTest::newRow( "none" ) << SizeUnit::None << -2 << -1L; - QTest::newRow("percent") << SizeUnit::Percent << 0 << -1L; - QTest::newRow("percent") << SizeUnit::Percent << 16 << -1L; - QTest::newRow("percent") << SizeUnit::Percent << -2 << -1L; + QTest::newRow( "percent" ) << SizeUnit::Percent << 0 << -1L; + QTest::newRow( "percent" ) << SizeUnit::Percent << 16 << -1L; + QTest::newRow( "percent" ) << SizeUnit::Percent << -2 << -1L; - QTest::newRow("KiB") << SizeUnit::KiB << 0 << -1L; - QTest::newRow("KiB") << SizeUnit::KiB << 1 << 1024L; - QTest::newRow("KiB") << SizeUnit::KiB << 1000 << 1024000L; - QTest::newRow("KiB") << SizeUnit::KiB << 1024 << 1024 * 1024L; - QTest::newRow("KiB") << SizeUnit::KiB << -2 << -1L; + QTest::newRow( "KiB" ) << SizeUnit::KiB << 0 << -1L; + QTest::newRow( "KiB" ) << SizeUnit::KiB << 1 << 1024L; + QTest::newRow( "KiB" ) << SizeUnit::KiB << 1000 << 1024000L; + QTest::newRow( "KiB" ) << SizeUnit::KiB << 1024 << 1024 * 1024L; + QTest::newRow( "KiB" ) << SizeUnit::KiB << -2 << -1L; - QTest::newRow("MiB") << SizeUnit::MiB << 0 << -1L; - QTest::newRow("MiB") << SizeUnit::MiB << 1 << 1024 * 1024L; - QTest::newRow("MiB") << SizeUnit::MiB << 1000 << 1024 * 1024000L; - QTest::newRow("MiB") << SizeUnit::MiB << 1024 << 1024 * 1024 * 1024L; - QTest::newRow("MiB") << SizeUnit::MiB << -2 << -1L; + QTest::newRow( "MiB" ) << SizeUnit::MiB << 0 << -1L; + QTest::newRow( "MiB" ) << SizeUnit::MiB << 1 << 1024 * 1024L; + QTest::newRow( "MiB" ) << SizeUnit::MiB << 1000 << 1024 * 1024000L; + QTest::newRow( "MiB" ) << SizeUnit::MiB << 1024 << 1024 * 1024 * 1024L; + QTest::newRow( "MiB" ) << SizeUnit::MiB << -2 << -1L; - QTest::newRow("GiB") << SizeUnit::GiB << 0 << -1L; - QTest::newRow("GiB") << SizeUnit::GiB << 1 << 1024 * 1024 * 1024L; - QTest::newRow("GiB") << SizeUnit::GiB << 2 << 2048 * 1024 * 1024L; + QTest::newRow( "GiB" ) << SizeUnit::GiB << 0 << -1L; + QTest::newRow( "GiB" ) << SizeUnit::GiB << 1 << 1024 * 1024 * 1024L; + QTest::newRow( "GiB" ) << SizeUnit::GiB << 2 << 2048 * 1024 * 1024L; } void @@ -140,5 +138,5 @@ PartitionSizeTests::testUnitNormalisation() QFETCH( int, v ); QFETCH( long, bytes ); - QCOMPARE( PartitionSize( v, u1 ).toBytes(), static_cast( bytes ) ); + QCOMPARE( PartitionSize( v, u1 ).toBytes(), static_cast< qint64 >( bytes ) ); } diff --git a/src/libcalamares/partition/Tests.h b/src/libcalamares/partition/Tests.h index 24398233d..799f50c04 100644 --- a/src/libcalamares/partition/Tests.h +++ b/src/libcalamares/partition/Tests.h @@ -30,10 +30,10 @@ public: private Q_SLOTS: void initTestCase(); - + void testUnitComparison_data(); void testUnitComparison(); - + void testUnitNormalisation_data(); void testUnitNormalisation(); }; diff --git a/src/libcalamares/utils/CalamaresUtilsSystem.cpp b/src/libcalamares/utils/CalamaresUtilsSystem.cpp index 7e55e6119..ea8f507bd 100644 --- a/src/libcalamares/utils/CalamaresUtilsSystem.cpp +++ b/src/libcalamares/utils/CalamaresUtilsSystem.cpp @@ -19,10 +19,10 @@ #include "CalamaresUtilsSystem.h" -#include "utils/Logger.h" #include "GlobalStorage.h" #include "JobQueue.h" #include "Settings.h" +#include "utils/Logger.h" #include #include @@ -34,8 +34,11 @@ #endif #ifdef Q_OS_FREEBSD +// clang-format off +// these includes need to stay in-order (that's a FreeBSD thing) #include #include +// clang-format on #endif /** @brief When logging commands, don't log everything. @@ -48,12 +51,12 @@ struct RedactedList { RedactedList( const QStringList& l ) - : list(l) + : list( l ) { } const QStringList& list; -} ; +}; QDebug& operator<<( QDebug& s, const RedactedList& l ) @@ -63,12 +66,18 @@ operator<<( QDebug& s, const RedactedList& l ) { for ( const auto& item : l.list ) if ( item.startsWith( "$6$" ) ) + { s << ""; + } else + { s << item; + } } else + { s << l.list; + } return s; } @@ -92,8 +101,7 @@ System::System( bool doChroot, QObject* parent ) } -System::~System() -{} +System::~System() {} System* @@ -111,18 +119,22 @@ System::instance() int System::mount( const QString& devicePath, - const QString& mountPoint, - const QString& filesystemName, - const QString& options ) + const QString& mountPoint, + const QString& filesystemName, + const QString& options ) { if ( devicePath.isEmpty() || mountPoint.isEmpty() ) { if ( devicePath.isEmpty() ) + { cWarning() << "Can't mount an empty device."; + } if ( mountPoint.isEmpty() ) + { cWarning() << "Can't mount on an empty mountpoint."; + } - return static_cast(ProcessResult::Code::NoWorkingDirectory); + return static_cast< int >( ProcessResult::Code::NoWorkingDirectory ); } QDir mountPointDir( mountPoint ); @@ -132,7 +144,7 @@ System::mount( const QString& devicePath, if ( !ok ) { cWarning() << "Could not create mountpoint" << mountPoint; - return static_cast(ProcessResult::Code::NoWorkingDirectory); + return static_cast< int >( ProcessResult::Code::NoWorkingDirectory ); } } @@ -140,28 +152,31 @@ System::mount( const QString& devicePath, QStringList args = { devicePath, mountPoint }; if ( !filesystemName.isEmpty() ) + { args << "-t" << filesystemName; + } if ( !options.isEmpty() ) + { args << "-o" << options; + } return QProcess::execute( program, args ); } ProcessResult -System::runCommand( - System::RunLocation location, - const QStringList& args, - const QString& workingPath, - const QString& stdInput, - int timeoutSec ) +System::runCommand( System::RunLocation location, + const QStringList& args, + const QString& workingPath, + const QString& stdInput, + std::chrono::seconds timeoutSec ) { QString output; - Calamares::GlobalStorage* gs = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr; + Calamares::GlobalStorage* gs + = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr; - if ( ( location == System::RunLocation::RunInTarget ) && - ( !gs || !gs->contains( "rootMountPoint" ) ) ) + if ( ( location == System::RunLocation::RunInTarget ) && ( !gs || !gs->contains( "rootMountPoint" ) ) ) { cWarning() << "No rootMountPoint in global storage"; return ProcessResult::Code::NoWorkingDirectory; @@ -197,7 +212,9 @@ System::runCommand( if ( !workingPath.isEmpty() ) { if ( QDir( workingPath ).exists() ) + { process.setWorkingDirectory( QDir( workingPath ).absolutePath() ); + } else { cWarning() << "Invalid working directory:" << workingPath; @@ -219,10 +236,11 @@ System::runCommand( } process.closeWriteChannel(); - if ( !process.waitForFinished( timeoutSec ? ( timeoutSec * 1000 ) : -1 ) ) + if ( !process.waitForFinished( timeoutSec > std::chrono::seconds::zero() + ? ( static_cast< int >( std::chrono::milliseconds( timeoutSec ).count() ) ) + : -1 ) ) { - cWarning().noquote().nospace() << "Timed out. Output so far:\n" << - process.readAllStandardOutput(); + cWarning().noquote().nospace() << "Timed out. Output so far:\n" << process.readAllStandardOutput(); return ProcessResult::Code::TimedOut; } @@ -242,31 +260,32 @@ System::runCommand( cDebug() << "Target cmd:" << RedactedList( args ); cDebug().noquote().nospace() << "Target output:\n" << output; } - return ProcessResult(r, output); + return ProcessResult( r, output ); } QString System::targetPath( const QString& path ) const { QString completePath; - + if ( doChroot() ) { - Calamares::GlobalStorage* gs = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr; + Calamares::GlobalStorage* gs + = Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr; if ( !gs || !gs->contains( "rootMountPoint" ) ) { cWarning() << "No rootMountPoint in global storage, cannot create target file" << path; return QString(); } - + completePath = gs->value( "rootMountPoint" ).toString() + '/' + path; } else { completePath = QStringLiteral( "/" ) + path; } - + return completePath; } @@ -278,59 +297,63 @@ System::createTargetFile( const QString& path, const QByteArray& contents ) cons { return QString(); } - + QFile f( completePath ); if ( f.exists() ) { return QString(); } - + QIODevice::OpenMode m = #if QT_VERSION >= QT_VERSION_CHECK( 5, 11, 0 ) // New flag from Qt 5.11, implies WriteOnly QIODevice::NewOnly | #endif QIODevice::WriteOnly | QIODevice::Truncate; - + if ( !f.open( m ) ) { return QString(); } - + if ( f.write( contents ) != contents.size() ) { f.close(); f.remove(); return QString(); } - + f.close(); return QFileInfo( f ).canonicalFilePath(); } -QPair +QPair< quint64, float > System::getTotalMemoryB() const { #ifdef Q_OS_LINUX struct sysinfo i; int r = sysinfo( &i ); - if (r) - return qMakePair(0, 0.0); + if ( r ) + { + return qMakePair( 0, 0.0 ); + } - return qMakePair(quint64( i.mem_unit ) * quint64( i.totalram ), 1.1); + return qMakePair( quint64( i.mem_unit ) * quint64( i.totalram ), 1.1 ); #elif defined( Q_OS_FREEBSD ) unsigned long memsize; - size_t s = sizeof(memsize); + size_t s = sizeof( memsize ); - int r = sysctlbyname("vm.kmem_size", &memsize, &s, NULL, 0); - if (r) - return qMakePair(0, 0.0); + int r = sysctlbyname( "vm.kmem_size", &memsize, &s, NULL, 0 ); + if ( r ) + { + return qMakePair( 0, 0.0 ); + } - return qMakePair(memsize, 1.01); + return qMakePair( memsize, 1.01 ); #else - return qMakePair(0, 0.0); // Unsupported + return qMakePair( 0, 0.0 ); // Unsupported #endif } @@ -341,14 +364,14 @@ System::getCpuDescription() const QString model; #ifdef Q_OS_LINUX - QFile file("/proc/cpuinfo"); - if ( file.open(QIODevice::ReadOnly | QIODevice::Text) ) + QFile file( "/proc/cpuinfo" ); + if ( file.open( QIODevice::ReadOnly | QIODevice::Text ) ) while ( !file.atEnd() ) { QByteArray line = file.readLine(); - if ( line.startsWith( "model name" ) && (line.indexOf( ':' ) > 0) ) + if ( line.startsWith( "model name" ) && ( line.indexOf( ':' ) > 0 ) ) { - model = QString::fromLatin1( line.right(line.length() - line.indexOf( ':' ) ) ); + model = QString::fromLatin1( line.right( line.length() - line.indexOf( ':' ) ) ); break; } } @@ -371,45 +394,50 @@ System::doChroot() const } Calamares::JobResult -ProcessResult::explainProcess( int ec, const QString& command, const QString& output, int timeout ) +ProcessResult::explainProcess( int ec, const QString& command, const QString& output, std::chrono::seconds timeout ) { using Calamares::JobResult; if ( ec == 0 ) + { return JobResult::ok(); + } QString outputMessage = output.isEmpty() - ? QCoreApplication::translate( "ProcessResult", "\nThere was no output from the command.") - : (QCoreApplication::translate( "ProcessResult", "\nOutput:\n") + output); + ? QCoreApplication::translate( "ProcessResult", "\nThere was no output from the command." ) + : ( QCoreApplication::translate( "ProcessResult", "\nOutput:\n" ) + output ); - if ( ec == static_cast(ProcessResult::Code::Crashed) ) //Crash! - return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command crashed." ), - QCoreApplication::translate( "ProcessResult", "Command %1 crashed." ) - .arg( command ) - + outputMessage ); + if ( ec == static_cast< int >( ProcessResult::Code::Crashed ) ) //Crash! + return JobResult::error( + QCoreApplication::translate( "ProcessResult", "External command crashed." ), + QCoreApplication::translate( "ProcessResult", "Command %1 crashed." ).arg( command ) + + outputMessage ); - if ( ec == static_cast(ProcessResult::Code::FailedToStart) ) - return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command failed to start." ), - QCoreApplication::translate( "ProcessResult", "Command %1 failed to start." ) - .arg( command ) ); + if ( ec == static_cast< int >( ProcessResult::Code::FailedToStart ) ) + return JobResult::error( + QCoreApplication::translate( "ProcessResult", "External command failed to start." ), + QCoreApplication::translate( "ProcessResult", "Command %1 failed to start." ).arg( command ) ); - if ( ec == static_cast(ProcessResult::Code::NoWorkingDirectory) ) - return JobResult::error( QCoreApplication::translate( "ProcessResult", "Internal error when starting command." ), - QCoreApplication::translate( "ProcessResult", "Bad parameters for process job call." ) ); + if ( ec == static_cast< int >( ProcessResult::Code::NoWorkingDirectory ) ) + return JobResult::error( + QCoreApplication::translate( "ProcessResult", "Internal error when starting command." ), + QCoreApplication::translate( "ProcessResult", "Bad parameters for process job call." ) ); - if ( ec == static_cast(ProcessResult::Code::TimedOut) ) - return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command failed to finish." ), - QCoreApplication::translate( "ProcessResult", "Command %1 failed to finish in %2 seconds." ) - .arg( command ) - .arg( timeout ) - + outputMessage ); + if ( ec == static_cast< int >( ProcessResult::Code::TimedOut ) ) + return JobResult::error( + QCoreApplication::translate( "ProcessResult", "External command failed to finish." ), + QCoreApplication::translate( "ProcessResult", "Command %1 failed to finish in %2 seconds." ) + .arg( command ) + .arg( timeout.count() ) + + outputMessage ); //Any other exit code - return JobResult::error( QCoreApplication::translate( "ProcessResult", "External command finished with errors." ), - QCoreApplication::translate( "ProcessResult", "Command %1 finished with exit code %2." ) - .arg( command ) - .arg( ec ) - + outputMessage ); + return JobResult::error( + QCoreApplication::translate( "ProcessResult", "External command finished with errors." ), + QCoreApplication::translate( "ProcessResult", "Command %1 finished with exit code %2." ) + .arg( command ) + .arg( ec ) + + outputMessage ); } -} // namespace +} // namespace CalamaresUtils diff --git a/src/libcalamares/utils/CalamaresUtilsSystem.h b/src/libcalamares/utils/CalamaresUtilsSystem.h index f778b67c9..8265f0fdb 100644 --- a/src/libcalamares/utils/CalamaresUtilsSystem.h +++ b/src/libcalamares/utils/CalamaresUtilsSystem.h @@ -27,6 +27,8 @@ #include #include +#include + namespace CalamaresUtils { class ProcessResult : public QPair< int, QString > @@ -34,15 +36,21 @@ class ProcessResult : public QPair< int, QString > public: enum class Code : int { - Crashed = -1, // Must match special return values from QProcess + Crashed = -1, // Must match special return values from QProcess FailedToStart = -2, // Must match special return values from QProcess NoWorkingDirectory = -3, TimedOut = -4 - } ; + }; /** @brief Implicit one-argument constructor has no output, only a return code */ - ProcessResult( Code r ) : QPair< int, QString >( static_cast(r), QString() ) {} - ProcessResult( int r, QString s ) : QPair< int, QString >( r, s ) {} + ProcessResult( Code r ) + : QPair< int, QString >( static_cast< int >( r ), QString() ) + { + } + ProcessResult( int r, QString s ) + : QPair< int, QString >( r, s ) + { + } int getExitCode() const { return first; } QString getOutput() const { return second; } @@ -60,20 +68,21 @@ public: * @param timeout Timeout passed to the process runner, for explaining * error code -4 (timeout). */ - static Calamares::JobResult explainProcess( int errorCode, const QString& command, const QString& output, int timeout ); + static Calamares::JobResult + explainProcess( int errorCode, const QString& command, const QString& output, std::chrono::seconds timeout ); /// @brief Convenience wrapper for explainProcess() - inline Calamares::JobResult explainProcess( const QString& command, int timeout ) const + inline Calamares::JobResult explainProcess( const QString& command, std::chrono::seconds timeout ) const { return explainProcess( getExitCode(), command, getOutput(), timeout ); } /// @brief Convenience wrapper for explainProcess() - inline Calamares::JobResult explainProcess( const QStringList& command, int timeout ) const + inline Calamares::JobResult explainProcess( const QStringList& command, std::chrono::seconds timeout ) const { return explainProcess( getExitCode(), command.join( ' ' ), getOutput(), timeout ); } -} ; +}; /** * @brief The System class is a singleton with utility functions that perform @@ -114,7 +123,11 @@ public: /** (Typed) Boolean describing where a particular command should be run, * whether in the host (live) system or in the (chroot) target system. */ - enum class RunLocation { RunInHost, RunInTarget }; + enum class RunLocation + { + RunInHost, + RunInTarget + }; /** * Runs the specified command in the chroot of the target system. @@ -133,37 +146,31 @@ public: * NoWorkingDirectory = bad arguments * TimedOut = QProcess timeout */ - static DLLEXPORT ProcessResult runCommand( - RunLocation location, - const QStringList &args, - const QString& workingPath = QString(), - const QString& stdInput = QString(), - int timeoutSec = 0 ); + static DLLEXPORT ProcessResult runCommand( RunLocation location, + const QStringList& args, + const QString& workingPath = QString(), + const QString& stdInput = QString(), + std::chrono::seconds timeoutSec = std::chrono::seconds( 0 ) ); /** @brief Convenience wrapper for runCommand(). * Runs the command in the location specified through the boolean * doChroot(), which is what you usually want for running commands * during installation. */ - inline ProcessResult targetEnvCommand( - const QStringList &args, - const QString& workingPath = QString(), - const QString& stdInput = QString(), - int timeoutSec = 0 ) + inline ProcessResult targetEnvCommand( const QStringList& args, + const QString& workingPath = QString(), + const QString& stdInput = QString(), + std::chrono::seconds timeoutSec = std::chrono::seconds( 0 ) ) { return runCommand( - m_doChroot ? RunLocation::RunInTarget : RunLocation::RunInHost, - args, - workingPath, - stdInput, - timeoutSec ); + m_doChroot ? RunLocation::RunInTarget : RunLocation::RunInHost, args, workingPath, stdInput, timeoutSec ); } /** @brief Convenience wrapper for targetEnvCommand() which returns only the exit code */ inline int targetEnvCall( const QStringList& args, const QString& workingPath = QString(), const QString& stdInput = QString(), - int timeoutSec = 0 ) + std::chrono::seconds timeoutSec = std::chrono::seconds( 0 ) ) { return targetEnvCommand( args, workingPath, stdInput, timeoutSec ).first; } @@ -172,9 +179,9 @@ public: inline int targetEnvCall( const QString& command, const QString& workingPath = QString(), const QString& stdInput = QString(), - int timeoutSec = 0 ) + std::chrono::seconds timeoutSec = std::chrono::seconds( 0 ) ) { - return targetEnvCall( QStringList{ command }, workingPath, stdInput, timeoutSec ); + return targetEnvCall( QStringList { command }, workingPath, stdInput, timeoutSec ); } /** @brief Convenience wrapper for targetEnvCommand() which returns only the exit code @@ -182,10 +189,10 @@ public: * Places the called program's output in the @p output string. */ int targetEnvOutput( const QStringList& args, - QString& output, - const QString& workingPath = QString(), - const QString& stdInput = QString(), - int timeoutSec = 0 ) + QString& output, + const QString& workingPath = QString(), + const QString& stdInput = QString(), + std::chrono::seconds timeoutSec = std::chrono::seconds( 0 ) ) { auto r = targetEnvCommand( args, workingPath, stdInput, timeoutSec ); output = r.second; @@ -200,45 +207,45 @@ public: QString& output, const QString& workingPath = QString(), const QString& stdInput = QString(), - int timeoutSec = 0 ) + std::chrono::seconds timeoutSec = std::chrono::seconds( 0 ) ) { - return targetEnvOutput( QStringList{ command }, output, workingPath, stdInput, timeoutSec ); + return targetEnvOutput( QStringList { command }, output, workingPath, stdInput, timeoutSec ); } - + /** @brief Gets a path to a file in the target system, from the host. - * + * * @param path Path to the file; this is interpreted * from the root of the target system (whatever that may be, * but / in the chroot, or / in OEM modes). - * + * * @return The complete path to the target file, from * the root of the host system, or empty on failure. - * + * * For instance, during installation where the target root is * mounted on /tmp/calamares-something, asking for targetPath("/etc/passwd") * will give you /tmp/calamares-something/etc/passwd. - * + * * No attempt is made to canonicalize anything, since paths might not exist. - */ + */ DLLEXPORT QString targetPath( const QString& path ) const; - + /** @brief Create a (small-ish) file in the target system. - * + * * @param path Path to the file; this is interpreted * from the root of the target system (whatever that may be, * but / in the chroot, or / in OEM modes). * @param contents Actual content of the file. - * + * * Will not overwrite files. Returns an empty string if the * target file already exists. - * + * * @return The complete canonical path to the target file from the * root of the host system, or empty on failure. (Here, it is * possible to be canonical because the file exists). */ DLLEXPORT QString createTargetFile( const QString& path, const QByteArray& contents ) const; - + /** * @brief getTotalMemoryB returns the total main memory, in bytes. * @@ -253,7 +260,7 @@ public: * * @return size, guesstimate-factor */ - DLLEXPORT QPair getTotalMemoryB() const; + DLLEXPORT QPair< quint64, float > getTotalMemoryB() const; /** * @brief getCpuDescription returns a string describing the CPU. @@ -277,6 +284,6 @@ private: bool m_doChroot; }; -} // namespace +} // namespace CalamaresUtils #endif diff --git a/src/libcalamares/utils/CommandList.cpp b/src/libcalamares/utils/CommandList.cpp index 9916c71fe..1a3075a43 100644 --- a/src/libcalamares/utils/CommandList.cpp +++ b/src/libcalamares/utils/CommandList.cpp @@ -32,83 +32,104 @@ namespace CalamaresUtils { -static CommandLine get_variant_object( const QVariantMap& m ) +static CommandLine +get_variant_object( const QVariantMap& m ) { QString command = CalamaresUtils::getString( m, "command" ); - int timeout = CalamaresUtils::getInteger( m, "timeout", CommandLine::TimeoutNotSet ); + qint64 timeout = CalamaresUtils::getInteger( m, "timeout", -1 ); if ( !command.isEmpty() ) - return CommandLine( command, timeout ); + { + return CommandLine( command, timeout >= 0 ? std::chrono::seconds( timeout ) : CommandLine::TimeoutNotSet() ); + } cWarning() << "Bad CommandLine element" << m; return CommandLine(); } -static CommandList_t get_variant_stringlist( const QVariantList& l ) +static CommandList_t +get_variant_stringlist( const QVariantList& l ) { CommandList_t retl; unsigned int count = 0; for ( const auto& v : l ) { if ( v.type() == QVariant::String ) - retl.append( CommandLine( v.toString(), CommandLine::TimeoutNotSet ) ); + { + retl.append( CommandLine( v.toString(), CommandLine::TimeoutNotSet() ) ); + } else if ( v.type() == QVariant::Map ) { auto command( get_variant_object( v.toMap() ) ); if ( command.isValid() ) + { retl.append( command ); + } // Otherwise warning is already given } else + { cWarning() << "Bad CommandList element" << count << v.type() << v; + } ++count; } return retl; } -CommandList::CommandList( bool doChroot, int timeout ) +CommandList::CommandList( bool doChroot, std::chrono::seconds timeout ) : m_doChroot( doChroot ) , m_timeout( timeout ) { } -CommandList::CommandList::CommandList( const QVariant& v, bool doChroot, int timeout ) +CommandList::CommandList::CommandList( const QVariant& v, bool doChroot, std::chrono::seconds timeout ) : CommandList( doChroot, timeout ) { if ( v.type() == QVariant::List ) { const auto v_list = v.toList(); if ( v_list.count() ) + { append( get_variant_stringlist( v_list ) ); + } else + { cWarning() << "Empty CommandList"; + } } else if ( v.type() == QVariant::String ) + { append( v.toString() ); + } else if ( v.type() == QVariant::Map ) { auto c( get_variant_object( v.toMap() ) ); if ( c.isValid() ) + { append( c ); + } // Otherwise warning is already given } else + { cWarning() << "CommandList does not understand variant" << v.type(); + } } -CommandList::~CommandList() -{ -} +CommandList::~CommandList() {} static inline bool findInCommands( const CommandList& l, const QString& needle ) { for ( CommandList::const_iterator i = l.cbegin(); i != l.cend(); ++i ) if ( i->command().contains( needle ) ) + { return true; + } return false; } -Calamares::JobResult CommandList::run() +Calamares::JobResult +CommandList::run() { QLatin1Literal rootMagic( "@@ROOT@@" ); QLatin1Literal userMagic( "@@USER@@" ); @@ -125,8 +146,11 @@ Calamares::JobResult CommandList::run() if ( !gs || !gs->contains( "rootMountPoint" ) ) { cError() << "No rootMountPoint defined."; - return Calamares::JobResult::error( QCoreApplication::translate( "CommandList", "Could not run command." ), - QCoreApplication::translate( "CommandList", "The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined." ) ); + return Calamares::JobResult::error( + QCoreApplication::translate( "CommandList", "Could not run command." ), + QCoreApplication::translate( "CommandList", + "The command runs in the host environment and needs to know the root " + "path, but no rootMountPoint is defined." ) ); } root = gs->value( "rootMountPoint" ).toString(); } @@ -137,7 +161,8 @@ Calamares::JobResult CommandList::run() cError() << "No username defined."; return Calamares::JobResult::error( QCoreApplication::translate( "CommandList", "Could not run command." ), - QCoreApplication::translate( "CommandList", "The command needs to know the user's name, but no username is defined." ) ); + QCoreApplication::translate( "CommandList", + "The command needs to know the user's name, but no username is defined." ) ); } QString user = gs->value( "username" ).toString(); // may be blank if unset @@ -155,16 +180,19 @@ Calamares::JobResult CommandList::run() QStringList shell_cmd { "/bin/sh", "-c" }; shell_cmd << processed_cmd; - int timeout = i->timeout() >= 0 ? i->timeout() : m_timeout; - ProcessResult r = System::runCommand( - location, shell_cmd, QString(), QString(), timeout ); + std::chrono::seconds timeout = i->timeout() >= std::chrono::seconds::zero() ? i->timeout() : m_timeout; + ProcessResult r = System::runCommand( location, shell_cmd, QString(), QString(), timeout ); if ( r.getExitCode() != 0 ) { if ( suppress_result ) + { cDebug() << "Error code" << r.getExitCode() << "ignored by CommandList configuration."; + } else + { return r.explainProcess( processed_cmd, timeout ); + } } } @@ -177,4 +205,4 @@ CommandList::append( const QString& s ) append( CommandLine( s, m_timeout ) ); } -} // namespace +} // namespace CalamaresUtils diff --git a/src/libcalamares/utils/CommandList.h b/src/libcalamares/utils/CommandList.h index 3dccdec6a..71a5a483c 100644 --- a/src/libcalamares/utils/CommandList.h +++ b/src/libcalamares/utils/CommandList.h @@ -24,6 +24,8 @@ #include #include +#include + namespace CalamaresUtils { @@ -31,41 +33,32 @@ namespace CalamaresUtils * Each command can have an associated timeout in seconds. The timeout * defaults to 10 seconds. Provide some convenience naming and construction. */ -struct CommandLine : public QPair< QString, int > +struct CommandLine : public QPair< QString, std::chrono::seconds > { - enum { TimeoutNotSet = -1 }; + static inline constexpr std::chrono::seconds TimeoutNotSet() { return std::chrono::seconds( -1 ); } /// An invalid command line CommandLine() - : QPair< QString, int >( QString(), TimeoutNotSet ) + : QPair( QString(), TimeoutNotSet() ) { } CommandLine( const QString& s ) - : QPair< QString, int >( s, TimeoutNotSet ) + : QPair( s, TimeoutNotSet() ) { } - CommandLine( const QString& s, int t ) - : QPair< QString, int >( s, t) + CommandLine( const QString& s, std::chrono::seconds t ) + : QPair( s, t ) { } - QString command() const - { - return first; - } + QString command() const { return first; } - int timeout() const - { - return second; - } + std::chrono::seconds timeout() const { return second; } - bool isValid() const - { - return !first.isEmpty(); - } -} ; + bool isValid() const { return !first.isEmpty(); } +}; /** @brief Abbreviation, used internally. */ using CommandList_t = QList< CommandLine >; @@ -82,23 +75,20 @@ class CommandList : protected CommandList_t { public: /** @brief empty command-list with timeout to apply to entries. */ - CommandList( bool doChroot = true, int timeout = 10 ); - CommandList( const QVariant& v, bool doChroot = true, int timeout = 10 ); + CommandList( bool doChroot = true, std::chrono::seconds timeout = std::chrono::seconds( 10 ) ); + CommandList( const QVariant& v, bool doChroot = true, std::chrono::seconds timeout = std::chrono::seconds( 10 ) ); ~CommandList(); - bool doChroot() const - { - return m_doChroot; - } + bool doChroot() const { return m_doChroot; } Calamares::JobResult run(); - using CommandList_t::isEmpty; - using CommandList_t::count; + using CommandList_t::at; using CommandList_t::cbegin; using CommandList_t::cend; using CommandList_t::const_iterator; - using CommandList_t::at; + using CommandList_t::count; + using CommandList_t::isEmpty; protected: using CommandList_t::append; @@ -106,8 +96,8 @@ protected: private: bool m_doChroot; - int m_timeout; -} ; + std::chrono::seconds m_timeout; +}; -} // namespace +} // namespace CalamaresUtils #endif diff --git a/src/libcalamares/utils/Dirs.cpp b/src/libcalamares/utils/Dirs.cpp index 1fd309584..ca569490f 100644 --- a/src/libcalamares/utils/Dirs.cpp +++ b/src/libcalamares/utils/Dirs.cpp @@ -101,16 +101,24 @@ mungeEnvironment( QStringList& l, const char* name, const char* defaultDirs ) QStringList dirs = QString( qgetenv( name ) ).split( ':' ); if ( dirs.isEmpty() ) + { dirs = QString( defaultDirs ).split( ':' ); + } for ( auto s : dirs ) { if ( s.isEmpty() ) + { continue; + } if ( s.endsWith( '/' ) ) + { l << ( s + calamaresSubdir ) << s; + } else + { l << ( s + '/' + calamaresSubdir ) << ( s + '/' ); + } } } @@ -127,7 +135,9 @@ QStringList extraConfigDirs() { if ( s_haveExtraDirs ) + { return s_extraConfigDirs; + } return QStringList(); } @@ -135,7 +145,9 @@ QStringList extraDataDirs() { if ( s_haveExtraDirs ) + { return s_extraDataDirs; + } return QStringList(); } @@ -173,12 +185,16 @@ appLogDir() QString path = QStandardPaths::writableLocation( QStandardPaths::CacheLocation ); QDir dir( path ); if ( isWritableDir( dir ) ) + { return dir; + } cerr << "warning: Could not find a standard writable location for log dir, falling back to $HOME\n"; dir = QDir::home(); if ( isWritableDir( dir ) ) + { return dir; + } cerr << "warning: Found no writable location for log dir, falling back to the temp dir\n"; return QDir::temp(); @@ -191,4 +207,4 @@ setQmlModulesDir( const QDir& dir ) s_qmlModulesDir = dir; } -} // namespace +} // namespace CalamaresUtils diff --git a/src/libcalamares/utils/Dirs.h b/src/libcalamares/utils/Dirs.h index 5532cb79b..a63e679da 100644 --- a/src/libcalamares/utils/Dirs.h +++ b/src/libcalamares/utils/Dirs.h @@ -31,43 +31,43 @@ namespace CalamaresUtils { - DLLEXPORT QDir qmlModulesDir(); +DLLEXPORT QDir qmlModulesDir(); - /** - * @brief appDataDir returns the directory with common application data. - * Defaults to CMAKE_INSTALL_FULL_DATADIR (usually /usr/share/calamares). - */ - DLLEXPORT QDir appDataDir(); +/** + * @brief appDataDir returns the directory with common application data. + * Defaults to CMAKE_INSTALL_FULL_DATADIR (usually /usr/share/calamares). + */ +DLLEXPORT QDir appDataDir(); - /** - * @brief appLogDir returns the directory for Calamares logs. - * Defaults to QStandardPaths::CacheLocation (usually ~/.cache/Calamares). - */ - DLLEXPORT QDir appLogDir(); +/** + * @brief appLogDir returns the directory for Calamares logs. + * Defaults to QStandardPaths::CacheLocation (usually ~/.cache/Calamares). + */ +DLLEXPORT QDir appLogDir(); - /** - * @brief systemLibDir returns the system's lib directory. - * Defaults to CMAKE_INSTALL_FULL_LIBDIR (usually /usr/lib64 or /usr/lib). - */ - DLLEXPORT QDir systemLibDir(); +/** + * @brief systemLibDir returns the system's lib directory. + * Defaults to CMAKE_INSTALL_FULL_LIBDIR (usually /usr/lib64 or /usr/lib). + */ +DLLEXPORT QDir systemLibDir(); - /** - * Override app data dir. Only for testing purposes. - */ - DLLEXPORT void setAppDataDir( const QDir& dir ); - DLLEXPORT bool isAppDataDirOverridden(); +/** + * Override app data dir. Only for testing purposes. + */ +DLLEXPORT void setAppDataDir( const QDir& dir ); +DLLEXPORT bool isAppDataDirOverridden(); - DLLEXPORT void setQmlModulesDir( const QDir& dir ); +DLLEXPORT void setQmlModulesDir( const QDir& dir ); - /** @brief Setup extra config and data dirs from the XDG variables. - */ - DLLEXPORT void setXdgDirs(); - /** @brief Are any extra directories configured? */ - DLLEXPORT bool haveExtraDirs(); - /** @brief XDG_CONFIG_DIRS, each guaranteed to end with / */ - DLLEXPORT QStringList extraConfigDirs(); - /** @brief XDG_DATA_DIRS, each guaranteed to end with / */ - DLLEXPORT QStringList extraDataDirs(); -} // namespace +/** @brief Setup extra config and data dirs from the XDG variables. + */ +DLLEXPORT void setXdgDirs(); +/** @brief Are any extra directories configured? */ +DLLEXPORT bool haveExtraDirs(); +/** @brief XDG_CONFIG_DIRS, each guaranteed to end with / */ +DLLEXPORT QStringList extraConfigDirs(); +/** @brief XDG_DATA_DIRS, each guaranteed to end with / */ +DLLEXPORT QStringList extraDataDirs(); +} // namespace CalamaresUtils #endif diff --git a/src/libcalamares/utils/Logger.cpp b/src/libcalamares/utils/Logger.cpp index 433e01fbb..0e207fa02 100644 --- a/src/libcalamares/utils/Logger.cpp +++ b/src/libcalamares/utils/Logger.cpp @@ -20,8 +20,8 @@ #include "Logger.h" -#include #include +#include #include #include @@ -30,17 +30,17 @@ #include #include -#include "utils/Dirs.h" #include "CalamaresVersion.h" +#include "utils/Dirs.h" #define LOGFILE_SIZE 1024 * 256 static std::ofstream logfile; static unsigned int s_threshold = #ifdef QT_NO_DEBUG - Logger::LOG_DISABLE; + Logger::LOG_DISABLE; #else - Logger::LOGEXTRA + 1; // Comparison is < in log() function + Logger::LOGEXTRA + 1; // Comparison is < in log() function #endif static QMutex s_mutex; @@ -48,15 +48,17 @@ namespace Logger { void -setupLogLevel(unsigned int level) +setupLogLevel( unsigned int level ) { if ( level > LOGVERBOSE ) + { level = LOGVERBOSE; + } s_threshold = level + 1; // Comparison is < in log() function } bool -logLevelEnabled(unsigned int level) +logLevelEnabled( unsigned int level ) { return level < s_threshold; } @@ -77,11 +79,9 @@ log( const char* msg, unsigned int debugLevel ) // If we don't format the date as a Qt::ISODate then we get a crash when // logging at exit as Qt tries to use QLocale to format, but QLocale is // on its way out. - logfile << QDate::currentDate().toString( Qt::ISODate ).toUtf8().data() - << " - " - << QTime::currentTime().toString().toUtf8().data() - << " [" << QString::number( debugLevel ).toUtf8().data() << "]: " - << msg << std::endl; + logfile << QDate::currentDate().toString( Qt::ISODate ).toUtf8().data() << " - " + << QTime::currentTime().toString().toUtf8().data() << " [" + << QString::number( debugLevel ).toUtf8().data() << "]: " << msg << std::endl; logfile.flush(); } @@ -90,9 +90,8 @@ log( const char* msg, unsigned int debugLevel ) { QMutexLocker lock( &s_mutex ); - std::cout << QTime::currentTime().toString().toUtf8().data() - << " [" << QString::number( debugLevel ).toUtf8().data() << "]: " - << msg << std::endl; + std::cout << QTime::currentTime().toString().toUtf8().data() << " [" + << QString::number( debugLevel ).toUtf8().data() << "]: " << msg << std::endl; std::cout.flush(); } } @@ -107,21 +106,21 @@ CalamaresLogHandler( QtMsgType type, const QMessageLogContext&, const QString& m const char* message = ba.constData(); QMutexLocker locker( &s_mutex ); - switch( type ) + switch ( type ) { - case QtDebugMsg: - log( message, LOGVERBOSE ); - break; + case QtDebugMsg: + log( message, LOGVERBOSE ); + break; - case QtInfoMsg: - log( message, 1 ); - break; + case QtInfoMsg: + log( message, 1 ); + break; - case QtCriticalMsg: - case QtWarningMsg: - case QtFatalMsg: - log( message, 0 ); - break; + case QtCriticalMsg: + case QtWarningMsg: + case QtFatalMsg: + log( message, 0 ); + break; } } @@ -161,11 +160,13 @@ setupLogfile() // Lock while (re-)opening the logfile { - QMutexLocker lock( &s_mutex ); - logfile.open( logFile().toLocal8Bit(), std::ios::app ); - if ( logfile.tellp() ) - logfile << "\n\n" << std::endl; - logfile << "=== START CALAMARES " << CALAMARES_VERSION << std::endl; + QMutexLocker lock( &s_mutex ); + logfile.open( logFile().toLocal8Bit(), std::ios::app ); + if ( logfile.tellp() ) + { + logfile << "\n\n" << std::endl; + } + logfile << "=== START CALAMARES " << CALAMARES_VERSION << std::endl; } qInstallMessageHandler( CalamaresLogHandler ); @@ -183,14 +184,13 @@ CLog::~CLog() log( m_msg.toUtf8().data(), m_debugLevel ); } -CDebug::~CDebug() -{ -} +CDebug::~CDebug() {} const char Continuation[] = "\n "; const char SubEntry[] = " .. "; -QString toString( const QVariant& v ) +QString +toString( const QVariant& v ) { auto t = v.type(); @@ -199,11 +199,15 @@ QString toString( const QVariant& v ) QStringList s; auto l = v.toList(); for ( auto lit = l.constBegin(); lit != l.constEnd(); ++lit ) + { s << lit->toString(); - return s.join(", "); + } + return s.join( ", " ); } else + { return v.toString(); + } } -} // namespace +} // namespace Logger diff --git a/src/libcalamares/utils/Logger.h b/src/libcalamares/utils/Logger.h index 4d1534e4b..643b3059b 100644 --- a/src/libcalamares/utils/Logger.h +++ b/src/libcalamares/utils/Logger.h @@ -27,169 +27,181 @@ namespace Logger { - DLLEXPORT extern const char Continuation[]; - DLLEXPORT extern const char SubEntry[]; +DLLEXPORT extern const char Continuation[]; +DLLEXPORT extern const char SubEntry[]; - enum +enum +{ + LOG_DISABLE = 0, + LOGERROR = 1, + LOGWARNING = 2, + LOGINFO = 3, + LOGEXTRA = 5, + LOGDEBUG = 6, + LOGVERBOSE = 8 +}; + +class DLLEXPORT CLog : public QDebug +{ +public: + explicit CLog( unsigned int debugLevel ); + virtual ~CLog(); + +private: + QString m_msg; + unsigned int m_debugLevel; +}; + +class DLLEXPORT CDebug : public CLog +{ +public: + CDebug( unsigned int debugLevel = LOGDEBUG ) + : CLog( debugLevel ) { - LOG_DISABLE = 0, - LOGERROR = 1, - LOGWARNING = 2, - LOGINFO = 3, - LOGEXTRA = 5, - LOGDEBUG = 6, - LOGVERBOSE = 8 - } ; - - class DLLEXPORT CLog : public QDebug - { - public: - explicit CLog( unsigned int debugLevel ); - virtual ~CLog(); - - private: - QString m_msg; - unsigned int m_debugLevel; - }; - - class DLLEXPORT CDebug : public CLog - { - public: - CDebug( unsigned int debugLevel = LOGDEBUG ) : CLog( debugLevel ) + if ( debugLevel <= LOGERROR ) { - if ( debugLevel <= LOGERROR ) - *this << "ERROR:"; - else if ( debugLevel <= LOGWARNING ) - *this << "WARNING:"; + *this << "ERROR:"; } - virtual ~CDebug(); - }; + else if ( debugLevel <= LOGWARNING ) + { + *this << "WARNING:"; + } + } + virtual ~CDebug(); +}; - /** - * @brief The full path of the log file. - */ - DLLEXPORT QString logFile(); +/** + * @brief The full path of the log file. + */ +DLLEXPORT QString logFile(); - /** - * @brief Start logging to the log file. - * - * Call this (once) to start logging to the log file (usually - * ~/.cache/calamares/session.log ). An existing log file is - * rolled over if it is too large. - */ - DLLEXPORT void setupLogfile(); +/** + * @brief Start logging to the log file. + * + * Call this (once) to start logging to the log file (usually + * ~/.cache/calamares/session.log ). An existing log file is + * rolled over if it is too large. + */ +DLLEXPORT void setupLogfile(); - /** - * @brief Set a log level for future logging. - * - * Pass in a value from the LOG* enum, above. Use 0 to - * disable logging. Values greater than LOGVERBOSE are - * limited to LOGVERBOSE, which will log everything. - * - * Practical values are 0, 1, 2, and 6. - */ - DLLEXPORT void setupLogLevel( unsigned int level ); +/** + * @brief Set a log level for future logging. + * + * Pass in a value from the LOG* enum, above. Use 0 to + * disable logging. Values greater than LOGVERBOSE are + * limited to LOGVERBOSE, which will log everything. + * + * Practical values are 0, 1, 2, and 6. + */ +DLLEXPORT void setupLogLevel( unsigned int level ); - /** @brief Return the configured log-level. */ - DLLEXPORT unsigned int logLevel(); +/** @brief Return the configured log-level. */ +DLLEXPORT unsigned int logLevel(); - /** @brief Would the given @p level really be logged? */ - DLLEXPORT bool logLevelEnabled( unsigned int level ); +/** @brief Would the given @p level really be logged? */ +DLLEXPORT bool logLevelEnabled( unsigned int level ); - /** - * @brief Row-oriented formatted logging. - * - * Use DebugRow to produce multiple rows of 2-column output - * in a debugging statement. For instance, - * cDebug() << DebugRow(1,12) - * << DebugRow(2,24) - * will produce a single timestamped debug line with continuations. - * Each DebugRow produces one line of output, with the two values. - */ - template - struct DebugRow +/** + * @brief Row-oriented formatted logging. + * + * Use DebugRow to produce multiple rows of 2-column output + * in a debugging statement. For instance, + * cDebug() << DebugRow(1,12) + * << DebugRow(2,24) + * will produce a single timestamped debug line with continuations. + * Each DebugRow produces one line of output, with the two values. + */ +template < typename T, typename U > +struct DebugRow +{ +public: + explicit DebugRow( const T& t, const U& u ) + : first( t ) + , second( u ) { - public: - explicit DebugRow(const T& t, const U& u) - : first(t) - , second(u) - {} - - const T& first; - const U& second; - } ; - - /** - * @brief List-oriented formatted logging. - * - * Use DebugList to produce multiple rows of output in a debugging - * statement. For instance, - * cDebug() << DebugList( QStringList() << "foo" << "bar" ) - * will produce a single timestamped debug line with continuations. - * Each element of the list of strings will be logged on a separate line. - */ - struct DebugList - { - explicit DebugList( const QStringList& l ) - : list(l) - {} - - const QStringList& list; - } ; - - /** - * @brief Map-oriented formatted logging. - * - * Use DebugMap to produce multiple rows of output in a debugging - * statement from a map. The output is intentionally a bit-yaml-ish. - * cDebug() << DebugMap( map ) - * will produce a single timestamped debug line with continuations. - * The continued lines will have a key (from the map) and a value - * on each line. - */ - struct DebugMap - { - public: - explicit DebugMap(const QVariantMap& m) - : map( m ) - {} - - const QVariantMap& map; - } ; - - /** @brief output operator for DebugRow */ - template - inline QDebug& - operator <<( QDebug& s, const DebugRow& t ) - { - s << Continuation << t.first << ':' << ' ' << t.second; - return s; } - /** @brief output operator for DebugList */ - inline QDebug& - operator <<( QDebug& s, const DebugList& c ) + const T& first; + const U& second; +}; + +/** + * @brief List-oriented formatted logging. + * + * Use DebugList to produce multiple rows of output in a debugging + * statement. For instance, + * cDebug() << DebugList( QStringList() << "foo" << "bar" ) + * will produce a single timestamped debug line with continuations. + * Each element of the list of strings will be logged on a separate line. + */ +struct DebugList +{ + explicit DebugList( const QStringList& l ) + : list( l ) { - for( const auto& i : c.list ) - s << Continuation << i; - return s; } - /** @brief supporting method for outputting a DebugMap */ - QString toString( const QVariant& v ); + const QStringList& list; +}; - /** @brief output operator for DebugMap */ - inline QDebug& - operator <<( QDebug& s, const DebugMap& t ) +/** + * @brief Map-oriented formatted logging. + * + * Use DebugMap to produce multiple rows of output in a debugging + * statement from a map. The output is intentionally a bit-yaml-ish. + * cDebug() << DebugMap( map ) + * will produce a single timestamped debug line with continuations. + * The continued lines will have a key (from the map) and a value + * on each line. + */ +struct DebugMap +{ +public: + explicit DebugMap( const QVariantMap& m ) + : map( m ) { - for ( auto it = t.map.constBegin(); it != t.map.constEnd(); ++it ) - s << Continuation << it.key().toUtf8().constData() << ':' << ' ' << toString( it.value() ).toUtf8().constData(); - return s; } -} // namespace + + const QVariantMap& map; +}; + +/** @brief output operator for DebugRow */ +template < typename T, typename U > +inline QDebug& +operator<<( QDebug& s, const DebugRow< T, U >& t ) +{ + s << Continuation << t.first << ':' << ' ' << t.second; + return s; +} + +/** @brief output operator for DebugList */ +inline QDebug& +operator<<( QDebug& s, const DebugList& c ) +{ + for ( const auto& i : c.list ) + { + s << Continuation << i; + } + return s; +} + +/** @brief supporting method for outputting a DebugMap */ +QString toString( const QVariant& v ); + +/** @brief output operator for DebugMap */ +inline QDebug& +operator<<( QDebug& s, const DebugMap& t ) +{ + for ( auto it = t.map.constBegin(); it != t.map.constEnd(); ++it ) + { + s << Continuation << it.key().toUtf8().constData() << ':' << ' ' << toString( it.value() ).toUtf8().constData(); + } + return s; +} +} // namespace Logger #define cDebug Logger::CDebug -#define cWarning() Logger::CDebug(Logger::LOGWARNING) -#define cError() Logger::CDebug(Logger::LOGERROR) +#define cWarning() Logger::CDebug( Logger::LOGWARNING ) +#define cError() Logger::CDebug( Logger::LOGERROR ) #endif diff --git a/src/libcalamares/utils/NamedEnum.h b/src/libcalamares/utils/NamedEnum.h index 5ff62f54c..76c8ed3bb 100644 --- a/src/libcalamares/utils/NamedEnum.h +++ b/src/libcalamares/utils/NamedEnum.h @@ -31,12 +31,12 @@ #include -#include -#include #include +#include +#include /** @brief Type for collecting parts of a named enum. */ -template +template < typename T > struct NamedEnumTable { using string_t = QString; @@ -53,7 +53,11 @@ struct NamedEnumTable * * static const NamedEnumTable c{ {"red", Colors::Red } }; */ - NamedEnumTable( const std::initializer_list< pair_t >& v ) : table( v ) { /* static_assert( v.size() > 0 ); */ } + NamedEnumTable( const std::initializer_list< pair_t >& v ) + : table( v ) + { + /* static_assert( v.size() > 0 ); */ + } /** @brief Find a name @p s in the table. * @@ -89,8 +93,8 @@ struct NamedEnumTable { ok = false; - for ( const auto &p : table ) - if ( s == p.second) + for ( const auto& p : table ) + if ( s == p.second ) { ok = true; return p.first; @@ -99,13 +103,14 @@ struct NamedEnumTable // ok is still false return string_t(); } -} ; +}; /** @brief Smashes an enum value to its underlying type. */ -template -constexpr typename std::underlying_type::type smash( const E e ) +template < typename E > +constexpr typename std::underlying_type< E >::type +smash( const E e ) { - return static_cast::type>( e ); + return static_cast< typename std::underlying_type< E >::type >( e ); } #endif diff --git a/src/libcalamares/utils/NamedSuffix.h b/src/libcalamares/utils/NamedSuffix.h index f58277698..8ad52edea 100644 --- a/src/libcalamares/utils/NamedSuffix.h +++ b/src/libcalamares/utils/NamedSuffix.h @@ -42,7 +42,7 @@ #include "NamedEnum.h" /** @brief Template that takes the enum type to work with and a special none-enum. */ -template +template < typename T, T _none > class NamedSuffix { public: @@ -52,13 +52,13 @@ public: /** @brief Empty value. */ NamedSuffix() - : m_value(0) + : m_value( 0 ) , m_unit( none ) { } /** @brief Specific value and unit. */ - NamedSuffix( int value, unit_t unit ) + NamedSuffix( qint64 value, unit_t unit ) : m_value( value ) , m_unit( unit ) { @@ -69,13 +69,13 @@ public: * This parses the given string @p s by comparing with the suffixes * in @p table and uses the first matching suffix as the unit. */ - NamedSuffix( const NamedEnumTable& table, const QString& s ) + NamedSuffix( const NamedEnumTable< T >& table, const QString& s ) : NamedSuffix() { - for( const auto& suffix : table.table ) + for ( const auto& suffix : table.table ) if ( s.endsWith( suffix.first ) ) { - m_value = s.left( s.length() - suffix.first.length() ).toInt(); + m_value = s.left( s.length() - suffix.first.length() ).toLongLong(); m_unit = suffix.second; break; } @@ -89,7 +89,7 @@ public: */ NamedSuffix( const QString& s ); - int value() const { return m_value; } + qint64 value() const { return m_value; } unit_t unit() const { return m_unit; } /** @brief Check that a value-unit combination is valid. @@ -100,7 +100,7 @@ public: bool isValid() const; protected: - int m_value; + qint64 m_value; unit_t m_unit; }; diff --git a/src/libcalamares/utils/PluginFactory.cpp b/src/libcalamares/utils/PluginFactory.cpp index 124af16f4..50b88ebfd 100644 --- a/src/libcalamares/utils/PluginFactory.cpp +++ b/src/libcalamares/utils/PluginFactory.cpp @@ -1,124 +1,9 @@ /* === This file is part of Calamares - === * - * Copyright 2015, Teo Mrnjavac - * Copyright 2017-2018, Adriaan de Groot + * Copyright 2019, Adriaan de Groot * - * Based on KPluginFactory from KCoreAddons, KDE project - * Copyright 2007, Matthias Kretz - * Copyright 2007, Bernhard Loos - * - * Calamares is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Calamares is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Calamares. If not, see . */ #include "PluginFactory.h" -#include "PluginFactory_p.h" -#include -#include - -Q_GLOBAL_STATIC( QObjectCleanupHandler, factorycleanup ) - -namespace Calamares -{ - -PluginFactory::PluginFactory() - : pd_ptr( new PluginFactoryPrivate ) -{ - pd_ptr->q_ptr = this; - - factorycleanup()->add( this ); -} - -PluginFactory::PluginFactory( PluginFactoryPrivate& d ) - : pd_ptr( &d ) -{ - factorycleanup()->add( this ); -} - -PluginFactory::~PluginFactory() -{ - delete pd_ptr; -} - -void PluginFactory::doRegisterPlugin( const QString& keyword, const QMetaObject* metaObject, CreateInstanceFunction instanceFunction ) -{ - Q_ASSERT( metaObject ); - - // we allow different interfaces to be registered without keyword - if ( !keyword.isEmpty() ) - { - if ( pd_ptr->createInstanceHash.contains( keyword ) ) - qWarning() << "A plugin with the keyword" << keyword << "was already registered. A keyword must be unique!"; - pd_ptr->createInstanceHash.insert( keyword, PluginFactoryPrivate::Plugin( metaObject, instanceFunction ) ); - } - else - { - const QList clashes( pd_ptr->createInstanceHash.values( keyword ) ); - const QMetaObject* superClass = metaObject->superClass(); - if ( superClass ) - { - for ( const PluginFactoryPrivate::Plugin& plugin : clashes ) - { - for ( const QMetaObject* otherSuper = plugin.first->superClass(); otherSuper; - otherSuper = otherSuper->superClass() ) - { - if ( superClass == otherSuper ) - qWarning() << "Two plugins with the same interface(" << superClass->className() << ") were registered. Use keywords to identify the plugins."; - } - } - } - for ( const PluginFactoryPrivate::Plugin& plugin : clashes ) - { - superClass = plugin.first->superClass(); - if ( superClass ) - { - for ( const QMetaObject* otherSuper = metaObject->superClass(); otherSuper; - otherSuper = otherSuper->superClass() ) - { - if ( superClass == otherSuper ) - qWarning() << "Two plugins with the same interface(" << superClass->className() << ") were registered. Use keywords to identify the plugins."; - } - } - } - pd_ptr->createInstanceHash.insertMulti( keyword, PluginFactoryPrivate::Plugin( metaObject, instanceFunction ) ); - } -} - -QObject* PluginFactory::create( const char* iface, QWidget* parentWidget, QObject* parent, const QString& keyword ) -{ - QObject* obj = nullptr; - - const QList candidates( pd_ptr->createInstanceHash.values( keyword ) ); - // for !keyword.isEmpty() candidates.count() is 0 or 1 - - for ( const PluginFactoryPrivate::Plugin& plugin : candidates ) - { - for ( const QMetaObject* current = plugin.first; current; current = current->superClass() ) - { - if ( 0 == qstrcmp( iface, current->className() ) ) - { - if ( obj ) - qWarning() << "ambiguous interface requested from a DSO containing more than one plugin"; - obj = plugin.second( parentWidget, parent ); - break; - } - } - } - - if ( obj ) - emit objectCreated( obj ); - return obj; -} - -} +CalamaresPluginFactory::~CalamaresPluginFactory() {} diff --git a/src/libcalamares/utils/PluginFactory.h b/src/libcalamares/utils/PluginFactory.h index 1ab485779..65ee6eee9 100644 --- a/src/libcalamares/utils/PluginFactory.h +++ b/src/libcalamares/utils/PluginFactory.h @@ -24,295 +24,81 @@ #ifndef UTILS_PLUGINFACTORY_H #define UTILS_PLUGINFACTORY_H -#include "DllMacro.h" - -#include -#include -#include - -namespace Calamares -{ -class PluginFactoryPrivate; -} +#include #define CalamaresPluginFactory_iid "io.calamares.PluginFactory" -/** - * \relates PluginFactory +/** @brief Plugin factory for Calamares * - * CALAMARES_PLUGIN_FACTORY_DECLARATION declares the PluginFactory subclass. This macro - * can be used in a header file. + * Try to re-use KPluginFactory as much as possible (since the + * old code for PluginFactory was a fork of an old version of + * exactly that). * - * \param name The name of the PluginFactory derived class. - * - * \see CALAMARES_PLUGIN_FACTORY - * \see CALAMARES_PLUGIN_FACTORY_DEFINITION + * The current createInstance() method passes more arguments + * to the job and viewstep constructors than we want; chasing + * that change means modifying each Calamares module. This class + * implements a version of createInstance() with fewer arguments + * and overloads registerPlugin() to use that. */ -#define CALAMARES_PLUGIN_FACTORY_DECLARATION(name) \ - class name : public Calamares::PluginFactory \ - { \ - Q_OBJECT \ - Q_INTERFACES(Calamares::PluginFactory) \ - Q_PLUGIN_METADATA(IID CalamaresPluginFactory_iid) \ - public: \ - explicit name(); \ - ~name(); \ - private: \ - void init(); \ - }; - -/** - * \relates PluginFactory - * CALAMARES_PLUGIN_FACTORY_DEFINITION defines the PluginFactory subclass. This macro - * can not be used in a header file. - * - * \param name The name of the PluginFactory derived class. - * - * \param pluginRegistrations Code to be inserted into the constructor of the - * class. Usually a series of registerPlugin() calls. - * - * \see CALAMARES_PLUGIN_FACTORY - * \see CALAMARES_PLUGIN_FACTORY_DECLARATION - */ -#define CALAMARES_PLUGIN_FACTORY_DEFINITION(name, pluginRegistrations) \ - name::name() \ - { \ - pluginRegistrations \ - } \ - name::~name() {} - -namespace Calamares -{ - -/** - * \class PluginFactory PluginFactory.h - * - * PluginFactory provides a convenient way to provide factory-style plugins. - * Qt plugins provide a singleton object, but a common pattern is for plugins - * to generate as many objects of a particular type as the application requires. - * By using PluginFactory, you can avoid implementing the factory pattern - * yourself. - * - * PluginFactory also allows plugins to provide multiple different object - * types, indexed by keywords. - * - * The objects created by PluginFactory must inherit QObject, and must have a - * standard constructor pattern: - * \li if the object is a KPart::Part, it must be of the form - * \code - * T(QWidget *parentWidget, QObject *parent, const QVariantList &args) - * \endcode - * \li if it is a QWidget, it must be of the form - * \code - * T(QWidget *parent, const QVariantList &args) - * \endcode - * \li otherwise it must be of the form - * \code - * T(QObject *parent, const QVariantList &args) - * \endcode - * - * You should typically use CALAMARES_PLUGIN_FACTORY_DEFINITION() in your plugin code to - * create the factory. The pattern is - * - * \code - * #include "utils/PluginFactory.h" - * - * class MyPlugin : public PluginInterface - * { - * public: - * MyPlugin(QObject *parent, const QVariantList &args) - * : PluginInterface(parent) - * {} - * }; - * - * CALAMARES_PLUGIN_FACTORY_DEFINITION(MyPluginFactory, - * registerPlugin(); - * ) - * \endcode - * - * If you want to load a library use KPluginLoader. - * The application that wants to instantiate plugin classes can do the following: - * \code - * PluginFactory *factory = KPluginLoader("libraryname").factory(); - * if (factory) { - * PluginInterface *p1 = factory->create(parent); - * OtherInterface *p2 = factory->create(parent); - * NextInterface *p3 = factory->create("keyword1", parent); - * NextInterface *p3 = factory->create("keyword2", parent); - * } - * \endcode - * - * \author Matthias Kretz - * \author Bernhard Loos - */ -class DLLEXPORT PluginFactory : public QObject +class CalamaresPluginFactory : public KPluginFactory { Q_OBJECT - friend class PluginFactoryPrivate; public: - /** - * This constructor creates a factory for a plugin. - */ - explicit PluginFactory(); - - /** - * This destroys the PluginFactory. - */ - virtual ~PluginFactory(); - - /** - * Use this method to create an object. It will try to create an object which inherits - * \p T. If it has multiple choices, you will get a fatal error (kFatal()), so be careful - * to request a unique interface or use keywords. - * - * \tparam T The interface for which an object should be created. The object will inherit \p T. - * \param parent The parent of the object. If \p parent is a widget type, it will also passed - * to the parentWidget argument of the CreateInstanceFunction for the object. - * \returns A pointer to the created object is returned, or 0 if an error occurred. - */ - template - T* create( QObject* parent = nullptr ); - - /** - * Use this method to create an object. It will try to create an object which inherits - * \p T and was registered with \p keyword. - * - * \tparam T The interface for which an object should be created. The object will inherit \p T. - * \param keyword The keyword of the object. - * \param parent The parent of the object. If \p parent is a widget type, it will also passed - * to the parentWidget argument of the CreateInstanceFunction for the object. - * \returns A pointer to the created object is returned, or 0 if an error occurred. - */ - template - T* create( const QString& keyword, QObject* parent = nullptr ); - -Q_SIGNALS: - void objectCreated( QObject* object ); - -protected: - /** - * Function pointer type to a function that instantiates a plugin. - */ - typedef QObject* ( *CreateInstanceFunction )( QWidget*, QObject* ); - - /** - * This is used to detect the arguments need for the constructor of plugin classes. - * You can inherit it, if you want to add new classes and still keep support for the old ones. - */ - template - struct InheritanceChecker + explicit CalamaresPluginFactory() + : KPluginFactory() { - CreateInstanceFunction createInstanceFunction( QWidget* ) - { - return &createInstance; - } - CreateInstanceFunction createInstanceFunction( ... ) - { - return &createInstance; - } - }; - - explicit PluginFactory( PluginFactoryPrivate& dd ); - - /** - * Registers a plugin with the factory. Call this function from the constructor of the - * PluginFactory subclass to make the create function able to instantiate the plugin when asked - * for an interface the plugin implements. - * - * \tparam T the name of the plugin class - * - * \param keyword An optional keyword as unique identifier for the plugin. This allows you to - * put more than one plugin with the same interface into the same library using the same - * factory. X-KDE-PluginKeyword is a convenient way to specify the keyword in a desktop file. - * - * \param instanceFunction A function pointer to a function that creates an instance of the - * plugin. The default function that will be used depends on the type of interface. If the - * interface inherits from - * \li \c KParts::Part the function will call - * \code - * new T(QWidget *parentWidget, QObject *parent) - * \endcode - * \li \c QWidget the function will call - * \code - * new T(QWidget *parent) - * \endcode - * \li else the function will call - * \code - * new T(QObject *parent) - * \endcode - */ - template - void registerPlugin( const QString& keyword = QString(), - CreateInstanceFunction instanceFunction - = InheritanceChecker().createInstanceFunction( reinterpret_cast( 0 ) ) ) - { - doRegisterPlugin( keyword, &T::staticMetaObject, instanceFunction ); } + ~CalamaresPluginFactory() override; - PluginFactoryPrivate* const pd_ptr; - - /** - * This function is called when the factory asked to create an Object. + /** @brief Create an object from the factory. * - * You may reimplement it to provide a very flexible factory. This is especially useful to - * provide generic factories for plugins implemeted using a scripting language. - * - * \param iface The staticMetaObject::className() string identifying the plugin interface that - * was requested. E.g. for KCModule plugins this string will be "KCModule". - * \param parentWidget Only used if the requested plugin is a KPart. - * \param parent The parent object for the plugin object. - * \param keyword A string that uniquely identifies the plugin. If a KService is used this - * keyword is read from the X-KDE-PluginKeyword entry in the .desktop file. + * Ignores all the @p args since they are not used. Calls + * Calamares constructors for the Jobs and ViewSteps. */ - virtual QObject* create( const char* iface, QWidget* parentWidget, QObject* parent, const QString& keyword ); - - template - static QObject* createInstance( QWidget* parentWidget, QObject* parent ) + template < class impl, class ParentType > + static QObject* createInstance( QWidget* parentWidget, QObject* parent, const QVariantList& args ) { Q_UNUSED( parentWidget ) + Q_UNUSED( args ) ParentType* p = nullptr; if ( parent ) { - p = qobject_cast( parent ); + p = qobject_cast< ParentType* >( parent ); Q_ASSERT( p ); } return new impl( p ); } -private: - void doRegisterPlugin( const QString& keyword, const QMetaObject* metaObject, CreateInstanceFunction instanceFunction ); + /** @brief register a plugin + * + * The Calamares version doesn't accept keywords, and uses + * the Calamares createInstance() version which ignores + * the QVariantList of arguments. + */ + template < class T > + void registerPlugin() + { + KPluginFactory::registerPlugin< T >( QString(), &createInstance< T, QObject > ); + } }; -template -inline T* PluginFactory::create( QObject* parent ) -{ - QObject* o = create( T::staticMetaObject.className(), - parent && parent->isWidgetType() ? reinterpret_cast( parent ) : nullptr, - parent, - QString() ); - - T* t = qobject_cast( o ); - if ( !t ) - delete o; - return t; -} - -template -inline T* PluginFactory::create( const QString& keyword, QObject* parent ) -{ - QObject* o = create( T::staticMetaObject.className(), - parent && parent->isWidgetType() ? reinterpret_cast( parent ) : nullptr, - parent, - keyword ); - - T* t = qobject_cast( o ); - if ( !t ) - delete o; - return t; -} - -} // namespace - -Q_DECLARE_INTERFACE( Calamares::PluginFactory, CalamaresPluginFactory_iid ) +/** @brief declare a Calamares Plugin Factory + * + * This would be defined as K_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY, + * except that does not actually use the base factory class that is + * passed in. + */ +#define CALAMARES_PLUGIN_FACTORY_DECLARATION( name ) \ + class name : public CalamaresPluginFactory \ + { \ + Q_OBJECT \ + Q_INTERFACES( KPluginFactory ) \ + Q_PLUGIN_METADATA( IID CalamaresPluginFactory_iid ) \ + public: \ + explicit name(); \ + ~name(); \ + }; +#define CALAMARES_PLUGIN_FACTORY_DEFINITION( name, pluginRegistrations ) \ + K_PLUGIN_FACTORY_DEFINITION_WITH_BASEFACTORY( name, CalamaresPluginFactory, pluginRegistrations ) #endif diff --git a/src/libcalamares/utils/PluginFactory_p.h b/src/libcalamares/utils/PluginFactory_p.h deleted file mode 100644 index 7a6db217e..000000000 --- a/src/libcalamares/utils/PluginFactory_p.h +++ /dev/null @@ -1,54 +0,0 @@ -/* === This file is part of Calamares - === - * - * Copyright 2015, Teo Mrnjavac - * - * Based on KPluginFactory from KCoreAddons, KDE project - * Copyright 2007, Matthias Kretz - * Copyright 2007, Bernhard Loos - * - * Calamares is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Calamares is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Calamares. If not, see . - */ - -#ifndef UTILS_PLUGINFACTORY_P_H -#define UTILS_PLUGINFACTORY_P_H - -#include "PluginFactory.h" - -#include - -namespace Calamares -{ - -class PluginFactoryPrivate -{ - Q_DECLARE_PUBLIC(PluginFactory) -protected: - typedef QPair Plugin; - - PluginFactoryPrivate() - : catalogInitialized( false ) - , q_ptr( nullptr ) - {} - ~PluginFactoryPrivate() {} - - QHash createInstanceHash; - QString catalogName; - bool catalogInitialized; - - PluginFactory *q_ptr; -}; - -} // namespace - -#endif diff --git a/src/libcalamares/utils/Retranslator.cpp b/src/libcalamares/utils/Retranslator.cpp index 93560f4ae..d761263ac 100644 --- a/src/libcalamares/utils/Retranslator.cpp +++ b/src/libcalamares/utils/Retranslator.cpp @@ -26,27 +26,30 @@ #include -namespace CalamaresUtils { +namespace CalamaresUtils +{ static QTranslator* s_brandingTranslator = nullptr; static QTranslator* s_translator = nullptr; static QString s_translatorLocaleName; void -installTranslator( const QLocale& locale, - const QString& brandingTranslationsPrefix, - QObject* parent ) +installTranslator( const QLocale& locale, const QString& brandingTranslationsPrefix, QObject* parent ) { QString localeName = locale.name(); localeName.replace( "-", "_" ); if ( localeName == "C" ) + { localeName = "en"; + } // Special case of sr@latin // // See top-level CMakeLists.txt about special cases for translation loading. if ( locale.language() == QLocale::Language::Serbian && locale.script() == QLocale::Script::LatinScript ) + { localeName = QStringLiteral( "sr@latin" ); + } cDebug() << "Looking for translations for" << localeName; @@ -56,19 +59,14 @@ installTranslator( const QLocale& locale, if ( !brandingTranslationsPrefix.isEmpty() ) { QString brandingTranslationsDirPath( brandingTranslationsPrefix ); - brandingTranslationsDirPath.truncate( brandingTranslationsPrefix.lastIndexOf( - QDir::separator() ) ); + brandingTranslationsDirPath.truncate( brandingTranslationsPrefix.lastIndexOf( QDir::separator() ) ); QDir brandingTranslationsDir( brandingTranslationsDirPath ); if ( brandingTranslationsDir.exists() ) { QString filenameBase( brandingTranslationsPrefix ); - filenameBase.remove( 0, brandingTranslationsPrefix.lastIndexOf( - QDir::separator() ) + 1 ); + filenameBase.remove( 0, brandingTranslationsPrefix.lastIndexOf( QDir::separator() ) + 1 ); translator = new QTranslator( parent ); - if ( translator->load( locale, - filenameBase, - "_", - brandingTranslationsDir.absolutePath() ) ) + if ( translator->load( locale, filenameBase, "_", brandingTranslationsDir.absolutePath() ) ) { cDebug() << Logger::SubEntry << "Branding using locale:" << localeName; } @@ -120,22 +118,26 @@ translatorLocaleName() return s_translatorLocaleName; } -void -Retranslator::attachRetranslator( QObject* parent, - std::function< void ( void ) > retranslateFunc ) +Retranslator* +Retranslator::retranslatorFor( QObject* parent ) { Retranslator* r = nullptr; for ( QObject* child : parent->children() ) { r = qobject_cast< Retranslator* >( child ); if ( r ) - break; + { + return r; + } } - if ( !r ) - r = new Retranslator( parent ); + return new Retranslator( parent ); +} - r->m_retranslateFuncList.append( retranslateFunc ); +void +Retranslator::attachRetranslator( QObject* parent, std::function< void( void ) > retranslateFunc ) +{ + retranslatorFor( parent )->m_retranslateFuncList.append( retranslateFunc ); retranslateFunc(); } @@ -155,7 +157,10 @@ Retranslator::eventFilter( QObject* obj, QEvent* e ) if ( e->type() == QEvent::LanguageChange ) { foreach ( std::function< void() > func, m_retranslateFuncList ) + { func(); + } + emit languageChange(); } } // pass the event on to the base @@ -163,4 +168,4 @@ Retranslator::eventFilter( QObject* obj, QEvent* e ) } -} // namespace CalamaresUtils +} // namespace CalamaresUtils diff --git a/src/libcalamares/utils/Retranslator.h b/src/libcalamares/utils/Retranslator.h index e06630630..58c60b761 100644 --- a/src/libcalamares/utils/Retranslator.h +++ b/src/libcalamares/utils/Retranslator.h @@ -32,27 +32,31 @@ class QLocale; namespace CalamaresUtils { - /** - * @brief installTranslator changes the application language. - * @param locale the new locale. - * @param brandingTranslationsPrefix the branding path prefix, from Calamares::Branding. - * @param parent the parent QObject. - */ - DLLEXPORT void installTranslator( const QLocale& locale, - const QString& brandingTranslationsPrefix, - QObject* parent ); +/** + * @brief installTranslator changes the application language. + * @param locale the new locale. + * @param brandingTranslationsPrefix the branding path prefix, from Calamares::Branding. + * @param parent the parent QObject. + */ +DLLEXPORT void installTranslator( const QLocale& locale, const QString& brandingTranslationsPrefix, QObject* parent ); - DLLEXPORT QString translatorLocaleName(); +DLLEXPORT QString translatorLocaleName(); class Retranslator : public QObject { Q_OBJECT public: - static void attachRetranslator( QObject* parent, - std::function< void( void ) > retranslateFunc ); + /// @brief Call @p retranslateFunc when the language changes + static void attachRetranslator( QObject* parent, std::function< void( void ) > retranslateFunc ); + /// @brief What retranslator belongs to @p parent (may create one) + static Retranslator* retranslatorFor( QObject* parent ); + /// @brief Call @p retranslateFunc when the language changes void addRetranslateFunc( std::function< void( void ) > retranslateFunc ); +signals: + void languageChange(); + protected: bool eventFilter( QObject* obj, QEvent* e ) override; @@ -63,11 +67,17 @@ private: }; -} // namespace +} // namespace CalamaresUtils -#define CALAMARES_RETRANSLATE(body) \ - CalamaresUtils::Retranslator::attachRetranslator( this, [=] { body } ); -#define CALAMARES_RETRANSLATE_WIDGET(widget,body) \ +#define CALAMARES_RETRANSLATE( body ) CalamaresUtils::Retranslator::attachRetranslator( this, [=] { body } ); +#define CALAMARES_RETRANSLATE_WIDGET( widget, body ) \ CalamaresUtils::Retranslator::attachRetranslator( widget, [=] { body } ); +#define CALAMARES_RETRANSLATE_SLOT( slotfunc ) \ + { \ + this->connect( CalamaresUtils::Retranslator::retranslatorFor( this ), \ + &CalamaresUtils::Retranslator::languageChange, \ + this, \ + slotfunc ); \ + } #endif diff --git a/src/libcalamares/utils/String.cpp b/src/libcalamares/utils/String.cpp index a39ebd8c7..e39132328 100644 --- a/src/libcalamares/utils/String.cpp +++ b/src/libcalamares/utils/String.cpp @@ -31,6 +31,11 @@ namespace CalamaresUtils QString removeDiacritics( const QString& string ) { + // *INDENT-OFF* + // clang-format off + // Map these extended-Latin characters to ASCII; keep the + // layout so that one line in *diacriticLetters* corresponds + // to one line of replacements in *noDiacriticLetters*. static const QString diacriticLetters = QString::fromUtf8( "ŠŒŽšœžŸ¥µÀ" "ÁÂÃÄÅÆÇÈÉÊ" @@ -65,9 +70,11 @@ removeDiacritics( const QString& string ) "r", "A", "a", "E", "e", "L", "l", "N", "n", "S", "s", "Z", "z", "Z", "z" }; + // clang-format on + // *INDENT-ON* QString output; - for ( const QChar &c : string ) + for ( const QChar& c : string ) { int i = diacriticLetters.indexOf( c ); if ( i < 0 ) @@ -112,14 +119,14 @@ QString obscure( const QString& string ) { QString result; - const QChar *unicode = string.unicode(); + const QChar* unicode = string.unicode(); for ( int i = 0; i < string.length(); ++i ) - // yes, no typo. can't encode ' ' or '!' because - // they're the unicode BOM. stupid scrambling. stupid. - result += ( unicode[ i ].unicode() <= 0x21 ) ? - unicode[ i ] : - QChar( 0x1001F - unicode[ i ].unicode() ); + // yes, no typo. can't encode ' ' or '!' because + // they're the unicode BOM. stupid scrambling. stupid. + { + result += ( unicode[ i ].unicode() <= 0x21 ) ? unicode[ i ] : QChar( 0x1001F - unicode[ i ].unicode() ); + } return result; } -} +} // namespace CalamaresUtils diff --git a/src/libcalamares/utils/String.h b/src/libcalamares/utils/String.h index 0a69bcf83..cdf7d0b41 100644 --- a/src/libcalamares/utils/String.h +++ b/src/libcalamares/utils/String.h @@ -34,20 +34,20 @@ */ namespace CalamaresUtils { - /** - * @brief removeDiacritics replaces letters with diacritics and ligatures with - * alternative forms and digraphs. - * @param string the string to transform. - * @return the output string with plain characters. - */ - DLLEXPORT QString removeDiacritics( const QString& string ); +/** + * @brief removeDiacritics replaces letters with diacritics and ligatures with + * alternative forms and digraphs. + * @param string the string to transform. + * @return the output string with plain characters. + */ +DLLEXPORT QString removeDiacritics( const QString& string ); - /** - * @brief obscure is a bidirectional obfuscation function, from KStringHandler. - * @param string the input string. - * @return the obfuscated string. - */ - DLLEXPORT QString obscure( const QString& string ); -} // namespace +/** + * @brief obscure is a bidirectional obfuscation function, from KStringHandler. + * @param string the input string. + * @return the obfuscated string. + */ +DLLEXPORT QString obscure( const QString& string ); +} // namespace CalamaresUtils #endif diff --git a/src/libcalamares/utils/Tests.cpp b/src/libcalamares/utils/Tests.cpp index 2f2b7ff4b..97edd0bc4 100644 --- a/src/libcalamares/utils/Tests.cpp +++ b/src/libcalamares/utils/Tests.cpp @@ -155,10 +155,12 @@ LibCalamaresTests::testUmask() QTemporaryFile ft; QVERIFY( ft.open() ); + // m gets the previous value of the mask (depends on the environment the + // test is run in, might be 002, might be 077), .. mode_t m = CalamaresUtils::setUMask( 022 ); - QCOMPARE( CalamaresUtils::setUMask( m ), m ); + QCOMPARE( CalamaresUtils::setUMask( m ), 022 ); // But now most recently set was 022 - for ( int i = 0; i <= 0777 /* octal! */; ++i ) + for ( mode_t i = 0; i <= 0777 /* octal! */; ++i ) { QByteArray name = ( ft.fileName() + QChar( '.' ) + QString::number( i, 8 ) ).toLatin1(); CalamaresUtils::UMask um( i ); diff --git a/src/libcalamares/utils/UMask.h b/src/libcalamares/utils/UMask.h index 58b1a56ad..752c8b066 100644 --- a/src/libcalamares/utils/UMask.h +++ b/src/libcalamares/utils/UMask.h @@ -25,7 +25,10 @@ namespace CalamaresUtils { -/// @brief Wrapper for umask(2) +/** @brief Wrapper for umask(2) + * + * Like umask(2), sets the umask and returns the previous value of the mask. + */ DLLEXPORT mode_t setUMask( mode_t u ); /** @brief RAII for setting and re-setting umask. diff --git a/src/libcalamares/utils/Units.h b/src/libcalamares/utils/Units.h index 8fb34c3e0..b869d7dde 100644 --- a/src/libcalamares/utils/Units.h +++ b/src/libcalamares/utils/Units.h @@ -25,77 +25,143 @@ namespace CalamaresUtils { -/** User defined literals, 1_KiB is 1 KibiByte (= 2^10 bytes) */ -constexpr qint64 operator ""_KiB( unsigned long long m ) +/** User defined literals, 1_KB is 1 KiloByte (= 10^3 bytes) */ +constexpr qint64 operator""_KB( unsigned long long m ) { - return qint64(m) * 1024; + return qint64( m ) * 1000; +} + +/** User defined literals, 1_KiB is 1 KibiByte (= 2^10 bytes) */ +constexpr qint64 operator""_KiB( unsigned long long m ) +{ + return qint64( m ) * 1024; +} + +/** User defined literals, 1_MB is 1 MegaByte (= 10^6 bytes) */ +constexpr qint64 operator""_MB( unsigned long long m ) +{ + return operator""_KB(m)*1000; } /** User defined literals, 1_MiB is 1 MibiByte (= 2^20 bytes) */ -constexpr qint64 operator ""_MiB( unsigned long long m ) +constexpr qint64 operator""_MiB( unsigned long long m ) { - return operator ""_KiB(m) * 1024; + return operator""_KiB(m)*1024; +} + +/** User defined literals, 1_GB is 1 GigaByte (= 10^9 bytes) */ +constexpr qint64 operator""_GB( unsigned long long m ) +{ + return operator""_MB(m)*1000; } /** User defined literals, 1_GiB is 1 GibiByte (= 2^30 bytes) */ -constexpr qint64 operator ""_GiB( unsigned long long m ) +constexpr qint64 operator""_GiB( unsigned long long m ) { - return operator ""_MiB(m) * 1024; + return operator""_MiB(m)*1024; } -constexpr qint64 KiBtoBytes( unsigned long long m ) +constexpr qint64 +KBtoBytes( unsigned long long m ) { - return operator ""_KiB( m ); + return operator""_KB( m ); } -constexpr qint64 MiBtoBytes( unsigned long long m ) +constexpr qint64 +KiBtoBytes( unsigned long long m ) { - return operator ""_MiB( m ); + return operator""_KiB( m ); } -constexpr qint64 GiBtoBytes( unsigned long long m ) +constexpr qint64 +MBtoBytes( unsigned long long m ) { - return operator ""_GiB( m ); + return operator""_MB( m ); } -constexpr qint64 KiBtoBytes( double m ) +constexpr qint64 +MiBtoBytes( unsigned long long m ) { - return qint64(m * 1024); + return operator""_MiB( m ); } -constexpr qint64 MiBtoBytes( double m ) +constexpr qint64 +GBtoBytes( unsigned long long m ) { - return qint64(m * 1024 * 1024); + return operator""_GB( m ); } -constexpr qint64 GiBtoBytes( double m ) +constexpr qint64 +GiBtoBytes( unsigned long long m ) { - return qint64(m * 1024 * 1024 * 1024); + return operator""_GiB( m ); } -constexpr int BytesToMiB( qint64 b ) +constexpr qint64 +KBtoBytes( double m ) +{ + return qint64( m * 1000 ); +} + +constexpr qint64 +KiBtoBytes( double m ) +{ + return qint64( m * 1024 ); +} + +constexpr qint64 +MBtoBytes( double m ) +{ + return qint64( m * 1000 * 1000 ); +} + +constexpr qint64 +MiBtoBytes( double m ) +{ + return qint64( m * 1024 * 1024 ); +} + +constexpr qint64 +GBtoBytes( double m ) +{ + return qint64( m * 1000 * 1000 * 1000 ); +} + +constexpr qint64 +GiBtoBytes( double m ) +{ + return qint64( m * 1024 * 1024 * 1024 ); +} + +constexpr int +BytesToMiB( qint64 b ) { return int( b / 1024 / 1024 ); } -constexpr int BytesToGiB( qint64 b ) +constexpr int +BytesToGiB( qint64 b ) { return int( b / 1024 / 1024 / 1024 ); } -constexpr qint64 alignBytesToBlockSize( qint64 bytes, qint64 blocksize ) +constexpr qint64 +alignBytesToBlockSize( qint64 bytes, qint64 blocksize ) { qint64 blocks = bytes / blocksize; if ( blocks * blocksize != bytes ) + { ++blocks; + } return blocks * blocksize; } -constexpr qint64 bytesToSectors( qint64 bytes, qint64 blocksize ) +constexpr qint64 +bytesToSectors( qint64 bytes, qint64 blocksize ) { - return alignBytesToBlockSize( alignBytesToBlockSize( bytes, blocksize), MiBtoBytes(1ULL) ) / blocksize; + return alignBytesToBlockSize( alignBytesToBlockSize( bytes, blocksize ), MiBtoBytes( 1ULL ) ) / blocksize; } -} // namespace +} // namespace CalamaresUtils #endif diff --git a/src/libcalamares/utils/Variant.cpp b/src/libcalamares/utils/Variant.cpp index f11853916..c56f9301a 100644 --- a/src/libcalamares/utils/Variant.cpp +++ b/src/libcalamares/utils/Variant.cpp @@ -39,33 +39,43 @@ getBool( const QVariantMap& map, const QString& key, bool d ) { auto v = map.value( key ); if ( v.type() == QVariant::Bool ) + { result = v.toBool(); + } } return result; } QString -getString(const QVariantMap& map, const QString& key) +getString( const QVariantMap& map, const QString& key ) { if ( map.contains( key ) ) { auto v = map.value( key ); if ( v.type() == QVariant::String ) + { return v.toString(); + } } return QString(); } -int -getInteger( const QVariantMap& map, const QString& key, int d ) +qint64 +getInteger( const QVariantMap& map, const QString& key, qint64 d ) { - int result = d; + qint64 result = d; if ( map.contains( key ) ) { auto v = map.value( key ); if ( v.type() == QVariant::Int ) + { result = v.toInt(); + } + else if ( v.type() == QVariant::LongLong ) + { + result = v.toLongLong(); + } } return result; @@ -79,9 +89,13 @@ getDouble( const QVariantMap& map, const QString& key, double d ) { auto v = map.value( key ); if ( v.type() == QVariant::Int ) + { result = v.toInt(); + } else if ( v.type() == QVariant::Double ) + { result = v.toDouble(); + } } return result; @@ -104,4 +118,4 @@ getSubMap( const QVariantMap& map, const QString& key, bool& success ) return QVariantMap(); } -} +} // namespace CalamaresUtils diff --git a/src/libcalamares/utils/Variant.h b/src/libcalamares/utils/Variant.h index e60eccb4e..15f791b74 100644 --- a/src/libcalamares/utils/Variant.h +++ b/src/libcalamares/utils/Variant.h @@ -27,36 +27,36 @@ namespace CalamaresUtils { - /** - * Get a bool value from a mapping with a given key; returns the default - * if no value is stored in the map. - */ - DLLEXPORT bool getBool( const QVariantMap& map, const QString& key, bool d ); +/** + * Get a bool value from a mapping with a given key; returns the default + * if no value is stored in the map. + */ +DLLEXPORT bool getBool( const QVariantMap& map, const QString& key, bool d ); - /** - * Get a string value from a mapping; returns empty QString if no value. - */ - DLLEXPORT QString getString( const QVariantMap& map, const QString& key ); +/** + * Get a string value from a mapping; returns empty QString if no value. + */ +DLLEXPORT QString getString( const QVariantMap& map, const QString& key ); - /** - * Get an integer value from a mapping; returns @p d if no value. - */ - DLLEXPORT int getInteger( const QVariantMap& map, const QString& key, int d ); +/** + * Get an integer value from a mapping; returns @p d if no value. + */ +DLLEXPORT qint64 getInteger( const QVariantMap& map, const QString& key, qint64 d ); - /** - * Get a double value from a mapping (integers are converted); returns @p d if no value. - */ - DLLEXPORT double getDouble( const QVariantMap& map, const QString& key, double d ); +/** + * Get a double value from a mapping (integers are converted); returns @p d if no value. + */ +DLLEXPORT double getDouble( const QVariantMap& map, const QString& key, double d ); - /** - * Returns a sub-map (i.e. a nested map) from the given mapping with the - * given key. @p success is set to true if the @p key exists - * in @p map and converts to a map, false otherwise. - * - * Returns an empty map if there is no such key or it is not a map-value. - * (e.g. if @p success is false). - */ - DLLEXPORT QVariantMap getSubMap( const QVariantMap& map, const QString& key, bool& success ); -} // namespace +/** + * Returns a sub-map (i.e. a nested map) from the given mapping with the + * given key. @p success is set to true if the @p key exists + * in @p map and converts to a map, false otherwise. + * + * Returns an empty map if there is no such key or it is not a map-value. + * (e.g. if @p success is false). + */ +DLLEXPORT QVariantMap getSubMap( const QVariantMap& map, const QString& key, bool& success ); +} // namespace CalamaresUtils #endif diff --git a/src/libcalamares/utils/Yaml.cpp b/src/libcalamares/utils/Yaml.cpp index aa7ef6c2e..164c17a21 100644 --- a/src/libcalamares/utils/Yaml.cpp +++ b/src/libcalamares/utils/Yaml.cpp @@ -70,13 +70,21 @@ yamlScalarToVariant( const YAML::Node& scalarNode ) std::string stdScalar = scalarNode.as< std::string >(); QString scalarString = QString::fromStdString( stdScalar ); if ( _yamlScalarTrueValues.exactMatch( scalarString ) ) + { return QVariant( true ); + } if ( _yamlScalarFalseValues.exactMatch( scalarString ) ) + { return QVariant( false ); + } if ( QRegExp( "[-+]?\\d+" ).exactMatch( scalarString ) ) - return QVariant( scalarString.toInt() ); + { + return QVariant( scalarString.toLongLong() ); + } if ( QRegExp( "[-+]?\\d*\\.?\\d+" ).exactMatch( scalarString ) ) + { return QVariant( scalarString.toDouble() ); + } return QVariant( scalarString ); } @@ -85,8 +93,7 @@ QVariant yamlSequenceToVariant( const YAML::Node& sequenceNode ) { QVariantList vl; - for ( YAML::const_iterator it = sequenceNode.begin(); - it != sequenceNode.end(); ++it ) + for ( YAML::const_iterator it = sequenceNode.begin(); it != sequenceNode.end(); ++it ) { vl << yamlToVariant( *it ); } @@ -98,17 +105,15 @@ QVariant yamlMapToVariant( const YAML::Node& mapNode ) { QVariantMap vm; - for ( YAML::const_iterator it = mapNode.begin(); - it != mapNode.end(); ++it ) + for ( YAML::const_iterator it = mapNode.begin(); it != mapNode.end(); ++it ) { - vm.insert( QString::fromStdString( it->first.as< std::string >() ), - yamlToVariant( it->second ) ); + vm.insert( QString::fromStdString( it->first.as< std::string >() ), yamlToVariant( it->second ) ); } return vm; } QStringList -yamlToStringList(const YAML::Node& listNode) +yamlToStringList( const YAML::Node& listNode ) { QStringList l; listNode >> l; @@ -117,7 +122,7 @@ yamlToStringList(const YAML::Node& listNode) void -explainYamlException( const YAML::Exception& e, const QByteArray& yamlData, const char *label ) +explainYamlException( const YAML::Exception& e, const QByteArray& yamlData, const char* label ) { cWarning() << "YAML error " << e.what() << "in" << label << '.'; explainYamlException( e, yamlData ); @@ -142,7 +147,9 @@ explainYamlException( const YAML::Exception& e, const QByteArray& yamlData ) linestart = yamlData.indexOf( '\n', linestart ); // No more \ns found, weird if ( linestart < 0 ) + { break; + } linestart += 1; // Skip that \n } int lineend = linestart; @@ -150,34 +157,43 @@ explainYamlException( const YAML::Exception& e, const QByteArray& yamlData ) { lineend = yamlData.indexOf( '\n', linestart ); if ( lineend < 0 ) + { lineend = yamlData.length(); + } } int rangestart = linestart; int rangeend = lineend; // Adjust range (linestart..lineend) so it's not too long if ( ( linestart >= 0 ) && ( e.mark.column > 30 ) ) + { rangestart += ( e.mark.column - 30 ); + } if ( ( linestart >= 0 ) && ( rangeend - rangestart > 40 ) ) + { rangeend = rangestart + 40; + } if ( linestart >= 0 ) - cWarning() << "offending YAML data:" << yamlData.mid( rangestart, rangeend-rangestart ).constData(); - + { + cWarning() << "offending YAML data:" << yamlData.mid( rangestart, rangeend - rangestart ).constData(); + } } } QVariantMap -loadYaml(const QFileInfo& fi, bool* ok) +loadYaml( const QFileInfo& fi, bool* ok ) { return loadYaml( fi.absoluteFilePath(), ok ); } QVariantMap -loadYaml(const QString& filename, bool* ok) +loadYaml( const QString& filename, bool* ok ) { if ( ok ) + { *ok = false; + } QFile yamlFile( filename ); QVariant yamlContents; @@ -197,12 +213,12 @@ loadYaml(const QString& filename, bool* ok) } - if ( yamlContents.isValid() && - !yamlContents.isNull() && - yamlContents.type() == QVariant::Map ) + if ( yamlContents.isValid() && !yamlContents.isNull() && yamlContents.type() == QVariant::Map ) { if ( ok ) + { *ok = true; + } return yamlContents.toMap(); } @@ -214,7 +230,9 @@ static void writeIndent( QFile& f, int indent ) { while ( indent-- > 0 ) + { f.write( " " ); + } } // forward declaration @@ -229,7 +247,9 @@ static void dumpYamlElement( QFile& f, const QVariant& value, int indent ) { if ( value.type() == QVariant::Type::Bool ) + { f.write( value.toBool() ? "true" : "false" ); + } else if ( value.type() == QVariant::Type::String ) { f.write( quote ); @@ -251,17 +271,19 @@ dumpYamlElement( QFile& f, const QVariant& value, int indent ) { ++c; f.write( newline ); - writeIndent( f, indent+1 ); + writeIndent( f, indent + 1 ); f.write( "- " ); - dumpYamlElement( f, it, indent+1 ); + dumpYamlElement( f, it, indent + 1 ); } if ( !c ) // i.e. list was empty + { f.write( "[]" ); + } } else if ( value.type() == QVariant::Type::Map ) { f.write( newline ); - dumpYaml( f, value.toMap(), indent+1 ); + dumpYaml( f, value.toMap(), indent + 1 ); } else { @@ -293,12 +315,13 @@ saveYaml( const QString& filename, const QVariantMap& map ) { QFile f( filename ); if ( !f.open( QFile::WriteOnly ) ) + { return false; + } f.write( "# YAML dump\n---\n" ); return dumpYaml( f, map, 0 ); } - -} // namespace +} // namespace CalamaresUtils diff --git a/src/libcalamares/utils/Yaml.h b/src/libcalamares/utils/Yaml.h index 8755be336..6b786aef8 100644 --- a/src/libcalamares/utils/Yaml.h +++ b/src/libcalamares/utils/Yaml.h @@ -73,10 +73,10 @@ bool saveYaml( const QString& filename, const QVariantMap& map ); * what is going on in terms of the data passed to the parser. * Uses @p label when labeling the data source (e.g. "netinstall data") */ -void explainYamlException( const YAML::Exception& e, const QByteArray& data, const char *label ); +void explainYamlException( const YAML::Exception& e, const QByteArray& data, const char* label ); void explainYamlException( const YAML::Exception& e, const QByteArray& data, const QString& label ); void explainYamlException( const YAML::Exception& e, const QByteArray& data ); -} // namespace +} // namespace CalamaresUtils #endif diff --git a/src/libcalamaresui/Branding.cpp b/src/libcalamaresui/Branding.cpp index 876fdfa80..edbced5fa 100644 --- a/src/libcalamaresui/Branding.cpp +++ b/src/libcalamaresui/Branding.cpp @@ -52,6 +52,8 @@ Branding::instance() } +// *INDENT-OFF* +// clang-format off const QStringList Branding::s_stringEntryStrings = { "productName", @@ -82,15 +84,21 @@ const QStringList Branding::s_styleEntryStrings = "sidebarTextSelect", "sidebarTextHighlight" }; +// clang-format on +// *INDENT-ON* -const NamedEnumTable& +const NamedEnumTable< Branding::WindowDimensionUnit >& Branding::WindowDimension::suffixes() { using Unit = Branding::WindowDimensionUnit; + // *INDENT-OFF* + // clang-format off static const NamedEnumTable names{ {"px", Unit::Pixies}, {"em", Unit::Fonties} }; + // clang-format on + // *INDENT-ON* return names; } @@ -102,16 +110,23 @@ Branding::WindowDimension::suffixes() * the @p transform function, which may change strings. */ static void -loadStrings( QMap& map, const YAML::Node& doc, const std::string& key, const std::function< QString(const QString&) >& transform ) +loadStrings( QMap< QString, QString >& map, + const YAML::Node& doc, + const std::string& key, + const std::function< QString( const QString& ) >& transform ) { if ( !doc[ key ].IsMap() ) - throw YAML::Exception( YAML::Mark(), std::string("Branding configuration is not a map: ") + key ); + { + throw YAML::Exception( YAML::Mark(), std::string( "Branding configuration is not a map: " ) + key ); + } const auto& config = CalamaresUtils::yamlMapToVariant( doc[ key ] ).toMap(); map.clear(); for ( auto it = config.constBegin(); it != config.constEnd(); ++it ) + { map.insert( it.key(), transform( it.value().toString() ) ); + } } /** @brief Load the @p map with strings from @p config @@ -121,19 +136,20 @@ loadStrings( QMap& map, const YAML::Node& doc, const std::stri * documentation for details. */ -Branding::Branding( const QString& brandingFilePath, - QObject* parent ) +Branding::Branding( const QString& brandingFilePath, QObject* parent ) : QObject( parent ) , m_descriptorPath( brandingFilePath ) + , m_slideshowAPI( 1 ) , m_welcomeStyleCalamares( false ) , m_welcomeExpandingLogo( true ) - , m_slideshowAPI( 1 ) { cDebug() << "Using Calamares branding file at" << brandingFilePath; QDir componentDir( componentDirectory() ); if ( !componentDir.exists() ) + { bail( "Bad component directory path." ); + } QFile file( brandingFilePath ); if ( file.exists() && file.open( QFile::ReadOnly | QFile::Text ) ) @@ -145,8 +161,7 @@ Branding::Branding( const QString& brandingFilePath, YAML::Node doc = YAML::Load( ba.constData() ); Q_ASSERT( doc.IsMap() ); - m_componentName = QString::fromStdString( doc[ "componentName" ] - .as< std::string >() ); + m_componentName = QString::fromStdString( doc[ "componentName" ].as< std::string >() ); if ( m_componentName != componentDir.dirName() ) bail( "The branding component name should match the name of the " "component directory." ); @@ -157,8 +172,7 @@ Branding::Branding( const QString& brandingFilePath, // Copy the os-release information into a QHash for use by KMacroExpander. KOSRelease relInfo; - QHash< QString, QString > relMap{ - std::initializer_list< std::pair< QString, QString > > { + QHash< QString, QString > relMap { std::initializer_list< std::pair< QString, QString > > { { QStringLiteral( "NAME" ), relInfo.name() }, { QStringLiteral( "VERSION" ), relInfo.version() }, { QStringLiteral( "ID" ), relInfo.id() }, @@ -174,9 +188,10 @@ Branding::Branding( const QString& brandingFilePath, { QStringLiteral( "BUILD_ID" ), relInfo.buildId() }, { QStringLiteral( "VARIANT" ), relInfo.variant() }, { QStringLiteral( "VARIANT_ID" ), relInfo.variantId() }, - { QStringLiteral( "LOGO" ), relInfo.logo() } - } }; - auto expand = [&]( const QString& s ) -> QString { return KMacroExpander::expandMacros( s, relMap, QLatin1Char( '@' ) ); }; + { QStringLiteral( "LOGO" ), relInfo.logo() } } }; + auto expand = [&]( const QString& s ) -> QString { + return KMacroExpander::expandMacros( s, relMap, QLatin1Char( '@' ) ); + }; #else auto expand = []( const QString& s ) -> QString { return s; }; #endif @@ -184,26 +199,23 @@ Branding::Branding( const QString& brandingFilePath, // Massage the strings, images and style sections. loadStrings( m_strings, doc, "strings", expand ); - loadStrings( m_images, doc, "images", - [&]( const QString& s ) -> QString + loadStrings( m_images, doc, "images", [&]( const QString& s ) -> QString { + // See also image() + const QString imageName( expand( s ) ); + QFileInfo imageFi( componentDir.absoluteFilePath( imageName ) ); + if ( !imageFi.exists() ) { - // See also image() - const QString imageName( expand( s ) ); - QFileInfo imageFi( componentDir.absoluteFilePath( imageName ) ); - if ( !imageFi.exists() ) + const auto icon = QIcon::fromTheme( imageName ); + // Not found, bail out with the filename used + if ( icon.isNull() ) { - const auto icon = QIcon::fromTheme( imageName ); - // Not found, bail out with the filename used - if ( icon.isNull() ) - bail( QString( "Image file %1 does not exist." ).arg( imageFi.absoluteFilePath() ) ); - return imageName; // Not turned into a path + bail( QString( "Image file %1 does not exist." ).arg( imageFi.absoluteFilePath() ) ); } - return imageFi.absoluteFilePath(); + return imageName; // Not turned into a path } - ); - loadStrings( m_style, doc, "style", - []( const QString& s ) -> QString { return s; } - ); + return imageFi.absoluteFilePath(); + } ); + loadStrings( m_style, doc, "style", []( const QString& s ) -> QString { return s; } ); if ( doc[ "slideshow" ].IsSequence() ) { @@ -214,8 +226,9 @@ Branding::Branding( const QString& brandingFilePath, QString pathString = slideShowPictures[ i ]; QFileInfo imageFi( componentDir.absoluteFilePath( pathString ) ); if ( !imageFi.exists() ) - bail( QString( "Slideshow file %1 does not exist." ) - .arg( imageFi.absoluteFilePath() ) ); + { + bail( QString( "Slideshow file %1 does not exist." ).arg( imageFi.absoluteFilePath() ) ); + } slideShowPictures[ i ] = imageFi.absoluteFilePath(); } @@ -224,19 +237,19 @@ Branding::Branding( const QString& brandingFilePath, } else if ( doc[ "slideshow" ].IsScalar() ) { - QString slideshowPath = QString::fromStdString( doc[ "slideshow" ] - .as< std::string >() ); + QString slideshowPath = QString::fromStdString( doc[ "slideshow" ].as< std::string >() ); QFileInfo slideshowFi( componentDir.absoluteFilePath( slideshowPath ) ); - if ( !slideshowFi.exists() || - !slideshowFi.fileName().toLower().endsWith( ".qml" ) ) + if ( !slideshowFi.exists() || !slideshowFi.fileName().toLower().endsWith( ".qml" ) ) bail( QString( "Slideshow file %1 does not exist or is not a valid QML file." ) - .arg( slideshowFi.absoluteFilePath() ) ); + .arg( slideshowFi.absoluteFilePath() ) ); m_slideshowPath = slideshowFi.absoluteFilePath(); } else + { bail( "Syntax error in slideshow sequence." ); + } - int api = doc[ "slideshowAPI" ].IsScalar() ? doc[ "slideshowAPI" ].as() : -1; + int api = doc[ "slideshowAPI" ].IsScalar() ? doc[ "slideshowAPI" ].as< int >() : -1; if ( ( api < 1 ) || ( api > 2 ) ) { cWarning() << "Invalid or missing *slideshowAPI* in branding file."; @@ -252,11 +265,11 @@ Branding::Branding( const QString& brandingFilePath, QDir translationsDir( componentDir.filePath( "lang" ) ); if ( !translationsDir.exists() ) + { cWarning() << "the branding component" << componentDir.absolutePath() << "does not ship translations."; + } m_translationsPathPrefix = translationsDir.absolutePath(); - m_translationsPathPrefix.append( QString( "%1calamares-%2" ) - .arg( QDir::separator() ) - .arg( m_componentName ) ); + m_translationsPathPrefix.append( QString( "%1calamares-%2" ).arg( QDir::separator() ).arg( m_componentName ) ); } else { @@ -278,7 +291,7 @@ Branding::Branding( const QString& brandingFilePath, QString Branding::componentDirectory() const { - QFileInfo fi ( m_descriptorPath ); + QFileInfo fi( m_descriptorPath ); return fi.absoluteDir().absolutePath(); } @@ -317,7 +330,7 @@ Branding::image( Branding::ImageEntry imageEntry, const QSize& size ) const } else { - auto icon = QIcon::fromTheme(path); + auto icon = QIcon::fromTheme( path ); Q_ASSERT( !icon.isNull() ); return icon.pixmap( size ); @@ -325,7 +338,7 @@ Branding::image( Branding::ImageEntry imageEntry, const QSize& size ) const } QPixmap -Branding::image(const QString& imageName, const QSize& size) const +Branding::image( const QString& imageName, const QSize& size ) const { QDir componentDir( componentDirectory() ); QFileInfo imageFi( componentDir.absoluteFilePath( imageName ) ); @@ -334,7 +347,9 @@ Branding::image(const QString& imageName, const QSize& size) const const auto icon = QIcon::fromTheme( imageName ); // Not found, bail out with the filename used if ( icon.isNull() ) + { return QPixmap(); + } return icon.pixmap( size ); } return ImageRegistry::instance()->pixmap( imageFi.absoluteFilePath(), size ); @@ -352,7 +367,9 @@ Branding::stylesheet() const return stylesheetFile.readAll(); } else + { cWarning() << "The branding component" << fi.absoluteDir().absolutePath() << "does not ship stylesheet.qss."; + } return QString(); } @@ -361,7 +378,9 @@ Branding::setGlobals( GlobalStorage* globalStorage ) const { QVariantMap brandingMap; for ( const QString& key : s_stringEntryStrings ) + { brandingMap.insert( key, m_strings.value( key ) ); + } globalStorage->insert( "branding", brandingMap ); } @@ -376,15 +395,17 @@ Branding::WindowDimension::isValid() const static inline QString getString( const YAML::Node& doc, const char* key ) { - if ( doc[key] ) - return QString::fromStdString( doc[key].as< std::string >() ); + if ( doc[ key ] ) + { + return QString::fromStdString( doc[ key ].as< std::string >() ); + } return QString(); } void Branding::initSimpleSettings( const YAML::Node& doc ) { - static const NamedEnumTable< WindowExpansion > expansionNames{ + static const NamedEnumTable< WindowExpansion > expansionNames { { QStringLiteral( "normal" ), WindowExpansion::Normal }, { QStringLiteral( "fullscreen" ), WindowExpansion::Fullscreen }, { QStringLiteral( "noexpand" ), WindowExpansion::Fixed } @@ -395,7 +416,10 @@ Branding::initSimpleSettings( const YAML::Node& doc ) m_welcomeExpandingLogo = doc[ "welcomeExpandingLogo" ].as< bool >( true ); m_windowExpansion = expansionNames.find( getString( doc, "windowExpanding" ), ok ); if ( !ok ) - cWarning() << "Branding module-setting *windowExpanding* interpreted as" << expansionNames.find( m_windowExpansion, ok ); + { + cWarning() << "Branding module-setting *windowExpanding* interpreted as" + << expansionNames.find( m_windowExpansion, ok ); + } QString windowSize = getString( doc, "windowSize" ); if ( !windowSize.isEmpty() ) @@ -403,24 +427,26 @@ Branding::initSimpleSettings( const YAML::Node& doc ) auto l = windowSize.split( ',' ); if ( l.count() == 2 ) { - m_windowWidth = WindowDimension( l[0] ); - m_windowHeight = WindowDimension( l[1] ); + m_windowWidth = WindowDimension( l[ 0 ] ); + m_windowHeight = WindowDimension( l[ 1 ] ); } } if ( !m_windowWidth.isValid() ) + { m_windowWidth = WindowDimension( CalamaresUtils::windowPreferredWidth, WindowDimensionUnit::Pixies ); + } if ( !m_windowHeight.isValid() ) + { m_windowHeight = WindowDimension( CalamaresUtils::windowPreferredHeight, WindowDimensionUnit::Pixies ); + } } [[noreturn]] void Branding::bail( const QString& message ) { - cError() << "FATAL in" - << m_descriptorPath - << "\n" + message; + cError() << "FATAL in" << m_descriptorPath << "\n" + message; ::exit( EXIT_FAILURE ); } -} +} // namespace Calamares diff --git a/src/libcalamaresui/Branding.h b/src/libcalamaresui/Branding.h index a3909bc00..3723fd07f 100644 --- a/src/libcalamaresui/Branding.h +++ b/src/libcalamaresui/Branding.h @@ -25,13 +25,13 @@ #include "utils/NamedSuffix.h" +#include #include #include -#include namespace YAML { - class Node; +class Node; } namespace Calamares @@ -79,27 +79,39 @@ public: }; /** @brief Setting for how much the main window may expand. */ - enum class WindowExpansion { Normal, Fullscreen, Fixed } ; + enum class WindowExpansion + { + Normal, + Fullscreen, + Fixed + }; /** @brief Setting for the main window size. * * The units are pixels (Pixies) or something-based-on-fontsize (Fonties), which * we suffix as "em", e.g. "600px" or "32em". */ - enum class WindowDimensionUnit { None, Pixies, Fonties }; - class WindowDimension : public NamedSuffix + enum class WindowDimensionUnit + { + None, + Pixies, + Fonties + }; + class WindowDimension : public NamedSuffix< WindowDimensionUnit, WindowDimensionUnit::None > { public: - static const NamedEnumTable< WindowDimensionUnit >& suffixes(); + static const NamedEnumTable< WindowDimensionUnit >& suffixes(); bool isValid() const; using NamedSuffix::NamedSuffix; - WindowDimension( const QString& s ) : NamedSuffix( suffixes(), s ) {} - } ; + WindowDimension( const QString& s ) + : NamedSuffix( suffixes(), s ) + { + } + }; static Branding* instance(); - explicit Branding( const QString& brandingFilePath, - QObject* parent = nullptr ); + explicit Branding( const QString& brandingFilePath, QObject* parent = nullptr ); /** @brief Complete path of the branding descriptor file. */ QString descriptorPath() const { return m_descriptorPath; } @@ -184,11 +196,14 @@ private: WindowExpansion m_windowExpansion; WindowDimension m_windowHeight, m_windowWidth; - }; -template inline QString operator*(U e) { return Branding::instance()->string( e ); } - +template < typename U > +inline QString operator*( U e ) +{ + return Branding::instance()->string( e ); } -#endif // BRANDING_H +} // namespace Calamares + +#endif // BRANDING_H diff --git a/src/libcalamaresui/CMakeLists.txt b/src/libcalamaresui/CMakeLists.txt index f6c8c9ac7..a9d31c2c3 100644 --- a/src/libcalamaresui/CMakeLists.txt +++ b/src/libcalamaresui/CMakeLists.txt @@ -2,7 +2,7 @@ # view modules, view steps, widgets, and branding. # The UI libs use the non-UI library -include_directories( ${CMAKE_SOURCE_DIR}/src/libcalamares ${CMAKE_BINARY_DIR}/src/libcalamares ) +include_directories( ${CMAKE_SOURCE_DIR}/src/libcalamares ${CMAKE_BINARY_DIR}/src/libcalamares ${CMAKE_SOURCE_DIR} ) set( calamaresui_SOURCES modulesystem/CppJobModule.cpp @@ -14,19 +14,16 @@ set( calamaresui_SOURCES modulesystem/ViewModule.cpp utils/CalamaresUtilsGui.cpp - utils/DebugWindow.cpp utils/ImageRegistry.cpp - - utils/qjsonmodel.cpp - utils/qjsonitem.cpp + utils/Paste.cpp viewpages/BlankViewStep.cpp viewpages/ViewStep.cpp widgets/ClickableLabel.cpp widgets/FixedAspectRatioLabel.cpp - widgets/waitingspinnerwidget.cpp widgets/WaitingWidget.cpp + ${CMAKE_SOURCE_DIR}/3rdparty/waitingspinnerwidget.cpp ExecutionViewStep.cpp Branding.cpp @@ -35,14 +32,9 @@ set( calamaresui_SOURCES # Don't warn about third-party sources mark_thirdparty_code( - utils/ImageRegistry.cpp - utils/qjsonitem.cpp - utils/qjsonmodel.cpp - widgets/waitingspinnerwidget.cpp -) - -set( calamaresui_UI - utils/DebugWindow.ui + ${CMAKE_SOURCE_DIR}/3rdparty/qjsonitem.cpp + ${CMAKE_SOURCE_DIR}/3rdparty/qjsonmodel.cpp + ${CMAKE_SOURCE_DIR}/3rdparty/waitingspinnerwidget.cpp ) if( WITH_PYTHON ) @@ -72,7 +64,6 @@ endif() calamares_add_library( calamaresui SOURCES ${calamaresui_SOURCES} - UI ${calamaresui_UI} EXPORT_MACRO UIDLLEXPORT_PRO LINK_PRIVATE_LIBRARIES ${OPTIONAL_PYTHON_LIBRARIES} @@ -84,8 +75,6 @@ calamares_add_library( calamaresui VERSION ${CALAMARES_VERSION_SHORT} ) -find_package( KF5CoreAddons 5.58 QUIET ) # If it's really new -if ( KF5CoreAddons_FOUND ) +if ( KF5CoreAddons_FOUND AND KF5CoreAddons_VERSION VERSION_GREATER_EQUAL 5.58 ) target_compile_definitions( calamaresui PRIVATE WITH_KOSRelease ) - target_link_libraries( calamaresui PRIVATE KF5::CoreAddons ) endif() diff --git a/src/libcalamaresui/ExecutionViewStep.cpp b/src/libcalamaresui/ExecutionViewStep.cpp index e242622a0..501995c07 100644 --- a/src/libcalamaresui/ExecutionViewStep.cpp +++ b/src/libcalamaresui/ExecutionViewStep.cpp @@ -23,10 +23,10 @@ #include "Branding.h" #include "Job.h" #include "JobQueue.h" -#include "modulesystem/Module.h" -#include "modulesystem/ModuleManager.h" #include "Settings.h" #include "ViewManager.h" +#include "modulesystem/Module.h" +#include "modulesystem/ModuleManager.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Dirs.h" @@ -56,7 +56,7 @@ callQMLFunction( QQuickItem* qmlObject, const char* method ) QByteArray methodSignature( method ); methodSignature.append( "()" ); - if ( qmlObject && qmlObject->metaObject()->indexOfMethod( methodSignature ) >= 0 ) + if ( qmlObject && qmlObject->metaObject()->indexOfMethod( methodSignature ) >= 0 ) { QVariant returnValue; QMetaObject::invokeMethod( qmlObject, method, Q_RETURN_ARG( QVariant, returnValue ) ); @@ -117,9 +117,7 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent ) QString ExecutionViewStep::prettyName() const { - return Calamares::Settings::instance()->isSetupMode() - ? tr( "Set up" ) - : tr( "Install" ); + return Calamares::Settings::instance()->isSetupMode() ? tr( "Set up" ) : tr( "Install" ); } @@ -176,37 +174,92 @@ ExecutionViewStep::loadQmlV2() { m_qmlComponent = new QQmlComponent( m_qmlShow->engine(), QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ), - QQmlComponent::CompilationMode::Asynchronous - ); + QQmlComponent::CompilationMode::Asynchronous ); connect( m_qmlComponent, &QQmlComponent::statusChanged, this, &ExecutionViewStep::loadQmlV2Complete ); } } +/// @brief State-change of the slideshow, for changeSlideShowState() +enum class Slideshow +{ + Start, + Stop +}; + +/** @brief Tells the slideshow we activated or left the show. + * + * If @p state is @c Slideshow::Start, calls suitable activation procedures. + * If @p state is @c Slideshow::Stop, calls deactivation procedures. + * + * Applies V1 and V2 QML activation / deactivation: + * - V1 loads the QML in @p widget on activation. Sets root object property + * *activatedInCalamares* as appropriate. + * - V2 calls onActivate() or onLeave() in the QML as appropriate. Also + * sets the *activatedInCalamares* property. + */ +static void +changeSlideShowState( Slideshow state, QQuickItem* slideshow, QQuickWidget* widget ) +{ + bool activate = state == Slideshow::Start; + + if ( Branding::instance()->slideshowAPI() == 2 ) + { + // The QML was already loaded in the constructor, need to start it + callQMLFunction( slideshow, activate ? "onActivate" : "onLeave" ); + } + else if ( !Calamares::Branding::instance()->slideshowPath().isEmpty() ) + { + // API version 1 assumes onCompleted is the trigger + if ( activate ) + { + widget->setSource( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ) ); + } + // needs the root object for property setting, below + slideshow = widget->rootObject(); + } + + // V1 API has picked up the root object for use, V2 passed it in. + if ( slideshow ) + { + static const char propertyName[] = "activatedInCalamares"; + auto property = slideshow->property( propertyName ); + if ( property.isValid() && ( property.type() == QVariant::Bool ) && ( property.toBool() != activate ) ) + { + slideshow->setProperty( propertyName, activate ); + } + } +} + void ExecutionViewStep::loadQmlV2Complete() { if ( m_qmlComponent && m_qmlComponent->isReady() && !m_qmlObject ) { - cDebug() << "QML loading complete, API 2"; + cDebug() << "QML component complete, API 2"; // Don't do this again disconnect( m_qmlComponent, &QQmlComponent::statusChanged, this, &ExecutionViewStep::loadQmlV2Complete ); QObject* o = m_qmlComponent->create(); m_qmlObject = qobject_cast< QQuickItem* >( o ); if ( !m_qmlObject ) + { delete o; + } else { + cDebug() << Logger::SubEntry << "Loading" << Calamares::Branding::instance()->slideshowPath(); + // setContent() is public API, but not documented publicly. // It is marked \internal in the Qt sources, but does exactly // what is needed: sets up visual parent by replacing the root // item, and handling resizes. - m_qmlShow->setContent( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ), m_qmlComponent, m_qmlObject ); + m_qmlShow->setContent( + QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ), m_qmlComponent, m_qmlObject ); if ( ViewManager::instance()->currentStep() == this ) { // We're alreay visible! Must have been slow QML loading, and we // passed onActivate already. - callQMLFunction( m_qmlObject, "onActivate" ); + changeSlideShowState( Slideshow::Start, m_qmlObject, m_qmlShow ); } } } @@ -215,16 +268,7 @@ ExecutionViewStep::loadQmlV2Complete() void ExecutionViewStep::onActivate() { - if ( Branding::instance()->slideshowAPI() == 2 ) - { - // The QML was already loaded in the constructor, need to start it - callQMLFunction( m_qmlObject, "onActivate" ); - } - else if ( !Calamares::Branding::instance()->slideshowPath().isEmpty() ) - { - // API version 1 assumes onCompleted is the trigger - m_qmlShow->setSource( QUrl::fromLocalFile( Calamares::Branding::instance()->slideshowPath() ) ); - } + changeSlideShowState( Slideshow::Start, m_qmlObject, m_qmlShow ); JobQueue* queue = JobQueue::instance(); foreach ( const QString& instanceKey, m_jobInstanceKeys ) @@ -235,8 +279,10 @@ ExecutionViewStep::onActivate() auto jl = module->jobs(); if ( module->isEmergency() ) { - for( auto& j : jl ) + for ( auto& j : jl ) + { j->setEmergency( true ); + } } queue->enqueue( jl ); } @@ -270,13 +316,13 @@ ExecutionViewStep::updateFromJobQueue( qreal percent, const QString& message ) void ExecutionViewStep::onLeave() { + changeSlideShowState( Slideshow::Stop, m_qmlObject, m_qmlShow ); // API version 2 is explicitly stopped; version 1 keeps running if ( Branding::instance()->slideshowAPI() == 2 ) { - callQMLFunction( m_qmlObject, "onLeave" ); delete m_qmlObject; m_qmlObject = nullptr; } } -} // namespace +} // namespace Calamares diff --git a/src/libcalamaresui/ExecutionViewStep.h b/src/libcalamaresui/ExecutionViewStep.h index 63594b151..8c4174cdb 100644 --- a/src/libcalamaresui/ExecutionViewStep.h +++ b/src/libcalamaresui/ExecutionViewStep.h @@ -77,6 +77,6 @@ private: void updateFromJobQueue( qreal percent, const QString& message ); }; -} +} // namespace Calamares #endif /* EXECUTIONVIEWSTEP_H */ diff --git a/src/libcalamaresui/UiDllMacro.h b/src/libcalamaresui/UiDllMacro.h index 35ad67453..3064ca68c 100644 --- a/src/libcalamaresui/UiDllMacro.h +++ b/src/libcalamaresui/UiDllMacro.h @@ -22,11 +22,11 @@ #include #ifndef UIDLLEXPORT -# if defined (UIDLLEXPORT_PRO) -# define UIDLLEXPORT Q_DECL_EXPORT -# else -# define UIDLLEXPORT Q_DECL_IMPORT -# endif +#if defined( UIDLLEXPORT_PRO ) +#define UIDLLEXPORT Q_DECL_EXPORT +#else +#define UIDLLEXPORT Q_DECL_IMPORT +#endif #endif #endif diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 16c38b1bc..8fb832369 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -21,17 +21,21 @@ #include "ViewManager.h" -#include "utils/Logger.h" #include "viewpages/BlankViewStep.h" #include "viewpages/ViewStep.h" + +#include "Branding.h" #include "ExecutionViewStep.h" #include "JobQueue.h" -#include "utils/Retranslator.h" -#include "Branding.h" #include "Settings.h" +#include "utils/Logger.h" +#include "utils/Paste.h" +#include "utils/Retranslator.h" + #include #include +#include #include #include @@ -108,9 +112,7 @@ ViewManager::ViewManager( QObject* parent ) m_next = makeButton( m_widget, "go-next" ); m_quit = makeButton( m_widget, "dialog-cancel" ); - CALAMARES_RETRANSLATE( - updateButtonLabels(); - ) + CALAMARES_RETRANSLATE_SLOT( &ViewManager::updateButtonLabels ) QBoxLayout* bottomLayout = new QHBoxLayout; mainLayout->addLayout( bottomLayout ); @@ -124,15 +126,21 @@ ViewManager::ViewManager( QObject* parent ) connect( m_back, &QPushButton::clicked, this, &ViewManager::back ); m_back->setEnabled( false ); - connect( m_quit, &QPushButton::clicked, this, - [this]() { if ( this->confirmCancelInstallation() ) qApp->quit(); } ); - connect( JobQueue::instance(), &JobQueue::failed, - this, &ViewManager::onInstallationFailed ); - connect( JobQueue::instance(), &JobQueue::finished, - this, &ViewManager::next ); + connect( m_quit, &QPushButton::clicked, this, [this]() { + if ( this->confirmCancelInstallation() ) + { + qApp->quit(); + } + } ); + connect( JobQueue::instance(), &JobQueue::failed, this, &ViewManager::onInstallationFailed ); + connect( JobQueue::instance(), &JobQueue::finished, this, &ViewManager::next ); - if (Calamares::Settings::instance()->disableCancel()) + if ( Calamares::Settings::instance()->disableCancel() ) + { m_quit->setVisible( false ); + } + + // onInstallationFailed( "Title of Failure", "Body of Failure"); // for testing paste functionality } @@ -156,7 +164,9 @@ ViewManager::addViewStep( ViewStep* step ) insertViewStep( m_steps.size(), step ); // If this is the first inserted view step, update status of "Next" button if ( m_steps.count() == 1 ) + { m_next->setEnabled( step->isNextEnabled() ); + } } @@ -166,18 +176,20 @@ ViewManager::insertViewStep( int before, ViewStep* step ) m_steps.insert( before, step ); QLayout* layout = step->widget()->layout(); if ( layout ) + { layout->setContentsMargins( 0, 0, 0, 0 ); + } m_stack->insertWidget( before, step->widget() ); connect( step, &ViewStep::enlarge, this, &ViewManager::enlarge ); - connect( step, &ViewStep::nextStatusChanged, - this, [this]( bool status ) - { + connect( step, &ViewStep::nextStatusChanged, this, [this]( bool status ) { ViewStep* vs = qobject_cast< ViewStep* >( sender() ); if ( vs ) { if ( vs == m_steps.at( m_currentStep ) ) + { m_next->setEnabled( status ); + } } } ); @@ -189,48 +201,86 @@ ViewManager::insertViewStep( int before, ViewStep* step ) void ViewManager::onInstallationFailed( const QString& message, const QString& details ) { + bool shouldOfferWebPaste = false; // TODO: config var + cError() << "Installation failed:"; cDebug() << "- message:" << message; cDebug() << "- details:" << details; - QString heading = Calamares::Settings::instance()->isSetupMode() - ? tr( "Setup Failed" ) - : tr( "Installation Failed" ); + QString heading + = Calamares::Settings::instance()->isSetupMode() ? tr( "Setup Failed" ) : tr( "Installation Failed" ); + QString pasteMsg = tr( "Would you like to paste the install log to the web?" ); + QString text = "

" + message + "

"; + if ( !details.isEmpty() ) + { + text += "

" + details + "

"; + } + if ( shouldOfferWebPaste ) + { + text += "

" + pasteMsg + "

"; + } + QMessageBox* msgBox = new QMessageBox(); msgBox->setIcon( QMessageBox::Critical ); msgBox->setWindowTitle( tr( "Error" ) ); msgBox->setText( "" + heading + "" ); - msgBox->setStandardButtons( QMessageBox::Close ); - msgBox->button( QMessageBox::Close )->setText( tr( "&Close" ) ); - - QString text = "

" + message + "

"; - if ( !details.isEmpty() ) - text += "

" + details + "

"; msgBox->setInformativeText( text ); - - connect( msgBox, &QMessageBox::buttonClicked, qApp, &QApplication::quit ); - cDebug() << "Calamares will quit when the dialog closes."; + if ( shouldOfferWebPaste ) + { + msgBox->setStandardButtons( QMessageBox::Yes | QMessageBox::No ); + msgBox->setDefaultButton( QMessageBox::No ); + msgBox->button( QMessageBox::Yes )->setText( tr( "&Yes" ) ); + msgBox->button( QMessageBox::No )->setText( tr( "&No" ) ); + } + else + { + msgBox->setStandardButtons( QMessageBox::Close ); + msgBox->setDefaultButton( QMessageBox::Close ); + msgBox->button( QMessageBox::Close )->setText( tr( "&Close" ) ); + } msgBox->show(); + + cDebug() << "Calamares will quit when the dialog closes."; + connect( msgBox, &QMessageBox::buttonClicked, [msgBox]( QAbstractButton* button ) { + if ( msgBox->buttonRole( button ) == QMessageBox::ButtonRole::YesRole ) + { + // TODO: host and port should be configurable + QString pasteUrlMsg = CalamaresUtils::sendLogToPastebin( msgBox, QStringLiteral( "termbin.com" ), 9999 ); + + QString pasteUrlTitle = tr( "Install Log Paste URL" ); + if ( pasteUrlMsg.isEmpty() ) + { + pasteUrlMsg = tr( "The upload was unsuccessful. No web-paste was done." ); + } + + // TODO: make the URL clickable, or copy it to the clipboard automatically + QMessageBox::critical( nullptr, pasteUrlTitle, pasteUrlMsg ); + } + QApplication::quit(); + } ); } void -ViewManager::onInitFailed( const QStringList& modules) +ViewManager::onInitFailed( const QStringList& modules ) { // Because this means the installer / setup program is broken by the distributor, // don't bother being precise about installer / setup wording. QString title( tr( "Calamares Initialization Failed" ) ); - QString description( tr( "%1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution." ) ); + QString description( tr( "%1 can not be installed. Calamares was unable to load all of the configured modules. " + "This is a problem with the way Calamares is being used by the distribution." ) ); QString detailString; if ( modules.count() > 0 ) { description.append( tr( "
The following modules could not be loaded:" ) ); QStringList details; - details << QLatin1Literal("
    "); - for( const auto& m : modules ) - details << QLatin1Literal("
  • ") << m << QLatin1Literal("
  • "); - details << QLatin1Literal("
"); + details << QLatin1Literal( "
    " ); + for ( const auto& m : modules ) + { + details << QLatin1Literal( "
  • " ) << m << QLatin1Literal( "
  • " ); + } + details << QLatin1Literal( "
" ); detailString = details.join( QString() ); } @@ -265,10 +315,8 @@ ViewManager::currentStepIndex() const static inline bool stepIsExecute( const ViewStepList& steps, int index ) { - return - ( 0 <= index ) && - ( index < steps.count() ) && - ( qobject_cast< ExecutionViewStep* >( steps.at( index ) ) != nullptr ); + return ( 0 <= index ) && ( index < steps.count() ) + && ( qobject_cast< ExecutionViewStep* >( steps.at( index ) ) != nullptr ); } void @@ -283,11 +331,10 @@ ViewManager::next() // Special case when the user clicks next on the very last page in a view phase // and right before switching to an execution phase. // Depending on Calamares::Settings, we show an "are you sure" prompt or not. - if ( settings->showPromptBeforeExecution() && stepIsExecute( m_steps, m_currentStep+1 ) ) + if ( settings->showPromptBeforeExecution() && stepIsExecute( m_steps, m_currentStep + 1 ) ) { - QString title = settings->isSetupMode() - ? tr( "Continue with setup?" ) - : tr( "Continue with installation?" ); + QString title + = settings->isSetupMode() ? tr( "Continue with setup?" ) : tr( "Continue with installation?" ); QString question = settings->isSetupMode() ? tr( "The %1 setup program is about to make changes to your " "disk in order to set up %2.
You will not be able " @@ -295,21 +342,21 @@ ViewManager::next() : tr( "The %1 installer is about to make changes to your " "disk in order to install %2.
You will not be able " "to undo these changes." ); - QString confirm = settings->isSetupMode() - ? tr( "&Set up now" ) - : tr( "&Install now" ); + QString confirm = settings->isSetupMode() ? tr( "&Set up now" ) : tr( "&Install now" ); - int reply = - QMessageBox::question( m_widget, - title, - question.arg( *Calamares::Branding::ShortProductName, *Calamares::Branding::ShortVersionedName ), - confirm, - tr( "Go &back" ), - QString(), - 0, - 1 ); + int reply = QMessageBox::question( + m_widget, + title, + question.arg( *Calamares::Branding::ShortProductName, *Calamares::Branding::ShortVersionedName ), + confirm, + tr( "Go &back" ), + QString(), + 0 /* default first button, i.e. confirm */, + 1 /* escape is second button, i.e. cancel */ ); if ( reply == 1 ) + { return; + } } m_currentStep++; @@ -330,7 +377,7 @@ ViewManager::next() m_next->setEnabled( false ); m_back->setEnabled( false ); } - updateCancelEnabled( !settings->disableCancel() && !(executing && settings->disableCancelDuringExec() ) ); + updateCancelEnabled( !settings->disableCancel() && !( executing && settings->disableCancelDuringExec() ) ); } else { @@ -351,9 +398,7 @@ ViewManager::updateButtonLabels() { const auto* const settings = Calamares::Settings::instance(); - QString nextIsInstallationStep = settings->isSetupMode() - ? tr( "&Set up" ) - : tr( "&Install" ); + QString nextIsInstallationStep = settings->isSetupMode() ? tr( "&Set up" ) : tr( "&Install" ); QString quitOnCompleteTooltip = settings->isSetupMode() ? tr( "Setup is complete. Close the setup program." ) : tr( "The installation is complete. Close the installer." ); @@ -362,7 +407,7 @@ ViewManager::updateButtonLabels() : tr( "Cancel installation without changing the system." ); // If we're going into the execution step / install phase, other message - if ( stepIsExecute( m_steps, m_currentStep+1 ) ) + if ( stepIsExecute( m_steps, m_currentStep + 1 ) ) { m_next->setText( nextIsInstallationStep ); setButtonIcon( m_next, "run-install" ); @@ -388,8 +433,11 @@ ViewManager::updateButtonLabels() else { if ( settings->disableCancel() ) + { m_quit->setVisible( false ); // In case we went back from final - updateCancelEnabled( !settings->disableCancel() && !( stepIsExecute( m_steps, m_currentStep ) && settings->disableCancelDuringExec() ) ); + } + updateCancelEnabled( !settings->disableCancel() + && !( stepIsExecute( m_steps, m_currentStep ) && settings->disableCancelDuringExec() ) ); m_quit->setText( tr( "&Cancel" ) ); m_quit->setToolTip( cancelBeforeInstallationTooltip ); @@ -410,46 +458,53 @@ ViewManager::back() emit currentStepChanged(); } else if ( !step->isAtBeginning() ) + { step->back(); - else return; + } + else + { + return; + } m_next->setEnabled( m_steps.at( m_currentStep )->isNextEnabled() ); m_back->setEnabled( m_steps.at( m_currentStep )->isBackEnabled() ); if ( m_currentStep == 0 && m_steps.first()->isAtBeginning() ) + { m_back->setEnabled( false ); + } updateButtonLabels(); } -bool ViewManager::confirmCancelInstallation() +bool +ViewManager::confirmCancelInstallation() { const auto* const settings = Calamares::Settings::instance(); // When we're at the very end, then it's always OK to exit. if ( isAtVeryEnd() ) + { return true; + } // Not at the very end, cancel/quit might be disabled if ( settings->disableCancel() ) + { return false; + } if ( settings->disableCancelDuringExec() && stepIsExecute( m_steps, m_currentStep ) ) + { return false; + } // Otherwise, confirm cancel/quit. - QString title = settings->isSetupMode() - ? tr( "Cancel setup?" ) - : tr( "Cancel installation?" ); - QString question = settings->isSetupMode() - ? tr( "Do you really want to cancel the current setup process?\n" - "The setup program will quit and all changes will be lost." ) - : tr( "Do you really want to cancel the current install process?\n" - "The installer will quit and all changes will be lost." ); - QMessageBox mb( QMessageBox::Question, - title, - question, - QMessageBox::Yes | QMessageBox::No, - m_widget ); + QString title = settings->isSetupMode() ? tr( "Cancel setup?" ) : tr( "Cancel installation?" ); + QString question = settings->isSetupMode() ? tr( "Do you really want to cancel the current setup process?\n" + "The setup program will quit and all changes will be lost." ) + : tr( "Do you really want to cancel the current install process?\n" + "The installer will quit and all changes will be lost." ); + QMessageBox mb( QMessageBox::Question, title, question, QMessageBox::Yes | QMessageBox::No, m_widget ); mb.setDefaultButton( QMessageBox::No ); mb.button( QMessageBox::Yes )->setText( tr( "&Yes" ) ); mb.button( QMessageBox::No )->setText( tr( "&No" ) ); @@ -464,4 +519,4 @@ ViewManager::updateCancelEnabled( bool enabled ) emit cancelEnabled( enabled ); } -} // namespace +} // namespace Calamares diff --git a/src/libcalamaresui/ViewManager.h b/src/libcalamaresui/ViewManager.h index c9f554ee8..fca74a367 100644 --- a/src/libcalamaresui/ViewManager.h +++ b/src/libcalamaresui/ViewManager.h @@ -133,7 +133,8 @@ private: bool isAtVeryEnd() const { - return ( m_currentStep >= m_steps.count() ) || ( m_currentStep == m_steps.count() - 1 && m_steps.last()->isAtEnd() ); + return ( m_currentStep >= m_steps.count() ) + || ( m_currentStep == m_steps.count() - 1 && m_steps.last()->isAtEnd() ); } static ViewManager* s_instance; @@ -148,6 +149,6 @@ private: QPushButton* m_quit; }; -} +} // namespace Calamares -#endif // VIEWMANAGER_H +#endif // VIEWMANAGER_H diff --git a/src/libcalamaresui/libcalamaresui.qrc b/src/libcalamaresui/libcalamaresui.qrc index 79ae4e45f..eeb3fc490 100644 --- a/src/libcalamaresui/libcalamaresui.qrc +++ b/src/libcalamaresui/libcalamaresui.qrc @@ -7,6 +7,7 @@ ../../data/images/bugs.svg ../../data/images/help.svg ../../data/images/release.svg + ../../data/images/help-donate.svg ../../data/images/partition-disk.svg ../../data/images/partition-partition.svg ../../data/images/partition-alongside.svg diff --git a/src/libcalamaresui/modulesystem/CppJobModule.cpp b/src/libcalamaresui/modulesystem/CppJobModule.cpp index 17c191024..c6571dbf6 100644 --- a/src/libcalamaresui/modulesystem/CppJobModule.cpp +++ b/src/libcalamaresui/modulesystem/CppJobModule.cpp @@ -49,7 +49,7 @@ CppJobModule::loadSelf() { if ( m_loader ) { - PluginFactory* pf = qobject_cast< PluginFactory* >( m_loader->instance() ); + CalamaresPluginFactory* pf = qobject_cast< CalamaresPluginFactory* >( m_loader->instance() ); if ( !pf ) { cDebug() << Q_FUNC_INFO << m_loader->errorString(); diff --git a/src/libcalamaresui/modulesystem/Module.h b/src/libcalamaresui/modulesystem/Module.h index ae3b31e6d..e4101b767 100644 --- a/src/libcalamaresui/modulesystem/Module.h +++ b/src/libcalamaresui/modulesystem/Module.h @@ -28,13 +28,6 @@ #include -namespace Calamares -{ -class Module; -} - -void operator>>( const QVariantMap& moduleDescriptor, Calamares::Module* m ); - namespace Calamares { @@ -193,8 +186,6 @@ private: QString m_name; QString m_directory; QString m_instanceId; - - friend void ::operator>>( const QVariantMap& moduleDescriptor, Calamares::Module* m ); }; } // namespace Calamares diff --git a/src/libcalamaresui/modulesystem/ProcessJobModule.cpp b/src/libcalamaresui/modulesystem/ProcessJobModule.cpp index f15e5c457..fc4b5f254 100644 --- a/src/libcalamaresui/modulesystem/ProcessJobModule.cpp +++ b/src/libcalamaresui/modulesystem/ProcessJobModule.cpp @@ -72,10 +72,15 @@ ProcessJobModule::initFrom( const QVariantMap& moduleDescriptor ) m_command = moduleDescriptor.value( "command" ).toString(); } - m_secondsTimeout = 30; + m_secondsTimeout = std::chrono::seconds( 30 ); if ( moduleDescriptor.contains( "timeout" ) && !moduleDescriptor.value( "timeout" ).isNull() ) { - m_secondsTimeout = moduleDescriptor.value( "timeout" ).toInt(); + int sec = moduleDescriptor.value( "timeout" ).toInt(); + if ( sec < 0 ) + { + sec = 0; + } + m_secondsTimeout = std::chrono::seconds( sec ); } m_runInChroot = false; @@ -88,7 +93,7 @@ ProcessJobModule::initFrom( const QVariantMap& moduleDescriptor ) ProcessJobModule::ProcessJobModule() : Module() - , m_secondsTimeout( 30 ) + , m_secondsTimeout( std::chrono::seconds( 30 ) ) , m_runInChroot( false ) { } diff --git a/src/libcalamaresui/modulesystem/ProcessJobModule.h b/src/libcalamaresui/modulesystem/ProcessJobModule.h index 9c20aa4f4..96fb2ed47 100644 --- a/src/libcalamaresui/modulesystem/ProcessJobModule.h +++ b/src/libcalamaresui/modulesystem/ProcessJobModule.h @@ -24,6 +24,8 @@ #include "UiDllMacro.h" +#include + namespace Calamares { @@ -46,7 +48,7 @@ private: QString m_command; QString m_workingPath; - int m_secondsTimeout; + std::chrono::seconds m_secondsTimeout; bool m_runInChroot; job_ptr m_job; }; diff --git a/src/libcalamaresui/modulesystem/RequirementsChecker.cpp b/src/libcalamaresui/modulesystem/RequirementsChecker.cpp index 916463ae4..41281c9b9 100644 --- a/src/libcalamaresui/modulesystem/RequirementsChecker.cpp +++ b/src/libcalamaresui/modulesystem/RequirementsChecker.cpp @@ -151,8 +151,7 @@ RequirementsChecker::reportProgress() m_progressTimeouts++; QStringList remainingNames; - auto remaining = std::count_if( m_watchers.cbegin(), m_watchers.cend(), - [&]( const Watcher* w ) { + auto remaining = std::count_if( m_watchers.cbegin(), m_watchers.cend(), [&]( const Watcher* w ) { if ( w && !w->isFinished() ) { remainingNames << w->objectName(); diff --git a/src/libcalamaresui/modulesystem/ViewModule.cpp b/src/libcalamaresui/modulesystem/ViewModule.cpp index 5cd2fe7d9..7506e5348 100644 --- a/src/libcalamaresui/modulesystem/ViewModule.cpp +++ b/src/libcalamaresui/modulesystem/ViewModule.cpp @@ -50,7 +50,7 @@ ViewModule::loadSelf() { if ( m_loader ) { - PluginFactory* pf = qobject_cast< PluginFactory* >( m_loader->instance() ); + CalamaresPluginFactory* pf = qobject_cast< CalamaresPluginFactory* >( m_loader->instance() ); if ( !pf ) { cWarning() << Q_FUNC_INFO << "No factory:" << m_loader->errorString(); diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp index 808c805cb..bd15d7a68 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.cpp +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.cpp @@ -34,11 +34,10 @@ namespace CalamaresUtils { -static int s_defaultFontSize = 0; +static int s_defaultFontSize = 0; static int s_defaultFontHeight = 0; - QPixmap defaultPixmap( ImageType type, ImageMode mode, const QSize& size ) { @@ -75,6 +74,10 @@ defaultPixmap( ImageType type, ImageMode mode, const QSize& size ) pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/release.svg", size ); break; + case Donate: + pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/donate.svg", size ); + break; + case PartitionDisk: pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/partition-disk.svg", size ); break; @@ -152,11 +155,15 @@ createRoundedImage( const QPixmap& pixmap, const QSize& size, float frameWidthPc } if ( !height || !width ) + { return QPixmap(); + } QPixmap scaledAvatar = pixmap.scaled( width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); if ( frameWidthPct == 0.00f ) + { return scaledAvatar; + } QPixmap frame( width, height ); frame.fill( Qt::transparent ); @@ -172,7 +179,8 @@ createRoundedImage( const QPixmap& pixmap, const QSize& size, float frameWidthPc painter.setBrush( brush ); painter.setPen( pen ); - painter.drawRoundedRect( outerRect, qreal( frameWidthPct ) * 100.0, qreal( frameWidthPct ) * 100.0, Qt::RelativeSize ); + painter.drawRoundedRect( + outerRect, qreal( frameWidthPct ) * 100.0, qreal( frameWidthPct ) * 100.0, Qt::RelativeSize ); return frame; } @@ -189,7 +197,9 @@ unmarginLayout( QLayout* layout ) { QLayout* childLayout = layout->itemAt( i )->layout(); if ( childLayout ) + { unmarginLayout( childLayout ); + } } } @@ -255,13 +265,17 @@ clearLayout( QLayout* layout ) while ( QLayoutItem* item = layout->takeAt( 0 ) ) { if ( QWidget* widget = item->widget() ) + { widget->deleteLater(); + } if ( QLayout* childLayout = item->layout() ) + { clearLayout( childLayout ); + } delete item; } } -} // namespace +} // namespace CalamaresUtils diff --git a/src/libcalamaresui/utils/CalamaresUtilsGui.h b/src/libcalamaresui/utils/CalamaresUtilsGui.h index 72430a083..0c10dcc30 100644 --- a/src/libcalamaresui/utils/CalamaresUtilsGui.h +++ b/src/libcalamaresui/utils/CalamaresUtilsGui.h @@ -47,6 +47,7 @@ enum ImageType : int Bugs, Help, Release, + Donate, PartitionDisk, PartitionPartition, PartitionAlongside, @@ -56,7 +57,7 @@ enum ImageType : int PartitionTable, BootEnvironment, Squid, - StatusOk, // Icons for the requirements checker + StatusOk, // Icons for the requirements checker StatusWarning, StatusError }; @@ -94,9 +95,7 @@ UIDLLEXPORT QPixmap defaultPixmap( ImageType type, * @return the transformed pixmap. * This one is currently unused. */ -UIDLLEXPORT QPixmap createRoundedImage( const QPixmap& avatar, - const QSize& size, - float frameWidthPct = 0.20f ); +UIDLLEXPORT QPixmap createRoundedImage( const QPixmap& avatar, const QSize& size, float frameWidthPct = 0.20f ); /** * @brief unmarginLayout recursively walks the QLayout tree and removes all margins. @@ -112,8 +111,8 @@ UIDLLEXPORT void unmarginLayout( QLayout* layout ); UIDLLEXPORT void clearLayout( QLayout* layout ); UIDLLEXPORT void setDefaultFontSize( int points ); -UIDLLEXPORT int defaultFontSize(); // in points -UIDLLEXPORT int defaultFontHeight(); // in pixels, DPI-specific +UIDLLEXPORT int defaultFontSize(); // in points +UIDLLEXPORT int defaultFontHeight(); // in pixels, DPI-specific UIDLLEXPORT QFont defaultFont(); UIDLLEXPORT QFont largeFont(); UIDLLEXPORT QSize defaultIconSize(); @@ -128,4 +127,4 @@ constexpr int windowPreferredHeight = 520; } // namespace CalamaresUtils -#endif // CALAMARESUTILSGUI_H +#endif // CALAMARESUTILSGUI_H diff --git a/src/libcalamaresui/utils/ImageRegistry.cpp b/src/libcalamaresui/utils/ImageRegistry.cpp index 96ea92bbb..1c3b9433e 100644 --- a/src/libcalamaresui/utils/ImageRegistry.cpp +++ b/src/libcalamaresui/utils/ImageRegistry.cpp @@ -2,6 +2,8 @@ * * SPDX-License-Identifier: GPLv3+ * License-Filename: LICENSES/GPLv3+-ImageRegistry + * + * Copyright 2019, Adriaan de Groot */ /* @@ -23,25 +25,22 @@ #include "ImageRegistry.h" -#include #include +#include #include static QHash< QString, QHash< int, QHash< qint64, QPixmap > > > s_cache; -ImageRegistry* ImageRegistry::s_instance = 0; ImageRegistry* ImageRegistry::instance() { + static ImageRegistry* s_instance = new ImageRegistry(); return s_instance; } -ImageRegistry::ImageRegistry() -{ - s_instance = this; -} +ImageRegistry::ImageRegistry() {} QIcon @@ -52,16 +51,20 @@ ImageRegistry::icon( const QString& image, CalamaresUtils::ImageMode mode ) qint64 -ImageRegistry::cacheKey( const QSize& size, float opacity, QColor tint ) +ImageRegistry::cacheKey( const QSize& size, qreal opacity, QColor tint ) { - return size.width() * 100 + size.height() * 10 + ( opacity * 100.0 ) + tint.value(); + return size.width() * 100 + size.height() * 10 + static_cast< qint64 >( opacity * 100.0 ) + tint.value(); } QPixmap -ImageRegistry::pixmap( const QString& image, const QSize& size, CalamaresUtils::ImageMode mode, float opacity, QColor tint ) +ImageRegistry::pixmap( const QString& image, + const QSize& size, + CalamaresUtils::ImageMode mode, + qreal opacity, + QColor tint ) { - Q_ASSERT( !(size.width() < 0 || size.height() < 0) ); + Q_ASSERT( !( size.width() < 0 || size.height() < 0 ) ); if ( size.width() < 0 || size.height() < 0 ) { return QPixmap(); @@ -110,23 +113,20 @@ ImageRegistry::pixmap( const QString& image, const QSize& size, CalamaresUtils:: resultImage.setAlphaChannel( p.toImage().alphaChannel() ); p = QPixmap::fromImage( resultImage ); - } + } pixmap = p; } else + { pixmap = QPixmap( image ); + } if ( !pixmap.isNull() ) { - switch ( mode ) + if ( mode == CalamaresUtils::RoundedCorners ) { - case CalamaresUtils::RoundedCorners: - pixmap = CalamaresUtils::createRoundedImage( pixmap, size ); - break; - - default: - break; + pixmap = CalamaresUtils::createRoundedImage( pixmap, size ); } if ( !size.isNull() && pixmap.size() != size ) @@ -140,7 +140,9 @@ ImageRegistry::pixmap( const QString& image, const QSize& size, CalamaresUtils:: pixmap = pixmap.scaledToWidth( size.width(), Qt::SmoothTransformation ); } else + { pixmap = pixmap.scaled( size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); + } } putInCache( image, size, mode, opacity, pixmap, tint ); @@ -151,7 +153,12 @@ ImageRegistry::pixmap( const QString& image, const QSize& size, CalamaresUtils:: void -ImageRegistry::putInCache( const QString& image, const QSize& size, CalamaresUtils::ImageMode mode, float opacity, const QPixmap& pixmap, QColor tint ) +ImageRegistry::putInCache( const QString& image, + const QSize& size, + CalamaresUtils::ImageMode mode, + qreal opacity, + const QPixmap& pixmap, + QColor tint ) { QHash< qint64, QPixmap > subsubcache; QHash< int, QHash< qint64, QPixmap > > subcache; diff --git a/src/libcalamaresui/utils/ImageRegistry.h b/src/libcalamaresui/utils/ImageRegistry.h index e35eaf74a..454cb500d 100644 --- a/src/libcalamaresui/utils/ImageRegistry.h +++ b/src/libcalamaresui/utils/ImageRegistry.h @@ -2,6 +2,8 @@ * * SPDX-License-Identifier: GPLv3+ * License-Filename: LICENSES/GPLv3+-ImageRegistry + * + * Copyright 2019, Adriaan de Groot */ /* @@ -26,8 +28,8 @@ #include -#include "utils/CalamaresUtilsGui.h" #include "UiDllMacro.h" +#include "utils/CalamaresUtilsGui.h" class UIDLLEXPORT ImageRegistry { @@ -37,13 +39,20 @@ public: explicit ImageRegistry(); QIcon icon( const QString& image, CalamaresUtils::ImageMode mode = CalamaresUtils::Original ); - QPixmap pixmap( const QString& image, const QSize& size, CalamaresUtils::ImageMode mode = CalamaresUtils::Original, float opacity = 1.0, QColor tint = QColor( 0, 0, 0, 0 ) ); + QPixmap pixmap( const QString& image, + const QSize& size, + CalamaresUtils::ImageMode mode = CalamaresUtils::Original, + qreal opacity = 1.0, + QColor tint = QColor( 0, 0, 0, 0 ) ); private: - qint64 cacheKey( const QSize& size, float opacity, QColor tint ); - void putInCache( const QString& image, const QSize& size, CalamaresUtils::ImageMode mode, float opacity, const QPixmap& pixmap, QColor tint ); - - static ImageRegistry* s_instance; + qint64 cacheKey( const QSize& size, qreal opacity, QColor tint ); + void putInCache( const QString& image, + const QSize& size, + CalamaresUtils::ImageMode mode, + qreal opacity, + const QPixmap& pixmap, + QColor tint ); }; -#endif // IMAGE_REGISTRY_H +#endif // IMAGE_REGISTRY_H diff --git a/src/libcalamaresui/utils/Paste.cpp b/src/libcalamaresui/utils/Paste.cpp new file mode 100644 index 000000000..1b9ad4dfe --- /dev/null +++ b/src/libcalamaresui/utils/Paste.cpp @@ -0,0 +1,99 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Bill Auger + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "Paste.h" + +#include "utils/Logger.h" + +#include +#include +#include +#include + +namespace CalamaresUtils +{ + +QString +sendLogToPastebin( QObject* parent, const QString& ficheHost, quint16 fichePort ) +{ + QString pasteUrlFmt = parent->tr( "Install log posted to:\n%1" ); + QFile pasteSourceFile( Logger::logFile() ); + if ( !pasteSourceFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) + { + cError() << "Could not open log file"; + return QString(); + } + + QByteArray pasteData; + while ( !pasteSourceFile.atEnd() ) + { + pasteData += pasteSourceFile.readLine(); + } + + QTcpSocket* socket = new QTcpSocket( parent ); + socket->connectToHost( ficheHost, fichePort ); + + if ( !socket->waitForConnected() ) + { + cError() << "Could not connect to paste server"; + socket->close(); + return QString(); + } + + cDebug() << "Connected to paste server"; + + socket->write( pasteData ); + + if ( !socket->waitForBytesWritten() ) + { + cError() << "Could not write to paste server"; + socket->close(); + return QString(); + } + + cDebug() << "Paste data written to paste server"; + + if ( !socket->waitForReadyRead() ) + { + cError() << "No data from paste server"; + socket->close(); + return QString(); + } + + cDebug() << "Reading response from paste server"; + + char resp[ 1024 ]; + resp[ 0 ] = '\0'; + qint64 nBytesRead = socket->readLine( resp, 1024 ); + socket->close(); + + QUrl pasteUrl = QUrl( QString( resp ).trimmed(), QUrl::StrictMode ); + QString pasteUrlStr = pasteUrl.toString(); + QRegularExpression pasteUrlRegex( "^http[s]?://" + ficheHost ); + QString pasteUrlMsg = QString( pasteUrlFmt ).arg( pasteUrlStr ); + + if ( nBytesRead < 8 || !pasteUrl.isValid() || !pasteUrlRegex.match( pasteUrlStr ).hasMatch() ) + { + cError() << "No data from paste server"; + return QString(); + } + + cDebug() << "Paste server results:" << pasteUrlMsg; + return pasteUrlMsg; +} +} // namespace CalamaresUtils diff --git a/src/libcalamaresui/utils/Paste.h b/src/libcalamaresui/utils/Paste.h new file mode 100644 index 000000000..fd088882c --- /dev/null +++ b/src/libcalamaresui/utils/Paste.h @@ -0,0 +1,38 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Bill Auger + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef UTILS_PASTE_H +#define UTILS_PASTE_H + +#include // for quint16 + +class QObject; +class QString; + +namespace CalamaresUtils +{ + +/** @brief Send the current log file to a pastebin + * + * Returns the (string) URL that the pastebin gives us. + */ +QString sendLogToPastebin( QObject* parent, const QString& ficheHost, quint16 fichePort ); + +} // namespace CalamaresUtils + +#endif diff --git a/src/libcalamaresui/utils/PythonQtUtils.cpp b/src/libcalamaresui/utils/PythonQtUtils.cpp index 201fe6635..3a60839a4 100644 --- a/src/libcalamaresui/utils/PythonQtUtils.cpp +++ b/src/libcalamaresui/utils/PythonQtUtils.cpp @@ -34,11 +34,13 @@ lookupAndCall( PyObject* object, { PythonQtObjectPtr callable = PythonQt::self()->lookupCallable( object, name ); if ( callable ) + { return callable.call( args, kwargs ); + } } // If we haven't found a callable with the given names, we force an error: return PythonQt::self()->call( object, candidateNames.first(), args, kwargs ); } -} +} // namespace CalamaresUtils diff --git a/src/libcalamaresui/utils/PythonQtUtils.h b/src/libcalamaresui/utils/PythonQtUtils.h index 22a248cea..dc889b2d0 100644 --- a/src/libcalamaresui/utils/PythonQtUtils.h +++ b/src/libcalamaresui/utils/PythonQtUtils.h @@ -33,6 +33,6 @@ QVariant lookupAndCall( PyObject* object, const QVariantList& args = QVariantList(), const QVariantMap& kwargs = QVariantMap() ); -} //ns +} // namespace CalamaresUtils -#endif // PYTHONQTUTILS_H +#endif // PYTHONQTUTILS_H diff --git a/src/libcalamaresui/utils/qjsonitem.cpp b/src/libcalamaresui/utils/qjsonitem.cpp deleted file mode 100644 index cdc4b3b13..000000000 --- a/src/libcalamaresui/utils/qjsonitem.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* === This file is part of Calamares - === - * - * SPDX-License-Identifier: GPL-3.0+ - * License-Filename: LICENSES/GPLv3+-QJsonModel - */ - -/*********************************************** - Copyright (C) 2014 Schutz Sacha - This file is part of QJsonModel (https://github.com/dridk/QJsonmodel). - - QJsonModel is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - QJsonModel is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with QJsonModel. If not, see . - -**********************************************/ - -#include "qjsonitem.h" - -QJsonTreeItem::QJsonTreeItem(QJsonTreeItem *parent) - : mParent( parent ) - , mType( QJsonValue::Type::Null ) -{ -} - -QJsonTreeItem::~QJsonTreeItem() -{ - qDeleteAll(mChilds); - -} - -void QJsonTreeItem::appendChild(QJsonTreeItem *item) -{ - mChilds.append(item); -} - -QJsonTreeItem *QJsonTreeItem::child(int row) -{ - return mChilds.value(row); -} - -QJsonTreeItem *QJsonTreeItem::parent() -{ - return mParent; -} - -int QJsonTreeItem::childCount() const -{ - return mChilds.count(); -} - -int QJsonTreeItem::row() const -{ - if (mParent) - return mParent->mChilds.indexOf(const_cast(this)); - - return 0; -} - -void QJsonTreeItem::setKey(const QString &key) -{ - mKey = key; -} - -void QJsonTreeItem::setValue(const QString &value) -{ - mValue = value; -} - -void QJsonTreeItem::setType(const QJsonValue::Type &type) -{ - mType = type; -} - -QString QJsonTreeItem::key() const -{ - return mKey; -} - -QString QJsonTreeItem::value() const -{ - return mValue; -} - -QJsonValue::Type QJsonTreeItem::type() const -{ - return mType; -} - -QJsonTreeItem* QJsonTreeItem::load(const QJsonValue& value, QJsonTreeItem* parent) -{ - - - QJsonTreeItem * rootItem = new QJsonTreeItem(parent); - rootItem->setKey("root"); - - if ( value.isObject()) - { - - //Get all QJsonValue childs - foreach (QString key , value.toObject().keys()){ - QJsonValue v = value.toObject().value(key); - QJsonTreeItem * child = load(v,rootItem); - child->setKey(key); - child->setType(v.type()); - rootItem->appendChild(child); - - } - - } - - else if ( value.isArray()) - { - //Get all QJsonValue childs - int index = 0; - foreach (QJsonValue v , value.toArray()){ - - QJsonTreeItem * child = load(v,rootItem); - child->setKey(QString::number(index)); - child->setType(v.type()); - rootItem->appendChild(child); - ++index; - } - } - else - { - rootItem->setValue(value.toVariant().toString()); - rootItem->setType(value.type()); - } - - return rootItem; -} - diff --git a/src/libcalamaresui/utils/qjsonitem.h b/src/libcalamaresui/utils/qjsonitem.h deleted file mode 100644 index 113c9da97..000000000 --- a/src/libcalamaresui/utils/qjsonitem.h +++ /dev/null @@ -1,47 +0,0 @@ -/* === This file is part of Calamares - === - * - * SPDX-License-Identifier: GPL-3.0+ - * License-Filename: LICENSES/GPLv3+-QJsonModel - */ - -#ifndef JSONITEM_H -#define JSONITEM_H -#include -#include -#include -#include -class QJsonTreeItem -{ -public: - QJsonTreeItem(QJsonTreeItem * parent = nullptr); - ~QJsonTreeItem(); - void appendChild(QJsonTreeItem * item); - QJsonTreeItem *child(int row); - QJsonTreeItem *parent(); - int childCount() const; - int row() const; - void setKey(const QString& key); - void setValue(const QString& value); - void setType(const QJsonValue::Type& type); - QString key() const; - QString value() const; - QJsonValue::Type type() const; - - - static QJsonTreeItem* load(const QJsonValue& value, QJsonTreeItem * parent = nullptr); - -protected: - - -private: - QString mKey; - QString mValue; - QJsonValue::Type mType; - - QList mChilds; - QJsonTreeItem * mParent; - - -}; - -#endif // JSONITEM_H diff --git a/src/libcalamaresui/utils/qjsonmodel.cpp b/src/libcalamaresui/utils/qjsonmodel.cpp deleted file mode 100644 index 4238bfd6b..000000000 --- a/src/libcalamaresui/utils/qjsonmodel.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/* === This file is part of Calamares - === - * - * SPDX-License-Identifier: GPL-3.0+ - * License-Filename: LICENSES/GPLv3+-QJsonModel - */ - -/*********************************************** - Copyright (C) 2014 Schutz Sacha - This file is part of QJsonModel (https://github.com/dridk/QJsonmodel). - - QJsonModel is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - QJsonModel is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with QJsonModel. If not, see . - -**********************************************/ - -#include "qjsonmodel.h" -#include -#include -#include -#include -#include -#include - -QJsonModel::QJsonModel(QObject *parent) : - QAbstractItemModel(parent) - , mRootItem( new QJsonTreeItem ) -{ - mHeaders.append("key"); - mHeaders.append("value"); - - -} - -QJsonModel::~QJsonModel() -{ - delete mRootItem; -} - -bool QJsonModel::load(const QString &fileName) -{ - QFile file(fileName); - bool success = false; - if (file.open(QIODevice::ReadOnly)) { - success = load(&file); - file.close(); - } - else success = false; - - return success; -} - -bool QJsonModel::load(QIODevice *device) -{ - return loadJson(device->readAll()); -} - -bool QJsonModel::loadJson(const QByteArray &json) -{ - mDocument = QJsonDocument::fromJson(json); - - if (!mDocument.isNull()) - { - beginResetModel(); - delete mRootItem; - if (mDocument.isArray()) { - mRootItem = QJsonTreeItem::load(QJsonValue(mDocument.array())); - } else { - mRootItem = QJsonTreeItem::load(QJsonValue(mDocument.object())); - } - endResetModel(); - return true; - } - return false; -} - - -QVariant QJsonModel::data(const QModelIndex &index, int role) const -{ - - if (!index.isValid()) - return QVariant(); - - - QJsonTreeItem *item = static_cast(index.internalPointer()); - - - if ((role == Qt::DecorationRole) && (index.column() == 0)){ - - return mTypeIcons.value(item->type()); - } - - - if (role == Qt::DisplayRole) { - - if (index.column() == 0) - return QString("%1").arg(item->key()); - - if (index.column() == 1) - return QString("%1").arg(item->value()); - } - - - - return QVariant(); - -} - -QVariant QJsonModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - if (role != Qt::DisplayRole) - return QVariant(); - - if (orientation == Qt::Horizontal) { - - return mHeaders.value(section); - } - else - return QVariant(); -} - -QModelIndex QJsonModel::index(int row, int column, const QModelIndex &parent) const -{ - if (!hasIndex(row, column, parent)) - return QModelIndex(); - - QJsonTreeItem *parentItem; - - if (!parent.isValid()) - parentItem = mRootItem; - else - parentItem = static_cast(parent.internalPointer()); - - QJsonTreeItem *childItem = parentItem->child(row); - if (childItem) - return createIndex(row, column, childItem); - else - return QModelIndex(); -} - -QModelIndex QJsonModel::parent(const QModelIndex &index) const -{ - if (!index.isValid()) - return QModelIndex(); - - QJsonTreeItem *childItem = static_cast(index.internalPointer()); - QJsonTreeItem *parentItem = childItem->parent(); - - if (parentItem == mRootItem) - return QModelIndex(); - - return createIndex(parentItem->row(), 0, parentItem); -} - -int QJsonModel::rowCount(const QModelIndex &parent) const -{ - QJsonTreeItem *parentItem; - if (parent.column() > 0) - return 0; - - if (!parent.isValid()) - parentItem = mRootItem; - else - parentItem = static_cast(parent.internalPointer()); - - return parentItem->childCount(); -} - -int QJsonModel::columnCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent) - return 2; -} - -void QJsonModel::setIcon(const QJsonValue::Type &type, const QIcon &icon) -{ - mTypeIcons.insert(type,icon); -} diff --git a/src/libcalamaresui/utils/qjsonmodel.h b/src/libcalamaresui/utils/qjsonmodel.h deleted file mode 100644 index fc2c4abe1..000000000 --- a/src/libcalamaresui/utils/qjsonmodel.h +++ /dev/null @@ -1,43 +0,0 @@ -/* === This file is part of Calamares - === - * - * SPDX-License-Identifier: GPL-3.0+ - * License-Filename: LICENSES/GPLv3+-QJsonModel - */ - -#ifndef QJSONMODEL_H -#define QJSONMODEL_H - -#include -#include "qjsonitem.h" -#include -#include -#include -class QJsonModel : public QAbstractItemModel -{ - Q_OBJECT -public: - explicit QJsonModel(QObject *parent = nullptr); - ~QJsonModel(); - bool load(const QString& fileName); - bool load(QIODevice * device); - bool loadJson(const QByteArray& json); - QVariant data(const QModelIndex &index, int role) const; - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - QModelIndex index(int row, int column,const QModelIndex &parent = QModelIndex()) const; - QModelIndex parent(const QModelIndex &index) const; - int rowCount(const QModelIndex &parent = QModelIndex()) const; - int columnCount(const QModelIndex &parent = QModelIndex()) const; - void setIcon(const QJsonValue::Type& type, const QIcon& icon); - - - -private: - QJsonTreeItem * mRootItem; - QJsonDocument mDocument; - QStringList mHeaders; - QHash mTypeIcons; - - -}; - -#endif // QJSONMODEL_H diff --git a/src/libcalamaresui/viewpages/BlankViewStep.cpp b/src/libcalamaresui/viewpages/BlankViewStep.cpp index 243305c1f..af10c7a99 100644 --- a/src/libcalamaresui/viewpages/BlankViewStep.cpp +++ b/src/libcalamaresui/viewpages/BlankViewStep.cpp @@ -26,7 +26,10 @@ namespace Calamares { -BlankViewStep::BlankViewStep( const QString& title, const QString& description, const QString& details, QObject* parent) +BlankViewStep::BlankViewStep( const QString& title, + const QString& description, + const QString& details, + QObject* parent ) : Calamares::ViewStep( parent ) , m_widget( new QWidget() ) { @@ -54,14 +57,12 @@ BlankViewStep::BlankViewStep( const QString& title, const QString& description, layout->addWidget( label ); } - layout->addStretch( 1 ); // Push the rest to the top + layout->addStretch( 1 ); // Push the rest to the top m_widget->setLayout( layout ); } -BlankViewStep::~BlankViewStep() -{ -} +BlankViewStep::~BlankViewStep() {} QString BlankViewStep::prettyName() const @@ -115,4 +116,4 @@ BlankViewStep::jobs() const return JobList(); } -} // namespace +} // namespace Calamares diff --git a/src/libcalamaresui/viewpages/BlankViewStep.h b/src/libcalamaresui/viewpages/BlankViewStep.h index a3f46d1d5..17d323c85 100644 --- a/src/libcalamaresui/viewpages/BlankViewStep.h +++ b/src/libcalamaresui/viewpages/BlankViewStep.h @@ -39,7 +39,10 @@ class BlankViewStep : public Calamares::ViewStep Q_OBJECT public: - explicit BlankViewStep( const QString& title, const QString& description, const QString& details = QString(), QObject* parent = nullptr ); + explicit BlankViewStep( const QString& title, + const QString& description, + const QString& details = QString(), + QObject* parent = nullptr ); virtual ~BlankViewStep() override; QString prettyName() const override; @@ -61,5 +64,5 @@ private: QWidget* m_widget; }; -} // namespace +} // namespace Calamares #endif // BLANKVIEWSTEP_H diff --git a/src/libcalamaresui/viewpages/PythonQtGlobalStorageWrapper.cpp b/src/libcalamaresui/viewpages/PythonQtGlobalStorageWrapper.cpp index 4eae8cf98..ba7657b09 100644 --- a/src/libcalamaresui/viewpages/PythonQtGlobalStorageWrapper.cpp +++ b/src/libcalamaresui/viewpages/PythonQtGlobalStorageWrapper.cpp @@ -24,7 +24,8 @@ GlobalStorage::GlobalStorage( Calamares::GlobalStorage* gs ) : QObject( gs ) , m_gs( gs ) -{} +{ +} bool diff --git a/src/libcalamaresui/viewpages/PythonQtGlobalStorageWrapper.h b/src/libcalamaresui/viewpages/PythonQtGlobalStorageWrapper.h index 8a8b775fc..946f93e97 100644 --- a/src/libcalamaresui/viewpages/PythonQtGlobalStorageWrapper.h +++ b/src/libcalamaresui/viewpages/PythonQtGlobalStorageWrapper.h @@ -54,4 +54,4 @@ private: Calamares::GlobalStorage* m_gs; }; -#endif // PYTHONQTGLOBALSTORAGEWRAPPER_H +#endif // PYTHONQTGLOBALSTORAGEWRAPPER_H diff --git a/src/libcalamaresui/viewpages/PythonQtJob.cpp b/src/libcalamaresui/viewpages/PythonQtJob.cpp index 291cbd014..0718df95d 100644 --- a/src/libcalamaresui/viewpages/PythonQtJob.cpp +++ b/src/libcalamaresui/viewpages/PythonQtJob.cpp @@ -20,34 +20,26 @@ #include "utils/PythonQtUtils.h" -PythonQtJob::PythonQtJob( PythonQtObjectPtr cxt, - PythonQtObjectPtr pyJob, - QObject* parent ) +PythonQtJob::PythonQtJob( PythonQtObjectPtr cxt, PythonQtObjectPtr pyJob, QObject* parent ) : Calamares::Job( parent ) , m_cxt( cxt ) , m_pyJob( pyJob ) { - } QString PythonQtJob::prettyName() const { - return CalamaresUtils::lookupAndCall( m_pyJob, - { "prettyName", - "prettyname", - "pretty_name" } ).toString(); + return CalamaresUtils::lookupAndCall( m_pyJob, { "prettyName", "prettyname", "pretty_name" } ).toString(); } QString PythonQtJob::prettyDescription() const { - return CalamaresUtils::lookupAndCall( m_pyJob, - { "prettyDescription", - "prettydescription", - "pretty_description" } ).toString(); + return CalamaresUtils::lookupAndCall( m_pyJob, { "prettyDescription", "prettydescription", "pretty_description" } ) + .toString(); } @@ -55,9 +47,8 @@ QString PythonQtJob::prettyStatusMessage() const { return CalamaresUtils::lookupAndCall( m_pyJob, - { "prettyStatusMessage", - "prettystatusmessage", - "pretty_status_message" } ).toString(); + { "prettyStatusMessage", "prettystatusmessage", "pretty_status_message" } ) + .toString(); } @@ -66,12 +57,15 @@ PythonQtJob::exec() { QVariant response = m_pyJob.call( "exec" ); if ( response.isNull() ) + { return Calamares::JobResult::ok(); + } QVariantMap map = response.toMap(); if ( map.isEmpty() || map.value( "ok" ).toBool() ) + { return Calamares::JobResult::ok(); + } - return Calamares::JobResult::error( map.value( "message" ).toString(), - map.value( "details" ).toString() ); + return Calamares::JobResult::error( map.value( "message" ).toString(), map.value( "details" ).toString() ); } diff --git a/src/libcalamaresui/viewpages/PythonQtJob.h b/src/libcalamaresui/viewpages/PythonQtJob.h index 2b50c0ded..a73e7eb82 100644 --- a/src/libcalamaresui/viewpages/PythonQtJob.h +++ b/src/libcalamaresui/viewpages/PythonQtJob.h @@ -32,12 +32,11 @@ class PythonQtJobResult : public QObject, public Calamares::JobResult { Q_OBJECT public: - explicit PythonQtJobResult( bool ok, - const QString& message, - const QString& details ) + explicit PythonQtJobResult( bool ok, const QString& message, const QString& details ) : QObject( nullptr ) , Calamares::JobResult( message, details, ok ? 0 : Calamares::JobResult::GenericError ) - {} + { + } }; @@ -53,13 +52,11 @@ public: Calamares::JobResult exec() override; private: - explicit PythonQtJob( PythonQtObjectPtr cxt, - PythonQtObjectPtr pyJob, - QObject* parent = nullptr ); - friend class Calamares::PythonQtViewStep; // only this one can call the ctor + explicit PythonQtJob( PythonQtObjectPtr cxt, PythonQtObjectPtr pyJob, QObject* parent = nullptr ); + friend class Calamares::PythonQtViewStep; // only this one can call the ctor PythonQtObjectPtr m_cxt; PythonQtObjectPtr m_pyJob; }; -#endif // PYTHONQTJOB_H +#endif // PYTHONQTJOB_H diff --git a/src/libcalamaresui/viewpages/PythonQtUtilsWrapper.cpp b/src/libcalamaresui/viewpages/PythonQtUtilsWrapper.cpp index efb3da2a1..c13e063bd 100644 --- a/src/libcalamaresui/viewpages/PythonQtUtilsWrapper.cpp +++ b/src/libcalamaresui/viewpages/PythonQtUtilsWrapper.cpp @@ -25,7 +25,7 @@ #include -Utils::Utils(QObject* parent) +Utils::Utils( QObject* parent ) : QObject( parent ) , m_exceptionCxt( PythonQt::self()->createUniqueModule() ) { @@ -34,7 +34,7 @@ Utils::Utils(QObject* parent) void -Utils::debug(const QString& s) const +Utils::debug( const QString& s ) const { cDebug() << "PythonQt DBG>" << s; } @@ -46,35 +46,28 @@ Utils::mount( const QString& device_path, const QString& filesystem_name, const QString& options ) const { - return CalamaresUtils::System::instance()-> - mount( device_path, mount_point, filesystem_name, options ); + return CalamaresUtils::System::instance()->mount( device_path, mount_point, filesystem_name, options ); } int -Utils::target_env_call( const QString& command, - const QString& stdin, - int timeout ) const +Utils::target_env_call( const QString& command, const QString& stdin, int timeout ) const { - return CalamaresUtils::System::instance()-> - targetEnvCall( command, QString(), stdin, timeout ); + return CalamaresUtils::System::instance()->targetEnvCall( + command, QString(), stdin, std::chrono::seconds( timeout > 0 ? timeout : 0 ) ); } int -Utils::target_env_call( const QStringList& args, - const QString& stdin, - int timeout ) const +Utils::target_env_call( const QStringList& args, const QString& stdin, int timeout ) const { - return CalamaresUtils::System::instance()-> - targetEnvCall( args, QString(), stdin, timeout ); + return CalamaresUtils::System::instance()->targetEnvCall( + args, QString(), stdin, std::chrono::seconds( timeout > 0 ? timeout : 0 ) ); } int -Utils::check_target_env_call( const QString& command, - const QString& stdin, - int timeout ) const +Utils::check_target_env_call( const QString& command, const QString& stdin, int timeout ) const { int ec = target_env_call( command, stdin, timeout ); return _handle_check_target_env_call_error( ec, command ); @@ -82,9 +75,7 @@ Utils::check_target_env_call( const QString& command, int -Utils::check_target_env_call( const QStringList& args, - const QString& stdin, - int timeout) const +Utils::check_target_env_call( const QStringList& args, const QString& stdin, int timeout ) const { int ec = target_env_call( args, stdin, timeout ); return _handle_check_target_env_call_error( ec, args.join( ' ' ) ); @@ -92,34 +83,22 @@ Utils::check_target_env_call( const QStringList& args, QString -Utils::check_target_env_output( const QString& command, - const QString& stdin, - int timeout ) const +Utils::check_target_env_output( const QString& command, const QString& stdin, int timeout ) const { QString output; - int ec = CalamaresUtils::System::instance()-> - targetEnvOutput( command, - output, - QString(), - stdin, - timeout ); + int ec = CalamaresUtils::System::instance()->targetEnvOutput( + command, output, QString(), stdin, std::chrono::seconds( timeout > 0 ? timeout : 0 ) ); _handle_check_target_env_call_error( ec, command ); return output; } QString -Utils::check_target_env_output( const QStringList& args, - const QString& stdin, - int timeout ) const +Utils::check_target_env_output( const QStringList& args, const QString& stdin, int timeout ) const { QString output; - int ec = CalamaresUtils::System::instance()-> - targetEnvOutput( args, - output, - QString(), - stdin, - timeout ); + int ec = CalamaresUtils::System::instance()->targetEnvOutput( + args, output, QString(), stdin, std::chrono::seconds( timeout > 0 ? timeout : 0 ) ); _handle_check_target_env_call_error( ec, args.join( ' ' ) ); return output; } @@ -133,13 +112,11 @@ Utils::obscure( const QString& string ) const int -Utils::_handle_check_target_env_call_error( int ec, const QString& cmd) const +Utils::_handle_check_target_env_call_error( int ec, const QString& cmd ) const { if ( ec ) { - QString raise = QString( "raise subprocess.CalledProcessError(%1,\"%2\")" ) - .arg( ec ) - .arg( cmd ); + QString raise = QString( "raise subprocess.CalledProcessError(%1,\"%2\")" ).arg( ec ).arg( cmd ); PythonQt::self()->evalScript( m_exceptionCxt, raise ); } return ec; diff --git a/src/libcalamaresui/viewpages/PythonQtUtilsWrapper.h b/src/libcalamaresui/viewpages/PythonQtUtilsWrapper.h index ea6955337..19b8b623d 100644 --- a/src/libcalamaresui/viewpages/PythonQtUtilsWrapper.h +++ b/src/libcalamaresui/viewpages/PythonQtUtilsWrapper.h @@ -43,29 +43,17 @@ public slots: const QString& filesystem_name, const QString& options ) const; - int target_env_call( const QString& command, - const QString& stdin = QString(), - int timeout = 0 ) const; + int target_env_call( const QString& command, const QString& stdin = QString(), int timeout = 0 ) const; - int target_env_call( const QStringList& args, - const QString& stdin = QString(), - int timeout = 0 ) const; + int target_env_call( const QStringList& args, const QString& stdin = QString(), int timeout = 0 ) const; - int check_target_env_call( const QString& command, - const QString& stdin = QString(), - int timeout = 0 ) const; + int check_target_env_call( const QString& command, const QString& stdin = QString(), int timeout = 0 ) const; - int check_target_env_call( const QStringList& args, - const QString& stdin = QString(), - int timeout = 0 ) const; + int check_target_env_call( const QStringList& args, const QString& stdin = QString(), int timeout = 0 ) const; - QString check_target_env_output( const QString& command, - const QString& stdin = QString(), - int timeout = 0 ) const; + QString check_target_env_output( const QString& command, const QString& stdin = QString(), int timeout = 0 ) const; - QString check_target_env_output( const QStringList& args, - const QString& stdin = QString(), - int timeout = 0 ) const; + QString check_target_env_output( const QStringList& args, const QString& stdin = QString(), int timeout = 0 ) const; QString obscure( const QString& string ) const; @@ -75,4 +63,4 @@ private: PythonQtObjectPtr m_exceptionCxt; }; -#endif // PYTHONQTUTILSWRAPPER_H +#endif // PYTHONQTUTILSWRAPPER_H diff --git a/src/libcalamaresui/viewpages/PythonQtViewStep.cpp b/src/libcalamaresui/viewpages/PythonQtViewStep.cpp index 2d128d1af..5e313ff98 100644 --- a/src/libcalamaresui/viewpages/PythonQtViewStep.cpp +++ b/src/libcalamaresui/viewpages/PythonQtViewStep.cpp @@ -18,8 +18,8 @@ */ #include "PythonQtViewStep.h" -#include "utils/Logger.h" #include "utils/CalamaresUtilsGui.h" +#include "utils/Logger.h" #include "utils/PythonQtUtils.h" #include "utils/Retranslator.h" #include "viewpages/PythonQtJob.h" @@ -33,8 +33,7 @@ namespace Calamares { -PythonQtViewStep::PythonQtViewStep( PythonQtObjectPtr cxt, - QObject* parent ) +PythonQtViewStep::PythonQtViewStep( PythonQtObjectPtr cxt, QObject* parent ) : ViewStep( parent ) , m_widget( new QWidget() ) , m_cxt( cxt ) @@ -48,32 +47,26 @@ PythonQtViewStep::PythonQtViewStep( PythonQtObjectPtr cxt, // Instantiate an object of the class marked with @calamares_module and // store it as _calamares_module. - pq->evalScript( m_cxt, QString( "_calamares_module = %1()" ) - .arg( className ) ); + pq->evalScript( m_cxt, QString( "_calamares_module = %1()" ).arg( className ) ); m_obj = pq->lookupObject( m_cxt, "_calamares_module" ); - Q_ASSERT( !m_obj.isNull() ); // no entry point, no party + Q_ASSERT( !m_obj.isNull() ); // no entry point, no party // Prepare the base widget for the module's pages m_widget->setLayout( new QVBoxLayout ); CalamaresUtils::unmarginLayout( m_widget->layout() ); m_cxt.addObject( "_calamares_module_basewidget", m_widget ); - CALAMARES_RETRANSLATE_WIDGET( m_widget, - CalamaresUtils::lookupAndCall( m_obj, - { "retranslate" }, - { CalamaresUtils::translatorLocaleName() } ); - ) + CALAMARES_RETRANSLATE_WIDGET( + m_widget, + CalamaresUtils::lookupAndCall( m_obj, { "retranslate" }, { CalamaresUtils::translatorLocaleName() } ); ) } QString PythonQtViewStep::prettyName() const { - return CalamaresUtils::lookupAndCall( m_obj, - { "prettyName", - "prettyname", - "pretty_name" } ).toString(); + return CalamaresUtils::lookupAndCall( m_obj, { "prettyName", "prettyname", "pretty_name" } ).toString(); } @@ -82,12 +75,14 @@ PythonQtViewStep::widget() { if ( m_widget->layout()->count() > 1 ) cWarning() << "PythonQtViewStep wrapper widget has more than 1 child. " - "This should never happen."; + "This should never happen."; - bool nothingChanged = m_cxt.evalScript( - "_calamares_module.widget() in _calamares_module_basewidget.children()" ).toBool(); + bool nothingChanged + = m_cxt.evalScript( "_calamares_module.widget() in _calamares_module_basewidget.children()" ).toBool(); if ( nothingChanged ) + { return m_widget; + } // Else, we either don't have a child widget, or we have a child widget that // was previously set and doesn't apply any more since the Python module @@ -97,10 +92,11 @@ PythonQtViewStep::widget() // We only remove from the layout and not delete because Python is in charge // of memory management for these widgets. while ( m_widget->layout()->itemAt( 0 ) ) + { m_widget->layout()->takeAt( 0 ); + } - m_cxt.evalScript( - "_calamares_module_basewidget.layout().addWidget(_calamares_module.widget())" ); + m_cxt.evalScript( "_calamares_module_basewidget.layout().addWidget(_calamares_module.widget())" ); return m_widget; } @@ -123,58 +119,40 @@ PythonQtViewStep::back() bool PythonQtViewStep::isNextEnabled() const { - return CalamaresUtils::lookupAndCall( m_obj, - { "isNextEnabled", - "isnextenabled", - "is_next_enabled" } ).toBool(); + return CalamaresUtils::lookupAndCall( m_obj, { "isNextEnabled", "isnextenabled", "is_next_enabled" } ).toBool(); } bool PythonQtViewStep::isBackEnabled() const { - return CalamaresUtils::lookupAndCall( m_obj, - { "isBackEnabled", - "isbackenabled", - "is_back_enabled" } ).toBool(); + return CalamaresUtils::lookupAndCall( m_obj, { "isBackEnabled", "isbackenabled", "is_back_enabled" } ).toBool(); } bool PythonQtViewStep::isAtBeginning() const { - return CalamaresUtils::lookupAndCall( m_obj, - { "isAtBeginning", - "isatbeginning", - "is_at_beginning" } ).toBool(); + return CalamaresUtils::lookupAndCall( m_obj, { "isAtBeginning", "isatbeginning", "is_at_beginning" } ).toBool(); } bool PythonQtViewStep::isAtEnd() const { - return CalamaresUtils::lookupAndCall( m_obj, - { "isAtEnd", - "isatend", - "is_at_end" } ).toBool(); + return CalamaresUtils::lookupAndCall( m_obj, { "isAtEnd", "isatend", "is_at_end" } ).toBool(); } void -PythonQtViewStep::onActivate() +PythonQtViewStep::onActivate() { - CalamaresUtils::lookupAndCall( m_obj, - { "onActivate", - "onactivate", - "on_activate" }); + CalamaresUtils::lookupAndCall( m_obj, { "onActivate", "onactivate", "on_activate" } ); } void PythonQtViewStep::onLeave() { - CalamaresUtils::lookupAndCall( m_obj, - { "onLeave", - "onleave", - "on_leave" }); + CalamaresUtils::lookupAndCall( m_obj, { "onLeave", "onleave", "on_leave" } ); } @@ -185,21 +163,29 @@ PythonQtViewStep::jobs() const PythonQtObjectPtr jobsCallable = PythonQt::self()->lookupCallable( m_obj, "jobs" ); if ( jobsCallable.isNull() ) + { return jobs; + } PythonQtObjectPtr response = PythonQt::self()->callAndReturnPyObject( jobsCallable ); if ( response.isNull() ) + { return jobs; + } PythonQtObjectPtr listPopCallable = PythonQt::self()->lookupCallable( response, "pop" ); if ( listPopCallable.isNull() ) + { return jobs; + } forever { PythonQtObjectPtr aJob = PythonQt::self()->callAndReturnPyObject( listPopCallable, { 0 } ); if ( aJob.isNull() ) + { break; + } jobs.append( Calamares::job_ptr( new PythonQtJob( m_cxt, aJob ) ) ); } @@ -219,9 +205,8 @@ QWidget* PythonQtViewStep::createScriptingConsole() { PythonQtScriptingConsole* console = new PythonQtScriptingConsole( nullptr, m_cxt ); - console->setProperty( "classname", - m_cxt.getVariable( "_calamares_module_typename" ).toString() ); + console->setProperty( "classname", m_cxt.getVariable( "_calamares_module_typename" ).toString() ); return console; } -} +} // namespace Calamares diff --git a/src/libcalamaresui/viewpages/PythonQtViewStep.h b/src/libcalamaresui/viewpages/PythonQtViewStep.h index b6b7c193b..5358bc824 100644 --- a/src/libcalamaresui/viewpages/PythonQtViewStep.h +++ b/src/libcalamaresui/viewpages/PythonQtViewStep.h @@ -30,8 +30,7 @@ class PythonQtViewStep : public Calamares::ViewStep { Q_OBJECT public: - PythonQtViewStep( PythonQtObjectPtr cxt, - QObject* parent = nullptr ); + PythonQtViewStep( PythonQtObjectPtr cxt, QObject* parent = nullptr ); QString prettyName() const override; @@ -62,6 +61,6 @@ private: PythonQtObjectPtr m_obj; }; -} +} // namespace Calamares -#endif // PYTHONQTVIEWSTEP_H +#endif // PYTHONQTVIEWSTEP_H diff --git a/src/libcalamaresui/viewpages/ViewStep.cpp b/src/libcalamaresui/viewpages/ViewStep.cpp index cdfc7bbc9..7fe7ff88d 100644 --- a/src/libcalamaresui/viewpages/ViewStep.cpp +++ b/src/libcalamaresui/viewpages/ViewStep.cpp @@ -24,11 +24,11 @@ namespace Calamares ViewStep::ViewStep( QObject* parent ) : QObject( parent ) -{} +{ +} -ViewStep::~ViewStep() -{} +ViewStep::~ViewStep() {} QString @@ -45,20 +45,24 @@ ViewStep::createSummaryWidget() const void ViewStep::onActivate() -{} +{ +} void ViewStep::onLeave() -{} +{ +} void ViewStep::next() -{} +{ +} void ViewStep::back() -{} +{ +} void @@ -75,9 +79,10 @@ ViewStep::setConfigurationMap( const QVariantMap& configurationMap ) } -RequirementsList ViewStep::checkRequirements() +RequirementsList +ViewStep::checkRequirements() { return RequirementsList(); } -} +} // namespace Calamares diff --git a/src/libcalamaresui/viewpages/ViewStep.h b/src/libcalamaresui/viewpages/ViewStep.h index e3d5a021e..8c5020f83 100644 --- a/src/libcalamaresui/viewpages/ViewStep.h +++ b/src/libcalamaresui/viewpages/ViewStep.h @@ -130,10 +130,7 @@ public: virtual JobList jobs() const = 0; void setModuleInstanceKey( const QString& instanceKey ); - QString moduleInstanceKey() const - { - return m_instanceKey; - } + QString moduleInstanceKey() const { return m_instanceKey; } virtual void setConfigurationMap( const QVariantMap& configurationMap ); @@ -161,6 +158,6 @@ protected: }; using ViewStepList = QList< ViewStep* >; -} +} // namespace Calamares -#endif // VIEWSTEP_H +#endif // VIEWSTEP_H diff --git a/src/libcalamaresui/widgets/ClickableLabel.cpp b/src/libcalamaresui/widgets/ClickableLabel.cpp index b6786cab8..62985acf8 100644 --- a/src/libcalamaresui/widgets/ClickableLabel.cpp +++ b/src/libcalamaresui/widgets/ClickableLabel.cpp @@ -23,16 +23,17 @@ ClickableLabel::ClickableLabel( QWidget* parent ) : QLabel( parent ) -{} +{ +} ClickableLabel::ClickableLabel( const QString& text, QWidget* parent ) : QLabel( text, parent ) -{} +{ +} -ClickableLabel::~ClickableLabel() -{} +ClickableLabel::~ClickableLabel() {} void @@ -48,5 +49,7 @@ ClickableLabel::mouseReleaseEvent( QMouseEvent* event ) { QLabel::mouseReleaseEvent( event ); if ( m_time.elapsed() < qApp->doubleClickInterval() ) + { emit clicked(); + } } diff --git a/src/libcalamaresui/widgets/ClickableLabel.h b/src/libcalamaresui/widgets/ClickableLabel.h index ab993c721..fd66082c5 100644 --- a/src/libcalamaresui/widgets/ClickableLabel.h +++ b/src/libcalamaresui/widgets/ClickableLabel.h @@ -42,4 +42,4 @@ private: QTime m_time; }; -#endif // CLICKABLELABEL_H +#endif // CLICKABLELABEL_H diff --git a/src/libcalamaresui/widgets/FixedAspectRatioLabel.cpp b/src/libcalamaresui/widgets/FixedAspectRatioLabel.cpp index d1094bb7c..c495ca5bb 100644 --- a/src/libcalamaresui/widgets/FixedAspectRatioLabel.cpp +++ b/src/libcalamaresui/widgets/FixedAspectRatioLabel.cpp @@ -22,21 +22,18 @@ FixedAspectRatioLabel::FixedAspectRatioLabel( QWidget* parent ) : QLabel( parent ) -{} +{ +} -FixedAspectRatioLabel::~FixedAspectRatioLabel() -{} +FixedAspectRatioLabel::~FixedAspectRatioLabel() {} void FixedAspectRatioLabel::setPixmap( const QPixmap& pixmap ) { m_pixmap = pixmap; - QLabel::setPixmap( pixmap.scaled( - contentsRect().size(), - Qt::KeepAspectRatio, - Qt::SmoothTransformation ) ); + QLabel::setPixmap( pixmap.scaled( contentsRect().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ) ); } @@ -44,9 +41,5 @@ void FixedAspectRatioLabel::resizeEvent( QResizeEvent* event ) { Q_UNUSED( event ) - QLabel::setPixmap( m_pixmap.scaled( - contentsRect().size(), - Qt::KeepAspectRatio, - Qt::SmoothTransformation ) ); + QLabel::setPixmap( m_pixmap.scaled( contentsRect().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ) ); } - diff --git a/src/libcalamaresui/widgets/FixedAspectRatioLabel.h b/src/libcalamaresui/widgets/FixedAspectRatioLabel.h index 8f881753c..9466fcd15 100644 --- a/src/libcalamaresui/widgets/FixedAspectRatioLabel.h +++ b/src/libcalamaresui/widgets/FixedAspectRatioLabel.h @@ -31,11 +31,11 @@ public: virtual ~FixedAspectRatioLabel() override; public slots: - void setPixmap( const QPixmap &pixmap ); + void setPixmap( const QPixmap& pixmap ); void resizeEvent( QResizeEvent* event ) override; private: QPixmap m_pixmap; }; -#endif // FIXEDASPECTRATIOLABEL_H +#endif // FIXEDASPECTRATIOLABEL_H diff --git a/src/libcalamaresui/widgets/WaitingWidget.cpp b/src/libcalamaresui/widgets/WaitingWidget.cpp index 286c611ab..1a658b35b 100644 --- a/src/libcalamaresui/widgets/WaitingWidget.cpp +++ b/src/libcalamaresui/widgets/WaitingWidget.cpp @@ -20,7 +20,8 @@ #include "WaitingWidget.h" #include "utils/CalamaresUtilsGui.h" -#include "waitingspinnerwidget.h" + +#include "3rdparty/waitingspinnerwidget.h" #include #include diff --git a/src/libcalamaresui/widgets/WaitingWidget.h b/src/libcalamaresui/widgets/WaitingWidget.h index 5c19cce26..0d8b6fd5b 100644 --- a/src/libcalamaresui/widgets/WaitingWidget.h +++ b/src/libcalamaresui/widgets/WaitingWidget.h @@ -35,4 +35,4 @@ private: QLabel* m_waitingLabel; }; -#endif // WAITINGWIDGET_H +#endif // WAITINGWIDGET_H diff --git a/src/modules/contextualprocess/ContextualProcessJob.cpp b/src/modules/contextualprocess/ContextualProcessJob.cpp index 428e54cd5..c65261b23 100644 --- a/src/modules/contextualprocess/ContextualProcessJob.cpp +++ b/src/modules/contextualprocess/ContextualProcessJob.cpp @@ -18,22 +18,22 @@ #include "ContextualProcessJob.h" -#include #include +#include #include #include "CalamaresVersion.h" -#include "JobQueue.h" #include "GlobalStorage.h" +#include "JobQueue.h" #include "utils/CommandList.h" #include "utils/Logger.h" #include "utils/Variant.h" -struct ValueCheck : public QPair +struct ValueCheck : public QPair< QString, CalamaresUtils::CommandList* > { ValueCheck( const QString& value, CalamaresUtils::CommandList* commands ) - : QPair(value, commands) + : QPair< QString, CalamaresUtils::CommandList* >( value, commands ) { } @@ -47,7 +47,7 @@ struct ValueCheck : public QPair QString value() const { return first; } CalamaresUtils::CommandList* commands() const { return second; } -} ; +}; struct ContextualProcessBinding { @@ -67,7 +67,9 @@ struct ContextualProcessBinding { checks.append( ValueCheck( value, commands ) ); if ( value == QString( "*" ) ) + { wildcard = commands; + } } Calamares::JobResult run( const QString& value ) const @@ -75,19 +77,23 @@ struct ContextualProcessBinding for ( const auto& c : checks ) { if ( value == c.value() ) + { return c.commands()->run(); + } } if ( wildcard ) + { return wildcard->run(); + } return Calamares::JobResult::ok(); } QString variable; - QList checks; - CalamaresUtils::CommandList* wildcard{ nullptr }; -} ; + QList< ValueCheck > checks; + CalamaresUtils::CommandList* wildcard { nullptr }; +}; ContextualProcessBinding::~ContextualProcessBinding() @@ -129,10 +135,14 @@ ContextualProcessJob::exec() { Calamares::JobResult r = binding->run( gs->value( binding->variable ).toString() ); if ( !r ) + { return r; + } } else + { cWarning() << "ContextualProcess checks for unknown variable" << binding->variable; + } } return Calamares::JobResult::ok(); } @@ -142,15 +152,19 @@ void ContextualProcessJob::setConfigurationMap( const QVariantMap& configurationMap ) { bool dontChroot = CalamaresUtils::getBool( configurationMap, "dontChroot", false ); - int timeout = CalamaresUtils::getInteger( configurationMap, "timeout", 10 ); + qint64 timeout = CalamaresUtils::getInteger( configurationMap, "timeout", 10 ); if ( timeout < 1 ) + { timeout = 10; + } for ( QVariantMap::const_iterator iter = configurationMap.cbegin(); iter != configurationMap.cend(); ++iter ) { QString variableName = iter.key(); if ( variableName.isEmpty() || ( variableName == "dontChroot" ) || ( variableName == "timeout" ) ) + { continue; + } if ( iter.value().type() != QVariant::Map ) { @@ -166,11 +180,13 @@ ContextualProcessJob::setConfigurationMap( const QVariantMap& configurationMap ) QString valueString = valueiter.key(); if ( variableName.isEmpty() ) { - cWarning() << moduleInstanceKey() << "variable" << variableName << "unrecognized value" << valueiter.key(); + cWarning() << moduleInstanceKey() << "variable" << variableName << "unrecognized value" + << valueiter.key(); continue; } - CalamaresUtils::CommandList* commands = new CalamaresUtils::CommandList( valueiter.value(), !dontChroot, timeout ); + CalamaresUtils::CommandList* commands + = new CalamaresUtils::CommandList( valueiter.value(), !dontChroot, std::chrono::seconds( timeout ) ); binding->append( valueString, commands ); } @@ -184,12 +200,14 @@ ContextualProcessJob::count() } int -ContextualProcessJob::count(const QString& variableName) +ContextualProcessJob::count( const QString& variableName ) { for ( const ContextualProcessBinding* binding : m_commands ) if ( binding->variable == variableName ) + { return binding->checks.count(); + } return -1; } -CALAMARES_PLUGIN_FACTORY_DEFINITION( ContextualProcessJobFactory, registerPlugin(); ) +CALAMARES_PLUGIN_FACTORY_DEFINITION( ContextualProcessJobFactory, registerPlugin< ContextualProcessJob >(); ) diff --git a/src/modules/contextualprocess/ContextualProcessJob.h b/src/modules/contextualprocess/ContextualProcessJob.h index fbc102058..2efbc5082 100644 --- a/src/modules/contextualprocess/ContextualProcessJob.h +++ b/src/modules/contextualprocess/ContextualProcessJob.h @@ -49,9 +49,9 @@ public: int count( const QString& variableName ); private: - QList m_commands; + QList< ContextualProcessBinding* > m_commands; }; CALAMARES_PLUGIN_FACTORY_DECLARATION( ContextualProcessJobFactory ) -#endif // CONTEXTUALPROCESSJOB_H +#endif // CONTEXTUALPROCESSJOB_H diff --git a/src/modules/contextualprocess/Tests.cpp b/src/modules/contextualprocess/Tests.cpp index 51319c220..f62726775 100644 --- a/src/modules/contextualprocess/Tests.cpp +++ b/src/modules/contextualprocess/Tests.cpp @@ -31,13 +31,9 @@ QTEST_GUILESS_MAIN( ContextualProcessTests ) using CommandList = CalamaresUtils::CommandList; -ContextualProcessTests::ContextualProcessTests() -{ -} +ContextualProcessTests::ContextualProcessTests() {} -ContextualProcessTests::~ContextualProcessTests() -{ -} +ContextualProcessTests::~ContextualProcessTests() {} void ContextualProcessTests::initTestCase() @@ -63,7 +59,6 @@ ContextualProcessTests::testProcessListSampleConfig() ContextualProcessJob job; job.setConfigurationMap( CalamaresUtils::yamlMapToVariant( doc ).toMap() ); - QCOMPARE(job.count(), 1); // Only "firmwareType" - QCOMPARE(job.count("firmwareType"), 4); + QCOMPARE( job.count(), 1 ); // Only "firmwareType" + QCOMPARE( job.count( "firmwareType" ), 4 ); } - diff --git a/src/modules/displaymanager/main.py b/src/modules/displaymanager/main.py index 639edbea7..f85a8aecc 100644 --- a/src/modules/displaymanager/main.py +++ b/src/modules/displaymanager/main.py @@ -3,13 +3,13 @@ # # === This file is part of Calamares - === # -# Copyright 2019 Dominic Hayes # Copyright 2014-2018, Philip Müller # Copyright 2014-2015, Teo Mrnjavac # Copyright 2014, Kevin Kofler # Copyright 2017, Alf Gaida # Copyright 2017, Bernhard Landauer -# Copyright 2017, Adriaan de Groot +# Copyright 2017, 2019, Adriaan de Groot +# Copyright 2019, Dominic Hayes # # Calamares is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -117,14 +117,11 @@ class DisplayManager(metaclass=abc.ABCMeta): in the target system. """ if self.executable is None: - return True + return False bin_path = "{!s}/usr/bin/{!s}".format(self.root_mount_point, self.executable) sbin_path = "{!s}/usr/sbin/{!s}".format(self.root_mount_point, self.executable) - return ( - os.path.exists(bin_path) - or os.path.exists(sbin_path) - ) + return os.path.exists(bin_path) or os.path.exists(sbin_path) # The four abstract methods below are called in the order listed here. # They must all be implemented by subclasses, but not all of them @@ -251,10 +248,33 @@ class DMmdm(DisplayManager): class DMgdm(DisplayManager): name = "gdm" executable = "gdm" + config = None # Set by have_dm() + + def have_dm(self): + """ + GDM exists with different executable names, so search + for one of them and use it. + """ + for executable, config in ( + ( "gdm", "etc/gdm/custom.conf" ), + ( "gdm3", "etc/gdm3/daemon.conf" ) + ): + bin_path = "{!s}/usr/bin/{!s}".format(self.root_mount_point, executable) + sbin_path = "{!s}/usr/sbin/{!s}".format(self.root_mount_point, executable) + if os.path.exists(bin_path) or os.path.exists(sbin_path): + # Keep the found-executable name around for later + self.executable = executable + self.config = config + return True + + return False def set_autologin(self, username, do_autologin, default_desktop_environment): + if self.config is None: + raise ValueError( "No config file for GDM has been set." ) + # Systems with GDM as Desktop Manager - gdm_conf_path = os.path.join(self.root_mount_point, "etc/gdm/custom.conf") + gdm_conf_path = os.path.join(self.root_mount_point, self.config) if os.path.exists(gdm_conf_path): with open(gdm_conf_path, 'r') as gdm_conf: diff --git a/src/modules/dummycpp/DummyCppJob.cpp b/src/modules/dummycpp/DummyCppJob.cpp index b404eaf63..5a2ca1803 100644 --- a/src/modules/dummycpp/DummyCppJob.cpp +++ b/src/modules/dummycpp/DummyCppJob.cpp @@ -20,14 +20,15 @@ #include "DummyCppJob.h" -#include #include +#include #include #include "CalamaresVersion.h" -#include "JobQueue.h" #include "GlobalStorage.h" +#include "JobQueue.h" +#include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" DummyCppJob::DummyCppJob( QObject* parent ) @@ -36,9 +37,7 @@ DummyCppJob::DummyCppJob( QObject* parent ) } -DummyCppJob::~DummyCppJob() -{ -} +DummyCppJob::~DummyCppJob() {} QString @@ -56,19 +55,20 @@ static QString variantHashToString( const QVariantHash& variantHash ); static QString variantToString( const QVariant& variant ) { - switch ( variant.type() ) + if ( variant.type() == QVariant::Map ) { - case QVariant::Map: return variantMapToString( variant.toMap() ); - - case QVariant::Hash: + } + else if ( variant.type() == QVariant::Hash ) + { return variantHashToString( variant.toHash() ); - - case QVariant::List: - case QVariant::StringList: + } + else if ( ( variant.type() == QVariant::List ) || ( variant.type() == QVariant::StringList ) ) + { return variantListToString( variant.toList() ); - - default: + } + else + { return variant.toString(); } } @@ -79,8 +79,10 @@ variantListToString( const QVariantList& variantList ) { QStringList result; for ( const QVariant& variant : variantList ) + { result.append( variantToString( variant ) ); - return '{' + result.join(',') + '}'; + } + return '{' + result.join( ',' ) + '}'; } @@ -89,8 +91,10 @@ variantMapToString( const QVariantMap& variantMap ) { QStringList result; for ( auto it = variantMap.constBegin(); it != variantMap.constEnd(); ++it ) + { result.append( it.key() + '=' + variantToString( it.value() ) ); - return '[' + result.join(',') + ']'; + } + return '[' + result.join( ',' ) + ']'; } @@ -99,8 +103,10 @@ variantHashToString( const QVariantHash& variantHash ) { QStringList result; for ( auto it = variantHash.constBegin(); it != variantHash.constEnd(); ++it ) + { result.append( it.key() + '=' + variantToString( it.value() ) ); - return '<' + result.join(',') + '>'; + } + return '<' + result.join( ',' ) + '>'; } @@ -108,24 +114,29 @@ Calamares::JobResult DummyCppJob::exec() { // Ported from dummypython - QProcess::execute( "/bin/sh", QStringList() << "-c" << "touch ~/calamares-dummycpp" ); + CalamaresUtils::System::runCommand( CalamaresUtils::System::RunLocation::RunInHost, + QStringList() << "/bin/sh" + << "-c" + << "touch ~/calamares-dummycpp" ); QString accumulator = QDateTime::currentDateTimeUtc().toString( Qt::ISODate ) + '\n'; accumulator += QStringLiteral( "Calamares version: " ) + CALAMARES_VERSION_SHORT + '\n'; accumulator += QStringLiteral( "This job's name: " ) + prettyName() + '\n'; accumulator += QStringLiteral( "Configuration map: %1\n" ).arg( variantMapToString( m_configurationMap ) ); accumulator += QStringLiteral( " *** globalstorage test ***\n" ); - Calamares::GlobalStorage *globalStorage = Calamares::JobQueue::instance()->globalStorage(); - accumulator += QStringLiteral( "lala: " ) + (globalStorage->contains( "lala" ) ? QStringLiteral( "true" ) : QStringLiteral( "false" )) + '\n'; - accumulator += QStringLiteral( "foo: " ) + (globalStorage->contains( "foo" ) ? QStringLiteral( "true" ) : QStringLiteral( "false" )) + '\n'; + Calamares::GlobalStorage* globalStorage = Calamares::JobQueue::instance()->globalStorage(); + accumulator += QStringLiteral( "lala: " ) + + ( globalStorage->contains( "lala" ) ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ) + '\n'; + accumulator += QStringLiteral( "foo: " ) + + ( globalStorage->contains( "foo" ) ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ) + '\n'; accumulator += QStringLiteral( "count: " ) + QString::number( globalStorage->count() ) + '\n'; globalStorage->insert( "item2", "value2" ); globalStorage->insert( "item3", 3 ); accumulator += QStringLiteral( "keys: %1\n" ).arg( globalStorage->keys().join( ',' ) ); accumulator += QStringLiteral( "remove: %1\n" ).arg( QString::number( globalStorage->remove( "item2" ) ) ); - accumulator += QStringLiteral( "values: %1 %2 %3\n" ).arg( - globalStorage->value( "foo" ).toString(), - globalStorage->value( "item2" ).toString(), - globalStorage->value( "item3" ).toString() ); + accumulator += QStringLiteral( "values: %1 %2 %3\n" ) + .arg( globalStorage->value( "foo" ).toString(), + globalStorage->value( "item2" ).toString(), + globalStorage->value( "item3" ).toString() ); emit progress( 0.1 ); cDebug() << "[DUMMYCPP]: " << accumulator; @@ -145,4 +156,4 @@ DummyCppJob::setConfigurationMap( const QVariantMap& configurationMap ) m_configurationMap = configurationMap; } -CALAMARES_PLUGIN_FACTORY_DEFINITION( DummyCppJobFactory, registerPlugin(); ) +CALAMARES_PLUGIN_FACTORY_DEFINITION( DummyCppJobFactory, registerPlugin< DummyCppJob >(); ) diff --git a/src/modules/dummycpp/DummyCppJob.h b/src/modules/dummycpp/DummyCppJob.h index 98c4d19d6..4a79d0378 100644 --- a/src/modules/dummycpp/DummyCppJob.h +++ b/src/modules/dummycpp/DummyCppJob.h @@ -49,4 +49,4 @@ private: CALAMARES_PLUGIN_FACTORY_DECLARATION( DummyCppJobFactory ) -#endif // DUMMYCPPJOB_H +#endif // DUMMYCPPJOB_H diff --git a/src/modules/dummypythonqt/lang/et/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/et/LC_MESSAGES/dummypythonqt.mo index 23c604896..cdb2466fa 100644 Binary files a/src/modules/dummypythonqt/lang/et/LC_MESSAGES/dummypythonqt.mo and b/src/modules/dummypythonqt/lang/et/LC_MESSAGES/dummypythonqt.mo differ diff --git a/src/modules/dummypythonqt/lang/et/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/et/LC_MESSAGES/dummypythonqt.po index 7ed917da0..4ab56cc0f 100644 --- a/src/modules/dummypythonqt/lang/et/LC_MESSAGES/dummypythonqt.po +++ b/src/modules/dummypythonqt/lang/et/LC_MESSAGES/dummypythonqt.po @@ -4,16 +4,16 @@ # FIRST AUTHOR , YEAR. # # Translators: -# Madis, 2018 +# Madis Otenurm, 2018 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-05 11:34-0400\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2016-12-16 12:18+0000\n" -"Last-Translator: Madis, 2018\n" +"Last-Translator: Madis Otenurm, 2018\n" "Language-Team: Estonian (https://www.transifex.com/calamares/teams/20061/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/src/modules/dummypythonqt/lang/zh_TW/LC_MESSAGES/dummypythonqt.mo b/src/modules/dummypythonqt/lang/zh_TW/LC_MESSAGES/dummypythonqt.mo index 43817982d..f13ff2d5f 100644 Binary files a/src/modules/dummypythonqt/lang/zh_TW/LC_MESSAGES/dummypythonqt.mo and b/src/modules/dummypythonqt/lang/zh_TW/LC_MESSAGES/dummypythonqt.mo differ diff --git a/src/modules/dummypythonqt/lang/zh_TW/LC_MESSAGES/dummypythonqt.po b/src/modules/dummypythonqt/lang/zh_TW/LC_MESSAGES/dummypythonqt.po index d80cdaa82..bc2056e1e 100644 --- a/src/modules/dummypythonqt/lang/zh_TW/LC_MESSAGES/dummypythonqt.po +++ b/src/modules/dummypythonqt/lang/zh_TW/LC_MESSAGES/dummypythonqt.po @@ -4,16 +4,16 @@ # FIRST AUTHOR , YEAR. # # Translators: -# Jeff Huang , 2017 +# 黃柏諺 , 2017 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-10-05 11:34-0400\n" +"POT-Creation-Date: 2019-07-06 01:16+0200\n" "PO-Revision-Date: 2016-12-16 12:18+0000\n" -"Last-Translator: Jeff Huang , 2017\n" +"Last-Translator: 黃柏諺 , 2017\n" "Language-Team: Chinese (Taiwan) (https://www.transifex.com/calamares/teams/20061/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/src/modules/fsresizer/CMakeLists.txt b/src/modules/fsresizer/CMakeLists.txt index ba9c81f4c..3d82489b7 100644 --- a/src/modules/fsresizer/CMakeLists.txt +++ b/src/modules/fsresizer/CMakeLists.txt @@ -1,11 +1,11 @@ find_package( KPMcore 3.3 ) +find_package( KF5Config CONFIG ) +find_package( KF5I18n CONFIG ) +find_package( KF5WidgetsAddons CONFIG ) set( _partition_defs "" ) -if ( KPMcore_FOUND ) - find_package( Qt5 REQUIRED DBus ) # Needed for KPMCore - find_package( KF5 REQUIRED I18n WidgetsAddons ) # Needed for KPMCore - +if ( KPMcore_FOUND AND Qt5DBus_FOUND AND KF5CoreAddons_FOUND AND KF5Config_FOUND ) include_directories( ${KPMCORE_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/src/modules/partition ) if ( KPMcore_VERSION VERSION_GREATER "3.3.0") @@ -48,5 +48,9 @@ if ( KPMcore_FOUND ) target_compile_definitions( fsresizertest PRIVATE ${_partition_defs} ) endif() else() - calamares_skip_module( "fsresizer (missing suitable KPMcore)" ) + if ( NOT KPMcore_FOUND ) + calamares_skip_module( "fsresizer (missing suitable KPMcore)" ) + else() + calamares_skip_module( "fsresizer (missing dependencies for KPMcore)" ) + endif() endif() diff --git a/src/modules/fstab/fstab.conf b/src/modules/fstab/fstab.conf index 11adff2ed..b2f3de361 100644 --- a/src/modules/fstab/fstab.conf +++ b/src/modules/fstab/fstab.conf @@ -12,6 +12,11 @@ mountOptions: default: defaults,noatime btrfs: defaults,noatime,space_cache,autodefrag +# Mount options to use for the EFI System Partition. If not defined, the +# *mountOptions* for *vfat* are used, or if that is not set either, +# *default* from *mountOptions*. +efiMountOptions: umask=0077 + # If a filesystem is on an SSD, add the following options. If a specific # filesystem is listed here, use those options, otherwise no additional # options are set (i.e. there is no *default* like in *mountOptions*). diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py index abbd3d524..4a696f46b 100644 --- a/src/modules/fstab/main.py +++ b/src/modules/fstab/main.py @@ -162,7 +162,6 @@ class FstabGenerator(object): return None mapper_name = partition["luksMapperName"] - mount_point = partition["mountPoint"] luks_uuid = partition["luksUuid"] if not mapper_name or not luks_uuid: return None @@ -247,8 +246,8 @@ class FstabGenerator(object): if not mount_point: mount_point = "swap" - options = self.mount_options.get(filesystem, - self.mount_options["default"]) + options = self.get_mount_options(filesystem, mount_point) + if is_ssd: extra = self.ssd_extra_mount_options.get(filesystem) @@ -266,12 +265,12 @@ class FstabGenerator(object): self.root_is_ssd = is_ssd if filesystem == "btrfs" and "subvol" in partition: - options="subvol={},".format(partition["subvol"]) + options + options = "subvol={},".format(partition["subvol"]) + options if has_luks: - device="/dev/mapper/" + partition["luksMapperName"] + device = "/dev/mapper/" + partition["luksMapperName"] else: - device="UUID=" + partition["uuid"] + device = "UUID=" + partition["uuid"] return dict(device=device, mount_point=mount_point, @@ -296,6 +295,16 @@ class FstabGenerator(object): if partition["mountPoint"]: mkdir_p(self.root_mount_point + partition["mountPoint"]) + def get_mount_options(self, filesystem, mount_point): + efiMountPoint = libcalamares.globalstorage.value("efiSystemPartition") + job_config = libcalamares.job.configuration + + if (mount_point == efiMountPoint and "efiMountOptions" in job_config): + return job_config["efiMountOptions"] + + return self.mount_options.get(filesystem, + self.mount_options["default"]) + def run(): """ Configures fstab. @@ -308,13 +317,17 @@ def run(): root_mount_point = global_storage.value("rootMountPoint") if not partitions: - libcalamares.utils.warning("partitions is empty, {!s}".format(partitions)) + libcalamares.utils.warning("partitions is empty, {!s}" + .format(partitions)) return (_("Configuration Error"), - _("No partitions are defined for
{!s}
to use." ).format("fstab")) + _("No partitions are defined for
{!s}
to use.") + .format("fstab")) if not root_mount_point: - libcalamares.utils.warning("rootMountPoint is empty, {!s}".format(root_mount_point)) + libcalamares.utils.warning("rootMountPoint is empty, {!s}" + .format(root_mount_point)) return (_("Configuration Error"), - _("No root mount point is given for
{!s}
to use." ).format("fstab")) + _("No root mount point is given for
{!s}
to use.") + .format("fstab")) mount_options = conf["mountOptions"] ssd_extra_mount_options = conf.get("ssdExtraMountOptions", {}) diff --git a/src/modules/grubcfg/main.py b/src/modules/grubcfg/main.py index 1d5342856..348f4fdad 100644 --- a/src/modules/grubcfg/main.py +++ b/src/modules/grubcfg/main.py @@ -3,7 +3,7 @@ # # === This file is part of Calamares - === # -# Copyright 2014-2018, Philip Müller +# Copyright 2014-2019, Philip Müller # Copyright 2015-2017, Teo Mrnjavac # Copyright 2017, Alf Gaida # Copyright 2017, 2019, Adriaan de Groot @@ -62,6 +62,8 @@ def modify_grub_default(partitions, root_mount_point, distributor): have_plymouth = plymouth_bin == 0 have_dracut = dracut_bin == 0 + enable_apparmor = "apparmor=1" + set_security = "" use_splash = "" swap_uuid = "" swap_outer_uuid = "" @@ -113,6 +115,11 @@ def modify_grub_default(partitions, root_mount_point, distributor): if use_splash and not os.path.exists(os.path.join(root_mount_point, "usr/bin/grub-set-bootflag")): kernel_params.append(use_splash) + if os.path.exists(os.path.join(root_mount_point, "usr/lib/libapparmor.so")): + set_security = "security=apparmor" + kernel_params.append(enable_apparmor) + kernel_params.append(set_security) + if swap_uuid: kernel_params.append("resume=UUID={!s}".format(swap_uuid)) @@ -157,13 +164,13 @@ def modify_grub_default(partitions, root_mount_point, distributor): line = line.rstrip("'") existing_params = line.split() - if not os.path.exists(os.path.join(root_mount_point, "usr/bin/grub-set-bootflag")): - for existing_param in existing_params: - existing_param_name = existing_param.split("=")[0] + for existing_param in existing_params: + existing_param_name = existing_param.split("=")[0] - # the only ones we ever add - if existing_param_name not in ["quiet", "resume", "splash"]: - kernel_params.append(existing_param) + # the only ones we ever add + if existing_param_name not in [ + "quiet", "resume", "splash"]: + kernel_params.append(existing_param) kernel_cmd = "GRUB_CMDLINE_LINUX_DEFAULT=\"{!s}\"".format( " ".join(kernel_params) diff --git a/src/modules/initcpio/CMakeLists.txt b/src/modules/initcpio/CMakeLists.txt index 990220b10..af217fb1a 100644 --- a/src/modules/initcpio/CMakeLists.txt +++ b/src/modules/initcpio/CMakeLists.txt @@ -21,6 +21,5 @@ if( ECM_FOUND AND BUILD_TESTING ) Qt5::Core Qt5::Test ) - set_target_properties( initcpiotest PROPERTIES AUTOMOC TRUE ) - target_include_directories( initcpiotest PRIVATE /usr/local/include ) + calamares_automoc( initcpiotest ) endif() diff --git a/src/modules/initcpio/InitcpioJob.cpp b/src/modules/initcpio/InitcpioJob.cpp index 38017d83e..38f3a8961 100644 --- a/src/modules/initcpio/InitcpioJob.cpp +++ b/src/modules/initcpio/InitcpioJob.cpp @@ -74,8 +74,8 @@ InitcpioJob::exec() cDebug() << "Updating initramfs with kernel" << m_kernel; auto r = CalamaresUtils::System::instance()->targetEnvCommand( - { "mkinitcpio", "-p", m_kernel }, QString(), QString(), 0 ); - return r.explainProcess( "mkinitcpio", 10 ); + { "mkinitcpio", "-p", m_kernel }, QString(), QString() /* no timeout , 0 */ ); + return r.explainProcess( "mkinitcpio", std::chrono::seconds( 10 ) /* fake timeout */ ); } void @@ -89,7 +89,7 @@ InitcpioJob::setConfigurationMap( const QVariantMap& configurationMap ) else if ( m_kernel == "$uname" ) { auto r = CalamaresUtils::System::runCommand( - CalamaresUtils::System::RunLocation::RunInHost, { "/bin/uname", "-r" }, QString(), QString(), 3 ); + CalamaresUtils::System::RunLocation::RunInHost, { "/bin/uname", "-r" }, QString(), QString(), std::chrono::seconds( 3 ) ); if ( r.getExitCode() == 0 ) { m_kernel = r.getOutput(); diff --git a/src/modules/initcpio/initcpio.conf b/src/modules/initcpio/initcpio.conf index 8ad71e9f5..517e48392 100644 --- a/src/modules/initcpio/initcpio.conf +++ b/src/modules/initcpio/initcpio.conf @@ -1,8 +1,7 @@ # Run mkinitcpio(8) with the given preset value --- -# There is only one configuration item for this module, -# the kernel to be loaded. This can have the following -# values: +# 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 diff --git a/src/modules/initramfs/CMakeLists.txt b/src/modules/initramfs/CMakeLists.txt index c2496b2a1..d7da12d55 100644 --- a/src/modules/initramfs/CMakeLists.txt +++ b/src/modules/initramfs/CMakeLists.txt @@ -21,6 +21,5 @@ if( ECM_FOUND AND BUILD_TESTING ) Qt5::Core Qt5::Test ) - set_target_properties( initramfstest PROPERTIES AUTOMOC TRUE ) - target_include_directories( initramfstest PRIVATE /usr/local/include ) + calamares_automoc( initramfstest ) endif() diff --git a/src/modules/initramfs/InitramfsJob.cpp b/src/modules/initramfs/InitramfsJob.cpp index 01d400443..af8e07ca7 100644 --- a/src/modules/initramfs/InitramfsJob.cpp +++ b/src/modules/initramfs/InitramfsJob.cpp @@ -63,8 +63,8 @@ InitramfsJob::exec() // And then do the ACTUAL work. auto r = CalamaresUtils::System::instance()->targetEnvCommand( - { "update-initramfs", "-k", m_kernel, "-c", "-t" }, QString(), QString(), 0 ); - return r.explainProcess( "update-initramfs", 10 ); + { "update-initramfs", "-k", m_kernel, "-c", "-t" }, QString(), QString() /* no timeout, 0 */ ); + return r.explainProcess( "update-initramfs", std::chrono::seconds( 10 ) /* fake timeout */ ); } @@ -79,7 +79,7 @@ InitramfsJob::setConfigurationMap( const QVariantMap& configurationMap ) else if ( m_kernel == "$uname" ) { auto r = CalamaresUtils::System::runCommand( - CalamaresUtils::System::RunLocation::RunInHost, { "/bin/uname", "-r" }, QString(), QString(), 3 ); + CalamaresUtils::System::RunLocation::RunInHost, { "/bin/uname", "-r" }, QString(), QString(), std::chrono::seconds( 3 ) ); if ( r.getExitCode() == 0 ) { m_kernel = r.getOutput(); diff --git a/src/modules/license/LicensePage.cpp b/src/modules/license/LicensePage.cpp index 3c241e467..2cc025f83 100644 --- a/src/modules/license/LicensePage.cpp +++ b/src/modules/license/LicensePage.cpp @@ -21,11 +21,11 @@ #include "LicensePage.h" -#include "ui_LicensePage.h" #include "LicenseWidget.h" +#include "ui_LicensePage.h" -#include "JobQueue.h" #include "GlobalStorage.h" +#include "JobQueue.h" #include "ViewManager.h" #include "utils/CalamaresUtilsGui.h" @@ -36,10 +36,10 @@ #include #include +#include #include #include #include -#include #include #include @@ -47,11 +47,11 @@ const NamedEnumTable< LicenseEntry::Type >& LicenseEntry::typeNames() { - static const NamedEnumTable< LicenseEntry::Type > names{ - { QStringLiteral( "software" ), LicenseEntry::Type::Software}, + static const NamedEnumTable< LicenseEntry::Type > names { + { QStringLiteral( "software" ), LicenseEntry::Type::Software }, { QStringLiteral( "driver" ), LicenseEntry::Type::Driver }, { QStringLiteral( "gpudriver" ), LicenseEntry::Type::GpuDriver }, - { QStringLiteral( "browserplugin" ), LicenseEntry::Type::BrowserPlugin}, + { QStringLiteral( "browserplugin" ), LicenseEntry::Type::BrowserPlugin }, { QStringLiteral( "codec" ), LicenseEntry::Type::Codec }, { QStringLiteral( "package" ), LicenseEntry::Type::Package } }; @@ -59,10 +59,12 @@ LicenseEntry::typeNames() return names; } -LicenseEntry::LicenseEntry(const QVariantMap& conf) +LicenseEntry::LicenseEntry( const QVariantMap& conf ) { if ( !conf.contains( "id" ) || !conf.contains( "name" ) || !conf.contains( "url" ) ) + { return; + } m_id = conf[ "id" ].toString(); m_prettyName = conf[ "name" ].toString(); @@ -75,7 +77,9 @@ LicenseEntry::LicenseEntry(const QVariantMap& conf) QString typeString = conf.value( "type", "software" ).toString(); m_type = typeNames().find( typeString, ok ); if ( !ok ) + { cWarning() << "License entry" << m_id << "has unknown type" << typeString << "(using 'software')"; + } } bool @@ -85,7 +89,7 @@ LicenseEntry::isLocal() const } -LicensePage::LicensePage(QWidget *parent) +LicensePage::LicensePage( QWidget* parent ) : QWidget( parent ) , m_isNextEnabled( false ) , m_allLicensesOptional( false ) @@ -119,9 +123,7 @@ LicensePage::LicensePage(QWidget *parent) connect( ui->acceptCheckBox, &QCheckBox::toggled, this, &LicensePage::checkAcceptance ); - CALAMARES_RETRANSLATE( - ui->acceptCheckBox->setText( tr( "I accept the terms and conditions above." ) ); - ) + CALAMARES_RETRANSLATE( ui->acceptCheckBox->setText( tr( "I accept the terms and conditions above." ) ); ) } @@ -132,41 +134,40 @@ LicensePage::setEntries( const QList< LicenseEntry >& entriesList ) m_entries.clear(); m_entries.reserve( entriesList.count() ); - const bool required = std::any_of( entriesList.cbegin(), entriesList.cend(), []( const LicenseEntry& e ){ return e.m_required; }); + const bool required + = std::any_of( entriesList.cbegin(), entriesList.cend(), []( const LicenseEntry& e ) { return e.m_required; } ); if ( entriesList.isEmpty() ) + { m_allLicensesOptional = true; + } else + { m_allLicensesOptional = !required; + } checkAcceptance( false ); - CALAMARES_RETRANSLATE( - if ( required ) - { - ui->mainText->setText( tr( "

License Agreement

" - "This setup procedure will install proprietary " - "software that is subject to licensing terms." ) ); - ui->additionalText->setText( tr( "Please review the End User License " - "Agreements (EULAs) above.
" - "If you do not agree with the terms, the setup procedure cannot continue." ) ); - } - else - { - ui->mainText->setText( tr( "

License Agreement

" - "This setup procedure can install proprietary " - "software that is subject to licensing terms " - "in order to provide additional features and enhance the user " - "experience." ) ); - ui->additionalText->setText( tr( "Please review the End User License " - "Agreements (EULAs) above.
" - "If you do not agree with the terms, proprietary software will not " - "be installed, and open source alternatives will be used instead." ) ); - } - ui->retranslateUi( this ); + CALAMARES_RETRANSLATE( if ( required ) { + ui->mainText->setText( tr( "

License Agreement

" + "This setup procedure will install proprietary " + "software that is subject to licensing terms." ) ); + ui->additionalText->setText( tr( "Please review the End User License " + "Agreements (EULAs) above.
" + "If you do not agree with the terms, the setup procedure cannot continue." ) ); + } else { + ui->mainText->setText( tr( "

License Agreement

" + "This setup procedure can install proprietary " + "software that is subject to licensing terms " + "in order to provide additional features and enhance the user " + "experience." ) ); + ui->additionalText->setText( tr( "Please review the End User License " + "Agreements (EULAs) above.
" + "If you do not agree with the terms, proprietary software will not " + "be installed, and open source alternatives will be used instead." ) ); + } ui->retranslateUi( this ); - for ( const auto& w : m_entries ) - w->retranslateUi(); - ) + for ( const auto& w + : m_entries ) w->retranslateUi(); ) for ( const LicenseEntry& entry : entriesList ) { @@ -190,7 +191,8 @@ LicensePage::updateGlobalStorage( bool v ) Calamares::JobQueue::instance()->globalStorage()->insert( "licenseAgree", v ); } -void LicensePage::checkAcceptance( bool checked ) +void +LicensePage::checkAcceptance( bool checked ) { updateGlobalStorage( checked ); diff --git a/src/modules/license/LicensePage.h b/src/modules/license/LicensePage.h index e595f7ad8..bd9543937 100644 --- a/src/modules/license/LicensePage.h +++ b/src/modules/license/LicensePage.h @@ -24,8 +24,8 @@ #include "utils/NamedEnum.h" -#include #include +#include namespace Ui { @@ -101,4 +101,4 @@ private: QList< LicenseWidget* > m_entries; }; -#endif //LICENSEPAGE_H +#endif //LICENSEPAGE_H diff --git a/src/modules/license/LicenseViewStep.cpp b/src/modules/license/LicenseViewStep.cpp index f5f4b6e2b..89cddf27f 100644 --- a/src/modules/license/LicenseViewStep.cpp +++ b/src/modules/license/LicenseViewStep.cpp @@ -19,29 +19,30 @@ #include "LicenseViewStep.h" -#include "LicensePage.h" -#include "JobQueue.h" #include "GlobalStorage.h" +#include "JobQueue.h" +#include "LicensePage.h" #include "utils/Logger.h" #include -CALAMARES_PLUGIN_FACTORY_DEFINITION( LicenseViewStepFactory, registerPlugin(); ) +CALAMARES_PLUGIN_FACTORY_DEFINITION( LicenseViewStepFactory, registerPlugin< LicenseViewStep >(); ) LicenseViewStep::LicenseViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_widget( new LicensePage ) { emit nextStatusChanged( false ); - connect( m_widget, &LicensePage::nextStatusChanged, - this, &LicenseViewStep::nextStatusChanged ); + connect( m_widget, &LicensePage::nextStatusChanged, this, &LicenseViewStep::nextStatusChanged ); } LicenseViewStep::~LicenseViewStep() { if ( m_widget && m_widget->parent() == nullptr ) + { m_widget->deleteLater(); + } } @@ -97,18 +98,21 @@ void LicenseViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { QList< LicenseEntry > entriesList; - if ( configurationMap.contains( "entries" ) && - configurationMap.value( "entries" ).type() == QVariant::List ) + if ( configurationMap.contains( "entries" ) && configurationMap.value( "entries" ).type() == QVariant::List ) { const auto entries = configurationMap.value( "entries" ).toList(); for ( const QVariant& entryV : entries ) { if ( entryV.type() != QVariant::Map ) + { continue; + } LicenseEntry entry( entryV.toMap() ); if ( entry.isValid() ) + { entriesList.append( entry ); + } } } diff --git a/src/modules/license/LicenseViewStep.h b/src/modules/license/LicenseViewStep.h index a4fabc8e1..957110f3d 100644 --- a/src/modules/license/LicenseViewStep.h +++ b/src/modules/license/LicenseViewStep.h @@ -20,9 +20,9 @@ #ifndef LICENSEPAGEPLUGIN_H #define LICENSEPAGEPLUGIN_H +#include #include #include -#include #include #include @@ -58,4 +58,4 @@ private: CALAMARES_PLUGIN_FACTORY_DECLARATION( LicenseViewStepFactory ) -#endif // LICENSEPAGEPLUGIN_H +#endif // LICENSEPAGEPLUGIN_H diff --git a/src/modules/license/LicenseWidget.cpp b/src/modules/license/LicenseWidget.cpp index 238d57b07..25509be95 100644 --- a/src/modules/license/LicenseWidget.cpp +++ b/src/modules/license/LicenseWidget.cpp @@ -34,10 +34,12 @@ static QString loadLocalFile( const QUrl& u ) { if ( !u.isLocalFile() ) + { return QString(); + } QFile file( u.path() ); - if ( !file.open(QIODevice::ReadOnly | QIODevice::Text) ) + if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) ) { cWarning() << "Could not load license file" << u.path(); return QString(); @@ -108,11 +110,10 @@ LicenseWidget::LicenseWidget( LicenseEntry entry, QWidget* parent ) retranslateUi(); } -LicenseWidget::~LicenseWidget() -{ -} +LicenseWidget::~LicenseWidget() {} -void LicenseWidget::retranslateUi() +void +LicenseWidget::retranslateUi() { QString productDescription; switch ( m_entry.m_type ) @@ -120,40 +121,40 @@ void LicenseWidget::retranslateUi() case LicenseEntry::Type::Driver: //: %1 is an untranslatable product name, example: Creative Audigy driver productDescription = tr( "%1 driver
" - "by %2" ) - .arg( m_entry.m_prettyName ) - .arg( m_entry.m_prettyVendor ); + "by %2" ) + .arg( m_entry.m_prettyName ) + .arg( m_entry.m_prettyVendor ); break; case LicenseEntry::Type::GpuDriver: //: %1 is usually a vendor name, example: Nvidia graphics driver productDescription = tr( "%1 graphics driver
" - "by %2" ) - .arg( m_entry.m_prettyName ) - .arg( m_entry.m_prettyVendor ); + "by %2" ) + .arg( m_entry.m_prettyName ) + .arg( m_entry.m_prettyVendor ); break; case LicenseEntry::Type::BrowserPlugin: productDescription = tr( "%1 browser plugin
" - "by %2" ) - .arg( m_entry.m_prettyName ) - .arg( m_entry.m_prettyVendor ); + "by %2" ) + .arg( m_entry.m_prettyName ) + .arg( m_entry.m_prettyVendor ); break; case LicenseEntry::Type::Codec: productDescription = tr( "%1 codec
" - "by %2" ) - .arg( m_entry.m_prettyName ) - .arg( m_entry.m_prettyVendor ); + "by %2" ) + .arg( m_entry.m_prettyName ) + .arg( m_entry.m_prettyVendor ); break; case LicenseEntry::Type::Package: productDescription = tr( "%1 package
" - "by %2" ) - .arg( m_entry.m_prettyName ) - .arg( m_entry.m_prettyVendor ); + "by %2" ) + .arg( m_entry.m_prettyName ) + .arg( m_entry.m_prettyVendor ); break; case LicenseEntry::Type::Software: productDescription = tr( "%1
" - "by %2" ) - .arg( m_entry.m_prettyName ) - .arg( m_entry.m_prettyVendor ); + "by %2" ) + .arg( m_entry.m_prettyName ) + .arg( m_entry.m_prettyVendor ); } m_label->setText( productDescription ); updateExpandToolTip(); @@ -173,7 +174,9 @@ LicenseWidget::expandClicked() // Show/hide based on the new arrow direction. if ( m_fullText ) + { m_fullText->setHidden( m_expandLicenseButton->arrowType() == Qt::UpArrow ); + } updateExpandToolTip(); } @@ -186,21 +189,15 @@ LicenseWidget::updateExpandToolTip() { const bool isNowCollapsed = m_expandLicenseButton->arrowType() == Qt::UpArrow; - m_expandLicenseButton->setToolTip( - isNowCollapsed - ? tr( "Shows the complete license text" ) - : tr( "Hide license text" ) - ) ; - m_viewLicenseLabel->setText( - isNowCollapsed - ? tr( "Show license agreement" ) - : tr( "Hide license agreement" ) ); + m_expandLicenseButton->setToolTip( isNowCollapsed ? tr( "Shows the complete license text" ) + : tr( "Hide license text" ) ); + m_viewLicenseLabel->setText( isNowCollapsed ? tr( "Show license agreement" ) : tr( "Hide license agreement" ) ); } else { m_expandLicenseButton->setToolTip( tr( "Opens the license agreement in a browser window." ) ); - m_viewLicenseLabel->setText( tr( "View license agreement" ) - .arg( m_entry.m_url.toString() ) ); + m_viewLicenseLabel->setText( + tr( "View license agreement" ).arg( m_entry.m_url.toString() ) ); } } diff --git a/src/modules/license/LicenseWidget.h b/src/modules/license/LicenseWidget.h index c43233da4..e11d7a746 100644 --- a/src/modules/license/LicenseWidget.h +++ b/src/modules/license/LicenseWidget.h @@ -39,7 +39,7 @@ public: private: void expandClicked(); // "slot" to toggle show/hide of local license text - void viewClicked(); // "slot" to open link + void viewClicked(); // "slot" to open link void updateExpandToolTip(); LicenseEntry m_entry; @@ -47,5 +47,5 @@ private: QLabel* m_viewLicenseLabel; QToolButton* m_expandLicenseButton; QLabel* m_fullText; -} ; +}; #endif diff --git a/src/modules/locale/LocaleViewStep.cpp b/src/modules/locale/LocaleViewStep.cpp index 29006ec33..ee5c7699b 100644 --- a/src/modules/locale/LocaleViewStep.cpp +++ b/src/modules/locale/LocaleViewStep.cpp @@ -235,7 +235,7 @@ LocaleViewStep::setConfigurationMap( const QVariantMap& configurationMap ) } else { - // Optional + // Accommodate deprecated geoip configuration m_geoipUrl = CalamaresUtils::getString( configurationMap, "geoipUrl" ); m_geoipStyle = CalamaresUtils::getString( configurationMap, "geoipStyle" ); m_geoipSelector = CalamaresUtils::getString( configurationMap, "geoipSelector" ); diff --git a/src/modules/locale/locale.conf b/src/modules/locale/locale.conf index 7c2ec332c..4beb4fe85 100644 --- a/src/modules/locale/locale.conf +++ b/src/modules/locale/locale.conf @@ -23,6 +23,7 @@ zone: "New_York" # # Enable only when your Distribution is using an # custom path for locale.gen +# #localeGenPath: "PATH_TO/locale.gen" # GeoIP based Language settings: Leave commented out to disable GeoIP. @@ -78,14 +79,19 @@ zone: "New_York" # Europe/Brussels # ``` # -# To accomodate providers of GeoIP timezone data with peculiar timezone +# To accommodate providers of GeoIP timezone data with peculiar timezone # naming conventions, the following cleanups are performed automatically: # - backslashes are removed # - spaces are replaced with _ # # Legacy settings "geoipStyle", "geoipUrl" and "geoipSelector" # in the top-level are still supported, but I'd advise against. +# +# To disable GeoIP checking, either comment-out the entire geoip section, +# or set the *style* key to an unsupported format (e.g. `none`). +# Also, note the analogous feature in src/modules/welcome/welcome.conf. +# geoip: - style: "json" - url: "https://geoip.kde.org/v1/calamares" + style: "json" + url: "https://geoip.kde.org/v1/calamares" selector: "" # leave blank for the default diff --git a/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp b/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp index 292c768a9..9bcea6538 100644 --- a/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp +++ b/src/modules/luksbootkeyfile/LuksBootKeyFileJob.cpp @@ -71,7 +71,7 @@ struct LuksDevice * Given a list of partitions (as set up by the partitioning module, * so there's maps with keys inside), returns just the list of * luks passphrases for each device. - */ + */ static QList< LuksDevice > getLuksDevices( const QVariantList& list ) { @@ -130,7 +130,7 @@ static bool setupLuks( const LuksDevice& d ) { auto r = CalamaresUtils::System::instance()->targetEnvCommand( - { "cryptsetup", "luksAddKey", d.device, keyfile }, QString(), d.passphrase, 15 ); + { "cryptsetup", "luksAddKey", d.device, keyfile }, QString(), d.passphrase, std::chrono::seconds( 15 ) ); if ( r.getExitCode() != 0 ) { cWarning() << "Could not configure LUKS keyfile on" << d.device << ':' << r.getOutput() << "(exit code" diff --git a/src/modules/mount/main.py b/src/modules/mount/main.py index ed649aead..b10c5c0bf 100644 --- a/src/modules/mount/main.py +++ b/src/modules/mount/main.py @@ -37,111 +37,106 @@ _ = gettext.translation("calamares-python", def pretty_name(): return _("Mounting partitions.") - -def mount_partitions(root_mount_point, partitions): +def mount_partition(root_mount_point, partition, partitions): """ - Pass back mount point and filesystem for each partition. + Do a single mount of @p partition inside @p root_mount_point. - :param root_mount_point: - :param partitions: + The @p partitions are used to handle btrfs special-cases: + then subvolumes are created for root and home. """ - for partition in partitions: - if "mountPoint" not in partition or not partition["mountPoint"]: - continue - # Create mount point with `+` rather than `os.path.join()` because - # `partition["mountPoint"]` starts with a '/'. - raw_mount_point = partition["mountPoint"] - mount_point = root_mount_point + raw_mount_point + # Create mount point with `+` rather than `os.path.join()` because + # `partition["mountPoint"]` starts with a '/'. + raw_mount_point = partition["mountPoint"] + mount_point = root_mount_point + raw_mount_point - # Ensure that the created directory has the correct SELinux context on - # SELinux-enabled systems. - os.makedirs(mount_point, exist_ok=True) - subprocess.call(['chcon', '--reference=' + raw_mount_point, - mount_point]) + # Ensure that the created directory has the correct SELinux context on + # SELinux-enabled systems. + os.makedirs(mount_point, exist_ok=True) + subprocess.call(['chcon', '--reference=' + raw_mount_point, + mount_point]) - fstype = partition.get("fs", "").lower() + fstype = partition.get("fs", "").lower() - if fstype == "fat16" or fstype == "fat32": - fstype = "vfat" + if fstype == "fat16" or fstype == "fat32": + fstype = "vfat" + + if "luksMapperName" in partition: + libcalamares.utils.debug( + "about to mount {!s}".format(partition["luksMapperName"])) + libcalamares.utils.mount( + "/dev/mapper/{!s}".format(partition["luksMapperName"]), + mount_point, + fstype, + partition.get("options", ""), + ) + + else: + libcalamares.utils.mount(partition["device"], + mount_point, + fstype, + partition.get("options", ""), + ) + + # If the root partition is btrfs, we create a subvolume "@" + # for the root mount point. + # If a separate /home partition isn't defined, we also create + # a subvolume "@home". + # Finally we remount all of the above on the correct paths. + if fstype == "btrfs" and partition["mountPoint"] == '/': + has_home_mount_point = False + for p in partitions: + if "mountPoint" not in p or not p["mountPoint"]: + continue + if p["mountPoint"] == "/home": + has_home_mount_point = True + break + + subprocess.check_call(['btrfs', 'subvolume', 'create', + root_mount_point + '/@']) + + if not has_home_mount_point: + subprocess.check_call(['btrfs', 'subvolume', 'create', + root_mount_point + '/@home']) + + subprocess.check_call(["umount", "-v", root_mount_point]) if "luksMapperName" in partition: - libcalamares.utils.debug( - "about to mount {!s}".format(partition["luksMapperName"])) libcalamares.utils.mount( "/dev/mapper/{!s}".format(partition["luksMapperName"]), mount_point, fstype, - partition.get("options", ""), + ",".join( + ["subvol=@", partition.get("options", "")]), ) - - else: - libcalamares.utils.mount(partition["device"], - mount_point, - fstype, - partition.get("options", ""), - ) - - # If the root partition is btrfs, we create a subvolume "@" - # for the root mount point. - # If a separate /home partition isn't defined, we also create - # a subvolume "@home". - # Finally we remount all of the above on the correct paths. - if fstype == "btrfs" and partition["mountPoint"] == '/': - has_home_mount_point = False - for p in partitions: - if "mountPoint" not in p or not p["mountPoint"]: - continue - if p["mountPoint"] == "/home": - has_home_mount_point = True - break - - subprocess.check_call(['btrfs', 'subvolume', 'create', - root_mount_point + '/@']) - if not has_home_mount_point: - subprocess.check_call(['btrfs', 'subvolume', 'create', - root_mount_point + '/@home']) - - subprocess.check_call(["umount", "-v", root_mount_point]) - - if "luksMapperName" in partition: libcalamares.utils.mount( "/dev/mapper/{!s}".format(partition["luksMapperName"]), - mount_point, + root_mount_point + "/home", fstype, ",".join( - ["subvol=@", partition.get("options", "")]), + ["subvol=@home", partition.get("options", "")]), ) - if not has_home_mount_point: - libcalamares.utils.mount( - "/dev/mapper/{!s}".format(partition["luksMapperName"]), - root_mount_point + "/home", - fstype, - ",".join( - ["subvol=@home", partition.get("options", "")]), - ) - else: + else: + libcalamares.utils.mount( + partition["device"], + mount_point, + fstype, + ",".join(["subvol=@", partition.get("options", "")]), + ) + if not has_home_mount_point: libcalamares.utils.mount( partition["device"], - mount_point, + root_mount_point + "/home", fstype, - ",".join(["subvol=@", partition.get("options", "")]), + ",".join( + ["subvol=@home", partition.get("options", "")]), ) - if not has_home_mount_point: - libcalamares.utils.mount( - partition["device"], - root_mount_point + "/home", - fstype, - ",".join( - ["subvol=@home", partition.get("options", "")]), - ) def run(): """ - Define mountpoints. - - :return: + Mount all the partitions from GlobalStorage and from the job configuration. + Partitions are mounted in-lexical-order of their mountPoint. """ partitions = libcalamares.globalstorage.value("partitions") @@ -158,17 +153,19 @@ def run(): if not extra_mounts and not extra_mounts_efi: libcalamares.utils.warning("No extra mounts defined. Does mount.conf exist?") - # Sort by mount points to ensure / is mounted before the rest - partitions.sort(key=lambda x: x["mountPoint"]) - mount_partitions(root_mount_point, partitions) - mount_partitions(root_mount_point, extra_mounts) - - all_extra_mounts = extra_mounts if libcalamares.globalstorage.value("firmwareType") == "efi": - mount_partitions(root_mount_point, extra_mounts_efi) - all_extra_mounts.extend(extra_mounts_efi) + extra_mounts.extend(extra_mounts_efi) + + # Add extra mounts to the partitions list and sort by mount points. + # This way, we ensure / is mounted before the rest, and every mount point + # is created on the right partition (e.g. if a partition is to be mounted + # under /tmp, we make sure /tmp is mounted before the partition) + mountable_partitions = [ p for p in partitions + extra_mounts if "mountPoint" in p and p["mountPoint"] ] + mountable_partitions.sort(key=lambda x: x["mountPoint"]) + for partition in mountable_partitions: + mount_partition(root_mount_point, partition, partitions) libcalamares.globalstorage.insert("rootMountPoint", root_mount_point) # Remember the extra mounts for the unpackfs module - libcalamares.globalstorage.insert("extraMounts", all_extra_mounts) + libcalamares.globalstorage.insert("extraMounts", extra_mounts) diff --git a/src/modules/netinstall/NetInstallPage.cpp b/src/modules/netinstall/NetInstallPage.cpp index dfa94744d..a4f52d5b7 100644 --- a/src/modules/netinstall/NetInstallPage.cpp +++ b/src/modules/netinstall/NetInstallPage.cpp @@ -74,6 +74,9 @@ NetInstallPage::readGroups( const QByteArray& yamlData ) void NetInstallPage::dataIsHere( QNetworkReply* reply ) { + cDebug() << "NetInstall group data received" << reply->url(); + reply->deleteLater(); + // If m_required is *false* then we still say we're ready // even if the reply is corrupt or missing. if ( reply->error() != QNetworkReply::NoError ) @@ -92,7 +95,6 @@ NetInstallPage::dataIsHere( QNetworkReply* reply ) cDebug() << Logger::SubEntry << "Url: " << reply->url().toString(); cDebug() << Logger::SubEntry << "Headers: " << reply->rawHeaderList(); ui->netinst_status->setText( tr( "Network Installation. (Disabled: Received invalid groups data)" ) ); - reply->deleteLater(); emit checkReady( !m_required ); return; } @@ -101,7 +103,6 @@ NetInstallPage::dataIsHere( QNetworkReply* reply ) ui->groupswidget->header()->setSectionResizeMode( 0, QHeaderView::ResizeToContents ); ui->groupswidget->header()->setSectionResizeMode( 1, QHeaderView::Stretch ); - reply->deleteLater(); emit checkReady( true ); } @@ -120,6 +121,7 @@ NetInstallPage::selectedPackages() const void NetInstallPage::loadGroupList( const QString& confUrl ) { + cDebug() << "NetInstall loading groups from" << confUrl; QNetworkRequest request; request.setUrl( QUrl( confUrl ) ); // Follows all redirects except unsafe ones (https to http). @@ -130,7 +132,13 @@ NetInstallPage::loadGroupList( const QString& confUrl ) connect( &m_networkManager, &QNetworkAccessManager::finished, this, &NetInstallPage::dataIsHere ); - m_networkManager.get( request ); + auto* rq = m_networkManager.get( request ); + if ( rq->error() ) + { + cDebug() << Logger::Continuation << "request failed immediately," << rq->errorString(); + rq->deleteLater(); + ui->netinst_status->setText( tr( "Network Installation. (Disabled: Incorrect configuration)" ) ); + } } void diff --git a/src/modules/netinstall/README.md b/src/modules/netinstall/README.md index 6478a844e..855754822 100644 --- a/src/modules/netinstall/README.md +++ b/src/modules/netinstall/README.md @@ -1,86 +1,116 @@ # Netinstall module -The netinstall module allows distribution maintainers to ship minimal ISOs with only a basic set of preinstall packages. -At installation time, the user is presented with the choice to install groups of packages from a predefined list. +The netinstall module allows distribution maintainers to ship minimal ISOs with +only a basic set of preinstall packages. At installation time, the user is +presented with the choice to install groups of packages from a predefined list. Calamares will then invoke the correct backend to install the packages. -## Configuration of the packages -Every distribution can choose which groups to display and which packages should be in the groups. +## Module Configuration -The *netinstall.conf* file should have this format: +The `netinstall.conf` file is self-describing, and at the very +lease should contain a *groupsUrl* key: +``` ---- groupsUrl: +``` -The URL must point to a YAML file. Here is a short example of how the YAML file should look. +The URL must point to a YAML file, the *groups* file. See below for +the format of that groups file. The URL may be a local file. - - name: "Group name" - description: "Description of the group" - packages: - - lsb-release - - avahi - - grub - - name: "Second group name" + +## Groups Configuration + + Here is a short example +of how the YAML file should look. + +``` + - name: "Group name" + description: "Description of the group" + packages: + - lsb-release + - avahi + - grub + - name: "Second group name" ... +``` -The file is composed of a list of entry, each describing one group. The keys *name*, *description* and *packages* are required. +The file is composed of a list of entries, each describing one group. The +keys *name*, *description* and *packages* are required for each group. -More keys are supported: +More keys (per group) are supported: - - hidden: if true, do not show the group on the page. Defaults to false. - - selected: if true, display the group as selected. Defaults to false. - - critical: if true, make the installation process fail if installing - any of the packages in the group fails. Otherwise, just log a warning. - Defaults to false. - - subgroups: if present this follows the same structure as the top level - of the YAML file, allowing there to be sub-groups of packages to an - arbitary depth - - pre-install: an optional command to run within the new system before - the group's packages are installed. It will run before each package in - the group is installed. - - post-install: an optional command to run within the new system after - the group's packages are installed. It will run after each package in - the group is installed. + - *hidden*: if true, do not show the group on the page. Defaults to false. + - *selected*: if true, display the group as selected. Defaults to false. + - critical*: if true, make the installation process fail if installing + any of the packages in the group fails. Otherwise, just log a warning. + Defaults to false. + - *subgroups*: if present this follows the same structure as the top level + of the YAML file, allowing there to be sub-groups of packages to an + arbitary depth + - *pre-install*: an optional command to run within the new system before + the group's packages are installed. It will run before each package in + the group is installed. + - *post-install*: an optional command to run within the new system after + the group's packages are installed. It will run after each package in + the group is installed. -If you set both *hidden* and *selected* for a group, you are basically creating a "default" group of packages -which will always be installed in the user's system. +If you set both *hidden* and *selected* for a group, you are basically creating +a "default" group of packages which will always be installed in the user's +system. -## Configuration of the module +> The note below applies to Calamares up-to-and-including 3.2.13, but will +> change in a later release. -Here is the set of instructions to have the module work in your Calamares. As of July 2016, this has been successfully -tested using the live installation of Chakra Fermi. +The *pre-install* and *post-install* commands are **not** passed to +a shell; see the **packages** module configuration (i.e. `packages.conf`) +for details. To use a full shell pipeline, call the shell explicitly. -First, if the module is used, we need to require a working Internet connection, otherwise the module will be -unable to fetch the package groups and to perform the installation. Requirements for the Calamares instance -are configured in the **welcome.conf** file (configuration for the **welcome** module). Make sure *internet* -is listed below *required*. -In the *settings.conf* file, decide where the **netinstall** page should be displayed. I put it just after the -**welcome** page, but any position between that and just before **partition** should make no difference. -If not present, add the **packages** job in the **exec** list. This is the job that calls the package manager -to install packages. Make sure it is configured to use the correct package manager for your distribution; this -is configured in src/modules/packages/packages.conf. +## Overall Configuration -The **exec** list in *settings.conf* should contain the following items in +Here is the set of instructions to have the module work in your Calamares. + +First, if the module is used, we need to require a working Internet connection, +otherwise the module will be unable to fetch the package groups and to perform +the installation. Requirements for the Calamares instance are configured in the +`welcome.conf` file (configuration for the **welcome** module). Make sure +*internet* is listed under the *required* checks. + +In the `settings.conf` file, decide where the **netinstall** page should be +displayed. I put it just after the **welcome** page, but any position between +that and just before **partition** should make no difference. + +If not present, add the **packages** job in the *exec* list. This is the job +that calls the package manager to install packages. Make sure it is configured +to use the correct package manager for your distribution; this is configured in +`packages.conf`. + +The *exec* list in `settings.conf` should contain the following items in order (it's ok for other jobs to be listed inbetween them, though): +``` - unpackfs - networkcfg - packages +``` -**unpackfs** creates the chroot where the installation is performed, and unpacks the root image with the filesystem -structure; **networkcfg** set ups a working network in the chroot; and finally **packages** can install packages -in the chroot. +**unpackfs** creates the chroot where the installation is performed, and unpacks +the root image with the filesystem structure; **networkcfg** set ups a working +network in the chroot; and finally **packages** can install packages in the +chroot. ## Common issues -If launching the package manager command returns you negative exit statuses and nothing is actually invoked, this -is likely an error in the setup of the chroot; check that the parameter **rootMountPoint** is set to the correct -value in the Calamares configuration. +If launching the package manager command returns you negative exit statuses and +nothing is actually invoked, this is likely an error in the setup of the chroot; +check that the parameter **rootMountPoint** is set to the correct value in the +Calamares configuration. -If the command is run, but exits with error, check that the network is working in the chroot. Make sure /etc/resolv.conf -exists and that it's not empty. +If the command is run, but exits with error, check that the network is +working in the chroot. Make sure `/etc/resolv.conf` exists and that +it's not empty. diff --git a/src/modules/netinstall/netinstall.conf b/src/modules/netinstall/netinstall.conf index fe99eb2be..fd59c24c6 100644 --- a/src/modules/netinstall/netinstall.conf +++ b/src/modules/netinstall/netinstall.conf @@ -4,6 +4,13 @@ # groupsUrl: http://example.org/netinstall.php # or it can be a locally installed file: # groupsUrl: file:///usr/share/calamares/netinstall.yaml +# +# Note that the contents of the groups file is the **important** +# part of the configuration of this module. It specifies what +# the user may select and what commands are to be run. +# +# The format of the groups file is documented in `README.md`. +# # groupsUrl: file:///usr/share/calamares/netinstall.yaml # If the installation can proceed without netinstall (e.g. the Live CD diff --git a/src/modules/netinstall/netinstall.yaml b/src/modules/netinstall/netinstall.yaml index 8e9037f4d..e00f06c73 100644 --- a/src/modules/netinstall/netinstall.yaml +++ b/src/modules/netinstall/netinstall.yaml @@ -1,3 +1,7 @@ +# Example configuration with groups and packages, taken from Chakra Linux. +# +# This example is rather limited. See `README.md` for full documentation +# on the configuration format. - name: "Default" description: "Default group" hidden: true diff --git a/src/modules/officechooser/CMakeLists.txt b/src/modules/officechooser/CMakeLists.txt new file mode 100644 index 000000000..59e3e928a --- /dev/null +++ b/src/modules/officechooser/CMakeLists.txt @@ -0,0 +1,45 @@ +find_package( Qt5 COMPONENTS Core Gui Widgets REQUIRED ) +set( _extra_libraries "" ) + +### OPTIONAL AppData XML support in PackageModel +# +# +find_package(Qt5 COMPONENTS Xml) +if ( Qt5Xml_FOUND ) + add_definitions( -DHAVE_XML ) + list( APPEND _extra_libraries Qt5::Xml ) +endif() + + +calamares_add_plugin( officechooser + TYPE viewmodule + EXPORT_MACRO PLUGINDLLEXPORT_PRO + SOURCES + PackageChooserPage.cpp + PackageChooserViewStep.cpp + PackageModel.cpp + RESOURCES + packagechooser.qrc + UI + page_package.ui + LINK_PRIVATE_LIBRARIES + calamaresui + ${_extra_libraries} + SHARED_LIB +) + +if( ECM_FOUND AND BUILD_TESTING ) + ecm_add_test( + Tests.cpp + TEST_NAME + packagechoosertest + LINK_LIBRARIES + ${CALAMARES_LIBRARIES} + calamares_viewmodule_officechooser + Qt5::Core + Qt5::Test + Qt5::Gui + ${_extra_libraries} + ) + calamares_automoc( packagechoosertest) +endif() diff --git a/src/modules/officechooser/PackageChooserPage.cpp b/src/modules/officechooser/PackageChooserPage.cpp new file mode 100644 index 000000000..37c1a2156 --- /dev/null +++ b/src/modules/officechooser/PackageChooserPage.cpp @@ -0,0 +1,144 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * Copyright 2019, Philip MÜller + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "PackageChooserPage.h" + +#include "ui_page_package.h" + +#include "utils/Logger.h" +#include "utils/Retranslator.h" + +#include + +PackageChooserPage::PackageChooserPage( PackageChooserMode mode, QWidget* parent ) + : QWidget( parent ) + , ui( new Ui::PackageChooserPage ) + , m_introduction( QString(), + QString(), + tr( "Office Suite" ), + tr( "Please pick an office suite from the list. The selected product will be installed." ) ) +{ + m_introduction.screenshot = QPixmap( QStringLiteral( ":/images/choose-office.jpg" ) ); + + ui->setupUi( this ); + CALAMARES_RETRANSLATE( updateLabels(); ) + + switch ( mode ) + { + case PackageChooserMode::Optional: + FALLTHRU; + case PackageChooserMode::Required: + ui->products->setSelectionMode( QAbstractItemView::SingleSelection ); + break; + case PackageChooserMode::OptionalMultiple: + FALLTHRU; + case PackageChooserMode::RequiredMultiple: + ui->products->setSelectionMode( QAbstractItemView::ExtendedSelection ); + } +} + +void +PackageChooserPage::currentChanged( const QModelIndex& index ) +{ + if ( !index.isValid() || !ui->products->selectionModel()->hasSelection() ) + { + ui->productName->setText( m_introduction.name.get() ); + ui->productScreenshot->setPixmap( m_introduction.screenshot ); + ui->productDescription->setText( m_introduction.description.get() ); + } + else + { + const auto* model = ui->products->model(); + + ui->productName->setText( model->data( index, PackageListModel::NameRole ).toString() ); + ui->productScreenshot->setPixmap( model->data( index, PackageListModel::ScreenshotRole ).value< QPixmap >() ); + ui->productDescription->setText( model->data( index, PackageListModel::DescriptionRole ).toString() ); + } +} + +void +PackageChooserPage::updateLabels() +{ + if ( ui && ui->products && ui->products->selectionModel() ) + { + currentChanged( ui->products->selectionModel()->currentIndex() ); + } + else + { + currentChanged( QModelIndex() ); + } + emit selectionChanged(); +} + +void +PackageChooserPage::setModel( QAbstractItemModel* model ) +{ + ui->products->setModel( model ); + + // Check if any of the items in the model is the "none" option. + // If so, copy its values into the introduction / none item. + for ( int r = 0; r < model->rowCount(); ++r ) + { + auto index = model->index( r, 0 ); + if ( index.isValid() ) + { + QVariant v = model->data( index, PackageListModel::IdRole ); + if ( v.isValid() && v.toString().isEmpty() ) + { + m_introduction.name = model->data( index, PackageListModel::NameRole ).toString(); + m_introduction.description = model->data( index, PackageListModel::DescriptionRole ).toString(); + m_introduction.screenshot = model->data( index, PackageListModel::ScreenshotRole ).value< QPixmap >(); + currentChanged( QModelIndex() ); + break; + } + } + } + + connect( ui->products->selectionModel(), + &QItemSelectionModel::selectionChanged, + this, + &PackageChooserPage::updateLabels ); +} + +bool +PackageChooserPage::hasSelection() const +{ + return ui && ui->products && ui->products->selectionModel() && ui->products->selectionModel()->hasSelection(); +} + +QStringList +PackageChooserPage::selectedPackageIds() const +{ + if ( !( ui && ui->products && ui->products->selectionModel() ) ) + { + return QStringList(); + } + + const auto* model = ui->products->model(); + QStringList ids; + for ( const auto& index : ui->products->selectionModel()->selectedIndexes() ) + { + QString pid = model->data( index, PackageListModel::IdRole ).toString(); + if ( !pid.isEmpty() ) + { + ids.append( pid ); + } + } + return ids; +} diff --git a/src/modules/officechooser/PackageChooserPage.h b/src/modules/officechooser/PackageChooserPage.h new file mode 100644 index 000000000..401de903b --- /dev/null +++ b/src/modules/officechooser/PackageChooserPage.h @@ -0,0 +1,60 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef PACKAGECHOOSERPAGE_H +#define PACKAGECHOOSERPAGE_H + +#include "PackageModel.h" + +#include +#include + +namespace Ui +{ +class PackageChooserPage; +} + +class PackageChooserPage : public QWidget +{ + Q_OBJECT +public: + explicit PackageChooserPage( PackageChooserMode mode, QWidget* parent = nullptr ); + + void setModel( QAbstractItemModel* model ); + + /// @brief Is anything selected? + bool hasSelection() const; + /** @brief Get the list of selected ids + * + * This list may be empty (if none is selected). + */ + QStringList selectedPackageIds() const; + +public slots: + void currentChanged( const QModelIndex& index ); + void updateLabels(); + +signals: + void selectionChanged(); + +private: + Ui::PackageChooserPage* ui; + PackageItem m_introduction; +}; + +#endif // PACKAGECHOOSERPAGE_H diff --git a/src/modules/officechooser/PackageChooserViewStep.cpp b/src/modules/officechooser/PackageChooserViewStep.cpp new file mode 100644 index 000000000..5443992c5 --- /dev/null +++ b/src/modules/officechooser/PackageChooserViewStep.cpp @@ -0,0 +1,240 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * Copyright 2019, Philip MÜller + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "PackageChooserViewStep.h" + +#include "PackageChooserPage.h" +#include "PackageModel.h" + +#include "GlobalStorage.h" +#include "JobQueue.h" + +#include "utils/CalamaresUtilsSystem.h" +#include "utils/Logger.h" +#include "utils/Variant.h" + +#include +#include + +CALAMARES_PLUGIN_FACTORY_DEFINITION( PackageChooserViewStepFactory, registerPlugin< PackageChooserViewStep >(); ) + +PackageChooserViewStep::PackageChooserViewStep( QObject* parent ) + : Calamares::ViewStep( parent ) + , m_widget( nullptr ) + , m_model( nullptr ) + , m_mode( PackageChooserMode::Required ) +{ + emit nextStatusChanged( false ); +} + + +PackageChooserViewStep::~PackageChooserViewStep() +{ + if ( m_widget && m_widget->parent() == nullptr ) + { + m_widget->deleteLater(); + } + delete m_model; +} + + +QString +PackageChooserViewStep::prettyName() const +{ + return tr( "Office Suite" ); +} + + +QWidget* +PackageChooserViewStep::widget() +{ + if ( !m_widget ) + { + m_widget = new PackageChooserPage( m_mode, nullptr ); + connect( m_widget, &PackageChooserPage::selectionChanged, [=]() { + emit nextStatusChanged( this->isNextEnabled() ); + } ); + + if ( m_model ) + { + hookupModel(); + } + else + { + cWarning() << "OfficeChooser Widget created before model."; + } + } + return m_widget; +} + + +bool +PackageChooserViewStep::isNextEnabled() const +{ + if ( !m_model ) + { + return false; + } + + if ( !m_widget ) + { + // No way to have changed anything + return true; + } + + switch ( m_mode ) + { + case PackageChooserMode::Optional: + case PackageChooserMode::OptionalMultiple: + // zero or one OR zero or more + return true; + case PackageChooserMode::Required: + case PackageChooserMode::RequiredMultiple: + // exactly one OR one or more + return m_widget->hasSelection(); + } + + NOTREACHED return true; +} + + +bool +PackageChooserViewStep::isBackEnabled() const +{ + return true; +} + + +bool +PackageChooserViewStep::isAtBeginning() const +{ + return true; +} + + +bool +PackageChooserViewStep::isAtEnd() const +{ + return true; +} + + +void +PackageChooserViewStep::onLeave() +{ + QString key = QStringLiteral( "packagechooser_%1" ).arg( m_id ); + QString value; + if ( m_widget->hasSelection() ) + { + value = m_widget->selectedPackageIds().join( ',' ); + } + Calamares::JobQueue::instance()->globalStorage()->insert( key, value ); + + cDebug() << "OfficeChooser" << key << "selected" << value; +} + +Calamares::JobList +PackageChooserViewStep::jobs() const +{ + Calamares::JobList l; + return l; +} + +void +PackageChooserViewStep::setConfigurationMap( const QVariantMap& configurationMap ) +{ + QString mode = CalamaresUtils::getString( configurationMap, "mode" ); + bool ok = false; + if ( !mode.isEmpty() ) + { + m_mode = roleNames().find( mode, ok ); + } + if ( !ok ) + { + m_mode = PackageChooserMode::Required; + } + + m_id = CalamaresUtils::getString( configurationMap, "id" ); + if ( m_id.isEmpty() ) + { + // Not set, so use the instance id + // TODO: use a stronger type than QString for structured IDs + m_id = moduleInstanceKey().split( '@' ).last(); + } + + bool first_time = !m_model; + if ( configurationMap.contains( "items" ) ) + { + fillModel( configurationMap.value( "items" ).toList() ); + } + + if ( first_time && m_widget && m_model ) + { + hookupModel(); + } +} + +void +PackageChooserViewStep::fillModel( const QVariantList& items ) +{ + if ( !m_model ) + { + m_model = new PackageListModel( nullptr ); + } + + if ( items.isEmpty() ) + { + cWarning() << "No *items* for OfficeChooser module."; + return; + } + + cDebug() << "Loading OfficeChooser model items from config"; + int item_index = 0; + for ( const auto& item_it : items ) + { + ++item_index; + QVariantMap item_map = item_it.toMap(); + if ( item_map.isEmpty() ) + { + cWarning() << "OfficeChooser entry" << item_index << "is not valid."; + continue; + } + + if ( item_map.contains( "appdata" ) ) + { + m_model->addPackage( PackageItem::fromAppData( item_map ) ); + } + else + { + m_model->addPackage( PackageItem( item_map ) ); + } + } +} + +void +PackageChooserViewStep::hookupModel() +{ + if ( !m_model || !m_widget ) + { + cError() << "Can't hook up model until widget and model both exist."; + return; + } + + m_widget->setModel( m_model ); +} diff --git a/src/modules/officechooser/PackageChooserViewStep.h b/src/modules/officechooser/PackageChooserViewStep.h new file mode 100644 index 000000000..e3ffc1d5b --- /dev/null +++ b/src/modules/officechooser/PackageChooserViewStep.h @@ -0,0 +1,72 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef PACKAGECHOOSERVIEWSTEP_H +#define PACKAGECHOOSERVIEWSTEP_H + +#include "PluginDllMacro.h" +#include "utils/PluginFactory.h" +#include "viewpages/ViewStep.h" + +#include "PackageModel.h" + +#include +#include +#include + +class PackageChooserPage; + +class PLUGINDLLEXPORT PackageChooserViewStep : public Calamares::ViewStep +{ + Q_OBJECT + +public: + explicit PackageChooserViewStep( QObject* parent = nullptr ); + virtual ~PackageChooserViewStep() override; + + QString prettyName() const override; + + QWidget* widget() override; + + bool isNextEnabled() const override; + bool isBackEnabled() const override; + + bool isAtBeginning() const override; + bool isAtEnd() const override; + + void onLeave() override; + + Calamares::JobList jobs() const override; + + void setConfigurationMap( const QVariantMap& configurationMap ) override; + +private: + void fillModel( const QVariantList& items ); + void hookupModel(); + + PackageChooserPage* m_widget; + PackageListModel* m_model; + + // Configuration + PackageChooserMode m_mode; + QString m_id; +}; + +CALAMARES_PLUGIN_FACTORY_DECLARATION( PackageChooserViewStepFactory ) + +#endif // PACKAGECHOOSERVIEWSTEP_H diff --git a/src/modules/officechooser/PackageModel.cpp b/src/modules/officechooser/PackageModel.cpp new file mode 100644 index 000000000..59c6973ba --- /dev/null +++ b/src/modules/officechooser/PackageModel.cpp @@ -0,0 +1,374 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "PackageModel.h" + +#include "utils/Logger.h" +#include "utils/Variant.h" + +#ifdef HAVE_XML +#include +#include +#include +#endif + +const NamedEnumTable< PackageChooserMode >& +roleNames() +{ + static const NamedEnumTable< PackageChooserMode > names { + { "optional", PackageChooserMode::Optional }, + { "required", PackageChooserMode::Required }, + { "optionalmultiple", PackageChooserMode::OptionalMultiple }, + { "requiredmultiple", PackageChooserMode::RequiredMultiple }, + // and a bunch of aliases + { "zero-or-one", PackageChooserMode::Optional }, + { "radio", PackageChooserMode::Required }, + { "one", PackageChooserMode::Required }, + { "set", PackageChooserMode::OptionalMultiple }, + { "zero-or-more", PackageChooserMode::OptionalMultiple }, + { "multiple", PackageChooserMode::RequiredMultiple }, + { "one-or-more", PackageChooserMode::RequiredMultiple } + }; + return names; +} + +PackageItem::PackageItem() {} + +PackageItem::PackageItem( const QString& a_id, + const QString& a_package, + const QString& a_name, + const QString& a_description ) + : id( a_id ) + , package( a_package ) + , name( a_name ) + , description( a_description ) +{ +} + +PackageItem::PackageItem( const QString& a_id, + const QString& a_package, + const QString& a_name, + const QString& a_description, + const QString& screenshotPath ) + : id( a_id ) + , package( a_package ) + , name( a_name ) + , description( a_description ) + , screenshot( screenshotPath ) +{ +} + +PackageItem::PackageItem::PackageItem( const QVariantMap& item_map ) + : id( CalamaresUtils::getString( item_map, "id" ) ) + , package( CalamaresUtils::getString( item_map, "package" ) ) + , name( CalamaresUtils::Locale::TranslatedString( item_map, "name" ) ) + , description( CalamaresUtils::Locale::TranslatedString( item_map, "description" ) ) + , screenshot( CalamaresUtils::getString( item_map, "screenshot" ) ) +{ + if ( name.isEmpty() && id.isEmpty() ) + { + name = QObject::tr( "No product" ); + } + else if ( name.isEmpty() ) + { + cWarning() << "PackageChooser item" << id << "has an empty name."; + } + if ( description.isEmpty() ) + { + description = QObject::tr( "No description provided." ); + } +} + +#ifdef HAVE_XML +/** @brief try to load the given @p fileName XML document + * + * Returns a QDomDocument, which will be valid iff the file can + * be read and contains valid XML data. + */ +static inline QDomDocument +loadAppData( const QString& fileName ) +{ + QFile file( fileName ); + if ( !file.open( QIODevice::ReadOnly ) ) + { + return QDomDocument(); + } + QDomDocument doc( "AppData" ); + if ( !doc.setContent( &file ) ) + { + file.close(); + return QDomDocument(); + } + file.close(); + return doc; +} + +/** @brief gets the text of child element @p tagName + */ +static inline QString +getChildText( const QDomNode& n, const QString& tagName ) +{ + QDomElement e = n.firstChildElement( tagName ); + return e.isNull() ? QString() : e.text(); +} + +/** @brief Gets a suitable screenshot path + * + * The element contains zero or more + * elements, which can have a *type* associated with them. + * Scan the screenshot elements, return the path + * for the one labeled with type=default or, if there is no + * default, the first element. + */ +static inline QString +getScreenshotPath( const QDomNode& n ) +{ + QDomElement shotsNode = n.firstChildElement( "screenshots" ); + if ( shotsNode.isNull() ) + { + return QString(); + } + + const QDomNodeList shotList = shotsNode.childNodes(); + int firstScreenshot = -1; // Use which screenshot node? + for ( int i = 0; i < shotList.count(); ++i ) + { + if ( !shotList.at( i ).isElement() ) + { + continue; + } + QDomElement e = shotList.at( i ).toElement(); + if ( e.tagName() != "screenshot" ) + { + continue; + } + // If none has the "type=default" attribute, use the first one + if ( firstScreenshot < 0 ) + { + firstScreenshot = i; + } + // But type=default takes precedence. + if ( e.hasAttribute( "type" ) && e.attribute( "type" ) == "default" ) + { + firstScreenshot = i; + break; + } + } + + if ( firstScreenshot >= 0 ) + { + return shotList.at( firstScreenshot ).firstChildElement( "image" ).text(); + } + + return QString(); +} + +/** @brief Returns language of the given element @p e + * + * Transforms the attribute value for xml:lang to something + * suitable for TranslatedString (e.g. [lang]). + */ +static inline QString +getLanguage( const QDomElement& e ) +{ + QString language = e.attribute( "xml:lang" ); + if ( !language.isEmpty() ) + { + language.replace( '-', '_' ); + language.prepend( '[' ); + language.append( ']' ); + } + return language; +} + +/** @brief Scan the list of @p children for @p tagname elements and add them to the map + * + * Uses @p mapname instead of @p tagname for the entries in map @p m + * to allow renaming from XML to map keys (in particular for + * TranslatedString). Also transforms xml:lang attributes to suitable + * key-decorations on @p mapname. + */ +static inline void +fillMap( QVariantMap& m, const QDomNodeList& children, const QString& tagname, const QString& mapname ) +{ + for ( int i = 0; i < children.count(); ++i ) + { + if ( !children.at( i ).isElement() ) + { + continue; + } + + QDomElement e = children.at( i ).toElement(); + if ( e.tagName() != tagname ) + { + continue; + } + + m[ mapname + getLanguage( e ) ] = e.text(); + } +} + +/** @brief gets the and elements +* +* Builds up a map of the elements (which may have a *lang* +* attribute to indicate translations and paragraphs of the +* element (also with lang). Uses the +* elements to supplement the description if no description +* is available for a given language. +* +* Returns a map with keys suitable for use by TranslatedString. +*/ +static inline QVariantMap +getNameAndSummary( const QDomNode& n ) +{ + QVariantMap m; + + const QDomNodeList children = n.childNodes(); + fillMap( m, children, "name", "name" ); + fillMap( m, children, "summary", "description" ); + + const QDomElement description = n.firstChildElement( "description" ); + if ( !description.isNull() ) + { + fillMap( m, description.childNodes(), "p", "description" ); + } + + return m; +} +#endif + +PackageItem +PackageItem::fromAppData( const QVariantMap& item_map ) +{ +#ifdef HAVE_XML + QString fileName = CalamaresUtils::getString( item_map, "appdata" ); + if ( fileName.isEmpty() ) + { + cWarning() << "Can't load AppData without a suitable key."; + return PackageItem(); + } + cDebug() << "Loading AppData XML from" << fileName; + + QDomDocument doc = loadAppData( fileName ); + if ( doc.isNull() ) + { + return PackageItem(); + } + + QDomElement componentNode = doc.documentElement(); + if ( !componentNode.isNull() && componentNode.tagName() == "component" ) + { + // An "id" entry in the Calamares config overrides ID in the AppData + QString id = CalamaresUtils::getString( item_map, "id" ); + if ( id.isEmpty() ) + { + id = getChildText( componentNode, "id" ); + } + if ( id.isEmpty() ) + { + return PackageItem(); + } + + // A "screenshot" entry in the Calamares config overrides AppData + QString screenshotPath = CalamaresUtils::getString( item_map, "screenshot" ); + if ( screenshotPath.isEmpty() ) + { + screenshotPath = getScreenshotPath( componentNode ); + } + + QVariantMap map = getNameAndSummary( componentNode ); + map.insert( "id", id ); + map.insert( "screenshot", screenshotPath ); + + return PackageItem( map ); + } + + return PackageItem(); +#else + cWarning() << "Loading AppData XML is not supported."; + + return PackageItem(); +#endif +} + + +PackageListModel::PackageListModel( QObject* parent ) + : QAbstractListModel( parent ) +{ +} + +PackageListModel::PackageListModel( PackageList&& items, QObject* parent ) + : QAbstractListModel( parent ) + , m_packages( std::move( items ) ) +{ +} + +PackageListModel::~PackageListModel() {} + +void +PackageListModel::addPackage( PackageItem&& p ) +{ + // Only add valid packages + if ( p.isValid() ) + { + int c = m_packages.count(); + beginInsertRows( QModelIndex(), c, c ); + m_packages.append( p ); + endInsertRows(); + } +} + +int +PackageListModel::rowCount( const QModelIndex& index ) const +{ + // For lists, valid indexes have zero children; only the root index has them + return index.isValid() ? 0 : m_packages.count(); +} + +QVariant +PackageListModel::data( const QModelIndex& index, int role ) const +{ + if ( !index.isValid() ) + { + return QVariant(); + } + int row = index.row(); + if ( row >= m_packages.count() || row < 0 ) + { + return QVariant(); + } + + if ( role == Qt::DisplayRole /* Also PackageNameRole */ ) + { + return m_packages[ row ].name.get(); + } + else if ( role == DescriptionRole ) + { + return m_packages[ row ].description.get(); + } + else if ( role == ScreenshotRole ) + { + return m_packages[ row ].screenshot; + } + else if ( role == IdRole ) + { + return m_packages[ row ].id; + } + + return QVariant(); +} diff --git a/src/modules/officechooser/PackageModel.h b/src/modules/officechooser/PackageModel.h new file mode 100644 index 000000000..869e124f0 --- /dev/null +++ b/src/modules/officechooser/PackageModel.h @@ -0,0 +1,128 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef PACKAGEMODEL_H +#define PACKAGEMODEL_H + +#include "locale/TranslatableConfiguration.h" +#include "utils/NamedEnum.h" + +#include +#include +#include +#include + +enum class PackageChooserMode +{ + Optional, // zero or one + Required, // exactly one + OptionalMultiple, // zero or more + RequiredMultiple // one or more +}; + +const NamedEnumTable< PackageChooserMode >& roleNames(); + +struct PackageItem +{ + QString id; + // FIXME: unused + QString package; + CalamaresUtils::Locale::TranslatedString name; + CalamaresUtils::Locale::TranslatedString description; + QPixmap screenshot; + + /// @brief Create blank PackageItem + PackageItem(); + /** @brief Creates a PackageItem from given strings + * + * This constructor sets all the text members, + * but leaves the screenshot blank. Set that separately. + */ + PackageItem( const QString& id, const QString& package, const QString& name, const QString& description ); + + /** @brief Creates a PackageItem from given strings. + * + * Set all the text members and load the screenshot from the given + * @p screenshotPath, which may be a QRC path (:/path/in/qrc) or + * a filesystem path, whatever QPixmap understands. + */ + PackageItem( const QString& id, + const QString& package, + const QString& name, + const QString& description, + const QString& screenshotPath ); + + /** @brief Creates a PackageItem from a QVariantMap + * + * This is intended for use when loading PackageItems from a + * configuration map. It will look up the various keys in the map + * and handle translation strings as well. + */ + PackageItem( const QVariantMap& map ); + + /** @brief Is this item valid? + * + * A valid item has an untranslated name available. + */ + bool isValid() const { return !name.isEmpty(); } + + /** @brief Loads an AppData XML file and returns a PackageItem + * + * The @p map must have a key *appdata*. That is used as the + * primary source of information, but keys *id* and *screenshotPath* + * may be used to override parts of the AppData -- so that the + * ID is under the control of Calamares, and the screenshot can be + * forced to a local path available on the installation medium. + * + * Requires XML support in libcalamares, if not present will + * return invalid PackageItems. + */ + static PackageItem fromAppData( const QVariantMap& map ); +}; + +using PackageList = QVector< PackageItem >; + +class PackageListModel : public QAbstractListModel +{ +public: + PackageListModel( PackageList&& items, QObject* parent ); + PackageListModel( QObject* parent ); + virtual ~PackageListModel() override; + + /** @brief Add a package @p to the model + * + * Only valid packages are added -- that is, they must have a name. + */ + void addPackage( PackageItem&& p ); + + int rowCount( const QModelIndex& index ) const override; + QVariant data( const QModelIndex& index, int role ) const override; + + enum Roles : int + { + NameRole = Qt::DisplayRole, + DescriptionRole = Qt::UserRole, + ScreenshotRole, + IdRole + }; + +private: + PackageList m_packages; +}; + +#endif diff --git a/src/modules/officechooser/Tests.cpp b/src/modules/officechooser/Tests.cpp new file mode 100644 index 000000000..537ecbd3c --- /dev/null +++ b/src/modules/officechooser/Tests.cpp @@ -0,0 +1,87 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "Tests.h" + +#include "PackageModel.h" + +#include "utils/Logger.h" + +#include + +QTEST_MAIN( PackageChooserTests ) + +PackageChooserTests::PackageChooserTests() {} + +PackageChooserTests::~PackageChooserTests() {} + +void +PackageChooserTests::initTestCase() +{ + Logger::setupLogLevel( Logger::LOGDEBUG ); +} + +void +PackageChooserTests::testBogus() +{ + QVERIFY( true ); +} + +void +PackageChooserTests::testAppData() +{ + // Path from the build-dir and from the running-the-test varies, + // for in-source build, for build/, and for tests-in-build/, + // so look in multiple places. + QString appdataName( "io.calamares.calamares.appdata.xml" ); + for ( const auto& prefix : QStringList { "", "../", "../../../", "../../../../" } ) + { + if ( QFile::exists( prefix + appdataName ) ) + { + appdataName = prefix + appdataName; + break; + } + } + QVERIFY( QFile::exists( appdataName ) ); + + QVariantMap m; + m.insert( "appdata", appdataName ); + + PackageItem p1 = PackageItem::fromAppData( m ); +#ifdef HAVE_XML + QVERIFY( p1.isValid() ); + QCOMPARE( p1.id, "io.calamares.calamares.desktop" ); + QCOMPARE( p1.name.get(), "Calamares" ); + // The entry has precedence + QCOMPARE( p1.description.get(), "Calamares is an installer program for Linux distributions." ); + // .. but en_GB doesn't have an entry in description, so uses + QCOMPARE( p1.description.get( QLocale( "en_GB" ) ), "Calamares Linux Installer" ); + QCOMPARE( p1.description.get( QLocale( "nl" ) ), "Calamares is een installatieprogramma voor Linux distributies." ); + QVERIFY( p1.screenshot.isNull() ); + + m.insert( "id", "calamares" ); + m.insert( "screenshot", ":/images/calamares.png" ); + PackageItem p2 = PackageItem::fromAppData( m ); + QVERIFY( p2.isValid() ); + QCOMPARE( p2.id, "calamares" ); + QCOMPARE( p2.description.get( QLocale( "nl" ) ), "Calamares is een installatieprogramma voor Linux distributies." ); + QVERIFY( !p2.screenshot.isNull() ); +#else + QVERIFY( !p1.isValid() ); +#endif +} diff --git a/src/modules/officechooser/Tests.h b/src/modules/officechooser/Tests.h new file mode 100644 index 000000000..62efe92cc --- /dev/null +++ b/src/modules/officechooser/Tests.h @@ -0,0 +1,37 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef PACKAGECHOOSERTESTS_H +#define PACKAGECHOOSERTESTS_H + +#include + +class PackageChooserTests : public QObject +{ + Q_OBJECT +public: + PackageChooserTests(); + ~PackageChooserTests() override; + +private Q_SLOTS: + void initTestCase(); + void testBogus(); + void testAppData(); +}; + +#endif diff --git a/src/modules/officechooser/images/FreeOffice.jpg b/src/modules/officechooser/images/FreeOffice.jpg new file mode 100644 index 000000000..205d5abc3 Binary files /dev/null and b/src/modules/officechooser/images/FreeOffice.jpg differ diff --git a/src/modules/officechooser/images/LibreOffice.jpg b/src/modules/officechooser/images/LibreOffice.jpg new file mode 100644 index 000000000..bc4472f4d Binary files /dev/null and b/src/modules/officechooser/images/LibreOffice.jpg differ diff --git a/src/modules/officechooser/images/choose-office.jpg b/src/modules/officechooser/images/choose-office.jpg new file mode 100644 index 000000000..98526400d Binary files /dev/null and b/src/modules/officechooser/images/choose-office.jpg differ diff --git a/src/modules/officechooser/officechooser.conf b/src/modules/officechooser/officechooser.conf new file mode 100644 index 000000000..5c4b99329 --- /dev/null +++ b/src/modules/officechooser/officechooser.conf @@ -0,0 +1,79 @@ +# Configuration for the low-density software chooser +--- +# The packagechooser writes a GlobalStorage value for the choice that +# has been made. The key is *packagechooser_*. If *id* is set here, +# it is substituted into the key name. If it is not set, the module's +# instance name is used; see the *instances* section of `settings.conf`. +# If there is just one packagechooser module, and no *id* is set, +# resulting GS key is probably *packagechooser_packagechooser*. +# +# The GS value is a comma-separated list of the IDs of the selected +# packages, or an empty string if none is selected. +# +# id: "" + +# Software selection mode, to set whether the software packages +# can be chosen singly, or multiply. +# +# Possible modes are "optional", "required" (for zero or one) +# or "optionalmultiple", "requiredmultiple" (for zero-or-more +# or one-or-more). +mode: required + +# Items to display in the chooser. In general, this should be a +# pretty short list to avoid overwhelming the UI. This is a list +# of objects, and the items are displayed in list order. +# +# Either provide the data for an item in the list (using the keys +# below), or use existing AppData XML files as a source for the data. +# +# For data provided by the list: the item has an id, which is used in +# setting the value of *packagechooser_*). The following fields +# are mandatory: +# +# - *id* ID for the product. The ID "" is special, and is used for +# "no package selected". Only include this if the mode allows +# selecting none. +# - *package* Package name for the product. While mandatory, this is +# not actually used anywhere. +# - *name* Human-readable name of the product. To provide translations, +# add a *[lang]* decoration as part of the key name, e.g. `name[nl]` +# for Dutch. The list of usable languages can be found in +# `CMakeLists.txt` or as part of the debug output of Calamares. +# - *description* Human-readable description. These can be translated +# as well. +# - *screenshot* Path to a single screenshot of the product. May be +# a filesystem path or a QRC path (e.g. ":/images/no-selection.png"). +# +# Use the empty string "" as ID / key for the "no selection" item if +# you want to customize the display of that item as well. +# +# For data provided by AppData XML: the item has an *appdata* +# key which points to an AppData XML file in the local filesystem. +# This file is parsed to provide the id (from AppData id), name +# (from AppData name), description (from AppData description paragraphs +# or the summary entries), and a screenshot (the defautl screenshot +# from AppData). No package is set (but that is unused anyway). +# +# AppData may contain IDs that are not useful inside Calamares, +# and the screenshot URL may be remote -- a remote URL will not +# be loaded and the screenshot will be missing. An item with *appdata* +# **may** specify an ID or screenshot path, as above. This will override +# the settings from AppData. +items: + - id: "" + package: "" + name: "No Office Suite" + description: "Please pick an office suite from the list. If you don't want to install an office suite, that's fine, you can install one later as needed." + screenshot: ":/images/choose-office.jpg" + - id: "libreoffice-still" + package: "libreoffice-still" + name: "LibreOffice" + description: "LibreOffice is a powerful and free office suite, used by millions of people around the world. Its clean interface and feature-rich tools help you unleash your creativity and enhance your productivity." + screenshot: ":/images/LibreOffice.jpg" + - id: "freeoffice" + package: "freeoffice" + name: "FreeOffice" + description: "FreeOffice is a powerful Office suite with word processing, spreadsheet and presentation software. It is seamlessly compatible with Microsoft Office and can be used free of charge. For long-term use, request a free product directly in the application." + screenshot: ":/images/FreeOffice.jpg" + diff --git a/src/modules/officechooser/packagechooser.qrc b/src/modules/officechooser/packagechooser.qrc new file mode 100644 index 000000000..f0b5e03fb --- /dev/null +++ b/src/modules/officechooser/packagechooser.qrc @@ -0,0 +1,7 @@ + + + images/choose-office.jpg + images/LibreOffice.jpg + images/FreeOffice.jpg + + diff --git a/src/modules/officechooser/page_package.ui b/src/modules/officechooser/page_package.ui new file mode 100644 index 000000000..3914697d8 --- /dev/null +++ b/src/modules/officechooser/page_package.ui @@ -0,0 +1,84 @@ + + + PackageChooserPage + + + + 0 + 0 + 400 + 500 + + + + + 0 + 1 + + + + Form + + + + + + + + + 0 + 1 + + + + + + + + + + TextLabel + + + Qt::AlignCenter + + + true + + + + + + + TextLabel + + + Qt::AlignCenter + + + + + + + TextLabel + + + Qt::AlignCenter + + + true + + + true + + + + + + + + + + + + diff --git a/src/modules/packagechooser/CMakeLists.txt b/src/modules/packagechooser/CMakeLists.txt new file mode 100644 index 000000000..eeae655c9 --- /dev/null +++ b/src/modules/packagechooser/CMakeLists.txt @@ -0,0 +1,70 @@ +find_package( Qt5 COMPONENTS Core Gui Widgets REQUIRED ) +set( _extra_libraries "" ) +set( _extra_src "" ) + +### OPTIONAL AppData XML support in PackageModel +# +# +option( WITH_APPDATA "Support appdata: items in PackageChooser (requires QtXml)" ON ) +if ( WITH_APPDATA ) + find_package(Qt5 COMPONENTS Xml) + if ( Qt5Xml_FOUND ) + add_definitions( -DHAVE_XML ) + list( APPEND _extra_libraries Qt5::Xml ) + list( APPEND _extra_src ItemAppData.cpp ) + endif() +endif() + +### OPTIONAL AppStream support in PackageModel +# +# +option( WITH_APPSTREAM "Support appstream: items in PackageChooser (requires libappstream-qt)" ON ) +if ( WITH_APPSTREAM ) + find_package(AppStreamQt) + set_package_properties( + AppStreamQt PROPERTIES + DESCRIPTION "Support for AppStream (cache) data" + URL "https://github.com/ximion/appstream" + PURPOSE "AppStream provides package data" + TYPE OPTIONAL + ) + if ( AppStreamQt_FOUND ) + add_definitions( -DHAVE_APPSTREAM ) + list( APPEND _extra_libraries AppStreamQt ) + list( APPEND _extra_src ItemAppStream.cpp ) + endif() +endif() + +calamares_add_plugin( packagechooser + TYPE viewmodule + EXPORT_MACRO PLUGINDLLEXPORT_PRO + SOURCES + PackageChooserPage.cpp + PackageChooserViewStep.cpp + PackageModel.cpp + ${_extra_src} + RESOURCES + packagechooser.qrc + UI + page_package.ui + LINK_PRIVATE_LIBRARIES + calamaresui + ${_extra_libraries} + SHARED_LIB +) + +if( ECM_FOUND AND BUILD_TESTING ) + ecm_add_test( + Tests.cpp + TEST_NAME + packagechoosertest + LINK_LIBRARIES + ${CALAMARES_LIBRARIES} + calamares_viewmodule_packagechooser + Qt5::Core + Qt5::Test + Qt5::Gui + ${_extra_libraries} + ) + calamares_automoc( packagechoosertest) +endif() diff --git a/src/modules/packagechooser/ItemAppData.cpp b/src/modules/packagechooser/ItemAppData.cpp new file mode 100644 index 000000000..ed0ba9223 --- /dev/null +++ b/src/modules/packagechooser/ItemAppData.cpp @@ -0,0 +1,234 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +/** @brief Loading items from AppData XML files. + * + * Only used if QtXML is found, implements PackageItem::fromAppData(). + */ +#include "PackageModel.h" + +#include "utils/Logger.h" +#include "utils/Variant.h" + +#include +#include +#include + +/** @brief try to load the given @p fileName XML document + * + * Returns a QDomDocument, which will be valid iff the file can + * be read and contains valid XML data. + */ +static inline QDomDocument +loadAppData( const QString& fileName ) +{ + QFile file( fileName ); + if ( !file.open( QIODevice::ReadOnly ) ) + { + return QDomDocument(); + } + QDomDocument doc( "AppData" ); + if ( !doc.setContent( &file ) ) + { + file.close(); + return QDomDocument(); + } + file.close(); + return doc; +} + +/** @brief gets the text of child element @p tagName + */ +static inline QString +getChildText( const QDomNode& n, const QString& tagName ) +{ + QDomElement e = n.firstChildElement( tagName ); + return e.isNull() ? QString() : e.text(); +} + +/** @brief Gets a suitable screenshot path + * + * The element contains zero or more + * elements, which can have a *type* associated with them. + * Scan the screenshot elements, return the path + * for the one labeled with type=default or, if there is no + * default, the first element. + */ +static inline QString +getScreenshotPath( const QDomNode& n ) +{ + QDomElement shotsNode = n.firstChildElement( "screenshots" ); + if ( shotsNode.isNull() ) + { + return QString(); + } + + const QDomNodeList shotList = shotsNode.childNodes(); + int firstScreenshot = -1; // Use which screenshot node? + for ( int i = 0; i < shotList.count(); ++i ) + { + if ( !shotList.at( i ).isElement() ) + { + continue; + } + QDomElement e = shotList.at( i ).toElement(); + if ( e.tagName() != "screenshot" ) + { + continue; + } + // If none has the "type=default" attribute, use the first one + if ( firstScreenshot < 0 ) + { + firstScreenshot = i; + } + // But type=default takes precedence. + if ( e.hasAttribute( "type" ) && e.attribute( "type" ) == "default" ) + { + firstScreenshot = i; + break; + } + } + + if ( firstScreenshot >= 0 ) + { + return shotList.at( firstScreenshot ).firstChildElement( "image" ).text(); + } + + return QString(); +} + +/** @brief Returns language of the given element @p e + * + * Transforms the attribute value for xml:lang to something + * suitable for TranslatedString (e.g. [lang]). + */ +static inline QString +getLanguage( const QDomElement& e ) +{ + QString language = e.attribute( "xml:lang" ); + if ( !language.isEmpty() ) + { + language.replace( '-', '_' ); + language.prepend( '[' ); + language.append( ']' ); + } + return language; +} + +/** @brief Scan the list of @p children for @p tagname elements and add them to the map + * + * Uses @p mapname instead of @p tagname for the entries in map @p m + * to allow renaming from XML to map keys (in particular for + * TranslatedString). Also transforms xml:lang attributes to suitable + * key-decorations on @p mapname. + */ +static inline void +fillMap( QVariantMap& m, const QDomNodeList& children, const QString& tagname, const QString& mapname ) +{ + for ( int i = 0; i < children.count(); ++i ) + { + if ( !children.at( i ).isElement() ) + { + continue; + } + + QDomElement e = children.at( i ).toElement(); + if ( e.tagName() != tagname ) + { + continue; + } + + m[ mapname + getLanguage( e ) ] = e.text(); + } +} + +/** @brief gets the and elements +* +* Builds up a map of the elements (which may have a *lang* +* attribute to indicate translations and paragraphs of the +* element (also with lang). Uses the +* elements to supplement the description if no description +* is available for a given language. +* +* Returns a map with keys suitable for use by TranslatedString. +*/ +static inline QVariantMap +getNameAndSummary( const QDomNode& n ) +{ + QVariantMap m; + + const QDomNodeList children = n.childNodes(); + fillMap( m, children, "name", "name" ); + fillMap( m, children, "summary", "description" ); + + const QDomElement description = n.firstChildElement( "description" ); + if ( !description.isNull() ) + { + fillMap( m, description.childNodes(), "p", "description" ); + } + + return m; +} + +PackageItem +fromAppData( const QVariantMap& item_map ) +{ + QString fileName = CalamaresUtils::getString( item_map, "appdata" ); + if ( fileName.isEmpty() ) + { + cWarning() << "Can't load AppData without a suitable key."; + return PackageItem(); + } + cDebug() << "Loading AppData XML from" << fileName; + + QDomDocument doc = loadAppData( fileName ); + if ( doc.isNull() ) + { + return PackageItem(); + } + + QDomElement componentNode = doc.documentElement(); + if ( !componentNode.isNull() && componentNode.tagName() == "component" ) + { + // An "id" entry in the Calamares config overrides ID in the AppData + QString id = CalamaresUtils::getString( item_map, "id" ); + if ( id.isEmpty() ) + { + id = getChildText( componentNode, "id" ); + } + if ( id.isEmpty() ) + { + return PackageItem(); + } + + // A "screenshot" entry in the Calamares config overrides AppData + QString screenshotPath = CalamaresUtils::getString( item_map, "screenshot" ); + if ( screenshotPath.isEmpty() ) + { + screenshotPath = getScreenshotPath( componentNode ); + } + + QVariantMap map = getNameAndSummary( componentNode ); + map.insert( "id", id ); + map.insert( "screenshot", screenshotPath ); + + return PackageItem( map ); + } + + return PackageItem(); +} diff --git a/src/modules/packagechooser/ItemAppData.h b/src/modules/packagechooser/ItemAppData.h new file mode 100644 index 000000000..72617ff0c --- /dev/null +++ b/src/modules/packagechooser/ItemAppData.h @@ -0,0 +1,37 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef ITEMAPPDATA_H +#define ITEMAPPDATA_H + +#include "PackageModel.h" + +/** @brief Loads an AppData XML file and returns a PackageItem + * + * The @p map must have a key *appdata*. That is used as the + * primary source of information, but keys *id* and *screenshotPath* + * may be used to override parts of the AppData -- so that the + * ID is under the control of Calamares, and the screenshot can be + * forced to a local path available on the installation medium. + * + * Requires XML support in libcalamares, if not present will + * return invalid PackageItems. + */ +PackageItem fromAppData( const QVariantMap& map ); + +#endif diff --git a/src/modules/packagechooser/ItemAppStream.cpp b/src/modules/packagechooser/ItemAppStream.cpp new file mode 100644 index 000000000..83837a9ca --- /dev/null +++ b/src/modules/packagechooser/ItemAppStream.cpp @@ -0,0 +1,159 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +/** @brief Loading items from AppData XML files. + * + * Only used if QtXML is found, implements PackageItem::fromAppData(). + */ +#include "PackageModel.h" + +#include "locale/LabelModel.h" +#include "utils/Logger.h" +#include "utils/Variant.h" + +#include +#include +#include + +/// @brief Return number of pixels in a size, for < ordering purposes +static inline quint64 +sizeOrder( const QSize& size ) +{ + return size.width() * size.height(); +} + +/// @brief Sets a screenshot in @p map from @p screenshot, if a usable one is found +static void +setScreenshot( QVariantMap& map, const AppStream::Screenshot& screenshot ) +{ + if ( screenshot.images().count() < 1 ) + { + return; + } + + // Pick the smallest + QUrl url; + quint64 size = sizeOrder( screenshot.images().first().size() ); + for ( const auto& img : screenshot.images() ) + { + if ( sizeOrder( img.size() ) <= size ) + { + url = img.url(); + } + } + + if ( url.isValid() ) + { + map.insert( "screenshot", url.toString() ); + } +} + +/// @brief Interpret an AppStream Component +static PackageItem +fromComponent( AppStream::Component& component ) +{ + QVariantMap map; + map.insert( "id", component.id() ); + map.insert( "package", component.packageNames().join( "," ) ); + + // Assume that the pool has loaded "ALL" locales, but it might be set + // to any of them; get the en_US locale as "untranslated" and then + // loop over Calamares locales (since there is no way to query for + // available locales in the Component) to see if there's anything else. + component.setActiveLocale( QStringLiteral( "en_US" ) ); + QString en_name = component.name(); + QString en_description = component.description(); + map.insert( "name", en_name ); + map.insert( "description", en_description ); + + for ( const QString& locale : CalamaresUtils::Locale::availableTranslations()->localeIds() ) + { + component.setActiveLocale( locale ); + QString name = component.name(); + if ( name != en_name ) + { + map.insert( QStringLiteral( "name[%1]" ).arg( locale ), name ); + } + QString description = component.description(); + if ( description != en_description ) + { + map.insert( QStringLiteral( "description[%1]" ).arg( locale ), description ); + } + } + + + auto screenshots = component.screenshots(); + if ( screenshots.count() > 0 ) + { + bool done = false; + for ( const auto& s : screenshots ) + { + if ( s.isDefault() ) + { + setScreenshot( map, s ); + done = true; + break; + } + } + if ( !done ) + { + setScreenshot( map, screenshots.first() ); + } + } + + return PackageItem( map ); +} + +PackageItem +fromAppStream( AppStream::Pool& pool, const QVariantMap& item_map ) +{ + QString appstreamId = CalamaresUtils::getString( item_map, "appstream" ); + if ( appstreamId.isEmpty() ) + { + cWarning() << "Can't load AppStream without a suitable appstreamId."; + return PackageItem(); + } + cDebug() << "Loading AppStream data for" << appstreamId; + + auto itemList = pool.componentsById( appstreamId ); + if ( itemList.count() < 1 ) + { + cWarning() << "No AppStream data for" << appstreamId; + return PackageItem(); + } + if ( itemList.count() > 1 ) + { + cDebug() << "Multiple AppStream data for" << appstreamId << "using first."; + } + + auto r = fromComponent( itemList.first() ); + if ( r.isValid() ) + { + QString id = CalamaresUtils::getString( item_map, "id" ); + QString screenshotPath = CalamaresUtils::getString( item_map, "screenshot" ); + if ( !id.isEmpty() ) + { + r.id = id; + } + if ( !screenshotPath.isEmpty() ) + { + r.screenshot = screenshotPath; + } + } + return r; +} diff --git a/src/modules/packagechooser/ItemAppStream.h b/src/modules/packagechooser/ItemAppStream.h new file mode 100644 index 000000000..c44b84b06 --- /dev/null +++ b/src/modules/packagechooser/ItemAppStream.h @@ -0,0 +1,43 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef ITEMAPPSTREAM_H +#define ITEMAPPSTREAM_H + +#include "PackageModel.h" + +namespace AppStream +{ +class Pool; +} + +/** @brief Loads an item from AppStream data. + * + * The @p map must have a key *appstream*. That is used as the + * primary source of information from the AppStream cache, but + * keys *id* and *screenshotPath* may be used to override parts + * of the AppStream data -- so that the ID is under the control + * of Calamares, and the screenshot can be forced to a local path + * available on the installation medium. + * + * Requires AppStreamQt, if not present will return invalid + * PackageItems. + */ +PackageItem fromAppStream( AppStream::Pool& pool, const QVariantMap& map ); + +#endif diff --git a/src/modules/packagechooser/PackageChooserPage.cpp b/src/modules/packagechooser/PackageChooserPage.cpp new file mode 100644 index 000000000..f0a6579b4 --- /dev/null +++ b/src/modules/packagechooser/PackageChooserPage.cpp @@ -0,0 +1,183 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "PackageChooserPage.h" + +#include "ui_page_package.h" + +#include "utils/Logger.h" +#include "utils/Retranslator.h" + +#include + +PackageChooserPage::PackageChooserPage( PackageChooserMode mode, QWidget* parent ) + : QWidget( parent ) + , ui( new Ui::PackageChooserPage ) + , m_introduction( QString(), + QString(), + tr( "Package Selection" ), + tr( "Please pick a product from the list. The selected product will be installed." ) ) +{ + m_introduction.screenshot = QPixmap( QStringLiteral( ":/images/no-selection.png" ) ); + + ui->setupUi( this ); + CALAMARES_RETRANSLATE( updateLabels(); ) + + switch ( mode ) + { + case PackageChooserMode::Optional: + FALLTHRU; + case PackageChooserMode::Required: + ui->products->setSelectionMode( QAbstractItemView::SingleSelection ); + break; + case PackageChooserMode::OptionalMultiple: + FALLTHRU; + case PackageChooserMode::RequiredMultiple: + ui->products->setSelectionMode( QAbstractItemView::ExtendedSelection ); + } +} + +/** @brief size the given @p pixmap to @p size + * + * This is "smart" in the sense that it tries to keep the image un-scaled + * (if it's just a little too big) and otherwise scales as needed. + * + * Returns a copy if any modifications are done. + */ +static QPixmap +smartClip( const QPixmap& pixmap, QSize size ) +{ + auto pixSize = pixmap.size(); + if ( ( pixSize.width() <= size.width() ) && ( pixSize.height() <= size.height() ) ) + { + return pixmap; + } + + // only slightly bigger? Trim the edges + constexpr int margin = 16; + if ( ( pixSize.width() <= size.width() + margin ) && ( pixSize.height() <= size.height() + margin ) ) + { + int x = pixSize.width() <= size.width() ? 0 : ( pixSize.width() - size.width() / 2 ); + int new_width = pixSize.width() <= size.width() ? pixSize.width() : size.width(); + int y = pixSize.height() <= size.height() ? 0 : ( pixSize.height() - size.height() / 2 ); + int new_height = pixSize.height() <= size.height() ? pixSize.height() : size.height(); + + return pixmap.copy( x, y, new_width, new_height ); + } + + return pixmap.scaled( size, Qt::KeepAspectRatio ); +} + +void +PackageChooserPage::currentChanged( const QModelIndex& index ) +{ + if ( !index.isValid() || !ui->products->selectionModel()->hasSelection() ) + { + ui->productName->setText( m_introduction.name.get() ); + ui->productScreenshot->setPixmap( m_introduction.screenshot ); + ui->productDescription->setText( m_introduction.description.get() ); + } + else + { + const auto* model = ui->products->model(); + + ui->productName->setText( model->data( index, PackageListModel::NameRole ).toString() ); + ui->productDescription->setText( model->data( index, PackageListModel::DescriptionRole ).toString() ); + + QPixmap currentScreenshot = model->data( index, PackageListModel::ScreenshotRole ).value< QPixmap >(); + if ( currentScreenshot.isNull() ) + { + ui->productScreenshot->setPixmap( m_introduction.screenshot ); + } + else + { + ui->productScreenshot->setPixmap( smartClip( currentScreenshot, ui->productScreenshot->size() ) ); + } + } +} + +void +PackageChooserPage::updateLabels() +{ + if ( ui && ui->products && ui->products->selectionModel() ) + { + currentChanged( ui->products->selectionModel()->currentIndex() ); + } + else + { + currentChanged( QModelIndex() ); + } + emit selectionChanged(); +} + +void +PackageChooserPage::setModel( QAbstractItemModel* model ) +{ + ui->products->setModel( model ); + + // Check if any of the items in the model is the "none" option. + // If so, copy its values into the introduction / none item. + for ( int r = 0; r < model->rowCount(); ++r ) + { + auto index = model->index( r, 0 ); + if ( index.isValid() ) + { + QVariant v = model->data( index, PackageListModel::IdRole ); + if ( v.isValid() && v.toString().isEmpty() ) + { + m_introduction.name = model->data( index, PackageListModel::NameRole ).toString(); + m_introduction.description = model->data( index, PackageListModel::DescriptionRole ).toString(); + m_introduction.screenshot = model->data( index, PackageListModel::ScreenshotRole ).value< QPixmap >(); + currentChanged( QModelIndex() ); + break; + } + } + } + + connect( ui->products->selectionModel(), + &QItemSelectionModel::selectionChanged, + this, + &PackageChooserPage::updateLabels ); +} + +bool +PackageChooserPage::hasSelection() const +{ + return ui && ui->products && ui->products->selectionModel() && ui->products->selectionModel()->hasSelection(); +} + +QStringList +PackageChooserPage::selectedPackageIds() const +{ + if ( !( ui && ui->products && ui->products->selectionModel() ) ) + { + return QStringList(); + } + + const auto* model = ui->products->model(); + QStringList ids; + for ( const auto& index : ui->products->selectionModel()->selectedIndexes() ) + { + QString pid = model->data( index, PackageListModel::IdRole ).toString(); + if ( !pid.isEmpty() ) + { + ids.append( pid ); + } + } + return ids; +} diff --git a/src/modules/packagechooser/PackageChooserPage.h b/src/modules/packagechooser/PackageChooserPage.h new file mode 100644 index 000000000..401de903b --- /dev/null +++ b/src/modules/packagechooser/PackageChooserPage.h @@ -0,0 +1,60 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef PACKAGECHOOSERPAGE_H +#define PACKAGECHOOSERPAGE_H + +#include "PackageModel.h" + +#include +#include + +namespace Ui +{ +class PackageChooserPage; +} + +class PackageChooserPage : public QWidget +{ + Q_OBJECT +public: + explicit PackageChooserPage( PackageChooserMode mode, QWidget* parent = nullptr ); + + void setModel( QAbstractItemModel* model ); + + /// @brief Is anything selected? + bool hasSelection() const; + /** @brief Get the list of selected ids + * + * This list may be empty (if none is selected). + */ + QStringList selectedPackageIds() const; + +public slots: + void currentChanged( const QModelIndex& index ); + void updateLabels(); + +signals: + void selectionChanged(); + +private: + Ui::PackageChooserPage* ui; + PackageItem m_introduction; +}; + +#endif // PACKAGECHOOSERPAGE_H diff --git a/src/modules/packagechooser/PackageChooserViewStep.cpp b/src/modules/packagechooser/PackageChooserViewStep.cpp new file mode 100644 index 000000000..7758986ba --- /dev/null +++ b/src/modules/packagechooser/PackageChooserViewStep.cpp @@ -0,0 +1,273 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "PackageChooserViewStep.h" + +#ifdef HAVE_XML +#include "ItemAppData.h" +#endif +#ifdef HAVE_APPSTREAM +#include "ItemAppStream.h" +#include +#include +#endif +#include "PackageChooserPage.h" +#include "PackageModel.h" + +#include "GlobalStorage.h" +#include "JobQueue.h" + +#include "utils/CalamaresUtilsSystem.h" +#include "utils/Logger.h" +#include "utils/Variant.h" + +#include +#include + +CALAMARES_PLUGIN_FACTORY_DEFINITION( PackageChooserViewStepFactory, registerPlugin< PackageChooserViewStep >(); ) + +PackageChooserViewStep::PackageChooserViewStep( QObject* parent ) + : Calamares::ViewStep( parent ) + , m_widget( nullptr ) + , m_model( nullptr ) + , m_mode( PackageChooserMode::Required ) +{ + emit nextStatusChanged( false ); +} + + +PackageChooserViewStep::~PackageChooserViewStep() +{ + if ( m_widget && m_widget->parent() == nullptr ) + { + m_widget->deleteLater(); + } + delete m_model; +} + + +QString +PackageChooserViewStep::prettyName() const +{ + return tr( "Packages" ); +} + + +QWidget* +PackageChooserViewStep::widget() +{ + if ( !m_widget ) + { + m_widget = new PackageChooserPage( m_mode, nullptr ); + connect( m_widget, &PackageChooserPage::selectionChanged, [=]() { + emit nextStatusChanged( this->isNextEnabled() ); + } ); + + if ( m_model ) + { + hookupModel(); + } + else + { + cWarning() << "PackageChooser Widget created before model."; + } + } + return m_widget; +} + + +bool +PackageChooserViewStep::isNextEnabled() const +{ + if ( !m_model ) + { + return false; + } + + if ( !m_widget ) + { + // No way to have changed anything + return true; + } + + switch ( m_mode ) + { + case PackageChooserMode::Optional: + case PackageChooserMode::OptionalMultiple: + // zero or one OR zero or more + return true; + case PackageChooserMode::Required: + case PackageChooserMode::RequiredMultiple: + // exactly one OR one or more + return m_widget->hasSelection(); + } + + NOTREACHED return true; +} + + +bool +PackageChooserViewStep::isBackEnabled() const +{ + return true; +} + + +bool +PackageChooserViewStep::isAtBeginning() const +{ + return true; +} + + +bool +PackageChooserViewStep::isAtEnd() const +{ + return true; +} + + +void +PackageChooserViewStep::onLeave() +{ + QString key = QStringLiteral( "packagechooser_%1" ).arg( m_id ); + QString value; + if ( m_widget->hasSelection() ) + { + value = m_widget->selectedPackageIds().join( ',' ); + } + Calamares::JobQueue::instance()->globalStorage()->insert( key, value ); + + cDebug() << "PackageChooser" << key << "selected" << value; +} + +Calamares::JobList +PackageChooserViewStep::jobs() const +{ + Calamares::JobList l; + return l; +} + +void +PackageChooserViewStep::setConfigurationMap( const QVariantMap& configurationMap ) +{ + QString mode = CalamaresUtils::getString( configurationMap, "mode" ); + bool ok = false; + if ( !mode.isEmpty() ) + { + m_mode = roleNames().find( mode, ok ); + } + if ( !ok ) + { + m_mode = PackageChooserMode::Required; + } + + m_id = CalamaresUtils::getString( configurationMap, "id" ); + if ( m_id.isEmpty() ) + { + // Not set, so use the instance id + // TODO: use a stronger type than QString for structured IDs + m_id = moduleInstanceKey().split( '@' ).last(); + } + + bool first_time = !m_model; + if ( configurationMap.contains( "items" ) ) + { + fillModel( configurationMap.value( "items" ).toList() ); + } + + if ( first_time && m_widget && m_model ) + { + hookupModel(); + } +} + +void +PackageChooserViewStep::fillModel( const QVariantList& items ) +{ + if ( !m_model ) + { + m_model = new PackageListModel( nullptr ); + } + + if ( items.isEmpty() ) + { + cWarning() << "No *items* for PackageChooser module."; + return; + } + +#ifdef HAVE_APPSTREAM + std::unique_ptr< AppStream::Pool > pool; + bool poolOk = false; +#endif + + cDebug() << "Loading PackageChooser model items from config"; + int item_index = 0; + for ( const auto& item_it : items ) + { + ++item_index; + QVariantMap item_map = item_it.toMap(); + if ( item_map.isEmpty() ) + { + cWarning() << "PackageChooser entry" << item_index << "is not valid."; + continue; + } + + if ( item_map.contains( "appdata" ) ) + { +#ifdef HAVE_XML + m_model->addPackage( fromAppData( item_map ) ); +#else + cWarning() << "Loading AppData XML is not supported."; +#endif + } + else if ( item_map.contains( "appstream" ) ) + { +#ifdef HAVE_APPSTREAM + if ( !pool ) + { + pool = std::make_unique< AppStream::Pool >(); + pool->setLocale( QStringLiteral( "ALL" ) ); + poolOk = pool->load(); + } + if ( pool && poolOk ) + { + m_model->addPackage( fromAppStream( *pool, item_map ) ); + } +#else + cWarning() << "Loading AppStream data is not supported."; +#endif + } + else + { + m_model->addPackage( PackageItem( item_map ) ); + } + } +} + +void +PackageChooserViewStep::hookupModel() +{ + if ( !m_model || !m_widget ) + { + cError() << "Can't hook up model until widget and model both exist."; + return; + } + + m_widget->setModel( m_model ); +} diff --git a/src/modules/packagechooser/PackageChooserViewStep.h b/src/modules/packagechooser/PackageChooserViewStep.h new file mode 100644 index 000000000..e3ffc1d5b --- /dev/null +++ b/src/modules/packagechooser/PackageChooserViewStep.h @@ -0,0 +1,72 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef PACKAGECHOOSERVIEWSTEP_H +#define PACKAGECHOOSERVIEWSTEP_H + +#include "PluginDllMacro.h" +#include "utils/PluginFactory.h" +#include "viewpages/ViewStep.h" + +#include "PackageModel.h" + +#include +#include +#include + +class PackageChooserPage; + +class PLUGINDLLEXPORT PackageChooserViewStep : public Calamares::ViewStep +{ + Q_OBJECT + +public: + explicit PackageChooserViewStep( QObject* parent = nullptr ); + virtual ~PackageChooserViewStep() override; + + QString prettyName() const override; + + QWidget* widget() override; + + bool isNextEnabled() const override; + bool isBackEnabled() const override; + + bool isAtBeginning() const override; + bool isAtEnd() const override; + + void onLeave() override; + + Calamares::JobList jobs() const override; + + void setConfigurationMap( const QVariantMap& configurationMap ) override; + +private: + void fillModel( const QVariantList& items ); + void hookupModel(); + + PackageChooserPage* m_widget; + PackageListModel* m_model; + + // Configuration + PackageChooserMode m_mode; + QString m_id; +}; + +CALAMARES_PLUGIN_FACTORY_DECLARATION( PackageChooserViewStepFactory ) + +#endif // PACKAGECHOOSERVIEWSTEP_H diff --git a/src/modules/packagechooser/PackageModel.cpp b/src/modules/packagechooser/PackageModel.cpp new file mode 100644 index 000000000..12995fad5 --- /dev/null +++ b/src/modules/packagechooser/PackageModel.cpp @@ -0,0 +1,155 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "PackageModel.h" + +#include "utils/Logger.h" +#include "utils/Variant.h" + +const NamedEnumTable< PackageChooserMode >& +roleNames() +{ + static const NamedEnumTable< PackageChooserMode > names { + { "optional", PackageChooserMode::Optional }, + { "required", PackageChooserMode::Required }, + { "optionalmultiple", PackageChooserMode::OptionalMultiple }, + { "requiredmultiple", PackageChooserMode::RequiredMultiple }, + // and a bunch of aliases + { "zero-or-one", PackageChooserMode::Optional }, + { "radio", PackageChooserMode::Required }, + { "one", PackageChooserMode::Required }, + { "set", PackageChooserMode::OptionalMultiple }, + { "zero-or-more", PackageChooserMode::OptionalMultiple }, + { "multiple", PackageChooserMode::RequiredMultiple }, + { "one-or-more", PackageChooserMode::RequiredMultiple } + }; + return names; +} + +PackageItem::PackageItem() {} + +PackageItem::PackageItem( const QString& a_id, + const QString& a_package, + const QString& a_name, + const QString& a_description ) + : id( a_id ) + , package( a_package ) + , name( a_name ) + , description( a_description ) +{ +} + +PackageItem::PackageItem( const QString& a_id, + const QString& a_package, + const QString& a_name, + const QString& a_description, + const QString& screenshotPath ) + : id( a_id ) + , package( a_package ) + , name( a_name ) + , description( a_description ) + , screenshot( screenshotPath ) +{ +} + +PackageItem::PackageItem::PackageItem( const QVariantMap& item_map ) + : id( CalamaresUtils::getString( item_map, "id" ) ) + , package( CalamaresUtils::getString( item_map, "package" ) ) + , name( CalamaresUtils::Locale::TranslatedString( item_map, "name" ) ) + , description( CalamaresUtils::Locale::TranslatedString( item_map, "description" ) ) + , screenshot( CalamaresUtils::getString( item_map, "screenshot" ) ) +{ + if ( name.isEmpty() && id.isEmpty() ) + { + name = QObject::tr( "No product" ); + } + else if ( name.isEmpty() ) + { + cWarning() << "PackageChooser item" << id << "has an empty name."; + } + if ( description.isEmpty() ) + { + description = QObject::tr( "No description provided." ); + } +} + +PackageListModel::PackageListModel( QObject* parent ) + : QAbstractListModel( parent ) +{ +} + +PackageListModel::PackageListModel( PackageList&& items, QObject* parent ) + : QAbstractListModel( parent ) + , m_packages( std::move( items ) ) +{ +} + +PackageListModel::~PackageListModel() {} + +void +PackageListModel::addPackage( PackageItem&& p ) +{ + // Only add valid packages + if ( p.isValid() ) + { + int c = m_packages.count(); + beginInsertRows( QModelIndex(), c, c ); + m_packages.append( p ); + endInsertRows(); + } +} + +int +PackageListModel::rowCount( const QModelIndex& index ) const +{ + // For lists, valid indexes have zero children; only the root index has them + return index.isValid() ? 0 : m_packages.count(); +} + +QVariant +PackageListModel::data( const QModelIndex& index, int role ) const +{ + if ( !index.isValid() ) + { + return QVariant(); + } + int row = index.row(); + if ( row >= m_packages.count() || row < 0 ) + { + return QVariant(); + } + + if ( role == Qt::DisplayRole /* Also PackageNameRole */ ) + { + return m_packages[ row ].name.get(); + } + else if ( role == DescriptionRole ) + { + return m_packages[ row ].description.get(); + } + else if ( role == ScreenshotRole ) + { + return m_packages[ row ].screenshot; + } + else if ( role == IdRole ) + { + return m_packages[ row ].id; + } + + return QVariant(); +} diff --git a/src/modules/packagechooser/PackageModel.h b/src/modules/packagechooser/PackageModel.h new file mode 100644 index 000000000..8362bee33 --- /dev/null +++ b/src/modules/packagechooser/PackageModel.h @@ -0,0 +1,115 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef PACKAGEMODEL_H +#define PACKAGEMODEL_H + +#include "locale/TranslatableConfiguration.h" +#include "utils/NamedEnum.h" + +#include +#include +#include +#include + +enum class PackageChooserMode +{ + Optional, // zero or one + Required, // exactly one + OptionalMultiple, // zero or more + RequiredMultiple // one or more +}; + +const NamedEnumTable< PackageChooserMode >& roleNames(); + +struct PackageItem +{ + QString id; + // FIXME: unused + QString package; + CalamaresUtils::Locale::TranslatedString name; + CalamaresUtils::Locale::TranslatedString description; + QPixmap screenshot; + + /// @brief Create blank PackageItem + PackageItem(); + /** @brief Creates a PackageItem from given strings + * + * This constructor sets all the text members, + * but leaves the screenshot blank. Set that separately. + */ + PackageItem( const QString& id, const QString& package, const QString& name, const QString& description ); + + /** @brief Creates a PackageItem from given strings. + * + * Set all the text members and load the screenshot from the given + * @p screenshotPath, which may be a QRC path (:/path/in/qrc) or + * a filesystem path, whatever QPixmap understands. + */ + PackageItem( const QString& id, + const QString& package, + const QString& name, + const QString& description, + const QString& screenshotPath ); + + /** @brief Creates a PackageItem from a QVariantMap + * + * This is intended for use when loading PackageItems from a + * configuration map. It will look up the various keys in the map + * and handle translation strings as well. + */ + PackageItem( const QVariantMap& map ); + + /** @brief Is this item valid? + * + * A valid item has an untranslated name available. + */ + bool isValid() const { return !name.isEmpty(); } +}; + +using PackageList = QVector< PackageItem >; + +class PackageListModel : public QAbstractListModel +{ +public: + PackageListModel( PackageList&& items, QObject* parent ); + PackageListModel( QObject* parent ); + virtual ~PackageListModel() override; + + /** @brief Add a package @p to the model + * + * Only valid packages are added -- that is, they must have a name. + */ + void addPackage( PackageItem&& p ); + + int rowCount( const QModelIndex& index ) const override; + QVariant data( const QModelIndex& index, int role ) const override; + + enum Roles : int + { + NameRole = Qt::DisplayRole, + DescriptionRole = Qt::UserRole, + ScreenshotRole, + IdRole + }; + +private: + PackageList m_packages; +}; + +#endif diff --git a/src/modules/packagechooser/Tests.cpp b/src/modules/packagechooser/Tests.cpp new file mode 100644 index 000000000..639d06d65 --- /dev/null +++ b/src/modules/packagechooser/Tests.cpp @@ -0,0 +1,91 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "Tests.h" + +#ifdef HAVE_XML +#include "ItemAppData.h" +#endif +#ifdef HAVE_APPSTREAM +#include "ItemAppStream.h" +#endif +#include "PackageModel.h" + +#include "utils/Logger.h" + +#include + +QTEST_MAIN( PackageChooserTests ) + +PackageChooserTests::PackageChooserTests() {} + +PackageChooserTests::~PackageChooserTests() {} + +void +PackageChooserTests::initTestCase() +{ + Logger::setupLogLevel( Logger::LOGDEBUG ); +} + +void +PackageChooserTests::testBogus() +{ + QVERIFY( true ); +} + +void +PackageChooserTests::testAppData() +{ + // Path from the build-dir and from the running-the-test varies, + // for in-source build, for build/, and for tests-in-build/, + // so look in multiple places. + QString appdataName( "io.calamares.calamares.appdata.xml" ); + for ( const auto& prefix : QStringList { "", "../", "../../../", "../../../../" } ) + { + if ( QFile::exists( prefix + appdataName ) ) + { + appdataName = prefix + appdataName; + break; + } + } + QVERIFY( QFile::exists( appdataName ) ); + + QVariantMap m; + m.insert( "appdata", appdataName ); + +#ifdef HAVE_XML + PackageItem p1 = fromAppData( m ); + QVERIFY( p1.isValid() ); + QCOMPARE( p1.id, "io.calamares.calamares.desktop" ); + QCOMPARE( p1.name.get(), "Calamares" ); + // The entry has precedence + QCOMPARE( p1.description.get(), "Calamares is an installer program for Linux distributions." ); + // .. but en_GB doesn't have an entry in description, so uses + QCOMPARE( p1.description.get( QLocale( "en_GB" ) ), "Calamares Linux Installer" ); + QCOMPARE( p1.description.get( QLocale( "nl" ) ), "Calamares is een installatieprogramma voor Linux distributies." ); + QVERIFY( p1.screenshot.isNull() ); + + m.insert( "id", "calamares" ); + m.insert( "screenshot", ":/images/calamares.png" ); + PackageItem p2 = fromAppData( m ); + QVERIFY( p2.isValid() ); + QCOMPARE( p2.id, "calamares" ); + QCOMPARE( p2.description.get( QLocale( "nl" ) ), "Calamares is een installatieprogramma voor Linux distributies." ); + QVERIFY( !p2.screenshot.isNull() ); +#endif +} diff --git a/src/modules/packagechooser/Tests.h b/src/modules/packagechooser/Tests.h new file mode 100644 index 000000000..62efe92cc --- /dev/null +++ b/src/modules/packagechooser/Tests.h @@ -0,0 +1,37 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef PACKAGECHOOSERTESTS_H +#define PACKAGECHOOSERTESTS_H + +#include + +class PackageChooserTests : public QObject +{ + Q_OBJECT +public: + PackageChooserTests(); + ~PackageChooserTests() override; + +private Q_SLOTS: + void initTestCase(); + void testBogus(); + void testAppData(); +}; + +#endif diff --git a/src/modules/packagechooser/images/calamares.png b/src/modules/packagechooser/images/calamares.png new file mode 100644 index 000000000..452e4450c Binary files /dev/null and b/src/modules/packagechooser/images/calamares.png differ diff --git a/src/modules/packagechooser/images/no-selection.png b/src/modules/packagechooser/images/no-selection.png new file mode 100644 index 000000000..437c97051 Binary files /dev/null and b/src/modules/packagechooser/images/no-selection.png differ diff --git a/src/modules/packagechooser/packagechooser.conf b/src/modules/packagechooser/packagechooser.conf new file mode 100644 index 000000000..eebe4dfb4 --- /dev/null +++ b/src/modules/packagechooser/packagechooser.conf @@ -0,0 +1,94 @@ +# Configuration for the low-density software chooser +--- +# The packagechooser writes a GlobalStorage value for the choice that +# has been made. The key is *packagechooser_*. If *id* is set here, +# it is substituted into the key name. If it is not set, the module's +# instance name is used; see the *instances* section of `settings.conf`. +# If there is just one packagechooser module, and no *id* is set, +# resulting GS key is probably *packagechooser_packagechooser*. +# +# The GS value is a comma-separated list of the IDs of the selected +# packages, or an empty string if none is selected. +# +# id: "" + +# Software selection mode, to set whether the software packages +# can be chosen singly, or multiply. +# +# Possible modes are "optional", "required" (for zero or one) +# or "optionalmultiple", "requiredmultiple" (for zero-or-more +# or one-or-more). +mode: required + +# Items to display in the chooser. In general, this should be a +# pretty short list to avoid overwhelming the UI. This is a list +# of objects, and the items are displayed in list order. +# +# Either provide the data for an item in the list (using the keys +# below), or use existing AppData XML files, or use AppStream cache +# as a source for the data. +# +# For data provided by the list: the item has an id, which is used in +# setting the value of *packagechooser_*). The following fields +# are mandatory: +# +# - *id* ID for the product. The ID "" is special, and is used for +# "no package selected". Only include this if the mode allows +# selecting none. +# - *package* Package name for the product. While mandatory, this is +# not actually used anywhere. +# - *name* Human-readable name of the product. To provide translations, +# add a *[lang]* decoration as part of the key name, e.g. `name[nl]` +# for Dutch. The list of usable languages can be found in +# `CMakeLists.txt` or as part of the debug output of Calamares. +# - *description* Human-readable description. These can be translated +# as well. +# - *screenshot* Path to a single screenshot of the product. May be +# a filesystem path or a QRC path (e.g. ":/images/no-selection.png"). +# +# Use the empty string "" as ID / key for the "no selection" item if +# you want to customize the display of that item as well. +# +# For data provided by AppData XML: the item has an *appdata* +# key which points to an AppData XML file in the local filesystem. +# This file is parsed to provide the id (from AppData id), name +# (from AppData name), description (from AppData description paragraphs +# or the summary entries), and a screenshot (the defautl screenshot +# from AppData). No package is set (but that is unused anyway). +# +# AppData may contain IDs that are not useful inside Calamares, +# and the screenshot URL may be remote -- a remote URL will not +# be loaded and the screenshot will be missing. An item with *appdata* +# **may** specify an ID or screenshot path, as above. This will override +# the settings from AppData. +# +# For data provided by AppStream cache: the item has an *appstream* +# key which matches the AppStream identifier in the cache (e.g. +# *org.kde.kwrite.desktop*). Data is retrieved from the AppStream +# cache for that ID. The package name is set from the AppStream data. +# +# An item for AppStream may also contain an *id* and a *screenshot* +# key which will override the data from AppStream. +items: + - id: "" + package: "" + name: "No Desktop" + name[nl]: "Geen desktop" + description: "Please pick a desktop environment from the list. If you don't want to install a desktop, that's fine, your system will start up in text-only mode and you can install a desktop environment later." + description[nl]: "Kies eventueel een desktop-omgeving uit deze lijst. Als u geen desktop-omgeving wenst te gebruiken, kies er dan geen. In dat geval start het systeem straks op in tekst-modus en kunt u later alsnog een desktop-omgeving installeren." + screenshot: ":/images/no-selection.png" + - id: kde + package: kde + name: Plasma Desktop + description: "KDE Plasma Desktop, simple by default, a clean work area for real-world usage which intends to stay out of your way. Plasma is powerful when needed, enabling the user to create the workflow that makes them more effective to complete their tasks." + screenshot: ":/images/kde.png" + - id: gnome + package: gnome + name: GNOME + description: GNU Networked Object Modeling Environment Desktop + screenshot: ":/images/gnome.png" + - id: calamares + appdata: ../io.calamares.calamares.appdata.xml + screenshot: ":/images/calamares.png" + - id: kate + appstream: org.kde.kwrite.desktop diff --git a/src/modules/packagechooser/packagechooser.qrc b/src/modules/packagechooser/packagechooser.qrc new file mode 100644 index 000000000..3b9c96a5b --- /dev/null +++ b/src/modules/packagechooser/packagechooser.qrc @@ -0,0 +1,6 @@ + + + images/no-selection.png + images/calamares.png + + diff --git a/src/modules/packagechooser/page_package.ui b/src/modules/packagechooser/page_package.ui new file mode 100644 index 000000000..496c478a1 --- /dev/null +++ b/src/modules/packagechooser/page_package.ui @@ -0,0 +1,87 @@ + + + PackageChooserPage + + + + 0 + 0 + 400 + 500 + + + + + 0 + 1 + + + + Form + + + + + + + + + 0 + 1 + + + + + + + + + + Product Name + + + + + + + + 1 + 0 + + + + TextLabel + + + Qt::AlignCenter + + + + + + + + 0 + 2 + + + + Long Product Description + + + true + + + true + + + + + + + + + + + + diff --git a/src/modules/packages/packages.conf b/src/modules/packages/packages.conf index 94f3cfdb6..e42e8e9b8 100644 --- a/src/modules/packages/packages.conf +++ b/src/modules/packages/packages.conf @@ -31,9 +31,9 @@ backend: dummy # # Set "update_db" to 'true' for refreshing the database on the # target system. On target installations, which got installed by -# unsquashing, a full system update may be needed. Otherwise +# unsquashing, a full system update may be needed. Otherwise # post-installing additional packages may result in conflicts. -# Therefore set also "update_system" to 'true'. +# Therefore set also "update_system" to 'true'. # skip_if_no_internet: false update_db: true @@ -87,9 +87,25 @@ update_system: false # pre-script: touch /tmp/installing-vi # post-script: rm -f /tmp/installing-vi # -# The pre- and post-scripts are optional, but you cannot leave both out: using -# "package: vi" with neither script option will trick Calamares into -# trying to install a package named "package: vi", which is unlikely to work. +# The pre- and post-scripts are optional, but you cannot leave both out +# if you do use the *package* key: using "package: vi" with neither script +# option will trick Calamares into trying to install a package named +# "package: vi", which is unlikely to work. +# +# The pre- and post-scripts are **not** executed by a shell unless you +# explicitly invoke `/bin/sh` in them. The command-lines are passed +# to exec(), which does not understand shell syntax. In other words: +# +# pre-script: ls | wc -l +# +# Will fail, because `|` is passed as a command-line argument to ls, +# as are `wc`, and `-l`. No shell pipeline is set up, and ls is likely +# to complain. Invoke the shell explicitly: +# +# pre-script: /bin/sh -c \"ls | wc -l\" +# +# The above note on shell-expansion applies to versions up-to-and-including +# Calamares 3.2.12, but will change in future. # # Any package name may be localized; this is used to install localization # packages for software based on the selected system locale. By including @@ -104,7 +120,7 @@ update_system: false # # Take care that just plain `LOCALE` will not be replaced, so `foo-LOCALE` will # be left unchanged, while `foo-$LOCALE` will be changed. However, `foo-LOCALE` -# **will** be removed from the list of packages (i.e. not installed), if +# **will** be removed from the list of packages (i.e. not installed), if # English is selected. If a non-English locale is selected, then `foo-LOCALE` # will be installed, unchanged (no language-name-substitution occurs). # diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt index 61953c249..f9c32b39e 100644 --- a/src/modules/partition/CMakeLists.txt +++ b/src/modules/partition/CMakeLists.txt @@ -5,6 +5,8 @@ option( DEBUG_PARTITION_UNSAFE "Allow unsafe partitioning choices." OFF ) option( DEBUG_PARTITION_LAME "Unsafe partitioning will error out on exec." ON ) +include_directories( ${CMAKE_SOURCE_DIR} ) # For 3rdparty + set( _partition_defs ) if( DEBUG_PARTITION_UNSAFE ) if( DEBUG_PARTITION_LAME ) @@ -20,11 +22,11 @@ set_package_properties( KPMcore PROPERTIES PURPOSE "For partitioning module" ) +find_package( KF5Config CONFIG ) +find_package( KF5I18n CONFIG ) +find_package( KF5WidgetsAddons CONFIG ) -if ( KPMcore_FOUND ) - find_package( Qt5 REQUIRED DBus ) - find_package( KF5 REQUIRED Config CoreAddons I18n WidgetsAddons ) - +if ( KPMcore_FOUND AND Qt5DBus_FOUND AND KF5CoreAddons_FOUND AND KF5Config_FOUND ) if ( KPMcore_VERSION VERSION_GREATER "3.3.0") list( APPEND _partition_defs WITH_KPMCORE331API) # kpmcore > 3.3.0 with deprecations endif() @@ -104,5 +106,9 @@ if ( KPMcore_FOUND ) SHARED_LIB ) else() - calamares_skip_module( "partition (missing suitable KPMcore)" ) + if ( NOT KPMcore_FOUND ) + calamares_skip_module( "partition (missing suitable KPMcore)" ) + else() + calamares_skip_module( "partition (missing dependencies for KPMcore)" ) + endif() endif() diff --git a/src/modules/partition/gui/DeviceInfoWidget.cpp b/src/modules/partition/gui/DeviceInfoWidget.cpp index 4d37e3b39..ea318e85c 100644 --- a/src/modules/partition/gui/DeviceInfoWidget.cpp +++ b/src/modules/partition/gui/DeviceInfoWidget.cpp @@ -65,7 +65,7 @@ DeviceInfoWidget::DeviceInfoWidget( QWidget* parent ) m_ptIcon->setPalette( palette ); m_ptLabel->setPalette( palette ); - CALAMARES_RETRANSLATE( retranslateUi(); ) + CALAMARES_RETRANSLATE_SLOT( &DeviceInfoWidget::retranslateUi ) } diff --git a/src/modules/partition/gui/ScanningDialog.cpp b/src/modules/partition/gui/ScanningDialog.cpp index 9084be2cc..85479fbb3 100644 --- a/src/modules/partition/gui/ScanningDialog.cpp +++ b/src/modules/partition/gui/ScanningDialog.cpp @@ -19,7 +19,7 @@ #include "ScanningDialog.h" -#include "widgets/waitingspinnerwidget.h" +#include "3rdparty/waitingspinnerwidget.h" #include #include diff --git a/src/modules/postcfg/main.py b/src/modules/postcfg/main.py index 00a03afa3..d847df73f 100644 --- a/src/modules/postcfg/main.py +++ b/src/modules/postcfg/main.py @@ -3,7 +3,7 @@ # # === This file is part of Calamares - === # -# Copyright 2014 - 2018, Philip Müller +# Copyright 2014 - 2019, Philip Müller # Copyright 2016, Artoo # # Calamares is free software: you can redistribute it and/or modify @@ -62,6 +62,12 @@ class ConfigController: if exists(join(self.root, path)): target_env_call(['pacman', '-R', '--noconfirm', pkg]) + def umount(self, mp): + subprocess.call(["umount", "-l", join(self.root, mp)]) + + def mount(self, mp): + subprocess.call(["mount", "-Br", "/" + mp, join(self.root, mp)]) + def run(self): self.init_keyring() self.populate_keyring() @@ -105,6 +111,19 @@ class ConfigController: if exists(join(self.root, "usr/bin/grub-set-bootflag")): target_env_call(["grub-editenv", "-", "set", "menu_auto_hide=1", "boot_success=1"]) + # Install Office Suite if selected (WIP) + office_package = libcalamares.globalstorage.value("packagechooser_officechooser") + if not office_package: + libcalamares.utils.warning("no office suite selected, {!s}".format(office_package)) + else: + # For PoC we added the Office Packages to mhwd-live overlay in 18.1-rc7 + cmd = ["pacman", "-S", office_package, "--noconfirm", "--config", "/opt/pacman-mhwd.conf" ] + self.mount("opt") + self.mount("etc/resolv.conf") + target_env_call(cmd) + self.umount("opt") + self.umount("etc/resolv.conf") + return None diff --git a/src/modules/preservefiles/CMakeLists.txt b/src/modules/preservefiles/CMakeLists.txt index c1021eeda..f6cd98008 100644 --- a/src/modules/preservefiles/CMakeLists.txt +++ b/src/modules/preservefiles/CMakeLists.txt @@ -8,6 +8,7 @@ calamares_add_plugin( preservefiles PreserveFiles.cpp LINK_PRIVATE_LIBRARIES calamares + # REQUIRES mount # To set the rootMountPoint SHARED_LIB EMERGENCY ) diff --git a/src/modules/shellprocess/ShellProcessJob.cpp b/src/modules/shellprocess/ShellProcessJob.cpp index d688540ae..ff73e83af 100644 --- a/src/modules/shellprocess/ShellProcessJob.cpp +++ b/src/modules/shellprocess/ShellProcessJob.cpp @@ -18,13 +18,13 @@ #include "ShellProcessJob.h" -#include #include +#include #include #include "CalamaresVersion.h" -#include "JobQueue.h" #include "GlobalStorage.h" +#include "JobQueue.h" #include "utils/CommandList.h" #include "utils/Logger.h" @@ -55,7 +55,7 @@ Calamares::JobResult ShellProcessJob::exec() { - if ( ! m_commands || m_commands->isEmpty() ) + if ( !m_commands || m_commands->isEmpty() ) { cWarning() << "No commands to execute" << moduleInstanceKey(); return Calamares::JobResult::ok(); @@ -69,18 +69,25 @@ void ShellProcessJob::setConfigurationMap( const QVariantMap& configurationMap ) { bool dontChroot = CalamaresUtils::getBool( configurationMap, "dontChroot", false ); - int timeout = CalamaresUtils::getInteger( configurationMap, "timeout", 10 ); + qint64 timeout = CalamaresUtils::getInteger( configurationMap, "timeout", 10 ); if ( timeout < 1 ) + { timeout = 10; + } if ( configurationMap.contains( "script" ) ) { - m_commands = new CalamaresUtils::CommandList( configurationMap.value( "script" ), !dontChroot, timeout ); + m_commands = new CalamaresUtils::CommandList( + configurationMap.value( "script" ), !dontChroot, std::chrono::seconds( timeout ) ); if ( m_commands->isEmpty() ) + { cDebug() << "ShellProcessJob: \"script\" contains no commands for" << moduleInstanceKey(); + } } else + { cWarning() << "No script given for ShellProcessJob" << moduleInstanceKey(); + } } -CALAMARES_PLUGIN_FACTORY_DEFINITION( ShellProcessJobFactory, registerPlugin(); ) +CALAMARES_PLUGIN_FACTORY_DEFINITION( ShellProcessJobFactory, registerPlugin< ShellProcessJob >(); ) diff --git a/src/modules/shellprocess/ShellProcessJob.h b/src/modules/shellprocess/ShellProcessJob.h index 3111fc26e..b9a255d95 100644 --- a/src/modules/shellprocess/ShellProcessJob.h +++ b/src/modules/shellprocess/ShellProcessJob.h @@ -50,4 +50,4 @@ private: CALAMARES_PLUGIN_FACTORY_DECLARATION( ShellProcessJobFactory ) -#endif // SHELLPROCESSJOB_H +#endif // SHELLPROCESSJOB_H diff --git a/src/modules/shellprocess/Tests.cpp b/src/modules/shellprocess/Tests.cpp index 488f4a7af..943a70957 100644 --- a/src/modules/shellprocess/Tests.cpp +++ b/src/modules/shellprocess/Tests.cpp @@ -34,14 +34,12 @@ QTEST_GUILESS_MAIN( ShellProcessTests ) using CommandList = CalamaresUtils::CommandList; +using std::operator""s; -ShellProcessTests::ShellProcessTests() -{ -} -ShellProcessTests::~ShellProcessTests() -{ -} +ShellProcessTests::ShellProcessTests() {} + +ShellProcessTests::~ShellProcessTests() {} void ShellProcessTests::initTestCase() @@ -64,15 +62,16 @@ ShellProcessTests::testProcessListSampleConfig() } } - CommandList cl( - CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); + CommandList cl( CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); QVERIFY( !cl.isEmpty() ); QCOMPARE( cl.count(), 3 ); - QCOMPARE( cl.at(0).timeout(), -1 ); - QCOMPARE( cl.at(2).timeout(), 3600 ); // slowloris + + QCOMPARE( cl.at( 0 ).timeout(), CalamaresUtils::CommandLine::TimeoutNotSet() ); + QCOMPARE( cl.at( 2 ).timeout(), 3600s ); // slowloris } -void ShellProcessTests::testProcessListFromList() +void +ShellProcessTests::testProcessListFromList() { YAML::Node doc = YAML::Load( R"(--- script: @@ -80,8 +79,7 @@ script: - "ls /nonexistent" - "/bin/false" )" ); - CommandList cl( - CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); + CommandList cl( CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); QVERIFY( !cl.isEmpty() ); QCOMPARE( cl.count(), 3 ); @@ -92,51 +90,51 @@ script: - false - "ls /nonexistent" )" ); - CommandList cl1( - CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); + CommandList cl1( CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); QVERIFY( !cl1.isEmpty() ); QCOMPARE( cl1.count(), 2 ); // One element ignored } -void ShellProcessTests::testProcessListFromString() +void +ShellProcessTests::testProcessListFromString() { YAML::Node doc = YAML::Load( R"(--- script: "ls /tmp" )" ); - CommandList cl( - CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); + CommandList cl( CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); + QVERIFY( !cl.isEmpty() ); QCOMPARE( cl.count(), 1 ); - QCOMPARE( cl.at(0).timeout(), 10 ); - QCOMPARE( cl.at(0).command(), QStringLiteral( "ls /tmp" ) ); + QCOMPARE( cl.at( 0 ).timeout(), 10s ); + QCOMPARE( cl.at( 0 ).command(), QStringLiteral( "ls /tmp" ) ); // Not a string doc = YAML::Load( R"(--- script: false )" ); - CommandList cl1( - CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); + CommandList cl1( CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); QVERIFY( cl1.isEmpty() ); QCOMPARE( cl1.count(), 0 ); - } -void ShellProcessTests::testProcessFromObject() +void +ShellProcessTests::testProcessFromObject() { YAML::Node doc = YAML::Load( R"(--- script: command: "ls /tmp" timeout: 20 )" ); - CommandList cl( - CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); + CommandList cl( CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); + QVERIFY( !cl.isEmpty() ); QCOMPARE( cl.count(), 1 ); - QCOMPARE( cl.at(0).timeout(), 20 ); - QCOMPARE( cl.at(0).command(), QStringLiteral( "ls /tmp" ) ); + QCOMPARE( cl.at( 0 ).timeout(), 20s ); + QCOMPARE( cl.at( 0 ).command(), QStringLiteral( "ls /tmp" ) ); } -void ShellProcessTests::testProcessListFromObject() +void +ShellProcessTests::testProcessListFromObject() { YAML::Node doc = YAML::Load( R"(--- script: @@ -144,34 +142,36 @@ script: timeout: 12 - "-/bin/false" )" ); - CommandList cl( - CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); + CommandList cl( CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ) ); QVERIFY( !cl.isEmpty() ); QCOMPARE( cl.count(), 2 ); - QCOMPARE( cl.at(0).timeout(), 12 ); - QCOMPARE( cl.at(0).command(), QStringLiteral( "ls /tmp" ) ); - QCOMPARE( cl.at(1).timeout(), -1 ); // not set + QCOMPARE( cl.at( 0 ).timeout(), 12s ); + QCOMPARE( cl.at( 0 ).command(), QStringLiteral( "ls /tmp" ) ); + QCOMPARE( cl.at( 1 ).timeout(), CalamaresUtils::CommandLine::TimeoutNotSet() ); // not set } -void ShellProcessTests::testRootSubstitution() +void +ShellProcessTests::testRootSubstitution() { YAML::Node doc = YAML::Load( R"(--- script: - "ls /tmp" )" ); QVariant plainScript = CalamaresUtils::yamlMapToVariant( doc ).toMap().value( "script" ); - QVariant rootScript = CalamaresUtils::yamlMapToVariant( - YAML::Load( R"(--- + QVariant rootScript = CalamaresUtils::yamlMapToVariant( YAML::Load( R"(--- script: - "ls @@ROOT@@" -)" ) ).toMap().value( "script" ); - QVariant userScript = CalamaresUtils::yamlMapToVariant( - YAML::Load( R"(--- +)" ) ) + .toMap() + .value( "script" ); + QVariant userScript = CalamaresUtils::yamlMapToVariant( YAML::Load( R"(--- script: - mktemp -d @@ROOT@@/calatestXXXXXXXX - "chown @@USER@@ @@ROOT@@/calatest*" - rm -rf @@ROOT@@/calatest* -)" ) ).toMap().value( "script" ); +)" ) ) + .toMap() + .value( "script" ); if ( !Calamares::JobQueue::instance() ) (void)new Calamares::JobQueue( nullptr ); @@ -182,30 +182,31 @@ script: QVERIFY( gs != nullptr ); qDebug() << "Expect WARNING, ERROR, WARNING"; + // Doesn't use @@ROOT@@, so no failures - QVERIFY( bool(CommandList(plainScript, false, 10 ).run()) ); + QVERIFY( bool( CommandList( plainScript, false, 10s ).run() ) ); // Doesn't use @@ROOT@@, but does chroot, so fails - QVERIFY( !bool(CommandList(plainScript, true, 10 ).run()) ); + QVERIFY( !bool( CommandList( plainScript, true, 10s ).run() ) ); // Does use @@ROOT@@, which is not set, so fails - QVERIFY( !bool(CommandList(rootScript, false, 10 ).run()) ); + QVERIFY( !bool( CommandList( rootScript, false, 10s ).run() ) ); // .. fails for two reasons - QVERIFY( !bool(CommandList(rootScript, true, 10 ).run()) ); + QVERIFY( !bool( CommandList( rootScript, true, 10s ).run() ) ); gs->insert( "rootMountPoint", "/tmp" ); // Now that the root is set, two variants work .. still can't // chroot, unless the rootMountPoint contains a full system, // *and* we're allowed to chroot (ie. running tests as root). qDebug() << "Expect no output."; - QVERIFY( bool(CommandList(plainScript, false, 10 ).run()) ); - QVERIFY( bool(CommandList(rootScript, false, 10 ).run()) ); + QVERIFY( bool( CommandList( plainScript, false, 10s ).run() ) ); + QVERIFY( bool( CommandList( rootScript, false, 10s ).run() ) ); qDebug() << "Expect ERROR"; // But no user set yet - QVERIFY( !bool(CommandList(userScript, false, 10 ).run()) ); + QVERIFY( !bool( CommandList( userScript, false, 10s ).run() ) ); // Now play dangerous games with shell expansion gs->insert( "username", "`id -u`" ); - QVERIFY( bool(CommandList(userScript, false, 10 ).run()) ); + QVERIFY( bool( CommandList( userScript, false, 10s ).run() ) ); } diff --git a/src/modules/tracking/TrackingJobs.cpp b/src/modules/tracking/TrackingJobs.cpp index 7875ee6db..f101c8e6c 100644 --- a/src/modules/tracking/TrackingJobs.cpp +++ b/src/modules/tracking/TrackingJobs.cpp @@ -18,121 +18,109 @@ #include "TrackingJobs.h" +#include "network/Manager.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" -#include -#include -#include #include #include +#include + TrackingInstallJob::TrackingInstallJob( const QString& url ) : m_url( url ) - , m_networkManager( nullptr ) { } TrackingInstallJob::~TrackingInstallJob() { - delete m_networkManager; } -QString TrackingInstallJob::prettyName() const +QString +TrackingInstallJob::prettyName() const { return tr( "Installation feedback" ); } -QString TrackingInstallJob::prettyDescription() const +QString +TrackingInstallJob::prettyDescription() const { return prettyName(); } -QString TrackingInstallJob::prettyStatusMessage() const +QString +TrackingInstallJob::prettyStatusMessage() const { return tr( "Sending installation feedback." ); } -Calamares::JobResult TrackingInstallJob::exec() +Calamares::JobResult +TrackingInstallJob::exec() { - m_networkManager = new QNetworkAccessManager(); + using CalamaresUtils::Network::Manager; + using CalamaresUtils::Network::RequestOptions; + using CalamaresUtils::Network::RequestStatus; - QNetworkRequest request; - request.setUrl( QUrl( m_url ) ); - // Follows all redirects except unsafe ones (https to http). - request.setAttribute( QNetworkRequest::FollowRedirectsAttribute, true ); - // Not everybody likes the default User Agent used by this class (looking at you, - // sourceforge.net), so let's set a more descriptive one. - request.setRawHeader( "User-Agent", "Mozilla/5.0 (compatible; Calamares)" ); - - QTimer timeout; - timeout.setSingleShot(true); - - QEventLoop loop; - - connect( m_networkManager, &QNetworkAccessManager::finished, - this, &TrackingInstallJob::dataIsHere ); - connect( m_networkManager, &QNetworkAccessManager::finished, - &loop, &QEventLoop::quit ); - connect( &timeout, &QTimer::timeout, - &loop, &QEventLoop::quit ); - - m_networkManager->get( request ); // The semaphore is released when data is received - timeout.start( 5000 /* ms */ ); - - loop.exec(); - - if ( !timeout.isActive() ) + auto result = Manager::instance().synchronousPing( + QUrl( m_url ), + RequestOptions( RequestOptions::FollowRedirect | RequestOptions::FakeUserAgent, + RequestOptions::milliseconds( 5000 ) ) ); + if ( result.status == RequestStatus::Timeout ) { cWarning() << "install-tracking request timed out."; return Calamares::JobResult::error( tr( "Internal error in install-tracking." ), tr( "HTTP request timed out." ) ); } - timeout.stop(); - return Calamares::JobResult::ok(); } -void TrackingInstallJob::dataIsHere( QNetworkReply* reply ) -{ - cDebug() << "Installation feedback request OK"; - reply->deleteLater(); -} - -QString TrackingMachineNeonJob::prettyName() const +QString +TrackingMachineNeonJob::prettyName() const { return tr( "Machine feedback" ); } -QString TrackingMachineNeonJob::prettyDescription() const +QString +TrackingMachineNeonJob::prettyDescription() const { return prettyName(); } -QString TrackingMachineNeonJob::prettyStatusMessage() const +QString +TrackingMachineNeonJob::prettyStatusMessage() const { return tr( "Configuring machine feedback." ); } -Calamares::JobResult TrackingMachineNeonJob::exec() +Calamares::JobResult +TrackingMachineNeonJob::exec() { - int r = CalamaresUtils::System::instance()->targetEnvCall( - "/bin/sh", - QString(), // Working dir - QString( -R"x(MACHINE_ID=`cat /etc/machine-id` + static const auto script = QStringLiteral( + R"x( +MACHINE_ID=`cat /etc/machine-id` sed -i "s,URI =.*,URI = http://releases.neon.kde.org/meta-release/${MACHINE_ID}," /etc/update-manager/meta-release sed -i "s,URI_LTS =.*,URI_LTS = http://releases.neon.kde.org/meta-release-lts/${MACHINE_ID}," /etc/update-manager/meta-release true -)x"), - 1); +)x" ); + int r = CalamaresUtils::System::instance()->targetEnvCall( "/bin/sh", + QString(), // Working dir + script, + std::chrono::seconds( 1 ) ); if ( r == 0 ) + { return Calamares::JobResult::ok(); + } else if ( r > 0 ) - return Calamares::JobResult::error( tr( "Error in machine feedback configuration." ), - tr( "Could not configure machine feedback correctly, script error %1." ).arg( r ) ); + { + return Calamares::JobResult::error( + tr( "Error in machine feedback configuration." ), + tr( "Could not configure machine feedback correctly, script error %1." ).arg( r ) ); + } else - return Calamares::JobResult::error( tr( "Error in machine feedback configuration." ), - tr( "Could not configure machine feedback correctly, Calamares error %1." ).arg( r ) ); + { + return Calamares::JobResult::error( + tr( "Error in machine feedback configuration." ), + tr( "Could not configure machine feedback correctly, Calamares error %1." ).arg( r ) ); + } } diff --git a/src/modules/tracking/TrackingJobs.h b/src/modules/tracking/TrackingJobs.h index a379441c9..7351c3346 100644 --- a/src/modules/tracking/TrackingJobs.h +++ b/src/modules/tracking/TrackingJobs.h @@ -21,13 +21,10 @@ #include "Job.h" -class QNetworkAccessManager; -class QNetworkReply; class QSemaphore; class TrackingInstallJob : public Calamares::Job { - Q_OBJECT public: TrackingInstallJob( const QString& url ); ~TrackingInstallJob() override; @@ -37,13 +34,8 @@ public: QString prettyStatusMessage() const override; Calamares::JobResult exec() override; -public slots: - void dataIsHere( QNetworkReply* ); - private: const QString m_url; - - QNetworkAccessManager* m_networkManager; }; class TrackingMachineNeonJob : public Calamares::Job diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index 924ac43d9..82ee6b01d 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -21,18 +21,18 @@ #include "ui_page_trackingstep.h" #include "Branding.h" -#include "JobQueue.h" #include "GlobalStorage.h" -#include "utils/Logger.h" -#include "utils/CalamaresUtilsGui.h" -#include "utils/Retranslator.h" +#include "JobQueue.h" #include "ViewManager.h" +#include "utils/CalamaresUtilsGui.h" +#include "utils/Logger.h" +#include "utils/Retranslator.h" #include #include #include -TrackingPage::TrackingPage(QWidget *parent) +TrackingPage::TrackingPage( QWidget* parent ) : QWidget( parent ) , ui( new Ui::TrackingPage ) { @@ -40,14 +40,22 @@ TrackingPage::TrackingPage(QWidget *parent) ui->setupUi( this ); CALAMARES_RETRANSLATE( - ui->retranslateUi( this ); - ui->generalExplanation->setText( tr( "Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with the last two options below), get continuous information about preferred applications. To see what will be sent, please click the help icon next to each area." ).arg( *StringEntry::ShortProductName ) ); - ui->installExplanation->setText( tr( "By selecting this you will send information about your installation and hardware. This information will only be sent once after the installation finishes." ) ); - ui->machineExplanation->setText( tr( "By selecting this you will periodically send information about your installation, hardware and applications, to %1." ).arg( *StringEntry::ShortProductName ) ); - ui->userExplanation->setText( tr( "By selecting this you will regularly send information about your installation, hardware, applications and usage patterns, to %1." ).arg( *StringEntry::ShortProductName ) ); - ) + ui->retranslateUi( this ); ui->generalExplanation->setText( + tr( "Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with " + "the last two options below), get continuous information about preferred applications. To see what " + "will be sent, please click the help icon next to each area." ) + .arg( *StringEntry::ShortProductName ) ); + ui->installExplanation->setText( + tr( "By selecting this you will send information about your installation and hardware. This information " + "will only be sent once after the installation finishes." ) ); + ui->machineExplanation->setText( tr( "By selecting this you will periodically send information about " + "your installation, hardware and applications, to %1." ) + .arg( *StringEntry::ShortProductName ) ); + ui->userExplanation->setText( tr( "By selecting this you will regularly send information about your " + "installation, hardware, applications and usage patterns, to %1." ) + .arg( *StringEntry::ShortProductName ) ); ) - QButtonGroup *group = new QButtonGroup( this ); + QButtonGroup* group = new QButtonGroup( this ); group->setExclusive( true ); group->addButton( ui->noneRadio ); group->addButton( ui->installRadio ); @@ -56,114 +64,143 @@ TrackingPage::TrackingPage(QWidget *parent) ui->noneRadio->setChecked( true ); } -void TrackingPage::enableTrackingOption(TrackingType t, bool enabled) +void +TrackingPage::enableTrackingOption( TrackingType t, bool enabled ) { QWidget* group = nullptr; switch ( t ) { - case TrackingType::InstallTracking: - group = ui->installGroup; - break; - case TrackingType::MachineTracking: - group = ui->machineGroup; - break; - case TrackingType::UserTracking: - group = ui->userGroup; - break; + case TrackingType::InstallTracking: + group = ui->installGroup; + break; + case TrackingType::MachineTracking: + group = ui->machineGroup; + break; + case TrackingType::UserTracking: + group = ui->userGroup; + break; } if ( group != nullptr ) { if ( enabled ) + { group->show(); + } else + { group->hide(); + } } else - cWarning() << "unknown tracking option" << int(t); + { + cWarning() << "unknown tracking option" << int( t ); + } } -bool TrackingPage::getTrackingOption(TrackingType t) +bool +TrackingPage::getTrackingOption( TrackingType t ) { bool enabled = false; // A tracking type is enabled if it is checked, or // any higher level is checked. -#define ch(x) ui->x->isChecked() +#define ch( x ) ui->x->isChecked() switch ( t ) { - case TrackingType::InstallTracking: - enabled = ch(installRadio) || ch(machineRadio) || ch(userRadio); - break; - case TrackingType::MachineTracking: - enabled = ch(machineRadio) || ch(userRadio); - break; - case TrackingType::UserTracking: - enabled = ch(userRadio); - break; + case TrackingType::InstallTracking: + enabled = ch( installRadio ) || ch( machineRadio ) || ch( userRadio ); + break; + case TrackingType::MachineTracking: + enabled = ch( machineRadio ) || ch( userRadio ); + break; + case TrackingType::UserTracking: + enabled = ch( userRadio ); + break; } #undef ch return enabled; } -void TrackingPage::setTrackingPolicy(TrackingType t, QString url) +void +TrackingPage::setTrackingPolicy( TrackingType t, QString url ) { - QToolButton *button = nullptr; - switch( t ) + QToolButton* button = nullptr; + switch ( t ) { - case TrackingType::InstallTracking: - button = ui->installPolicyButton; - break; - case TrackingType::MachineTracking: - button = ui->machinePolicyButton; - break; - case TrackingType::UserTracking: - button = ui->userPolicyButton; - break; + case TrackingType::InstallTracking: + button = ui->installPolicyButton; + break; + case TrackingType::MachineTracking: + button = ui->machinePolicyButton; + break; + case TrackingType::UserTracking: + button = ui->userPolicyButton; + break; } if ( button != nullptr ) if ( url.isEmpty() ) + { button->hide(); + } else { - connect( button, &QToolButton::clicked, [url]{ QDesktopServices::openUrl( url ); } ); - cDebug() << "Tracking policy" << int(t) << "set to" << url; + connect( button, &QToolButton::clicked, [url] { QDesktopServices::openUrl( url ); } ); + cDebug() << "Tracking policy" << int( t ) << "set to" << url; } - else - cWarning() << "unknown tracking option" << int(t); -} - -void TrackingPage::setGeneralPolicy( QString url ) -{ - if ( url.isEmpty() ) - ui->generalPolicyLabel->hide(); else { - ui->generalPolicyLabel->show(); - ui->generalPolicyLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); - ui->generalPolicyLabel->show(); - connect( ui->generalPolicyLabel, &QLabel::linkActivated, [url]{ QDesktopServices::openUrl( url ); } ); + cWarning() << "unknown tracking option" << int( t ); } } -void TrackingPage::setTrackingLevel(const QString& l) +void +TrackingPage::setGeneralPolicy( QString url ) +{ + if ( url.isEmpty() ) + { + ui->generalPolicyLabel->hide(); + } + else + { + ui->generalPolicyLabel->show(); + ui->generalPolicyLabel->setTextInteractionFlags( Qt::TextBrowserInteraction ); + ui->generalPolicyLabel->show(); + connect( ui->generalPolicyLabel, &QLabel::linkActivated, [url] { QDesktopServices::openUrl( url ); } ); + } +} + +void +TrackingPage::setTrackingLevel( const QString& l ) { QString level = l.toLower(); QRadioButton* button = nullptr; - if (level.isEmpty() || level == "none") + if ( level.isEmpty() || level == "none" ) + { button = ui->noneRadio; - else if (level == "install") + } + else if ( level == "install" ) + { button = ui->installRadio; - else if (level == "machine") + } + else if ( level == "machine" ) + { button = ui->machineRadio; - else if (level == "user") + } + else if ( level == "user" ) + { button = ui->userRadio; + } if ( button != nullptr ) + { button->setChecked( true ); + } else + { cWarning() << "unknown default tracking level" << l; + } } diff --git a/src/modules/tracking/TrackingPage.h b/src/modules/tracking/TrackingPage.h index ac667d5e6..560115b92 100644 --- a/src/modules/tracking/TrackingPage.h +++ b/src/modules/tracking/TrackingPage.h @@ -21,8 +21,8 @@ #include "TrackingType.h" -#include #include +#include namespace Ui { @@ -61,4 +61,4 @@ private: Ui::TrackingPage* ui; }; -#endif //TRACKINGPAGE_H +#endif //TRACKINGPAGE_H diff --git a/src/modules/tracking/TrackingType.h b/src/modules/tracking/TrackingType.h index 5c97e8485..02dbd934e 100644 --- a/src/modules/tracking/TrackingType.h +++ b/src/modules/tracking/TrackingType.h @@ -24,6 +24,6 @@ enum class TrackingType InstallTracking, MachineTracking, UserTracking -} ; +}; -#endif //TRACKINGTYPE_H +#endif //TRACKINGTYPE_H diff --git a/src/modules/tracking/TrackingViewStep.cpp b/src/modules/tracking/TrackingViewStep.cpp index cb48b340b..a51864ea9 100644 --- a/src/modules/tracking/TrackingViewStep.cpp +++ b/src/modules/tracking/TrackingViewStep.cpp @@ -21,20 +21,21 @@ #include "TrackingJobs.h" #include "TrackingPage.h" -#include "JobQueue.h" #include "GlobalStorage.h" +#include "JobQueue.h" -#include "utils/Logger.h" #include "utils/CalamaresUtilsSystem.h" +#include "utils/Logger.h" #include "utils/Variant.h" #include #include -CALAMARES_PLUGIN_FACTORY_DEFINITION( TrackingViewStepFactory, registerPlugin(); ) +CALAMARES_PLUGIN_FACTORY_DEFINITION( TrackingViewStepFactory, registerPlugin< TrackingViewStep >(); ) /** @brief Is @p s a valid machine-tracking style. */ -static bool isValidStyle( const QString& s ) +static bool +isValidStyle( const QString& s ) { static QStringList knownStyles { "neon" }; return knownStyles.contains( s ); @@ -51,7 +52,9 @@ TrackingViewStep::TrackingViewStep( QObject* parent ) TrackingViewStep::~TrackingViewStep() { if ( m_widget && m_widget->parent() == nullptr ) + { m_widget->deleteLater(); + } } @@ -97,11 +100,12 @@ TrackingViewStep::isAtEnd() const } -void TrackingViewStep::onLeave() +void +TrackingViewStep::onLeave() { - m_installTracking.userEnabled = m_widget->getTrackingOption( TrackingType::InstallTracking ); - m_machineTracking.userEnabled = m_widget->getTrackingOption( TrackingType::MachineTracking ); - m_userTracking.userEnabled = m_widget->getTrackingOption( TrackingType::UserTracking ); + m_installTracking.userEnabled = m_widget->getTrackingOption( TrackingType::InstallTracking ); + m_machineTracking.userEnabled = m_widget->getTrackingOption( TrackingType::MachineTracking ); + m_userTracking.userEnabled = m_widget->getTrackingOption( TrackingType::UserTracking ); cDebug() << "Install tracking:" << m_installTracking.enabled(); cDebug() << "Machine tracking:" << m_machineTracking.enabled(); cDebug() << " User tracking:" << m_userTracking.enabled(); @@ -123,10 +127,7 @@ TrackingViewStep::jobs() const memory.setNum( s->getTotalMemoryB().first ); disk.setNum( s->getTotalDiskB() ); - installUrl - .replace( "$CPU", s->getCpuDescription() ) - .replace( "$MEMORY", memory ) - .replace( "$DISK", disk ); + installUrl.replace( "$CPU", s->getCpuDescription() ).replace( "$MEMORY", memory ).replace( "$DISK", disk ); cDebug() << Logger::SubEntry << "install-tracking URL" << installUrl; @@ -137,13 +138,16 @@ TrackingViewStep::jobs() const { Q_ASSERT( isValidStyle( m_machineTrackingStyle ) ); if ( m_machineTrackingStyle == "neon" ) + { l.append( Calamares::job_ptr( new TrackingMachineNeonJob() ) ); + } } return l; } -QVariantMap TrackingViewStep::setTrackingOption(const QVariantMap& configurationMap, const QString& key, TrackingType t) +QVariantMap +TrackingViewStep::setTrackingOption( const QVariantMap& configurationMap, const QString& key, TrackingType t ) { bool settingEnabled = false; @@ -159,8 +163,8 @@ QVariantMap TrackingViewStep::setTrackingOption(const QVariantMap& configuration trackingConfiguration.settingEnabled = settingEnabled; trackingConfiguration.userEnabled = false; - m_widget->enableTrackingOption(t, settingEnabled); - m_widget->setTrackingPolicy(t, CalamaresUtils::getString( config, "policy" ) ); + m_widget->enableTrackingOption( t, settingEnabled ); + m_widget->setTrackingPolicy( t, CalamaresUtils::getString( config, "policy" ) ); return config; } @@ -176,7 +180,9 @@ TrackingViewStep::setConfigurationMap( const QVariantMap& configurationMap ) config = setTrackingOption( configurationMap, "machine", TrackingType::MachineTracking ); auto s = CalamaresUtils::getString( config, "style" ); if ( isValidStyle( s ) ) + { m_machineTrackingStyle = s; + } setTrackingOption( configurationMap, "user", TrackingType::UserTracking ); diff --git a/src/modules/tracking/TrackingViewStep.h b/src/modules/tracking/TrackingViewStep.h index aaaf3bbae..dc952253a 100644 --- a/src/modules/tracking/TrackingViewStep.h +++ b/src/modules/tracking/TrackingViewStep.h @@ -21,9 +21,9 @@ #include "TrackingType.h" +#include #include #include -#include #include #include @@ -65,12 +65,13 @@ private: struct TrackingEnabled { bool settingEnabled; // Enabled in config file - bool userEnabled; // User checked "yes" + bool userEnabled; // User checked "yes" TrackingEnabled() : settingEnabled( false ) , userEnabled( false ) - {} + { + } bool enabled() const { return settingEnabled && userEnabled; } }; @@ -78,15 +79,21 @@ private: inline TrackingEnabled& tracking( TrackingType t ) { - if (t == TrackingType::UserTracking) + if ( t == TrackingType::UserTracking ) + { return m_userTracking; - else if (t == TrackingType::MachineTracking) + } + else if ( t == TrackingType::MachineTracking ) + { return m_machineTracking; + } else + { return m_installTracking; + } } }; CALAMARES_PLUGIN_FACTORY_DECLARATION( TrackingViewStepFactory ) -#endif // TRACKINGVIEWSTEP_H +#endif // TRACKINGVIEWSTEP_H diff --git a/src/modules/unpackfs/main.py b/src/modules/unpackfs/main.py index ac90a994e..90c258cd7 100644 --- a/src/modules/unpackfs/main.py +++ b/src/modules/unpackfs/main.py @@ -103,6 +103,7 @@ def file_copy(source, dest, progress_cb): if not source.endswith("/"): source += "/" + num_files_total_local = 0 num_files_copied = 0 # Gets updated through rsync output args = ['rsync', '-aHAXr'] @@ -207,7 +208,7 @@ class UnpackOperation: imgbasename = os.path.splitext( os.path.basename(entry.source))[0] imgmountdir = os.path.join(source_mount_path, imgbasename) - os.mkdir(imgmountdir) + os.makedirs(imgmountdir, exist_ok=True) self.mount_image(entry, imgmountdir) diff --git a/src/modules/unpackfs/module.desc b/src/modules/unpackfs/module.desc index 67a56b06c..4b3086e44 100644 --- a/src/modules/unpackfs/module.desc +++ b/src/modules/unpackfs/module.desc @@ -4,3 +4,5 @@ type: "job" name: "unpackfs" interface: "python" script: "main.py" +requiredModules: + - mount diff --git a/src/modules/users/CreateUserJob.cpp b/src/modules/users/CreateUserJob.cpp index d7e356231..788ba0195 100644 --- a/src/modules/users/CreateUserJob.cpp +++ b/src/modules/users/CreateUserJob.cpp @@ -158,7 +158,7 @@ CreateUserJob::exec() if ( commandResult.getExitCode() ) { cError() << "useradd failed" << commandResult.getExitCode(); - return commandResult.explainProcess( useradd, 10 /* bogus timeout */ ); + return commandResult.explainProcess( useradd, std::chrono::seconds( 10 ) /* bogus timeout */ ); } commandResult = CalamaresUtils::System::instance()->targetEnvCommand( @@ -166,7 +166,7 @@ CreateUserJob::exec() if ( commandResult.getExitCode() ) { cError() << "usermod failed" << commandResult.getExitCode(); - return commandResult.explainProcess( "usermod", 10 ); + return commandResult.explainProcess( "usermod", std::chrono::seconds( 10 ) /* bogus timeout */ ); } QString userGroup = QString( "%1:%2" ).arg( m_userName ).arg( m_userName ); @@ -176,7 +176,7 @@ CreateUserJob::exec() if ( commandResult.getExitCode() ) { cError() << "chown failed" << commandResult.getExitCode(); - return commandResult.explainProcess( "chown", 10 ); + return commandResult.explainProcess( "chown", std::chrono::seconds( 10 ) /* bogus timeout */ ); } return Calamares::JobResult::ok(); diff --git a/src/modules/welcome/WelcomePage.cpp b/src/modules/welcome/WelcomePage.cpp index b29b2e23e..02f91f79f 100644 --- a/src/modules/welcome/WelcomePage.cpp +++ b/src/modules/welcome/WelcomePage.cpp @@ -20,8 +20,8 @@ #include "WelcomePage.h" -#include "ui_WelcomePage.h" #include "checker/CheckerContainer.h" +#include "ui_WelcomePage.h" #include "Branding.h" #include "CalamaresVersion.h" @@ -32,6 +32,7 @@ #include "modulesystem/ModuleManager.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" +#include "utils/NamedEnum.h" #include "utils/Retranslator.h" #include @@ -48,9 +49,18 @@ WelcomePage::WelcomePage( QWidget* parent ) , m_checkingWidget( new CheckerContainer( this ) ) , m_languages( nullptr ) { - connect( Calamares::ModuleManager::instance(), &Calamares::ModuleManager::requirementsResult, m_checkingWidget, &CheckerContainer::requirementsChecked ); - connect( Calamares::ModuleManager::instance(), &Calamares::ModuleManager::requirementsComplete, m_checkingWidget, &CheckerContainer::requirementsComplete ); - connect( Calamares::ModuleManager::instance(), &Calamares::ModuleManager::requirementsProgress, m_checkingWidget, &CheckerContainer::requirementsProgress ); + connect( Calamares::ModuleManager::instance(), + &Calamares::ModuleManager::requirementsResult, + m_checkingWidget, + &CheckerContainer::requirementsChecked ); + connect( Calamares::ModuleManager::instance(), + &Calamares::ModuleManager::requirementsComplete, + m_checkingWidget, + &CheckerContainer::requirementsComplete ); + connect( Calamares::ModuleManager::instance(), + &Calamares::ModuleManager::requirementsProgress, + m_checkingWidget, + &CheckerContainer::requirementsProgress ); ui->setupUi( this ); ui->verticalLayout->insertSpacing( 1, CalamaresUtils::defaultFontHeight() * 2 ); @@ -61,66 +71,18 @@ WelcomePage::WelcomePage( QWidget* parent ) ui->mainText->setOpenExternalLinks( true ); cDebug() << "Welcome string" << Calamares::Branding::instance()->welcomeStyleCalamares() - << *Calamares::Branding::VersionedName; + << *Calamares::Branding::VersionedName; - CALAMARES_RETRANSLATE( - QString message; + CALAMARES_RETRANSLATE_SLOT( &WelcomePage::retranslate ) - if ( Calamares::Settings::instance()->isSetupMode() ) - message = Calamares::Branding::instance()->welcomeStyleCalamares() - ? tr( "

Welcome to the Calamares setup program for %1.

" ) - : tr( "

Welcome to %1 setup.

" ); - else - message = Calamares::Branding::instance()->welcomeStyleCalamares() - ? tr( "

Welcome to the Calamares installer for %1.

" ) - : tr( "

Welcome to the %1 installer.

" ); + ui->aboutButton->setIcon( CalamaresUtils::defaultPixmap( + CalamaresUtils::Information, + CalamaresUtils::Original, + 2 * QSize( CalamaresUtils::defaultFontHeight(), CalamaresUtils::defaultFontHeight() ) ) ); + connect( ui->aboutButton, &QPushButton::clicked, this, &WelcomePage::showAboutBox ); - ui->mainText->setText( message.arg( *Calamares::Branding::VersionedName ) ); - ui->retranslateUi( this ); - ) - - ui->aboutButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::Information, - CalamaresUtils::Original, - 2*QSize( CalamaresUtils::defaultFontHeight(), - CalamaresUtils::defaultFontHeight() ) ) ); - connect( ui->aboutButton, &QPushButton::clicked, - this, [ this ] - { - QString title = Calamares::Settings::instance()->isSetupMode() - ? tr( "About %1 setup" ) - : tr( "About %1 installer" ); - QMessageBox mb( QMessageBox::Information, - title.arg( CALAMARES_APPLICATION_NAME ), - tr( - "

%1


" - "%2
" - "for %3


" - "Copyright 2014-2017 Teo Mrnjavac <teo@kde.org>
" - "Copyright 2017-2019 Adriaan de Groot <groot@kde.org>
" - "Thanks to the Calamares team " - "and the Calamares " - "translators team.

" - "Calamares " - "development is sponsored by
" - "Blue Systems - " - "Liberating Software." - ) - .arg( CALAMARES_APPLICATION_NAME ) - .arg( CALAMARES_VERSION ) - .arg( *Calamares::Branding::VersionedName ), - QMessageBox::Ok, - this ); - mb.setIconPixmap( CalamaresUtils::defaultPixmap( CalamaresUtils::Squid, - CalamaresUtils::Original, - QSize( CalamaresUtils::defaultFontHeight() * 6, - CalamaresUtils::defaultFontHeight() * 6 ) ) ); - QGridLayout* layout = reinterpret_cast( mb.layout() ); - if ( layout ) - layout->setColumnMinimumWidth( 2, CalamaresUtils::defaultFontHeight() * 24 ); - mb.exec(); - } ); - - ui->verticalLayout->insertWidget( 3, m_checkingWidget); + int welcome_text_idx = ui->verticalLayout->indexOf( ui->mainText ); + ui->verticalLayout->insertWidget( welcome_text_idx + 1, m_checkingWidget ); } @@ -139,15 +101,16 @@ WelcomePage::initLanguages() QLocale defaultLocale = QLocale( QLocale::system().name() ); cDebug() << "Matching locale" << defaultLocale; - int matchedLocaleIndex = m_languages->find( - [&](const QLocale& x){ return x.language() == defaultLocale.language() && x.country() == defaultLocale.country(); } ); + int matchedLocaleIndex = m_languages->find( [&]( const QLocale& x ) { + return x.language() == defaultLocale.language() && x.country() == defaultLocale.country(); + } ); if ( matchedLocaleIndex < 0 ) { cDebug() << Logger::SubEntry << "Matching approximate locale" << defaultLocale.language(); - matchedLocaleIndex = m_languages->find( - [&](const QLocale& x){ return x.language() == defaultLocale.language(); } ); + matchedLocaleIndex + = m_languages->find( [&]( const QLocale& x ) { return x.language() == defaultLocale.language(); } ); } if ( matchedLocaleIndex < 0 ) @@ -159,7 +122,9 @@ WelcomePage::initLanguages() // Now, if it matched, because we didn't match the system locale, switch to the one found if ( matchedLocaleIndex >= 0 ) + { QLocale::setDefault( m_languages->locale( matchedLocaleIndex ).locale() ); + } } if ( matchedLocaleIndex >= 0 ) @@ -171,89 +136,82 @@ WelcomePage::initLanguages() ui->languageWidget->setCurrentIndex( matchedLocaleIndex ); } else + { cWarning() << "No available translation matched" << defaultLocale; + } connect( ui->languageWidget, static_cast< void ( QComboBox::* )( int ) >( &QComboBox::currentIndexChanged ), this, - [&]( int newIndex ) - { + [&]( int newIndex ) { const auto& selectedLocale = m_languages->locale( newIndex ).locale(); cDebug() << "Selected locale" << selectedLocale; QLocale::setDefault( selectedLocale ); - CalamaresUtils::installTranslator( selectedLocale, - Calamares::Branding::instance()->translationsDirectory(), - qApp ); + CalamaresUtils::installTranslator( + selectedLocale, Calamares::Branding::instance()->translationsDirectory(), qApp ); } ); } void -WelcomePage::setUpLinks( bool showSupportUrl, - bool showKnownIssuesUrl, - bool showReleaseNotesUrl ) +WelcomePage::setupButton( Button role, const QString& url ) { - using namespace Calamares; - if ( showSupportUrl && !( *Branding::SupportUrl ).isEmpty() ) + QPushButton* button = nullptr; + CalamaresUtils::ImageType icon = CalamaresUtils::Information; + + switch ( role ) { - CALAMARES_RETRANSLATE( - ui->supportButton->setText( tr( "%1 support" ) - .arg( *Branding::ShortProductName ) ); - ) - ui->supportButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::Help, - CalamaresUtils::Original, - 2*QSize( CalamaresUtils::defaultFontHeight(), - CalamaresUtils::defaultFontHeight() ) ) ); - connect( ui->supportButton, &QPushButton::clicked, [] - { - QDesktopServices::openUrl( *Branding::SupportUrl ); - } ); + case Button::Donate: + button = ui->donateButton; + icon = CalamaresUtils::Donate; + break; + case Button::KnownIssues: + button = ui->knownIssuesButton; + icon = CalamaresUtils::Bugs; + break; + case Button::ReleaseNotes: + button = ui->releaseNotesButton; + icon = CalamaresUtils::Release; + break; + case Button::Support: + button = ui->supportButton; + icon = CalamaresUtils::Help; + break; } - else + if ( !button ) { - ui->supportButton->hide(); + qWarning() << "Unknown button role" << smash( role ); + return; } - if ( showKnownIssuesUrl && !( *Branding::KnownIssuesUrl ).isEmpty() ) + if ( url.isEmpty() ) { - ui->knownIssuesButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::Bugs, - CalamaresUtils::Original, - 2*QSize( CalamaresUtils::defaultFontHeight(), - CalamaresUtils::defaultFontHeight() ) ) ); - connect( ui->knownIssuesButton, &QPushButton::clicked, [] - { - QDesktopServices::openUrl( *Branding::KnownIssuesUrl ); - } ); - } - else - { - ui->knownIssuesButton->hide(); + button->hide(); + return; } - if ( showReleaseNotesUrl && !( *Branding::ReleaseNotesUrl ).isEmpty() ) + QUrl u( url ); + if ( u.isValid() ) { - ui->releaseNotesButton->setIcon( CalamaresUtils::defaultPixmap( CalamaresUtils::Release, - CalamaresUtils::Original, - 2*QSize( CalamaresUtils::defaultFontHeight(), - CalamaresUtils::defaultFontHeight() ) ) ); - connect( ui->releaseNotesButton, &QPushButton::clicked, [] - { - QDesktopServices::openUrl( *Branding::ReleaseNotesUrl ); - } ); + auto size = 2 * QSize( CalamaresUtils::defaultFontHeight(), CalamaresUtils::defaultFontHeight() ); + button->setIcon( CalamaresUtils::defaultPixmap( icon, CalamaresUtils::Original, size ) ); + connect( button, &QPushButton::clicked, [u]() { QDesktopServices::openUrl( u ); } ); } else { - ui->releaseNotesButton->hide(); + qWarning() << "Welcome button" << smash( role ) << "URL" << url << "is invalid."; + button->hide(); } } - void WelcomePage::focusInEvent( QFocusEvent* e ) { if ( ui->languageWidget ) + { ui->languageWidget->setFocus(); + } e->accept(); } @@ -267,7 +225,9 @@ void WelcomePage::externallySelectedLanguage( int row ) { if ( ( row >= 0 ) && ( row < ui->languageWidget->count() ) ) + { ui->languageWidget->setCurrentIndex( row ); + } } void @@ -276,10 +236,75 @@ WelcomePage::setLanguageIcon( QPixmap i ) ui->languageIcon->setPixmap( i ); } +void +WelcomePage::retranslate() +{ + QString message; + + if ( Calamares::Settings::instance()->isSetupMode() ) + { + message = Calamares::Branding::instance()->welcomeStyleCalamares() + ? tr( "

Welcome to the Calamares setup program for %1.

" ) + : tr( "

Welcome to %1 setup.

" ); + } + else + { + message = Calamares::Branding::instance()->welcomeStyleCalamares() + ? tr( "

Welcome to the Calamares installer for %1.

" ) + : tr( "

Welcome to the %1 installer.

" ); + } + + ui->mainText->setText( message.arg( *Calamares::Branding::VersionedName ) ); + ui->retranslateUi( this ); + ui->supportButton->setText( tr( "%1 support" ).arg( *Calamares::Branding::ShortProductName ) ); +} void -LocaleTwoColumnDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const +WelcomePage::showAboutBox() +{ + QString title + = Calamares::Settings::instance()->isSetupMode() ? tr( "About %1 setup" ) : tr( "About %1 installer" ); + QMessageBox mb( QMessageBox::Information, + title.arg( CALAMARES_APPLICATION_NAME ), + tr( "

%1


" + "%2
" + "for %3


" + "Copyright 2014-2017 Teo Mrnjavac <teo@kde.org>
" + "Copyright 2017-2019 Adriaan de Groot <groot@kde.org>
" + "Thanks to the Calamares team " + "and the Calamares " + "translators team.

" + "Calamares " + "development is sponsored by
" + "Blue Systems - " + "Liberating Software." ) + .arg( CALAMARES_APPLICATION_NAME ) + .arg( CALAMARES_VERSION ) + .arg( *Calamares::Branding::VersionedName ), + QMessageBox::Ok, + this ); + mb.setIconPixmap( CalamaresUtils::defaultPixmap( + CalamaresUtils::Squid, + CalamaresUtils::Original, + QSize( CalamaresUtils::defaultFontHeight() * 6, CalamaresUtils::defaultFontHeight() * 6 ) ) ); + QGridLayout* layout = reinterpret_cast< QGridLayout* >( mb.layout() ); + if ( layout ) + { + layout->setColumnMinimumWidth( 2, CalamaresUtils::defaultFontHeight() * 24 ); + } + mb.exec(); +} + + +void +LocaleTwoColumnDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const { QStyledItemDelegate::paint( painter, option, index ); - option.widget->style()->drawItemText( painter, option.rect, Qt::AlignRight | Qt::AlignVCenter, option.palette, false, index.data( CalamaresUtils::Locale::LabelModel::EnglishLabelRole ).toString() ); + option.widget->style()->drawItemText( + painter, + option.rect, + Qt::AlignRight | Qt::AlignVCenter, + option.palette, + false, + index.data( CalamaresUtils::Locale::LabelModel::EnglishLabelRole ).toString() ); } diff --git a/src/modules/welcome/WelcomePage.h b/src/modules/welcome/WelcomePage.h index 6c244bf0c..3e20ab9ea 100644 --- a/src/modules/welcome/WelcomePage.h +++ b/src/modules/welcome/WelcomePage.h @@ -38,10 +38,17 @@ class WelcomePage : public QWidget public: explicit WelcomePage( QWidget* parent = nullptr ); - /// @brief Configure the buttons for URLs from the branding configuration - void setUpLinks( bool showSupportUrl, - bool showKnownIssuesUrl, - bool showReleaseNotesUrl ); + enum class Button + { + Support, + Donate, + KnownIssues, + ReleaseNotes + }; + + /// @brief Configure the button @p n, to open @p url + void setupButton( Button b, const QString& url ); + /// @brief Set international language-selector icon void setLanguageIcon( QPixmap ); @@ -50,8 +57,13 @@ public: /// @brief Change the language from an external source. void externallySelectedLanguage( int row ); + +public slots: + void retranslate(); + void showAboutBox(); + protected: - void focusInEvent( QFocusEvent* e ) override; //choose the child widget to focus + void focusInEvent( QFocusEvent* e ) override; //choose the child widget to focus private: /// @brief Fill the list of languages with the available translations @@ -59,7 +71,7 @@ private: Ui::WelcomePage* ui; CheckerContainer* m_checkingWidget; - CalamaresUtils::Locale::LabelModel *m_languages; + CalamaresUtils::Locale::LabelModel* m_languages; }; /** @brief Delegate to display language information in two columns. @@ -72,6 +84,6 @@ public: using QStyledItemDelegate::QStyledItemDelegate; void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const override; -} ; +}; -#endif // WELCOMEPAGE_H +#endif // WELCOMEPAGE_H diff --git a/src/modules/welcome/WelcomePage.ui b/src/modules/welcome/WelcomePage.ui index 548bd5d27..590029558 100644 --- a/src/modules/welcome/WelcomePage.ui +++ b/src/modules/welcome/WelcomePage.ui @@ -13,9 +13,6 @@ Form - - Select language - @@ -69,7 +66,7 @@ - Select language + Select application and system language @@ -81,6 +78,9 @@ + + Select application and system language + 2 @@ -134,8 +134,24 @@ + + + + Open donations website + + + &Donate + + + true + + + + + Open help and support website + &Support @@ -146,6 +162,9 @@ + + Open issues and bug-tracking website + &Known issues @@ -156,6 +175,9 @@ + + Open release notes website + &Release notes diff --git a/src/modules/welcome/WelcomeViewStep.cpp b/src/modules/welcome/WelcomeViewStep.cpp index 938fe1f45..17a10f754 100644 --- a/src/modules/welcome/WelcomeViewStep.cpp +++ b/src/modules/welcome/WelcomeViewStep.cpp @@ -33,13 +33,16 @@ #include #include -CALAMARES_PLUGIN_FACTORY_DEFINITION( WelcomeViewStepFactory, registerPlugin(); ) +CALAMARES_PLUGIN_FACTORY_DEFINITION( WelcomeViewStepFactory, registerPlugin< WelcomeViewStep >(); ) WelcomeViewStep::WelcomeViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_requirementsChecker( new GeneralRequirements( this ) ) { - connect( Calamares::ModuleManager::instance(), &Calamares::ModuleManager::requirementsComplete, this, &WelcomeViewStep::nextStatusChanged ); + connect( Calamares::ModuleManager::instance(), + &Calamares::ModuleManager::requirementsComplete, + this, + &WelcomeViewStep::nextStatusChanged ); m_widget = new WelcomePage(); } @@ -47,7 +50,9 @@ WelcomeViewStep::WelcomeViewStep( QObject* parent ) WelcomeViewStep::~WelcomeViewStep() { if ( m_widget && m_widget->parent() == nullptr ) + { m_widget->deleteLater(); + } } @@ -100,23 +105,59 @@ WelcomeViewStep::jobs() const } +/** @brief Look up a URL for a button + * + * Looks up @p key in @p map; if it is a *boolean* value, then + * assume an old-style configuration, and fetch the string from + * the branding settings @p e. If it is a string, not a boolean, + * use it as-is. If not found, or a weird type, returns empty. + * + * This allows switching the showKnownIssuesUrl and similar settings + * in welcome.conf from a boolean (deferring to branding) to an + * actual string for immediate use. Empty strings, as well as + * "false" as a setting, will hide the buttons as before. + */ +static QString +jobOrBrandingSetting( Calamares::Branding::StringEntry e, const QVariantMap& map, const QString& key ) +{ + if ( !map.contains( key ) ) + { + return QString(); + } + auto v = map.value( key ); + if ( v.type() == QVariant::Bool ) + { + return v.toBool() ? ( *e ) : QString(); + } + if ( v.type() == QVariant::String ) + { + return v.toString(); + } + + return QString(); +} + void WelcomeViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { - bool showSupportUrl = CalamaresUtils::getBool( configurationMap, "showSupportUrl", false ); - bool showKnownIssuesUrl = CalamaresUtils::getBool( configurationMap, "showKnownIssuesUrl", false ); - bool showReleaseNotesUrl = CalamaresUtils::getBool( configurationMap, "showReleaseNotesUrl", false ); + using Calamares::Branding; - m_widget->setUpLinks( showSupportUrl, - showKnownIssuesUrl, - showReleaseNotesUrl ); + m_widget->setupButton( WelcomePage::Button::Support, + jobOrBrandingSetting( Branding::SupportUrl, configurationMap, "showSupportUrl" ) ); + m_widget->setupButton( WelcomePage::Button::KnownIssues, + jobOrBrandingSetting( Branding::KnownIssuesUrl, configurationMap, "showKnownIssuesUrl" ) ); + m_widget->setupButton( WelcomePage::Button::ReleaseNotes, + jobOrBrandingSetting( Branding::ReleaseNotesUrl, configurationMap, "showReleaseNotesUrl" ) ); + m_widget->setupButton( WelcomePage::Button::Donate, CalamaresUtils::getString( configurationMap, "showDonateUrl" ) ); - if ( configurationMap.contains( "requirements" ) && - configurationMap.value( "requirements" ).type() == QVariant::Map ) + if ( configurationMap.contains( "requirements" ) + && configurationMap.value( "requirements" ).type() == QVariant::Map ) + { m_requirementsChecker->setConfigurationMap( configurationMap.value( "requirements" ).toMap() ); + } else cWarning() << "no valid requirements map found in welcome " - "module configuration."; + "module configuration."; bool ok = false; QVariantMap geoip = CalamaresUtils::getSubMap( configurationMap, "geoip", ok ); @@ -124,15 +165,13 @@ WelcomeViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { using FWString = QFutureWatcher< QString >; - auto* handler = new CalamaresUtils::GeoIP::Handler( - CalamaresUtils::getString( geoip, "style" ), - CalamaresUtils::getString( geoip, "url" ), - CalamaresUtils::getString( geoip, "selector" ) ); + auto* handler = new CalamaresUtils::GeoIP::Handler( CalamaresUtils::getString( geoip, "style" ), + CalamaresUtils::getString( geoip, "url" ), + CalamaresUtils::getString( geoip, "selector" ) ); if ( handler->type() != CalamaresUtils::GeoIP::Handler::Type::None ) { auto* future = new FWString(); - connect( future, &FWString::finished, [view=this, f=future, h=handler]() - { + connect( future, &FWString::finished, [view = this, f = future, h = handler]() { QString countryResult = f->future().result(); cDebug() << "GeoIP result for welcome=" << countryResult; view->setCountry( countryResult, h ); @@ -154,7 +193,9 @@ WelcomeViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { auto icon = Calamares::Branding::instance()->image( language, QSize( 48, 48 ) ); if ( !icon.isNull() ) + { m_widget->setLanguageIcon( icon ); + } } } @@ -169,7 +210,8 @@ logGeoIPHandler( CalamaresUtils::GeoIP::Handler* handler ) { if ( handler ) { - cDebug() << Logger::SubEntry << "Obtained from" << handler->url() << " (" << static_cast( handler->type() ) << handler->selector() << ')'; + cDebug() << Logger::SubEntry << "Obtained from" << handler->url() << " (" + << static_cast< int >( handler->type() ) << handler->selector() << ')'; } } @@ -194,8 +236,12 @@ WelcomeViewStep::setCountry( const QString& countryCode, CalamaresUtils::GeoIP:: { int r = CalamaresUtils::Locale::availableTranslations()->find( countryCode ); if ( r < 0 ) + { cDebug() << "Unusable country code" << countryCode << "(no suitable translation)"; + } if ( ( r >= 0 ) && m_widget ) + { m_widget->externallySelectedLanguage( r ); + } } } diff --git a/src/modules/welcome/checker/GeneralRequirements.cpp b/src/modules/welcome/checker/GeneralRequirements.cpp index 812605091..1881558b8 100644 --- a/src/modules/welcome/checker/GeneralRequirements.cpp +++ b/src/modules/welcome/checker/GeneralRequirements.cpp @@ -25,12 +25,14 @@ #include "partman_devices.h" #include "modulesystem/Requirement.h" +#include "network/Manager.h" #include "widgets/WaitingWidget.h" #include "utils/CalamaresUtilsGui.h" #include "utils/Logger.h" #include "utils/Retranslator.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/Units.h" +#include "utils/Variant.h" #include "Settings.h" #include "JobQueue.h" @@ -42,13 +44,9 @@ #include #include #include -#include #include #include #include -#include -#include -#include #include #include @@ -206,7 +204,7 @@ GeneralRequirements::setConfigurationMap( const QVariantMap& configurationMap ) if ( configurationMap.contains( "requiredStorage" ) && ( configurationMap.value( "requiredStorage" ).type() == QVariant::Double || - configurationMap.value( "requiredStorage" ).type() == QVariant::Int ) ) + configurationMap.value( "requiredStorage" ).type() == QVariant::LongLong ) ) { bool ok = false; m_requiredStorageGiB = configurationMap.value( "requiredStorage" ).toDouble( &ok ); @@ -227,7 +225,7 @@ GeneralRequirements::setConfigurationMap( const QVariantMap& configurationMap ) if ( configurationMap.contains( "requiredRam" ) && ( configurationMap.value( "requiredRam" ).type() == QVariant::Double || - configurationMap.value( "requiredRam" ).type() == QVariant::Int ) ) + configurationMap.value( "requiredRam" ).type() == QVariant::LongLong ) ) { bool ok = false; m_requiredRamGiB = configurationMap.value( "requiredRam" ).toDouble( &ok ); @@ -245,16 +243,16 @@ GeneralRequirements::setConfigurationMap( const QVariantMap& configurationMap ) incompleteConfiguration = true; } - if ( configurationMap.contains( "internetCheckUrl" ) && - configurationMap.value( "internetCheckUrl" ).type() == QVariant::String ) + QUrl checkInternetUrl; + QString checkInternetSetting = CalamaresUtils::getString( configurationMap, "internetCheckUrl" ); + if ( !checkInternetSetting.isEmpty() ) { - m_checkHasInternetUrl = configurationMap.value( "internetCheckUrl" ).toString().trimmed(); - if ( m_checkHasInternetUrl.isEmpty() || - !QUrl( m_checkHasInternetUrl ).isValid() ) + checkInternetUrl = QUrl( checkInternetSetting.trimmed() ); + if ( !checkInternetUrl.isValid() ) { - cWarning() << "GeneralRequirements entry 'internetCheckUrl' is invalid in welcome.conf" << m_checkHasInternetUrl + cWarning() << "GeneralRequirements entry 'internetCheckUrl' is invalid in welcome.conf" << checkInternetSetting << "reverting to default (http://example.com)."; - m_checkHasInternetUrl = "http://example.com"; + checkInternetUrl = QUrl( "http://example.com" ); incompleteConfiguration = true; } } @@ -262,10 +260,13 @@ GeneralRequirements::setConfigurationMap( const QVariantMap& configurationMap ) { cWarning() << "GeneralRequirements entry 'internetCheckUrl' is undefined in welcome.conf," "reverting to default (http://example.com)."; - - m_checkHasInternetUrl = "http://example.com"; + checkInternetUrl = "http://example.com"; incompleteConfiguration = true; } + if ( checkInternetUrl.isValid() ) + { + CalamaresUtils::Network::Manager::instance().setCheckHasInternetUrl( checkInternetUrl ); + } if ( incompleteConfiguration ) { @@ -357,22 +358,8 @@ GeneralRequirements::checkHasPower() bool GeneralRequirements::checkHasInternet() { - // default to true in the QNetworkAccessManager::UnknownAccessibility case - QNetworkAccessManager qnam; - bool hasInternet = qnam.networkAccessible() == QNetworkAccessManager::Accessible; - - if ( !hasInternet && qnam.networkAccessible() == QNetworkAccessManager::UnknownAccessibility ) - { - QNetworkRequest req = QNetworkRequest( QUrl( m_checkHasInternetUrl ) ); - QNetworkReply* reply = qnam.get( req ); - QEventLoop loop; - connect( reply, &QNetworkReply::finished, - &loop, &QEventLoop::quit ); - loop.exec(); - if( reply->bytesAvailable() ) - hasInternet = true; - } - + auto& nam = CalamaresUtils::Network::Manager::instance(); + bool hasInternet = nam.checkHasInternet(); Calamares::JobQueue::instance()->globalStorage()->insert( "hasInternet", hasInternet ); return hasInternet; } diff --git a/src/modules/welcome/checker/GeneralRequirements.h b/src/modules/welcome/checker/GeneralRequirements.h index 1efe118a6..8e5a6cd54 100644 --- a/src/modules/welcome/checker/GeneralRequirements.h +++ b/src/modules/welcome/checker/GeneralRequirements.h @@ -48,7 +48,6 @@ private: qreal m_requiredStorageGiB; qreal m_requiredRamGiB; - QString m_checkHasInternetUrl; }; #endif // REQUIREMENTSCHECKER_H diff --git a/src/modules/welcome/welcome.conf b/src/modules/welcome/welcome.conf index a89b63854..0361830aa 100644 --- a/src/modules/welcome/welcome.conf +++ b/src/modules/welcome/welcome.conf @@ -7,10 +7,23 @@ # can check requirements for installation. --- # Display settings for various buttons on the welcome page. +# The URLs themselves come from branding.desc is the setting +# here is "true". If the setting is false, the button is hidden. +# The setting can also be a full URL which will then be used +# instead of the one from the branding file, or empty or not-set +# which will hide the button. showSupportUrl: true showKnownIssuesUrl: true showReleaseNotesUrl: true +# If this Url is set to something non-empty, a "donate" +# button is added to the welcome page alongside the +# others (see settings, above). Clicking the button opens +# the corresponding link. (This button has no corresponding +# branding.desc string) +# +# showDonateUrl: https://kde.org/community/donations/ + # Requirements checking. These are general, generic, things # that are checked. They may not match with the actual requirements # imposed by other modules in the system. @@ -56,13 +69,13 @@ requirements: # but remember to use a URL that returns full data **and** to # use a selector that will pick the country, not the timezone. # -# To disable, either comment-out the entire section, or set -# the *style* key to an unsupported format (e.g. `none`, as is -# done here). - +# To disable GeoIP checking, either comment-out the entire geoip section, +# or set the *style* key to an unsupported format (e.g. `none`). +# Also, note the analogous feature in src/modules/locale/locale.conf. +# geoip: - style: "none" - url: "https://geoip.kde.org/v1/ubiquity" # extended XML format + style: "none" + url: "https://geoip.kde.org/v1/ubiquity" # extended XML format selector: "CountryCode" # blank uses default, which is wrong # User interface diff --git a/src/qml/calamares/slideshow/Presentation.qml b/src/qml/calamares/slideshow/Presentation.qml index 4843e15a6..1d2fd9c85 100644 --- a/src/qml/calamares/slideshow/Presentation.qml +++ b/src/qml/calamares/slideshow/Presentation.qml @@ -8,6 +8,9 @@ * (this and the 'c' key make sense in a *presentation* * slideshow, not in a passive slideshow like Calamares) * - remove quit key + * Copyright 2019, Adriaan de Groot + * - Support "V2" loading + * - Disable shortcuts until the content is visible in Calamares * * SPDX-License-Identifier: LGPL-2.1 * License-Filename: LICENSES/LGPLv2.1-Presentation @@ -77,6 +80,14 @@ Item { property string fontFamily: "Helvetica" property string codeFontFamily: "Courier New" + // This is set by the C++ part of Calamares when the slideshow + // becomes visible. You can connect it to a timer, or whatever + // else needs to start only when the slideshow becomes visible. + // + // It is used in this example also to keep the keyboard shortcuts + // enabled only while the slideshow is active. + property bool activatedInCalamares: false + // Private API property int _lastShownSlide: 0 @@ -136,17 +147,17 @@ Item { Keys.onLeftPressed: goToPreviousSlide() // navigate with arrow keys - Shortcut { sequence: StandardKey.MoveToNextLine; enabled: root.arrowNavigation; onActivated: goToNextSlide() } - Shortcut { sequence: StandardKey.MoveToPreviousLine; enabled: root.arrowNavigation; onActivated: goToPreviousSlide() } - Shortcut { sequence: StandardKey.MoveToNextChar; enabled: root.arrowNavigation; onActivated: goToNextSlide() } - Shortcut { sequence: StandardKey.MoveToPreviousChar; enabled: root.arrowNavigation; onActivated: goToPreviousSlide() } + Shortcut { sequence: StandardKey.MoveToNextLine; enabled: root.activatedInCalamares && root .arrowNavigation; onActivated: goToNextSlide() } + Shortcut { sequence: StandardKey.MoveToPreviousLine; enabled: root.activatedInCalamares && root.arrowNavigation; onActivated: goToPreviousSlide() } + Shortcut { sequence: StandardKey.MoveToNextChar; enabled: root.activatedInCalamares && root.arrowNavigation; onActivated: goToNextSlide() } + Shortcut { sequence: StandardKey.MoveToPreviousChar; enabled: root.activatedInCalamares && root.arrowNavigation; onActivated: goToPreviousSlide() } // presentation-specific single-key shortcuts (which interfere with normal typing) - Shortcut { sequence: " "; enabled: root.keyShortcutsEnabled; onActivated: goToNextSlide() } + Shortcut { sequence: " "; enabled: root.activatedInCalamares && root.keyShortcutsEnabled; onActivated: goToNextSlide() } // standard shortcuts - Shortcut { sequence: StandardKey.MoveToNextPage; onActivated: goToNextSlide() } - Shortcut { sequence: StandardKey.MoveToPreviousPage; onActivated: goToPreviousSlide() } + Shortcut { sequence: StandardKey.MoveToNextPage; enabled: root.activatedInCalamares; onActivated: goToNextSlide() } + Shortcut { sequence: StandardKey.MoveToPreviousPage; enabled: root.activatedInCalamares; onActivated: goToPreviousSlide() } MouseArea { id: mouseArea