Merge branch 'calamares' of https://github.com/calamares/calamares into development
This commit is contained in:
commit
c64f7821ef
@ -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
15
CHANGES
@ -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) #
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -201,6 +201,10 @@ Name[uk]=Встановити Систему
|
||||
Icon[uk]=calamares
|
||||
GenericName[uk]=Встановлювач системи
|
||||
Comment[uk]=Calamares - Встановлювач системи
|
||||
Name[vi]=Cài đặt hệ thống
|
||||
Icon[vi]=calamares
|
||||
GenericName[vi]=Bộ cài đặt hệ thống
|
||||
Comment[vi]=Calamares — Bộ cài đặt hệ thống
|
||||
Name[zh_CN]=安装系统
|
||||
Icon[zh_CN]=calamares
|
||||
GenericName[zh_CN]=系统安装程序
|
||||
|
@ -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
|
||||
|
@ -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><strong>Manual partitioning</strong><br/>You can create or resize partitions yourself.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><strong>Уласнаручная разметка</strong><br/>Вы можаце самастойна ствараць раздзелы або змяняць іх памеры.</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 <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>На гэтай прыладзе ўжо ўсталяваная аперацыйная сістэма, але табліца раздзелаў <strong>%1</strong> не такая, як патрэбна <strong>%2</strong>.<br/></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
|
||||
<source>This storage device has one of its partitions <strong>mounted</strong>.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Адзін з раздзелаў гэтай назапашвальнай прылады<strong>прымантаваны</strong>.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
|
||||
<source>This storage device is a part of an <strong>inactive RAID</strong> device.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Гэтая назапашвальная прылада ёсць часткай<strong>неактыўнага RAID</strong>.</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><h1>Welcome to the Calamares setup program for %1</h1></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><h1>Вітаем у праграме ўсталёўкі Calamares для %1</h1></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/welcome/Config.cpp" line="245"/>
|
||||
<source><h1>Welcome to %1 setup</h1></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><h1>Вітаем у праграме ўсталёўкі %1</h1></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/welcome/Config.cpp" line="250"/>
|
||||
<source><h1>Welcome to the Calamares installer for %1</h1></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><h1>Вітаем у праграме ўсталёўкі Calamares для %1</h1></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/welcome/Config.cpp" line="251"/>
|
||||
<source><h1>Welcome to the %1 installer</h1></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><h1>Вітаем у праграме ўсталёўкі %1</h1></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><html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html></source>
|
||||
<translation><html><head/><body><p>Увядзіце сюды масавы ідэнтыфікатар. Ён захавецца ў мэтавай сістэме.</p></body></html></translation>
|
||||
<translation><html><head/><body><p>Увядзіце сюды масавы ідэнтыфікатар. Ён захаваецца ў мэтавай сістэме.</p></body></html></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.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>%3</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Для таго, каб пачаць %1, патрабуецца сістэмны раздзел EFI.<br/><br/> Каб наладзіць сістэмны раздзел EFI, вярніцеся назад, абярыце альбо стварыце файлавую сістэму FAT32 са сцягам <strong>%3</strong> і пунктам мантавання <strong>%2</strong>.<br/><br/>Вы можаце працягнуць і без наладкі сістэмнага раздзела EFI, але ваша сістэма можа не загрузіцца.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="441"/>
|
||||
<source>An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>%3</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Для таго, каб пачаць %1, патрабуецца сістэмны раздзел EFI.<br/><br/>Быў наладжаны раздзел з пунктам мантавання<strong>%2</strong> але яго сцяг <strong>%3</strong> не вызначаны.<br/>Каб вызначыць сцяг, вярніцеся назад і адрэдагуйце раздзел.<br/><br/> Вы можаце працягнуць без наладкі раздзела, але ваша сістэма можа не загрузіцца.</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><p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/>
|
||||
Setup can continue, but some features might be disabled.</p></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><p>Гэты камп’ютар адпавядае не ўсім патрэбам для ўсталёўкі %1.<br/>
|
||||
Можна працягнуць усталёўку, але некаторыя магчымасці могуць быць недаступнымі.</p></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -3014,13 +3017,15 @@ Output:
|
||||
<location filename="../src/modules/welcomeq/Requirements.qml" line="38"/>
|
||||
<source><p>This computer does not satisfy the minimum requirements for installing %1.<br/>
|
||||
Installation cannot continue.</p></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><p>Гэты камп’ютар не адпавядае мінімальным патрэбам для ўсталёўкі %1.<p>
|
||||
Немагчыма працягнуць. <br/></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/welcomeq/Requirements.qml" line="40"/>
|
||||
<source><p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/>
|
||||
Setup can continue, but some features might be disabled.</p></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><p>Гэты камп’ютар адпавядае не ўсім патрэбам для ўсталёўкі %1.<br/>
|
||||
Можна працягнуць усталёўку, але некаторыя магчымасці могуць быць недаступнымі.</p></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><html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><html><head/><body><p>Пстрыкніце сюды, каб не адпраўляць <span style=" font-weight:600;">ніякіх звестак</span> пра вашу ўсталёўку.</p></body></html></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 <b>once</b> after the installation finishes.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Абраўшы гэты пункт вы адправіце звесткі пра сваю канфігурацыю ўсталёўкі і ваша абсталяванне. Звесткі адправяцца <b>адзін раз</b> пасля завяршэння ўсталёўкі.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/tracking/TrackingPage.cpp" line="94"/>
|
||||
<source>By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Абраўшы гэты пункт вы будзеце перыядычна адпраўляць звесткі пра усталёўку, абсталяванне і праграмы вашага <b>камп'ютара</b> на %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/tracking/TrackingPage.cpp" line="98"/>
|
||||
<source>By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Абраўшы гэты пункт вы будзеце перыядычна адпраўляць звесткі пра усталёўку, абсталяванне, праграмы <b>карыстальніка</b> і вобласці іх выкарыстання на %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><h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Аўтарскія правы 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Аўтарскія правы 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Шчырыя падзякі <a href="https://calamares.io/team/">камандзе распрацоўкі Calamares</a> і <a href="https://www.transifex.com/calamares/calamares/">камандзе перакладчыкаў Calamares</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> распрацоўваецца пры падтрымцы<br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -3818,7 +3823,17 @@ Output:
|
||||
development is sponsored by <br/>
|
||||
<a href='http://www.blue-systems.com/'>Blue Systems</a> -
|
||||
Liberating Software.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><h1>%1</h1><br/>
|
||||
<strong>%2<br/>
|
||||
for %3</strong><br/><br/>
|
||||
Аўтарскія правы 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>
|
||||
Аўтарскія правы 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/>
|
||||
Шчырыя падзякі <a href='https://calamares.io/team/'>камандзе распрацоўкі Calamares </a>
|
||||
і <a href='https://www.transifex.com/calamares/calamares/'> перакладчыкам Calamares</a>.<br/><br/>
|
||||
<a href='https://calamares.io/'>Calamares</a>
|
||||
распрацоўваецца пры падтрымцы <br/>
|
||||
<a href='http://www.blue-systems.com/'>Blue Systems</a> -
|
||||
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><h1>Languages</h1> </br>
|
||||
The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><h1>Мовы</h1></br>
|
||||
Сістэмныя рэгіянальныя налады вызначаюць мову і кадаванне для пэўных элементаў інтэрфейсу загаднага радка. Бягучыя налады <strong>%1</strong>.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/localeq/i18n.qml" line="106"/>
|
||||
<source><h1>Locales</h1> </br>
|
||||
The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><h1>Рэгіянальныя налады</h1></br>
|
||||
Сістэмныя рэгіянальныя налады вызначаюць фармат нумароў і датаў. Бягучыя налады <strong>%1</strong>.</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:
|
||||
</ul>
|
||||
|
||||
<p>The vertical scrollbar is adjustable, current width set to 10.</p></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><h3>%1</h3>
|
||||
<p>Гэта прыклад файла QML, у якім паказваюцца параметры RichText са зменным змесцівам.</p>
|
||||
|
||||
<p>QML з RichText можа выкарыстоўваць пазнакі HTML. Зменнае змесціва карысна для сэнсарных экранаў.</p>
|
||||
|
||||
<p><b>Гэта паўтлусты тэкст</b></p>
|
||||
<p><i>Гэта тэкст курсівам</i></p>
|
||||
<p><u>Гэта падкрэслены</u></p>
|
||||
<p><center>Гэта выраўнаваны па цэнтры тэкст.</center><s>
|
||||
<p><s>Гэта закрэслены тэкст</s></p>
|
||||
|
||||
<p>Прыклад кода:
|
||||
<code>ls -l /
|
||||
/home</code></p>
|
||||
|
||||
<p><b>Спісы:</b></p>
|
||||
<ul>
|
||||
<li>Сістэмы з Intel CPU</li>
|
||||
<li>Сістэмы з AMD CPU</li>
|
||||
</ul>
|
||||
|
||||
<p>Вертыкальная паласа пракруткі наладжваецца. Бягучая шырыня - 10.</p></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><h3>Welcome to the %1 <quote>%2</quote> installer</h3>
|
||||
<p>This program will ask you some questions and set up %1 on your computer.</p></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><h3>Вітаем у %1, праграме ўсталёўкі<quote>%2</quote> </h3>
|
||||
<p>Гэтая праграма дапаможа вам усталяваць %1 на ваш камп'ютар.</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/welcomeq/welcomeq.qml" line="66"/>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="61"/>
|
||||
<source>The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode.</source>
|
||||
<translation><strong>Среда за начално зареждане</strong> на тази система.<br><br>Старите x86 системи поддържат само <strong>BIOS</strong>.<br>Модерните системи обикновено използват <strong>EFI</strong>, но може също така да използват BIOS, ако са стартирани в режим на съвместимост.</translation>
|
||||
<translation><strong>Средата за начално зареждане</strong> на тази система.<br><br>Старите x86 системи поддържат само <strong>BIOS</strong>.<br>Модерните системи обикновено използват <strong>EFI</strong>, но може също така да използват 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><h1>Welcome to the Calamares installer for %1.</h1></source>
|
||||
<translation><h1>Добре дошли при инсталатора Calamares на %1.</h1></translation>
|
||||
<translation><h1>Добре дошли в инсталатора Calamares за %1.</h1></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/welcome/WelcomePage.cpp" line="223"/>
|
||||
<source><h1>Welcome to the %1 installer.</h1></source>
|
||||
<translation><h1>Добре дошли при инсталатора на %1.</h1></translation>
|
||||
<translation><h1>Добре дошли в инсталатора на %1.</h1></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/welcome/WelcomePage.cpp" line="228"/>
|
||||
|
@ -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 <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Aquest dispositiu d'emmagatzematge ja té un sistema operatiu, però la taula de particions <strong>%1</strong> és diferent de la necessària: <strong>%2</strong>.<br/> </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
|
||||
|
@ -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 <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Na tomto úložném zařízení se už nachází operační systém, ale tabulka rozdělení <strong>%1</strong> je jiná než potřebná <strong>%2</strong>.<br/></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
|
||||
|
@ -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 <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lagerenheden har allerede et styresystem på den men partitionstabellen <strong>%1</strong> er ikke magen til den nødvendige <strong>%2</strong>.<br/></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
|
||||
<source>This storage device has one of its partitions <strong>mounted</strong>.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lagerenhden har en af sine partitioner <strong>monteret</strong>.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
|
||||
<source>This storage device is a part of an <strong>inactive RAID</strong> device.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lagringsenheden er en del af en <strong>inaktiv RAID</strong>-enhed.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>
|
||||
|
@ -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 <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tässä kiintolevyssä on jo käyttöjärjestelmä, mutta osiotaulukko <strong>%1</strong> on erilainen kuin tarvittava <strong>%2</strong>.<br/></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
|
||||
<source>This storage device has one of its partitions <strong>mounted</strong>.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tähän kiintolevyyn on <strong>asennettu</strong> yksi osioista.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
|
||||
<source>This storage device is a part of an <strong>inactive RAID</strong> device.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tämä kiintolevy on osa <strong>passiivista RAID</strong> -laitetta.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -11,12 +11,12 @@
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="71"/>
|
||||
<source>This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own.</source>
|
||||
<translation>מערכת זו הופעלה בתצורת אתחול <strong>EFI</strong>.<br><br> כדי להגדיר הפעלה מתצורת אתחול EFI, על אשף ההתקנה להתקין מנהל אתחול מערכת, לדוגמה <strong>GRUB</strong> או <strong>systemd-boot</strong> על <strong>מחיצת מערכת EFI</strong>. פעולה זו היא אוטומטית, אלא אם כן העדפתך היא להגדיר מחיצות באופן ידני, במקרה זה עליך לבחור זאת או להגדיר בעצמך.</translation>
|
||||
<translation>מערכת זו הופעלה בתצורת אתחול <strong>EFI</strong>.<br><br> כדי להגדיר הפעלה מתצורת אתחול EFI, על תכנית ההתקנה להתקין מנהל אתחול מערכת, לדוגמה <strong>GRUB</strong> או <strong>systemd-boot</strong> על <strong>מחיצת מערכת EFI</strong>. פעולה זו היא אוטומטית, אלא אם כן העדפתך היא להגדיר מחיצות באופן ידני, במקרה זה יש לבחור זאת או להגדיר בעצמך.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="83"/>
|
||||
<source>This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own.</source>
|
||||
<translation>מערכת זו הופעלה בתצורת אתחול <strong>BIOS</strong>.<br><br> כדי להגדיר הפעלה מתצורת אתחול BIOS, על אשף ההתקנה להתקין מנהל אתחול מערכת, לדוגמה <strong>GRUB</strong>, בתחילת המחיצה או על ה־<strong>Master Boot Record</strong> בצמוד להתחלה של טבלת המחיצות (מועדף). פעולה זו היא אוטומטית, אלא אם כן תבחר להגדיר מחיצות באופן ידני, במקרה זה עליך להגדיר זאת בעצמך.</translation>
|
||||
<translation>מערכת זו הופעלה בתצורת אתחול <strong>BIOS</strong>.<br><br> כדי להגדיר הפעלה מתצורת אתחול BIOS, על תכנית ההתקנה להתקין מנהל אתחול מערכת, לדוגמה <strong>GRUB</strong>, בתחילת המחיצה או על ה־<strong>Master Boot Record</strong> בצמוד להתחלה של טבלת המחיצות (מועדף). פעולה זו היא אוטומטית, אלא אם כן תבחר להגדיר מחיצות באופן ידני, במקרה זה יש להגדיר זאת בעצמך.</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.<br/><strong>You will not be able to undo these changes.</strong></source>
|
||||
<translation>אשף ההתקנה של %1 הולך לבצע שינויים בכונן שלך לטובת התקנת %2.<br/><strong>לא תוכל לבטל את השינויים הללו.</strong></translation>
|
||||
<translation>תכנית ההתקנה של %1 עומדת לבצע שינויים בכונן שלך לטובת התקנת %2.<br/><strong>לא תהיה אפשרות לבטל את השינויים הללו.</strong></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><small>Enter the same password twice, so that it can be checked for typing errors.</small></source>
|
||||
<translation><small>עליך להקליד את אותה הססמה פעמיים כדי לאפשר זיהוי של שגיאות הקלדה.</small></translation>
|
||||
<translation><small>יש להקליד את אותה הססמה פעמיים כדי לאפשר זיהוי של שגיאות הקלדה.</small></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.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>%3</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start.</source>
|
||||
<translation>מחיצת מערכת EFI נדרשת כדי להפעיל את %1.<br/><br/> כדי להגדיר מחיצת מערכת EFI, עליך לחזור ולבחור או ליצור מערכת קבצים מסוג FAT32 עם סימון <strong>%3</strong> פעיל ועם נקודת עיגון <strong>%2</strong>.<br/><br/> ניתן להמשיך ללא הגדרת מחיצת מערכת EFI אך טעינת המערכת עשויה להיכשל.</translation>
|
||||
<translation>מחיצת מערכת EFI נדרשת כדי להפעיל את %1.<br/><br/> כדי להגדיר מחיצת מערכת EFI, יש לחזור ולבחור או ליצור מערכת קבצים מסוג FAT32 עם סימון <strong>%3</strong> פעיל ועם נקודת עיגון <strong>%2</strong>.<br/><br/> ניתן להמשיך ללא הגדרת מחיצת מערכת EFI אך טעינת המערכת עשויה להיכשל.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="441"/>
|
||||
<source>An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>%3</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start.</source>
|
||||
<translation>לצורך הפעלת %1 נדרשת מחיצת מערכת EFI.<br/><br/> הוגדרה מחיצה עם נקודת עיגון <strong>%2</strong> אך לא הוגדר סימון <strong>%3</strong>.<br/> כדי לסמן את המחיצה, עליך לחזור ולערוך את המחיצה.<br/><br/> ניתן להמשיך ללא הוספת הסימון אך טעינת המערכת עשויה להיכשל.</translation>
|
||||
<translation>לצורך הפעלת %1 נדרשת מחיצת מערכת EFI.<br/><br/> הוגדרה מחיצה עם נקודת עיגון <strong>%2</strong> אך לא הוגדר סימון <strong>%3</strong>.<br/> כדי לסמן את המחיצה, יש לחזור ולערוך את המחיצה.<br/><br/> ניתן להמשיך ללא הוספת הסימון אך טעינת המערכת עשויה להיכשל.</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"/>
|
||||
|
@ -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 <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>इस संचय उपकरण पर पहले से ऑपरेटिंग सिस्टम है, परंतु <strong>%1</strong> विभाजन तालिका अपेक्षित <strong>%2</strong> से भिन्न है।<br/></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
|
||||
<source>This storage device has one of its partitions <strong>mounted</strong>.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>इस संचय उपकरण के विभाजनों में से कोई एक विभाजन <strong>माउंट</strong> है।</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
|
||||
<source>This storage device is a part of an <strong>inactive RAID</strong> device.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>यह संचय उपकरण एक <strong>निष्क्रिय RAID</strong> उपकरण का हिस्सा है।</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>
|
||||
|
@ -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 <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ovaj uređaj za pohranu već ima operativni sustav, ali njegova particijska tablica <strong>%1</strong> razlikuje se od potrebne <strong>%2</strong>.<br/></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
|
||||
|
@ -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 <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>このストレージデバイスにはすでにオペレーティングシステムがインストールされていますが、パーティションテーブル <strong>%1</strong> は必要な <strong>%2</strong> とは異なります。<br/></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
|
||||
|
@ -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 <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>O dispositivo de armazenamento já possui um sistema operacional, mas a tabela de partições <strong>%1</strong> é diferente da necessária <strong>%2</strong>.<br/></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
|
||||
<source>This storage device has one of its partitions <strong>mounted</strong>.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>O dispositivo de armazenamento tem uma de suas partições <strong>montada</strong>.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
|
||||
<source>This storage device is a part of an <strong>inactive RAID</strong> device.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>O dispositivo de armazenamento é parte de um dispositivo <strong>RAID inativo</strong>.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>
|
||||
|
@ -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 <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Denna lagringsenhet har redan ett operativsystem installerat på sig, men partitionstabellen <strong>%1</strong> skiljer sig från den som behövs <strong>%2</strong>.<br/></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
|
||||
<source>This storage device has one of its partitions <strong>mounted</strong>.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Denna lagringsenhet har en av dess partitioner <strong>monterad</strong>.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
|
||||
<source>This storage device is a part of an <strong>inactive RAID</strong> device.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Denna lagringsenhet är en del av en <strong>inaktiv RAID</strong>enhet. </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>
|
||||
|
@ -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 <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ин дастгоҳи захирагоҳ аллакай дорои низоми амалкунанда мебошад, аммо ҷадвали қисми диски <strong>%1</strong> аз диски лозимии <strong>%2</strong> фарқ мекунад.<br/></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
|
||||
<source>This storage device has one of its partitions <strong>mounted</strong>.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Яке аз қисмҳои диски ин дастгоҳи захирагоҳ <strong>васлшуда</strong> мебошад.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
|
||||
<source>This storage device is a part of an <strong>inactive RAID</strong> device.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ин дастгоҳи захирагоҳ қисми дасгоҳи <strong>RAID-и ғайрифаъол</strong> мебошад.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>
|
||||
|
4124
lang/calamares_vi.ts
Normal file
4124
lang/calamares_vi.ts
Normal file
File diff suppressed because it is too large
Load Diff
@ -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 <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>此儲存裝置上已有作業系統,但分割表 <strong>%1</strong> 與需要的 <strong>%2</strong> 不同。<br/></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
|
||||
<source>This storage device has one of its partitions <strong>mounted</strong>.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>此裝置<strong>已掛載</strong>其中一個分割區。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
|
||||
<source>This storage device is a part of an <strong>inactive RAID</strong> device.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>此儲存裝置是<strong>非作用中 RAID</strong> 裝置的一部份。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>
|
||||
|
@ -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 {}"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
363
lang/python/vi/LC_MESSAGES/python.po
Normal file
363
lang/python/vi/LC_MESSAGES/python.po
Normal 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."
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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}
|
||||
|
@ -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() )
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -52,9 +52,7 @@ yamlToVariant( const YAML::Node& node )
|
||||
case YAML::NodeType::Undefined:
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
// NOTREACHED
|
||||
return QVariant();
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
||||
|
||||
|
42
src/libcalamaresui/utils/QtCompat.h
Normal file
42
src/libcalamaresui/utils/QtCompat.h
Normal 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
|
@ -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
|
||||
|
25
src/modules/keyboard/AdditionalLayoutInfo.h
Normal file
25
src/modules/keyboard/AdditionalLayoutInfo.h
Normal 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
|
@ -7,6 +7,7 @@ calamares_add_plugin( keyboard
|
||||
TYPE viewmodule
|
||||
EXPORT_MACRO PLUGINDLLEXPORT_PRO
|
||||
SOURCES
|
||||
Config.cpp
|
||||
KeyboardViewStep.cpp
|
||||
KeyboardPage.cpp
|
||||
KeyboardLayoutModel.cpp
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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 );
|
||||
}
|
||||
|
@ -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 )
|
||||
|
@ -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";
|
||||
|
@ -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;
|
||||
|
@ -2,5 +2,6 @@
|
||||
<qresource prefix="/">
|
||||
<file>kbd-model-map</file>
|
||||
<file>images/restore.png</file>
|
||||
<file>non-ascii-layouts</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
@ -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$" );
|
||||
|
||||
|
4
src/modules/keyboard/non-ascii-layouts
Normal file
4
src/modules/keyboard/non-ascii-layouts
Normal 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
|
@ -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 );
|
||||
}
|
||||
|
@ -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 )
|
||||
|
@ -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>
|
||||
|
@ -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" );
|
||||
|
||||
|
@ -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 >(); )
|
||||
|
@ -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
|
||||
|
@ -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 }
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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 );
|
||||
}
|
||||
|
@ -110,8 +110,7 @@ PackageChooserViewStep::isNextEnabled() const
|
||||
// exactly one OR one or more
|
||||
return m_widget->hasSelection();
|
||||
}
|
||||
|
||||
NOTREACHED return true;
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
||||
|
||||
|
@ -28,7 +28,7 @@ class Config : public QObject
|
||||
|
||||
public:
|
||||
Config( QObject* parent );
|
||||
virtual ~Config() = default;
|
||||
~Config() override = default;
|
||||
|
||||
enum InstallChoice
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -85,7 +85,7 @@ public:
|
||||
};
|
||||
|
||||
PartitionCoreModule( QObject* parent = nullptr );
|
||||
~PartitionCoreModule();
|
||||
~PartitionCoreModule() override;
|
||||
|
||||
/**
|
||||
* @brief init performs a devices scan and initializes all KPMcore data
|
||||
|
@ -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 );
|
||||
|
@ -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 );
|
||||
|
@ -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 )
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 );
|
||||
|
@ -36,7 +36,7 @@ public:
|
||||
Partition* partition,
|
||||
const QStringList& usedMountPoints,
|
||||
QWidget* parentWidget = nullptr );
|
||||
~EditExistingPartitionDialog();
|
||||
~EditExistingPartitionDialog() override;
|
||||
|
||||
void applyChanges( PartitionCoreModule* module );
|
||||
|
||||
|
@ -34,7 +34,7 @@ class PartitionPage : public QWidget
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit PartitionPage( PartitionCoreModule* core, QWidget* parent = nullptr );
|
||||
~PartitionPage();
|
||||
~PartitionPage() override;
|
||||
|
||||
void onRevertClicked();
|
||||
|
||||
|
@ -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 );
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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()
|
||||
{
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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 );
|
||||
|
@ -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;
|
||||
|
@ -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 ]
|
||||
|
@ -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}
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user