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

This commit is contained in:
Philip Müller 2020-10-29 20:39:53 +01:00
commit c64f7821ef
91 changed files with 5641 additions and 1242 deletions

View File

@ -19,5 +19,5 @@ install:
- docker build -t calamares .
script:
- docker run -v $PWD:/src --tmpfs /build:rw,size=81920k -e SRCDIR=/src -e BUILDDIR=/build calamares "/src/ci/travis.sh"
- docker run -v $PWD:/src --tmpfs /build:rw,size=112M -e SRCDIR=/src -e BUILDDIR=/build calamares "/src/ci/travis.sh"

15
CHANGES
View File

@ -10,13 +10,22 @@ website will have to do for older versions.
# 3.2.33 (unreleased) #
This release contains contributions from (alphabetically by first name):
- No external contributors yet
- Anke Boersma
- Andrius Štikonas
- Artem Grinev
- Gaël PORTAY
- TTran Me
## Core ##
- No core changes yet
- Calamares now sets the C++ standard for compilation to C++17; this
is for better compatibility and fewer warnings when building with
modern KDE Frameworks and KPMcore 4.2.0.
- Vietnamese translations have been added. Welcome!
## Modules ##
- No module changes yet
- The *keyboard* and *keyboardq* modules now share backend code
and handle non-ASCII layouts better (for setting passwords
and usernames).
# 3.2.32.1 (2020-10-17) #

View File

@ -140,12 +140,13 @@ set( CALAMARES_DESCRIPTION_SUMMARY
# NOTE: update these lines by running `txstats.py`, or for full automation
# `txstats.py -e`. See also
#
# Total 70 languages
set( _tx_complete ca cs_CZ he hr sq tr_TR uk )
set( _tx_good as ast az az_AZ be da de es fa fi_FI fr hi hu it_IT
ja ko lt ml nl pt_BR pt_PT ru sk sv tg zh_CN zh_TW )
set( _tx_ok ar bg bn el en_GB es_MX es_PR et eu fur gl id is mr nb
pl ro sl sr sr@latin th )
# Total 71 languages
set( _tx_complete be ca cs_CZ da fi_FI fur he hi hr ja pt_BR sq sv
tg uk vi zh_TW )
set( _tx_good as ast az az_AZ de es fa fr hu it_IT ko lt ml nl
pt_PT ru sk tr_TR zh_CN )
set( _tx_ok ar bg bn el en_GB es_MX es_PR et eu gl id is mr nb pl
ro sl sr sr@latin th )
set( _tx_incomplete ca@valencia eo fr_CH gu ie kk kn lo lv mk ne_NP
te ur uz )
@ -190,23 +191,30 @@ include( CMakeColors )
### C++ SETUP
#
set( CMAKE_CXX_STANDARD 14 )
set( CMAKE_CXX_STANDARD 17 )
set( CMAKE_CXX_STANDARD_REQUIRED ON )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror=return-type" )
set( CMAKE_CXX_FLAGS_DEBUG "-g ${CMAKE_CXX_FLAGS_DEBUG}" )
set( CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG" )
set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" )
set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g" )
set( CMAKE_C_STANDARD 99 )
set( CMAKE_C_STANDARD_REQUIRED ON )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall" )
set( CMAKE_C_FLAGS_DEBUG "-g" )
set( CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" )
set( CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG" )
set( CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g" )
set( CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined -Wl,--fatal-warnings" )
if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
message( STATUS "Found Clang ${CMAKE_CXX_COMPILER_VERSION}, setting up Clang-specific compiler flags." )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall" )
set( CMAKE_C_FLAGS_DEBUG "-g" )
set( CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" )
set( CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG" )
set( CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g" )
# Clang warnings: doing *everything* is counter-productive, since it warns
# about things which we can't fix (e.g. C++98 incompatibilities, but
# Calamares is C++14).
# Calamares is C++17).
foreach( CLANG_WARNINGS
-Weverything
-Wno-c++98-compat
@ -218,40 +226,26 @@ 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='//' -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
# mark_thirdparty_code( <file> [<file>...] )
# to switch off warnings for those sources.
set( SUPPRESS_3RDPARTY_WARNINGS "-Wno-everything" )
set( SUPPRESS_BOOST_WARNINGS " -Wno-zero-as-null-pointer-constant -Wno-disabled-macro-expansion" )
set( CMAKE_CXX_FLAGS_DEBUG "-g ${CMAKE_CXX_FLAGS_DEBUG}" )
set( CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG" )
set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" )
set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g" )
set( CMAKE_TOOLCHAIN_PREFIX "llvm-" )
set( CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined" )
# The path prefix is only relevant for CMake 3.16 and later, fixes #1286
set( CMAKE_AUTOMOC_PATH_PREFIX OFF )
set( CALAMARES_AUTOMOC_OPTIONS "-butils/moc-warnings.h" )
set( CALAMARES_AUTOUIC_OPTIONS --include utils/moc-warnings.h )
else()
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--no-undefined" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--fatal-warnings -Wnon-virtual-dtor -Woverloaded-virtual -Werror=return-type" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnon-virtual-dtor -Woverloaded-virtual" )
set( SUPPRESS_3RDPARTY_WARNINGS "" )
set( SUPPRESS_BOOST_WARNINGS "" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOTREACHED='__builtin_unreachable();' -DFALLTHRU='/* */'" )
endif()
# Use mark_thirdparty_code() to reduce warnings from the compiler

View File

@ -37,7 +37,7 @@ Clone Calamares from GitHub. The default branch is called *calamares*.
git clone https://github.com/calamares/calamares.git
```
Calamares is a KDE-Frameworks and Qt-based, C++14, CMake-built application.
Calamares is a KDE-Frameworks and Qt-based, C++17, CMake-built application.
The dependencies are explainged in [CONTRIBUTING.md](CONTRIBUTING.md).
## Contributing to Calamares

View File

@ -201,6 +201,10 @@ Name[uk]=Встановити Систему
Icon[uk]=calamares
GenericName[uk]=Встановлювач системи
Comment[uk]=Calamares - Встановлювач системи
Name[vi]=Cài đt h thng
Icon[vi]=calamares
GenericName[vi]=B cài đt h thng
Comment[vi]=Calamares B cài đt h thng
Name[zh_CN]=
Icon[zh_CN]=calamares
GenericName[zh_CN]=

View File

@ -22,7 +22,7 @@ export LANG LC_ALL LC_NUMERIC
AS=$( which astyle )
CF_VERSIONS="clang-format-7 clang-format-8 clang-format70 clang-format80 clang-format-9.0.1 clang-format"
CF_VERSIONS="clang-format-7 clang-format-8 clang-format70 clang-format80 clang-format90 clang-format-9.0.1 clang-format"
for _cf in $CF_VERSIONS
do
# Not an error if this particular clang-format isn't found

View File

@ -532,7 +532,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="305"/>
<source>&lt;strong&gt;Manual partitioning&lt;/strong&gt;&lt;br/&gt;You can create or resize partitions yourself.</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;Уласнаручная разметка&lt;/strong&gt;&lt;br/&gt;Вы можаце самастойна ствараць раздзелы або змяняць іх памеры.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="831"/>
@ -621,17 +621,17 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation>На гэтай прыладзе ўжо ўсталяваная аперацыйная сістэма, але табліца раздзелаў &lt;strong&gt;%1&lt;/strong&gt; не такая, як патрэбна &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
<source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>Адзін з раздзелаў гэтай назапашвальнай прылады&lt;strong&gt;прымантаваны&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
<source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
<translation type="unfinished"/>
<translation>Гэтая назапашвальная прылада ёсць часткай&lt;strong&gt;неактыўнага RAID&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>
@ -734,7 +734,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/locale/Config.cpp" line="334"/>
<source>Set timezone to %1/%2.</source>
<translation type="unfinished"/>
<translation>Вызначыць часавы пояс %1/%2.</translation>
</message>
<message>
<location filename="../src/modules/locale/Config.cpp" line="372"/>
@ -794,22 +794,22 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/welcome/Config.cpp" line="244"/>
<source>&lt;h1&gt;Welcome to the Calamares setup program for %1&lt;/h1&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Вітаем у праграме ўсталёўкі Calamares для %1&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/Config.cpp" line="245"/>
<source>&lt;h1&gt;Welcome to %1 setup&lt;/h1&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Вітаем у праграме ўсталёўкі %1&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/Config.cpp" line="250"/>
<source>&lt;h1&gt;Welcome to the Calamares installer for %1&lt;/h1&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Вітаем у праграме ўсталёўкі Calamares для %1&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/Config.cpp" line="251"/>
<source>&lt;h1&gt;Welcome to the %1 installer&lt;/h1&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Вітаем у праграме ўсталёўкі %1&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="164"/>
@ -819,7 +819,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/users/Config.cpp" line="170"/>
<source>'%1' is not allowed as username.</source>
<translation type="unfinished"/>
<translation>'%1' немагчыма выкарыстаць як імя карыстальніка.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="177"/>
@ -844,7 +844,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/users/Config.cpp" line="237"/>
<source>'%1' is not allowed as hostname.</source>
<translation type="unfinished"/>
<translation>'%1' немагчыма выкарыстаць як назву хоста.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="243"/>
@ -1817,14 +1817,16 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/localeq/Map.qml" line="243"/>
<source>Timezone: %1</source>
<translation type="unfinished"/>
<translation>Часавы пояс: %1</translation>
</message>
<message>
<location filename="../src/modules/localeq/Map.qml" line="264"/>
<source>Please select your preferred location on the map so the installer can suggest the locale
and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging
to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming.</source>
<translation type="unfinished"/>
<translation>Калі ласка, абярыце неабходнае месца на мапе, каб праграма прапанавала мову
і налады часавога пояса. Вы можаце дакладна наладзіць прапанаваныя параметры ніжэй. Месца на мапе можна абраць перацягваючы
яе пры дапамозе мышы. Для павелічэння і памяншэння выкарыстоўвайце кнопкі +/- і кола мышы.</translation>
</message>
</context>
<context>
@ -1944,7 +1946,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/oemid/OEMPage.ui" line="42"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter a batch-identifier here. This will be stored in the target system.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Увядзіце сюды масавы ідэнтыфікатар. Ён захавецца ў мэтавай сістэме.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Увядзіце сюды масавы ідэнтыфікатар. Ён захаваецца ў мэтавай сістэме.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/modules/oemid/OEMPage.ui" line="52"/>
@ -1970,29 +1972,29 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/localeq/Offline.qml" line="37"/>
<source>Select your preferred Region, or use the default one based on your current location.</source>
<translation type="unfinished"/>
<translation>Абярыце пераважны рэгіён альбо выкарыстоўвайце прадвызначаны ў залежнасці ад вашага бягучага месцазнаходжання.</translation>
</message>
<message>
<location filename="../src/modules/localeq/Offline.qml" line="94"/>
<location filename="../src/modules/localeq/Offline.qml" line="169"/>
<location filename="../src/modules/localeq/Offline.qml" line="213"/>
<source>Timezone: %1</source>
<translation type="unfinished"/>
<translation>Часавы пояс: %1</translation>
</message>
<message>
<location filename="../src/modules/localeq/Offline.qml" line="111"/>
<source>Select your preferred Zone within your Region.</source>
<translation type="unfinished"/>
<translation>Абярыце часавы пояс для вашага рэгіёна.</translation>
</message>
<message>
<location filename="../src/modules/localeq/Offline.qml" line="182"/>
<source>Zones</source>
<translation type="unfinished"/>
<translation>Часавыя паясы</translation>
</message>
<message>
<location filename="../src/modules/localeq/Offline.qml" line="229"/>
<source>You can fine-tune Language and Locale settings below.</source>
<translation type="unfinished"/>
<translation>Ніжэй вы можаце наладзіць мову і мясцовасць.</translation>
</message>
</context>
<context>
@ -2644,12 +2646,12 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="427"/>
<source>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;To configure an EFI system partition, go back and select or create a FAT32 filesystem with the &lt;strong&gt;%3&lt;/strong&gt; flag enabled and mount point &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;You can continue without setting up an EFI system partition but your system may fail to start.</source>
<translation type="unfinished"/>
<translation>Для таго, каб пачаць %1, патрабуецца сістэмны раздзел EFI.&lt;br/&gt;&lt;br/&gt; Каб наладзіць сістэмны раздзел EFI, вярніцеся назад, абярыце альбо стварыце файлавую сістэму FAT32 са сцягам &lt;strong&gt;%3&lt;/strong&gt; і пунктам мантавання &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;Вы можаце працягнуць і без наладкі сістэмнага раздзела EFI, але ваша сістэма можа не загрузіцца.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="441"/>
<source>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;A partition was configured with mount point &lt;strong&gt;%2&lt;/strong&gt; but its &lt;strong&gt;%3&lt;/strong&gt; flag is not set.&lt;br/&gt;To set the flag, go back and edit the partition.&lt;br/&gt;&lt;br/&gt;You can continue without setting the flag but your system may fail to start.</source>
<translation type="unfinished"/>
<translation>Для таго, каб пачаць %1, патрабуецца сістэмны раздзел EFI.&lt;br/&gt;&lt;br/&gt;Быў наладжаны раздзел з пунктам мантавання&lt;strong&gt;%2&lt;/strong&gt; але яго сцяг &lt;strong&gt;%3&lt;/strong&gt; не вызначаны.&lt;br/&gt;Каб вызначыць сцяг, вярніцеся назад і адрэдагуйце раздзел.&lt;br/&gt;&lt;br/&gt; Вы можаце працягнуць без наладкі раздзела, але ваша сістэма можа не загрузіцца.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="440"/>
@ -2868,7 +2870,7 @@ Output:
<message>
<location filename="../src/modules/machineid/MachineIdJob.cpp" line="83"/>
<source>Directory not found</source>
<translation type="unfinished"/>
<translation>Каталог не знойдзены</translation>
</message>
<message>
<location filename="../src/modules/machineid/MachineIdJob.cpp" line="84"/>
@ -2903,7 +2905,8 @@ Output:
<location filename="../src/modules/welcomeq/Recommended.qml" line="40"/>
<source>&lt;p&gt;This computer does not satisfy some of the recommended requirements for setting up %1.&lt;br/&gt;
Setup can continue, but some features might be disabled.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;Гэты кампютар адпавядае не ўсім патрэбам для ўсталёўкі %1.&lt;br/&gt;
Можна працягнуць усталёўку, але некаторыя магчымасці могуць быць недаступнымі.&lt;/p&gt;</translation>
</message>
</context>
<context>
@ -3014,13 +3017,15 @@ Output:
<location filename="../src/modules/welcomeq/Requirements.qml" line="38"/>
<source>&lt;p&gt;This computer does not satisfy the minimum requirements for installing %1.&lt;br/&gt;
Installation cannot continue.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;Гэты кампютар не адпавядае мінімальным патрэбам для ўсталёўкі %1.&lt;p&gt;
Немагчыма працягнуць. &lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/Requirements.qml" line="40"/>
<source>&lt;p&gt;This computer does not satisfy some of the recommended requirements for setting up %1.&lt;br/&gt;
Setup can continue, but some features might be disabled.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;Гэты кампютар адпавядае не ўсім патрэбам для ўсталёўкі %1.&lt;br/&gt;
Можна працягнуць усталёўку, але некаторыя магчымасці могуць быць недаступнымі.&lt;/p&gt;</translation>
</message>
</context>
<context>
@ -3038,7 +3043,7 @@ Output:
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="170"/>
<source>The file-system resize job has an invalid configuration and will not run.</source>
<translation>У задачы па змене памеру файлавай сістэмы хібная канфігурафыя, таму яна не будзе выконвацца.</translation>
<translation>У задачы па змене памеру файлавай сістэмы хібная канфігурацыя, таму яна не будзе выконвацца.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="175"/>
@ -3486,28 +3491,28 @@ Output:
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="122"/>
<source>KDE user feedback</source>
<translation type="unfinished"/>
<translation>Зваротная сувязь KDE</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="128"/>
<source>Configuring KDE user feedback.</source>
<translation type="unfinished"/>
<translation>Наладка зваротнай сувязі KDE.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="150"/>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="156"/>
<source>Error in KDE user feedback configuration.</source>
<translation type="unfinished"/>
<translation>Падчас наладкі зваротнай сувязі KDE адбылася памылка.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="151"/>
<source>Could not configure KDE user feedback correctly, script error %1.</source>
<translation type="unfinished"/>
<translation>Не атрымалася наладзіць зваротную сувязь KDE, памылка скрыпта %1.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="157"/>
<source>Could not configure KDE user feedback correctly, Calamares error %1.</source>
<translation type="unfinished"/>
<translation>Не атрымалася наладзіць зваротную сувязь KDE, памылка Calamares %1.</translation>
</message>
</context>
<context>
@ -3554,7 +3559,7 @@ Output:
<message>
<location filename="../src/modules/tracking/page_trackingstep.ui" line="76"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Click here to send &lt;span style=" font-weight:600;"&gt;no information at all&lt;/span&gt; about your installation.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Пстрыкніце сюды, каб не адпраўляць &lt;span style=" font-weight:600;"&gt;ніякіх звестак&lt;/span&gt; пра вашу ўсталёўку.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/modules/tracking/page_trackingstep.ui" line="275"/>
@ -3564,22 +3569,22 @@ Output:
<message>
<location filename="../src/modules/tracking/TrackingPage.cpp" line="86"/>
<source>Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area.</source>
<translation type="unfinished"/>
<translation>Адсочванне дапамагае праекту %1 бачыць, як часта ён усталёўваецца, на якім абсталяванні ён усталёўваецца, якія праграмы выкарыстоўваюцца. Каб убачыць, што будзе адпраўлена, пстрыкніце па значку ля кожнай вобласці.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingPage.cpp" line="91"/>
<source>By selecting this you will send information about your installation and hardware. This information will only be sent &lt;b&gt;once&lt;/b&gt; after the installation finishes.</source>
<translation type="unfinished"/>
<translation>Абраўшы гэты пункт вы адправіце звесткі пра сваю канфігурацыю ўсталёўкі і ваша абсталяванне. Звесткі адправяцца &lt;b&gt;адзін раз&lt;/b&gt; пасля завяршэння ўсталёўкі.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingPage.cpp" line="94"/>
<source>By selecting this you will periodically send information about your &lt;b&gt;machine&lt;/b&gt; installation, hardware and applications, to %1.</source>
<translation type="unfinished"/>
<translation>Абраўшы гэты пункт вы будзеце перыядычна адпраўляць звесткі пра усталёўку, абсталяванне і праграмы вашага &lt;b&gt;камп'ютара&lt;/b&gt; на %1.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingPage.cpp" line="98"/>
<source>By selecting this you will regularly send information about your &lt;b&gt;user&lt;/b&gt; installation, hardware, applications and application usage patterns, to %1.</source>
<translation type="unfinished"/>
<translation>Абраўшы гэты пункт вы будзеце перыядычна адпраўляць звесткі пра усталёўку, абсталяванне, праграмы &lt;b&gt;карыстальніка&lt;/b&gt; і вобласці іх выкарыстання на %1.</translation>
</message>
</context>
<context>
@ -3625,7 +3630,7 @@ Output:
<location filename="../src/calamares/VariantModel.cpp" line="232"/>
<source>Key</source>
<comment>Column header for key/value</comment>
<translation>Клавіша</translation>
<translation>Ключ</translation>
</message>
<message>
<location filename="../src/calamares/VariantModel.cpp" line="236"/>
@ -3783,7 +3788,7 @@ Output:
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="238"/>
<source>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;&lt;strong&gt;%2&lt;br/&gt;for %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Copyright 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;Copyright 2017-2020 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;Thanks to &lt;a href="https://calamares.io/team/"&gt;the Calamares team&lt;/a&gt; and the &lt;a href="https://www.transifex.com/calamares/calamares/"&gt;Calamares translators team&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; development is sponsored by &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Liberating Software.</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;&lt;strong&gt;%2&lt;br/&gt;for %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Аўтарскія правы 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;Аўтарскія правы 2017-2020 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;Шчырыя падзякі &lt;a href="https://calamares.io/team/"&gt;камандзе распрацоўкі Calamares&lt;/a&gt; і &lt;a href="https://www.transifex.com/calamares/calamares/"&gt;камандзе перакладчыкаў Calamares&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; распрацоўваецца пры падтрымцы&lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Liberating Software.</translation>
</message>
</context>
<context>
@ -3818,7 +3823,17 @@ Output:
development is sponsored by &lt;br/&gt;
&lt;a href='http://www.blue-systems.com/'&gt;Blue Systems&lt;/a&gt; -
Liberating Software.</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;%1&lt;/h1&gt;&lt;br/&gt;
&lt;strong&gt;%2&lt;br/&gt;
for %3&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;
Аўтарскія правы 2014-2017 Teo Mrnjavac &amp;lt;teo@kde.org&amp;gt;&lt;br/&gt;
Аўтарскія правы 2017-2020 Adriaan de Groot &amp;lt;groot@kde.org&amp;gt;&lt;br/&gt;
Шчырыя падзякі &lt;a href='https://calamares.io/team/'&gt;камандзе распрацоўкі Calamares &lt;/a&gt;
і &lt;a href='https://www.transifex.com/calamares/calamares/'&gt; перакладчыкам Calamares&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;
&lt;a href='https://calamares.io/'&gt;Calamares&lt;/a&gt;
распрацоўваецца пры падтрымцы &lt;br/&gt;
&lt;a href='http://www.blue-systems.com/'&gt;Blue Systems&lt;/a&gt; -
Liberating Software.</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/about.qml" line="96"/>
@ -3832,13 +3847,15 @@ Output:
<location filename="../src/modules/localeq/i18n.qml" line="46"/>
<source>&lt;h1&gt;Languages&lt;/h1&gt; &lt;/br&gt;
The system locale setting affects the language and character set for some command line user interface elements. The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Мовы&lt;/h1&gt;&lt;/br&gt;
Сістэмныя рэгіянальныя налады вызначаюць мову і кадаванне для пэўных элементаў інтэрфейсу загаднага радка. Бягучыя налады &lt;strong&gt;%1&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/localeq/i18n.qml" line="106"/>
<source>&lt;h1&gt;Locales&lt;/h1&gt; &lt;/br&gt;
The system locale setting affects the numbers and dates format. The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Рэгіянальныя налады&lt;/h1&gt;&lt;/br&gt;
Сістэмныя рэгіянальныя налады вызначаюць фармат нумароў і датаў. Бягучыя налады &lt;strong&gt;%1&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/localeq/i18n.qml" line="158"/>
@ -3866,7 +3883,7 @@ Output:
<message>
<location filename="../src/modules/keyboardq/keyboardq.qml" line="60"/>
<source>Click your preferred keyboard model to select layout and variant, or use the default one based on the detected hardware.</source>
<translation type="unfinished"/>
<translation>Пстрыкніце на пераважную мадэль клавіятуры, каб абраць раскладку і варыянт, альбо выкарыстоўвайце прадвызначаную ў залежнасці ад выяўленага абсталявання.</translation>
</message>
<message>
<location filename="../src/modules/keyboardq/keyboardq.qml" line="253"/>
@ -3881,7 +3898,7 @@ Output:
<message>
<location filename="../src/modules/keyboardq/keyboardq.qml" line="276"/>
<source>Keyboard Variant</source>
<translation type="unfinished"/>
<translation>Варыянт клавіятуры</translation>
</message>
<message>
<location filename="../src/modules/keyboardq/keyboardq.qml" line="386"/>
@ -3894,7 +3911,7 @@ Output:
<message>
<location filename="../src/modules/localeq/localeq.qml" line="81"/>
<source>Change</source>
<translation type="unfinished"/>
<translation>Змяніць</translation>
</message>
</context>
<context>
@ -3932,7 +3949,28 @@ Output:
&lt;/ul&gt;
&lt;p&gt;The vertical scrollbar is adjustable, current width set to 10.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h3&gt;%1&lt;/h3&gt;
&lt;p&gt;Гэта прыклад файла QML, у якім паказваюцца параметры RichText са зменным змесцівам.&lt;/p&gt;
&lt;p&gt;QML з RichText можа выкарыстоўваць пазнакі HTML. Зменнае змесціва карысна для сэнсарных экранаў.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Гэта паўтлусты тэкст&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Гэта тэкст курсівам&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Гэта падкрэслены&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;Гэта выраўнаваны па цэнтры тэкст.&lt;/center&gt;&lt;s&gt;
&lt;p&gt;&lt;s&gt;Гэта закрэслены тэкст&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;Прыклад кода:
&lt;code&gt;ls -l /
/home&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Спісы:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Сістэмы з Intel CPU&lt;/li&gt;
&lt;li&gt;Сістэмы з AMD CPU&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Вертыкальная паласа пракруткі наладжваецца. Бягучая шырыня - 10.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/release_notes.qml" line="76"/>
@ -3945,7 +3983,7 @@ Output:
<message>
<location filename="../src/modules/usersq/usersq.qml" line="36"/>
<source>Pick your user name and credentials to login and perform admin tasks</source>
<translation type="unfinished"/>
<translation>Абярыце свае імя карыстальніка і ўліковыя даныя для ўваходу і выканання задач адміністратара</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="52"/>
@ -3965,12 +4003,12 @@ Output:
<message>
<location filename="../src/modules/usersq/usersq.qml" line="87"/>
<source>Login Name</source>
<translation type="unfinished"/>
<translation>Лагін</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="103"/>
<source>If more than one person will use this computer, you can create multiple accounts after installation.</source>
<translation type="unfinished"/>
<translation>Калі кампютарам карыстаецца некалькі чалавек, то вы можаце стварыць для іх акаўнты пасля завяршэння ўсталёўкі.</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="118"/>
@ -3985,7 +4023,7 @@ Output:
<message>
<location filename="../src/modules/usersq/usersq.qml" line="140"/>
<source>This name will be used if you make the computer visible to others on a network.</source>
<translation type="unfinished"/>
<translation>Назва будзе выкарыстоўвацца для пазначэння кампютара ў сетцы.</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="155"/>
@ -4005,12 +4043,12 @@ Output:
<message>
<location filename="../src/modules/usersq/usersq.qml" line="204"/>
<source>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</source>
<translation type="unfinished"/>
<translation>Увядзіце двойчы аднолькавы пароль. Гэта неабходна для таго, каб пазбегнуць памылак. Надзейны пароль павінен складацца з літар, лічбаў, знакаў пунктуацыі. Ён павінен змяшчаць прынамсі 8 знакаў, яго перыядычна трэба змяняць.</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="216"/>
<source>Validate passwords quality</source>
<translation type="unfinished"/>
<translation>Праверка якасці пароляў</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="226"/>
@ -4020,12 +4058,12 @@ Output:
<message>
<location filename="../src/modules/usersq/usersq.qml" line="234"/>
<source>Log in automatically without asking for the password</source>
<translation type="unfinished"/>
<translation>Аўтаматычна ўваходзіць без уводу пароля</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="243"/>
<source>Reuse user password as root password</source>
<translation type="unfinished"/>
<translation>Выкарыстоўваць пароль карыстальніка як пароль адміністратара</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="253"/>
@ -4035,22 +4073,22 @@ Output:
<message>
<location filename="../src/modules/usersq/usersq.qml" line="268"/>
<source>Choose a root password to keep your account safe.</source>
<translation type="unfinished"/>
<translation>Абярыце пароль адміністратара для абароны вашага акаўнта.</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="279"/>
<source>Root Password</source>
<translation type="unfinished"/>
<translation>Пароль адміністратара</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="298"/>
<source>Repeat Root Password</source>
<translation type="unfinished"/>
<translation>Паўтарыце пароль адміністратара</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="318"/>
<source>Enter the same password twice, so that it can be checked for typing errors.</source>
<translation type="unfinished"/>
<translation>Увядзіце пароль двойчы, каб пазбегнуць памылак уводу.</translation>
</message>
</context>
<context>
@ -4059,7 +4097,8 @@ Output:
<location filename="../src/modules/welcomeq/welcomeq.qml" line="35"/>
<source>&lt;h3&gt;Welcome to the %1 &lt;quote&gt;%2&lt;/quote&gt; installer&lt;/h3&gt;
&lt;p&gt;This program will ask you some questions and set up %1 on your computer.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h3&gt;Вітаем у %1, праграме ўсталёўкі&lt;quote&gt;%2&lt;/quote&gt; &lt;/h3&gt;
&lt;p&gt;Гэтая праграма дапаможа вам усталяваць %1 на ваш камп'ютар.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/welcomeq.qml" line="66"/>

View File

@ -6,7 +6,7 @@
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="61"/>
<source>The &lt;strong&gt;boot environment&lt;/strong&gt; of this system.&lt;br&gt;&lt;br&gt;Older x86 systems only support &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Modern systems usually use &lt;strong&gt;EFI&lt;/strong&gt;, but may also show up as BIOS if started in compatibility mode.</source>
<translation>&lt;strong&gt;Среда за начално зареждане&lt;/strong&gt; на тази система.&lt;br&gt;&lt;br&gt;Старите x86 системи поддържат само &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Модерните системи обикновено използват &lt;strong&gt;EFI&lt;/strong&gt;, но може също така да използват BIOS, ако са стартирани в режим на съвместимост.</translation>
<translation>&lt;strong&gt;Средата за начално зареждане&lt;/strong&gt; на тази система.&lt;br&gt;&lt;br&gt;Старите x86 системи поддържат само &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Модерните системи обикновено използват &lt;strong&gt;EFI&lt;/strong&gt;, но може също така да използват BIOS, ако са стартирани в режим на съвместимост.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="71"/>
@ -132,7 +132,7 @@
<message>
<location filename="../src/libcalamares/JobExample.cpp" line="29"/>
<source>Job failed (%1)</source>
<translation type="unfinished"/>
<translation>Задачата се провали (%1)</translation>
</message>
<message>
<location filename="../src/libcalamares/JobExample.cpp" line="30"/>
@ -153,7 +153,7 @@
<message>
<location filename="../src/libcalamares/JobExample.cpp" line="17"/>
<source>Example job (%1)</source>
<translation type="unfinished"/>
<translation>Примерна задача (%1)</translation>
</message>
</context>
<context>
@ -199,7 +199,7 @@
<message>
<location filename="../src/libcalamares/PythonJob.cpp" line="229"/>
<source>Main script file %1 for python job %2 is not readable.</source>
<translation>Файлът на главен скрипт %1 за python задача %2 не се чете.</translation>
<translation>Файла на главен скрипт %1 за python задача %2 не се чете.</translation>
</message>
<message>
<location filename="../src/libcalamares/PythonJob.cpp" line="297"/>
@ -3755,12 +3755,12 @@ Output:
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="222"/>
<source>&lt;h1&gt;Welcome to the Calamares installer for %1.&lt;/h1&gt;</source>
<translation>&lt;h1&gt;Добре дошли при инсталатора Calamares на %1.&lt;/h1&gt;</translation>
<translation>&lt;h1&gt;Добре дошли в инсталатора Calamares за %1.&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="223"/>
<source>&lt;h1&gt;Welcome to the %1 installer.&lt;/h1&gt;</source>
<translation>&lt;h1&gt;Добре дошли при инсталатора на %1.&lt;/h1&gt;</translation>
<translation>&lt;h1&gt;Добре дошли в инсталатора на %1.&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="228"/>

View File

@ -619,7 +619,7 @@ L'instal·lador es tancarà i tots els canvis es perdran.</translation>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation>Aquest dispositiu d'emmagatzematge ja un sistema operatiu, però la taula de particions &lt;strong&gt;%1&lt;/strong&gt; és diferent de la necessària: &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt; </translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>

View File

@ -623,7 +623,7 @@ Instalační program bude ukončen a všechny změny ztraceny.</translation>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation>Na tomto úložném zařízení se nachází operační systém, ale tabulka rozdělení &lt;strong&gt;%1&lt;/strong&gt; je jiná než potřebná &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>

View File

@ -619,17 +619,17 @@ Installationsprogrammet vil stoppe og alle ændringer vil gå tabt.</translation
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation>Lagerenheden har allerede et styresystem den men partitionstabellen &lt;strong&gt;%1&lt;/strong&gt; er ikke magen til den nødvendige &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
<source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>Lagerenhden har en af sine partitioner &lt;strong&gt;monteret&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
<source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
<translation type="unfinished"/>
<translation>Lagringsenheden er en del af en &lt;strong&gt;inaktiv RAID&lt;/strong&gt;-enhed.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>

View File

@ -619,17 +619,17 @@ Asennusohjelma sulkeutuu ja kaikki muutoksesi katoavat.</translation>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation>Tässä kiintolevyssä on jo käyttöjärjestelmä, mutta osiotaulukko &lt;strong&gt;%1&lt;/strong&gt; on erilainen kuin tarvittava &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
<source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>Tähän kiintolevyyn on &lt;strong&gt;asennettu&lt;/strong&gt; yksi osioista.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
<source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
<translation type="unfinished"/>
<translation>Tämä kiintolevy on osa &lt;strong&gt;passiivista RAID&lt;/strong&gt; -laitetta.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>

File diff suppressed because it is too large Load Diff

View File

@ -11,12 +11,12 @@
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="71"/>
<source>This system was started with an &lt;strong&gt;EFI&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from an EFI environment, this installer must deploy a boot loader application, like &lt;strong&gt;GRUB&lt;/strong&gt; or &lt;strong&gt;systemd-boot&lt;/strong&gt; on an &lt;strong&gt;EFI System Partition&lt;/strong&gt;. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own.</source>
<translation>מערכת זו הופעלה בתצורת אתחול &lt;strong&gt;EFI&lt;/strong&gt;.&lt;br&gt;&lt;br&gt; כדי להגדיר הפעלה מתצורת אתחול EFI, על אשף ההתקנה להתקין מנהל אתחול מערכת, לדוגמה &lt;strong&gt;GRUB&lt;/strong&gt; או &lt;strong&gt;systemd-boot&lt;/strong&gt; על &lt;strong&gt;מחיצת מערכת EFI&lt;/strong&gt;. פעולה זו היא אוטומטית, אלא אם כן העדפתך היא להגדיר מחיצות באופן ידני, במקרה זה עליך לבחור זאת או להגדיר בעצמך.</translation>
<translation>מערכת זו הופעלה בתצורת אתחול &lt;strong&gt;EFI&lt;/strong&gt;.&lt;br&gt;&lt;br&gt; כדי להגדיר הפעלה מתצורת אתחול EFI, על תכנית ההתקנה להתקין מנהל אתחול מערכת, לדוגמה &lt;strong&gt;GRUB&lt;/strong&gt; או &lt;strong&gt;systemd-boot&lt;/strong&gt; על &lt;strong&gt;מחיצת מערכת EFI&lt;/strong&gt;. פעולה זו היא אוטומטית, אלא אם כן העדפתך היא להגדיר מחיצות באופן ידני, במקרה זה יש לבחור זאת או להגדיר בעצמך.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="83"/>
<source>This system was started with a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from a BIOS environment, this installer must install a boot loader, like &lt;strong&gt;GRUB&lt;/strong&gt;, either at the beginning of a partition or on the &lt;strong&gt;Master Boot Record&lt;/strong&gt; near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own.</source>
<translation>מערכת זו הופעלה בתצורת אתחול &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;&lt;br&gt; כדי להגדיר הפעלה מתצורת אתחול BIOS, על אשף ההתקנה להתקין מנהל אתחול מערכת, לדוגמה &lt;strong&gt;GRUB&lt;/strong&gt;, בתחילת המחיצה או על ה־&lt;strong&gt;Master Boot Record&lt;/strong&gt; בצמוד להתחלה של טבלת המחיצות (מועדף). פעולה זו היא אוטומטית, אלא אם כן תבחר להגדיר מחיצות באופן ידני, במקרה זה עליך להגדיר זאת בעצמך.</translation>
<translation>מערכת זו הופעלה בתצורת אתחול &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;&lt;br&gt; כדי להגדיר הפעלה מתצורת אתחול BIOS, על תכנית ההתקנה להתקין מנהל אתחול מערכת, לדוגמה &lt;strong&gt;GRUB&lt;/strong&gt;, בתחילת המחיצה או על ה־&lt;strong&gt;Master Boot Record&lt;/strong&gt; בצמוד להתחלה של טבלת המחיצות (מועדף). פעולה זו היא אוטומטית, אלא אם כן תבחר להגדיר מחיצות באופן ידני, במקרה זה יש להגדיר זאת בעצמך.</translation>
</message>
</context>
<context>
@ -340,7 +340,7 @@
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="332"/>
<source>The %1 installer is about to make changes to your disk in order to install %2.&lt;br/&gt;&lt;strong&gt;You will not be able to undo these changes.&lt;/strong&gt;</source>
<translation>אשף ההתקנה של %1 הולך לבצע שינויים בכונן שלך לטובת התקנת %2.&lt;br/&gt;&lt;strong&gt;לא תוכל לבטל את השינויים הללו.&lt;/strong&gt;</translation>
<translation>תכנית ההתקנה של %1 עומדת לבצע שינויים בכונן שלך לטובת התקנת %2.&lt;br/&gt;&lt;strong&gt;לא תהיה אפשרות לבטל את השינויים הללו.&lt;/strong&gt;</translation>
</message>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="335"/>
@ -375,7 +375,7 @@
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="395"/>
<source>The installation is complete. Close the installer.</source>
<translation>תהליך ההתקנה הושלם. נא לסגור את אשף ההתקנה.</translation>
<translation>תהליך ההתקנה הושלם. נא לסגור את תכנית ההתקנה.</translation>
</message>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="397"/>
@ -428,8 +428,8 @@ The setup program will quit and all changes will be lost.</source>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="514"/>
<source>Do you really want to cancel the current install process?
The installer will quit and all changes will be lost.</source>
<translation>האם ברצונך לבטל את תהליך ההתקנה?
אשף ההתקנה ייסגר וכל השינויים יאבדו.</translation>
<translation>האם אכן ברצונך לבטל את תהליך ההתקנה?
תכנית ההתקנה תיסגר וכל השינויים יאבדו.</translation>
</message>
</context>
<context>
@ -495,7 +495,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/calamares/CalamaresWindow.cpp" line="305"/>
<source>%1 Installer</source>
<translation>אשף התקנה של %1</translation>
<translation>תכנית התקנת %1</translation>
</message>
</context>
<context>
@ -638,7 +638,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>
<source>No Swap</source>
<translation>בלי החלפה</translation>
<translation>ללא החלפה</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1611"/>
@ -1117,7 +1117,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/jobs/DeletePartitionJob.cpp" line="56"/>
<source>The installer failed to delete partition %1.</source>
<translation>אשף ההתקנה נכשל בעת מחיקת מחיצה %1.</translation>
<translation>תכנית ההתקנה כשלה במחיקת המחיצה %1.</translation>
</message>
</context>
<context>
@ -1644,7 +1644,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/license/LicensePage.cpp" line="146"/>
<source>If you do not agree with the terms, the setup procedure cannot continue.</source>
<translation>אם התנאים האלה אינם מקובלים עליך, אי אפשר להמשיך בתהליך ההתקנה.</translation>
<translation>אם התנאים האלה אינם מקובלים עליכם, אי אפשר להמשיך בתהליך ההתקנה.</translation>
</message>
<message>
<location filename="../src/modules/license/LicensePage.cpp" line="151"/>
@ -1654,7 +1654,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/license/LicensePage.cpp" line="156"/>
<source>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead.</source>
<translation>אם תנאים אלו אינם מקובלים עליך, לא תותקן תכנה קניינית וייעשה שימוש בחלופות בקוד פתוח במקום.</translation>
<translation>אם התנאים הללו אינם מקובלים עליכם, תוכנה קניינית לא תותקן, ובמקומן יעשה שימוש בחלופות בקוד פתוח.</translation>
</message>
</context>
<context>
@ -1826,8 +1826,8 @@ The installer will quit and all changes will be lost.</source>
<source>Please select your preferred location on the map so the installer can suggest the locale
and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging
to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming.</source>
<translation>נא לבחור את המיקום המועדף עליך על המפה כדי שתכנית ההתקנה תוכל להציע הגדרות מקומיות
ואזור זמן עבורך. ניתן לכוונן את ההגדרות המוצעות להלן. לחפש במפה על ידי משיכה להזזתה ובכפתורים +/- כדי להתקרב/להתרחק
<translation>נא לבחור את המיקום המועדף עליכם על המפה כדי שתכנית ההתקנה תוכל להציע הגדרות מקומיות
ואזור זמן עבורכם. ניתן לכוונן את ההגדרות המוצעות להלן. לחפש במפה על ידי משיכה להזזתה ובכפתורים +/- כדי להתקרב/להתרחק
או להשתמש בגלילת העכבר לטובת שליטה בתקריב.</translation>
</message>
</context>
@ -1974,7 +1974,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/localeq/Offline.qml" line="37"/>
<source>Select your preferred Region, or use the default one based on your current location.</source>
<translation>נא לבחור את המחוז המועדף עליך או להשתמש בבררת המחדל לפי המיקום הנוכחי שלך.</translation>
<translation>נא לבחור את המחוז המועדף עליכם או להשתמש בברירת המחדל לפי המיקום הנוכחי שלכם.</translation>
</message>
<message>
<location filename="../src/modules/localeq/Offline.qml" line="94"/>
@ -2029,7 +2029,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="158"/>
<source>The password is the same as the old one</source>
<translation>הססמה זהה לישנה</translation>
<translation>הססמה הזו זהה לישנה</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="160"/>
@ -2413,7 +2413,7 @@ The installer will quit and all changes will be lost.</source>
<location filename="../src/modules/users/page_usersetup.ui" line="519"/>
<location filename="../src/modules/users/page_usersetup.ui" line="544"/>
<source>&lt;small&gt;Enter the same password twice, so that it can be checked for typing errors.&lt;/small&gt;</source>
<translation>&lt;small&gt;עליך להקליד את אותה הססמה פעמיים כדי לאפשר זיהוי של שגיאות הקלדה.&lt;/small&gt;</translation>
<translation>&lt;small&gt;יש להקליד את אותה הססמה פעמיים כדי לאפשר זיהוי של שגיאות הקלדה.&lt;/small&gt;</translation>
</message>
</context>
<context>
@ -2648,12 +2648,12 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="427"/>
<source>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;To configure an EFI system partition, go back and select or create a FAT32 filesystem with the &lt;strong&gt;%3&lt;/strong&gt; flag enabled and mount point &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;You can continue without setting up an EFI system partition but your system may fail to start.</source>
<translation>מחיצת מערכת EFI נדרשת כדי להפעיל את %1.&lt;br/&gt;&lt;br/&gt; כדי להגדיר מחיצת מערכת EFI, עליך לחזור ולבחור או ליצור מערכת קבצים מסוג FAT32 עם סימון &lt;strong&gt;%3&lt;/strong&gt; פעיל ועם נקודת עיגון &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt; ניתן להמשיך ללא הגדרת מחיצת מערכת EFI אך טעינת המערכת עשויה להיכשל.</translation>
<translation>מחיצת מערכת EFI נדרשת כדי להפעיל את %1.&lt;br/&gt;&lt;br/&gt; כדי להגדיר מחיצת מערכת EFI, יש לחזור ולבחור או ליצור מערכת קבצים מסוג FAT32 עם סימון &lt;strong&gt;%3&lt;/strong&gt; פעיל ועם נקודת עיגון &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt; ניתן להמשיך ללא הגדרת מחיצת מערכת EFI אך טעינת המערכת עשויה להיכשל.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="441"/>
<source>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;A partition was configured with mount point &lt;strong&gt;%2&lt;/strong&gt; but its &lt;strong&gt;%3&lt;/strong&gt; flag is not set.&lt;br/&gt;To set the flag, go back and edit the partition.&lt;br/&gt;&lt;br/&gt;You can continue without setting the flag but your system may fail to start.</source>
<translation>לצורך הפעלת %1 נדרשת מחיצת מערכת EFI.&lt;br/&gt;&lt;br/&gt; הוגדרה מחיצה עם נקודת עיגון &lt;strong&gt;%2&lt;/strong&gt; אך לא הוגדר סימון &lt;strong&gt;%3&lt;/strong&gt;.&lt;br/&gt; כדי לסמן את המחיצה, עליך לחזור ולערוך את המחיצה.&lt;br/&gt;&lt;br/&gt; ניתן להמשיך ללא הוספת הסימון אך טעינת המערכת עשויה להיכשל.</translation>
<translation>לצורך הפעלת %1 נדרשת מחיצת מערכת EFI.&lt;br/&gt;&lt;br/&gt; הוגדרה מחיצה עם נקודת עיגון &lt;strong&gt;%2&lt;/strong&gt; אך לא הוגדר סימון &lt;strong&gt;%3&lt;/strong&gt;.&lt;br/&gt; כדי לסמן את המחיצה, יש לחזור ולערוך את המחיצה.&lt;br/&gt;&lt;br/&gt; ניתן להמשיך ללא הוספת הסימון אך טעינת המערכת עשויה להיכשל.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="440"/>
@ -2843,7 +2843,7 @@ Output:
<message>
<location filename="../src/libcalamares/partition/FileSystem.cpp" line="34"/>
<source>swap</source>
<translation>דפדוף, swap</translation>
<translation>דפדוף swap</translation>
</message>
<message>
<location filename="../src/modules/keyboard/keyboardwidget/keyboardglobal.cpp" line="90"/>
@ -3886,7 +3886,7 @@ Output:
<message>
<location filename="../src/modules/keyboardq/keyboardq.qml" line="60"/>
<source>Click your preferred keyboard model to select layout and variant, or use the default one based on the detected hardware.</source>
<translation>נא ללחוץ על דרם המקלדת המועדף עליך כדי לבחור בפריסה ובהגוון או להשתמש בבררת המחדל בהתאם לחומרה שזוהתה.</translation>
<translation>נא ללחוץ על דגם המקלדת המועדף עליכם כדי לבחור בפריסה ובהגוון או להשתמש בברירת המחדל בהתאם לחומרה שזוהתה.</translation>
</message>
<message>
<location filename="../src/modules/keyboardq/keyboardq.qml" line="253"/>

View File

@ -619,17 +619,17 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation> ि ि , &lt;strong&gt;%1&lt;/strong&gt; ि ि ि &lt;strong&gt;%2&lt;/strong&gt; ि &lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
<source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation> ि ि &lt;strong&gt;&lt;/strong&gt; </translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
<source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
<translation type="unfinished"/>
<translation> &lt;strong&gt;िि RAID&lt;/strong&gt; ि </translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>

View File

@ -621,7 +621,7 @@ Instalacijski program će izaći i sve promjene će biti izgubljene.</translatio
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation>Ovaj uređaj za pohranu već ima operativni sustav, ali njegova particijska tablica &lt;strong&gt;%1&lt;/strong&gt; razlikuje se od potrebne &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>

View File

@ -617,7 +617,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation> &lt;strong&gt;%1&lt;/strong&gt; &lt;strong&gt;%2&lt;/strong&gt; &lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>

View File

@ -619,17 +619,17 @@ O instalador será fechado e todas as alterações serão perdidas.</translation
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation>O dispositivo de armazenamento possui um sistema operacional, mas a tabela de partições &lt;strong&gt;%1&lt;/strong&gt; é diferente da necessária &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
<source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>O dispositivo de armazenamento tem uma de suas partições &lt;strong&gt;montada&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
<source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
<translation type="unfinished"/>
<translation>O dispositivo de armazenamento é parte de um dispositivo &lt;strong&gt;RAID inativo&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>

View File

@ -618,17 +618,17 @@ Alla ändringar kommer att gå förlorade.</translation>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation>Denna lagringsenhet har redan ett operativsystem installerat sig, men partitionstabellen &lt;strong&gt;%1&lt;/strong&gt; skiljer sig från den som behövs &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
<source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>Denna lagringsenhet har en av dess partitioner &lt;strong&gt;monterad&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
<source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
<translation type="unfinished"/>
<translation>Denna lagringsenhet är en del av en &lt;strong&gt;inaktiv RAID&lt;/strong&gt;enhet. </translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>

View File

@ -620,17 +620,17 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation>Ин дастгоҳи захирагоҳ аллакай дорои низоми амалкунанда мебошад, аммо ҷадвали қисми диски &lt;strong&gt;%1&lt;/strong&gt; аз диски лозимии &lt;strong&gt;%2&lt;/strong&gt; фарқ мекунад.&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
<source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>Яке аз қисмҳои диски ин дастгоҳи захирагоҳ &lt;strong&gt;васлшуда&lt;/strong&gt; мебошад.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
<source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
<translation type="unfinished"/>
<translation>Ин дастгоҳи захирагоҳ қисми дасгоҳи &lt;strong&gt;RAID-и ғайрифаъол&lt;/strong&gt; мебошад.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>

4124
lang/calamares_vi.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -617,17 +617,17 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation> &lt;strong&gt;%1&lt;/strong&gt; &lt;strong&gt;%2&lt;/strong&gt; &lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
<source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt;&lt;/strong&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
<source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
<translation type="unfinished"/>
<translation>&lt;strong&gt; RAID&lt;/strong&gt; </translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>

View File

@ -201,6 +201,8 @@ msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
"Спіс дысплейных кіраўнікоў пусты альбо не вызначаны ў both globalstorage і "
"displaymanager.conf."
#: src/modules/displaymanager/main.py:977
msgid "Display manager configuration was incomplete"
@ -314,11 +316,11 @@ msgstr "Наладка апаратнага гадзінніка."
#: src/modules/mkinitfs/main.py:27
msgid "Creating initramfs with mkinitfs."
msgstr ""
msgstr "Стварэнне initramfs праз mkinitfs."
#: src/modules/mkinitfs/main.py:49
msgid "Failed to run mkinitfs on the target"
msgstr ""
msgstr "Не атрымалася запусціць mkinitfs у пункце прызначэння"
#: src/modules/mkinitfs/main.py:50 src/modules/dracut/main.py:50
msgid "The exit code was {}"

View File

@ -4,7 +4,7 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Georgi Georgiev, 2020
# Жоро, 2020
#
#, fuzzy
msgid ""
@ -13,7 +13,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 22:35+0200\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
"Last-Translator: Georgi Georgiev, 2020\n"
"Last-Translator: Жоро, 2020\n"
"Language-Team: Bulgarian (https://www.transifex.com/calamares/teams/20061/bg/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"

View File

@ -204,6 +204,8 @@ msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
"La llista de gestors de pantalla és buida o no definida ni a globalstorage "
"ni a displaymanager.conf."
#: src/modules/displaymanager/main.py:977
msgid "Display manager configuration was incomplete"

View File

@ -204,6 +204,8 @@ msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
"Displayhåndteringerlisten er tom eller udefineret i både globalstorage og "
"displaymanager.conf."
#: src/modules/displaymanager/main.py:977
msgid "Display manager configuration was incomplete"

View File

@ -201,6 +201,8 @@ msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
"Luettelo on tyhjä tai määrittelemätön, sekä globalstorage, että "
"displaymanager.conf tiedostossa."
#: src/modules/displaymanager/main.py:977
msgid "Display manager configuration was incomplete"

View File

@ -23,11 +23,11 @@ msgstr ""
#: src/modules/grubcfg/main.py:28
msgid "Configure GRUB."
msgstr ""
msgstr "Configure GRUB."
#: src/modules/mount/main.py:29
msgid "Mounting partitions."
msgstr ""
msgstr "Montaç des partizions."
#: src/modules/mount/main.py:141 src/modules/initcpiocfg/main.py:196
#: src/modules/initcpiocfg/main.py:200

View File

@ -200,6 +200,8 @@ msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
"globalstorage व displaymanager.conf में डिस्प्ले प्रबंधक सूची रिक्त या "
"अपरिभाषित है।"
#: src/modules/displaymanager/main.py:977
msgid "Display manager configuration was incomplete"

View File

@ -205,6 +205,8 @@ msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
"Skärmhanterar listan är tom eller odefinierad i både globalstorage och "
"displaymanager.conf."
#: src/modules/displaymanager/main.py:977
msgid "Display manager configuration was incomplete"

View File

@ -205,6 +205,8 @@ msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
"Рӯйхати displaymanagers ҳам дар globalstorage ва ҳам дар displaymanager.conf"
" холӣ ё номаълум аст."
#: src/modules/displaymanager/main.py:977
msgid "Display manager configuration was incomplete"

View File

@ -0,0 +1,363 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# T. Tran <transifex@emiu.net>, 2020
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 22:35+0200\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
"Last-Translator: T. Tran <transifex@emiu.net>, 2020\n"
"Language-Team: Vietnamese (https://www.transifex.com/calamares/teams/20061/vi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: vi\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: src/modules/grubcfg/main.py:28
msgid "Configure GRUB."
msgstr "Cấu hình GRUB"
#: src/modules/mount/main.py:29
msgid "Mounting partitions."
msgstr "Đang gắn kết các phân vùng."
#: src/modules/mount/main.py:141 src/modules/initcpiocfg/main.py:196
#: src/modules/initcpiocfg/main.py:200
#: src/modules/luksopenswaphookcfg/main.py:86
#: src/modules/luksopenswaphookcfg/main.py:90 src/modules/rawfs/main.py:164
#: src/modules/initramfscfg/main.py:85 src/modules/initramfscfg/main.py:89
#: src/modules/openrcdmcryptcfg/main.py:69
#: src/modules/openrcdmcryptcfg/main.py:73 src/modules/fstab/main.py:361
#: src/modules/fstab/main.py:367 src/modules/localecfg/main.py:135
#: src/modules/networkcfg/main.py:39
msgid "Configuration Error"
msgstr "Lỗi cấu hình"
#: src/modules/mount/main.py:142 src/modules/initcpiocfg/main.py:197
#: src/modules/luksopenswaphookcfg/main.py:87 src/modules/rawfs/main.py:165
#: src/modules/initramfscfg/main.py:86 src/modules/openrcdmcryptcfg/main.py:70
#: src/modules/fstab/main.py:362
msgid "No partitions are defined for <pre>{!s}</pre> to use."
msgstr "Không có phân vùng nào được định nghĩa cho <pre>{!s}</pre> để dùng."
#: src/modules/services-systemd/main.py:26
msgid "Configure systemd services"
msgstr "Cấu hình các dịch vụ systemd"
#: src/modules/services-systemd/main.py:59
#: src/modules/services-openrc/main.py:93
msgid "Cannot modify service"
msgstr "Không thể sửa đổi dịch vụ"
#: src/modules/services-systemd/main.py:60
msgid ""
"<code>systemctl {arg!s}</code> call in chroot returned error code {num!s}."
msgstr ""
"<code>systemctl {arg!s}</code> trong môi trường chroot trả về lỗi {num!s}."
#: src/modules/services-systemd/main.py:63
#: src/modules/services-systemd/main.py:67
msgid "Cannot enable systemd service <code>{name!s}</code>."
msgstr "Không thể bật dịch vụ systemd <code>{name!s}</code>."
#: src/modules/services-systemd/main.py:65
msgid "Cannot enable systemd target <code>{name!s}</code>."
msgstr "Không thể bật nhóm dịch vụ systemd <code>{name!s}</code>."
#: src/modules/services-systemd/main.py:69
msgid "Cannot disable systemd target <code>{name!s}</code>."
msgstr "Không thể tắt nhóm dịch vụ systemd <code>{name!s}</code>."
#: src/modules/services-systemd/main.py:71
msgid "Cannot mask systemd unit <code>{name!s}</code>."
msgstr "Không thể đánh dấu đơn vị systemd <code>{name!s}</code>."
#: src/modules/services-systemd/main.py:73
msgid ""
"Unknown systemd commands <code>{command!s}</code> and "
"<code>{suffix!s}</code> for unit {name!s}."
msgstr ""
"Không nhận ra lệnh systemd <code>{command!s}</code> và "
"<code>{suffix!s}</code> cho đơn vị {name!s}."
#: src/modules/umount/main.py:31
msgid "Unmount file systems."
msgstr "Gỡ kết nối các hệ thống tập tin."
#: src/modules/unpackfs/main.py:35
msgid "Filling up filesystems."
msgstr "Đang làm đầy các hệ thống tập tin."
#: src/modules/unpackfs/main.py:254
msgid "rsync failed with error code {}."
msgstr "rsync thất bại với lỗi {}."
#: src/modules/unpackfs/main.py:299
msgid "Unpacking image {}/{}, file {}/{}"
msgstr "Đang bung hình ảnh {}/{}, tập tin {}/{}"
#: src/modules/unpackfs/main.py:314
msgid "Starting to unpack {}"
msgstr "Bắt đầu bung nội dung {}"
#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:463
msgid "Failed to unpack image \"{}\""
msgstr "Bung hình ảnh thất bại \"{}\""
#: src/modules/unpackfs/main.py:430
msgid "No mount point for root partition"
msgstr "Không có điểm kết nối cho phân vùng gốc"
#: src/modules/unpackfs/main.py:431
msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing"
msgstr "globalstorage không có khoá \"rootMountPoint\", sẽ không làm gì cả"
#: src/modules/unpackfs/main.py:436
msgid "Bad mount point for root partition"
msgstr "Sai điểm kết nối cho phân vùng gốc"
#: src/modules/unpackfs/main.py:437
msgid "rootMountPoint is \"{}\", which does not exist, doing nothing"
msgstr "rootMountPoint không tồn tại, có giá trị là \"{}\", sẽ không làm gì cả"
#: src/modules/unpackfs/main.py:453 src/modules/unpackfs/main.py:457
#: src/modules/unpackfs/main.py:477
msgid "Bad unsquash configuration"
msgstr "Sai cấu hình bung nén"
#: src/modules/unpackfs/main.py:454
msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel"
msgstr "Hệ thống tập tin cho \"{}\" ({}) không được hỗ trợ bởi nhân hiện tại"
#: src/modules/unpackfs/main.py:458
msgid "The source filesystem \"{}\" does not exist"
msgstr "Hệ thống tập tin nguồn \"{}\" không tồn tại"
#: src/modules/unpackfs/main.py:464
msgid ""
"Failed to find unsquashfs, make sure you have the squashfs-tools package "
"installed"
msgstr "Không tìm thấy lệnh unsquashfs, vui lòng cài đặt gói squashfs-tools"
#: src/modules/unpackfs/main.py:478
msgid "The destination \"{}\" in the target system is not a directory"
msgstr "Hệ thống đích \"{}\" không phải là một thư mục"
#: src/modules/displaymanager/main.py:514
msgid "Cannot write KDM configuration file"
msgstr "Không thể ghi vào tập tin cấu hình KDM"
#: src/modules/displaymanager/main.py:515
msgid "KDM config file {!s} does not exist"
msgstr "Tập tin cấu hình KDM {!s} không tồn tại"
#: src/modules/displaymanager/main.py:576
msgid "Cannot write LXDM configuration file"
msgstr "Không thể ghi vào tập tin cấu hình LXDM"
#: src/modules/displaymanager/main.py:577
msgid "LXDM config file {!s} does not exist"
msgstr "Tập tin cấu hình LXDM {!s} không tồn tại"
#: src/modules/displaymanager/main.py:660
msgid "Cannot write LightDM configuration file"
msgstr "Không thể ghi vào tập tin cấu hình LightDM"
#: src/modules/displaymanager/main.py:661
msgid "LightDM config file {!s} does not exist"
msgstr "Tập tin cấu hình LightDM {!s} không tồn tại"
#: src/modules/displaymanager/main.py:735
msgid "Cannot configure LightDM"
msgstr "Không thể cấu hình LXDM"
#: src/modules/displaymanager/main.py:736
msgid "No LightDM greeter installed."
msgstr "Màn hình chào mừng LightDM không được cài đặt."
#: src/modules/displaymanager/main.py:767
msgid "Cannot write SLIM configuration file"
msgstr "Không thể ghi vào tập tin cấu hình SLIM"
#: src/modules/displaymanager/main.py:768
msgid "SLIM config file {!s} does not exist"
msgstr "Tập tin cấu hình SLIM {!s} không tồn tại"
#: src/modules/displaymanager/main.py:894
msgid "No display managers selected for the displaymanager module."
msgstr ""
"Không có trình quản lý hiển thị nào được chọn cho mô-đun quản lý hiển thị"
#: src/modules/displaymanager/main.py:895
msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
"Danh sách quản lý hiện thị trống hoặc không được định nghĩa cả trong "
"globalstorage và displaymanager.conf."
#: src/modules/displaymanager/main.py:977
msgid "Display manager configuration was incomplete"
msgstr "Cầu hình quản lý hiện thị không hoàn tất"
#: src/modules/initcpiocfg/main.py:28
msgid "Configuring mkinitcpio."
msgstr "Đang cấu hình mkinitcpio."
#: src/modules/initcpiocfg/main.py:201
#: src/modules/luksopenswaphookcfg/main.py:91
#: src/modules/initramfscfg/main.py:90 src/modules/openrcdmcryptcfg/main.py:74
#: src/modules/fstab/main.py:368 src/modules/localecfg/main.py:136
#: src/modules/networkcfg/main.py:40
msgid "No root mount point is given for <pre>{!s}</pre> to use."
msgstr "Không có điểm kết nối gốc cho <pre>{!s}</pre> để dùng."
#: src/modules/luksopenswaphookcfg/main.py:26
msgid "Configuring encrypted swap."
msgstr "Đang cấu hình hoán đổi mã hoá"
#: src/modules/rawfs/main.py:26
msgid "Installing data."
msgstr "Đang cài đặt dữ liệu."
#: src/modules/services-openrc/main.py:29
msgid "Configure OpenRC services"
msgstr "Cấu hình dịch vụ OpenRC"
#: src/modules/services-openrc/main.py:57
msgid "Cannot add service {name!s} to run-level {level!s}."
msgstr "Không thể thêm dịch vụ {name!s} vào run-level {level!s}."
#: src/modules/services-openrc/main.py:59
msgid "Cannot remove service {name!s} from run-level {level!s}."
msgstr "Không thể loại bỏ dịch vụ {name!s} từ run-level {level!s}."
#: src/modules/services-openrc/main.py:61
msgid ""
"Unknown service-action <code>{arg!s}</code> for service {name!s} in run-"
"level {level!s}."
msgstr ""
"Không nhận ra thao tác <code>{arg!s}</code> cho dịch vụ {name!s} ở run-level"
" {level!s}."
#: src/modules/services-openrc/main.py:94
msgid ""
"<code>rc-update {arg!s}</code> call in chroot returned error code {num!s}."
msgstr ""
"Lệnh <code>rc-update {arg!s}</code> trong môi trường chroot trả về lỗi "
"{num!s}."
#: src/modules/services-openrc/main.py:101
msgid "Target runlevel does not exist"
msgstr "Nhóm dịch vụ khởi động không tồn tại"
#: src/modules/services-openrc/main.py:102
msgid ""
"The path for runlevel {level!s} is <code>{path!s}</code>, which does not "
"exist."
msgstr ""
"Đường dẫn cho runlevel {level!s} là <code>{path!s}</code>, nhưng không tồn "
"tại."
#: src/modules/services-openrc/main.py:110
msgid "Target service does not exist"
msgstr "Nhóm dịch vụ không tồn tại"
#: src/modules/services-openrc/main.py:111
msgid ""
"The path for service {name!s} is <code>{path!s}</code>, which does not "
"exist."
msgstr ""
"Đường dẫn cho dịch vụ {name!s} là <code>{path!s}</code>, nhưng không tồn "
"tại."
#: src/modules/plymouthcfg/main.py:27
msgid "Configure Plymouth theme"
msgstr "Cấu hình giao diện Plymouth"
#: src/modules/packages/main.py:50 src/modules/packages/main.py:59
#: src/modules/packages/main.py:69
msgid "Install packages."
msgstr "Đang cài đặt các gói ứng dụng."
#: src/modules/packages/main.py:57
#, python-format
msgid "Processing packages (%(count)d / %(total)d)"
msgstr "Đang xử lý gói (%(count)d / %(total)d)"
#: src/modules/packages/main.py:62
#, python-format
msgid "Installing one package."
msgid_plural "Installing %(num)d packages."
msgstr[0] "Đang cài đặt %(num)d gói ứng dụng."
#: src/modules/packages/main.py:65
#, python-format
msgid "Removing one package."
msgid_plural "Removing %(num)d packages."
msgstr[0] "Đang gỡ bỏ %(num)d gói ứng dụng."
#: src/modules/bootloader/main.py:42
msgid "Install bootloader."
msgstr "Đang cài đặt bộ khởi động."
#: src/modules/hwclock/main.py:26
msgid "Setting hardware clock."
msgstr "Đang thiết lập đồng hồ máy tính."
#: src/modules/mkinitfs/main.py:27
msgid "Creating initramfs with mkinitfs."
msgstr "Đang tạo initramfs bằng mkinitfs."
#: src/modules/mkinitfs/main.py:49
msgid "Failed to run mkinitfs on the target"
msgstr "Chạy mkinitfs thất bại ở hệ thống đích"
#: src/modules/mkinitfs/main.py:50 src/modules/dracut/main.py:50
msgid "The exit code was {}"
msgstr "Mã lỗi trả về là {}"
#: src/modules/dracut/main.py:27
msgid "Creating initramfs with dracut."
msgstr "Đang tạo initramfs bằng dracut."
#: src/modules/dracut/main.py:49
msgid "Failed to run dracut on the target"
msgstr "Chạy dracut thất bại ở hệ thống đích"
#: src/modules/initramfscfg/main.py:32
msgid "Configuring initramfs."
msgstr "Đang cấu hình initramfs."
#: src/modules/openrcdmcryptcfg/main.py:25
msgid "Configuring OpenRC dmcrypt service."
msgstr "Đang cấu hình dịch vụ OpenRC dmcrypt."
#: src/modules/fstab/main.py:29
msgid "Writing fstab."
msgstr "Đang viết vào fstab."
#: src/modules/dummypython/main.py:35
msgid "Dummy python job."
msgstr "Ví dụ công việc python."
#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:93
#: src/modules/dummypython/main.py:94
msgid "Dummy python step {}"
msgstr "Ví dụ python bước {}"
#: src/modules/localecfg/main.py:30
msgid "Configuring locales."
msgstr "Đang cấu hình ngôn ngữ."
#: src/modules/networkcfg/main.py:28
msgid "Saving network configuration."
msgstr "Đang lưu cấu hình mạng."

View File

@ -199,7 +199,7 @@ msgstr "未在顯示管理器模組中選取顯示管理器。"
msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
msgstr "顯示管理器清單為空或在 globalstorage 與 displaymanager.conf 中皆未定義。"
#: src/modules/displaymanager/main.py:977
msgid "Display manager configuration was incomplete"

View File

@ -271,7 +271,7 @@ flavoredWidget( Calamares::Branding::PanelFlavor flavor,
case Calamares::Branding::PanelFlavor::None:
return nullptr;
}
NOTREACHED return nullptr; // All enum values handled above
__builtin_unreachable();
}
/** @brief Adds widgets to @p layout if they belong on this @p side

View File

@ -86,9 +86,6 @@ if( WITH_PYTHON )
PythonJob.cpp
PythonJobApi.cpp
)
set_source_files_properties( PythonJob.cpp
PROPERTIES COMPILE_FLAGS "${SUPPRESS_BOOST_WARNINGS}"
)
include_directories(${PYTHON_INCLUDE_DIRS})
link_directories(${PYTHON_LIBRARIES})
@ -148,8 +145,8 @@ calamares_automoc( calamares )
target_link_libraries( calamares
LINK_PRIVATE
${OPTIONAL_PRIVATE_LIBRARIES}
yamlcpp
LINK_PUBLIC
yamlcpp
Qt5::Core
KF5::CoreAddons
${OPTIONAL_PUBLIC_LIBRARIES}

View File

@ -284,7 +284,7 @@ PythonJob::exec()
return JobResult::error( message, description );
}
}
catch ( bp::error_already_set )
catch ( bp::error_already_set& )
{
QString msg;
if ( PyErr_Occurred() )

View File

@ -101,7 +101,7 @@ create_interface( Handler::Type t, const QString& selector )
case Handler::Type::Fixed:
return std::make_unique< GeoIPFixed >( selector );
}
NOTREACHED return nullptr;
__builtin_unreachable();
}
static RegionZonePair

View File

@ -85,16 +85,11 @@ void
RequirementsModel::describe() const
{
cDebug() << "Requirements model has" << m_requirements.count() << "items";
bool acceptable = true;
int count = 0;
for ( const auto& r : m_requirements )
{
cDebug() << Logger::SubEntry << "requirement" << count << r.name << "satisfied?" << r.satisfied << "mandatory?"
<< r.mandatory;
if ( r.mandatory && !r.satisfied )
{
acceptable = false;
}
++count;
}
}

View File

@ -139,9 +139,7 @@ PartitionSize::toBytes( qint64 totalSectors, qint64 sectorSize ) const
case SizeUnit::GiB:
return toBytes();
}
// notreached
return -1;
__builtin_unreachable();
}
qint64
@ -178,9 +176,7 @@ PartitionSize::toBytes( qint64 totalBytes ) const
case SizeUnit::GiB:
return toBytes();
}
// notreached
return -1;
__builtin_unreachable();
}
qint64
@ -211,7 +207,7 @@ PartitionSize::toBytes() const
case SizeUnit::GiB:
return CalamaresUtils::GiBtoBytes( static_cast< unsigned long long >( value() ) );
}
NOTREACHED return -1;
__builtin_unreachable();
}
bool
@ -237,7 +233,7 @@ PartitionSize::operator<( const PartitionSize& other ) const
case SizeUnit::GiB:
return ( toBytes() < other.toBytes() );
}
NOTREACHED return false;
__builtin_unreachable();
}
bool
@ -263,7 +259,7 @@ PartitionSize::operator>( const PartitionSize& other ) const
case SizeUnit::GiB:
return ( toBytes() > other.toBytes() );
}
NOTREACHED return false;
__builtin_unreachable();
}
bool
@ -289,7 +285,7 @@ PartitionSize::operator==( const PartitionSize& other ) const
case SizeUnit::GiB:
return ( toBytes() == other.toBytes() );
}
NOTREACHED return false;
__builtin_unreachable();
}
} // namespace Partition

View File

@ -52,9 +52,7 @@ yamlToVariant( const YAML::Node& node )
case YAML::NodeType::Undefined:
return QVariant();
}
// NOTREACHED
return QVariant();
__builtin_unreachable();
}

View File

@ -0,0 +1,42 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2020 Adriaan de Groot <groot@kde.org>
* SPDX-License-Identifier: GPL-3.0-or-later
* Calamares is Free Software: see the License-Identifier above.
*
*/
/**@file Handle compatibility and deprecations across Qt versions
*
* Since Calamares is supposed to work with Qt 5.9 or later, it covers a
* lot of changes in the Qt API. Especially the later Qt 5.15 (last LTS)
* versions deprecate a number of enum values and parts of the QWidgets
* API. This file adjusts for that by introducing suitable aliases
* and workaround-functions.
*
* For a similar approach for QtCore, see libcalamares/utils/String.h
*/
#ifndef UTILS_QTCOMPAT_H
#define UTILS_QTCOMPAT_H
#include <QPalette>
/* Avoid warnings about QPalette changes */
constexpr static const auto WindowBackground =
#if QT_VERSION < QT_VERSION_CHECK( 5, 15, 0 )
QPalette::Background
#else
QPalette::Window
#endif
;
constexpr static const auto WindowText =
#if QT_VERSION < QT_VERSION_CHECK( 5, 15, 0 )
QPalette::Foreground
#else
QPalette::WindowText
#endif
;
#endif

View File

@ -42,7 +42,7 @@ makeSlideshow( QWidget* parent )
return new Calamares::SlideshowPictures( parent );
#ifdef WITH_QML
case 1:
FALLTHRU;
[[fallthrough]];
case 2:
return new Calamares::SlideshowQML( parent );
#endif

View File

@ -0,0 +1,25 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2020 Artem Grinev <agrinev@manjaro.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Calamares is Free Software: see the License-Identifier above.
*
*/
#ifndef KEYBOARD_ADDITIONAL_LAYOUT_INFO_H
#define KEYBOARD_ADDITIONAL_LAYOUT_INFO_H
#include <QString>
struct AdditionalLayoutInfo
{
QString additionalLayout;
QString additionalVariant;
QString groupSwitcher;
QString vconsoleKeymap;
};
#endif

View File

@ -7,6 +7,7 @@ calamares_add_plugin( keyboard
TYPE viewmodule
EXPORT_MACRO PLUGINDLLEXPORT_PRO
SOURCES
Config.cpp
KeyboardViewStep.cpp
KeyboardPage.cpp
KeyboardLayoutModel.cpp

View File

@ -18,170 +18,28 @@
#include "utils/Logger.h"
#include "utils/Retranslator.h"
#include "utils/String.h"
#include "utils/Variant.h"
#include <QApplication>
#include <QProcess>
#include <QTimer>
KeyboardModelsModel::KeyboardModelsModel( QObject* parent )
: QAbstractListModel( parent )
/* Returns stringlist with suitable setxkbmap command-line arguments
* to set the given @p model.
*/
static inline QStringList
xkbmap_model_args( const QString& model )
{
detectModels();
QStringList r { "-model", model };
return r;
}
void
KeyboardModelsModel::detectModels()
{
beginResetModel();
const auto models = KeyboardGlobal::getKeyboardModels();
auto index = -1;
for ( const auto& key : models.keys() )
{
index++;
m_list << QMap< QString, QString > { { "label", key }, { "key", models[ key ] } };
if ( models[ key ] == "pc105" )
{
this->setCurrentIndex( index );
}
}
endResetModel();
}
void
KeyboardModelsModel::refresh()
{
m_list.clear();
setCurrentIndex( -1 );
detectModels();
}
QVariant
KeyboardModelsModel::data( const QModelIndex& index, int role ) const
{
if ( !index.isValid() )
{
return QVariant();
}
const auto item = m_list.at( index.row() );
return role == Qt::DisplayRole ? item[ "label" ] : item[ "key" ];
}
int
KeyboardModelsModel::rowCount( const QModelIndex& ) const
{
return m_list.count();
}
QHash< int, QByteArray >
KeyboardModelsModel::roleNames() const
{
return { { Qt::DisplayRole, "label" }, { Qt::UserRole, "key" } };
}
int
KeyboardModelsModel::currentIndex() const
{
return m_currentIndex;
}
const QMap< QString, QString >
KeyboardModelsModel::item( const int& index ) const
{
if ( index >= m_list.count() || index < 0 )
{
return QMap< QString, QString >();
}
return m_list.at( index );
}
const QMap< QString, QString >
KeyboardVariantsModel::item( const int& index ) const
{
if ( index >= m_list.count() || index < 0 )
{
return QMap< QString, QString >();
}
return m_list.at( index );
}
void
KeyboardModelsModel::setCurrentIndex( const int& index )
{
if ( index >= m_list.count() || index < 0 )
{
return;
}
m_currentIndex = index;
emit currentIndexChanged( m_currentIndex );
}
KeyboardVariantsModel::KeyboardVariantsModel( QObject* parent )
: QAbstractListModel( parent )
{
}
int
KeyboardVariantsModel::currentIndex() const
{
return m_currentIndex;
}
void
KeyboardVariantsModel::setCurrentIndex( const int& index )
{
if ( index >= m_list.count() || index < 0 )
{
return;
}
m_currentIndex = index;
emit currentIndexChanged( m_currentIndex );
}
QVariant
KeyboardVariantsModel::data( const QModelIndex& index, int role ) const
{
if ( !index.isValid() )
{
return QVariant();
}
const auto item = m_list.at( index.row() );
return role == Qt::DisplayRole ? item[ "label" ] : item[ "key" ];
}
int
KeyboardVariantsModel::rowCount( const QModelIndex& ) const
{
return m_list.count();
}
QHash< int, QByteArray >
KeyboardVariantsModel::roleNames() const
{
return { { Qt::DisplayRole, "label" }, { Qt::UserRole, "key" } };
}
void
KeyboardVariantsModel::setVariants( QMap< QString, QString > variants )
{
m_list.clear();
beginResetModel();
for ( const auto& key : variants.keys() )
{
const auto item = QMap< QString, QString > { { "label", key }, { "key", variants[ key ] } };
m_list << item;
}
endResetModel();
}
/* Returns stringlist with suitable setxkbmap command-line arguments
* to set the given @p layout and @p variant.
*/
static inline QStringList
xkbmap_args( const QString& layout, const QString& variant )
xkbmap_layout_args( const QString& layout, const QString& variant )
{
QStringList r { "-layout", layout };
if ( !variant.isEmpty() )
@ -191,6 +49,103 @@ xkbmap_args( const QString& layout, const QString& variant )
return r;
}
static inline QStringList
xkbmap_layout_args( const QStringList& layouts,
const QStringList& variants,
const QString& switchOption = "grp:alt_shift_toggle" )
{
if ( layouts.size() != variants.size() )
{
cError() << "Number of layouts and variants must be equal (empty string should be used if there is no "
"corresponding variant)";
return QStringList();
}
QStringList r { "-layout", layouts.join( "," ) };
if ( !variants.isEmpty() )
{
r << "-variant" << variants.join( "," );
}
if ( !switchOption.isEmpty() )
{
r << "-option" << switchOption;
}
return r;
}
/* Returns group-switch setxkbd option if set
* or an empty string otherwise
*/
static inline QString
xkbmap_query_grp_option()
{
QProcess setxkbmapQuery;
setxkbmapQuery.start( "setxkbmap", { "-query" } );
setxkbmapQuery.waitForFinished();
QString outputLine;
do
{
outputLine = setxkbmapQuery.readLine();
} while ( setxkbmapQuery.canReadLine() && !outputLine.startsWith( "options:" ) );
if ( !outputLine.startsWith( "options:" ) )
{
return QString();
}
int index = outputLine.indexOf( "grp:" );
if ( index == -1 )
{
return QString();
}
//it's either in the end of line or before the other option so \s or ,
int lastIndex = outputLine.indexOf( QRegExp( "[\\s,]" ), index );
return outputLine.mid( index, lastIndex - 1 );
}
AdditionalLayoutInfo
Config::getAdditionalLayoutInfo( const QString& layout )
{
QFile layoutTable( ":/non-ascii-layouts" );
if ( !layoutTable.open( QIODevice::ReadOnly | QIODevice::Text ) )
{
cError() << "Non-ASCII layout table could not be opened";
return AdditionalLayoutInfo();
}
QString tableLine;
do
{
tableLine = layoutTable.readLine();
} while ( layoutTable.canReadLine() && !tableLine.startsWith( layout ) );
if ( !tableLine.startsWith( layout ) )
{
return AdditionalLayoutInfo();
}
QStringList tableEntries = tableLine.split( " ", SplitSkipEmptyParts );
AdditionalLayoutInfo r;
r.additionalLayout = tableEntries[ 1 ];
r.additionalVariant = tableEntries[ 2 ] == "-" ? "" : tableEntries[ 2 ];
r.vconsoleKeymap = tableEntries[ 3 ];
return r;
}
Config::Config( QObject* parent )
: QObject( parent )
, m_keyboardModelsModel( new KeyboardModelsModel( this ) )
@ -201,9 +156,9 @@ Config::Config( QObject* parent )
// Connect signals and slots
connect( m_keyboardModelsModel, &KeyboardModelsModel::currentIndexChanged, [&]( int index ) {
m_selectedModel = m_keyboardModelsModel->item( index ).value( "key", "pc105" );
// Set Xorg keyboard model
QProcess::execute( "setxkbmap", QStringList { "-model", m_selectedModel } );
// Set Xorg keyboard model
m_selectedModel = m_keyboardModelsModel->key( index );
QProcess::execute( "setxkbmap", xkbmap_model_args( m_selectedModel ) );
emit prettyStatusChanged();
} );
@ -214,9 +169,9 @@ Config::Config( QObject* parent )
} );
connect( m_keyboardVariantsModel, &KeyboardVariantsModel::currentIndexChanged, [&]( int index ) {
m_selectedVariant = m_keyboardVariantsModel->item( index )[ "key" ];
// Set Xorg keyboard layout + variant
m_selectedVariant = m_keyboardVariantsModel->key( index );
// Set Xorg keyboard layout
if ( m_setxkbmapTimer.isActive() )
{
m_setxkbmapTimer.stop();
@ -224,8 +179,32 @@ Config::Config( QObject* parent )
}
connect( &m_setxkbmapTimer, &QTimer::timeout, this, [=] {
QProcess::execute( "setxkbmap", xkbmap_args( m_selectedLayout, m_selectedVariant ) );
cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant;
m_additionalLayoutInfo = getAdditionalLayoutInfo( m_selectedLayout );
if ( !m_additionalLayoutInfo.additionalLayout.isEmpty() )
{
m_additionalLayoutInfo.groupSwitcher = xkbmap_query_grp_option();
if ( m_additionalLayoutInfo.groupSwitcher.isEmpty() )
{
m_additionalLayoutInfo.groupSwitcher = "grp:alt_shift_toggle";
}
QProcess::execute( "setxkbmap",
xkbmap_layout_args( { m_additionalLayoutInfo.additionalLayout, m_selectedLayout },
{ m_additionalLayoutInfo.additionalVariant, m_selectedVariant },
m_additionalLayoutInfo.groupSwitcher ) );
cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant << "(added "
<< m_additionalLayoutInfo.additionalLayout << "-" << m_additionalLayoutInfo.additionalVariant
<< " since current layout is not ASCII-capable)";
}
else
{
QProcess::execute( "setxkbmap", xkbmap_layout_args( m_selectedLayout, m_selectedVariant ) );
cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant;
}
m_setxkbmapTimer.disconnect( this );
} );
m_setxkbmapTimer.start( QApplication::keyboardInputInterval() );
@ -269,7 +248,7 @@ findLayout( const KeyboardLayoutModel* klm, const QString& currentLayout )
}
void
Config::init()
Config::detectCurrentKeyboardLayout()
{
//### Detect current keyboard layout and variant
QString currentLayout;
@ -281,18 +260,25 @@ Config::init()
{
const QStringList list = QString( process.readAll() ).split( "\n", SplitSkipEmptyParts );
for ( QString line : list )
// A typical line looks like
// xkb_symbols { include "pc+latin+ru:2+inet(evdev)+group(alt_shift_toggle)+ctrl(swapcaps)" };
for ( const auto& line : list )
{
line = line.trimmed();
if ( !line.startsWith( "xkb_symbols" ) )
if ( !line.trimmed().startsWith( "xkb_symbols" ) )
{
continue;
}
line = line.remove( "}" ).remove( "{" ).remove( ";" );
line = line.mid( line.indexOf( "\"" ) + 1 );
int firstQuote = line.indexOf( '"' );
int lastQuote = line.lastIndexOf( '"' );
QStringList split = line.split( "+", SplitSkipEmptyParts );
if ( firstQuote < 0 || lastQuote < 0 || lastQuote <= firstQuote )
{
continue;
}
QStringList split = line.mid( firstQuote + 1, lastQuote - firstQuote ).split( "+", SplitSkipEmptyParts );
cDebug() << split;
if ( split.size() >= 2 )
{
currentLayout = split.at( 1 );
@ -338,11 +324,11 @@ Config::prettyStatus() const
{
QString status;
status += tr( "Set keyboard model to %1.<br/>" )
.arg( m_keyboardModelsModel->item( m_keyboardModelsModel->currentIndex() )[ "label" ] );
.arg( m_keyboardModelsModel->label( m_keyboardModelsModel->currentIndex() ) );
QString layout = m_keyboardLayoutsModel->item( m_keyboardLayoutsModel->currentIndex() ).second.description;
QString variant = m_keyboardVariantsModel->currentIndex() >= 0
? m_keyboardVariantsModel->item( m_keyboardVariantsModel->currentIndex() )[ "label" ]
? m_keyboardVariantsModel->label( m_keyboardVariantsModel->currentIndex() )
: QString( "<default>" );
status += tr( "Set keyboard layout to %1/%2." ).arg( layout, variant );
@ -350,16 +336,17 @@ Config::prettyStatus() const
}
Calamares::JobList
Config::createJobs( const QString& xOrgConfFileName, const QString& convertedKeymapPath, bool writeEtcDefaultKeyboard )
Config::createJobs()
{
QList< Calamares::job_ptr > list;
Calamares::Job* j = new SetKeyboardLayoutJob( m_selectedModel,
m_selectedLayout,
m_selectedVariant,
xOrgConfFileName,
convertedKeymapPath,
writeEtcDefaultKeyboard );
m_additionalLayoutInfo,
m_xOrgConfFileName,
m_convertedKeymapPath,
m_writeEtcDefaultKeyboard );
list.append( Calamares::job_ptr( j ) );
return list;
@ -393,13 +380,12 @@ Config::guessLayout( const QStringList& langParts )
cDebug() << "Next level:" << *countryPart;
for ( int variantnumber = 0; variantnumber < m_keyboardVariantsModel->rowCount(); ++variantnumber )
{
if ( m_keyboardVariantsModel->item( variantnumber )[ "key" ].compare( *countryPart,
Qt::CaseInsensitive ) )
if ( m_keyboardVariantsModel->key( variantnumber ).compare( *countryPart, Qt::CaseInsensitive )
== 0 )
{
m_keyboardVariantsModel->setCurrentIndex( variantnumber );
cDebug() << Logger::SubEntry << "matched variant"
<< m_keyboardVariantsModel->item( variantnumber )[ "key" ] << ' '
<< m_keyboardVariantsModel->item( variantnumber )[ "key" ];
cDebug() << Logger::SubEntry << "matched variant" << *countryPart << ' '
<< m_keyboardVariantsModel->key( variantnumber );
}
}
}
@ -507,6 +493,13 @@ Config::finalize()
{
gs->insert( "keyboardLayout", m_selectedLayout );
gs->insert( "keyboardVariant", m_selectedVariant ); //empty means default variant
if ( !m_additionalLayoutInfo.additionalLayout.isEmpty() )
{
gs->insert( "keyboardAdditionalLayout", m_additionalLayoutInfo.additionalLayout );
gs->insert( "keyboardAdditionalLayout", m_additionalLayoutInfo.additionalVariant );
gs->insert( "keyboardVConsoleKeymap", m_additionalLayoutInfo.vconsoleKeymap );
}
}
//FIXME: also store keyboard model for something?
@ -529,3 +522,41 @@ Config::updateVariants( const QPersistentModelIndex& currentItem, QString curren
}
}
}
void
Config::setConfigurationMap( const QVariantMap& configurationMap )
{
using namespace CalamaresUtils;
if ( configurationMap.contains( "xOrgConfFileName" )
&& configurationMap.value( "xOrgConfFileName" ).type() == QVariant::String
&& !getString( configurationMap, "xOrgConfFileName" ).isEmpty() )
{
m_xOrgConfFileName = getString( configurationMap, "xOrgConfFileName" );
}
else
{
m_xOrgConfFileName = "00-keyboard.conf";
}
if ( configurationMap.contains( "convertedKeymapPath" )
&& configurationMap.value( "convertedKeymapPath" ).type() == QVariant::String
&& !getString( configurationMap, "convertedKeymapPath" ).isEmpty() )
{
m_convertedKeymapPath = getString( configurationMap, "convertedKeymapPath" );
}
else
{
m_convertedKeymapPath = QString();
}
if ( configurationMap.contains( "writeEtcDefaultKeyboard" )
&& configurationMap.value( "writeEtcDefaultKeyboard" ).type() == QVariant::Bool )
{
m_writeEtcDefaultKeyboard = getBool( configurationMap, "writeEtcDefaultKeyboard", true );
}
else
{
m_writeEtcDefaultKeyboard = true;
}
}

View File

@ -11,6 +11,7 @@
#ifndef KEYBOARD_CONFIG_H
#define KEYBOARD_CONFIG_H
#include "AdditionalLayoutInfo.h"
#include "Job.h"
#include "KeyboardLayoutModel.h"
@ -20,63 +21,6 @@
#include <QTimer>
#include <QUrl>
class KeyboardModelsModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY( int currentIndex WRITE setCurrentIndex READ currentIndex NOTIFY currentIndexChanged )
public:
explicit KeyboardModelsModel( QObject* parent = nullptr );
int rowCount( const QModelIndex& = QModelIndex() ) const override;
QVariant data( const QModelIndex& index, int role ) const override;
void setCurrentIndex( const int& index );
int currentIndex() const;
const QMap< QString, QString > item( const int& index ) const;
public slots:
void refresh();
protected:
QHash< int, QByteArray > roleNames() const override;
private:
int m_currentIndex = -1;
QVector< QMap< QString, QString > > m_list;
void detectModels();
signals:
void currentIndexChanged( int index );
};
class KeyboardVariantsModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY( int currentIndex WRITE setCurrentIndex READ currentIndex NOTIFY currentIndexChanged )
public:
explicit KeyboardVariantsModel( QObject* parent = nullptr );
void setVariants( QMap< QString, QString > variants );
int rowCount( const QModelIndex& = QModelIndex() ) const override;
QVariant data( const QModelIndex& index, int role ) const override;
void setCurrentIndex( const int& index );
int currentIndex() const;
const QMap< QString, QString > item( const int& index ) const;
protected:
QHash< int, QByteArray > roleNames() const override;
private:
int m_currentIndex = -1;
QVector< QMap< QString, QString > > m_list;
signals:
void currentIndexChanged( int index );
};
class Config : public QObject
{
Q_OBJECT
@ -88,15 +32,35 @@ class Config : public QObject
public:
Config( QObject* parent = nullptr );
void init();
void detectCurrentKeyboardLayout();
Calamares::JobList
createJobs( const QString& xOrgConfFileName, const QString& convertedKeymapPath, bool writeEtcDefaultKeyboard );
Calamares::JobList createJobs();
QString prettyStatus() const;
void onActivate();
void finalize();
void setConfigurationMap( const QVariantMap& configurationMap );
static AdditionalLayoutInfo getAdditionalLayoutInfo( const QString& layout );
/* A model is a physical configuration of a keyboard, e.g. 105-key PC
* or TKL 88-key physical size.
*/
KeyboardModelsModel* keyboardModels() const;
/* A layout describes the basic keycaps / language assigned to the
* keys of the physical keyboard, e.g. English (US) or Russian.
*/
KeyboardLayoutModel* keyboardLayouts() const;
/* A variant describes a variant of the basic keycaps; this can
* concern options (dead keys), or different placements of the keycaps
* (dvorak).
*/
KeyboardVariantsModel* keyboardVariants() const;
signals:
void prettyStatusChanged();
private:
void guessLayout( const QStringList& langParts );
void updateVariants( const QPersistentModelIndex& currentItem, QString currentVariant = QString() );
@ -108,16 +72,16 @@ private:
QString m_selectedLayout;
QString m_selectedModel;
QString m_selectedVariant;
// Layout (and corresponding info) added if current one doesn't support ASCII (e.g. Russian or Japanese)
AdditionalLayoutInfo m_additionalLayoutInfo;
QTimer m_setxkbmapTimer;
protected:
KeyboardModelsModel* keyboardModels() const;
KeyboardLayoutModel* keyboardLayouts() const;
KeyboardVariantsModel* keyboardVariants() const;
signals:
void prettyStatusChanged();
// From configuration
QString m_xOrgConfFileName;
QString m_convertedKeymapPath;
bool m_writeEtcDefaultKeyboard = true;
};

View File

@ -10,8 +10,108 @@
#include "KeyboardLayoutModel.h"
#include "utils/Logger.h"
#include <algorithm>
XKBListModel::XKBListModel( QObject* parent )
: QAbstractListModel( parent )
{
}
int
XKBListModel::rowCount( const QModelIndex& ) const
{
return m_list.count();
}
QVariant
XKBListModel::data( const QModelIndex& index, int role ) const
{
if ( !index.isValid() )
{
return QVariant();
}
if ( index.row() < 0 || index.row() >= m_list.count() )
{
return QVariant();
}
const auto item = m_list.at( index.row() );
switch ( role )
{
case LabelRole:
return item.label;
case KeyRole:
return item.key;
default:
return QVariant();
}
__builtin_unreachable();
}
QString
XKBListModel::key( int index ) const
{
if ( index < 0 || index >= m_list.count() )
{
return QString();
}
return m_list[ index ].key;
}
QString
XKBListModel::label( int index ) const
{
if ( index < 0 || index >= m_list.count() )
{
return QString();
}
return m_list[ index ].label;
}
QHash< int, QByteArray >
XKBListModel::roleNames() const
{
return { { Qt::DisplayRole, "label" }, { Qt::UserRole, "key" } };
}
void
XKBListModel::setCurrentIndex( int index )
{
if ( index >= m_list.count() || index < 0 )
{
return;
}
if ( m_currentIndex != index )
{
m_currentIndex = index;
emit currentIndexChanged( m_currentIndex );
}
}
KeyboardModelsModel::KeyboardModelsModel( QObject* parent )
: XKBListModel( parent )
{
// The models map is from human-readable names (!) to xkb identifier
const auto models = KeyboardGlobal::getKeyboardModels();
m_list.reserve( models.count() );
int index = 0;
for ( const auto& key : models.keys() )
{
// So here *key* is the key in the map, which is the human-readable thing,
// while the struct fields are xkb-id, and human-readable
m_list << ModelInfo { models[ key ], key };
if ( models[ key ] == "pc105" )
{
m_defaultPC105 = index;
}
index++;
}
cDebug() << "Loaded" << m_list.count() << "keyboard models";
}
KeyboardLayoutModel::KeyboardLayoutModel( QObject* parent )
: QAbstractListModel( parent )
@ -83,15 +183,18 @@ KeyboardLayoutModel::roleNames() const
}
void
KeyboardLayoutModel::setCurrentIndex( const int& index )
KeyboardLayoutModel::setCurrentIndex( int index )
{
if ( index >= m_layouts.count() || index < 0 )
{
return;
}
m_currentIndex = index;
emit currentIndexChanged( m_currentIndex );
if ( m_currentIndex != index )
{
m_currentIndex = index;
emit currentIndexChanged( m_currentIndex );
}
}
int
@ -99,3 +202,22 @@ KeyboardLayoutModel::currentIndex() const
{
return m_currentIndex;
}
KeyboardVariantsModel::KeyboardVariantsModel( QObject* parent )
: XKBListModel( parent )
{
}
void
KeyboardVariantsModel::setVariants( QMap< QString, QString > variants )
{
beginResetModel();
m_list.clear();
m_list.reserve( variants.count() );
for ( const auto& key : variants.keys() )
{
m_list << ModelInfo { variants[ key ], key };
}
endResetModel();
}

View File

@ -17,6 +17,85 @@
#include <QMetaType>
#include <QObject>
/** @brief A list model with an xkb key and a human-readable string
*
* This model acts like it has a single selection, as well.
*/
class XKBListModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY( int currentIndex WRITE setCurrentIndex READ currentIndex NOTIFY currentIndexChanged )
public:
enum
{
LabelRole = Qt::DisplayRole, ///< Human-readable
KeyRole = Qt::UserRole ///< xkb identifier
};
explicit XKBListModel( QObject* parent = nullptr );
int rowCount( const QModelIndex& = QModelIndex() ) const override;
QVariant data( const QModelIndex& index, int role ) const override;
/** @brief xkb key for a given index (row)
*
* This is like calling data( QModelIndex( index ), KeyRole ).toString(),
* but shorter and faster. Can return an empty string if index is invalid.
*/
QString key( int index ) const;
/** @brief human-readable label for a given index (row)
*
* This is like calling data( QModelIndex( index ), LabelRole ).toString(),
* but shorter and faster. Can return an empty string if index is invalid.
*/
QString label( int index ) const;
QHash< int, QByteArray > roleNames() const override;
void setCurrentIndex( int index );
int currentIndex() const { return m_currentIndex; }
signals:
void currentIndexChanged( int index );
protected:
struct ModelInfo
{
/// XKB identifier
QString key;
/// Human-readable
QString label;
};
QVector< ModelInfo > m_list;
int m_currentIndex = -1;
};
/** @brief A list model of the physical keyboard formats ("models" in xkb)
*
* This model acts like it has a single selection, as well.
*/
class KeyboardModelsModel : public XKBListModel
{
Q_OBJECT
public:
explicit KeyboardModelsModel( QObject* parent = nullptr );
/// @brief Set the index back to PC105 (the default physical model)
void setCurrentIndex() { XKBListModel::setCurrentIndex( m_defaultPC105 ); }
private:
int m_defaultPC105 = -1; ///< The index of pc105, if there is one
};
/** @brief A list of keyboard layouts (arrangements of keycaps)
*
* Layouts can have a list of associated Variants, so this
* is slightly more complicated than the "regular" XKBListModel.
*/
class KeyboardLayoutModel : public QAbstractListModel
{
Q_OBJECT
@ -35,7 +114,7 @@ public:
QVariant data( const QModelIndex& index, int role ) const override;
void setCurrentIndex( const int& index );
void setCurrentIndex( int index );
int currentIndex() const;
const QPair< QString, KeyboardGlobal::KeyboardInfo > item( const int& index ) const;
@ -51,4 +130,20 @@ signals:
void currentIndexChanged( int index );
};
/** @brief A list of variants (xkb id and human-readable)
*
* The variants that are available depend on the Layout that is used,
* so the `setVariants()` function can be used to update the variants
* when the two models are related.
*/
class KeyboardVariantsModel : public XKBListModel
{
Q_OBJECT
public:
explicit KeyboardVariantsModel( QObject* parent = nullptr );
void setVariants( QMap< QString, QString > variants );
};
#endif // KEYBOARDLAYOUTMODEL_H

View File

@ -15,6 +15,7 @@
#include "KeyboardPage.h"
#include "Config.h"
#include "KeyboardLayoutModel.h"
#include "SetKeyboardLayoutJob.h"
#include "keyboardwidget/keyboardpreview.h"
@ -40,451 +41,64 @@ public:
LayoutItem::~LayoutItem() {}
static QPersistentModelIndex
findLayout( const KeyboardLayoutModel* klm, const QString& currentLayout )
{
QPersistentModelIndex currentLayoutItem;
for ( int i = 0; i < klm->rowCount(); ++i )
{
QModelIndex idx = klm->index( i );
if ( idx.isValid() && idx.data( KeyboardLayoutModel::KeyboardLayoutKeyRole ).toString() == currentLayout )
{
currentLayoutItem = idx;
}
}
return currentLayoutItem;
}
KeyboardPage::KeyboardPage( QWidget* parent )
KeyboardPage::KeyboardPage( Config* config, QWidget* parent )
: QWidget( parent )
, ui( new Ui::Page_Keyboard )
, m_keyboardPreview( new KeyBoardPreview( this ) )
, m_defaultIndex( 0 )
, m_config( config )
{
ui->setupUi( this );
// Keyboard Preview
ui->KBPreviewLayout->addWidget( m_keyboardPreview );
m_setxkbmapTimer.setSingleShot( true );
// Connect signals and slots
connect( ui->listVariant, &QListWidget::currentItemChanged, this, &KeyboardPage::onListVariantCurrentItemChanged );
{
auto* model = config->keyboardModels();
model->setCurrentIndex(); // To default PC105
ui->physicalModelSelector->setModel( model );
ui->physicalModelSelector->setCurrentIndex( model->currentIndex() );
}
{
auto* model = config->keyboardLayouts();
ui->layoutSelector->setModel( model );
ui->layoutSelector->setCurrentIndex( model->index( model->currentIndex() ) );
}
{
auto* model = config->keyboardVariants();
ui->variantSelector->setModel( model );
ui->variantSelector->setCurrentIndex( model->index( model->currentIndex() ) );
cDebug() << "Variants now" << model->rowCount() << model->currentIndex();
}
connect(
ui->buttonRestore, &QPushButton::clicked, [this] { ui->comboBoxModel->setCurrentIndex( m_defaultIndex ); } );
ui->buttonRestore, &QPushButton::clicked, [config = config] { config->keyboardModels()->setCurrentIndex(); } );
connect( ui->comboBoxModel, &QComboBox::currentTextChanged, [this]( const QString& text ) {
QString model = m_models.value( text, "pc105" );
connect( ui->physicalModelSelector,
QOverload< int >::of( &QComboBox::currentIndexChanged ),
config->keyboardModels(),
QOverload< int >::of( &XKBListModel::setCurrentIndex ) );
connect( config->keyboardModels(),
&KeyboardModelsModel::currentIndexChanged,
ui->physicalModelSelector,
&QComboBox::setCurrentIndex );
// Set Xorg keyboard model
QProcess::execute( "setxkbmap", QStringList { "-model", model } );
connect( ui->layoutSelector->selectionModel(),
&QItemSelectionModel::currentChanged,
[this]( const QModelIndex& current ) { m_config->keyboardLayouts()->setCurrentIndex( current.row() ); } );
connect( config->keyboardLayouts(), &KeyboardLayoutModel::currentIndexChanged, [this]( int index ) {
ui->layoutSelector->setCurrentIndex( m_config->keyboardLayouts()->index( index ) );
} );
connect( ui->variantSelector->selectionModel(),
&QItemSelectionModel::currentChanged,
[this]( const QModelIndex& current ) { m_config->keyboardVariants()->setCurrentIndex( current.row() ); } );
connect( config->keyboardVariants(), &KeyboardVariantsModel::currentIndexChanged, [this]( int index ) {
ui->variantSelector->setCurrentIndex( m_config->keyboardVariants()->index( index ) );
} );
CALAMARES_RETRANSLATE( ui->retranslateUi( this ); )
}
KeyboardPage::~KeyboardPage()
{
delete ui;
}
void
KeyboardPage::init()
{
//### Detect current keyboard layout and variant
QString currentLayout;
QString currentVariant;
QProcess process;
process.start( "setxkbmap", QStringList() << "-print" );
if ( process.waitForFinished() )
{
const QStringList list = QString( process.readAll() ).split( "\n", SplitSkipEmptyParts );
for ( QString line : list )
{
line = line.trimmed();
if ( !line.startsWith( "xkb_symbols" ) )
{
continue;
}
line = line.remove( "}" ).remove( "{" ).remove( ";" );
line = line.mid( line.indexOf( "\"" ) + 1 );
QStringList split = line.split( "+", SplitSkipEmptyParts );
if ( split.size() >= 2 )
{
currentLayout = split.at( 1 );
if ( currentLayout.contains( "(" ) )
{
int parenthesisIndex = currentLayout.indexOf( "(" );
currentVariant = currentLayout.mid( parenthesisIndex + 1 ).trimmed();
currentVariant.chop( 1 );
currentLayout = currentLayout.mid( 0, parenthesisIndex ).trimmed();
}
break;
}
}
}
//### Models
m_models = KeyboardGlobal::getKeyboardModels();
QMapIterator< QString, QString > mi( m_models );
ui->comboBoxModel->blockSignals( true );
while ( mi.hasNext() )
{
mi.next();
if ( mi.value() == "pc105" )
{
m_defaultIndex = ui->comboBoxModel->count();
}
ui->comboBoxModel->addItem( mi.key() );
}
ui->comboBoxModel->blockSignals( false );
// Set to default value pc105
ui->comboBoxModel->setCurrentIndex( m_defaultIndex );
//### Layouts and Variants
KeyboardLayoutModel* klm = new KeyboardLayoutModel( this );
ui->listLayout->setModel( klm );
connect( ui->listLayout->selectionModel(),
&QItemSelectionModel::currentChanged,
this,
&KeyboardPage::onListLayoutCurrentItemChanged );
// Block signals
ui->listLayout->blockSignals( true );
QPersistentModelIndex currentLayoutItem = findLayout( klm, currentLayout );
if ( !currentLayoutItem.isValid() && ( ( currentLayout == "latin" ) || ( currentLayout == "pc" ) ) )
{
currentLayout = "us";
currentLayoutItem = findLayout( klm, currentLayout );
}
// Set current layout and variant
if ( currentLayoutItem.isValid() )
{
ui->listLayout->setCurrentIndex( currentLayoutItem );
updateVariants( currentLayoutItem, currentVariant );
}
// Unblock signals
ui->listLayout->blockSignals( false );
// Default to the first available layout if none was set
// Do this after unblocking signals so we get the default variant handling.
if ( !currentLayoutItem.isValid() && klm->rowCount() > 0 )
{
ui->listLayout->setCurrentIndex( klm->index( 0 ) );
}
}
QString
KeyboardPage::prettyStatus() const
{
QString status;
status += tr( "Set keyboard model to %1.<br/>" ).arg( ui->comboBoxModel->currentText() );
QString layout = ui->listLayout->currentIndex().data().toString();
QString variant = ui->listVariant->currentItem() ? ui->listVariant->currentItem()->text() : QString( "<default>" );
status += tr( "Set keyboard layout to %1/%2." ).arg( layout, variant );
return status;
}
QList< Calamares::job_ptr >
KeyboardPage::createJobs( const QString& xOrgConfFileName,
const QString& convertedKeymapPath,
bool writeEtcDefaultKeyboard )
{
QList< Calamares::job_ptr > list;
QString selectedModel = m_models.value( ui->comboBoxModel->currentText(), "pc105" );
Calamares::Job* j = new SetKeyboardLayoutJob( selectedModel,
m_selectedLayout,
m_selectedVariant,
xOrgConfFileName,
convertedKeymapPath,
writeEtcDefaultKeyboard );
list.append( Calamares::job_ptr( j ) );
return list;
}
void
KeyboardPage::guessLayout( const QStringList& langParts )
{
const KeyboardLayoutModel* klm = dynamic_cast< KeyboardLayoutModel* >( ui->listLayout->model() );
bool foundCountryPart = false;
for ( auto countryPart = langParts.rbegin(); !foundCountryPart && countryPart != langParts.rend(); ++countryPart )
{
cDebug() << Logger::SubEntry << "looking for locale part" << *countryPart;
for ( int i = 0; i < klm->rowCount(); ++i )
{
QModelIndex idx = klm->index( i );
QString name
= idx.isValid() ? idx.data( KeyboardLayoutModel::KeyboardLayoutKeyRole ).toString() : QString();
if ( idx.isValid() && ( name.compare( *countryPart, Qt::CaseInsensitive ) == 0 ) )
{
cDebug() << Logger::SubEntry << "matched" << name;
ui->listLayout->setCurrentIndex( idx );
foundCountryPart = true;
break;
}
}
if ( foundCountryPart )
{
++countryPart;
if ( countryPart != langParts.rend() )
{
cDebug() << "Next level:" << *countryPart;
for ( int variantnumber = 0; variantnumber < ui->listVariant->count(); ++variantnumber )
{
LayoutItem* variantdata = dynamic_cast< LayoutItem* >( ui->listVariant->item( variantnumber ) );
if ( variantdata && ( variantdata->data.compare( *countryPart, Qt::CaseInsensitive ) == 0 ) )
{
ui->listVariant->setCurrentItem( variantdata );
cDebug() << Logger::SubEntry << "matched variant" << variantdata->data << ' '
<< variantdata->text();
}
}
}
}
}
}
void
KeyboardPage::onActivate()
{
/* Guessing a keyboard layout based on the locale means
* mapping between language identifiers in <lang>_<country>
* format to keyboard mappings, which are <country>_<layout>
* format; in addition, some countries have multiple languages,
* so fr_BE and nl_BE want different layouts (both Belgian)
* and sometimes the language-country name doesn't match the
* keyboard-country name at all (e.g. Ellas vs. Greek).
*
* This is a table of language-to-keyboard mappings. The
* language identifier is the key, while the value is
* a string that is used instead of the real language
* identifier in guessing -- so it should be something
* like <layout>_<country>.
*/
static constexpr char arabic[] = "ara";
static const auto specialCaseMap = QMap< std::string, std::string >( {
/* Most Arab countries map to Arabic keyboard (Default) */
{ "ar_AE", arabic },
{ "ar_BH", arabic },
{ "ar_DZ", arabic },
{ "ar_EG", arabic },
{ "ar_IN", arabic },
{ "ar_IQ", arabic },
{ "ar_JO", arabic },
{ "ar_KW", arabic },
{ "ar_LB", arabic },
{ "ar_LY", arabic },
/* Not Morocco: use layout ma */
{ "ar_OM", arabic },
{ "ar_QA", arabic },
{ "ar_SA", arabic },
{ "ar_SD", arabic },
{ "ar_SS", arabic },
/* Not Syria: use layout sy */
{ "ar_TN", arabic },
{ "ar_YE", arabic },
{ "ca_ES", "cat_ES" }, /* Catalan */
{ "as_ES", "ast_ES" }, /* Asturian */
{ "en_CA", "us" }, /* Canadian English */
{ "el_CY", "gr" }, /* Greek in Cyprus */
{ "el_GR", "gr" }, /* Greek in Greeze */
{ "ig_NG", "igbo_NG" }, /* Igbo in Nigeria */
{ "ha_NG", "hausa_NG" } /* Hausa */
} );
ui->listLayout->setFocus();
// Try to preselect a layout, depending on language and locale
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
QString lang = gs->value( "localeConf" ).toMap().value( "LANG" ).toString();
cDebug() << "Got locale language" << lang;
if ( !lang.isEmpty() )
{
// Chop off .codeset and @modifier
int index = lang.indexOf( '.' );
if ( index >= 0 )
{
lang.truncate( index );
}
index = lang.indexOf( '@' );
if ( index >= 0 )
{
lang.truncate( index );
}
lang.replace( '-', '_' ); // Normalize separators
}
if ( !lang.isEmpty() )
{
std::string lang_s = lang.toStdString();
if ( specialCaseMap.contains( lang_s ) )
{
QString newLang = QString::fromStdString( specialCaseMap.value( lang_s ) );
cDebug() << Logger::SubEntry << "special case language" << lang << "becomes" << newLang;
lang = newLang;
}
}
if ( !lang.isEmpty() )
{
const auto langParts = lang.split( '_', SplitSkipEmptyParts );
// Note that this his string is not fit for display purposes!
// It doesn't come from QLocale::nativeCountryName.
QString country = QLocale::countryToString( QLocale( lang ).country() );
cDebug() << Logger::SubEntry << "extracted country" << country << "::" << langParts;
guessLayout( langParts );
}
}
void
KeyboardPage::finalize()
{
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
if ( !m_selectedLayout.isEmpty() )
{
gs->insert( "keyboardLayout", m_selectedLayout );
gs->insert( "keyboardVariant", m_selectedVariant ); //empty means default variant
}
//FIXME: also store keyboard model for something?
}
void
KeyboardPage::updateVariants( const QPersistentModelIndex& currentItem, QString currentVariant )
{
// Block signals
ui->listVariant->blockSignals( true );
QMap< QString, QString > variants
= currentItem.data( KeyboardLayoutModel::KeyboardVariantsRole ).value< QMap< QString, QString > >();
QMapIterator< QString, QString > li( variants );
LayoutItem* defaultItem = nullptr;
ui->listVariant->clear();
while ( li.hasNext() )
{
li.next();
LayoutItem* item = new LayoutItem();
item->setText( li.key() );
item->data = li.value();
ui->listVariant->addItem( item );
// currentVariant defaults to QString(). It is only non-empty during the
// initial setup.
if ( li.value() == currentVariant )
{
defaultItem = item;
}
}
// Unblock signals
ui->listVariant->blockSignals( false );
// Set to default value
if ( defaultItem )
{
ui->listVariant->setCurrentItem( defaultItem );
}
}
void
KeyboardPage::onListLayoutCurrentItemChanged( const QModelIndex& current, const QModelIndex& previous )
{
Q_UNUSED( previous )
if ( !current.isValid() )
{
return;
}
updateVariants( QPersistentModelIndex( current ) );
}
/* Returns stringlist with suitable setxkbmap command-line arguments
* to set the given @p layout and @p variant.
*/
static inline QStringList
xkbmap_args( const QString& layout, const QString& variant )
{
QStringList r { "-layout", layout };
if ( !variant.isEmpty() )
{
r << "-variant" << variant;
}
return r;
}
void
KeyboardPage::onListVariantCurrentItemChanged( QListWidgetItem* current, QListWidgetItem* previous )
{
Q_UNUSED( previous )
QPersistentModelIndex layoutIndex = ui->listLayout->currentIndex();
LayoutItem* variantItem = dynamic_cast< LayoutItem* >( current );
if ( !layoutIndex.isValid() || !variantItem )
{
return;
}
QString layout = layoutIndex.data( KeyboardLayoutModel::KeyboardLayoutKeyRole ).toString();
QString variant = variantItem->data;
m_keyboardPreview->setLayout( layout );
m_keyboardPreview->setVariant( variant );
//emit checkReady();
// Set Xorg keyboard layout
if ( m_setxkbmapTimer.isActive() )
{
m_setxkbmapTimer.stop();
m_setxkbmapTimer.disconnect( this );
}
connect( &m_setxkbmapTimer, &QTimer::timeout, this, [=] {
QProcess::execute( "setxkbmap", xkbmap_args( layout, variant ) );
cDebug() << "xkbmap selection changed to: " << layout << '-' << variant;
m_setxkbmapTimer.disconnect( this );
} );
m_setxkbmapTimer.start( QApplication::keyboardInputInterval() );
m_selectedLayout = layout;
m_selectedVariant = variant;
}

View File

@ -27,42 +27,20 @@ namespace Ui
class Page_Keyboard;
}
class Config;
class KeyBoardPreview;
class KeyboardPage : public QWidget
{
Q_OBJECT
public:
explicit KeyboardPage( QWidget* parent = nullptr );
explicit KeyboardPage( Config* config, QWidget* parent = nullptr );
~KeyboardPage() override;
void init();
QString prettyStatus() const;
Calamares::JobList
createJobs( const QString& xOrgConfFileName, const QString& convertedKeymapPath, bool writeEtcDefaultKeyboard );
void onActivate();
void finalize();
protected slots:
void onListLayoutCurrentItemChanged( const QModelIndex& current, const QModelIndex& previous );
void onListVariantCurrentItemChanged( QListWidgetItem* current, QListWidgetItem* previous );
private:
/// Guess a layout based on the split-apart locale
void guessLayout( const QStringList& langParts );
void updateVariants( const QPersistentModelIndex& currentItem, QString currentVariant = QString() );
Ui::Page_Keyboard* ui;
KeyBoardPreview* m_keyboardPreview;
int m_defaultIndex;
QMap< QString, QString > m_models;
QString m_selectedLayout;
QString m_selectedVariant;
QTimer m_setxkbmapTimer;
Config* m_config;
};
#endif // KEYBOARDPAGE_H

View File

@ -76,7 +76,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBoxModel">
<widget class="QComboBox" name="physicalModelSelector">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -110,10 +110,10 @@ SPDX-License-Identifier: GPL-3.0-or-later
<number>9</number>
</property>
<item>
<widget class="QListView" name="listLayout"/>
<widget class="QListView" name="layoutSelector"/>
</item>
<item>
<widget class="QListWidget" name="listVariant"/>
<widget class="QListView" name="variantSelector"/>
</item>
</layout>
</item>
@ -139,9 +139,9 @@ SPDX-License-Identifier: GPL-3.0-or-later
</layout>
</widget>
<tabstops>
<tabstop>comboBoxModel</tabstop>
<tabstop>listLayout</tabstop>
<tabstop>listVariant</tabstop>
<tabstop>physicalModelSelector</tabstop>
<tabstop>layoutSelector</tabstop>
<tabstop>variantSelector</tabstop>
<tabstop>LE_TestKeyboard</tabstop>
<tabstop>buttonRestore</tabstop>
</tabstops>

View File

@ -9,24 +9,21 @@
#include "KeyboardViewStep.h"
#include "Config.h"
#include "KeyboardPage.h"
#include "GlobalStorage.h"
#include "JobQueue.h"
#include "utils/Variant.h"
CALAMARES_PLUGIN_FACTORY_DEFINITION( KeyboardViewStepFactory, registerPlugin< KeyboardViewStep >(); )
KeyboardViewStep::KeyboardViewStep( QObject* parent )
: Calamares::ViewStep( parent )
, m_widget( new KeyboardPage() )
, m_nextEnabled( false )
, m_writeEtcDefaultKeyboard( true )
, m_config( new Config( this ) )
, m_widget( new KeyboardPage( m_config ) )
{
m_widget->init();
m_nextEnabled = true;
emit nextStatusChanged( m_nextEnabled );
m_config->detectCurrentKeyboardLayout();
emit nextStatusChanged( true );
}
@ -49,7 +46,7 @@ KeyboardViewStep::prettyName() const
QString
KeyboardViewStep::prettyStatus() const
{
return m_prettyStatus;
return m_config->prettyStatus();
}
@ -63,7 +60,7 @@ KeyboardViewStep::widget()
bool
KeyboardViewStep::isNextEnabled() const
{
return m_nextEnabled;
return true;
}
@ -91,60 +88,26 @@ KeyboardViewStep::isAtEnd() const
QList< Calamares::job_ptr >
KeyboardViewStep::jobs() const
{
return m_jobs;
return m_config->createJobs();
}
void
KeyboardViewStep::onActivate()
{
m_widget->onActivate();
m_config->onActivate();
}
void
KeyboardViewStep::onLeave()
{
m_widget->finalize();
m_jobs = m_widget->createJobs( m_xOrgConfFileName, m_convertedKeymapPath, m_writeEtcDefaultKeyboard );
m_prettyStatus = m_widget->prettyStatus();
m_config->finalize();
}
void
KeyboardViewStep::setConfigurationMap( const QVariantMap& configurationMap )
{
using namespace CalamaresUtils;
if ( configurationMap.contains( "xOrgConfFileName" )
&& configurationMap.value( "xOrgConfFileName" ).type() == QVariant::String
&& !getString( configurationMap, "xOrgConfFileName" ).isEmpty() )
{
m_xOrgConfFileName = getString( configurationMap, "xOrgConfFileName" );
}
else
{
m_xOrgConfFileName = "00-keyboard.conf";
}
if ( configurationMap.contains( "convertedKeymapPath" )
&& configurationMap.value( "convertedKeymapPath" ).type() == QVariant::String
&& !getString( configurationMap, "convertedKeymapPath" ).isEmpty() )
{
m_convertedKeymapPath = getString( configurationMap, "convertedKeymapPath" );
}
else
{
m_convertedKeymapPath = QString();
}
if ( configurationMap.contains( "writeEtcDefaultKeyboard" )
&& configurationMap.value( "writeEtcDefaultKeyboard" ).type() == QVariant::Bool )
{
m_writeEtcDefaultKeyboard = getBool( configurationMap, "writeEtcDefaultKeyboard", true );
}
else
{
m_writeEtcDefaultKeyboard = true;
}
m_config->setConfigurationMap( configurationMap );
}

View File

@ -17,6 +17,7 @@
#include <QObject>
class Config;
class KeyboardPage;
class PLUGINDLLEXPORT KeyboardViewStep : public Calamares::ViewStep
@ -46,15 +47,8 @@ public:
void setConfigurationMap( const QVariantMap& configurationMap ) override;
private:
Config* m_config;
KeyboardPage* m_widget;
bool m_nextEnabled;
QString m_prettyStatus;
QString m_xOrgConfFileName;
QString m_convertedKeymapPath;
bool m_writeEtcDefaultKeyboard;
Calamares::JobList m_jobs;
};
CALAMARES_PLUGIN_FACTORY_DECLARATION( KeyboardViewStepFactory )

View File

@ -33,6 +33,7 @@
SetKeyboardLayoutJob::SetKeyboardLayoutJob( const QString& model,
const QString& layout,
const QString& variant,
const AdditionalLayoutInfo& additionalLayoutInfo,
const QString& xOrgConfFileName,
const QString& convertedKeymapPath,
bool writeEtcDefaultKeyboard )
@ -40,6 +41,7 @@ SetKeyboardLayoutJob::SetKeyboardLayoutJob( const QString& model,
, m_model( model )
, m_layout( layout )
, m_variant( variant )
, m_additionalLayoutInfo( additionalLayoutInfo )
, m_xOrgConfFileName( xOrgConfFileName )
, m_convertedKeymapPath( convertedKeymapPath )
, m_writeEtcDefaultKeyboard( writeEtcDefaultKeyboard )
@ -250,19 +252,34 @@ SetKeyboardLayoutJob::writeX11Data( const QString& keyboardConfPath ) const
" Identifier \"system-keyboard\"\n"
" MatchIsKeyboard \"on\"\n";
if ( !m_layout.isEmpty() )
{
stream << " Option \"XkbLayout\" \"" << m_layout << "\"\n";
}
if ( !m_model.isEmpty() )
if ( m_additionalLayoutInfo.additionalLayout.isEmpty() )
{
stream << " Option \"XkbModel\" \"" << m_model << "\"\n";
}
if ( !m_layout.isEmpty() )
{
stream << " Option \"XkbLayout\" \"" << m_layout << "\"\n";
}
if ( !m_variant.isEmpty() )
if ( !m_variant.isEmpty() )
{
stream << " Option \"XkbVariant\" \"" << m_variant << "\"\n";
}
}
else
{
stream << " Option \"XkbVariant\" \"" << m_variant << "\"\n";
if ( !m_layout.isEmpty() )
{
stream << " Option \"XkbLayout\" \"" << m_additionalLayoutInfo.additionalLayout << "," << m_layout
<< "\"\n";
}
if ( !m_variant.isEmpty() )
{
stream << " Option \"XkbVariant\" \"" << m_additionalLayoutInfo.additionalVariant << "," << m_variant
<< "\"\n";
}
stream << " Option \"XkbOptions\" \"" << m_additionalLayoutInfo.groupSwitcher << "\"\n";
}
stream << "EndSection\n";

View File

@ -11,6 +11,7 @@
#ifndef SETKEYBOARDLAYOUTJOB_H
#define SETKEYBOARDLAYOUTJOB_H
#include "AdditionalLayoutInfo.h"
#include "Job.h"
@ -21,6 +22,7 @@ public:
SetKeyboardLayoutJob( const QString& model,
const QString& layout,
const QString& variant,
const AdditionalLayoutInfo& additionaLayoutInfo,
const QString& xOrgConfFileName,
const QString& convertedKeymapPath,
bool writeEtcDefaultKeyboard );
@ -38,6 +40,7 @@ private:
QString m_model;
QString m_layout;
QString m_variant;
AdditionalLayoutInfo m_additionalLayoutInfo;
QString m_xOrgConfFileName;
QString m_convertedKeymapPath;
const bool m_writeEtcDefaultKeyboard;

View File

@ -2,5 +2,6 @@
<qresource prefix="/">
<file>kbd-model-map</file>
<file>images/restore.png</file>
<file>non-ascii-layouts</file>
</qresource>
</RCC>

View File

@ -75,7 +75,7 @@ parseKeyboardModels( const char* filepath )
break;
}
// here we are in the model section, otherwhise we would continue or break
// here we are in the model section, otherwise we would continue or break
QRegExp rx;
rx.setPattern( "^\\s+(\\S+)\\s+(\\w.*)\n$" );

View File

@ -0,0 +1,4 @@
# Layouts stored here need additional layout (usually us) to provide ASCII support for user
#layout additional-layout additional-variant vconsole-keymap
ru us - ruwin_alt_sh-UTF-8

View File

@ -2,6 +2,7 @@
*
* SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac <teo@kde.org>
* SPDX-FileCopyrightText: 2020 Camilo Higuita <milo.h@aol.com>
* SPDX-FileCopyrightText: 2020 Anke Boersma <demm@kaosx.us>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Calamares is Free Software: see the License-Identifier above.
@ -10,21 +11,19 @@
#include "KeyboardQmlViewStep.h"
#include "Config.h"
#include "GlobalStorage.h"
#include "JobQueue.h"
#include "utils/Variant.h"
CALAMARES_PLUGIN_FACTORY_DEFINITION( KeyboardQmlViewStepFactory, registerPlugin< KeyboardQmlViewStep >(); )
KeyboardQmlViewStep::KeyboardQmlViewStep( QObject* parent )
: Calamares::QmlViewStep( parent )
, m_config( new Config( this ) )
, m_nextEnabled( false )
, m_writeEtcDefaultKeyboard( true )
{
m_config->init();
m_nextEnabled = true;
emit nextStatusChanged( m_nextEnabled );
m_config->detectCurrentKeyboardLayout();
emit nextStatusChanged( true );
}
QString
@ -36,13 +35,13 @@ KeyboardQmlViewStep::prettyName() const
QString
KeyboardQmlViewStep::prettyStatus() const
{
return m_prettyStatus;
return m_config->prettyStatus();
}
bool
KeyboardQmlViewStep::isNextEnabled() const
{
return m_nextEnabled;
return true;
}
bool
@ -66,7 +65,7 @@ KeyboardQmlViewStep::isAtEnd() const
Calamares::JobList
KeyboardQmlViewStep::jobs() const
{
return m_jobs;
return m_config->createJobs();
}
void
@ -79,8 +78,6 @@ void
KeyboardQmlViewStep::onLeave()
{
m_config->finalize();
m_jobs = m_config->createJobs( m_xOrgConfFileName, m_convertedKeymapPath, m_writeEtcDefaultKeyboard );
m_prettyStatus = m_config->prettyStatus();
}
QObject*
@ -92,39 +89,6 @@ KeyboardQmlViewStep::getConfig()
void
KeyboardQmlViewStep::setConfigurationMap( const QVariantMap& configurationMap )
{
using namespace CalamaresUtils;
if ( configurationMap.contains( "xOrgConfFileName" )
&& configurationMap.value( "xOrgConfFileName" ).type() == QVariant::String
&& !getString( configurationMap, "xOrgConfFileName" ).isEmpty() )
{
m_xOrgConfFileName = getString( configurationMap, "xOrgConfFileName" );
}
else
{
m_xOrgConfFileName = "00-keyboard.conf";
}
if ( configurationMap.contains( "convertedKeymapPath" )
&& configurationMap.value( "convertedKeymapPath" ).type() == QVariant::String
&& !getString( configurationMap, "convertedKeymapPath" ).isEmpty() )
{
m_convertedKeymapPath = getString( configurationMap, "convertedKeymapPath" );
}
else
{
m_convertedKeymapPath = QString();
}
if ( configurationMap.contains( "writeEtcDefaultKeyboard" )
&& configurationMap.value( "writeEtcDefaultKeyboard" ).type() == QVariant::Bool )
{
m_writeEtcDefaultKeyboard = getBool( configurationMap, "writeEtcDefaultKeyboard", true );
}
else
{
m_writeEtcDefaultKeyboard = true;
}
m_config->setConfigurationMap( configurationMap );
Calamares::QmlViewStep::setConfigurationMap( configurationMap );
}

View File

@ -13,14 +13,12 @@
#include "Config.h"
#include <DllMacro.h>
#include <utils/PluginFactory.h>
#include <viewpages/QmlViewStep.h>
#include "DllMacro.h"
#include "utils/PluginFactory.h"
#include "viewpages/QmlViewStep.h"
#include <QObject>
class KeyboardPage;
class PLUGINDLLEXPORT KeyboardQmlViewStep : public Calamares::QmlViewStep
{
Q_OBJECT
@ -47,14 +45,6 @@ public:
private:
Config* m_config;
bool m_nextEnabled;
QString m_prettyStatus;
QString m_xOrgConfFileName;
QString m_convertedKeymapPath;
bool m_writeEtcDefaultKeyboard;
Calamares::JobList m_jobs;
};
CALAMARES_PLUGIN_FACTORY_DECLARATION( KeyboardQmlViewStepFactory )

View File

@ -3,5 +3,6 @@
<file alias="kbd-model-map">../keyboard/kbd-model-map</file>
<file alias="images/restore.png">../keyboard/images/restore.png</file>
<file>keyboardq.qml</file>
<file alias="non-ascii-layouts">../keyboard/non-ascii-layouts</file>
</qresource>
</RCC>

View File

@ -13,6 +13,7 @@
#include "LicenseWidget.h"
#include "utils/Logger.h"
#include "utils/QtCompat.h"
#include <QDesktopServices>
#include <QFile>
@ -48,7 +49,7 @@ LicenseWidget::LicenseWidget( LicenseEntry entry, QWidget* parent )
, m_isExpanded( m_entry.expandByDefault() )
{
QPalette pal( palette() );
pal.setColor( QPalette::Background, palette().window().color().lighter( 108 ) );
pal.setColor( WindowBackground, palette().window().color().lighter( 108 ) );
setObjectName( "licenseItem" );

View File

@ -153,18 +153,13 @@ MachineIdJob::setConfigurationMap( const QVariantMap& map )
m_dbus_symlink = m_dbus && m_dbus_symlink;
m_entropy_copy = CalamaresUtils::getBool( map, "entropy-copy", false );
m_entropy_files = CalamaresUtils::getStringList( map, "entropy-files" );
if ( CalamaresUtils::getBool( map, "entropy", false ) )
{
cWarning() << "MachineId:: configuration setting *entropy* is deprecated, use *entropy-files*.";
QString target_entropy_file = QStringLiteral( "/var/lib/urandom/random-seed" );
if ( !m_entropy_files.contains( target_entropy_file ) )
{
m_entropy_files.append( target_entropy_file );
}
cWarning() << "MachineId:: configuration setting *entropy* is deprecated, use *entropy-files* instead.";
m_entropy_files.append( QStringLiteral( "/var/lib/urandom/random-seed" ) );
}
m_entropy_files.removeDuplicates();
}
CALAMARES_PLUGIN_FACTORY_DEFINITION( MachineIdJobFactory, registerPlugin< MachineIdJob >(); )

View File

@ -11,21 +11,39 @@
#
---
# Whether to create /etc/machine-id for systemd.
# The default is *false*.
systemd: true
# Whether to create /var/lib/dbus/machine-id for D-Bus.
# The default is *false*.
dbus: true
# Whether /var/lib/dbus/machine-id should be a symlink to /etc/machine-id
# (ignored if dbus is false, or if there is no /etc/machine-id to point to).
# The default is *false*.
dbus-symlink: true
# Whether to create an entropy file /var/lib/urandom/random-seed
#
# DEPRECATED: list the file in entropy-files instead
entropy: false
# Whether to copy entropy from the host
# Copy entropy from the host? If this is set to *true*, then
# any entropy file listed below will be copied from the host
# if it exists. Non-existent files will be generated from
# /dev/urandom . The default is *false*.
entropy-copy: false
# Which files to write (paths in the target)
# Which files to write (paths in the target). Each of these files is
# either generated from /dev/urandom or copied from the host, depending
# on the setting for *entropy-copy*, above.
entropy-files:
- /var/lib/urandom/random-seed
- /var/lib/systemd/random-seed
# Whether to create an entropy file /var/lib/urandom/random-seed
#
# DEPRECATED: list the file in entropy-files instead. If this key
# exists and is set to *true*, a warning is printed and Calamares
# behaves as if `/var/lib/urandom/random-seed` is listed in *entropy-files*.
#
# entropy: false
# Whether to create a symlink for D-Bus
#
# DEPRECATED: set *dbus-symlink* with the same meaning instead.
#
# symlink: false

View File

@ -6,11 +6,11 @@ $id: https://calamares.io/schemas/machineid
additionalProperties: false
type: object
properties:
systemd: { type: boolean, default: true }
dbus: { type: boolean, default: true }
"dbus-symlink": { type: boolean, default: true }
systemd: { type: boolean, default: false }
dbus: { type: boolean, default: false }
"dbus-symlink": { type: boolean, default: false }
"entropy-copy": { type: boolean, default: false }
"entropy-files": { type: array, items: { type: string } }
# Deprecated properties
symlink: { type: boolean, default: true }
symlink: { type: boolean, default: false }
entropy: { type: boolean, default: false }

View File

@ -43,7 +43,7 @@ Config::status() const
case Status::FailedNetworkError:
return tr( "Network Installation. (Disabled: Unable to fetch package lists, check your network connection)" );
}
NOTREACHED return QString();
__builtin_unreachable();
}

View File

@ -47,7 +47,7 @@ NetInstallViewStep::prettyName() const
return m_sidebarLabel ? m_sidebarLabel->get() : tr( "Package selection" );
#if defined( TABLE_OF_TRANSLATIONS )
NOTREACHED
__builtin_unreachable();
// This is a table of "standard" labels for this module. If you use them
// in the label: sidebar: section of the config file, the existing
// translations can be used.

View File

@ -33,12 +33,12 @@ PackageChooserPage::PackageChooserPage( PackageChooserMode mode, QWidget* parent
switch ( mode )
{
case PackageChooserMode::Optional:
FALLTHRU;
[[fallthrough]];
case PackageChooserMode::Required:
ui->products->setSelectionMode( QAbstractItemView::SingleSelection );
break;
case PackageChooserMode::OptionalMultiple:
FALLTHRU;
[[fallthrough]];
case PackageChooserMode::RequiredMultiple:
ui->products->setSelectionMode( QAbstractItemView::ExtendedSelection );
}

View File

@ -110,8 +110,7 @@ PackageChooserViewStep::isNextEnabled() const
// exactly one OR one or more
return m_widget->hasSelection();
}
NOTREACHED return true;
__builtin_unreachable();
}

View File

@ -28,7 +28,7 @@ class Config : public QObject
public:
Config( QObject* parent );
virtual ~Config() = default;
~Config() override = default;
enum InstallChoice
{

View File

@ -59,7 +59,7 @@ convenienceName( const Partition* const candidate )
QString p;
QTextStream s( &p );
s << (void*)candidate;
s << static_cast<const void*>(candidate); // No good name available, use pointer address
return p;
}

View File

@ -110,7 +110,7 @@ updatePreview( Job* job, const std::true_type& )
template < typename Job >
void
updatePreview( Job* job, const std::false_type& )
updatePreview( Job*, const std::false_type& )
{
}
@ -483,7 +483,6 @@ PartitionCoreModule::deletePartition( Device* device, Partition* partition )
}
}
const Calamares::JobList& jobs = deviceInfo->jobs();
if ( partition->state() == KPM_PARTITION_STATE( New ) )
{
// Take all the SetPartFlagsJob from the list and delete them

View File

@ -85,7 +85,7 @@ public:
};
PartitionCoreModule( QObject* parent = nullptr );
~PartitionCoreModule();
~PartitionCoreModule() override;
/**
* @brief init performs a devices scan and initializes all KPMcore data

View File

@ -44,13 +44,13 @@ getDefaultFileSystemType()
}
PartitionLayout::PartitionLayout()
: m_defaultFsType( getDefaultFileSystemType() )
{
m_defaultFsType = getDefaultFileSystemType();
}
PartitionLayout::PartitionLayout( PartitionLayout::PartitionEntry entry )
: PartitionLayout()
{
m_defaultFsType = getDefaultFileSystemType();
m_partLayout.append( entry );
}
@ -82,10 +82,10 @@ PartitionLayout::PartitionEntry::PartitionEntry()
}
PartitionLayout::PartitionEntry::PartitionEntry( const QString& size, const QString& min, const QString& max )
: partSize( size )
: partAttributes( 0 )
, partSize( size )
, partMinSize( min )
, partMaxSize( max )
, partAttributes( 0 )
{
}
@ -172,32 +172,30 @@ PartitionLayout::execute( Device* dev,
// Let's check if we have enough space for each partSize
for ( const auto& part : qAsConst( m_partLayout ) )
{
qint64 size;
// Calculate partition size
if ( part.partSize.isValid() )
if ( !part.partSize.isValid() )
{
// We need to ignore the percent-defined
if ( part.partSize.unit() != CalamaresUtils::Partition::SizeUnit::Percent )
{
size = part.partSize.toSectors( totalSize, dev->logicalSize() );
}
else
{
if ( part.partMinSize.isValid() )
{
size = part.partMinSize.toSectors( totalSize, dev->logicalSize() );
}
else
{
size = 0;
}
}
cWarning() << "Partition" << part.partMountPoint << "size is invalid, skipping...";
continue;
}
// Calculate partition size: Rely on "possibly uninitialized use"
// warnings to ensure that all the cases are covered below.
qint64 size;
// We need to ignore the percent-defined until later
if ( part.partSize.unit() != CalamaresUtils::Partition::SizeUnit::Percent )
{
size = part.partSize.toSectors( totalSize, dev->logicalSize() );
}
else
{
cWarning() << "Partition" << part.partMountPoint << "size (" << size << "sectors) is invalid, skipping...";
continue;
if ( part.partMinSize.isValid() )
{
size = part.partMinSize.toSectors( totalSize, dev->logicalSize() );
}
else
{
size = 0;
}
}
partSizeMap.insert( &part, size );

View File

@ -12,6 +12,7 @@
#include "core/PartUtils.h"
#include "utils/CalamaresUtilsGui.h"
#include "utils/QtCompat.h"
#include "utils/Retranslator.h"
#include <QDir>
@ -45,7 +46,7 @@ BootInfoWidget::BootInfoWidget( QWidget* parent )
m_bootLabel->setAlignment( Qt::AlignCenter );
QPalette palette;
palette.setBrush( QPalette::Foreground, QColor( "#4D4D4D" ) ); //dark grey
palette.setBrush( WindowText, QColor( "#4D4D4D" ) ); //dark grey
m_bootIcon->setAutoFillBackground( true );
m_bootLabel->setAutoFillBackground( true );

View File

@ -845,10 +845,11 @@ ChoicePage::doReplaceSelectedPartition( const QModelIndex& current )
/**
* @brief ChoicePage::updateDeviceStatePreview clears and rebuilds the contents of the
* preview widget for the current on-disk state. This also triggers a rescan in the
* PCM to get a Device* copy that's unaffected by subsequent PCM changes.
* @param currentDevice a pointer to the selected Device.
* @brief clear and then rebuild the contents of the preview widget
*
* The preview widget for the current disk is completely re-constructed
* based on the on-disk state. This also triggers a rescan in the
* PCM to get a Device* copy that's unaffected by subsequent PCM changes.
*/
void
ChoicePage::updateDeviceStatePreview()
@ -916,10 +917,10 @@ ChoicePage::updateDeviceStatePreview()
/**
* @brief ChoicePage::updateActionChoicePreview clears and rebuilds the contents of the
* preview widget for the current PCM-proposed state. No rescans here, this should
* be immediate.
* @param currentDevice a pointer to the selected Device.
* @brief rebuild the contents of the preview for the PCM-proposed state.
*
* No rescans here, this should be immediate.
*
* @param choice the chosen partitioning action.
*/
void
@ -1464,7 +1465,7 @@ ChoicePage::setupActions()
}
if ( m_somethingElseButton->isHidden() && m_alongsideButton->isHidden() && m_replaceButton->isHidden()
&& m_somethingElseButton->isHidden() )
&& m_eraseButton->isHidden() )
{
if ( atLeastOneIsMounted )
{

View File

@ -54,7 +54,7 @@ class ChoicePage : public QWidget, private Ui::ChoicePage
Q_OBJECT
public:
explicit ChoicePage( Config* config, QWidget* parent = nullptr );
virtual ~ChoicePage();
~ChoicePage() override;
/**
* @brief init runs when the PartitionViewStep and the PartitionCoreModule are

View File

@ -45,7 +45,7 @@ public:
Partition* partition,
const QStringList& usedMountPoints,
QWidget* parentWidget = nullptr );
~CreatePartitionDialog();
~CreatePartitionDialog() override;
/**
* Must be called when user wants to create a partition in

View File

@ -7,13 +7,13 @@
*
*/
#include "DeviceInfoWidget.h"
#include "GlobalStorage.h"
#include "JobQueue.h"
#include "utils/CalamaresUtilsGui.h"
#include "utils/Logger.h"
#include "utils/QtCompat.h"
#include "utils/Retranslator.h"
#include <QDir>
@ -47,7 +47,7 @@ DeviceInfoWidget::DeviceInfoWidget( QWidget* parent )
m_ptLabel->setAlignment( Qt::AlignCenter );
QPalette palette;
palette.setBrush( QPalette::Foreground, QColor( "#4D4D4D" ) ); //dark grey
palette.setBrush( WindowText, QColor( "#4D4D4D" ) ); //dark grey
m_ptIcon->setAutoFillBackground( true );
m_ptLabel->setAutoFillBackground( true );

View File

@ -36,7 +36,7 @@ public:
Partition* partition,
const QStringList& usedMountPoints,
QWidget* parentWidget = nullptr );
~EditExistingPartitionDialog();
~EditExistingPartitionDialog() override;
void applyChanges( PartitionCoreModule* module );

View File

@ -34,7 +34,7 @@ class PartitionPage : public QWidget
Q_OBJECT
public:
explicit PartitionPage( PartitionCoreModule* core, QWidget* parent = nullptr );
~PartitionPage();
~PartitionPage() override;
void onRevertClicked();

View File

@ -34,6 +34,7 @@
#include "utils/CalamaresUtilsGui.h"
#include "utils/Logger.h"
#include "utils/NamedEnum.h"
#include "utils/QtCompat.h"
#include "utils/Retranslator.h"
#include "utils/Variant.h"
#include "widgets/WaitingWidget.h"
@ -273,7 +274,7 @@ PartitionViewStep::createSummaryWidget() const
jobsLabel->setText( jobsLines.join( "<br/>" ) );
jobsLabel->setMargin( CalamaresUtils::defaultFontHeight() / 2 );
QPalette pal;
pal.setColor( QPalette::Background, pal.window().color().lighter( 108 ) );
pal.setColor( WindowBackground, pal.window().color().lighter( 108 ) );
jobsLabel->setAutoFillBackground( true );
jobsLabel->setPalette( pal );
}

View File

@ -27,7 +27,7 @@ class ReplaceWidget : public QWidget
Q_OBJECT
public:
explicit ReplaceWidget( PartitionCoreModule* core, QComboBox* devicesComboBox, QWidget* parent = nullptr );
virtual ~ReplaceWidget();
virtual ~ReplaceWidget() override;
bool isNextEnabled() const;

View File

@ -30,7 +30,7 @@ class VolumeGroupBaseDialog : public QDialog
public:
explicit VolumeGroupBaseDialog( QString& vgName, QVector< const Partition* > pvList, QWidget* parent = nullptr );
~VolumeGroupBaseDialog();
~VolumeGroupBaseDialog() override;
protected:
virtual void updateOkButton();

View File

@ -28,7 +28,7 @@ class SmartStatus;
QTEST_GUILESS_MAIN( CreateLayoutsTests )
CalamaresUtils::Partition::KPMManager* kpmcore = nullptr;
static CalamaresUtils::Partition::KPMManager* kpmcore = nullptr;
using CalamaresUtils::operator""_MiB;
using CalamaresUtils::operator""_GiB;
@ -156,3 +156,7 @@ TestDevice::TestDevice( const QString& name, const qint64 logicalSectorSize, con
{
}
#endif
TestDevice::~TestDevice()
{
}

View File

@ -18,6 +18,7 @@ class CreateLayoutsTests : public QObject
Q_OBJECT
public:
CreateLayoutsTests();
~CreateLayoutsTests() override = default;
private Q_SLOTS:
void testFixedSizePartition();
@ -31,6 +32,7 @@ class TestDevice : public Device
{
public:
TestDevice( const QString& name, const qint64 logicalSectorSize, const qint64 totalLogicalSectors );
~TestDevice() override;
};
#endif

View File

@ -157,7 +157,7 @@ QueueRunner::onFailed( const QString& message, const QString& details )
QFAIL( qPrintable( msg ) );
}
CalamaresUtils::Partition::KPMManager* kpmcore = nullptr;
static CalamaresUtils::Partition::KPMManager* kpmcore = nullptr;
//- PartitionJobTests ------------------------------------------------------------------
PartitionJobTests::PartitionJobTests()

View File

@ -19,6 +19,7 @@
#include "utils/CalamaresUtilsGui.h"
#include "utils/Logger.h"
#include "utils/QtCompat.h"
#include "utils/Retranslator.h"
#include "viewpages/ExecutionViewStep.h"
@ -183,7 +184,7 @@ SummaryPage::createBodyLabel( const QString& text ) const
QLabel* label = new QLabel;
label->setMargin( CalamaresUtils::defaultFontHeight() / 2 );
QPalette pal( palette() );
pal.setColor( QPalette::Background, palette().window().color().lighter( 108 ) );
pal.setColor( WindowBackground, palette().window().color().lighter( 108 ) );
label->setAutoFillBackground( true );
label->setPalette( pal );
label->setText( text );

View File

@ -182,10 +182,10 @@ enableLevelsBelow( Config* config, TrackingType level )
{
case TrackingType::UserTracking:
config->userTracking()->setTracking( TrackingStyleConfig::TrackingState::EnabledByUser );
FALLTHRU;
[[fallthrough]];
case TrackingType::MachineTracking:
config->machineTracking()->setTracking( TrackingStyleConfig::TrackingState::EnabledByUser );
FALLTHRU;
[[fallthrough]];
case TrackingType::InstallTracking:
config->installTracking()->setTracking( TrackingStyleConfig::TrackingState::EnabledByUser );
break;

View File

@ -17,4 +17,5 @@ properties:
destination: { type: string }
excludeFile: { type: string }
exclude: { type: array, items: { type: string } }
weight: { type: integer, exclusiveMinimum: 0 }
required: [ source , sourcefs, destination ]

View File

@ -85,7 +85,7 @@ calamares_add_test(
${JOB_SRC}
${CONFIG_SRC}
LIBRARIES
${USER_EXTRA_LIB}
Qt5::DBus # HostName job can use DBus to systemd
${CRYPT_LIBRARIES} # SetPassword job uses crypt()
${USER_EXTRA_LIB}
)