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

This commit is contained in:
Philip Müller 2020-11-13 00:20:13 +01:00
commit 589afbea30
50 changed files with 11039 additions and 488 deletions

20
CHANGES
View File

@ -7,7 +7,23 @@ contributors are listed. Note that Calamares does not have a historical
changelog -- this log starts with version 3.2.0. The release notes on the
website will have to do for older versions.
# 3.2.33 (2020-11-03) #
# 3.2.34 (unreleased) #
This release contains contributions from (alphabetically by first name):
- Artem Grinev
## Core ##
- No core changes yet
## Modules ##
- In the *users* module, warnings about the strength of the password
are now correctly pluralized when possible.
- In the *users* module, if ICU is installed, the user's full name is
automatically transliterated to US-ASCII (for some locales; this will
need tweaking) so that the login name is acceptable. (Thanks Artem)
# 3.2.33 (2020-11-09) #
This release contains contributions from (alphabetically by first name):
- Anke Boersma
@ -31,6 +47,8 @@ This release contains contributions from (alphabetically by first name):
and usernames). (Thanks Artem)
- Various cleanups and documentation improvements in the *partition*
module, and configurable GPT name for swap. (Thanks Gaël)
- A long-standing bug related to GPT partition flags in the
*partition* module has been resolved. #1327 #1267
- The *users* module now has a more detailed way to specify
user groups -- which may be system groups rather than user-GIDs.
A new option in each group can require that the group already

View File

@ -41,10 +41,10 @@
# TODO:3.3: Require CMake 3.12
cmake_minimum_required( VERSION 3.3 FATAL_ERROR )
project( CALAMARES
VERSION 3.2.33
VERSION 3.2.34
LANGUAGES C CXX )
set( CALAMARES_VERSION_RC 0 ) # Set to 0 during release cycle, 1 during development
set( CALAMARES_VERSION_RC 1 ) # Set to 0 during release cycle, 1 during development
### OPTIONS
#
@ -141,10 +141,10 @@ set( CALAMARES_DESCRIPTION_SUMMARY
# `txstats.py -e`. See also
#
# 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_complete az az_AZ be ca cs_CZ da de fi_FI fur he hi hr ja
pt_BR sq sv tg uk vi zh_TW )
set( _tx_good as ast 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

View File

@ -45,6 +45,7 @@ ERR_IMPORT, ERR_USAGE, ERR_FILE_NOT_FOUND, ERR_SYNTAX, ERR_INVALID = range(1,6)
#
try:
from jsonschema import validate, SchemaError, ValidationError
from jsonschema import draft7_format_checker
from yaml import safe_load, YAMLError
except ImportError as e:
print(e)

View File

@ -92,9 +92,16 @@ done
# those are done separately.
_srcdirs="src/calamares src/libcalamares src/libcalamaresui src/modules src/qml"
$LUPDATE -no-obsolete $_srcdirs -ts lang/calamares_en.ts
# Updating the TZ only needs to happen when the TZ themselves are updated,
# very-very-rarely.
# Non-Transifex special-cases
#
# - timezone names can be translated, but that's 700+ strings I don't want
# to inflict on translators normally
# - keyboard layouts can be translated, but that's 767 strings
#
# For both of these, the language / translation only needs to be updated
# when the source data is updated, which is very very rarely.
# $LUPDATE -no-obsolete -extensions cxxtr src/libcalamares/locale -ts lang/tz_en.ts
# $LUPDATE -no-obsolete -extensions cxxtr src/modules/keyboard -ts lang/kb_en.ts
if test -n "$XMLLINT" ; then
TS_FILE="lang/calamares_en.ts"

View File

@ -3337,7 +3337,7 @@ Output:
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="40"/>
<source>Set password for user %1</source>
<translation> - ি % 1</translation>
<translation> - ি %1</translation>
</message>
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="47"/>
@ -3352,7 +3352,7 @@ Output:
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="82"/>
<source>rootMountPoint is %1</source>
<translation>ি % 1</translation>
<translation>ি %1</translation>
</message>
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="88"/>
@ -3367,7 +3367,7 @@ Output:
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="97"/>
<source>Cannot set password for user %1.</source>
<translation>% 1 ি </translation>
<translation>%1 ি </translation>
</message>
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="98"/>

View File

@ -619,17 +619,17 @@ Dies wird das Installationsprogramm beenden und alle Änderungen gehen verloren.
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation>Auf diesem Speichergerät befindet sich bereits ein Betriebssystem, aber die Partitionstabelle &lt;strong&gt;%1&lt;/strong&gt; unterscheidet sich von den erforderlichen &lt;strong&gt;%2&lt;/strong&gt;&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
<source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>Bei diesem Speichergerät ist eine seiner Partitionen &lt;strong&gt;eingehängt&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
<source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
<translation type="unfinished"/>
<translation>Dieses Speichergerät ist ein Teil eines &lt;strong&gt;inaktiven RAID&lt;/strong&gt;-Geräts.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>
@ -2868,7 +2868,7 @@ Ausgabe:
<message>
<location filename="../src/modules/machineid/MachineIdJob.cpp" line="83"/>
<source>Directory not found</source>
<translation type="unfinished"/>
<translation>Verzeichnis nicht gefunden</translation>
</message>
<message>
<location filename="../src/modules/machineid/MachineIdJob.cpp" line="84"/>

View File

@ -4,17 +4,17 @@
<context>
<name>BootInfoWidget</name>
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="61"/>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="62"/>
<source>The &lt;strong&gt;boot environment&lt;/strong&gt; of this system.&lt;br&gt;&lt;br&gt;Older x86 systems only support &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Modern systems usually use &lt;strong&gt;EFI&lt;/strong&gt;, but may also show up as BIOS if started in compatibility mode.</source>
<translation>The &lt;strong&gt;boot environment&lt;/strong&gt; of this system.&lt;br&gt;&lt;br&gt;Older x86 systems only support &lt;strong&gt;BIOS&lt;/strong&gt;.&lt;br&gt;Modern systems usually use &lt;strong&gt;EFI&lt;/strong&gt;, but may also show up as BIOS if started in compatibility mode.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="71"/>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="72"/>
<source>This system was started with an &lt;strong&gt;EFI&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from an EFI environment, this installer must deploy a boot loader application, like &lt;strong&gt;GRUB&lt;/strong&gt; or &lt;strong&gt;systemd-boot&lt;/strong&gt; on an &lt;strong&gt;EFI System Partition&lt;/strong&gt;. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own.</source>
<translation>This system was started with an &lt;strong&gt;EFI&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from an EFI environment, this installer must deploy a boot loader application, like &lt;strong&gt;GRUB&lt;/strong&gt; or &lt;strong&gt;systemd-boot&lt;/strong&gt; on an &lt;strong&gt;EFI System Partition&lt;/strong&gt;. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="83"/>
<location filename="../src/modules/partition/gui/BootInfoWidget.cpp" line="84"/>
<source>This system was started with a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from a BIOS environment, this installer must install a boot loader, like &lt;strong&gt;GRUB&lt;/strong&gt;, either at the beginning of a partition or on the &lt;strong&gt;Master Boot Record&lt;/strong&gt; near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own.</source>
<translation>This system was started with a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment.&lt;br&gt;&lt;br&gt;To configure startup from a BIOS environment, this installer must install a boot loader, like &lt;strong&gt;GRUB&lt;/strong&gt;, either at the beginning of a partition or on the &lt;strong&gt;Master Boot Record&lt;/strong&gt; near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own.</translation>
</message>
@ -533,7 +533,7 @@ The installer will quit and all changes will be lost.</translation>
<translation>&lt;strong&gt;Manual partitioning&lt;/strong&gt;&lt;br/&gt;You can create or resize partitions yourself.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="831"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="828"/>
<source>Reuse %1 as home partition for %2.</source>
<translation>Reuse %1 as home partition for %2.</translation>
</message>
@ -558,101 +558,101 @@ The installer will quit and all changes will be lost.</translation>
<translation>&lt;strong&gt;Select a partition to install on&lt;/strong&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1146"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1148"/>
<source>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1.</source>
<translation>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1154"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1156"/>
<source>The EFI system partition at %1 will be used for starting %2.</source>
<translation>The EFI system partition at %1 will be used for starting %2.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1162"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1164"/>
<source>EFI system partition:</source>
<translation>EFI system partition:</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1296"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1297"/>
<source>This storage device does not seem to have an operating system on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
<translation>This storage device does not seem to have an operating system on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1301"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1338"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1360"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1385"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1302"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1339"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1361"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1386"/>
<source>&lt;strong&gt;Erase disk&lt;/strong&gt;&lt;br/&gt;This will &lt;font color="red"&gt;delete&lt;/font&gt; all data currently present on the selected storage device.</source>
<translation>&lt;strong&gt;Erase disk&lt;/strong&gt;&lt;br/&gt;This will &lt;font color="red"&gt;delete&lt;/font&gt; all data currently present on the selected storage device.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1305"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1334"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1356"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1381"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1306"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1335"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1357"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1382"/>
<source>&lt;strong&gt;Install alongside&lt;/strong&gt;&lt;br/&gt;The installer will shrink a partition to make room for %1.</source>
<translation>&lt;strong&gt;Install alongside&lt;/strong&gt;&lt;br/&gt;The installer will shrink a partition to make room for %1.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1309"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1343"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1364"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1389"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1310"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1344"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1365"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1390"/>
<source>&lt;strong&gt;Replace a partition&lt;/strong&gt;&lt;br/&gt;Replaces a partition with %1.</source>
<translation>&lt;strong&gt;Replace a partition&lt;/strong&gt;&lt;br/&gt;Replaces a partition with %1.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1328"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1329"/>
<source>This storage device has %1 on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
<translation>This storage device has %1 on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1351"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1352"/>
<source>This storage device already has an operating system on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
<translation>This storage device already has an operating system on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1376"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1377"/>
<source>This storage device has multiple operating systems on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</source>
<translation>This storage device has multiple operating systems on it. What would you like to do?&lt;br/&gt;You will be able to review and confirm your choices before any change is made to the storage device.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1449"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1472"/>
<source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
<translation>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1477"/>
<source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
<translation>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1604"/>
<source>No Swap</source>
<translation>No Swap</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1611"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1612"/>
<source>Reuse Swap</source>
<translation>Reuse Swap</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1614"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1615"/>
<source>Swap (no Hibernate)</source>
<translation>Swap (no Hibernate)</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1617"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1618"/>
<source>Swap (with Hibernate)</source>
<translation>Swap (with Hibernate)</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1620"/>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1621"/>
<source>Swap to file</source>
<translation>Swap to file</translation>
</message>
@ -720,12 +720,12 @@ The installer will quit and all changes will be lost.</translation>
<context>
<name>Config</name>
<message>
<location filename="../src/modules/keyboard/Config.cpp" line="340"/>
<location filename="../src/modules/keyboard/Config.cpp" line="326"/>
<source>Set keyboard model to %1.&lt;br/&gt;</source>
<translation>Set keyboard model to %1.&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/keyboard/Config.cpp" line="347"/>
<location filename="../src/modules/keyboard/Config.cpp" line="333"/>
<source>Set keyboard layout to %1/%2.</source>
<translation>Set keyboard layout to %1/%2.</translation>
</message>
@ -810,47 +810,47 @@ The installer will quit and all changes will be lost.</translation>
<translation>&lt;h1&gt;Welcome to the %1 installer&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="164"/>
<location filename="../src/modules/users/Config.cpp" line="200"/>
<source>Your username is too long.</source>
<translation>Your username is too long.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="170"/>
<location filename="../src/modules/users/Config.cpp" line="206"/>
<source>'%1' is not allowed as username.</source>
<translation>'%1' is not allowed as username.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="177"/>
<location filename="../src/modules/users/Config.cpp" line="213"/>
<source>Your username must start with a lowercase letter or underscore.</source>
<translation>Your username must start with a lowercase letter or underscore.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="181"/>
<location filename="../src/modules/users/Config.cpp" line="217"/>
<source>Only lowercase letters, numbers, underscore and hyphen are allowed.</source>
<translation>Only lowercase letters, numbers, underscore and hyphen are allowed.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="227"/>
<location filename="../src/modules/users/Config.cpp" line="262"/>
<source>Your hostname is too short.</source>
<translation>Your hostname is too short.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="231"/>
<location filename="../src/modules/users/Config.cpp" line="266"/>
<source>Your hostname is too long.</source>
<translation>Your hostname is too long.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="237"/>
<location filename="../src/modules/users/Config.cpp" line="272"/>
<source>'%1' is not allowed as hostname.</source>
<translation>'%1' is not allowed as hostname.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="243"/>
<location filename="../src/modules/users/Config.cpp" line="278"/>
<source>Only letters, numbers, underscore and hyphen are allowed.</source>
<translation>Only letters, numbers, underscore and hyphen are allowed.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="446"/>
<location filename="../src/modules/users/Config.cpp" line="481"/>
<source>Your passwords do not match!</source>
<translation>Your passwords do not match!</translation>
</message>
@ -1018,29 +1018,39 @@ The installer will quit and all changes will be lost.</translation>
<context>
<name>CreateUserJob</name>
<message>
<location filename="../src/modules/users/CreateUserJob.cpp" line="40"/>
<location filename="../src/modules/users/CreateUserJob.cpp" line="36"/>
<source>Create user %1</source>
<translation>Create user %1</translation>
</message>
<message>
<location filename="../src/modules/users/CreateUserJob.cpp" line="47"/>
<location filename="../src/modules/users/CreateUserJob.cpp" line="43"/>
<source>Create user &lt;strong&gt;%1&lt;/strong&gt;.</source>
<translation>Create user &lt;strong&gt;%1&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/users/CreateUserJob.cpp" line="54"/>
<location filename="../src/modules/users/CreateUserJob.cpp" line="50"/>
<source>Creating user %1.</source>
<translation>Creating user %1.</translation>
</message>
<message>
<location filename="../src/modules/users/CreateUserJob.cpp" line="186"/>
<source>Cannot create sudoers file for writing.</source>
<translation>Cannot create sudoers file for writing.</translation>
<location filename="../src/modules/users/CreateUserJob.cpp" line="126"/>
<source>Preserving home directory</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/modules/users/CreateUserJob.cpp" line="181"/>
<source>Cannot chmod sudoers file.</source>
<translation>Cannot chmod sudoers file.</translation>
<location filename="../src/modules/users/CreateUserJob.cpp" line="143"/>
<source>Creating user %1</source>
<translation type="unfinished">Creating user %1. {1?}</translation>
</message>
<message>
<location filename="../src/modules/users/CreateUserJob.cpp" line="151"/>
<source>Configuring user %1</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/modules/users/CreateUserJob.cpp" line="159"/>
<source>Setting file permissions</source>
<translation type="unfinished"/>
</message>
</context>
<context>
@ -1243,7 +1253,7 @@ The installer will quit and all changes will be lost.</translation>
<translation>Flags:</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/EditExistingPartitionDialog.cpp" line="272"/>
<location filename="../src/modules/partition/gui/EditExistingPartitionDialog.cpp" line="275"/>
<source>Mountpoint already in use. Please select another one.</source>
<translation>Mountpoint already in use. Please select another one.</translation>
</message>
@ -1558,23 +1568,10 @@ The installer will quit and all changes will be lost.</translation>
<translation>Script</translation>
</message>
</context>
<context>
<name>KeyboardPage</name>
<message>
<location filename="../src/modules/keyboard/KeyboardPage.cpp" line="204"/>
<source>Set keyboard model to %1.&lt;br/&gt;</source>
<translation>Set keyboard model to %1.&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/keyboard/KeyboardPage.cpp" line="208"/>
<source>Set keyboard layout to %1/%2.</source>
<translation>Set keyboard layout to %1/%2.</translation>
</message>
</context>
<context>
<name>KeyboardQmlViewStep</name>
<message>
<location filename="../src/modules/keyboardq/KeyboardQmlViewStep.cpp" line="33"/>
<location filename="../src/modules/keyboardq/KeyboardQmlViewStep.cpp" line="32"/>
<source>Keyboard</source>
<translation>Keyboard</translation>
</message>
@ -1582,7 +1579,7 @@ The installer will quit and all changes will be lost.</translation>
<context>
<name>KeyboardViewStep</name>
<message>
<location filename="../src/modules/keyboard/KeyboardViewStep.cpp" line="45"/>
<location filename="../src/modules/keyboard/KeyboardViewStep.cpp" line="42"/>
<source>Keyboard</source>
<translation>Keyboard</translation>
</message>
@ -1664,59 +1661,59 @@ The installer will quit and all changes will be lost.</translation>
<context>
<name>LicenseWidget</name>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="87"/>
<location filename="../src/modules/license/LicenseWidget.cpp" line="88"/>
<source>URL: %1</source>
<translation>URL: %1</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="108"/>
<location filename="../src/modules/license/LicenseWidget.cpp" line="109"/>
<source>&lt;strong&gt;%1 driver&lt;/strong&gt;&lt;br/&gt;by %2</source>
<extracomment>%1 is an untranslatable product name, example: Creative Audigy driver</extracomment>
<translation>&lt;strong&gt;%1 driver&lt;/strong&gt;&lt;br/&gt;by %2</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="115"/>
<location filename="../src/modules/license/LicenseWidget.cpp" line="116"/>
<source>&lt;strong&gt;%1 graphics driver&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
<extracomment>%1 is usually a vendor name, example: Nvidia graphics driver</extracomment>
<translation>&lt;strong&gt;%1 graphics driver&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="121"/>
<location filename="../src/modules/license/LicenseWidget.cpp" line="122"/>
<source>&lt;strong&gt;%1 browser plugin&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
<translation>&lt;strong&gt;%1 browser plugin&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="127"/>
<location filename="../src/modules/license/LicenseWidget.cpp" line="128"/>
<source>&lt;strong&gt;%1 codec&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
<translation>&lt;strong&gt;%1 codec&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="133"/>
<location filename="../src/modules/license/LicenseWidget.cpp" line="134"/>
<source>&lt;strong&gt;%1 package&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
<translation>&lt;strong&gt;%1 package&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="139"/>
<location filename="../src/modules/license/LicenseWidget.cpp" line="140"/>
<source>&lt;strong&gt;%1&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</source>
<translation>&lt;strong&gt;%1&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt;by %2&lt;/font&gt;</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="162"/>
<location filename="../src/modules/license/LicenseWidget.cpp" line="163"/>
<source>File: %1</source>
<translation>File: %1</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="185"/>
<location filename="../src/modules/license/LicenseWidget.cpp" line="186"/>
<source>Hide license text</source>
<translation>Hide license text</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="185"/>
<location filename="../src/modules/license/LicenseWidget.cpp" line="186"/>
<source>Show the license text</source>
<translation>Show the license text</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="189"/>
<location filename="../src/modules/license/LicenseWidget.cpp" line="190"/>
<source>Open license agreement in browser.</source>
<translation>Open license agreement in browser.</translation>
</message>
@ -1724,18 +1721,18 @@ The installer will quit and all changes will be lost.</translation>
<context>
<name>LocalePage</name>
<message>
<location filename="../src/modules/locale/LocalePage.cpp" line="124"/>
<location filename="../src/modules/locale/LocalePage.cpp" line="130"/>
<source>Region:</source>
<translation>Region:</translation>
</message>
<message>
<location filename="../src/modules/locale/LocalePage.cpp" line="125"/>
<location filename="../src/modules/locale/LocalePage.cpp" line="131"/>
<source>Zone:</source>
<translation>Zone:</translation>
</message>
<message>
<location filename="../src/modules/locale/LocalePage.cpp" line="126"/>
<location filename="../src/modules/locale/LocalePage.cpp" line="127"/>
<location filename="../src/modules/locale/LocalePage.cpp" line="132"/>
<location filename="../src/modules/locale/LocalePage.cpp" line="133"/>
<source>&amp;Change...</source>
<translation>&amp;Change...</translation>
</message>
@ -2057,188 +2054,215 @@ The installer will quit and all changes will be lost.</translation>
<source>The password contains forbidden words in some form</source>
<translation>The password contains forbidden words in some form</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="175"/>
<source>The password contains less than %1 digits</source>
<translation>The password contains less than %1 digits</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="178"/>
<source>The password contains too few digits</source>
<translation>The password contains too few digits</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="182"/>
<source>The password contains less than %1 uppercase letters</source>
<translation>The password contains less than %1 uppercase letters</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="185"/>
<source>The password contains too few uppercase letters</source>
<translation>The password contains too few uppercase letters</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="189"/>
<source>The password contains less than %1 lowercase letters</source>
<translation>The password contains less than %1 lowercase letters</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="192"/>
<source>The password contains too few lowercase letters</source>
<translation>The password contains too few lowercase letters</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="196"/>
<source>The password contains less than %1 non-alphanumeric characters</source>
<translation>The password contains less than %1 non-alphanumeric characters</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="200"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="201"/>
<source>The password contains too few non-alphanumeric characters</source>
<translation>The password contains too few non-alphanumeric characters</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="204"/>
<source>The password is shorter than %1 characters</source>
<translation>The password is shorter than %1 characters</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="207"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="208"/>
<source>The password is too short</source>
<translation>The password is too short</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="209"/>
<source>The password is just rotated old one</source>
<translation>The password is just rotated old one</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="213"/>
<source>The password contains less than %1 character classes</source>
<translation>The password contains less than %1 character classes</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="216"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="217"/>
<source>The password does not contain enough character classes</source>
<translation>The password does not contain enough character classes</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="220"/>
<source>The password contains more than %1 same characters consecutively</source>
<translation>The password contains more than %1 same characters consecutively</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="224"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="226"/>
<source>The password contains too many same characters consecutively</source>
<translation>The password contains too many same characters consecutively</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="228"/>
<source>The password contains more than %1 characters of the same class consecutively</source>
<translation>The password contains more than %1 characters of the same class consecutively</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="232"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="236"/>
<source>The password contains too many characters of the same class consecutively</source>
<translation>The password contains too many characters of the same class consecutively</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="237"/>
<source>The password contains monotonic sequence longer than %1 characters</source>
<translation>The password contains monotonic sequence longer than %1 characters</translation>
<message numerus="yes">
<location filename="../src/modules/users/CheckPWQuality.cpp" line="175"/>
<source>The password contains fewer than %n digits</source>
<translation type="unfinished">
<numerusform/>
<numerusform/>
</translation>
</message>
<message numerus="yes">
<location filename="../src/modules/users/CheckPWQuality.cpp" line="182"/>
<source>The password contains fewer than %n uppercase letters</source>
<translation type="unfinished">
<numerusform/>
<numerusform/>
</translation>
</message>
<message numerus="yes">
<location filename="../src/modules/users/CheckPWQuality.cpp" line="189"/>
<source>The password contains fewer than %n lowercase letters</source>
<translation type="unfinished">
<numerusform/>
<numerusform/>
</translation>
</message>
<message numerus="yes">
<location filename="../src/modules/users/CheckPWQuality.cpp" line="196"/>
<source>The password contains fewer than %n non-alphanumeric characters</source>
<translation type="unfinished">
<numerusform/>
<numerusform/>
</translation>
</message>
<message numerus="yes">
<location filename="../src/modules/users/CheckPWQuality.cpp" line="205"/>
<source>The password is shorter than %n characters</source>
<translation type="unfinished">
<numerusform/>
<numerusform/>
</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="210"/>
<source>The password is a rotated version of the previous one</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
<location filename="../src/modules/users/CheckPWQuality.cpp" line="214"/>
<source>The password contains fewer than %n character classes</source>
<translation type="unfinished">
<numerusform/>
<numerusform/>
</translation>
</message>
<message numerus="yes">
<location filename="../src/modules/users/CheckPWQuality.cpp" line="221"/>
<source>The password contains more than %n same characters consecutively</source>
<translation type="unfinished">
<numerusform/>
<numerusform/>
</translation>
</message>
<message numerus="yes">
<location filename="../src/modules/users/CheckPWQuality.cpp" line="230"/>
<source>The password contains more than %n characters of the same class consecutively</source>
<translation type="unfinished">
<numerusform/>
<numerusform/>
</translation>
</message>
<message numerus="yes">
<location filename="../src/modules/users/CheckPWQuality.cpp" line="241"/>
<source>The password contains monotonic sequence longer than %n characters</source>
<translation type="unfinished">
<numerusform/>
<numerusform/>
</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="247"/>
<source>The password contains too long of a monotonic character sequence</source>
<translation>The password contains too long of a monotonic character sequence</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="244"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="250"/>
<source>No password supplied</source>
<translation>No password supplied</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="246"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="252"/>
<source>Cannot obtain random numbers from the RNG device</source>
<translation>Cannot obtain random numbers from the RNG device</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="248"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="254"/>
<source>Password generation failed - required entropy too low for settings</source>
<translation>Password generation failed - required entropy too low for settings</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="254"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="260"/>
<source>The password fails the dictionary check - %1</source>
<translation>The password fails the dictionary check - %1</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="257"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="263"/>
<source>The password fails the dictionary check</source>
<translation>The password fails the dictionary check</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="261"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="267"/>
<source>Unknown setting - %1</source>
<translation>Unknown setting - %1</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="265"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="271"/>
<source>Unknown setting</source>
<translation>Unknown setting</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="269"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="275"/>
<source>Bad integer value of setting - %1</source>
<translation>Bad integer value of setting - %1</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="274"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="280"/>
<source>Bad integer value</source>
<translation>Bad integer value</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="278"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="284"/>
<source>Setting %1 is not of integer type</source>
<translation>Setting %1 is not of integer type</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="283"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="289"/>
<source>Setting is not of integer type</source>
<translation>Setting is not of integer type</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="287"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="293"/>
<source>Setting %1 is not of string type</source>
<translation>Setting %1 is not of string type</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="292"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="298"/>
<source>Setting is not of string type</source>
<translation>Setting is not of string type</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="294"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="300"/>
<source>Opening the configuration file failed</source>
<translation>Opening the configuration file failed</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="296"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="302"/>
<source>The configuration file is malformed</source>
<translation>The configuration file is malformed</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="298"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="304"/>
<source>Fatal failure</source>
<translation>Fatal failure</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="300"/>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="306"/>
<source>Unknown error</source>
<translation>Unknown error</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="651"/>
<location filename="../src/modules/users/Config.cpp" line="729"/>
<source>Password is empty</source>
<translation>Password is empty</translation>
</message>
@ -2572,117 +2596,117 @@ The installer will quit and all changes will be lost.</translation>
<context>
<name>PartitionViewStep</name>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="69"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="70"/>
<source>Gathering system information...</source>
<translation>Gathering system information...</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="124"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="125"/>
<source>Partitions</source>
<translation>Partitions</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="162"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="163"/>
<source>Install %1 &lt;strong&gt;alongside&lt;/strong&gt; another operating system.</source>
<translation>Install %1 &lt;strong&gt;alongside&lt;/strong&gt; another operating system.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="166"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="167"/>
<source>&lt;strong&gt;Erase&lt;/strong&gt; disk and install %1.</source>
<translation>&lt;strong&gt;Erase&lt;/strong&gt; disk and install %1.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="169"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="170"/>
<source>&lt;strong&gt;Replace&lt;/strong&gt; a partition with %1.</source>
<translation>&lt;strong&gt;Replace&lt;/strong&gt; a partition with %1.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="173"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="174"/>
<source>&lt;strong&gt;Manual&lt;/strong&gt; partitioning.</source>
<translation>&lt;strong&gt;Manual&lt;/strong&gt; partitioning.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="186"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="187"/>
<source>Install %1 &lt;strong&gt;alongside&lt;/strong&gt; another operating system on disk &lt;strong&gt;%2&lt;/strong&gt; (%3).</source>
<translation>Install %1 &lt;strong&gt;alongside&lt;/strong&gt; another operating system on disk &lt;strong&gt;%2&lt;/strong&gt; (%3).</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="193"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="194"/>
<source>&lt;strong&gt;Erase&lt;/strong&gt; disk &lt;strong&gt;%2&lt;/strong&gt; (%3) and install %1.</source>
<translation>&lt;strong&gt;Erase&lt;/strong&gt; disk &lt;strong&gt;%2&lt;/strong&gt; (%3) and install %1.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="199"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="200"/>
<source>&lt;strong&gt;Replace&lt;/strong&gt; a partition on disk &lt;strong&gt;%2&lt;/strong&gt; (%3) with %1.</source>
<translation>&lt;strong&gt;Replace&lt;/strong&gt; a partition on disk &lt;strong&gt;%2&lt;/strong&gt; (%3) with %1.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="206"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="207"/>
<source>&lt;strong&gt;Manual&lt;/strong&gt; partitioning on disk &lt;strong&gt;%1&lt;/strong&gt; (%2).</source>
<translation>&lt;strong&gt;Manual&lt;/strong&gt; partitioning on disk &lt;strong&gt;%1&lt;/strong&gt; (%2).</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="215"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="216"/>
<source>Disk &lt;strong&gt;%1&lt;/strong&gt; (%2)</source>
<translation>Disk &lt;strong&gt;%1&lt;/strong&gt; (%2)</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="241"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="242"/>
<source>Current:</source>
<translation>Current:</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="259"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="260"/>
<source>After:</source>
<translation>After:</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="426"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="427"/>
<source>No EFI system partition configured</source>
<translation>No EFI system partition configured</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="427"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="428"/>
<source>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;To configure an EFI system partition, go back and select or create a FAT32 filesystem with the &lt;strong&gt;%3&lt;/strong&gt; flag enabled and mount point &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;You can continue without setting up an EFI system partition but your system may fail to start.</source>
<translation>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;To configure an EFI system partition, go back and select or create a FAT32 filesystem with the &lt;strong&gt;%3&lt;/strong&gt; flag enabled and mount point &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;You can continue without setting up an EFI system partition but your system may fail to start.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="441"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="442"/>
<source>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;A partition was configured with mount point &lt;strong&gt;%2&lt;/strong&gt; but its &lt;strong&gt;%3&lt;/strong&gt; flag is not set.&lt;br/&gt;To set the flag, go back and edit the partition.&lt;br/&gt;&lt;br/&gt;You can continue without setting the flag but your system may fail to start.</source>
<translation>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;A partition was configured with mount point &lt;strong&gt;%2&lt;/strong&gt; but its &lt;strong&gt;%3&lt;/strong&gt; flag is not set.&lt;br/&gt;To set the flag, go back and edit the partition.&lt;br/&gt;&lt;br/&gt;You can continue without setting the flag but your system may fail to start.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="440"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="441"/>
<source>EFI system partition flag not set</source>
<translation>EFI system partition flag not set</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="467"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="468"/>
<source>Option to use GPT on BIOS</source>
<translation>Option to use GPT on BIOS</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="468"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="469"/>
<source>A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.&lt;br/&gt;&lt;br/&gt;To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the &lt;strong&gt;bios_grub&lt;/strong&gt; flag enabled.&lt;br/&gt;&lt;br/&gt;An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT.</source>
<translation>A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.&lt;br/&gt;&lt;br/&gt;To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the &lt;strong&gt;bios_grub&lt;/strong&gt; flag enabled.&lt;br/&gt;&lt;br/&gt;An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="496"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="497"/>
<source>Boot partition not encrypted</source>
<translation>Boot partition not encrypted</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="497"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="498"/>
<source>A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.&lt;br/&gt;&lt;br/&gt;There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.&lt;br/&gt;You may continue if you wish, but filesystem unlocking will happen later during system startup.&lt;br/&gt;To encrypt the boot partition, go back and recreate it, selecting &lt;strong&gt;Encrypt&lt;/strong&gt; in the partition creation window.</source>
<translation>A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.&lt;br/&gt;&lt;br/&gt;There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.&lt;br/&gt;You may continue if you wish, but filesystem unlocking will happen later during system startup.&lt;br/&gt;To encrypt the boot partition, go back and recreate it, selecting &lt;strong&gt;Encrypt&lt;/strong&gt; in the partition creation window.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="626"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="627"/>
<source>has at least one disk device available.</source>
<translation>has at least one disk device available.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="627"/>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="628"/>
<source>There are no partitions to install on.</source>
<translation>There are no partitions to install on.</translation>
</message>
@ -2842,13 +2866,8 @@ Output:
<translation>swap</translation>
</message>
<message>
<location filename="../src/modules/keyboard/keyboardwidget/keyboardglobal.cpp" line="90"/>
<source>Default Keyboard Model</source>
<translation>Default Keyboard Model</translation>
</message>
<message>
<location filename="../src/modules/keyboard/keyboardwidget/keyboardglobal.cpp" line="136"/>
<location filename="../src/modules/keyboard/keyboardwidget/keyboardglobal.cpp" line="173"/>
<location filename="../src/modules/keyboard/keyboardwidget/keyboardglobal.cpp" line="130"/>
<location filename="../src/modules/keyboard/keyboardwidget/keyboardglobal.cpp" line="167"/>
<source>Default</source>
<translation>Default</translation>
</message>
@ -3232,29 +3251,29 @@ Output:
<context>
<name>SetKeyboardLayoutJob</name>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="53"/>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="55"/>
<source>Set keyboard model to %1, layout to %2-%3</source>
<translation>Set keyboard model to %1, layout to %2-%3</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="356"/>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="368"/>
<source>Failed to write keyboard configuration for the virtual console.</source>
<translation>Failed to write keyboard configuration for the virtual console.</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="357"/>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="361"/>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="368"/>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="369"/>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="397"/>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="414"/>
<source>Failed to write to %1</source>
<translation>Failed to write to %1</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="360"/>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="396"/>
<source>Failed to write keyboard configuration for X11.</source>
<translation>Failed to write keyboard configuration for X11.</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="367"/>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="413"/>
<source>Failed to write keyboard configuration to existing /etc/default directory.</source>
<translation>Failed to write keyboard configuration to existing /etc/default directory.</translation>
</message>
@ -3423,6 +3442,43 @@ Output:
<translation>Cannot open /etc/timezone for writing</translation>
</message>
</context>
<context>
<name>SetupGroupsJob</name>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="166"/>
<source>Preparing groups.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="178"/>
<location filename="../src/modules/users/MiscJobs.cpp" line="183"/>
<source>Could not create groups in target system</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="184"/>
<source>These groups are missing in the target system: %1</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>SetupSudoJob</name>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="33"/>
<source>Configure &lt;pre&gt;sudo&lt;/pre&gt; users.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="55"/>
<source>Cannot chmod sudoers file.</source>
<translation type="unfinished">Cannot chmod sudoers file.</translation>
</message>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="60"/>
<source>Cannot create sudoers file for writing.</source>
<translation type="unfinished">Cannot create sudoers file for writing.</translation>
</message>
</context>
<context>
<name>ShellProcessJob</name>
<message>
@ -3443,12 +3499,12 @@ Output:
<context>
<name>SummaryPage</name>
<message>
<location filename="../src/modules/summary/SummaryPage.cpp" line="47"/>
<location filename="../src/modules/summary/SummaryPage.cpp" line="48"/>
<source>This is an overview of what will happen once you start the setup procedure.</source>
<translation>This is an overview of what will happen once you start the setup procedure.</translation>
</message>
<message>
<location filename="../src/modules/summary/SummaryPage.cpp" line="49"/>
<location filename="../src/modules/summary/SummaryPage.cpp" line="50"/>
<source>This is an overview of what will happen once you start the install procedure.</source>
<translation>This is an overview of what will happen once you start the install procedure.</translation>
</message>

View File

@ -162,12 +162,12 @@ Para configurar el arranque desde un entorno BIOS, este instalador debe instalar
<message>
<location filename="../src/libcalamares/ProcessJob.cpp" line="43"/>
<source>Run command '%1' in target system.</source>
<translation>Ejecutar el comando '% 1' en el sistema de destino.</translation>
<translation>Ejecutar el comando '%1' en el sistema de destino.</translation>
</message>
<message>
<location filename="../src/libcalamares/ProcessJob.cpp" line="43"/>
<source> Run command '%1'.</source>
<translation>Ejecutar el comando '% 1'.</translation>
<translation>Ejecutar el comando '%1'.</translation>
</message>
<message>
<location filename="../src/libcalamares/ProcessJob.cpp" line="50"/>
@ -1120,7 +1120,7 @@ Saldrá del instalador y se perderán todos los cambios.</translation>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="97"/>
<source>This device has a &lt;strong&gt;%1&lt;/strong&gt; partition table.</source>
<translation>Este dispositivo tiene un &lt;strong&gt;% 1 &lt;/ strong&gt; tabla de particiones.</translation>
<translation>Este dispositivo tiene un &lt;strong&gt;%1&lt;/strong&gt; tabla de particiones.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="104"/>

View File

@ -1080,17 +1080,17 @@ El instalador terminará y se perderán todos los cambios.</translation>
<location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="24"/>
<location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="36"/>
<source>Deactivate volume group named %1.</source>
<translation>Desactivar el grupo de volúmenes llamado%1.</translation>
<translation>Desactivar el grupo de volúmenes llamado %1.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="30"/>
<source>Deactivate volume group named &lt;strong&gt;%1&lt;/strong&gt;.</source>
<translation>Desactivar el grupo de volúmenes llamado&lt;strong&gt;% 1&lt;/strong&gt;.</translation>
<translation>Desactivar el grupo de volúmenes llamado&lt;strong&gt;%1&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="48"/>
<source>The installer failed to deactivate a volume group named %1.</source>
<translation>El instalador no pudo desactivar un grupo de volúmenes llamado%1.</translation>
<translation>El instalador no pudo desactivar un grupo de volúmenes llamado %1.</translation>
</message>
</context>
<context>
@ -1330,7 +1330,7 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="44"/>
<source>&lt;h1&gt;All done.&lt;/h1&gt;&lt;br/&gt;%1 has been set up on your computer.&lt;br/&gt;You may now start using your new system.</source>
<translation>&lt;h1&gt;Todo listo.&lt;/h1&gt;&lt;br/&gt;% 1 se ha configurado en su computadora. &lt;br/&gt;Ahora puede comenzar a usar su nuevo sistema.</translation>
<translation>&lt;h1&gt;Todo listo.&lt;/h1&gt;&lt;br/&gt;%1 se ha configurado en su computadora. &lt;br/&gt;Ahora puede comenzar a usar su nuevo sistema.</translation>
</message>
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="48"/>
@ -2198,7 +2198,7 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="278"/>
<source>Setting %1 is not of integer type</source>
<translation>Ajuste de % 1 no es de tipo entero</translation>
<translation>Ajuste de %1 no es de tipo entero</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="283"/>
@ -3260,7 +3260,7 @@ Salida
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="43"/>
<source>Set flags on partition %1.</source>
<translation>Establecer indicadores en la partición% 1.</translation>
<translation>Establecer indicadores en la partición %1.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="49"/>
@ -3335,7 +3335,7 @@ Salida
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="156"/>
<source>The installer failed to set flags on partition %1.</source>
<translation>El instalador no pudo establecer indicadores en la partición% 1.</translation>
<translation>El instalador no pudo establecer indicadores en la partición %1.</translation>
</message>
</context>
<context>
@ -3530,12 +3530,12 @@ Salida
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="101"/>
<source>Could not configure machine feedback correctly, script error %1.</source>
<translation>No se pudo configurar correctamente la retroalimentación de la máquina, error de script% 1.</translation>
<translation>No se pudo configurar correctamente la retroalimentación de la máquina, error de script %1.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="107"/>
<source>Could not configure machine feedback correctly, Calamares error %1.</source>
<translation>No se pudo configurar la retroalimentación de la máquina correctamente, Calamares error% 1.</translation>
<translation>No se pudo configurar la retroalimentación de la máquina correctamente, Calamares error %1.</translation>
</message>
</context>
<context>

View File

@ -3067,12 +3067,12 @@ Postavljanje se može nastaviti, ali neke će značajke možda biti onemogućene
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="186"/>
<source>The filesystem %1 could not be found in this system, and cannot be resized.</source>
<translation>Datotečni sustav % 1 nije moguće pronaći na ovom sustavu i ne može mu se promijeniti veličina.</translation>
<translation>Datotečni sustav %1 nije moguće pronaći na ovom sustavu i ne može mu se promijeniti veličina.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="187"/>
<source>The device %1 could not be found in this system, and cannot be resized.</source>
<translation>Uređaj % 1 nije moguće pronaći na ovom sustavu i ne može mu se promijeniti veličina.</translation>
<translation>Uređaj %1 nije moguće pronaći na ovom sustavu i ne može mu se promijeniti veličina.</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="195"/>

View File

@ -3012,7 +3012,7 @@ Uitvoer:
<location filename="../src/modules/welcomeq/Requirements.qml" line="38"/>
<source>&lt;p&gt;This computer does not satisfy the minimum requirements for installing %1.&lt;br/&gt;
Installation cannot continue.&lt;/p&gt;</source>
<translation>Deze computer voldoet niet aan de minimale vereisten voor het installeren van % 1.
<translation>Deze computer voldoet niet aan de minimale vereisten voor het installeren van %1.
De installatie kan niet doorgaan.</translation>
</message>
<message>

View File

@ -2015,7 +2015,7 @@ O instalador será fechado e todas as alterações serão perdidas.</translation
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="151"/>
<source>Memory allocation error when setting '%1'</source>
<translation>Erro de alocação de memória ao definir '% 1'</translation>
<translation>Erro de alocação de memória ao definir '%1'</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="156"/>

View File

@ -623,17 +623,18 @@ Inštalátor sa ukončí a všetky zmeny budú stratené.</translation>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1448"/>
<source>This storage device already has an operating system on it, but the partition table &lt;strong&gt;%1&lt;/strong&gt; is different from the needed &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;</source>
<translation type="unfinished"/>
<translation>Toto úložné zariadenie obsahuje operačný systém, ale tabuľka oddielov &lt;strong&gt;%1&lt;/strong&gt; sa líši od požadovanej &lt;strong&gt;%2&lt;/strong&gt;.
&lt;br/&gt;</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1471"/>
<source>This storage device has one of its partitions &lt;strong&gt;mounted&lt;/strong&gt;.</source>
<translation type="unfinished"/>
<translation>Toto úložné zariadenie jeden zo svojich oddielov &lt;strong&gt;pripojený&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1476"/>
<source>This storage device is a part of an &lt;strong&gt;inactive RAID&lt;/strong&gt; device.</source>
<translation type="unfinished"/>
<translation>Toto úložné zariadenie je súčasťou zariadenia s &lt;strong&gt;neaktívnym RAIDom&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1603"/>
@ -1826,7 +1827,8 @@ Inštalátor sa ukončí a všetky zmeny budú stratené.</translation>
<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>Prosím, vyberte vaše preferované umiestnenie, aby mohol inštalátor pre vás navrhnúť
miestne nastavenia a časovú zónu. Navrhnuté nastavenia môžete doladiť nižšie. Mapu môžete presúvať ťahaním a približovať alebo odďaľovať tlačidlami +/- alebo rolovaním myšou.</translation>
</message>
</context>
<context>
@ -2127,7 +2129,7 @@ Inštalátor sa ukončí a všetky zmeny budú stratené.</translation>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="220"/>
<source>The password contains more than %1 same characters consecutively</source>
<translation>Heslo obsahuje viac ako% 1 rovnakých znakov za sebou</translation>
<translation>Heslo obsahuje viac ako %1 rovnakých znakov za sebou</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="224"/>
@ -2137,7 +2139,7 @@ Inštalátor sa ukončí a všetky zmeny budú stratené.</translation>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="228"/>
<source>The password contains more than %1 characters of the same class consecutively</source>
<translation>Heslo obsahuje postupne viac ako% 1 znakov toho istého typu</translation>
<translation>Heslo obsahuje postupne viac ako %1 znakov toho istého typu</translation>
</message>
<message>
<location filename="../src/modules/users/CheckPWQuality.cpp" line="232"/>
@ -2870,7 +2872,7 @@ Výstup:
<message>
<location filename="../src/modules/machineid/MachineIdJob.cpp" line="83"/>
<source>Directory not found</source>
<translation type="unfinished"/>
<translation>Adresár sa nenašiel</translation>
</message>
<message>
<location filename="../src/modules/machineid/MachineIdJob.cpp" line="84"/>
@ -3873,7 +3875,7 @@ Výstup:
<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>Kliknutím na preferovaný model klávesnice vyberiete rozloženie, alebo použite predvolený, ktorý bol vybraný podľa rozpoznaného hardvéru.</translation>
</message>
<message>
<location filename="../src/modules/keyboardq/keyboardq.qml" line="253"/>
@ -4012,12 +4014,12 @@ Výstup:
<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>Zadajte rovnaké heslo dvakrát, aby sa predišlo preklepom. Dobré heslo by malo obsahovať mix písmen, čísel a diakritiky, malo by mať dĺžku aspoň osem znakov a malo by byť pravidelne menené.</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="216"/>
<source>Validate passwords quality</source>
<translation type="unfinished"/>
<translation>Overiť kvalitu hesiel</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="226"/>
@ -4032,7 +4034,7 @@ Výstup:
<message>
<location filename="../src/modules/usersq/usersq.qml" line="243"/>
<source>Reuse user password as root password</source>
<translation type="unfinished"/>
<translation>Znovu použiť používateľské heslo ako heslo správcu</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="253"/>

View File

@ -25,7 +25,7 @@ automatic ఉంటుంది, మీరు మాన్యువల్ వి
<message>
<location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="58"/>
<source>Master Boot Record of %1</source>
<translation>% 1 ి</translation>
<translation>%1 ి</translation>
</message>
<message>
<location filename="../src/modules/partition/core/BootLoaderModel.cpp" line="91"/>
@ -134,7 +134,7 @@ automatic ఉంటుంది, మీరు మాన్యువల్ వి
<message>
<location filename="../src/libcalamares/JobExample.cpp" line="29"/>
<source>Job failed (%1)</source>
<translation> ిి (% 1)</translation>
<translation> ిి (%1)</translation>
</message>
<message>
<location filename="../src/libcalamares/JobExample.cpp" line="30"/>

4621
lang/kb_en.ts Normal file

File diff suppressed because it is too large Load Diff

4621
lang/kb_tg.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -2,32 +2,32 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 22:35+0200\n"
"POT-Creation-Date: 2020-11-09 15:12+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: src/modules/grubcfg/main.py:28
msgid "Configure GRUB."
msgstr "Configure GRUB."
msgstr ""
#: src/modules/mount/main.py:29
#: src/modules/mount/main.py:30
msgid "Mounting partitions."
msgstr "Mounting partitions."
msgstr ""
#: src/modules/mount/main.py:141 src/modules/initcpiocfg/main.py:196
#: src/modules/initcpiocfg/main.py:200
#: src/modules/mount/main.py:127 src/modules/initcpiocfg/main.py:199
#: src/modules/initcpiocfg/main.py:203
#: 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
@ -36,327 +36,312 @@ msgstr "Mounting partitions."
#: src/modules/fstab/main.py:367 src/modules/localecfg/main.py:135
#: src/modules/networkcfg/main.py:39
msgid "Configuration Error"
msgstr "Configuration Error"
msgstr ""
#: src/modules/mount/main.py:142 src/modules/initcpiocfg/main.py:197
#: src/modules/mount/main.py:128 src/modules/initcpiocfg/main.py:200
#: 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 "No partitions are defined for <pre>{!s}</pre> to use."
msgstr ""
#: src/modules/services-systemd/main.py:26
msgid "Configure systemd services"
msgstr "Configure systemd services"
msgstr ""
#: src/modules/services-systemd/main.py:59
#: src/modules/services-openrc/main.py:93
msgid "Cannot modify service"
msgstr "Cannot modify service"
msgstr ""
#: 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> call in chroot returned error code {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 "Cannot enable systemd service <code>{name!s}</code>."
msgstr ""
#: src/modules/services-systemd/main.py:65
msgid "Cannot enable systemd target <code>{name!s}</code>."
msgstr "Cannot enable systemd target <code>{name!s}</code>."
msgstr ""
#: src/modules/services-systemd/main.py:69
msgid "Cannot disable systemd target <code>{name!s}</code>."
msgstr "Cannot disable systemd target <code>{name!s}</code>."
msgstr ""
#: src/modules/services-systemd/main.py:71
msgid "Cannot mask systemd unit <code>{name!s}</code>."
msgstr "Cannot mask systemd unit <code>{name!s}</code>."
msgstr ""
#: src/modules/services-systemd/main.py:73
msgid ""
"Unknown systemd commands <code>{command!s}</code> and "
"<code>{suffix!s}</code> for unit {name!s}."
"Unknown systemd commands <code>{command!s}</code> and <code>{suffix!s}</"
"code> for unit {name!s}."
msgstr ""
"Unknown systemd commands <code>{command!s}</code> and "
"<code>{suffix!s}</code> for unit {name!s}."
#: src/modules/umount/main.py:31
msgid "Unmount file systems."
msgstr "Unmount file systems."
msgstr ""
#: src/modules/unpackfs/main.py:35
msgid "Filling up filesystems."
msgstr "Filling up filesystems."
msgstr ""
#: src/modules/unpackfs/main.py:254
msgid "rsync failed with error code {}."
msgstr "rsync failed with error code {}."
msgstr ""
#: src/modules/unpackfs/main.py:299
msgid "Unpacking image {}/{}, file {}/{}"
msgstr "Unpacking image {}/{}, file {}/{}"
msgstr ""
#: src/modules/unpackfs/main.py:314
msgid "Starting to unpack {}"
msgstr "Starting to unpack {}"
msgstr ""
#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:463
msgid "Failed to unpack image \"{}\""
msgstr "Failed to unpack image \"{}\""
msgstr ""
#: src/modules/unpackfs/main.py:430
msgid "No mount point for root partition"
msgstr "No mount point for root partition"
msgstr ""
#: src/modules/unpackfs/main.py:431
msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing"
msgstr "globalstorage does not contain a \"rootMountPoint\" key, doing nothing"
msgstr ""
#: src/modules/unpackfs/main.py:436
msgid "Bad mount point for root partition"
msgstr "Bad mount point for root partition"
msgstr ""
#: src/modules/unpackfs/main.py:437
msgid "rootMountPoint is \"{}\", which does not exist, doing nothing"
msgstr "rootMountPoint is \"{}\", which does not exist, doing nothing"
msgstr ""
#: src/modules/unpackfs/main.py:453 src/modules/unpackfs/main.py:457
#: src/modules/unpackfs/main.py:477
msgid "Bad unsquash configuration"
msgstr "Bad unsquash configuration"
msgstr ""
#: src/modules/unpackfs/main.py:454
msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel"
msgstr "The filesystem for \"{}\" ({}) is not supported by your current kernel"
msgstr ""
#: src/modules/unpackfs/main.py:458
msgid "The source filesystem \"{}\" does not exist"
msgstr "The source filesystem \"{}\" does not exist"
msgstr ""
#: src/modules/unpackfs/main.py:464
msgid ""
"Failed to find unsquashfs, make sure you have the squashfs-tools package "
"installed"
msgstr ""
"Failed to find unsquashfs, make sure you have the squashfs-tools package "
"installed"
#: src/modules/unpackfs/main.py:478
msgid "The destination \"{}\" in the target system is not a directory"
msgstr "The destination \"{}\" in the target system is not a directory"
msgstr ""
#: src/modules/displaymanager/main.py:514
msgid "Cannot write KDM configuration file"
msgstr "Cannot write KDM configuration file"
msgstr ""
#: src/modules/displaymanager/main.py:515
msgid "KDM config file {!s} does not exist"
msgstr "KDM config file {!s} does not exist"
msgstr ""
#: src/modules/displaymanager/main.py:576
msgid "Cannot write LXDM configuration file"
msgstr "Cannot write LXDM configuration file"
msgstr ""
#: src/modules/displaymanager/main.py:577
msgid "LXDM config file {!s} does not exist"
msgstr "LXDM config file {!s} does not exist"
msgstr ""
#: src/modules/displaymanager/main.py:660
msgid "Cannot write LightDM configuration file"
msgstr "Cannot write LightDM configuration file"
msgstr ""
#: src/modules/displaymanager/main.py:661
msgid "LightDM config file {!s} does not exist"
msgstr "LightDM config file {!s} does not exist"
msgstr ""
#: src/modules/displaymanager/main.py:735
msgid "Cannot configure LightDM"
msgstr "Cannot configure LightDM"
msgstr ""
#: src/modules/displaymanager/main.py:736
msgid "No LightDM greeter installed."
msgstr "No LightDM greeter installed."
msgstr ""
#: src/modules/displaymanager/main.py:767
msgid "Cannot write SLIM configuration file"
msgstr "Cannot write SLIM configuration file"
msgstr ""
#: src/modules/displaymanager/main.py:768
msgid "SLIM config file {!s} does not exist"
msgstr "SLIM config file {!s} does not exist"
msgstr ""
#: src/modules/displaymanager/main.py:894
msgid "No display managers selected for the displaymanager module."
msgstr "No display managers selected for the displaymanager module."
msgstr ""
#: src/modules/displaymanager/main.py:895
msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
#: src/modules/displaymanager/main.py:977
msgid "Display manager configuration was incomplete"
msgstr "Display manager configuration was incomplete"
msgstr ""
#: src/modules/initcpiocfg/main.py:28
msgid "Configuring mkinitcpio."
msgstr "Configuring mkinitcpio."
msgstr ""
#: src/modules/initcpiocfg/main.py:201
#: src/modules/initcpiocfg/main.py:204
#: 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 "No root mount point is given for <pre>{!s}</pre> to use."
msgstr ""
#: src/modules/luksopenswaphookcfg/main.py:26
msgid "Configuring encrypted swap."
msgstr "Configuring encrypted swap."
msgstr ""
#: src/modules/rawfs/main.py:26
msgid "Installing data."
msgstr "Installing data."
msgstr ""
#: src/modules/services-openrc/main.py:29
msgid "Configure OpenRC services"
msgstr "Configure OpenRC services"
msgstr ""
#: src/modules/services-openrc/main.py:57
msgid "Cannot add service {name!s} to run-level {level!s}."
msgstr "Cannot add service {name!s} to run-level {level!s}."
msgstr ""
#: src/modules/services-openrc/main.py:59
msgid "Cannot remove service {name!s} from run-level {level!s}."
msgstr "Cannot remove service {name!s} from run-level {level!s}."
msgstr ""
#: src/modules/services-openrc/main.py:61
msgid ""
"Unknown service-action <code>{arg!s}</code> for service {name!s} in run-"
"level {level!s}."
msgstr ""
"Unknown service-action <code>{arg!s}</code> for service {name!s} in 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 ""
"<code>rc-update {arg!s}</code> call in chroot returned error code {num!s}."
#: src/modules/services-openrc/main.py:101
msgid "Target runlevel does not exist"
msgstr "Target runlevel does not exist"
msgstr ""
#: src/modules/services-openrc/main.py:102
msgid ""
"The path for runlevel {level!s} is <code>{path!s}</code>, which does not "
"exist."
msgstr ""
"The path for runlevel {level!s} is <code>{path!s}</code>, which does not "
"exist."
#: src/modules/services-openrc/main.py:110
msgid "Target service does not exist"
msgstr "Target service does not exist"
msgstr ""
#: src/modules/services-openrc/main.py:111
msgid ""
"The path for service {name!s} is <code>{path!s}</code>, which does not "
"exist."
"The path for service {name!s} is <code>{path!s}</code>, which does not exist."
msgstr ""
"The path for service {name!s} is <code>{path!s}</code>, which does not "
"exist."
#: src/modules/plymouthcfg/main.py:27
msgid "Configure Plymouth theme"
msgstr "Configure Plymouth theme"
msgstr ""
#: src/modules/packages/main.py:50 src/modules/packages/main.py:59
#: src/modules/packages/main.py:69
msgid "Install packages."
msgstr "Install packages."
msgstr ""
#: src/modules/packages/main.py:57
#, python-format
msgid "Processing packages (%(count)d / %(total)d)"
msgstr "Processing packages (%(count)d / %(total)d)"
msgstr ""
#: src/modules/packages/main.py:62
#, python-format
msgid "Installing one package."
msgid_plural "Installing %(num)d packages."
msgstr[0] "Installing one package."
msgstr[1] "Installing %(num)d packages."
msgstr[0] ""
msgstr[1] ""
#: src/modules/packages/main.py:65
#, python-format
msgid "Removing one package."
msgid_plural "Removing %(num)d packages."
msgstr[0] "Removing one package."
msgstr[1] "Removing %(num)d packages."
msgstr[0] ""
msgstr[1] ""
#: src/modules/bootloader/main.py:42
msgid "Install bootloader."
msgstr "Install bootloader."
msgstr ""
#: src/modules/hwclock/main.py:26
msgid "Setting hardware clock."
msgstr "Setting hardware clock."
msgstr ""
#: src/modules/mkinitfs/main.py:27
msgid "Creating initramfs with mkinitfs."
msgstr "Creating initramfs with mkinitfs."
msgstr ""
#: src/modules/mkinitfs/main.py:49
msgid "Failed to run mkinitfs on the target"
msgstr "Failed to run mkinitfs on the target"
msgstr ""
#: src/modules/mkinitfs/main.py:50 src/modules/dracut/main.py:50
msgid "The exit code was {}"
msgstr "The exit code was {}"
msgstr ""
#: src/modules/dracut/main.py:27
msgid "Creating initramfs with dracut."
msgstr "Creating initramfs with dracut."
msgstr ""
#: src/modules/dracut/main.py:49
msgid "Failed to run dracut on the target"
msgstr "Failed to run dracut on the target"
msgstr ""
#: src/modules/initramfscfg/main.py:32
msgid "Configuring initramfs."
msgstr "Configuring initramfs."
msgstr ""
#: src/modules/openrcdmcryptcfg/main.py:25
msgid "Configuring OpenRC dmcrypt service."
msgstr "Configuring OpenRC dmcrypt service."
msgstr ""
#: src/modules/fstab/main.py:29
msgid "Writing fstab."
msgstr "Writing fstab."
msgstr ""
#: src/modules/dummypython/main.py:35
msgid "Dummy python job."
msgstr "Dummy python job."
msgstr ""
#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:93
#: src/modules/dummypython/main.py:94
msgid "Dummy python step {}"
msgstr "Dummy python step {}"
msgstr ""
#: src/modules/localecfg/main.py:30
msgid "Configuring locales."
msgstr "Configuring locales."
msgstr ""
#: src/modules/networkcfg/main.py:28
msgid "Saving network configuration."
msgstr "Saving network configuration."
msgstr ""

View File

@ -4,9 +4,9 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Andreas Eitel <github-aneitel@online.de>, 2020
# Adriaan de Groot <groot@kde.org>, 2020
# Christian Spaan, 2020
# Andreas Eitel <github-aneitel@online.de>, 2020
#
#, fuzzy
msgid ""
@ -15,7 +15,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: Christian Spaan, 2020\n"
"Last-Translator: Andreas Eitel <github-aneitel@online.de>, 2020\n"
"Language-Team: German (https://www.transifex.com/calamares/teams/20061/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -208,6 +208,8 @@ msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
"Die Liste der Displaymanager ist leer oder weder in globalstorage noch in "
"displaymanager.conf definiert."
#: src/modules/displaymanager/main.py:977
msgid "Display manager configuration was incomplete"

View File

@ -42,7 +42,7 @@ set( calamares_i18n_qrc_content "" )
# calamares and qt language files
foreach( lang ${CALAMARES_TRANSLATION_LANGUAGES} )
foreach( tlsource "calamares_${lang}" "tz_${lang}" )
foreach( tlsource "calamares_${lang}" "tz_${lang}" "kb_${lang}" )
if( EXISTS "${CMAKE_SOURCE_DIR}/lang/${tlsource}.ts" )
set( calamares_i18n_qrc_content "${calamares_i18n_qrc_content}<file>${tlsource}.qm</file>\n" )
list( APPEND TS_FILES "${CMAKE_SOURCE_DIR}/lang/${tlsource}.ts" )

View File

@ -37,7 +37,7 @@ main( int argc, char** argv )
QString format( argv[ 1 ] );
QString selector = argc == 3 ? QString( argv[ 2 ] ) : QString();
Logger::setupLogLevel(Logger::LOGVERBOSE);
Logger::setupLogLevel( Logger::LOGVERBOSE );
cDebug() << "Doing GeoIP interpretation with format=" << format << "selector=" << selector;
Interface* handler = nullptr;

View File

@ -86,7 +86,8 @@ moduleConfigurationCandidates( bool assumeBuildDir, const QString& moduleName, c
return paths;
}
void Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::Exception
void
Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::Exception
{
QStringList configCandidates
= moduleConfigurationCandidates( Settings::instance()->debugMode(), name(), configFileName );

View File

@ -16,20 +16,28 @@
#include <type_traits>
/// @brief Convenience to zero out and deleteLater of any QObject-derived-class
/** @brief Convenience to zero out and deleteLater of any QObject-derived-class
*
* If, before destruction, preserve is set to @c true, then
* the object is "preserved", and not deleted at all.
*/
template < typename T >
struct cqDeleter
{
T*& p;
bool preserve = false;
~cqDeleter()
{
static_assert( std::is_base_of< QObject, T >::value, "Not a QObject-class" );
if ( p )
if ( !preserve )
{
p->deleteLater();
if ( p )
{
p->deleteLater();
}
p = nullptr;
}
p = nullptr;
}
};

View File

@ -168,17 +168,17 @@ TZLoader::tryLoad( QTranslator* translator )
static void
loadSingletonTranslator( TranslationLoader&& loader, QTranslator*& translator_p )
{
QTranslator* translator = new QTranslator();
loader.tryLoad( translator );
if ( translator_p )
if ( !translator_p )
{
QCoreApplication::removeTranslator( translator_p );
delete translator_p;
QTranslator* translator = new QTranslator();
loader.tryLoad( translator );
QCoreApplication::installTranslator( translator );
translator_p = translator;
}
else
{
loader.tryLoad( translator_p );
}
QCoreApplication::installTranslator( translator );
translator_p = translator;
}
namespace CalamaresUtils
@ -193,10 +193,9 @@ installTranslator( const QLocale& locale, const QString& brandingTranslationsPre
{
loadSingletonTranslator( BrandingLoader( locale, brandingTranslationsPrefix ), s_brandingTranslator );
loadSingletonTranslator( TZLoader( locale ), s_tztranslator );
loadSingletonTranslator( CalamaresLoader( locale ), s_translator );
CalamaresLoader l( locale ); // because we want the extracted localeName
loadSingletonTranslator( std::move( l ), s_translator );
s_translatorLocaleName = l.m_localeName;
s_translatorLocaleName = CalamaresLoader::mungeLocaleName( locale );
}
@ -206,6 +205,12 @@ translatorLocaleName()
return s_translatorLocaleName;
}
bool
loadTranslator( const QLocale& locale, const QString& prefix, QTranslator* translator )
{
return ::tryLoad( translator, prefix, locale.name() );
}
Retranslator*
Retranslator::retranslatorFor( QObject* parent )
{

View File

@ -21,6 +21,7 @@
class QEvent;
class QLocale;
class QTranslator;
namespace CalamaresUtils
{
@ -31,8 +32,29 @@ namespace CalamaresUtils
*/
DLLEXPORT void installTranslator( const QLocale& locale, const QString& brandingTranslationsPrefix );
/** @brief The name of the (locale of the) most recently installed translator
*
* May return something different from the locale.name() of the
* QLocale passed in, because Calamares will munge some names and
* may remap translations.
*/
DLLEXPORT QString translatorLocaleName();
/** @brief Loads <prefix><locale> translations into the given @p translator
*
* This function is not intended for general use: it is for those special
* cases where modules need their own translator / translations for data
* that is locale to the module. Tries to load a .qm from "sensible"
* locations, which are the same ones that installTranslator() would use.
* Takes local-translations into account.
*
* Note that @p prefix should end with an underscore '_' -- this function
* does not introduce one by itself.
*
* @returns @c true on success
*/
DLLEXPORT bool loadTranslator( const QLocale& locale, const QString& prefix, QTranslator* translator );
/** @brief Set @p allow to true to load translations from current dir.
*
* If false, (or never called) the translations are loaded only from

View File

@ -2,41 +2,41 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-15 12:53+0200\n"
"POT-Creation-Date: 2020-11-09 15:12+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
#: src/modules/dummypythonqt/main.py:75
msgid "Click me!"
msgstr "Click me!"
msgstr ""
#: src/modules/dummypythonqt/main.py:85
msgid "A new QLabel."
msgstr "A new QLabel."
msgstr ""
#: src/modules/dummypythonqt/main.py:88
msgid "Dummy PythonQt ViewStep"
msgstr "Dummy PythonQt ViewStep"
msgstr ""
#: src/modules/dummypythonqt/main.py:174
msgid "The Dummy PythonQt Job"
msgstr "The Dummy PythonQt Job"
msgstr ""
#: src/modules/dummypythonqt/main.py:177
msgid "This is the Dummy PythonQt Job. The dummy job says: {}"
msgstr "This is the Dummy PythonQt Job. The dummy job says: {}"
msgstr ""
#: src/modules/dummypythonqt/main.py:181
msgid "A status message for Dummy PythonQt Job."
msgstr "A status message for Dummy PythonQt Job."
msgstr ""

View File

@ -560,3 +560,9 @@ Config::setConfigurationMap( const QVariantMap& configurationMap )
m_writeEtcDefaultKeyboard = true;
}
}
void
Config::retranslate()
{
retranslateKeyboardModels();
}

View File

@ -58,6 +58,17 @@ public:
*/
KeyboardVariantsModel* keyboardVariants() const;
/** @brief Call this to change application language
*
* The models (for keyboard model, layouts and variants) provide
* translations of strings in the xkb table, so need to be
* notified of language changes as well.
*
* Only widgets get LanguageChange events, so one of them will
* need to call this.
*/
void retranslate();
signals:
void prettyStatusChanged();

View File

@ -0,0 +1,825 @@
/* GENERATED FILE DO NOT EDIT
*
* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: no
* SPDX-License-Identifier: CC0-1.0
*
* This file is derived from base.lst in the Xorg distribution
*
*/
/** THIS FILE EXISTS ONLY FOR TRANSLATIONS PURPOSES **/
// *INDENT-OFF*
// clang-format off
/* This returns a reference to local, which is a terrible idea.
* Good thing it's not meant to be compiled.
*/
class kb_models : public QObject {
Q_OBJECT
public:
const QStringList& table()
{
return QStringList {
tr("A4Tech KB-21", "kb_models"),
tr("A4Tech KBS-8", "kb_models"),
tr("A4Tech Wireless Desktop RFKB-23", "kb_models"),
tr("Acer AirKey V", "kb_models"),
tr("Acer C300", "kb_models"),
tr("Acer Ferrari 4000", "kb_models"),
tr("Acer laptop", "kb_models"),
tr("Advance Scorpius KI", "kb_models"),
tr("Apple", "kb_models"),
tr("Apple Aluminium (ANSI)", "kb_models"),
tr("Apple Aluminium (ISO)", "kb_models"),
tr("Apple Aluminium (JIS)", "kb_models"),
tr("Apple laptop", "kb_models"),
tr("Asus laptop", "kb_models"),
tr("Azona RF2300 wireless Internet", "kb_models"),
tr("BTC 5090", "kb_models"),
tr("BTC 5113RF Multimedia", "kb_models"),
tr("BTC 5126T", "kb_models"),
tr("BTC 6301URF", "kb_models"),
tr("BTC 9000", "kb_models"),
tr("BTC 9000A", "kb_models"),
tr("BTC 9001AH", "kb_models"),
tr("BTC 9019U", "kb_models"),
tr("BTC 9116U Mini Wireless Internet and Gaming", "kb_models"),
tr("BenQ X-Touch", "kb_models"),
tr("BenQ X-Touch 730", "kb_models"),
tr("BenQ X-Touch 800", "kb_models"),
tr("Brother Internet", "kb_models"),
tr("Cherry B.UNLIMITED", "kb_models"),
tr("Cherry Blue Line CyBo@rd", "kb_models"),
tr("Cherry Blue Line CyBo@rd (alt.)", "kb_models"),
tr("Cherry CyBo@rd USB-Hub", "kb_models"),
tr("Cherry CyMotion Expert", "kb_models"),
tr("Cherry CyMotion Master Linux", "kb_models"),
tr("Cherry CyMotion Master XPress", "kb_models"),
tr("Chicony Internet", "kb_models"),
tr("Chicony KB-9885", "kb_models"),
tr("Chicony KU-0108", "kb_models"),
tr("Chicony KU-0420", "kb_models"),
tr("Chromebook", "kb_models"),
tr("Classmate PC", "kb_models"),
tr("Compaq Armada laptop", "kb_models"),
tr("Compaq Easy Access", "kb_models"),
tr("Compaq Internet (13 keys)", "kb_models"),
tr("Compaq Internet (18 keys)", "kb_models"),
tr("Compaq Internet (7 keys)", "kb_models"),
tr("Compaq Presario laptop", "kb_models"),
tr("Compaq iPaq", "kb_models"),
tr("Creative Desktop Wireless 7000", "kb_models"),
tr("DTK2000", "kb_models"),
tr("Dell", "kb_models"),
tr("Dell 101-key PC", "kb_models"),
tr("Dell Inspiron 6000/8000 laptop", "kb_models"),
tr("Dell Latitude laptop", "kb_models"),
tr("Dell Precision M laptop", "kb_models"),
tr("Dell Precision M65 laptop", "kb_models"),
tr("Dell SK-8125", "kb_models"),
tr("Dell SK-8135", "kb_models"),
tr("Dell USB Multimedia", "kb_models"),
tr("Dexxa Wireless Desktop", "kb_models"),
tr("Diamond 9801/9802", "kb_models"),
tr("Ennyah DKB-1008", "kb_models"),
tr("Everex STEPnote", "kb_models"),
tr("FL90", "kb_models"),
tr("Fujitsu-Siemens Amilo laptop", "kb_models"),
tr("Generic 101-key PC", "kb_models"),
tr("Generic 102-key PC", "kb_models"),
tr("Generic 104-key PC", "kb_models"),
tr("Generic 104-key PC with L-shaped Enter key", "kb_models"),
tr("Generic 105-key PC", "kb_models"),
tr("Generic 86-key PC", "kb_models"),
tr("Genius Comfy KB-12e", "kb_models"),
tr("Genius Comfy KB-16M/Multimedia KWD-910", "kb_models"),
tr("Genius Comfy KB-21e-Scroll", "kb_models"),
tr("Genius KB-19e NB", "kb_models"),
tr("Genius KKB-2050HS", "kb_models"),
tr("Gyration", "kb_models"),
tr("Happy Hacking", "kb_models"),
tr("Happy Hacking for Mac", "kb_models"),
tr("Hewlett-Packard Internet", "kb_models"),
tr("Hewlett-Packard Mini 110 laptop", "kb_models"),
tr("Hewlett-Packard NEC SK-2500 Multimedia", "kb_models"),
tr("Hewlett-Packard Omnibook 500", "kb_models"),
tr("Hewlett-Packard Omnibook 500 FA", "kb_models"),
tr("Hewlett-Packard Omnibook 6000/6100", "kb_models"),
tr("Hewlett-Packard Omnibook XE3 GC", "kb_models"),
tr("Hewlett-Packard Omnibook XE3 GF", "kb_models"),
tr("Hewlett-Packard Omnibook XT1000", "kb_models"),
tr("Hewlett-Packard Pavilion ZT1100", "kb_models"),
tr("Hewlett-Packard Pavilion dv5", "kb_models"),
tr("Hewlett-Packard nx9020", "kb_models"),
tr("Honeywell Euroboard", "kb_models"),
tr("IBM Rapid Access", "kb_models"),
tr("IBM Rapid Access II", "kb_models"),
tr("IBM Space Saver", "kb_models"),
tr("IBM ThinkPad 560Z/600/600E/A22E", "kb_models"),
tr("IBM ThinkPad R60/T60/R61/T61", "kb_models"),
tr("IBM ThinkPad Z60m/Z60t/Z61m/Z61t", "kb_models"),
tr("Keytronic FlexPro", "kb_models"),
tr("Kinesis", "kb_models"),
tr("Logitech", "kb_models"),
tr("Logitech Access", "kb_models"),
tr("Logitech Cordless Desktop", "kb_models"),
tr("Logitech Cordless Desktop (alt.)", "kb_models"),
tr("Logitech Cordless Desktop EX110", "kb_models"),
tr("Logitech Cordless Desktop LX-300", "kb_models"),
tr("Logitech Cordless Desktop Navigator", "kb_models"),
tr("Logitech Cordless Desktop Optical", "kb_models"),
tr("Logitech Cordless Desktop Pro (2nd alt.)", "kb_models"),
tr("Logitech Cordless Desktop iTouch", "kb_models"),
tr("Logitech Cordless Freedom/Desktop Navigator", "kb_models"),
tr("Logitech G15 extra keys via G15daemon", "kb_models"),
tr("Logitech Internet", "kb_models"),
tr("Logitech Internet 350", "kb_models"),
tr("Logitech Internet Navigator", "kb_models"),
tr("Logitech Ultra-X", "kb_models"),
tr("Logitech Ultra-X Cordless Media Desktop", "kb_models"),
tr("Logitech diNovo", "kb_models"),
tr("Logitech diNovo Edge", "kb_models"),
tr("Logitech iTouch", "kb_models"),
tr("Logitech iTouch Cordless Y-RB6", "kb_models"),
tr("Logitech iTouch Internet Navigator SE", "kb_models"),
tr("Logitech iTouch Internet Navigator SE USB", "kb_models"),
tr("MacBook/MacBook Pro", "kb_models"),
tr("MacBook/MacBook Pro (intl.)", "kb_models"),
tr("Macintosh", "kb_models"),
tr("Macintosh Old", "kb_models"),
tr("Memorex MX1998", "kb_models"),
tr("Memorex MX2500 EZ-Access", "kb_models"),
tr("Memorex MX2750", "kb_models"),
tr("Microsoft Comfort Curve 2000", "kb_models"),
tr("Microsoft Internet", "kb_models"),
tr("Microsoft Internet Pro (Swedish)", "kb_models"),
tr("Microsoft Natural", "kb_models"),
tr("Microsoft Natural Elite", "kb_models"),
tr("Microsoft Natural Ergonomic 4000", "kb_models"),
tr("Microsoft Natural Pro OEM", "kb_models"),
tr("Microsoft Natural Pro USB/Internet Pro", "kb_models"),
tr("Microsoft Natural Pro/Internet Pro", "kb_models"),
tr("Microsoft Natural Wireless Ergonomic 7000", "kb_models"),
tr("Microsoft Office Keyboard", "kb_models"),
tr("Microsoft Surface", "kb_models"),
tr("Microsoft Wireless Multimedia 1.0A", "kb_models"),
tr("NEC SK-1300", "kb_models"),
tr("NEC SK-2500", "kb_models"),
tr("NEC SK-6200", "kb_models"),
tr("NEC SK-7100", "kb_models"),
tr("Northgate OmniKey 101", "kb_models"),
tr("OLPC", "kb_models"),
tr("Ortek Multimedia/Internet MCK-800", "kb_models"),
tr("PC-98", "kb_models"),
tr("Propeller Voyager KTEZ-1000", "kb_models"),
tr("QTronix Scorpius 98N+", "kb_models"),
tr("SVEN Ergonomic 2500", "kb_models"),
tr("SVEN Slim 303", "kb_models"),
tr("Samsung SDM 4500P", "kb_models"),
tr("Samsung SDM 4510P", "kb_models"),
tr("Sanwa Supply SKB-KG3", "kb_models"),
tr("Silvercrest Multimedia Wireless", "kb_models"),
tr("SteelSeries Apex 300 (Apex RAW)", "kb_models"),
tr("Sun Type 6 (Japanese)", "kb_models"),
tr("Sun Type 6 USB (Japanese)", "kb_models"),
tr("Sun Type 6 USB (Unix)", "kb_models"),
tr("Sun Type 6/7 USB", "kb_models"),
tr("Sun Type 6/7 USB (European)", "kb_models"),
tr("Sun Type 7 USB", "kb_models"),
tr("Sun Type 7 USB (European)", "kb_models"),
tr("Sun Type 7 USB (Japanese)/Japanese 106-key", "kb_models"),
tr("Sun Type 7 USB (Unix)", "kb_models"),
tr("Super Power Multimedia", "kb_models"),
tr("Symplon PaceBook tablet", "kb_models"),
tr("Targa Visionary 811", "kb_models"),
tr("Toshiba Satellite S3000", "kb_models"),
tr("Truly Ergonomic 227", "kb_models"),
tr("Truly Ergonomic 229", "kb_models"),
tr("Truly Ergonomic Computer Keyboard Model 227 (Wide Alt keys)", "kb_models"),
tr("Truly Ergonomic Computer Keyboard Model 229 (Standard sized Alt keys, additional Super and Menu key)", "kb_models"),
tr("Trust Direct Access", "kb_models"),
tr("Trust Slimline", "kb_models"),
tr("Trust Wireless Classic", "kb_models"),
tr("TypeMatrix EZ-Reach 2020", "kb_models"),
tr("TypeMatrix EZ-Reach 2030 PS2", "kb_models"),
tr("TypeMatrix EZ-Reach 2030 USB", "kb_models"),
tr("TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)", "kb_models"),
tr("TypeMatrix EZ-Reach 2030 USB (106:JP mode)", "kb_models"),
tr("Unitek KB-1925", "kb_models"),
tr("ViewSonic KU-306 Internet", "kb_models"),
tr("Winbook Model XP5", "kb_models"),
tr("Yahoo! Internet", "kb_models"),
tr("eMachines m6800 laptop", "kb_models"),
QString()
};
}
}
/* This returns a reference to local, which is a terrible idea.
* Good thing it's not meant to be compiled.
*/
class kb_layouts : public QObject {
Q_OBJECT
public:
const QStringList& table()
{
return QStringList {
tr("Afghani", "kb_layouts"),
tr("Albanian", "kb_layouts"),
tr("Amharic", "kb_layouts"),
tr("Arabic", "kb_layouts"),
tr("Arabic (Morocco)", "kb_layouts"),
tr("Arabic (Syria)", "kb_layouts"),
tr("Armenian", "kb_layouts"),
tr("Azerbaijani", "kb_layouts"),
tr("Bambara", "kb_layouts"),
tr("Bangla", "kb_layouts"),
tr("Belarusian", "kb_layouts"),
tr("Belgian", "kb_layouts"),
tr("Bosnian", "kb_layouts"),
tr("Braille", "kb_layouts"),
tr("Bulgarian", "kb_layouts"),
tr("Burmese", "kb_layouts"),
tr("Chinese", "kb_layouts"),
tr("Croatian", "kb_layouts"),
tr("Czech", "kb_layouts"),
tr("Danish", "kb_layouts"),
tr("Dhivehi", "kb_layouts"),
tr("Dutch", "kb_layouts"),
tr("Dzongkha", "kb_layouts"),
tr("English (Australian)", "kb_layouts"),
tr("English (Cameroon)", "kb_layouts"),
tr("English (Ghana)", "kb_layouts"),
tr("English (Nigeria)", "kb_layouts"),
tr("English (South Africa)", "kb_layouts"),
tr("English (UK)", "kb_layouts"),
tr("English (US)", "kb_layouts"),
tr("Esperanto", "kb_layouts"),
tr("Estonian", "kb_layouts"),
tr("Faroese", "kb_layouts"),
tr("Filipino", "kb_layouts"),
tr("Finnish", "kb_layouts"),
tr("French", "kb_layouts"),
tr("French (Canada)", "kb_layouts"),
tr("French (Democratic Republic of the Congo)", "kb_layouts"),
tr("French (Guinea)", "kb_layouts"),
tr("French (Togo)", "kb_layouts"),
tr("Georgian", "kb_layouts"),
tr("German", "kb_layouts"),
tr("German (Austria)", "kb_layouts"),
tr("German (Switzerland)", "kb_layouts"),
tr("Greek", "kb_layouts"),
tr("Hebrew", "kb_layouts"),
tr("Hungarian", "kb_layouts"),
tr("Icelandic", "kb_layouts"),
tr("Indian", "kb_layouts"),
tr("Indonesian (Arab Melayu, phonetic)", "kb_layouts"),
tr("Indonesian (Javanese)", "kb_layouts"),
tr("Iraqi", "kb_layouts"),
tr("Irish", "kb_layouts"),
tr("Italian", "kb_layouts"),
tr("Japanese", "kb_layouts"),
tr("Japanese (PC-98)", "kb_layouts"),
tr("Kabylian (azerty layout, no dead keys)", "kb_layouts"),
tr("Kazakh", "kb_layouts"),
tr("Khmer (Cambodia)", "kb_layouts"),
tr("Korean", "kb_layouts"),
tr("Kyrgyz", "kb_layouts"),
tr("Lao", "kb_layouts"),
tr("Latvian", "kb_layouts"),
tr("Lithuanian", "kb_layouts"),
tr("Macedonian", "kb_layouts"),
tr("Malay (Jawi, Arabic Keyboard)", "kb_layouts"),
tr("Maltese", "kb_layouts"),
tr("Maori", "kb_layouts"),
tr("Moldavian", "kb_layouts"),
tr("Mongolian", "kb_layouts"),
tr("Montenegrin", "kb_layouts"),
tr("Nepali", "kb_layouts"),
tr("Norwegian", "kb_layouts"),
tr("Persian", "kb_layouts"),
tr("Polish", "kb_layouts"),
tr("Portuguese", "kb_layouts"),
tr("Portuguese (Brazil)", "kb_layouts"),
tr("Romanian", "kb_layouts"),
tr("Russian", "kb_layouts"),
tr("Serbian", "kb_layouts"),
tr("Sinhala (phonetic)", "kb_layouts"),
tr("Slovak", "kb_layouts"),
tr("Slovenian", "kb_layouts"),
tr("Spanish", "kb_layouts"),
tr("Spanish (Latin American)", "kb_layouts"),
tr("Swahili (Kenya)", "kb_layouts"),
tr("Swahili (Tanzania)", "kb_layouts"),
tr("Swedish", "kb_layouts"),
tr("Taiwanese", "kb_layouts"),
tr("Tajik", "kb_layouts"),
tr("Thai", "kb_layouts"),
tr("Tswana", "kb_layouts"),
tr("Turkish", "kb_layouts"),
tr("Turkmen", "kb_layouts"),
tr("Ukrainian", "kb_layouts"),
tr("Urdu (Pakistan)", "kb_layouts"),
tr("Uzbek", "kb_layouts"),
tr("Vietnamese", "kb_layouts"),
tr("Wolof", "kb_layouts"),
QString()
};
}
}
/* This returns a reference to local, which is a terrible idea.
* Good thing it's not meant to be compiled.
*/
class kb_variants : public QObject {
Q_OBJECT
public:
const QStringList& table()
{
return QStringList {
tr("Akan", "kb_variants"),
tr("Albanian (Plisi)", "kb_variants"),
tr("Albanian (Veqilharxhi)", "kb_variants"),
tr("Arabic (AZERTY)", "kb_variants"),
tr("Arabic (AZERTY, Eastern Arabic numerals)", "kb_variants"),
tr("Arabic (Algeria)", "kb_variants"),
tr("Arabic (Buckwalter)", "kb_variants"),
tr("Arabic (Eastern Arabic numerals)", "kb_variants"),
tr("Arabic (Macintosh)", "kb_variants"),
tr("Arabic (OLPC)", "kb_variants"),
tr("Arabic (Pakistan)", "kb_variants"),
tr("Arabic (QWERTY)", "kb_variants"),
tr("Arabic (QWERTY, Eastern Arabic numerals)", "kb_variants"),
tr("Armenian (alt. eastern)", "kb_variants"),
tr("Armenian (alt. phonetic)", "kb_variants"),
tr("Armenian (eastern)", "kb_variants"),
tr("Armenian (phonetic)", "kb_variants"),
tr("Armenian (western)", "kb_variants"),
tr("Asturian (Spain, with bottom-dot H and L)", "kb_variants"),
tr("Avatime", "kb_variants"),
tr("Azerbaijani (Cyrillic)", "kb_variants"),
tr("Bangla (India)", "kb_variants"),
tr("Bangla (India, Baishakhi Inscript)", "kb_variants"),
tr("Bangla (India, Baishakhi)", "kb_variants"),
tr("Bangla (India, Bornona)", "kb_variants"),
tr("Bangla (India, Gitanjali)", "kb_variants"),
tr("Bangla (India, Probhat)", "kb_variants"),
tr("Bangla (Probhat)", "kb_variants"),
tr("Bashkirian", "kb_variants"),
tr("Belarusian (Latin)", "kb_variants"),
tr("Belarusian (intl.)", "kb_variants"),
tr("Belarusian (legacy)", "kb_variants"),
tr("Belgian (ISO, alt.)", "kb_variants"),
tr("Belgian (Latin-9 only, alt.)", "kb_variants"),
tr("Belgian (Sun dead keys)", "kb_variants"),
tr("Belgian (Sun dead keys, alt.)", "kb_variants"),
tr("Belgian (Wang 724 AZERTY)", "kb_variants"),
tr("Belgian (alt.)", "kb_variants"),
tr("Belgian (no dead keys)", "kb_variants"),
tr("Berber (Morocco, Tifinagh alt.)", "kb_variants"),
tr("Berber (Morocco, Tifinagh extended phonetic)", "kb_variants"),
tr("Berber (Morocco, Tifinagh extended)", "kb_variants"),
tr("Berber (Morocco, Tifinagh phonetic)", "kb_variants"),
tr("Berber (Morocco, Tifinagh phonetic, alt.)", "kb_variants"),
tr("Berber (Morocco, Tifinagh)", "kb_variants"),
tr("Bosnian (US)", "kb_variants"),
tr("Bosnian (US, with Bosnian digraphs)", "kb_variants"),
tr("Bosnian (with Bosnian digraphs)", "kb_variants"),
tr("Bosnian (with guillemets)", "kb_variants"),
tr("Braille (left-handed inverted thumb)", "kb_variants"),
tr("Braille (left-handed)", "kb_variants"),
tr("Braille (right-handed inverted thumb)", "kb_variants"),
tr("Braille (right-handed)", "kb_variants"),
tr("Bulgarian (enhanced)", "kb_variants"),
tr("Bulgarian (new phonetic)", "kb_variants"),
tr("Bulgarian (traditional phonetic)", "kb_variants"),
tr("Burmese Zawgyi", "kb_variants"),
tr("Cameroon (AZERTY, intl.)", "kb_variants"),
tr("Cameroon (Dvorak, intl.)", "kb_variants"),
tr("Cameroon Multilingual (QWERTY, intl.)", "kb_variants"),
tr("Canadian (intl.)", "kb_variants"),
tr("Canadian (intl., 1st part)", "kb_variants"),
tr("Canadian (intl., 2nd part)", "kb_variants"),
tr("Catalan (Spain, with middle-dot L)", "kb_variants"),
tr("Cherokee", "kb_variants"),
tr("Chuvash", "kb_variants"),
tr("Chuvash (Latin)", "kb_variants"),
tr("CloGaelach", "kb_variants"),
tr("Crimean Tatar (Turkish Alt-Q)", "kb_variants"),
tr("Crimean Tatar (Turkish F)", "kb_variants"),
tr("Crimean Tatar (Turkish Q)", "kb_variants"),
tr("Croatian (US)", "kb_variants"),
tr("Croatian (US, with Croatian digraphs)", "kb_variants"),
tr("Croatian (with Croatian digraphs)", "kb_variants"),
tr("Croatian (with guillemets)", "kb_variants"),
tr("Czech (QWERTY)", "kb_variants"),
tr("Czech (QWERTY, Macintosh)", "kb_variants"),
tr("Czech (QWERTY, extended backslash)", "kb_variants"),
tr("Czech (UCW, only accented letters)", "kb_variants"),
tr("Czech (US, Dvorak, UCW support)", "kb_variants"),
tr("Czech (with &lt;\|&gt; key)", "kb_variants"),
tr("Danish (Dvorak)", "kb_variants"),
tr("Danish (Macintosh)", "kb_variants"),
tr("Danish (Macintosh, no dead keys)", "kb_variants"),
tr("Danish (Windows)", "kb_variants"),
tr("Danish (no dead keys)", "kb_variants"),
tr("Default", "kb_variants"),
tr("Dutch (Macintosh)", "kb_variants"),
tr("Dutch (Sun dead keys)", "kb_variants"),
tr("Dutch (standard)", "kb_variants"),
tr("English (Canada)", "kb_variants"),
tr("English (Colemak)", "kb_variants"),
tr("English (Dvorak)", "kb_variants"),
tr("English (Dvorak, alt. intl.)", "kb_variants"),
tr("English (Dvorak, intl., with dead keys)", "kb_variants"),
tr("English (Dvorak, left-handed)", "kb_variants"),
tr("English (Dvorak, right-handed)", "kb_variants"),
tr("English (Ghana, GILLBT)", "kb_variants"),
tr("English (Ghana, multilingual)", "kb_variants"),
tr("English (India, with rupee)", "kb_variants"),
tr("English (Macintosh)", "kb_variants"),
tr("English (Mali, US, Macintosh)", "kb_variants"),
tr("English (Mali, US, intl.)", "kb_variants"),
tr("English (Norman)", "kb_variants"),
tr("English (UK, Colemak)", "kb_variants"),
tr("English (UK, Dvorak)", "kb_variants"),
tr("English (UK, Dvorak, with UK punctuation)", "kb_variants"),
tr("English (UK, Macintosh)", "kb_variants"),
tr("English (UK, Macintosh, intl.)", "kb_variants"),
tr("English (UK, extended, Windows)", "kb_variants"),
tr("English (UK, intl., with dead keys)", "kb_variants"),
tr("English (US, Symbolic)", "kb_variants"),
tr("English (US, alt. intl.)", "kb_variants"),
tr("English (US, euro on 5)", "kb_variants"),
tr("English (US, intl., with dead keys)", "kb_variants"),
tr("English (Workman)", "kb_variants"),
tr("English (Workman, intl., with dead keys)", "kb_variants"),
tr("English (classic Dvorak)", "kb_variants"),
tr("English (intl., with AltGr dead keys)", "kb_variants"),
tr("English (programmer Dvorak)", "kb_variants"),
tr("English (the divide/multiply toggle the layout)", "kb_variants"),
tr("Esperanto (Brazil, Nativo)", "kb_variants"),
tr("Esperanto (Portugal, Nativo)", "kb_variants"),
tr("Esperanto (legacy)", "kb_variants"),
tr("Estonian (Dvorak)", "kb_variants"),
tr("Estonian (US)", "kb_variants"),
tr("Estonian (no dead keys)", "kb_variants"),
tr("Ewe", "kb_variants"),
tr("Faroese (no dead keys)", "kb_variants"),
tr("Filipino (Capewell-Dvorak, Baybayin)", "kb_variants"),
tr("Filipino (Capewell-Dvorak, Latin)", "kb_variants"),
tr("Filipino (Capewell-QWERF 2006, Baybayin)", "kb_variants"),
tr("Filipino (Capewell-QWERF 2006, Latin)", "kb_variants"),
tr("Filipino (Colemak, Baybayin)", "kb_variants"),
tr("Filipino (Colemak, Latin)", "kb_variants"),
tr("Filipino (Dvorak, Baybayin)", "kb_variants"),
tr("Filipino (Dvorak, Latin)", "kb_variants"),
tr("Filipino (QWERTY, Baybayin)", "kb_variants"),
tr("Finnish (Macintosh)", "kb_variants"),
tr("Finnish (Windows)", "kb_variants"),
tr("Finnish (classic)", "kb_variants"),
tr("Finnish (classic, no dead keys)", "kb_variants"),
tr("French (AZERTY)", "kb_variants"),
tr("French (AZERTY, AFNOR)", "kb_variants"),
tr("French (BEPO)", "kb_variants"),
tr("French (BEPO, AFNOR)", "kb_variants"),
tr("French (BEPO, Latin-9 only)", "kb_variants"),
tr("French (Breton)", "kb_variants"),
tr("French (Cameroon)", "kb_variants"),
tr("French (Canada, Dvorak)", "kb_variants"),
tr("French (Canada, legacy)", "kb_variants"),
tr("French (Dvorak)", "kb_variants"),
tr("French (Macintosh)", "kb_variants"),
tr("French (Mali, alt.)", "kb_variants"),
tr("French (Morocco)", "kb_variants"),
tr("French (Sun dead keys)", "kb_variants"),
tr("French (Switzerland)", "kb_variants"),
tr("French (Switzerland, Macintosh)", "kb_variants"),
tr("French (Switzerland, Sun dead keys)", "kb_variants"),
tr("French (Switzerland, no dead keys)", "kb_variants"),
tr("French (US)", "kb_variants"),
tr("French (alt.)", "kb_variants"),
tr("French (alt., Latin-9 only)", "kb_variants"),
tr("French (alt., Sun dead keys)", "kb_variants"),
tr("French (alt., no dead keys)", "kb_variants"),
tr("French (legacy, alt.)", "kb_variants"),
tr("French (legacy, alt., Sun dead keys)", "kb_variants"),
tr("French (legacy, alt., no dead keys)", "kb_variants"),
tr("French (no dead keys)", "kb_variants"),
tr("Friulian (Italy)", "kb_variants"),
tr("Fula", "kb_variants"),
tr("Ga", "kb_variants"),
tr("Georgian (France, AZERTY Tskapo)", "kb_variants"),
tr("Georgian (Italy)", "kb_variants"),
tr("Georgian (MESS)", "kb_variants"),
tr("Georgian (ergonomic)", "kb_variants"),
tr("German (Austria, Macintosh)", "kb_variants"),
tr("German (Austria, Sun dead keys)", "kb_variants"),
tr("German (Austria, no dead keys)", "kb_variants"),
tr("German (Dvorak)", "kb_variants"),
tr("German (E1)", "kb_variants"),
tr("German (E2)", "kb_variants"),
tr("German (Macintosh)", "kb_variants"),
tr("German (Macintosh, no dead keys)", "kb_variants"),
tr("German (Neo 2)", "kb_variants"),
tr("German (QWERTY)", "kb_variants"),
tr("German (Sun dead keys)", "kb_variants"),
tr("German (Switzerland, Macintosh)", "kb_variants"),
tr("German (Switzerland, Sun dead keys)", "kb_variants"),
tr("German (Switzerland, legacy)", "kb_variants"),
tr("German (Switzerland, no dead keys)", "kb_variants"),
tr("German (T3)", "kb_variants"),
tr("German (US)", "kb_variants"),
tr("German (dead acute)", "kb_variants"),
tr("German (dead grave acute)", "kb_variants"),
tr("German (dead tilde)", "kb_variants"),
tr("German (no dead keys)", "kb_variants"),
tr("Greek (extended)", "kb_variants"),
tr("Greek (no dead keys)", "kb_variants"),
tr("Greek (polytonic)", "kb_variants"),
tr("Greek (simple)", "kb_variants"),
tr("Gujarati", "kb_variants"),
tr("Hanyu Pinyin (with AltGr dead keys)", "kb_variants"),
tr("Hausa (Ghana)", "kb_variants"),
tr("Hausa (Nigeria)", "kb_variants"),
tr("Hawaiian", "kb_variants"),
tr("Hebrew (Biblical, Tiro)", "kb_variants"),
tr("Hebrew (lyx)", "kb_variants"),
tr("Hebrew (phonetic)", "kb_variants"),
tr("Hindi (Bolnagri)", "kb_variants"),
tr("Hindi (KaGaPa, phonetic)", "kb_variants"),
tr("Hindi (Wx)", "kb_variants"),
tr("Hungarian (QWERTY)", "kb_variants"),
tr("Hungarian (QWERTY, 101-key, comma, dead keys)", "kb_variants"),
tr("Hungarian (QWERTY, 101-key, comma, no dead keys)", "kb_variants"),
tr("Hungarian (QWERTY, 101-key, dot, dead keys)", "kb_variants"),
tr("Hungarian (QWERTY, 101-key, dot, no dead keys)", "kb_variants"),
tr("Hungarian (QWERTY, 102-key, comma, dead keys)", "kb_variants"),
tr("Hungarian (QWERTY, 102-key, comma, no dead keys)", "kb_variants"),
tr("Hungarian (QWERTY, 102-key, dot, dead keys)", "kb_variants"),
tr("Hungarian (QWERTY, 102-key, dot, no dead keys)", "kb_variants"),
tr("Hungarian (QWERTZ, 101-key, comma, dead keys)", "kb_variants"),
tr("Hungarian (QWERTZ, 101-key, comma, no dead keys)", "kb_variants"),
tr("Hungarian (QWERTZ, 101-key, dot, dead keys)", "kb_variants"),
tr("Hungarian (QWERTZ, 101-key, dot, no dead keys)", "kb_variants"),
tr("Hungarian (QWERTZ, 102-key, comma, dead keys)", "kb_variants"),
tr("Hungarian (QWERTZ, 102-key, comma, no dead keys)", "kb_variants"),
tr("Hungarian (QWERTZ, 102-key, dot, dead keys)", "kb_variants"),
tr("Hungarian (QWERTZ, 102-key, dot, no dead keys)", "kb_variants"),
tr("Hungarian (no dead keys)", "kb_variants"),
tr("Hungarian (standard)", "kb_variants"),
tr("Icelandic (Dvorak)", "kb_variants"),
tr("Icelandic (Macintosh)", "kb_variants"),
tr("Icelandic (Macintosh, legacy)", "kb_variants"),
tr("Icelandic (Sun dead keys)", "kb_variants"),
tr("Icelandic (no dead keys)", "kb_variants"),
tr("Igbo", "kb_variants"),
tr("Indic (phonetic, IPA)", "kb_variants"),
tr("Indonesian (Arab Melayu, extended phonetic)", "kb_variants"),
tr("Inuktitut", "kb_variants"),
tr("Irish (UnicodeExpert)", "kb_variants"),
tr("Italian (IBM 142)", "kb_variants"),
tr("Italian (Macintosh)", "kb_variants"),
tr("Italian (US)", "kb_variants"),
tr("Italian (Windows)", "kb_variants"),
tr("Italian (intl., with dead keys)", "kb_variants"),
tr("Italian (no dead keys)", "kb_variants"),
tr("Japanese (Dvorak)", "kb_variants"),
tr("Japanese (Kana 86)", "kb_variants"),
tr("Japanese (Kana)", "kb_variants"),
tr("Japanese (Macintosh)", "kb_variants"),
tr("Japanese (OADG 109A)", "kb_variants"),
tr("Kabylian (Algeria, Tifinagh)", "kb_variants"),
tr("Kabylian (azerty layout, with dead keys)", "kb_variants"),
tr("Kabylian (qwerty-gb layout, with dead keys)", "kb_variants"),
tr("Kabylian (qwerty-us layout, with dead keys)", "kb_variants"),
tr("Kalmyk", "kb_variants"),
tr("Kannada", "kb_variants"),
tr("Kannada (KaGaPa, phonetic)", "kb_variants"),
tr("Kashubian", "kb_variants"),
tr("Kazakh (Latin)", "kb_variants"),
tr("Kazakh (extended)", "kb_variants"),
tr("Kazakh (with Russian)", "kb_variants"),
tr("Kikuyu", "kb_variants"),
tr("Komi", "kb_variants"),
tr("Korean (101/104-key compatible)", "kb_variants"),
tr("Kurdish (Iran, Arabic-Latin)", "kb_variants"),
tr("Kurdish (Iran, F)", "kb_variants"),
tr("Kurdish (Iran, Latin Alt-Q)", "kb_variants"),
tr("Kurdish (Iran, Latin Q)", "kb_variants"),
tr("Kurdish (Iraq, Arabic-Latin)", "kb_variants"),
tr("Kurdish (Iraq, F)", "kb_variants"),
tr("Kurdish (Iraq, Latin Alt-Q)", "kb_variants"),
tr("Kurdish (Iraq, Latin Q)", "kb_variants"),
tr("Kurdish (Syria, F)", "kb_variants"),
tr("Kurdish (Syria, Latin Alt-Q)", "kb_variants"),
tr("Kurdish (Syria, Latin Q)", "kb_variants"),
tr("Kurdish (Turkey, F)", "kb_variants"),
tr("Kurdish (Turkey, Latin Alt-Q)", "kb_variants"),
tr("Kurdish (Turkey, Latin Q)", "kb_variants"),
tr("Kyrgyz (phonetic)", "kb_variants"),
tr("Lao (STEA)", "kb_variants"),
tr("Latvian (F)", "kb_variants"),
tr("Latvian (adapted)", "kb_variants"),
tr("Latvian (apostrophe)", "kb_variants"),
tr("Latvian (ergonomic, ŪGJRMV)", "kb_variants"),
tr("Latvian (modern)", "kb_variants"),
tr("Latvian (tilde)", "kb_variants"),
tr("Lithuanian (IBM LST 1205-92)", "kb_variants"),
tr("Lithuanian (LEKP)", "kb_variants"),
tr("Lithuanian (LEKPa)", "kb_variants"),
tr("Lithuanian (US)", "kb_variants"),
tr("Lithuanian (standard)", "kb_variants"),
tr("Lower Sorbian", "kb_variants"),
tr("Lower Sorbian (QWERTZ)", "kb_variants"),
tr("Macedonian (no dead keys)", "kb_variants"),
tr("Malay (Jawi, phonetic)", "kb_variants"),
tr("Malayalam", "kb_variants"),
tr("Malayalam (Lalitha)", "kb_variants"),
tr("Malayalam (enhanced Inscript, with rupee)", "kb_variants"),
tr("Maltese (UK, with AltGr overrides)", "kb_variants"),
tr("Maltese (US layout with AltGr overrides)", "kb_variants"),
tr("Maltese (US)", "kb_variants"),
tr("Manipuri (Eeyek)", "kb_variants"),
tr("Marathi (KaGaPa, phonetic)", "kb_variants"),
tr("Marathi (enhanced Inscript)", "kb_variants"),
tr("Mari", "kb_variants"),
tr("Mmuock", "kb_variants"),
tr("Moldavian (Gagauz)", "kb_variants"),
tr("Mongolian (Bichig)", "kb_variants"),
tr("Mongolian (Galik)", "kb_variants"),
tr("Mongolian (Manchu Galik)", "kb_variants"),
tr("Mongolian (Manchu)", "kb_variants"),
tr("Mongolian (Todo Galik)", "kb_variants"),
tr("Mongolian (Todo)", "kb_variants"),
tr("Mongolian (Xibe)", "kb_variants"),
tr("Montenegrin (Cyrillic)", "kb_variants"),
tr("Montenegrin (Cyrillic, ZE and ZHE swapped)", "kb_variants"),
tr("Montenegrin (Cyrillic, with guillemets)", "kb_variants"),
tr("Montenegrin (Latin, QWERTY)", "kb_variants"),
tr("Montenegrin (Latin, Unicode)", "kb_variants"),
tr("Montenegrin (Latin, Unicode, QWERTY)", "kb_variants"),
tr("Montenegrin (Latin, with guillemets)", "kb_variants"),
tr("Northern Saami (Finland)", "kb_variants"),
tr("Northern Saami (Norway)", "kb_variants"),
tr("Northern Saami (Norway, no dead keys)", "kb_variants"),
tr("Northern Saami (Sweden)", "kb_variants"),
tr("Norwegian (Colemak)", "kb_variants"),
tr("Norwegian (Dvorak)", "kb_variants"),
tr("Norwegian (Macintosh)", "kb_variants"),
tr("Norwegian (Macintosh, no dead keys)", "kb_variants"),
tr("Norwegian (Windows)", "kb_variants"),
tr("Norwegian (no dead keys)", "kb_variants"),
tr("Occitan", "kb_variants"),
tr("Ogham", "kb_variants"),
tr("Ogham (IS434)", "kb_variants"),
tr("Ol Chiki", "kb_variants"),
tr("Oriya", "kb_variants"),
tr("Ossetian (Georgia)", "kb_variants"),
tr("Ossetian (Windows)", "kb_variants"),
tr("Ossetian (legacy)", "kb_variants"),
tr("Pannonian Rusyn", "kb_variants"),
tr("Pashto", "kb_variants"),
tr("Pashto (Afghanistan, OLPC)", "kb_variants"),
tr("Persian (Afghanistan, Dari OLPC)", "kb_variants"),
tr("Persian (with Persian keypad)", "kb_variants"),
tr("Polish (British keyboard)", "kb_variants"),
tr("Polish (Dvorak)", "kb_variants"),
tr("Polish (Dvorak, with Polish quotes on key 1)", "kb_variants"),
tr("Polish (Dvorak, with Polish quotes on quotemark key)", "kb_variants"),
tr("Polish (QWERTZ)", "kb_variants"),
tr("Polish (legacy)", "kb_variants"),
tr("Polish (programmer Dvorak)", "kb_variants"),
tr("Portuguese (Brazil, Dvorak)", "kb_variants"),
tr("Portuguese (Brazil, IBM/Lenovo ThinkPad)", "kb_variants"),
tr("Portuguese (Brazil, Nativo for US keyboards)", "kb_variants"),
tr("Portuguese (Brazil, Nativo)", "kb_variants"),
tr("Portuguese (Brazil, no dead keys)", "kb_variants"),
tr("Portuguese (Macintosh)", "kb_variants"),
tr("Portuguese (Macintosh, Sun dead keys)", "kb_variants"),
tr("Portuguese (Macintosh, no dead keys)", "kb_variants"),
tr("Portuguese (Nativo for US keyboards)", "kb_variants"),
tr("Portuguese (Nativo)", "kb_variants"),
tr("Portuguese (Sun dead keys)", "kb_variants"),
tr("Portuguese (no dead keys)", "kb_variants"),
tr("Punjabi (Gurmukhi Jhelum)", "kb_variants"),
tr("Punjabi (Gurmukhi)", "kb_variants"),
tr("Romanian (Germany)", "kb_variants"),
tr("Romanian (Germany, no dead keys)", "kb_variants"),
tr("Romanian (Windows)", "kb_variants"),
tr("Romanian (cedilla)", "kb_variants"),
tr("Romanian (standard cedilla)", "kb_variants"),
tr("Romanian (standard)", "kb_variants"),
tr("Russian (Belarus)", "kb_variants"),
tr("Russian (Czech, phonetic)", "kb_variants"),
tr("Russian (DOS)", "kb_variants"),
tr("Russian (Georgia)", "kb_variants"),
tr("Russian (Germany, phonetic)", "kb_variants"),
tr("Russian (Kazakhstan, with Kazakh)", "kb_variants"),
tr("Russian (Macintosh)", "kb_variants"),
tr("Russian (Poland, phonetic Dvorak)", "kb_variants"),
tr("Russian (Sweden, phonetic)", "kb_variants"),
tr("Russian (Sweden, phonetic, no dead keys)", "kb_variants"),
tr("Russian (US, phonetic)", "kb_variants"),
tr("Russian (Ukraine, standard RSTU)", "kb_variants"),
tr("Russian (legacy)", "kb_variants"),
tr("Russian (phonetic)", "kb_variants"),
tr("Russian (phonetic, AZERTY)", "kb_variants"),
tr("Russian (phonetic, Dvorak)", "kb_variants"),
tr("Russian (phonetic, French)", "kb_variants"),
tr("Russian (phonetic, Windows)", "kb_variants"),
tr("Russian (phonetic, YAZHERTY)", "kb_variants"),
tr("Russian (typewriter)", "kb_variants"),
tr("Russian (typewriter, legacy)", "kb_variants"),
tr("Saisiyat (Taiwan)", "kb_variants"),
tr("Samogitian", "kb_variants"),
tr("Sanskrit (KaGaPa, phonetic)", "kb_variants"),
tr("Serbian (Cyrillic, ZE and ZHE swapped)", "kb_variants"),
tr("Serbian (Cyrillic, with guillemets)", "kb_variants"),
tr("Serbian (Latin)", "kb_variants"),
tr("Serbian (Latin, QWERTY)", "kb_variants"),
tr("Serbian (Latin, Unicode)", "kb_variants"),
tr("Serbian (Latin, Unicode, QWERTY)", "kb_variants"),
tr("Serbian (Latin, with guillemets)", "kb_variants"),
tr("Serbian (Russia)", "kb_variants"),
tr("Serbo-Croatian (US)", "kb_variants"),
tr("Sicilian", "kb_variants"),
tr("Silesian", "kb_variants"),
tr("Sindhi", "kb_variants"),
tr("Sinhala (US)", "kb_variants"),
tr("Slovak (QWERTY)", "kb_variants"),
tr("Slovak (QWERTY, extended backslash)", "kb_variants"),
tr("Slovak (extended backslash)", "kb_variants"),
tr("Slovenian (US)", "kb_variants"),
tr("Slovenian (with guillemets)", "kb_variants"),
tr("Spanish (Dvorak)", "kb_variants"),
tr("Spanish (Latin American, Colemak for gaming)", "kb_variants"),
tr("Spanish (Latin American, Colemak)", "kb_variants"),
tr("Spanish (Latin American, Dvorak)", "kb_variants"),
tr("Spanish (Latin American, Sun dead keys)", "kb_variants"),
tr("Spanish (Latin American, dead tilde)", "kb_variants"),
tr("Spanish (Latin American, no dead keys)", "kb_variants"),
tr("Spanish (Macintosh)", "kb_variants"),
tr("Spanish (Sun dead keys)", "kb_variants"),
tr("Spanish (Windows)", "kb_variants"),
tr("Spanish (dead tilde)", "kb_variants"),
tr("Spanish (no dead keys)", "kb_variants"),
tr("Swedish (Dvorak)", "kb_variants"),
tr("Swedish (Dvorak, intl.)", "kb_variants"),
tr("Swedish (Macintosh)", "kb_variants"),
tr("Swedish (Svdvorak)", "kb_variants"),
tr("Swedish (US)", "kb_variants"),
tr("Swedish (no dead keys)", "kb_variants"),
tr("Swedish Sign Language", "kb_variants"),
tr("Syriac", "kb_variants"),
tr("Syriac (phonetic)", "kb_variants"),
tr("Taiwanese (indigenous)", "kb_variants"),
tr("Tajik (legacy)", "kb_variants"),
tr("Tamil (Inscript)", "kb_variants"),
tr("Tamil (Sri Lanka, TamilNet '99)", "kb_variants"),
tr("Tamil (Sri Lanka, TamilNet '99, TAB encoding)", "kb_variants"),
tr("Tamil (TamilNet '99 with Tamil numerals)", "kb_variants"),
tr("Tamil (TamilNet '99)", "kb_variants"),
tr("Tamil (TamilNet '99, TAB encoding)", "kb_variants"),
tr("Tamil (TamilNet '99, TSCII encoding)", "kb_variants"),
tr("Tatar", "kb_variants"),
tr("Telugu", "kb_variants"),
tr("Telugu (KaGaPa, phonetic)", "kb_variants"),
tr("Telugu (Sarala)", "kb_variants"),
tr("Thai (Pattachote)", "kb_variants"),
tr("Thai (TIS-820.2538)", "kb_variants"),
tr("Tibetan", "kb_variants"),
tr("Tibetan (with ASCII numerals)", "kb_variants"),
tr("Turkish (Alt-Q)", "kb_variants"),
tr("Turkish (F)", "kb_variants"),
tr("Turkish (Germany)", "kb_variants"),
tr("Turkish (Sun dead keys)", "kb_variants"),
tr("Turkish (intl., with dead keys)", "kb_variants"),
tr("Turkmen (Alt-Q)", "kb_variants"),
tr("Udmurt", "kb_variants"),
tr("Ukrainian (Windows)", "kb_variants"),
tr("Ukrainian (homophonic)", "kb_variants"),
tr("Ukrainian (legacy)", "kb_variants"),
tr("Ukrainian (phonetic)", "kb_variants"),
tr("Ukrainian (standard RSTU)", "kb_variants"),
tr("Ukrainian (typewriter)", "kb_variants"),
tr("Urdu (Pakistan, CRULP)", "kb_variants"),
tr("Urdu (Pakistan, NLA)", "kb_variants"),
tr("Urdu (Windows)", "kb_variants"),
tr("Urdu (alt. phonetic)", "kb_variants"),
tr("Urdu (phonetic)", "kb_variants"),
tr("Uyghur", "kb_variants"),
tr("Uzbek (Afghanistan)", "kb_variants"),
tr("Uzbek (Afghanistan, OLPC)", "kb_variants"),
tr("Uzbek (Latin)", "kb_variants"),
tr("Vietnamese (French)", "kb_variants"),
tr("Vietnamese (US)", "kb_variants"),
tr("Yakut", "kb_variants"),
tr("Yoruba", "kb_variants"),
QString()
};
}
}

View File

@ -11,9 +11,26 @@
#include "KeyboardLayoutModel.h"
#include "utils/Logger.h"
#include "utils/RAII.h"
#include "utils/Retranslator.h"
#include <QTranslator>
#include <algorithm>
static QTranslator* s_kbtranslator = nullptr;
void
retranslateKeyboardModels()
{
if ( !s_kbtranslator )
{
s_kbtranslator = new QTranslator;
}
(void)CalamaresUtils::loadTranslator( QLocale(), QStringLiteral( "kb_" ), s_kbtranslator );
}
XKBListModel::XKBListModel( QObject* parent )
: QAbstractListModel( parent )
{
@ -41,6 +58,14 @@ XKBListModel::data( const QModelIndex& index, int role ) const
switch ( role )
{
case LabelRole:
if ( s_kbtranslator && !s_kbtranslator->isEmpty() && m_contextname )
{
auto s = s_kbtranslator->translate( m_contextname, item.label.toUtf8().data() );
if ( !s.isEmpty() )
{
return s;
}
}
return item.label;
case KeyRole:
return item.key;
@ -93,6 +118,8 @@ XKBListModel::setCurrentIndex( int index )
KeyboardModelsModel::KeyboardModelsModel( QObject* parent )
: XKBListModel( parent )
{
m_contextname = "kb_models";
// The models map is from human-readable names (!) to xkb identifier
const auto models = KeyboardGlobal::getKeyboardModels();
m_list.reserve( models.count() );
@ -110,6 +137,7 @@ KeyboardModelsModel::KeyboardModelsModel( QObject* parent )
}
cDebug() << "Loaded" << m_list.count() << "keyboard models";
setCurrentIndex(); // If pc105 was seen, select it now
}
@ -138,7 +166,18 @@ KeyboardLayoutModel::data( const QModelIndex& index, int role ) const
switch ( role )
{
case Qt::DisplayRole:
return m_layouts.at( index.row() ).second.description;
{
auto description = m_layouts.at( index.row() ).second.description;
if ( s_kbtranslator && !s_kbtranslator->isEmpty() )
{
auto s = s_kbtranslator->translate( "kb_layouts", description.toUtf8().data() );
if ( !s.isEmpty() )
{
return s;
}
}
return description;
}
case KeyboardVariantsRole:
return QVariant::fromValue( m_layouts.at( index.row() ).second.variants );
case KeyboardLayoutKeyRole:
@ -159,6 +198,16 @@ KeyboardLayoutModel::item( const int& index ) const
return m_layouts.at( index );
}
QString
KeyboardLayoutModel::key( int index ) const
{
if ( index >= m_layouts.count() || index < 0 )
{
return QString();
}
return m_layouts.at( index ).first;
}
void
KeyboardLayoutModel::init()
{
@ -207,6 +256,7 @@ KeyboardLayoutModel::currentIndex() const
KeyboardVariantsModel::KeyboardVariantsModel( QObject* parent )
: XKBListModel( parent )
{
m_contextname = "kb_variants";
}
void
@ -219,5 +269,6 @@ KeyboardVariantsModel::setVariants( QMap< QString, QString > variants )
{
m_list << ModelInfo { variants[ key ], key };
}
m_currentIndex = -1;
endResetModel();
}

View File

@ -21,7 +21,6 @@
*
* This model acts like it has a single selection, as well.
*/
class XKBListModel : public QAbstractListModel
{
Q_OBJECT
@ -70,6 +69,7 @@ protected:
};
QVector< ModelInfo > m_list;
int m_currentIndex = -1;
const char* m_contextname = nullptr;
};
@ -118,6 +118,13 @@ public:
int currentIndex() const;
const QPair< QString, KeyboardGlobal::KeyboardInfo > item( const int& index ) const;
/** @brief xkb key for a given index (row)
*
* This is like calling data( QModelIndex( index ), KeyboardLayoutKeyRole ).toString(),
* but shorter and faster. Can return an empty string if index is invalid.
*/
QString key( int index ) const;
protected:
QHash< int, QByteArray > roleNames() const override;
@ -146,4 +153,8 @@ public:
void setVariants( QMap< QString, QString > variants );
};
/** @brief Adjust to changes in application language.
*/
void retranslateKeyboardModels();
#endif // KEYBOARDLAYOUTMODEL_H

View File

@ -70,8 +70,9 @@ KeyboardPage::KeyboardPage( Config* config, QWidget* parent )
cDebug() << "Variants now" << model->rowCount() << model->currentIndex();
}
connect(
ui->buttonRestore, &QPushButton::clicked, [config = config] { config->keyboardModels()->setCurrentIndex(); } );
connect( ui->buttonRestore, &QPushButton::clicked, [ config = config ] {
config->keyboardModels()->setCurrentIndex();
} );
connect( ui->physicalModelSelector,
QOverload< int >::of( &QComboBox::currentIndexChanged ),
@ -82,23 +83,35 @@ KeyboardPage::KeyboardPage( Config* config, QWidget* parent )
ui->physicalModelSelector,
&QComboBox::setCurrentIndex );
connect( ui->layoutSelector->selectionModel(),
&QItemSelectionModel::currentChanged,
[this]( const QModelIndex& current ) { m_config->keyboardLayouts()->setCurrentIndex( current.row() ); } );
connect( config->keyboardLayouts(), &KeyboardLayoutModel::currentIndexChanged, [this]( int index ) {
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 ) );
m_keyboardPreview->setLayout( m_config->keyboardLayouts()->key( index ) );
m_keyboardPreview->setVariant( m_config->keyboardVariants()->key( m_config->keyboardVariants()->currentIndex() ) );
} );
connect( ui->variantSelector->selectionModel(),
&QItemSelectionModel::currentChanged,
[this]( const QModelIndex& current ) { m_config->keyboardVariants()->setCurrentIndex( current.row() ); } );
connect( config->keyboardVariants(), &KeyboardVariantsModel::currentIndexChanged, [this]( int 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 ) );
m_keyboardPreview->setVariant( m_config->keyboardVariants()->key( index ) );
} );
CALAMARES_RETRANSLATE( ui->retranslateUi( this ); )
CALAMARES_RETRANSLATE_SLOT( &KeyboardPage::retranslate )
}
KeyboardPage::~KeyboardPage()
{
delete ui;
}
void
KeyboardPage::retranslate()
{
ui->retranslateUi( this );
m_config->retranslate();
}

View File

@ -37,6 +37,8 @@ public:
explicit KeyboardPage( Config* config, QWidget* parent = nullptr );
~KeyboardPage() override;
void retranslate();
private:
Ui::Page_Keyboard* ui;
KeyBoardPreview* m_keyboardPreview;

View File

@ -84,12 +84,6 @@ parseKeyboardModels( const char* filepath )
{
QString modelDesc = rx.cap( 2 );
QString model = rx.cap( 1 );
if ( model == "pc105" )
{
modelDesc += " - " + QObject::tr( "Default Keyboard Model" );
}
models.insert( modelDesc, model );
}
}

View File

@ -0,0 +1,96 @@
#! /usr/bin/env python3
#
# === This file is part of Calamares - <https://calamares.io> ===
#
# SPDX-FileCopyrightText: 2020 Adriaan de Groot <groot@kde.org>
# SPDX-License-Identifier: BSD-2-Clause
#
"""
Python3 script to scrape x keyboard layout file and produce translations.
To use this script, you must have a base.lst in a standard location,
/usr/local/share/X11/xkb/rules/base.lst (this is usual on FreeBSD).
Prints out a few tables of keyboard model, layout, variant names for
use in translations.
"""
def scrape_file(file, modelsset, layoutsset, variantsset):
import re
# These RE's match what is in keyboardglobal.cpp
model_re = re.compile("^\\s+(\\S+)\\s+(\\w.*)\n$")
layout_re = re.compile("^\\s+(\\S+)\\s+(\\w.*)\n$")
variant_re = re.compile("^\\s+(\\S+)\\s+(\\S+): (\\w.*)\n$")
MODEL, LAYOUT, VARIANT = range(3)
state = None
for line in file.readlines():
# Handle changes in section
if line.startswith("! model"):
state = MODEL
continue
elif line.startswith("! layout"):
state = LAYOUT
continue
elif line.startswith("! variant"):
state = VARIANT
continue
elif not line.strip():
state = None
# Unchanged from last blank
if state is None:
continue
if state == MODEL:
m = model_re.match(line)
name = m.groups()[1]
modelsset.add(name)
if state == LAYOUT:
l = layout_re.match(line)
name = l.groups()[1]
layoutsset.add(name)
if state == VARIANT:
v = variant_re.match(line)
name = v.groups()[2]
variantsset.add(name)
def write_set(file, label, set):
file.write("/* This returns a reference to local, which is a terrible idea.\n * Good thing it's not meant to be compiled.\n */\n")
# Note {{ is an escaped { for Python string formatting
file.write("class {!s} : public QObject {{\nQ_OBJECT\npublic:\n".format(label))
file.write("\tconst QStringList& table()\n\t{\n\treturn QStringList {\n")
for x in sorted(set):
file.write("""\t\ttr("{!s}", "{!s}"),\n""".format(x, label))
file.write("\t\tQString()\n\t};\n}\n}\n\n")
cpp_header_comment = """/* GENERATED FILE DO NOT EDIT
*
* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: no
* SPDX-License-Identifier: CC0-1.0
*
* This file is derived from base.lst in the Xorg distribution
*
*/
/** THIS FILE EXISTS ONLY FOR TRANSLATIONS PURPOSES **/
// *INDENT-OFF*
// clang-format off
"""
if __name__ == "__main__":
models=set()
layouts=set()
variants=set()
variants.add( "Default" )
with open("/usr/local/share/X11/xkb/rules/base.lst", "r") as f:
scrape_file(f, models, layouts, variants)
with open("KeyboardData_p.cxxtr", "w") as f:
f.write(cpp_header_comment)
write_set(f, "kb_models", models)
write_set(f, "kb_layouts", layouts)
write_set(f, "kb_variants", variants)

View File

@ -5,3 +5,4 @@
#layout additional-layout additional-variant vconsole-keymap
ru us - ruwin_alt_sh-UTF-8
ua us - ua-utf

View File

@ -91,10 +91,16 @@ LocalePage::LocalePage( Config* config, QWidget* parent )
// Set up the location before connecting signals, to avoid a signal
// storm as various parts interact.
m_regionCombo->setModel( m_config->regionModel() );
m_zoneCombo->setModel( m_config->regionalZonesModel() );
locationChanged( m_config->currentLocation() ); // doesn't inform TZ widget
m_tzWidget->setCurrentLocation( m_config->currentLocation() );
{
auto* regions = m_config->regionModel();
auto* zones = m_config->regionalZonesModel();
auto* location = m_config->currentLocation();
zones->setRegion( location->region() );
m_regionCombo->setModel( regions );
m_zoneCombo->setModel( zones );
m_tzWidget->setCurrentLocation( location );
locationChanged( location ); // doesn't inform TZ widget
}
connect( config, &Config::currentLCStatusChanged, m_formatsLabel, &QLabel::setText );
connect( config, &Config::currentLanguageStatusChanged, m_localeLabel, &QLabel::setText );

View File

@ -56,7 +56,7 @@ def mount_partition(root_mount_point, partition, partitions):
raise
fstype = partition.get("fs", "").lower()
if not fstype or fstype == "unformatted":
if fstype == "unformatted":
return
if fstype == "fat16" or fstype == "fat32":

View File

@ -12,10 +12,13 @@
# Extra filesystems to mount. The key's value is a list of entries; each
# entry has four keys:
# - device The device node to mount
# - fs The filesystem type to use
# - fs (optional) The filesystem type to use
# - mountPoint Where to mount the filesystem
# - options (optional) Extra options to pass to mount(8)
#
# The device is not mounted if the mountPoint is unset or if the fs is
# set to unformatted.
#
extraMounts:
- device: proc
fs: proc

View File

@ -190,7 +190,7 @@ Config::setSwapChoice( int c )
{
if ( ( c < SwapChoice::NoSwap ) || ( c > SwapChoice::SwapFile ) )
{
cWarning() << "Instalid swap choice (int)" << c;
cWarning() << "Invalid swap choice (int)" << c;
c = SwapChoice::NoSwap;
}
setSwapChoice( static_cast< SwapChoice >( c ) );

View File

@ -196,7 +196,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO
KPM_PARTITION_FLAG( None ) );
}
PartitionInfo::setFormat( swapPartition, true );
if ( gs->contains( "swapPartitionName" ))
if ( gs->contains( "swapPartitionName" ) )
{
swapPartition->setLabel( gs->value( "swapPartitionName" ).toString() );
}

View File

@ -64,7 +64,8 @@ CreateLayoutsTests::testFixedSizePartition()
QFAIL( qPrintable( "Unable to create / partition" ) );
}
partitions = layout.createPartitions( static_cast< Device* >( &dev ), 0, dev.totalLogical(), nullptr, nullptr, role );
partitions
= layout.createPartitions( static_cast< Device* >( &dev ), 0, dev.totalLogical(), nullptr, nullptr, role );
QCOMPARE( partitions.count(), 1 );
@ -84,7 +85,8 @@ CreateLayoutsTests::testPercentSizePartition()
QFAIL( qPrintable( "Unable to create / partition" ) );
}
partitions = layout.createPartitions( static_cast< Device* >( &dev ), 0, dev.totalLogical(), nullptr, nullptr, role );
partitions
= layout.createPartitions( static_cast< Device* >( &dev ), 0, dev.totalLogical(), nullptr, nullptr, role );
QCOMPARE( partitions.count(), 1 );
@ -114,7 +116,8 @@ CreateLayoutsTests::testMixedSizePartition()
QFAIL( qPrintable( "Unable to create /bkup partition" ) );
}
partitions = layout.createPartitions( static_cast< Device* >( &dev ), 0, dev.totalLogical(), nullptr, nullptr, role );
partitions
= layout.createPartitions( static_cast< Device* >( &dev ), 0, dev.totalLogical(), nullptr, nullptr, role );
QCOMPARE( partitions.count(), 3 );
@ -155,6 +158,4 @@ TestDevice::TestDevice( const QString& name, const qint64 logicalSectorSize, con
}
#endif
TestDevice::~TestDevice()
{
}
TestDevice::~TestDevice() {}

View File

@ -14,36 +14,30 @@
#include "utils/CalamaresUtilsSystem.h"
#include "utils/Logger.h"
#ifdef WITH_KCONFIG
#include <KConfigGroup>
#include <KSharedConfig>
#endif
PlasmaLnfJob::PlasmaLnfJob( const QString& lnfPath, const QString& id )
: m_lnfPath( lnfPath )
, m_id( id )
{
}
PlasmaLnfJob::~PlasmaLnfJob() {}
QString
PlasmaLnfJob::prettyName() const
{
return tr( "Plasma Look-and-Feel Job" );
}
QString
PlasmaLnfJob::prettyStatusMessage() const
{
return prettyName();
}
Calamares::JobResult
PlasmaLnfJob::exec()
{
cDebug() << "Plasma Look-and-Feel Job";
auto system = CalamaresUtils::System::instance();
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
auto* system = CalamaresUtils::System::instance();
auto* gs = Calamares::JobQueue::instance()->globalStorage();
QStringList command( { "sudo",
"-E",
@ -59,8 +53,20 @@ PlasmaLnfJob::exec()
int r = system->targetEnvCall( command );
if ( r )
{
return Calamares::JobResult::error( tr( "Could not select KDE Plasma Look-and-Feel package" ),
tr( "Could not select KDE Plasma Look-and-Feel package" ) );
}
#ifdef WITH_KCONFIG
// This is a workaround for lookandfeeltool **not** writing
// the LookAndFeelPackage key in kdeglobals; this happens
// with the lnftool and Plasma 5.20 (possibly other combinations
// as well).
QString targetConfig = system->targetPath( "/home/" + gs->value( "username" ).toString() + "/.config/kdeglobals" );
KConfigGroup cg( KSharedConfig::openConfig( targetConfig ), "KDE" );
cg.writeEntry( "LookAndFeelPackage", m_id );
#endif
return Calamares::JobResult::ok();
}

View File

@ -24,7 +24,6 @@ public:
~PlasmaLnfJob() override;
QString prettyName() const override;
QString prettyStatusMessage() const override;
Calamares::JobResult exec() override;

View File

@ -14,10 +14,6 @@
#include "utils/PluginFactory.h"
#include "viewpages/ViewStep.h"
#include <QObject>
#include <QUrl>
#include <QVariantMap>
class PlasmaLnfPage;
class PLUGINDLLEXPORT PlasmaLnfViewStep : public Calamares::ViewStep

View File

@ -21,6 +21,18 @@ if( LibPWQuality_FOUND )
add_definitions( -DCHECK_PWQUALITY -DHAVE_LIBPWQUALITY )
endif()
find_package( ICU COMPONENTS uc i18n )
set_package_properties(
ICU PROPERTIES
PURPOSE "Transliteration support for full name to username conversion"
)
if( ICU_FOUND )
list( APPEND USER_EXTRA_LIB ICU::uc ICU::i18n )
include_directories( ${ICU_INCLUDE_DIRS} )
add_definitions( -DHAVE_ICU )
endif()
include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui )
set( _users_src

View File

@ -104,7 +104,6 @@ public:
PWSettingsHolder()
: m_settings( pwquality_default_settings() )
, m_auxerror( nullptr )
{
}
@ -113,27 +112,73 @@ public:
/// Sets an option via the configuration string @p v, <key>=<value> style.
int set( const QString& v ) { return pwquality_set_option( m_settings, v.toUtf8().constData() ); }
/// Checks the given password @p pwd against the current configuration
/** @brief Checks the given password @p pwd against the current configuration
*
* Resets m_errorString and m_errorCount and then sets them appropriately
* so that explanation() can be called afterwards. Sets m_rv as well.
*/
int check( const QString& pwd )
{
void* auxerror = nullptr;
int r = pwquality_check( m_settings, pwd.toUtf8().constData(), nullptr, nullptr, &auxerror );
m_rv = r;
return r;
m_rv = pwquality_check( m_settings, pwd.toUtf8().constData(), nullptr, nullptr, &auxerror );
// Positive return values could be ignored; some negative ones
// place extra information in auxerror, which is a void* and
// which needs interpretation to long- or string-values.
m_errorCount = 0;
m_errorString = QString();
switch ( m_rv )
{
case PWQ_ERROR_CRACKLIB_CHECK:
if ( auxerror )
{
/* Here the string comes from cracklib, don't free? */
m_errorString = mungeString( auxerror );
}
break;
case PWQ_ERROR_MEM_ALLOC:
case PWQ_ERROR_UNKNOWN_SETTING:
case PWQ_ERROR_INTEGER:
case PWQ_ERROR_NON_INT_SETTING:
case PWQ_ERROR_NON_STR_SETTING:
if ( auxerror )
{
m_errorString = mungeString( auxerror );
free( auxerror );
}
break;
case PWQ_ERROR_MIN_DIGITS:
case PWQ_ERROR_MIN_UPPERS:
case PWQ_ERROR_MIN_LOWERS:
case PWQ_ERROR_MIN_OTHERS:
case PWQ_ERROR_MIN_LENGTH:
case PWQ_ERROR_MIN_CLASSES:
case PWQ_ERROR_MAX_CONSECUTIVE:
case PWQ_ERROR_MAX_CLASS_REPEAT:
case PWQ_ERROR_MAX_SEQUENCE:
if ( auxerror )
{
m_errorCount = mungeLong( auxerror );
}
break;
default:
break;
}
return m_rv;
}
bool hasExplanation() const { return m_rv < 0; }
/* This is roughly the same as the function pwquality_strerror,
/** @brief Explain the results of the last call to check()
*
* This is roughly the same as the function pwquality_strerror,
* only with QStrings instead, and using the Qt translation scheme.
* It is used under the terms of the GNU GPL v3 or later, as
* allowed by the libpwquality license (LICENSES/GPLv2+-libpwquality)
*/
QString explanation()
{
void* auxerror = m_auxerror;
m_auxerror = nullptr;
if ( m_rv >= arbitrary_minimum_strength )
{
return QString();
@ -146,12 +191,10 @@ public:
switch ( m_rv )
{
case PWQ_ERROR_MEM_ALLOC:
if ( auxerror )
if ( !m_errorString.isEmpty() )
{
QString s = QCoreApplication::translate( "PWQ", "Memory allocation error when setting '%1'" )
.arg( mungeString( auxerror ) );
free( auxerror );
return s;
return QCoreApplication::translate( "PWQ", "Memory allocation error when setting '%1'" )
.arg( m_errorString );
}
return QCoreApplication::translate( "PWQ", "Memory allocation error" );
case PWQ_ERROR_SAME_PASSWORD:
@ -170,73 +213,75 @@ public:
case PWQ_ERROR_BAD_WORDS:
return QCoreApplication::translate( "PWQ", "The password contains forbidden words in some form" );
case PWQ_ERROR_MIN_DIGITS:
if ( auxerror )
if ( m_errorCount )
{
return QCoreApplication::translate( "PWQ", "The password contains less than %1 digits" )
.arg( mungeLong( auxerror ) );
return QCoreApplication::translate(
"PWQ", "The password contains fewer than %n digits", nullptr, m_errorCount );
}
return QCoreApplication::translate( "PWQ", "The password contains too few digits" );
case PWQ_ERROR_MIN_UPPERS:
if ( auxerror )
if ( m_errorCount )
{
return QCoreApplication::translate( "PWQ", "The password contains less than %1 uppercase letters" )
.arg( mungeLong( auxerror ) );
return QCoreApplication::translate(
"PWQ", "The password contains fewer than %n uppercase letters", nullptr, m_errorCount );
}
return QCoreApplication::translate( "PWQ", "The password contains too few uppercase letters" );
case PWQ_ERROR_MIN_LOWERS:
if ( auxerror )
if ( m_errorCount )
{
return QCoreApplication::translate( "PWQ", "The password contains less than %1 lowercase letters" )
.arg( mungeLong( auxerror ) );
return QCoreApplication::translate(
"PWQ", "The password contains fewer than %n lowercase letters", nullptr, m_errorCount );
}
return QCoreApplication::translate( "PWQ", "The password contains too few lowercase letters" );
case PWQ_ERROR_MIN_OTHERS:
if ( auxerror )
if ( m_errorCount )
{
return QCoreApplication::translate( "PWQ",
"The password contains less than %1 non-alphanumeric characters" )
.arg( mungeLong( auxerror ) );
return QCoreApplication::translate(
"PWQ", "The password contains fewer than %n non-alphanumeric characters", nullptr, m_errorCount );
}
return QCoreApplication::translate( "PWQ", "The password contains too few non-alphanumeric characters" );
case PWQ_ERROR_MIN_LENGTH:
if ( auxerror )
if ( m_errorCount )
{
return QCoreApplication::translate( "PWQ", "The password is shorter than %1 characters" )
.arg( mungeLong( auxerror ) );
return QCoreApplication::translate(
"PWQ", "The password is shorter than %n characters", nullptr, m_errorCount );
}
return QCoreApplication::translate( "PWQ", "The password is too short" );
case PWQ_ERROR_ROTATED:
return QCoreApplication::translate( "PWQ", "The password is just rotated old one" );
return QCoreApplication::translate( "PWQ", "The password is a rotated version of the previous one" );
case PWQ_ERROR_MIN_CLASSES:
if ( auxerror )
if ( m_errorCount )
{
return QCoreApplication::translate( "PWQ", "The password contains less than %1 character classes" )
.arg( mungeLong( auxerror ) );
return QCoreApplication::translate(
"PWQ", "The password contains fewer than %n character classes", nullptr, m_errorCount );
}
return QCoreApplication::translate( "PWQ", "The password does not contain enough character classes" );
case PWQ_ERROR_MAX_CONSECUTIVE:
if ( auxerror )
if ( m_errorCount )
{
return QCoreApplication::translate( "PWQ",
"The password contains more than %1 same characters consecutively" )
.arg( mungeLong( auxerror ) );
return QCoreApplication::translate(
"PWQ", "The password contains more than %n same characters consecutively", nullptr, m_errorCount );
}
return QCoreApplication::translate( "PWQ", "The password contains too many same characters consecutively" );
case PWQ_ERROR_MAX_CLASS_REPEAT:
if ( auxerror )
if ( m_errorCount )
{
return QCoreApplication::translate(
"PWQ", "The password contains more than %1 characters of the same class consecutively" )
.arg( mungeLong( auxerror ) );
"PWQ",
"The password contains more than %n characters of the same class consecutively",
nullptr,
m_errorCount );
}
return QCoreApplication::translate(
"PWQ", "The password contains too many characters of the same class consecutively" );
case PWQ_ERROR_MAX_SEQUENCE:
if ( auxerror )
if ( m_errorCount )
{
return QCoreApplication::translate(
"PWQ", "The password contains monotonic sequence longer than %1 characters" )
.arg( mungeLong( auxerror ) );
"PWQ",
"The password contains monotonic sequence longer than %n characters",
nullptr,
m_errorCount );
}
return QCoreApplication::translate( "PWQ",
"The password contains too long of a monotonic character sequence" );
@ -248,46 +293,34 @@ public:
return QCoreApplication::translate( "PWQ",
"Password generation failed - required entropy too low for settings" );
case PWQ_ERROR_CRACKLIB_CHECK:
if ( auxerror )
if ( !m_errorString.isEmpty() )
{
/* Here the string comes from cracklib, don't free? */
return QCoreApplication::translate( "PWQ", "The password fails the dictionary check - %1" )
.arg( mungeString( auxerror ) );
.arg( m_errorString );
}
return QCoreApplication::translate( "PWQ", "The password fails the dictionary check" );
case PWQ_ERROR_UNKNOWN_SETTING:
if ( auxerror )
if ( !m_errorString.isEmpty() )
{
QString s = QCoreApplication::translate( "PWQ", "Unknown setting - %1" ).arg( mungeString( auxerror ) );
free( auxerror );
return s;
return QCoreApplication::translate( "PWQ", "Unknown setting - %1" ).arg( m_errorString );
}
return QCoreApplication::translate( "PWQ", "Unknown setting" );
case PWQ_ERROR_INTEGER:
if ( auxerror )
if ( !m_errorString.isEmpty() )
{
QString s = QCoreApplication::translate( "PWQ", "Bad integer value of setting - %1" )
.arg( mungeString( auxerror ) );
free( auxerror );
return s;
return QCoreApplication::translate( "PWQ", "Bad integer value of setting - %1" ).arg( m_errorString );
}
return QCoreApplication::translate( "PWQ", "Bad integer value" );
case PWQ_ERROR_NON_INT_SETTING:
if ( auxerror )
if ( !m_errorString.isEmpty() )
{
QString s = QCoreApplication::translate( "PWQ", "Setting %1 is not of integer type" )
.arg( mungeString( auxerror ) );
free( auxerror );
return s;
return QCoreApplication::translate( "PWQ", "Setting %1 is not of integer type" ).arg( m_errorString );
}
return QCoreApplication::translate( "PWQ", "Setting is not of integer type" );
case PWQ_ERROR_NON_STR_SETTING:
if ( auxerror )
if ( !m_errorString.isEmpty() )
{
QString s = QCoreApplication::translate( "PWQ", "Setting %1 is not of string type" )
.arg( mungeString( auxerror ) );
free( auxerror );
return s;
return QCoreApplication::translate( "PWQ", "Setting %1 is not of string type" ).arg( m_errorString );
}
return QCoreApplication::translate( "PWQ", "Setting is not of string type" );
case PWQ_ERROR_CFGFILE_OPEN:
@ -302,9 +335,11 @@ public:
}
private:
pwquality_settings_t* m_settings;
int m_rv;
void* m_auxerror;
QString m_errorString; ///< Textual error from last call to check()
int m_errorCount = 0; ///< Count (used in %n) error from last call to check()
int m_rv = 0; ///< Return value from libpwquality
pwquality_settings_t* m_settings = nullptr;
};
DEFINE_CHECK_FUNC( libpwquality )

View File

@ -24,6 +24,18 @@
#include <QFile>
#include <QRegExp>
#ifdef HAVE_ICU
#include <unicode/translit.h>
#include <unicode/unistr.h>
//Needed for ICU to apply some transliteration ruleset.
//Still needs to be adjusted to fit the needs of the most of users
static const char TRANSLITERATOR_ID[] = "Russian-Latin/BGN;"
"Greek-Latin/UNGEGN;"
"Any-Latin;"
"Latin-ASCII";
#endif
static const QRegExp USERNAME_RX( "^[a-z_][a-z0-9_-]*[$]?$" );
static constexpr const int USERNAME_MAX_LENGTH = 31;
@ -91,7 +103,7 @@ Config::Config( QObject* parent )
connect( this, &Config::requireStrongPasswordsChanged, this, &Config::checkReady );
}
Config::~Config() {}
Config::~Config() { }
void
Config::setUserShell( const QString& shell )
@ -314,6 +326,33 @@ guessProductName()
}
return dmiProduct;
}
#ifdef HAVE_ICU
static QString
transliterate( const QString& input )
{
static auto ue = UErrorCode::U_ZERO_ERROR;
static auto transliterator = std::unique_ptr< icu::Transliterator >(
icu::Transliterator::createInstance( TRANSLITERATOR_ID, UTRANS_FORWARD, ue ) );
if ( ue != UErrorCode::U_ZERO_ERROR )
{
cWarning() << "Can't create transliterator";
//it'll be checked later for non-ASCII characters
return input;
}
icu::UnicodeString transliterable( input.utf16() );
transliterator->transliterate( transliterable );
return QString::fromUtf16( transliterable.getTerminatedBuffer() );
}
#else
static QString
transliterate( const QString& input )
{
return input;
}
#endif
static QString
makeLoginNameSuggestion( const QStringList& parts )
@ -372,8 +411,15 @@ Config::setFullName( const QString& name )
emit fullNameChanged( name );
// Build login and hostname, if needed
QRegExp rx( "[^a-zA-Z0-9 ]", Qt::CaseInsensitive );
QString cleanName = CalamaresUtils::removeDiacritics( name ).toLower().replace( rx, " " ).simplified();
static QRegExp rx( "[^a-zA-Z0-9 ]", Qt::CaseInsensitive );
QString cleanName = CalamaresUtils::removeDiacritics( transliterate( name ) )
.replace( QRegExp( "[-']" ), "" )
.replace( rx, " " )
.toLower()
.simplified();
QStringList cleanParts = cleanName.split( ' ' );
if ( !m_customLoginName )
@ -815,7 +861,7 @@ Config::createJobs() const
Calamares::Job* j;
if ( m_sudoersGroup.isEmpty() )
if ( !m_sudoersGroup.isEmpty() )
{
j = new SetupSudoJob( m_sudoersGroup );
jobs.append( Calamares::job_ptr( j ) );

View File

@ -38,6 +38,7 @@ SetupSudoJob::exec()
{
if ( m_sudoGroup.isEmpty() )
{
cDebug() << "Skipping sudo 10-installer because the sudoGroup is empty.";
return Calamares::JobResult::ok();
}

View File

@ -34,6 +34,9 @@ private Q_SLOTS:
void testReadGroup();
void testCreateGroup();
void testSudoGroup();
void testJobCreation();
};
GroupTests::GroupTests() {}
@ -73,7 +76,8 @@ GroupTests::testReadGroup()
}
}
void GroupTests::testCreateGroup()
void
GroupTests::testCreateGroup()
{
// BUILD_AS_TEST is the source-directory path
QFile fi( QString( "%1/tests/5-issue-1523.conf" ).arg( BUILD_AS_TEST ) );
@ -93,10 +97,80 @@ void GroupTests::testCreateGroup()
Calamares::JobQueue::instance()->globalStorage()->insert( "rootMountPoint", "/" );
SetupGroupsJob j(&c);
SetupGroupsJob j( &c );
QVERIFY( !j.exec() ); // running as regular user this should fail
}
void
GroupTests::testSudoGroup()
{
// Test programmatic changes
{
Config c;
QSignalSpy spy( &c, &Config::sudoersGroupChanged );
QCOMPARE( c.sudoersGroup(), QString() );
c.setSudoersGroup( QStringLiteral( "wheel" ) );
QCOMPARE( c.sudoersGroup(), QStringLiteral( "wheel" ) );
QCOMPARE( spy.count(), 1 ); // Changed to wheel
// Do it again, no change
c.setSudoersGroup( QStringLiteral( "wheel" ) );
QCOMPARE( c.sudoersGroup(), QStringLiteral( "wheel" ) );
QCOMPARE( spy.count(), 1 );
c.setSudoersGroup( QStringLiteral( "roue" ) );
QCOMPARE( c.sudoersGroup(), QStringLiteral( "roue" ) );
QCOMPARE( spy.count(), 2 );
}
// Test config loading
{
Config c;
QSignalSpy spy( &c, &Config::sudoersGroupChanged );
QCOMPARE( c.sudoersGroup(), QString() );
QVariantMap m;
c.setConfigurationMap( m );
QCOMPARE( c.sudoersGroup(), QString() );
QCOMPARE( spy.count(), 0 ); // Unchanged
const auto key = QStringLiteral( "sudoersGroup" );
const auto v0 = QStringLiteral( "wheel" );
const auto v1 = QStringLiteral( "roue" );
m.insert( key, v0 );
c.setConfigurationMap( m );
QCOMPARE( c.sudoersGroup(), v0 );
QCOMPARE( spy.count(), 1 );
}
}
/** @brief Are all the expected jobs (and no others) created?
*
* - A sudo job is created only when the sudoers group is set;
* - Groups job
* - User job
* - Password job
* - Root password job
* - Hostname job are always created.
*/
void
GroupTests::testJobCreation()
{
const int expectedJobs = 5;
Config c;
QVERIFY( !c.isReady() );
// Needs some setup
c.setFullName( QStringLiteral( "Goodluck Jonathan" ) );
c.setLoginName( QStringLiteral( "goodj" ) );
QVERIFY( c.isReady() );
QCOMPARE( c.sudoersGroup(), QString() );
QCOMPARE( c.createJobs().count(), expectedJobs );
c.setSudoersGroup( QStringLiteral( "wheel" ) );
QCOMPARE( c.sudoersGroup(), QString( "wheel" ) );
QCOMPARE( c.createJobs().count(), expectedJobs + 1 );
}
QTEST_GUILESS_MAIN( GroupTests )

View File

@ -28,6 +28,19 @@ if( LibPWQuality_FOUND )
add_definitions( -DCHECK_PWQUALITY -DHAVE_LIBPWQUALITY )
endif()
#needed for ${_users}/Config.cpp
find_package( ICU COMPONENTS uc i18n )
set_package_properties(
ICU PROPERTIES
PURPOSE "Transliteration support for full name to username conversion"
)
if( ICU_FOUND )
list( APPEND USER_EXTRA_LIB ICU::uc ICU::i18n )
include_directories( ${ICU_INCLUDE_DIRS} )
add_definitions( -DHAVE_ICU )
endif()
calamares_add_plugin( usersq
TYPE viewmodule
EXPORT_MACRO PLUGINDLLEXPORT_PRO