Compare commits

..

47 Commits

Author SHA1 Message Date
Adriaan de Groot
2ab0041180 [localeq] Repair translation-related typo
This would lead to a runtime error when loading the QML.
2023-11-13 20:10:52 +01:00
Calamares CI
ab6b7102e0 i18n: [python] Automatic merge of Transifex translations 2023-11-13 19:51:20 +01:00
Calamares CI
849ece4bb0 i18n: [calamares] Automatic merge of Transifex translations 2023-11-13 19:51:20 +01:00
Adriaan de Groot
2cf2665b84 Changes: pre-release housekeeping 2023-11-13 19:48:10 +01:00
Adriaan de Groot
6b1226d5ea Merge pull request #2206 from geckolinux/patch-1
Correct the comment description of the "Replace" partition behavior
2023-11-13 19:18:00 +01:00
Adriaan de Groot
eb77b208f8 Merge pull request #2226 from bitigchi/strings
Improve string formatting and context
2023-11-13 19:17:12 +01:00
Adriaan de Groot
1e1e12fad2 Merge branch 'issue-2018' into calamares
FIXES #2018
2023-11-13 00:47:31 +01:00
Adriaan de Groot
196dd55784 [partition] Test mixed-with-overlap settings 2023-11-13 00:40:58 +01:00
Adriaan de Groot
3e758d2d5c [partition] Extend test, fix bug indicated by test
Copy-paste-o, was using wrong string value for minimum size,
found by failing unit test.
2023-11-13 00:37:03 +01:00
Adriaan de Groot
45c11135b8 [partition] Extend tests with more config examples 2023-11-13 00:31:18 +01:00
Adriaan de Groot
d9aeb88275 [libcalamares] Add a clear() to GlobalStorage
While this isn't useful in production, it makes tests a lot
simpler to write since you don't have to wrestle with
creating new GS objects in order to start fresh.
2023-11-12 22:41:02 +01:00
Adriaan de Groot
f07e31de29 [partition] Test for basic legacy configuration 2023-11-12 22:28:27 +01:00
Adriaan de Groot
13acdace42 [partition] Start of tests for config 2023-11-11 23:46:00 +01:00
Emir SARI
37178b2273 Improve context 2023-11-10 13:34:01 +03:00
Adriaan de Groot
85350e63ef [partition] Put EFI settings in a sub-map 2023-11-09 23:31:17 +01:00
Adriaan de Groot
eb08c3facd [partition] Use API for consistent EFI-size GS key
While here, remove the textual entry in GS, which was unused.
2023-11-09 22:29:33 +01:00
Adriaan de Groot
449fba03be [partition] Factor out GS keys for EFI-size sharing 2023-11-09 22:17:51 +01:00
Adriaan de Groot
b06afd9074 [partition] Read minimum EFI size from GS 2023-11-09 22:06:12 +01:00
Adriaan de Groot
b72508546c [partition] Simplify variables for error messages 2023-11-09 21:57:55 +01:00
Adriaan de Groot
2b0c41609d CMake: restore INSTALL_CONFIG 2023-11-09 21:52:12 +01:00
Adriaan de Groot
1e12ad344f Changes: notes on some modifications 2023-11-09 00:34:05 +01:00
Adriaan de Groot
94caa9338a Merge pull request #2230 from Conan-Kudo/ci-fedora-40
CI: Switch Fedora Qt 6 builds to Fedora Linux 40
2023-11-09 00:26:03 +01:00
Neal Gompa
2bd4c19a7d CI: Switch Fedora Qt 6 builds to Fedora Linux 40
Fedora Linux 40 has the necessary components as part of upgrading
to KDE Plasma 6.
2023-11-08 06:42:16 -05:00
Adriaan de Groot
6e9dac3417 libcalamares: apply coding style 2023-11-07 23:43:09 +01:00
Adriaan de Groot
c506808d72 partition: factor out 32_MiB constant 2023-11-07 23:41:10 +01:00
Adriaan de Groot
d0ae922439 partition: introduce accessor for minimum-size EFI 2023-11-07 23:37:31 +01:00
Adriaan de Groot
45529ebdc1 partition: rename API to emphasize recommended and strict-minimum 2023-11-07 23:30:56 +01:00
Adriaan de Groot
bc45f57b48 partition: introduce more settings for EFI size 2023-11-07 22:46:39 +01:00
Adriaan de Groot
ac265e6ff7 Changes: add contributor names 2023-11-07 21:56:49 +01:00
Adriaan de Groot
1051033324 libcalamares: create Python module libcalamares by hand
From inside Calamares, register libcalamares to the
interpreter by hand; from external Python processes
the regular extension library hooks are called.

Tested by running ./build/localmodule dummypython
(which means that the shared library is not present
in the current directory, so then `import libcalamares`
fails if the module is not already registered --
a test scenario that previous attempt at module
import missed).
2023-11-07 21:42:05 +01:00
Adriaan de Groot
a629e2650a libcalamares: importing the embedded python module can fail 2023-11-07 13:40:10 +01:00
Adriaan de Groot
5346008b7a libcalamares: repair names for recent translations
bqi is one possible name of Luri / Lhur language,
as far as I can tell -- there is also Northern Luri,
which is supported by Qt and has code lrc.

ie is Interlingue, which Qt maps to C locale.
Work around that by mapping it to interlingua.
2023-11-07 13:25:37 +01:00
Adriaan de Groot
cb42b3af6a i18n: update language list 2023-11-07 13:13:26 +01:00
Calamares CI
bcd753c28b i18n: [python] Automatic merge of Transifex translations 2023-11-07 13:13:26 +01:00
Calamares CI
637084511e i18n: [calamares] Automatic merge of Transifex translations 2023-11-07 13:13:26 +01:00
Adriaan de Groot
32f8a3cbac i18n: adapt txstats to newer Transifex API
The language list hasn't updated in a long time, and the API
changed underneath. Update the getter -- while at it, this
changes the "completion" criterium to count only the strings
in Calamares itself, not the fdo + python bits too.
2023-11-07 12:57:39 +01:00
Adriaan de Groot
d2c3f7a326 libcalamares: improve formatting of Qt error messages
These come through without function information, but we
can format them in one line by mis-using function info.
2023-11-07 00:53:10 +01:00
Adriaan de Groot
b57db97412 libcalamares: massage logging
Make the log-to-file always follow columns (with time
at the start of each line) so that stdout and the
log file look more alike.
2023-11-07 00:53:10 +01:00
Adriaan de Groot
cdd50681cd calamares: log settings and logfile paths again
When setting up the application, output goes to stdout,
so do it again once the logfile is configured, so that
these specific settings are in the log file as well.
2023-11-07 00:53:10 +01:00
Adriaan de Groot
18689074a8 libcalamares: add accessor for settings path 2023-11-07 00:53:10 +01:00
Adriaan de Groot
cfadf8f95a CI: add a -deps shell script for EndeavourOS 2023-11-07 00:53:10 +01:00
dalto8
ce1ecdba32 Merge pull request #2227 from jpwhiting/work/whiting/dontmountemptysubvolume
If a mountPoint has subvolume: "" don't try to mount the subvolume with a wrong "subvol=," argument.
2023-11-05 18:55:23 +00:00
Adriaan de Groot
848137390e Merge pull request #2228 from jpwhiting/work/whiting/sparsersync
Use rsync option -S
2023-11-04 22:41:17 +01:00
Gaël PORTAY
194ebeba94 Use rsync option -S
The filesystems may contains huge sparse files (for example the docker
data file at path /var/lib/docker/devicemapper/devicemapper/data that is
100G big).

These files causes rsync to fail if the target file-system is too small
to copy them.

The option --sparse tells rsync to turn sequences of nulls into sparse
blocks.

        --sparse, -S

        Try to handle sparse files efficiently so they take up less
        space on the destination. If combined with --inplace the file
        created might not end up with sparse blocks with some
        combinations of kernel version and/or filesystem type. If
        --whole-file is in effect (e.g. for a local copy) then it will
        always work because rsync truncates the file prior to writing
        out the updated version.

        Note that versions of rsync older than 3.1.3 will reject the
        combination of --sparse and --inplace.

This adds the rsync short option -S to let rsync handle sparse files.

Fixes:

        18:03:36 [6]: static CalamaresUtils::ProcessResult CalamaresUtils::System::runCommand(CalamaresUtils::System::RunLocation, const QStringList&, const QString&, const QString&, std::chrono::seconds)
            Running "env" ("sync")
            ..  Finished. Exit code: 0
            ..  Target cmd: ("sync") output:

        rsync: [receiver] write failed on "/tmp/calamares-root-81qie5d1/var/lib/docker/devicemapper/devicemapper/data": No space left on device (28)
        rsync error: error in file IO (code 11) at receiver.c(378) [receiver=v3.2.3]

Signed-off-by: Jeremy Whiting <jpwhiting@kde.org>
2023-11-03 09:59:06 -06:00
Jeremy Whiting
deb35d8b49 If a mountPoint has subvolume: "" don't use subvol= arguments.
When testing with a / mountPoint set to subvolume: "" it tried and
failed to mount the subvolume:

    .. Running ("mount", "-t", "btrfs", "-o", "subvol=,", "/dev/sda3", "/tmp/calamares-root-ylvhpxys/")
    .. Target cmd: ("mount", "-t", "btrfs", "-o", "subvol=,", "/dev/sda3", "/tmp/calamares-root-ylvhpxys/") Exit code: 32 output:
 mount: /tmp/calamares-root-ylvhpxys: wrong fs type, bad option, bad superblock on /dev/sda3, missing codepage or helper program, or other error.

This fix makes the following config in mount.conf let us drop out of any
subvolume handling:

btrfsSubvolumes:
    - mountPoint: /
      subvolume: ""
2023-11-03 08:27:36 -06:00
Adriaan de Groot
97da73b170 CI: don't fail the deps-installation scripts
Let CMake detect missing dependencies, one stage later in CI
2023-10-31 16:29:54 +01:00
GeckoLinux
d4accae21b Correct the comment description of the "Replace" partition behavior
The described behavior of the "Replace" option was incorrect, it does not keep the same filesystem type that the partition already had, rather it uses the `defaultFileSystemType` value. See:
https://github.com/calamares/calamares/issues/1970
2023-10-01 19:23:35 -05:00
91 changed files with 10631 additions and 439 deletions

View File

@@ -17,7 +17,7 @@ jobs:
build:
runs-on: ubuntu-latest
container:
image: docker://fedora:39
image: docker://registry.fedoraproject.org/fedora:40
options: --tmpfs /build:rw --user 0:0
steps:
- name: "prepare git"

View File

@@ -8,13 +8,19 @@ changelog -- this log starts with version 3.3.0. See CHANGES-3.2 for
the history of the 3.2 series (2018-05 - 2022-08).
# 3.3.0-alpha5 (unreleased)
# 3.3.0-alpha5 (2023-11-13)
This release contains contributions from (alphabetically by first name):
- Adriaan de Groot
- Alejo Fernandez
- Anke Boersma
- Christophe Marin
- Emir Sari
- Evan James
- Gaël PORTAY
- Gecko Linux
- Jeremy Whiting
- Neal Gompa
## Core ##
- Boost::Python is no longer a dependency, Calamares uses a bundled copy
@@ -25,9 +31,22 @@ This release contains contributions from (alphabetically by first name):
- Coding style now wants clang-format 15 or 16, but no longer needs astyle.
There is also a clang-tidy file for additional styling support.
- Ongoing translation improvements. (thanks Emir)
- Translations for bqi (Luri), es_AR (Castellano), eo (Esperanto),
ka (Georgian). In **non-release** builds (e.g. between releases,
so for developers building directly from git) all translations are
enabled, even the ones with no translations at all.
- The logging format in the `session.log` file and on-screen is now
more similar, although the file contains a lot more per-line information.
- The INSTALL_CONFIG option has been restored. It is still a terrible
idea to fork the repository to modify the config files, and you
probably should have a calamares-config package with those files
instead, there are packaging workflows that can usefully patch-and-
install configuration files. The option defaults to OFF.
## Modules ##
- All QML modules now have a Qt6-compatible set of QML files as well. (thanks Anke)
- *packagechooser* supports AppStream 1.0 API.
- *unpackfs* now uses the `-S` option to rsync for sparse file support. (thanks Jeremy)
# 3.3.0-alpha4 (2023-10-13)

View File

@@ -48,7 +48,7 @@
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
set(CALAMARES_VERSION 3.3.0-alpha5)
set(CALAMARES_RELEASE_MODE OFF) # Set to ON during a release
set(CALAMARES_RELEASE_MODE ON) # Set to ON during a release
if(CMAKE_SCRIPT_MODE_FILE)
include(${CMAKE_CURRENT_LIST_DIR}/CMakeModules/ExtendedVersion.cmake)
@@ -79,6 +79,7 @@ set(CALAMARES_SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}")
#
option(INSTALL_POLKIT "Install Polkit configuration" ON)
option(INSTALL_COMPLETION "Install shell completions" OFF)
option(INSTALL_CONFIG "Install configuration files" OFF)
# When adding WITH_* that affects the ABI offered by libcalamares,
# also update libcalamares/CalamaresConfig.h.in
option(WITH_PYBIND11 "Use bundled pybind11 instead o Boost::Python" ON)
@@ -153,16 +154,16 @@ set(CALAMARES_DESCRIPTION_SUMMARY "The distribution-independent installer framew
# NOTE: update these lines by running `txstats.py`, or for full automation
# `txstats.py -e`. See also
#
# Total 75 languages
set( _tx_complete az az_AZ ca fi_FI fr he hr ja ko lt pt_BR pt_PT
sv tr_TR uk zh_TW )
set( _tx_good as be ca@valencia cs_CZ da de es fa fur hi it_IT ml
nl ru si sk sq tg vi zh_CN )
set( _tx_ok ar ast bg bn el en_GB es_MX et eu gl hu id is mr nb oc
pl ro sl sr sr@latin th )
set( _tx_incomplete eo es_PR gu ie ja-Hira kk kn lo lv mk ne_NP
ta_IN te ur uz zh zh_HK )
# Total 75 languages
# Total 80 languages
set( _tx_complete az_AZ ca en es fi_FI fr he hr ja lt pl sq sv
tr_TR uk zh_TW )
set( _tx_good as az be bg ca@valencia cs_CZ da de fa fur hi is
it_IT ko nl pt_BR pt_PT ru si sk tg vi zh_CN )
set( _tx_ok ar ast bn el en_GB eo es_AR es_MX et eu gl hu id ml mr
nb oc ro sl sr sr@latin th )
set( _tx_incomplete bqi es_PR gu ie ja-Hira ka kk kn lo lv mk ne_NP
ro_RO ta_IN te ur uz zh zh_HK )
# Total 80 languages
### Required versions
#
@@ -507,6 +508,10 @@ if(tx_errors)
endif()
set(CALAMARES_TRANSLATION_LANGUAGES en ${_tx_complete} ${_tx_good} ${_tx_ok})
if(NOT CALAMARES_RELEASE_MODE)
# Outside of release mode, enable all the languages
list(APPEND CALAMARES_TRANSLATION_LANGUAGES ${_tx_incomplete})
endif()
list(SORT CALAMARES_TRANSLATION_LANGUAGES)
add_subdirectory(lang) # i18n tools
@@ -678,6 +683,10 @@ install(FILES calamares.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/application
install(FILES man/calamares.8 DESTINATION ${CMAKE_INSTALL_MANDIR}/man8/)
if(INSTALL_CONFIG)
install(FILES settings.conf DESTINATION share/calamares)
endif()
### Uninstall
#
#

View File

@@ -167,7 +167,14 @@ function( _calamares_add_module_subdirectory_impl )
message( " ${Green}TYPE:${ColorReset} jobmodule" )
message( " ${Green}MODULE_DESTINATION:${ColorReset} ${MODULE_DESTINATION}" )
if( MODULE_CONFIG_FILES )
message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => [Build directory only]" )
if (INSTALL_CONFIG)
message(" ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => [Build directory and ${MODULE_DATA_DESTINATION}]")
foreach(_cf ${MODULE_CONFIG_FILES})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${_cf} DESTINATION ${MODULE_DESTINATION})
endforeach()
else()
message(" ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => [Build directory only]")
endif()
endif()
message( "" )
# We copy over the lang directory, if any

View File

@@ -104,7 +104,9 @@ function( calamares_add_plugin )
message( FATAL_ERROR "${Red}NO_CONFIG${ColorReset} is set, with configuration ${Red}${PLUGIN_CONFIG_FILES}${ColorReset}" )
endif()
set( _destination "(unknown)" )
if( NOT PLUGIN_NO_INSTALL )
if(INSTALL_CONFIG AND NOT PLUGIN_NO_INSTALL)
set(_destination "${PLUGIN_DATA_DESTINATION}")
elseif( NOT PLUGIN_NO_INSTALL )
set( _destination "[Build directory only]" )
else()
set( _destination "[Skipping installation]" )
@@ -213,6 +215,9 @@ function( calamares_add_plugin )
message( " ${BoldYellow}Not updating${ColorReset} ${PLUGIN_CONFIG_FILE}" )
set( _warned_config ON )
endif()
if(INSTALL_CONFIG)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_CONFIG_FILE} DESTINATION ${PLUGIN_DATA_DESTINATION})
endif()
endforeach()
if ( _warned_config )
message( "" )

View File

@@ -43,3 +43,4 @@ apt-get -y install \
libpwquality-dev \
libqt5webenginewidgets5 \
qtwebengine5-dev
true

11
ci/deps-endeavouros.sh Executable file
View File

@@ -0,0 +1,11 @@
#! /bin/sh
#
# Install dependencies for building on EndeavourOS
#
# There is no docker image for EndeavoudOS, and the live ISO
# for Cassini Nova is KF5 / Qt5 based, but we can build there.
# It even has most of the build-deps already installed.
pacman -Syu --noconfirm git cmake ninja jq
pacman -S --noconfirm gcc yaml-cpp icu
pacman -S --noconfigm extra-cmake-modules

View File

@@ -3,10 +3,6 @@
# Install dependencies for the nightly-fedora-qt6 build
#
# Add the KF6 repo
dnf install -y 'dnf-command(copr)'
dnf copr enable -y @kdesig/kde-nightly-qt6
yum install -y bison flex git make cmake gcc-c++ ninja-build
yum install -y yaml-cpp-devel libpwquality-devel parted-devel python-devel gettext gettext-devel
yum install -y libicu-devel libatasmart-devel
@@ -15,4 +11,6 @@ yum install -y qt6-qtbase-devel qt6-linguist qt6-qtbase-private-devel qt6-qtdecl
yum install -y kf6-kcoreaddons-devel kf6-kdbusaddons-devel kf6-kcrash-devel
yum install -y polkit-qt6-1-devel appstream-qt-devel
# Runtime dependencies for QML modules
yum install -y kf6-kirigami2-devel qt6-qt5compat-devel
yum install -y kf6-kirigami2-devel || true
yum install -y qt6-qt5compat-devel || true
true

View File

@@ -22,4 +22,4 @@ pacman -S --noconfirm \
"kio" \
"kparts" \
"qtwebengine"
true

View File

@@ -33,3 +33,4 @@ apt-get -y install \
qtdeclarative5-dev \
qttools5-dev \
qttools5-dev-tools
true

View File

@@ -18,3 +18,4 @@ zypper --non-interactive in "qt6-declarative-devel" "cmake(Qt6Concurrent)" "cmak
zypper --non-interactive in "cmake(KF6CoreAddons)" "cmake(KF6DBusAddons)" "cmake(KF6Crash)"
zypper --non-interactive in "cmake(KF6Parts)" # Also installs KF5 things
zypper --non-interactive in "cmake(PolkitQt6-1)"
true

View File

@@ -43,3 +43,4 @@ zypper --non-interactive in \
# Not actual dependencies, but good to have
zypper --non-interactive in python311-PyYAML python311-jsonschema
true

View File

@@ -32,12 +32,31 @@ class TransifexGetter(object):
raise TXError("Could not get Transifex API token")
import requests
r = requests.get("https://api.transifex.com/organizations/calamares/projects/calamares/resources/calamares/", auth=("api", token))
base_url = "https://rest.api.transifex.com/resource_language_stats"
project_filter = "filter[project]=o:calamares:p:calamares"
resource_filter = "filter[resource]=o:calamares:p:calamares:r:calamares"
url = base_url + "?" + project_filter.replace(":", "%3A") + "&" + resource_filter.replace(":", "%3A")
headers = {
"accept": "application/vnd.api+json",
"authorization": "Bearer " + token
}
r = requests.get(url, headers=headers)
if r.status_code != 200:
raise TXError("Could not get Transifex data from API")
j = r.json()
self.languages = j["stats"]
data = j["data"]
self.languages = dict()
for d in data:
translated_count = d["attributes"]["translated_strings"]
total_count = d["attributes"]["total_strings"]
language_key = d["relationships"]["language"]["data"]["id"]
assert language_key.startswith("l:")
language_key = language_key[2:]
self.languages[language_key] = dict(translated=dict(stringcount=translated_count, percentage=(translated_count / total_count)))
def get_tx_credentials(self):

View File

@@ -16,7 +16,7 @@
<message>
<location filename="../src/libcalamares/CalamaresAbout.cpp" line="25"/>
<source>&lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; development is sponsored by &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Liberating Software.</source>
<translation>El desarrollo de &lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; está patrocinado por&lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt; Blue Systems&lt;/a&gt; - Liberador de Software.</translation>
<translation>El desarrollo de &lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; está patrocinado por&lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt; Blue Systems&lt;/a&gt; - Liberando Software.</translation>
</message>
<message>
<location filename="../src/libcalamares/CalamaresAbout.cpp" line="40"/>

4473
lang/calamares_es_AR.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -11,18 +11,18 @@
<message>
<location filename="../src/libcalamares/CalamaresAbout.cpp" line="20"/>
<source>Thanks to &lt;a href="https://calamares.io/team/"&gt;the Calamares team&lt;/a&gt; and the &lt;a href="https://app.transifex.com/calamares/calamares/"&gt;Calamares translators team&lt;/a&gt;.</source>
<translation type="unfinished"/>
<translation>Agradecimientos al&lt;a href="https://calamares.io/team/"&gt;equipo de Calamares&lt;/a&gt; y al &lt;a href="https://app.transifex.com/calamares/calamares/"&gt;equipo de traductores de Calamares&lt;/a&gt;.</translation>
</message>
<message>
<location filename="../src/libcalamares/CalamaresAbout.cpp" line="25"/>
<source>&lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; development is sponsored by &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Liberating Software.</source>
<translation type="unfinished"/>
<translation>El desarrollo de&lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt;está patrocinado por &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Liberating Software.</translation>
</message>
<message>
<location filename="../src/libcalamares/CalamaresAbout.cpp" line="40"/>
<source>Copyright %1-%2 %3 &amp;lt;%4&amp;gt;&lt;br/&gt;</source>
<extracomment>Copyright year-year Name &lt;email-address&gt;</extracomment>
<translation type="unfinished"/>
<translation>Copyright %1-%2 %3 &amp;lt;%4&amp;gt;&lt;br/&gt;</translation>
</message>
</context>
<context>
@@ -214,7 +214,7 @@
<message>
<location filename="../src/libcalamares/ProcessJob.cpp" line="39"/>
<source>Run command '%1' in target system.</source>
<translation type="unfinished"/>
<translation>Ejecutar comando '%1' en el sistema de destino.</translation>
</message>
<message>
<location filename="../src/libcalamares/ProcessJob.cpp" line="39"/>
@@ -265,7 +265,7 @@
<message>
<location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="68"/>
<source>Loading ...</source>
<translation type="unfinished"/>
<translation>Cargando ...</translation>
</message>
<message>
<location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="89"/>
@@ -275,7 +275,7 @@
<message>
<location filename="../src/libcalamaresui/viewpages/QmlViewStep.cpp" line="266"/>
<source>Loading failed.</source>
<translation type="unfinished"/>
<translation>Error al cargar</translation>
</message>
</context>
<context>
@@ -306,7 +306,7 @@
<message>
<location filename="../src/libcalamares/modulesystem/RequirementsChecker.cpp" line="129"/>
<source>System-requirements checking is complete.</source>
<translation>Chequeo de requerimientos del sistema completado.</translation>
<translation>Se ha completado el chequeo de requerimientos del sistema.</translation>
</message>
</context>
<context>
@@ -319,7 +319,7 @@
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="156"/>
<source>Installation Failed</source>
<translation>Instalación Fallida</translation>
<translation>Falló la instalación</translation>
</message>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="159"/>
@@ -793,7 +793,7 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message>
<location filename="../src/modules/locale/Config.cpp" line="410"/>
<source>The system language will be set to %1.</source>
<translation>El lenguaje del sistema será establecido a %1.</translation>
<translation>El idioma del sistema será establecido a %1.</translation>
</message>
<message>
<location filename="../src/modules/locale/Config.cpp" line="417"/>
@@ -858,22 +858,22 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message>
<location filename="../src/modules/welcome/Config.cpp" line="264"/>
<source>&lt;h1&gt;Welcome to the Calamares setup program for %1&lt;/h1&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Bienvenido al programa de instalación de Calamares para %1&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/Config.cpp" line="265"/>
<source>&lt;h1&gt;Welcome to %1 setup&lt;/h1&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Bienvenido a la configuración inicial de %1&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/Config.cpp" line="269"/>
<source>&lt;h1&gt;Welcome to the Calamares installer for %1&lt;/h1&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Bienvenido al instalador Calamares para %1&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/Config.cpp" line="270"/>
<source>&lt;h1&gt;Welcome to the %1 installer&lt;/h1&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Bienvenido al instalador de %1 &lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="235"/>
@@ -933,7 +933,7 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message>
<location filename="../src/modules/finished/Config.cpp" line="142"/>
<source>Installation Failed</source>
<translation>Instalación Fallida</translation>
<translation>Falló la instalación</translation>
</message>
<message>
<location filename="../src/modules/finished/Config.cpp" line="144"/>
@@ -1669,7 +1669,7 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message>
<location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="175"/>
<source>The system does not have enough working memory. At least %1 GiB is required.</source>
<translation type="unfinished"/>
<translation>El sistema no tiene suficiente memoria funcional. Se requiere al menos %1 GiB.</translation>
</message>
<message>
<location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="184"/>
@@ -1709,7 +1709,7 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message>
<location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="213"/>
<source>has a screen large enough to show the whole installer</source>
<translation type="unfinished"/>
<translation>cuenta con una pantalla lo suficientemente grande para mostrar todo el instalador</translation>
</message>
<message>
<location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="217"/>
@@ -1744,7 +1744,7 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message>
<location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="244"/>
<source>is always true</source>
<translation type="unfinished"/>
<translation>siempre es verdad</translation>
</message>
<message>
<location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="245"/>
@@ -1833,7 +1833,7 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message>
<location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="50"/>
<source>Please install KDE Konsole and try again!</source>
<translation>Favor instale la Konsola KDE e intentelo de nuevo!</translation>
<translation>¡Por favor, instale KDE Konsole e intentelo de nuevo!</translation>
</message>
<message>
<location filename="../src/modules/interactiveterminal/InteractiveTerminalPage.cpp" line="122"/>
@@ -2655,7 +2655,7 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message>
<location filename="../src/modules/users/page_usersetup.ui" line="55"/>
<source>Your Full Name</source>
<translation type="unfinished"/>
<translation>Nombre completo</translation>
</message>
<message>
<location filename="../src/modules/users/page_usersetup.ui" line="124"/>
@@ -2680,7 +2680,7 @@ El instalador terminará y se perderán todos los cambios.</translation>
<message>
<location filename="../src/modules/users/page_usersetup.ui" line="250"/>
<source>Computer Name</source>
<translation type="unfinished"/>
<translation>Nombre de la computadora</translation>
</message>
<message>
<location filename="../src/modules/users/page_usersetup.ui" line="325"/>
@@ -4091,7 +4091,7 @@ Salida
<message>
<location filename="../src/modules/finishedq/finishedq.qml" line="36"/>
<source>Installation Completed</source>
<translation type="unfinished"/>
<translation>Instalación terminada</translation>
</message>
<message>
<location filename="../src/modules/finishedq/finishedq.qml" line="43"/>
@@ -4121,7 +4121,7 @@ Salida
<message>
<location filename="../src/modules/finishedq/finishedq@mobile.qml" line="36"/>
<source>Installation Completed</source>
<translation type="unfinished"/>
<translation>Instalación terminada</translation>
</message>
<message>
<location filename="../src/modules/finishedq/finishedq@mobile.qml" line="43"/>
@@ -4209,7 +4209,7 @@ Salida
<message>
<location filename="../src/modules/packagechooserq/packagechooserq.qml" line="59"/>
<source>LibreOffice</source>
<translation type="unfinished"/>
<translation>LibreOffice</translation>
</message>
<message>
<location filename="../src/modules/packagechooserq/packagechooserq.qml" line="108"/>
@@ -4229,7 +4229,7 @@ Salida
<message>
<location filename="../src/modules/packagechooserq/packagechooserq.qml" line="185"/>
<source>Minimal Install</source>
<translation type="unfinished"/>
<translation>Instalación mínima</translation>
</message>
<message>
<location filename="../src/modules/packagechooserq/packagechooserq.qml" line="233"/>
@@ -4285,7 +4285,7 @@ Salida
<message>
<location filename="../src/modules/usersq/usersq.qml" line="63"/>
<source>Your Full Name</source>
<translation type="unfinished"/>
<translation>Nombre completo</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="80"/>
@@ -4310,7 +4310,7 @@ Salida
<message>
<location filename="../src/modules/usersq/usersq.qml" line="138"/>
<source>root is not allowed as username.</source>
<translation type="unfinished"/>
<translation>"root" no está permitido como nombre de usuario.</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="147"/>
@@ -4320,7 +4320,7 @@ Salida
<message>
<location filename="../src/modules/usersq/usersq.qml" line="153"/>
<source>Computer Name</source>
<translation type="unfinished"/>
<translation>Nombre de la computadora</translation>
</message>
<message>
<location filename="../src/modules/usersq/usersq.qml" line="180"/>
@@ -4409,27 +4409,28 @@ Salida
<location filename="../src/modules/welcomeq/welcomeq.qml" line="35"/>
<source>&lt;h3&gt;Welcome to the %1 &lt;quote&gt;%2&lt;/quote&gt; installer&lt;/h3&gt;
&lt;p&gt;This program will ask you some questions and set up %1 on your computer.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h3&gt;Bienvenido al instalador de &lt;quote&gt;%2&lt;/quote&gt;&lt;/h3&gt;
&lt;p&gt;Este programa te hará algunas preguntas y llevará a cabo la configuración de %1 en tu computadora.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/welcomeq.qml" line="66"/>
<source>Support</source>
<translation type="unfinished"/>
<translation>Soporte</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/welcomeq.qml" line="77"/>
<source>Known issues</source>
<translation type="unfinished"/>
<translation>Problemas conocidos</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/welcomeq.qml" line="88"/>
<source>Release notes</source>
<translation type="unfinished"/>
<translation>Notas de publicación</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/welcomeq.qml" line="100"/>
<source>Donate</source>
<translation type="unfinished"/>
<translation>Donaciones</translation>
</message>
</context>
</TS>

View File

@@ -92,7 +92,7 @@
<message>
<location filename="../src/calamares/DebugWindow.ui" line="28"/>
<source>GlobalStorage</source>
<translation>אחסון גלובלי</translation>
<translation>GlobalStorage</translation>
</message>
<message>
<location filename="../src/calamares/DebugWindow.ui" line="38"/>
@@ -252,7 +252,7 @@
<message>
<location filename="../src/libcalamares/PythonJob.cpp" line="270"/>
<source>Main script file %1 for python job %2 is not readable.</source>
<translation>קובץ תסריט הרצה ראשי %1 עבור משימת python %2 לא קריא. </translation>
<translation>קובץ הסקריפט הראשי %1 למשימת ה־python %2 אינו קריא.</translation>
</message>
<message>
<location filename="../src/libcalamares/PythonJob.cpp" line="343"/>
@@ -501,12 +501,12 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/libcalamares/PythonHelper.cpp" line="325"/>
<source>unparseable Python error</source>
<translation>שגיאת Python לא ניתנת לניתוח</translation>
<translation>שגיאת Python שלא ניתנת לניתוח</translation>
</message>
<message>
<location filename="../src/libcalamares/PythonHelper.cpp" line="369"/>
<source>unparseable Python traceback</source>
<translation>עקבה לאחור של Python לא ניתנת לניתוח</translation>
<translation>מעקב לאחור של Python לא ניתן לניתוח</translation>
</message>
<message>
<location filename="../src/libcalamares/PythonHelper.cpp" line="376"/>
@@ -543,7 +543,7 @@ The installer will quit and all changes will be lost.</source>
<location filename="../src/modules/partition/jobs/ChangeFilesystemLabelJob.cpp" line="71"/>
<location filename="../src/modules/partition/jobs/ChangeFilesystemLabelJob.cpp" line="83"/>
<source>The installer failed to update partition table on disk '%1'.</source>
<translation>אשף ההתקנה נכשל בעת עדכון טבלת המחיצות על כונן '%1'.</translation>
<translation>אשף ההתקנה נכשל בעת עדכון טבלת המחיצות על כונן %1.</translation>
</message>
</context>
<context>
@@ -597,7 +597,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1677"/>
<source>Boot loader location:</source>
<translation>מיקום מנהל אתחול המערכת:</translation>
<translation>מקום מנהל אתחול המערכת:</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/ChoicePage.cpp" line="1119"/>
@@ -757,12 +757,12 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="40"/>
<source>Clearing all temporary mounts.</source>
<translation>מבצע מחיקה של כל נקודות העיגון הזמניות.</translation>
<translation>כל נקודות העיגון הזמניות נמחקות.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/ClearTempMountsJob.cpp" line="70"/>
<source>Cleared all temporary mounts.</source>
<translation>בוצעה מחיקה של כל נקודות העיגון הזמניות.</translation>
<translation>כל נקודות העיגון הזמניות נמחקו.</translation>
</message>
</context>
<context>
@@ -798,12 +798,12 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/locale/Config.cpp" line="410"/>
<source>The system language will be set to %1.</source>
<translation>שפת המערכת תוגדר להיות %1.</translation>
<translation>שפת המערכת תהיה %1.</translation>
</message>
<message>
<location filename="../src/modules/locale/Config.cpp" line="417"/>
<source>The numbers and dates locale will be set to %1.</source>
<translation>תבנית של המספרים והתאריכים של המיקום יוגדרו להיות %1.</translation>
<translation>תבנית המספרים והתאריכים של המקום יוגדרו להיות %1.</translation>
</message>
<message>
<location filename="../src/modules/netinstall/Config.cpp" line="53"/>
@@ -1008,7 +1008,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/summary/Config.cpp" line="103"/>
<source>This is an overview of what will happen once you start the install procedure.</source>
<translation>להלן סקירת המאורעות שיתרחשו עם תחילת תהליך ההתקנה.</translation>
<translation>זו סקירה של מה שיקרה לאחר התחלת תהליך ההתקנה.</translation>
</message>
</context>
<context>
@@ -1171,7 +1171,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="69"/>
<source>What kind of partition table do you want to create?</source>
<translation>איזה סוג של טבלת מחיצות ברצונך ליצור?</translation>
<translation>איזה סוג של טבלת מחיצות ליצור?</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/CreatePartitionTableDialog.ui" line="76"/>
@@ -1204,7 +1204,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/jobs/CreatePartitionTableJob.cpp" line="86"/>
<source>The installer failed to create a partition table on %1.</source>
<translation>אשף ההתקנה נכשל בעת יצירת טבלת המחיצות על %1.</translation>
<translation>אשף ההתקנה נכשל ביצירת טבלת מחיצות על %1.</translation>
</message>
</context>
<context>
@@ -1319,27 +1319,27 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="139"/>
<source>This device has a &lt;strong&gt;%1&lt;/strong&gt; partition table.</source>
<translation>על התקן זה קיימת טבלת מחיצות &lt;strong&gt;%1&lt;/strong&gt;.</translation>
<translation>בהתקן זה קיימת טבלת מחיצות מסוג &lt;strong&gt;%1&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="95"/>
<source>This is a &lt;strong&gt;loop&lt;/strong&gt; device.&lt;br&gt;&lt;br&gt;It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem.</source>
<translation>זהו התקן מסוג &lt;strong&gt;loop&lt;/strong&gt;.&lt;br&gt;&lt;br&gt; זהו התקן מדמה ללא טבלת מחיצות אשר מאפשר גישה לקובץ כהתקן בלוק. תצורה מסוג זה בדרך כלל תכיל מערכת קבצים יחידה.</translation>
<translation>זהו התקן מסוג &lt;strong&gt;loop&lt;/strong&gt;.&lt;br&gt;&lt;br&gt; זהו התקן מדומה ללא טבלת מחיצות שמאפשר גישה לקובץ כהתקן אחסון. תצורה מסוג זה בדרך כלל תכיל מערכת קבצים יחידה.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="104"/>
<source>This installer &lt;strong&gt;cannot detect a partition table&lt;/strong&gt; on the selected storage device.&lt;br&gt;&lt;br&gt;The device either has no partition table, or the partition table is corrupted or of an unknown type.&lt;br&gt;This installer can create a new partition table for you, either automatically, or through the manual partitioning page.</source>
<translation>אשף ההתקנה &lt;strong&gt;אינו יכול לזהות את טבלת המחיצות&lt;/strong&gt; על התקן האחסון הנבחר.&lt;br&gt;&lt;br&gt; ההתקן הנבחר לא מכיל טבלת מחיצות, או שטבלת המחיצות הקיימת הושחתה או שסוג הטבלה אינו מוכר.&lt;br&gt; אשף התקנה זה יכול ליצור טבלת מחיצות חדשה עבורך אוטומטית או בדף הגדרת מחיצות באופן ידני.</translation>
<translation>אשף ההתקנה &lt;strong&gt;לא יכול לזהות את טבלת המחיצות&lt;/strong&gt; שבהתקן האחסון הנבחר.&lt;br&gt;&lt;br&gt; ההתקן הנבחר לא מכיל טבלת מחיצות, או שטבלת המחיצות הקיימת הושחתה או שסוג הטבלה אינו מוכר.&lt;br&gt; אשף התקנה זה יכול ליצור טבלת מחיצות חדשה עבורך אוטומטית או בדף הגדרת מחיצות באופן ידני.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="89"/>
<source>&lt;br&gt;&lt;br&gt;This is the recommended partition table type for modern systems which start from an &lt;strong&gt;EFI&lt;/strong&gt; boot environment.</source>
<translation>&lt;br&gt;&lt;br&gt; זהו סוג טבלת מחיצות מועדף במערכות מודרניות, אשר מאותחלות ממחיצת טעינת מערכת &lt;strong&gt;EFI&lt;/strong&gt;.</translation>
<translation>&lt;br&gt;&lt;br&gt; זהו סוג טבלת מחיצות מועדף במערכות מודרניות, אשר נטענות ממחיצת טעינת מערכת &lt;strong&gt;EFI&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="78"/>
<source>&lt;br&gt;&lt;br&gt;This partition table type is only advisable on older systems which start from a &lt;strong&gt;BIOS&lt;/strong&gt; boot environment. GPT is recommended in most other cases.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Warning:&lt;/strong&gt; the MBR partition table is an obsolete MS-DOS era standard.&lt;br&gt;Only 4 &lt;em&gt;primary&lt;/em&gt; partitions may be created, and of those 4, one can be an &lt;em&gt;extended&lt;/em&gt; partition, which may in turn contain many &lt;em&gt;logical&lt;/em&gt; partitions.</source>
<translation>&lt;br&gt;&lt;br&gt;סוג זה של טבלת מחיצות מומלץ לשימוש על מערכות ישנות אשר מאותחלות מסביבת טעינה &lt;strong&gt;BIOS&lt;/strong&gt;. ברוב המקרים האחרים, GPT מומלץ לשימוש.&lt;br&gt;&lt;br&gt;&lt;strong&gt;אזהרה:&lt;/strong&gt; תקן טבלת המחיצות של MBR מיושן מתקופת MS-DOS.&lt;br&gt; ניתן ליצור אך ורק 4 מחיצות &lt;em&gt;ראשיות&lt;/em&gt;, מתוכן, אחת יכולה להיות מוגדרת כמחיצה &lt;em&gt;מורחבת&lt;/em&gt;, אשר יכולה להכיל מחיצות &lt;em&gt;לוגיות&lt;/em&gt;. </translation>
<translation>&lt;br&gt;&lt;br&gt;סוג זה של טבלת מחיצות מומלץ לשימוש במערכות ישנות שנטענות מסביבת טעינה מסוג &lt;strong&gt;BIOS&lt;/strong&gt;. ברוב המקרים האחרים, מומלץ להשתמש ב־GPT.&lt;br&gt;&lt;br&gt;&lt;strong&gt;אזהרה:&lt;/strong&gt; תקן טבלת המחיצות MBR הוא עוד מתקופת ה־MS-DOS.&lt;br&gt; ניתן ליצור אך ורק 4 מחיצות &lt;em&gt;ראשיות&lt;/em&gt;, מתוכן, אחת יכולה להיות מוגדרת כמחיצה &lt;em&gt;מורחבת&lt;/em&gt;, ויכולה להכיל מחיצות &lt;em&gt;לוגיות&lt;/em&gt;. </translation>
</message>
<message>
<location filename="../src/modules/partition/gui/DeviceInfoWidget.cpp" line="147"/>
@@ -1563,7 +1563,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/jobs/FillGlobalStorageJob.cpp" line="299"/>
<source>Setting up mount points.</source>
<translation>כעת בהגדרת נקודות העיגון.</translation>
<translation>נקודות העיגון מוגדרות.</translation>
</message>
</context>
<context>
@@ -1571,7 +1571,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/finished/FinishedPage.ui" line="102"/>
<source>&amp;Restart now</source>
<translation>ה&amp;פעלה מחדש כעת</translation>
<translation>לה&amp;פעיל מחדש כעת</translation>
</message>
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="75"/>
@@ -1586,7 +1586,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="87"/>
<source>&lt;h1&gt;All done.&lt;/h1&gt;&lt;br/&gt;%1 has been installed on your computer.&lt;br/&gt;You may now restart into your new system, or continue using the %2 Live environment.</source>
<translation>&lt;h1&gt;תהליך ההתקנה הסתיים.&lt;/h1&gt;&lt;br/&gt;%1 הותקן על המחשב שלך.&lt;br/&gt; כעת ניתן לאתחל את המחשב אל תוך המערכת החדשה שהותקנה, או להמשיך להשתמש בסביבה הנוכחית של %2. </translation>
<translation>&lt;h1&gt;תהליך ההתקנה הסתיים.&lt;/h1&gt;&lt;br/&gt;המערכת %1 הותקנה על המחשב שלך.&lt;br/&gt; כעת ניתן לאתחל את המחשב אל תוך המערכת החדשה שהותקנה, או להמשיך להשתמש בסביבה הניסיונית של %2. </translation>
</message>
<message>
<location filename="../src/modules/finished/FinishedPage.cpp" line="92"/>
@@ -1641,7 +1641,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="63"/>
<source>Formatting partition %1 with file system %2.</source>
<translation>כעת בפרמוט המחיצה %1 עם מערכת הקבצים %2.</translation>
<translation>המחיצה %1 עוברת פרמוט למערכת הקבצים %2 כעת.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/FormatPartitionJob.cpp" line="73"/>
@@ -1875,12 +1875,12 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/locale/LCLocaleDialog.cpp" line="23"/>
<source>System locale setting</source>
<translation>הגדרות מיקום המערכת</translation>
<translation>הגדרות מקום המערכת</translation>
</message>
<message>
<location filename="../src/modules/locale/LCLocaleDialog.cpp" line="30"/>
<source>The system locale setting affects the language and character set for some command line user interface elements.&lt;br/&gt;The current setting is &lt;strong&gt;%1&lt;/strong&gt;.</source>
<translation>הגדרת מיקום המערכת משפיעה על השפה וקידוד התווים של חלק מרכיבי ממשקי שורת פקודה למשתמש. &lt;br/&gt; ההגדרה הנוכחית היא &lt;strong&gt;%1&lt;/strong&gt;.</translation>
<translation>הגדרת מקום המערכת משפיעה על השפה וקידוד התווים של חלק מרכיבי ממשקי שורת פקודה למשתמש. &lt;br/&gt; ההגדרה הנוכחית היא &lt;strong&gt;%1&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/locale/LCLocaleDialog.cpp" line="54"/>
@@ -1973,13 +1973,13 @@ The installer will quit and all changes will be lost.</source>
<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&lt;/strong&gt;&lt;br/&gt; מאת %2</translation>
<translation>&lt;strong&gt;מנהל התקן %1&lt;/strong&gt;&lt;br/&gt; מאת %2</translation>
</message>
<message>
<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&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt; מאת %2&lt;/font&gt;</translation>
<translation>&lt;strong&gt;מנהל התקן תצוגה %1&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt; מאת %2&lt;/font&gt;</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="122"/>
@@ -1989,12 +1989,12 @@ The installer will quit and all changes will be lost.</source>
<message>
<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&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt; מאת %2&lt;/font&gt;</translation>
<translation>&lt;strong&gt;מפענח %1&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt; מאת %2&lt;/font&gt;</translation>
</message>
<message>
<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&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt; מאת %2&lt;/font&gt;</translation>
<translation>&lt;strong&gt;חבילת %1&lt;/strong&gt;&lt;br/&gt;&lt;font color="Grey"&gt; מאת %2&lt;/font&gt;</translation>
</message>
<message>
<location filename="../src/modules/license/LicenseWidget.cpp" line="140"/>
@@ -2032,7 +2032,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/locale/LocalePage.cpp" line="131"/>
<source>Zone:</source>
<translation>מיקום:</translation>
<translation>אזור:</translation>
</message>
<message>
<location filename="../src/modules/locale/LocalePage.cpp" line="132"/>
@@ -2046,7 +2046,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/localeq/LocaleQmlViewStep.cpp" line="32"/>
<source>Location</source>
<translation>מיקום</translation>
<translation>מקום</translation>
</message>
</context>
<context>
@@ -2062,7 +2062,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/locale/LocaleViewStep.cpp" line="71"/>
<source>Location</source>
<translation>מיקום</translation>
<translation>מקום</translation>
</message>
</context>
<context>
@@ -2125,7 +2125,7 @@ The installer will quit and all changes will be lost.</source>
<source>Please select your preferred location on the map so the installer can suggest the locale
and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging
to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming.</source>
<translation>נא לבחור את המיקום המועדף עליך במפה כדי שאשף ההתקנה יוכל להציע הגדרות מקומיות
<translation>נא לבחור את המקום המועדף עליך במפה כדי שאשף ההתקנה יוכל להציע הגדרות מקומיות
ואזור זמן עבורך. ניתן להתאים את ההגדרות המוצעות למטה. ניתן לחפש במפה על ידי משיכה להזזתה ובכפתורים +/- כדי להתקרב/להתרחק
או להשתמש בגלילת העכבר לטובת שליטה בתקריב.</translation>
</message>
@@ -2306,7 +2306,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/localeq/Offline.qml" line="240"/>
<source>You can fine-tune Language and Locale settings below.</source>
<translation>ניתן לכוון את הגדרות השפה והמיקום להלן.</translation>
<translation>ניתן לכוון את הגדרות השפה והמקום להלן.</translation>
</message>
</context>
<context>
@@ -2734,7 +2734,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/users/page_usersetup.ui" line="465"/>
<source>Log in automatically without asking for the password.</source>
<translation>כניסה אוטומטית מבלי להישאל על הסיסמה.</translation>
<translation>להיכנס אוטומטית מבלי להידרש למלא סיסמה.</translation>
</message>
<message>
<location filename="../src/modules/users/page_usersetup.ui" line="472"/>
@@ -3117,7 +3117,7 @@ Output:
<message>
<location filename="../src/libcalamares/utils/System.cpp" line="320"/>
<source>Bad parameters for process job call.</source>
<translation>פרמטרים לא תקינים עבור קריאת עיבוד פעולה.</translation>
<translation>משתנים שגויים בקריאה למשימת תהליך.</translation>
</message>
<message>
<location filename="../src/libcalamares/utils/System.cpp" line="324"/>
@@ -3427,7 +3427,7 @@ Output:
<message>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="48"/>
<source>Setting hostname %1.</source>
<translation>כעת בהגדרת שם המארח %1.</translation>
<translation>שם המארח %1 מוגדר כעת.</translation>
</message>
<message>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="121"/>
@@ -3447,29 +3447,29 @@ Output:
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="66"/>
<source>Set keyboard model to %1, layout to %2-%3</source>
<translation>הגדר דגם מקלדת ל %1, פריסת לוח מקשים ל %2-%3</translation>
<translation>הגדר דגם מקלדת ל־%1, פריסת לוח מקשים ל־%2-%3</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="366"/>
<source>Failed to write keyboard configuration for the virtual console.</source>
<translation>נכשלה כתיבת הגדרת מקלדת למסוף הוירטואלי.</translation>
<translation>כתיבת הגדרות המקלדת למסוף הווירטואלי נכשלה.</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="367"/>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="393"/>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="410"/>
<source>Failed to write to %1</source>
<translation>נכשלה כתיבה ל %1</translation>
<translation>הכתיבה אל %1 נכשלה</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="392"/>
<source>Failed to write keyboard configuration for X11.</source>
<translation>נכשלה כתיבת הגדרת מקלדת עבור X11.</translation>
<translation>כתיבת הגדרת מקלדת עבור X11 נכשלה.</translation>
</message>
<message>
<location filename="../src/modules/keyboard/SetKeyboardLayoutJob.cpp" line="409"/>
<source>Failed to write keyboard configuration to existing /etc/default directory.</source>
<translation>נכשלה כתיבת הגדרת מקלדת לתיקיה קיימת /etc/default.</translation>
<translation>כתיבת הגדרת מקלדת לתיקיה קיימת /etc/default נכשלה.</translation>
</message>
</context>
<context>
@@ -3477,7 +3477,7 @@ Output:
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="44"/>
<source>Set flags on partition %1.</source>
<translation>הגדר סימונים על מחיצה %1.</translation>
<translation>הגדרת סימונים על המחיצה %1.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="50"/>
@@ -3502,12 +3502,12 @@ Output:
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="75"/>
<source>Clear flags on new partition.</source>
<translation>מחק סימונים על המחיצה החדשה.</translation>
<translation>מחיקת סימונים מהמחיצה החדשה.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="80"/>
<source>Flag partition &lt;strong&gt;%1&lt;/strong&gt; as &lt;strong&gt;%2&lt;/strong&gt;.</source>
<translation>סמן מחיצה &lt;strong&gt;%1&lt;/strong&gt; כ &lt;strong&gt;%2&lt;/strong&gt;.</translation>
<translation>סימון המחיצה &lt;strong&gt;%1&lt;/strong&gt; בתור &lt;strong&gt;%2&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="89"/>
@@ -3522,7 +3522,7 @@ Output:
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="107"/>
<source>Clearing flags on partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
<translation>מוחק סימונים על מחיצה &lt;strong&gt;%1&lt;/strong&gt;.</translation>
<translation>הסימונים נמחקים מהמחיצה &lt;strong&gt;%1&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="113"/>
@@ -3532,12 +3532,12 @@ Output:
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="118"/>
<source>Clearing flags on new partition.</source>
<translation>מוחק סימונים על מחיצה חדשה.</translation>
<translation>סימונים נמחקים מהמחיצה החדשה.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="123"/>
<source>Setting flags &lt;strong&gt;%2&lt;/strong&gt; on partition &lt;strong&gt;%1&lt;/strong&gt;.</source>
<translation>מגדיר סימונים &lt;strong&gt;%2&lt;/strong&gt; על מחיצה &lt;strong&gt;%1&lt;/strong&gt;.</translation>
<translation>הסימונים &lt;strong&gt;%2&lt;/strong&gt; מוגדרים על המחיצה &lt;strong&gt;%1&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="132"/>
@@ -3547,7 +3547,7 @@ Output:
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="139"/>
<source>Setting flags &lt;strong&gt;%1&lt;/strong&gt; on new partition.</source>
<translation>מגדיר סימונים &lt;strong&gt;%1&lt;/strong&gt; על מחיצה חדשה.</translation>
<translation>הסימונים &lt;strong&gt;%1&lt;/strong&gt; מוגדרים על מחיצה חדשה.</translation>
</message>
<message>
<location filename="../src/modules/partition/jobs/SetPartitionFlagsJob.cpp" line="152"/>
@@ -3560,17 +3560,17 @@ Output:
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="38"/>
<source>Set password for user %1</source>
<translation>הגדר סיסמה עבור משתמש %1</translation>
<translation>הגדרת סיסמת המשתמש %1</translation>
</message>
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="44"/>
<source>Setting password for user %1.</source>
<translation>כעת בהגדרת הסיסמה למשתמש %1.</translation>
<translation>הסיסמה למשתמש %1 מוגדרת כעת.</translation>
</message>
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="77"/>
<source>Bad destination system path.</source>
<translation>יעד נתיב המערכת לא תקין.</translation>
<translation>נתיב מערכת היעד שגוי.</translation>
</message>
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="78"/>
@@ -3580,12 +3580,12 @@ Output:
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="84"/>
<source>Cannot disable root account.</source>
<translation>לא ניתן לנטרל את חשבון המנהל root.</translation>
<translation>לא ניתן להשבית את חשבון המנהל root.</translation>
</message>
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="93"/>
<source>Cannot set password for user %1.</source>
<translation>לא ניתן להגדיר סיסמה עבור משתמש %1.</translation>
<translation>לא ניתן להגדיר למשתמש %1 סיסמה.</translation>
</message>
<message>
<location filename="../src/modules/users/SetPasswordJob.cpp" line="85"/>
@@ -3599,7 +3599,7 @@ Output:
<message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="32"/>
<source>Set timezone to %1/%2</source>
<translation>הגדרת אזור זמן ל %1/%2</translation>
<translation>הגדרת אזור הזמן שיהיה %1/%2</translation>
</message>
<message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="59"/>
@@ -3619,7 +3619,7 @@ Output:
<message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="69"/>
<source>Link creation failed, target: %1; link name: %2</source>
<translation>נכשלה יצירת קיצור דרך, מיקום: %1; שם קיצור הדרך: %2</translation>
<translation>יצירת קיצור דרך נכשלה, מקום: %1; שם קיצור הדרך: %2</translation>
</message>
<message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="74"/>
@@ -3629,7 +3629,7 @@ Output:
<message>
<location filename="../src/modules/locale/SetTimezoneJob.cpp" line="75"/>
<source>Cannot open /etc/timezone for writing</source>
<translation>לא ניתן לפתוח את /etc/timezone לכתיבה</translation>
<translation>לא ניתן לפתוח את /etc/timezone לכתיבה</translation>
</message>
</context>
<context>
@@ -3661,12 +3661,12 @@ Output:
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="70"/>
<source>Cannot chmod sudoers file.</source>
<translation>לא ניתן לשנות את מאפייני קובץ מנהלי המערכת.</translation>
<translation>לא ניתן לשנות את מאפייני קובץ מנהלי המערכת (sudoers).</translation>
</message>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="75"/>
<source>Cannot create sudoers file for writing.</source>
<translation>לא ניתן ליצור את קובץ מנהלי המערכת לכתיבה.</translation>
<translation>לא ניתן ליצור את קובץ מנהלי המערכת (sudoers) לכתיבה.</translation>
</message>
</context>
<context>
@@ -3719,12 +3719,12 @@ Output:
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="100"/>
<source>Installation feedback</source>
<translation>משוב בנושא ההתקנה</translation>
<translation>משוב על ההתקנה</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="106"/>
<source>Sending installation feedback.</source>
<translation>שולח משוב בנושא ההתקנה.</translation>
<translation>שליחת משוב על ההתקנה.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="124"/>
@@ -3734,7 +3734,7 @@ Output:
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="125"/>
<source>HTTP request timed out.</source>
<translation>בקשת HTTP חרגה מזמן ההמתנה המקסימאלי.</translation>
<translation>בקשת HTTP חרגה מזמן ההמתנה המרבי.</translation>
</message>
</context>
<context>
@@ -3771,28 +3771,28 @@ Output:
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="135"/>
<source>Machine feedback</source>
<translation>משוב בנושא עמדת המחשב</translation>
<translation>משוב על עמדת המחשב</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="141"/>
<source>Configuring machine feedback.</source>
<translation>מגדיר משוב בנושא עמדת המחשב.</translation>
<translation>הגדרת משוב על עמדת המחשב.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="164"/>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="173"/>
<source>Error in machine feedback configuration.</source>
<translation>שגיאה בעת הגדרת המשוב בנושא עמדת המחשב.</translation>
<translation>שגיאה בהגדרת המשוב על עמדת המחשב.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="166"/>
<source>Could not configure machine feedback correctly, script error %1.</source>
<translation>לא ניתן להגדיר את המשוב בנושא עמדת המחשב באופן תקין. שגיאת הרצה %1.</translation>
<translation>לא ניתן להגדיר את המשוב על עמדת המחשב כראוי, שגיאת הרצה %1.</translation>
</message>
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="175"/>
<source>Could not configure machine feedback correctly, Calamares error %1.</source>
<translation>לא ניתן להגדיר את המשוב בנושא עמדת המחשב באופן תקין. שגיאת Calamares %1.</translation>
<translation>לא ניתן להגדיר את המשוב על עמדת המחשב כראוי. שגיאת Calamares %1.</translation>
</message>
</context>
<context>

View File

@@ -11,12 +11,12 @@
<message>
<location filename="../src/libcalamares/CalamaresAbout.cpp" line="20"/>
<source>Thanks to &lt;a href="https://calamares.io/team/"&gt;the Calamares team&lt;/a&gt; and the &lt;a href="https://app.transifex.com/calamares/calamares/"&gt;Calamares translators team&lt;/a&gt;.</source>
<translation type="unfinished"/>
<translation>Hvala &lt;a href="https://calamares.io/team/"&gt;Calamares timu&lt;/a&gt; i &lt;a href="https://app.transifex.com/calamares/calamares/"&gt;Calamares timu za prevođenje&lt;/a&gt;.</translation>
</message>
<message>
<location filename="../src/libcalamares/CalamaresAbout.cpp" line="25"/>
<source>&lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; development is sponsored by &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Liberating Software.</source>
<translation type="unfinished"/>
<translation>Razvoj &lt;a href="https://calamares.io/"&gt;Calamaresa&lt;/a&gt;sponzorira &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt;- Liberating Software.</translation>
</message>
<message>
<location filename="../src/libcalamares/CalamaresAbout.cpp" line="40"/>
@@ -2647,7 +2647,7 @@ te korištenjem tipki +/- ili skrolanjem miša za zumiranje.</translation>
<message>
<location filename="../src/modules/keyboard/KeyboardPage.ui" line="153"/>
<source>Keyboard Switch:</source>
<translation type="unfinished"/>
<translation>Prekidač tipkovnice:</translation>
</message>
</context>
<context>

4429
lang/calamares_ro_RO.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -11,12 +11,12 @@
<message>
<location filename="../src/libcalamares/CalamaresAbout.cpp" line="20"/>
<source>Thanks to &lt;a href="https://calamares.io/team/"&gt;the Calamares team&lt;/a&gt; and the &lt;a href="https://app.transifex.com/calamares/calamares/"&gt;Calamares translators team&lt;/a&gt;.</source>
<translation type="unfinished"/>
<translation>Teşekkürler &lt;a href="https://calamares.io/team/"&gt;Calamares takımı&lt;/a&gt; ve &lt;a href="https://app.transifex.com/calamares/calamares/"&gt;Calamares çevirmenleri&lt;/a&gt;.</translation>
</message>
<message>
<location filename="../src/libcalamares/CalamaresAbout.cpp" line="25"/>
<source>&lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; development is sponsored by &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Liberating Software.</source>
<translation type="unfinished"/>
<translation>&lt;a href="https://calamares.io/"&gt;Calamares&lt;/a&gt; gelişim sponsoru &lt;br/&gt;&lt;a href="http://www.blue-systems.com/"&gt;Blue Systems&lt;/a&gt; - Özgür Yazılım.</translation>
</message>
<message>
<location filename="../src/libcalamares/CalamaresAbout.cpp" line="40"/>
@@ -2637,7 +2637,7 @@ Kurulum sürdürülebilir; ancak bazı özellikler devre dışı bırakılabilir
<message>
<location filename="../src/modules/keyboard/KeyboardPage.ui" line="153"/>
<source>Keyboard Switch:</source>
<translation type="unfinished"/>
<translation>Klavye değiştir:</translation>
</message>
</context>
<context>

View File

@@ -0,0 +1,429 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Alejo Fernandez <alejoo.fernandez.2003@gmail.com>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-09-28 22:49+0200\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
"Last-Translator: Alejo Fernandez <alejoo.fernandez.2003@gmail.com>, 2023\n"
"Language-Team: Spanish (Argentina) (https://app.transifex.com/calamares/teams/20061/es_AR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es_AR\n"
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
#: src/modules/bootloader/main.py:46
msgid "Install bootloader."
msgstr "Instalar el cargador de arranque."
#: src/modules/bootloader/main.py:644
msgid "Failed to install grub, no partitions defined in global storage"
msgstr ""
"Error al instalar GRUB; no hay particiones definidas en el almacenamiento "
"global"
#: src/modules/bootloader/main.py:899
msgid "Bootloader installation error"
msgstr "Error al instalar el cargador de arranque"
#: src/modules/bootloader/main.py:900
msgid ""
"The bootloader could not be installed. The installation command "
"<pre>{!s}</pre> returned error code {!s}."
msgstr ""
"El cargador de arranque no se pudo instalar. la orden de instalación "
"<pre>{!s}</pre> lamentablemente devolvió el código de error {!s}."
#: src/modules/displaymanager/main.py:509
msgid "Cannot write LXDM configuration file"
msgstr "No se puede escribir el archivo de configuración LXDM"
#: src/modules/displaymanager/main.py:510
msgid "LXDM config file {!s} does not exist"
msgstr "El archivo de configuracion {!s} de LXDM no existe"
#: src/modules/displaymanager/main.py:598
msgid "Cannot write LightDM configuration file"
msgstr "No se puede escribir el archivo de configuración de LightDM"
#: src/modules/displaymanager/main.py:599
msgid "LightDM config file {!s} does not exist"
msgstr "El archivo de configuración {!s} de LightDM no existe"
#: src/modules/displaymanager/main.py:684
msgid "Cannot configure LightDM"
msgstr "No se puede configurar LightDM"
#: src/modules/displaymanager/main.py:685
msgid "No LightDM greeter installed."
msgstr "No hay ningún GREATER de LightDM instalado."
#: src/modules/displaymanager/main.py:716
msgid "Cannot write SLIM configuration file"
msgstr "No se puede escribir el archivo de configuración de SLIM"
#: src/modules/displaymanager/main.py:717
msgid "SLIM config file {!s} does not exist"
msgstr "El archivo de configuración {!s} de SLIM no existe"
#: src/modules/displaymanager/main.py:935
msgid "No display managers selected for the displaymanager module."
msgstr ""
"No se ha elegido ningún gestor de pantalla para el módulo "
"\"displaymanager»\""
#: src/modules/displaymanager/main.py:936
msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
"La lista de gestores de pantalla está vacía o sin definir tanto en "
"\"globalstorage\" como en \"displaymanager.conf\"."
#: src/modules/displaymanager/main.py:1023
msgid "Display manager configuration was incomplete"
msgstr "La configuración de DISPLAY MANAGER estaba incompleta"
#: src/modules/dracut/main.py:29
msgid "Creating initramfs with dracut."
msgstr "Creando \"initrams\" con \"dracut\"."
#: src/modules/dracut/main.py:63
msgid "Failed to run dracut"
msgstr "Falló al ejecutar dracut"
#: src/modules/dracut/main.py:64
#, python-brace-format
msgid "Dracut failed to run on the target with return code: {return_code}"
msgstr ""
"Dracut falló ejecutarse en el objetivo, lamentablemente con el código de "
"retorno: {return_code}"
#: src/modules/dummypython/main.py:35
msgid "Dummy python job."
msgstr "Trabajo python ficticio."
#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:93
#: src/modules/dummypython/main.py:94
msgid "Dummy python step {}"
msgstr "Paso ficticio de python {}"
#: src/modules/fstab/main.py:28
msgid "Writing fstab."
msgstr "Escribiendo \"fstab\"."
#: src/modules/fstab/main.py:377 src/modules/fstab/main.py:383
#: src/modules/fstab/main.py:411 src/modules/initcpiocfg/main.py:256
#: src/modules/initcpiocfg/main.py:260 src/modules/initramfscfg/main.py:85
#: src/modules/initramfscfg/main.py:89 src/modules/localecfg/main.py:140
#: src/modules/mount/main.py:329 src/modules/networkcfg/main.py:105
#: src/modules/openrcdmcryptcfg/main.py:72
#: src/modules/openrcdmcryptcfg/main.py:76 src/modules/rawfs/main.py:164
msgid "Configuration Error"
msgstr "Error en la configuración"
#: src/modules/fstab/main.py:378 src/modules/initramfscfg/main.py:86
#: src/modules/mount/main.py:330 src/modules/openrcdmcryptcfg/main.py:73
#: src/modules/rawfs/main.py:165
msgid "No partitions are defined for <pre>{!s}</pre> to use."
msgstr "No hay ninguna partición en <pre>{!s}</pre> que se pueda usar."
#: src/modules/fstab/main.py:384 src/modules/initramfscfg/main.py:90
#: src/modules/localecfg/main.py:141 src/modules/networkcfg/main.py:106
#: src/modules/openrcdmcryptcfg/main.py:77
msgid "No root mount point is given for <pre>{!s}</pre> to use."
msgstr "No hay ningún punto de montaje en <pre>{!s}</pre> que se pueda usar."
#: src/modules/fstab/main.py:412
msgid "No <pre>{!s}</pre> configuration is given for <pre>{!s}</pre> to use."
msgstr ""
"No se proporciona ninguna configuración de <pre>{!s}</pre> que "
"<pre>{!s}</pre> pueda usar."
#: src/modules/grubcfg/main.py:29
msgid "Configure GRUB."
msgstr "Configurar GRUB."
#: src/modules/hwclock/main.py:26
msgid "Setting hardware clock."
msgstr "Ajustar el reloj del HARDWARE."
#: src/modules/initcpiocfg/main.py:27
msgid "Configuring mkinitcpio."
msgstr "Configurando \"mkinitcpio\"."
#: src/modules/initcpiocfg/main.py:257
msgid "No partitions are defined for <pre>initcpiocfg</pre>."
msgstr "No se definen particiones para <pre>initcpiocfg</pre>."
#: src/modules/initcpiocfg/main.py:261
msgid "No root mount point for <pre>initcpiocfg</pre>."
msgstr "No hay punto de montaje raíz para <pre>initcpiocfg</pre>."
#: src/modules/initramfscfg/main.py:32
msgid "Configuring initramfs."
msgstr "Configurando initramfs."
#: src/modules/localecfg/main.py:31
msgid "Configuring locales."
msgstr "Configurando locales."
#: src/modules/mkinitfs/main.py:27
msgid "Creating initramfs with mkinitfs."
msgstr "Creando initramfs con mkinitfs."
#: src/modules/mkinitfs/main.py:49
msgid "Failed to run mkinitfs on the target"
msgstr "Hubo un error al ejecutar \"mkinitfs\" en el destino"
#: src/modules/mkinitfs/main.py:50
msgid "The exit code was {}"
msgstr "Lamentablemente el código de salida fue {}"
#: src/modules/mount/main.py:43
msgid "Mounting partitions."
msgstr "Montando particiones."
#: src/modules/mount/main.py:164 src/modules/mount/main.py:200
msgid "Internal error mounting zfs datasets"
msgstr "No se pudieron montar los DATASETS de zfs por un error interno"
#: src/modules/mount/main.py:176
msgid "Failed to import zpool"
msgstr "No se pudo importar el \"zpool\""
#: src/modules/mount/main.py:192
msgid "Failed to unlock zpool"
msgstr "Falló al desbloquear el «zpool»"
#: src/modules/mount/main.py:209 src/modules/mount/main.py:214
msgid "Failed to set zfs mountpoint"
msgstr "Falló al establecer el punto de montaje zfs"
#: src/modules/mount/main.py:365
msgid "zfs mounting error"
msgstr "Error de montaje zfs"
#: src/modules/networkcfg/main.py:29
msgid "Saving network configuration."
msgstr "Guardando configuración de red."
#: src/modules/openrcdmcryptcfg/main.py:26
msgid "Configuring OpenRC dmcrypt service."
msgstr "Configurando el servicio de arranque cifrado \"dmcrypt\" para OpenRC "
#: src/modules/packages/main.py:54 src/modules/packages/main.py:65
#: src/modules/packages/main.py:75
msgid "Install packages."
msgstr "Instalar paquetes."
#: src/modules/packages/main.py:63
#, python-format
msgid "Processing packages (%(count)d / %(total)d)"
msgstr "Procesando paquetes (%(count)d/%(total)d)"
#: src/modules/packages/main.py:68
#, python-format
msgid "Installing one package."
msgid_plural "Installing %(num)d packages."
msgstr[0] "Instalando un paquete."
msgstr[1] "Instalando%(num)d paquetes."
msgstr[2] "Instalando%(num)d paquetes."
#: src/modules/packages/main.py:71
#, python-format
msgid "Removing one package."
msgid_plural "Removing %(num)d packages."
msgstr[0] "Removiendo un paquete."
msgstr[1] "Removiendo %(num)d paquetes."
msgstr[2] "Removiendo %(num)dpaquetes."
#: src/modules/packages/main.py:740 src/modules/packages/main.py:752
#: src/modules/packages/main.py:780
msgid "Package Manager error"
msgstr "Erroe del gestor de paquetes"
#: src/modules/packages/main.py:741
msgid ""
"The package manager could not prepare updates. The command <pre>{!s}</pre> "
"returned error code {!s}."
msgstr ""
"El gestor de paquetes no pudo preparar las actualizaciones. La orden "
"<pre>{!s}</pre> lamentablemente devolvió el código de error {!s}."
#: src/modules/packages/main.py:753
msgid ""
"The package manager could not update the system. The command <pre>{!s}</pre>"
" returned error code {!s}."
msgstr ""
"El gestor de paquetes no pudo actualizar el sistema. La orden "
"<pre>{!s}</pre> lamentablemente devolvió el código de error {!s}."
#: src/modules/packages/main.py:781
msgid ""
"The package manager could not make changes to the installed system. The "
"command <pre>{!s}</pre> returned error code {!s}."
msgstr ""
"El gestor de paquetes no pudo realizar cambios en el sistema a instalar: La "
"orden <pre>{!s}</pre> lamentablemente devolvió el código de error {!s}."
#: src/modules/plymouthcfg/main.py:27
msgid "Configure Plymouth theme"
msgstr "Configurar tema de Plymouth"
#: src/modules/rawfs/main.py:26
msgid "Installing data."
msgstr "Instalando los datos."
#: src/modules/services-openrc/main.py:29
msgid "Configure OpenRC services"
msgstr "Configurar servicios de OpenRC"
#: src/modules/services-openrc/main.py:57
msgid "Cannot add service {name!s} to run-level {level!s}."
msgstr "No se puede añadir el servicio {name!s} a \"run-level\" {level!s}."
#: src/modules/services-openrc/main.py:59
msgid "Cannot remove service {name!s} from run-level {level!s}."
msgstr "No se puede borrar el servicio {name!s} del run-level {level!s}."
#: src/modules/services-openrc/main.py:61
msgid ""
"Unknown service-action <code>{arg!s}</code> for service {name!s} in run-"
"level {level!s}."
msgstr ""
"Acción del \"service-action\" desconocida <code>{arg!s}</code> para el "
"servicio {name!s} en el run-level {level!s}."
#: src/modules/services-openrc/main.py:93
msgid "Cannot modify service"
msgstr "No se puede modificar el servicio."
#: 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> en la raíz cambiada \"chroot\" "
"lamentablemente ha devuelto el código de error {num!s}."
#: src/modules/services-openrc/main.py:101
msgid "Target runlevel does not exist"
msgstr "El RUNLEVEL objetivo no existe"
#: src/modules/services-openrc/main.py:102
msgid ""
"The path for runlevel {level!s} is <code>{path!s}</code>, which does not "
"exist."
msgstr "La ruta para el RUNLEVEL {level!s} es {path!s}, que no existe."
#: src/modules/services-openrc/main.py:110
msgid "Target service does not exist"
msgstr "El servicio de destino no existe"
#: src/modules/services-openrc/main.py:111
msgid ""
"The path for service {name!s} is <code>{path!s}</code>, which does not "
"exist."
msgstr ""
"La ruta para el servicio {name!s} es <code>{path!s}</code>, que no existe."
#: src/modules/services-systemd/main.py:26
msgid "Configure systemd units"
msgstr "Configurar unidades systemd"
#: src/modules/services-systemd/main.py:64
msgid "Cannot modify unit"
msgstr "No se puede modificar la unidad"
#: src/modules/services-systemd/main.py:65
msgid ""
"<code>systemctl {_action!s}</code> call in chroot returned error code "
"{_exit_code!s}."
msgstr ""
"<code>systemctl {_action!s}</code> la llamada en chroot lamentablemente "
"devolvió el código de error {_exit_code!s}."
#: src/modules/services-systemd/main.py:66
msgid "Cannot {_action!s} systemd unit <code>{_name!s}</code>."
msgstr "No se puede {_action!s} unidad systemd<code> {_name!s}</code>."
#: src/modules/unpackfs/main.py:34
msgid "Filling up filesystems."
msgstr "Llenando sistema de archivos."
#: src/modules/unpackfs/main.py:254
msgid "rsync failed with error code {}."
msgstr "Lamentablemente \"rsync\" falló con el código de error {}."
#: src/modules/unpackfs/main.py:299
msgid "Unpacking image {}/{}, file {}/{}"
msgstr "Desempaquetando imagen {}/{}, archivo {}/{}"
#: src/modules/unpackfs/main.py:314
msgid "Starting to unpack {}"
msgstr "Empezando a desempaquetar {}"
#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:467
msgid "Failed to unpack image \"{}\""
msgstr "Falló en desempaquetar la imagen \"{}\""
#: src/modules/unpackfs/main.py:430
msgid "No mount point for root partition"
msgstr "No existe punto de montaje para la partición ROOT"
#: src/modules/unpackfs/main.py:431
msgid "globalstorage does not contain a \"rootMountPoint\" key."
msgstr "Parece que \"globalstorage\" no contiene una clave \"rootMountPoint\"."
#: src/modules/unpackfs/main.py:434
msgid "Bad mount point for root partition"
msgstr "El punto de montaje de la partición ROOT no es correcto"
#: src/modules/unpackfs/main.py:435
msgid "rootMountPoint is \"{}\", which does not exist."
msgstr "\"rootMountPoint\" es «{}», que no existe."
#: src/modules/unpackfs/main.py:439 src/modules/unpackfs/main.py:455
#: src/modules/unpackfs/main.py:459 src/modules/unpackfs/main.py:465
#: src/modules/unpackfs/main.py:480
msgid "Bad unpackfs configuration"
msgstr "La configuración de \"unpackfs\" no es correcta"
#: src/modules/unpackfs/main.py:440
msgid "There is no configuration information."
msgstr "No hay información de configuración."
#: src/modules/unpackfs/main.py:456
msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel"
msgstr ""
"El sistema de archivos para \"{}\" ({}) no es compatible con su kernel "
"actual"
#: src/modules/unpackfs/main.py:460
msgid "The source filesystem \"{}\" does not exist"
msgstr "El sistema de archivos fuente \"{}\" no existe"
#: src/modules/unpackfs/main.py:466
msgid ""
"Failed to find unsquashfs, make sure you have the squashfs-tools package "
"installed."
msgstr ""
"Falló al encontrar unsquashfs, asegúrese de tener instalado el paquete "
"\"squashfs-tools\"."
#: src/modules/unpackfs/main.py:481
msgid "The destination \"{}\" in the target system is not a directory"
msgstr "El destino «{}» en el sistema elegido no es una carpeta"
#: src/modules/zfshostid/main.py:27
msgid "Copying zfs generated hostid."
msgstr "Copiando hostid generado por zfs."

View File

@@ -7,7 +7,7 @@
# Pierfrancesco Passerini <p.passerini@gmail.com>, 2019
# Pietro F. Fontana, 2020
# Saverio <saverio.brancaccio@gmail.com>, 2020
# Giuseppe Pignataro <rogepix@gmail.com>, 2021
# Giuseppe Pignataro (Fastbyte01) <rogepix@gmail.com>, 2021
# Vincenzo Reale <vinx.reale@gmail.com>, 2022
# vincenzo sammarco, 2022
# Paolo Zamponi <feus73@gmail.com>, 2023

View File

@@ -5,7 +5,7 @@
#
# Translators:
# Ji-Hyeon Gim <potatogim@potatogim.net>, 2018
# JungHee Lee <daemul72@gmail.com>, 2023
# Junghee Lee <daemul72@gmail.com>, 2023
#
#, fuzzy
msgid ""
@@ -14,7 +14,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-09-28 22:49+0200\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
"Last-Translator: JungHee Lee <daemul72@gmail.com>, 2023\n"
"Last-Translator: Junghee Lee <daemul72@gmail.com>, 2023\n"
"Language-Team: Korean (https://app.transifex.com/calamares/teams/20061/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"

View File

@@ -0,0 +1,396 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-09-28 22:49+0200\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
"Language-Team: Romanian (Romania) (https://app.transifex.com/calamares/teams/20061/ro_RO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ro_RO\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
#: src/modules/bootloader/main.py:46
msgid "Install bootloader."
msgstr ""
#: src/modules/bootloader/main.py:644
msgid "Failed to install grub, no partitions defined in global storage"
msgstr ""
#: src/modules/bootloader/main.py:899
msgid "Bootloader installation error"
msgstr ""
#: src/modules/bootloader/main.py:900
msgid ""
"The bootloader could not be installed. The installation command "
"<pre>{!s}</pre> returned error code {!s}."
msgstr ""
#: src/modules/displaymanager/main.py:509
msgid "Cannot write LXDM configuration file"
msgstr ""
#: src/modules/displaymanager/main.py:510
msgid "LXDM config file {!s} does not exist"
msgstr ""
#: src/modules/displaymanager/main.py:598
msgid "Cannot write LightDM configuration file"
msgstr ""
#: src/modules/displaymanager/main.py:599
msgid "LightDM config file {!s} does not exist"
msgstr ""
#: src/modules/displaymanager/main.py:684
msgid "Cannot configure LightDM"
msgstr ""
#: src/modules/displaymanager/main.py:685
msgid "No LightDM greeter installed."
msgstr ""
#: src/modules/displaymanager/main.py:716
msgid "Cannot write SLIM configuration file"
msgstr ""
#: src/modules/displaymanager/main.py:717
msgid "SLIM config file {!s} does not exist"
msgstr ""
#: src/modules/displaymanager/main.py:935
msgid "No display managers selected for the displaymanager module."
msgstr ""
#: src/modules/displaymanager/main.py:936
msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
#: src/modules/displaymanager/main.py:1023
msgid "Display manager configuration was incomplete"
msgstr ""
#: src/modules/dracut/main.py:29
msgid "Creating initramfs with dracut."
msgstr ""
#: src/modules/dracut/main.py:63
msgid "Failed to run dracut"
msgstr ""
#: src/modules/dracut/main.py:64
#, python-brace-format
msgid "Dracut failed to run on the target with return code: {return_code}"
msgstr ""
#: src/modules/dummypython/main.py:35
msgid "Dummy python job."
msgstr ""
#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:93
#: src/modules/dummypython/main.py:94
msgid "Dummy python step {}"
msgstr ""
#: src/modules/fstab/main.py:28
msgid "Writing fstab."
msgstr ""
#: src/modules/fstab/main.py:377 src/modules/fstab/main.py:383
#: src/modules/fstab/main.py:411 src/modules/initcpiocfg/main.py:256
#: src/modules/initcpiocfg/main.py:260 src/modules/initramfscfg/main.py:85
#: src/modules/initramfscfg/main.py:89 src/modules/localecfg/main.py:140
#: src/modules/mount/main.py:329 src/modules/networkcfg/main.py:105
#: src/modules/openrcdmcryptcfg/main.py:72
#: src/modules/openrcdmcryptcfg/main.py:76 src/modules/rawfs/main.py:164
msgid "Configuration Error"
msgstr ""
#: src/modules/fstab/main.py:378 src/modules/initramfscfg/main.py:86
#: src/modules/mount/main.py:330 src/modules/openrcdmcryptcfg/main.py:73
#: src/modules/rawfs/main.py:165
msgid "No partitions are defined for <pre>{!s}</pre> to use."
msgstr ""
#: src/modules/fstab/main.py:384 src/modules/initramfscfg/main.py:90
#: src/modules/localecfg/main.py:141 src/modules/networkcfg/main.py:106
#: src/modules/openrcdmcryptcfg/main.py:77
msgid "No root mount point is given for <pre>{!s}</pre> to use."
msgstr ""
#: src/modules/fstab/main.py:412
msgid "No <pre>{!s}</pre> configuration is given for <pre>{!s}</pre> to use."
msgstr ""
#: src/modules/grubcfg/main.py:29
msgid "Configure GRUB."
msgstr ""
#: src/modules/hwclock/main.py:26
msgid "Setting hardware clock."
msgstr ""
#: src/modules/initcpiocfg/main.py:27
msgid "Configuring mkinitcpio."
msgstr ""
#: src/modules/initcpiocfg/main.py:257
msgid "No partitions are defined for <pre>initcpiocfg</pre>."
msgstr ""
#: src/modules/initcpiocfg/main.py:261
msgid "No root mount point for <pre>initcpiocfg</pre>."
msgstr ""
#: src/modules/initramfscfg/main.py:32
msgid "Configuring initramfs."
msgstr ""
#: src/modules/localecfg/main.py:31
msgid "Configuring locales."
msgstr ""
#: src/modules/mkinitfs/main.py:27
msgid "Creating initramfs with mkinitfs."
msgstr ""
#: src/modules/mkinitfs/main.py:49
msgid "Failed to run mkinitfs on the target"
msgstr ""
#: src/modules/mkinitfs/main.py:50
msgid "The exit code was {}"
msgstr ""
#: src/modules/mount/main.py:43
msgid "Mounting partitions."
msgstr ""
#: src/modules/mount/main.py:164 src/modules/mount/main.py:200
msgid "Internal error mounting zfs datasets"
msgstr ""
#: src/modules/mount/main.py:176
msgid "Failed to import zpool"
msgstr ""
#: src/modules/mount/main.py:192
msgid "Failed to unlock zpool"
msgstr ""
#: src/modules/mount/main.py:209 src/modules/mount/main.py:214
msgid "Failed to set zfs mountpoint"
msgstr ""
#: src/modules/mount/main.py:365
msgid "zfs mounting error"
msgstr ""
#: src/modules/networkcfg/main.py:29
msgid "Saving network configuration."
msgstr ""
#: src/modules/openrcdmcryptcfg/main.py:26
msgid "Configuring OpenRC dmcrypt service."
msgstr ""
#: src/modules/packages/main.py:54 src/modules/packages/main.py:65
#: src/modules/packages/main.py:75
msgid "Install packages."
msgstr ""
#: src/modules/packages/main.py:63
#, python-format
msgid "Processing packages (%(count)d / %(total)d)"
msgstr ""
#: src/modules/packages/main.py:68
#, python-format
msgid "Installing one package."
msgid_plural "Installing %(num)d packages."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: src/modules/packages/main.py:71
#, python-format
msgid "Removing one package."
msgid_plural "Removing %(num)d packages."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: src/modules/packages/main.py:740 src/modules/packages/main.py:752
#: src/modules/packages/main.py:780
msgid "Package Manager error"
msgstr ""
#: src/modules/packages/main.py:741
msgid ""
"The package manager could not prepare updates. The command <pre>{!s}</pre> "
"returned error code {!s}."
msgstr ""
#: src/modules/packages/main.py:753
msgid ""
"The package manager could not update the system. The command <pre>{!s}</pre>"
" returned error code {!s}."
msgstr ""
#: src/modules/packages/main.py:781
msgid ""
"The package manager could not make changes to the installed system. The "
"command <pre>{!s}</pre> returned error code {!s}."
msgstr ""
#: src/modules/plymouthcfg/main.py:27
msgid "Configure Plymouth theme"
msgstr ""
#: src/modules/rawfs/main.py:26
msgid "Installing data."
msgstr ""
#: src/modules/services-openrc/main.py:29
msgid "Configure OpenRC services"
msgstr ""
#: src/modules/services-openrc/main.py:57
msgid "Cannot add service {name!s} to run-level {level!s}."
msgstr ""
#: src/modules/services-openrc/main.py:59
msgid "Cannot remove service {name!s} from run-level {level!s}."
msgstr ""
#: src/modules/services-openrc/main.py:61
msgid ""
"Unknown service-action <code>{arg!s}</code> for service {name!s} in run-"
"level {level!s}."
msgstr ""
#: src/modules/services-openrc/main.py:93
msgid "Cannot modify service"
msgstr ""
#: src/modules/services-openrc/main.py:94
msgid ""
"<code>rc-update {arg!s}</code> call in chroot returned error code {num!s}."
msgstr ""
#: src/modules/services-openrc/main.py:101
msgid "Target runlevel does not exist"
msgstr ""
#: src/modules/services-openrc/main.py:102
msgid ""
"The path for runlevel {level!s} is <code>{path!s}</code>, which does not "
"exist."
msgstr ""
#: src/modules/services-openrc/main.py:110
msgid "Target service does not exist"
msgstr ""
#: src/modules/services-openrc/main.py:111
msgid ""
"The path for service {name!s} is <code>{path!s}</code>, which does not "
"exist."
msgstr ""
#: src/modules/services-systemd/main.py:26
msgid "Configure systemd units"
msgstr ""
#: src/modules/services-systemd/main.py:64
msgid "Cannot modify unit"
msgstr ""
#: src/modules/services-systemd/main.py:65
msgid ""
"<code>systemctl {_action!s}</code> call in chroot returned error code "
"{_exit_code!s}."
msgstr ""
#: src/modules/services-systemd/main.py:66
msgid "Cannot {_action!s} systemd unit <code>{_name!s}</code>."
msgstr ""
#: src/modules/unpackfs/main.py:34
msgid "Filling up filesystems."
msgstr ""
#: src/modules/unpackfs/main.py:254
msgid "rsync failed with error code {}."
msgstr ""
#: src/modules/unpackfs/main.py:299
msgid "Unpacking image {}/{}, file {}/{}"
msgstr ""
#: src/modules/unpackfs/main.py:314
msgid "Starting to unpack {}"
msgstr ""
#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:467
msgid "Failed to unpack image \"{}\""
msgstr ""
#: src/modules/unpackfs/main.py:430
msgid "No mount point for root partition"
msgstr ""
#: src/modules/unpackfs/main.py:431
msgid "globalstorage does not contain a \"rootMountPoint\" key."
msgstr ""
#: src/modules/unpackfs/main.py:434
msgid "Bad mount point for root partition"
msgstr ""
#: src/modules/unpackfs/main.py:435
msgid "rootMountPoint is \"{}\", which does not exist."
msgstr ""
#: src/modules/unpackfs/main.py:439 src/modules/unpackfs/main.py:455
#: src/modules/unpackfs/main.py:459 src/modules/unpackfs/main.py:465
#: src/modules/unpackfs/main.py:480
msgid "Bad unpackfs configuration"
msgstr ""
#: src/modules/unpackfs/main.py:440
msgid "There is no configuration information."
msgstr ""
#: src/modules/unpackfs/main.py:456
msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel"
msgstr ""
#: src/modules/unpackfs/main.py:460
msgid "The source filesystem \"{}\" does not exist"
msgstr ""
#: src/modules/unpackfs/main.py:466
msgid ""
"Failed to find unsquashfs, make sure you have the squashfs-tools package "
"installed."
msgstr ""
#: src/modules/unpackfs/main.py:481
msgid "The destination \"{}\" in the target system is not a directory"
msgstr ""
#: src/modules/zfshostid/main.py:27
msgid "Copying zfs generated hostid."
msgstr ""

View File

@@ -66,6 +66,8 @@ CalamaresApplication::init()
{
Logger::setupLogfile();
cDebug() << "Calamares version:" << CALAMARES_VERSION;
cDebug() << Logger::SubEntry << "Using settings:" << Calamares::Settings::instance()->path();
cDebug() << Logger::SubEntry << "Using log file:" << Logger::logFile();
cDebug() << Logger::SubEntry << "languages:" << Calamares::Locale::availableLanguages();
if ( !Calamares::Settings::instance() )

View File

@@ -88,6 +88,13 @@ GlobalStorage::remove( const QString& key )
return nItems;
}
void
GlobalStorage::clear()
{
WriteLock l( this );
m.clear();
}
QVariant
GlobalStorage::value( const QString& key ) const
{

View File

@@ -70,6 +70,9 @@ public:
*/
int remove( const QString& key );
/// @brief Clears all keys in this GS object
void clear();
/** @brief dump keys and values to the debug log
*
* All the keys and their values are written to the debug log.

View File

@@ -76,7 +76,7 @@ public:
* Pass in a suitable error code; using 0 (which would normally mean "ok") instead
* gives you a GenericError code.
*/
static JobResult internalError( const QString& message, const QString& details, int errorCode );
static JobResult internalError( const QString&, const QString& details, int errorCode );
protected:
explicit JobResult( const QString& message, const QString& details, int errorCode );

View File

@@ -258,9 +258,10 @@ PythonJob::exec()
QDir workingDir( m_workingPath );
if ( !workingDir.exists() || !workingDir.isReadable() )
{
return JobResult::error(
tr( "Bad working directory path", "@error" ),
tr( "Working directory %1 for python job %2 is not readable.", "@error" ).arg( m_workingPath ).arg( prettyName() ) );
return JobResult::error( tr( "Bad working directory path", "@error" ),
tr( "Working directory %1 for python job %2 is not readable.", "@error" )
.arg( m_workingPath )
.arg( prettyName() ) );
}
QFileInfo scriptFI( workingDir.absoluteFilePath( m_scriptFile ) );
@@ -339,8 +340,9 @@ PythonJob::exec()
}
bp::handle_exception();
PyErr_Clear();
return JobResult::internalError(
tr( "Boost.Python error in job \"%1\"", "@error" ).arg( prettyName() ), msg, JobResult::PythonUncaughtException );
return JobResult::internalError( tr( "Boost.Python error in job \"%1\"", "@error" ).arg( prettyName() ),
msg,
JobResult::PythonUncaughtException );
}
}

View File

@@ -250,6 +250,7 @@ Settings::Settings( bool debugMode )
Settings::Settings( const QString& settingsFilePath, bool debugMode )
: QObject()
, m_settingsPath( settingsFilePath )
, m_debug( debugMode )
, m_doChroot( true )
, m_promptInstall( false )

View File

@@ -89,6 +89,9 @@ public:
/// @brief Explicif filename, debug is always true (for testing)
static Settings* init( const QString& filename );
/// @brief Get the path this settings was created for (may be empty)
QString path() const { return m_settingsPath; }
QStringList modulesSearchPaths() const;
using InstanceDescriptionList = QList< InstanceDescription >;
@@ -177,6 +180,7 @@ public:
private:
static Settings* s_instance;
QString m_settingsPath;
QStringList m_modulesSearchPaths;

View File

@@ -87,6 +87,21 @@ static constexpr const TranslationSpecialCase special_cases[] = {
QLocale::Script::AnyScript,
QLocale::Country::AnyCountry,
"Lenga d'òc" },
// Luri
{ "bqi",
nullptr,
QLocale::Language::NorthernLuri,
QLocale::Script::AnyScript,
QLocale::Country::AnyCountry,
nullptr },
// Interlingue is mapped to interlingu*a* because
// the real Language::Interlingue acts like C locale.
{ "ie",
nullptr,
QLocale::Language::Interlingua,
QLocale::Script::AnyScript,
QLocale::Country::AnyCountry,
"Interlingue" },
};
static inline bool

View File

@@ -22,6 +22,9 @@
namespace py = pybind11;
// Forward-declare function generated by PYBIND11_MODULE
static void pybind11_init_libcalamares( ::pybind11::module_& variable );
namespace
{
@@ -240,12 +243,49 @@ Job::exec()
py::scoped_interpreter guard {};
// Import, but do not keep the handle lying around
try
{
auto calamaresModule = py::module_::import( "libcalamares" );
// import() only works if the library can be found through
// normal Python import mechanisms -- and after installation,
// libcalamares can not be found. An alternative, like using
// PYBIND11_EMBEDDED_MODULE, falls foul of not being able
// to `import libcalamares` from external Python scripts,
// which are used in tests.
//
// auto calamaresModule = py::module_::import( "libcalamares" );
//
// Using the constructor directly generates compiler warnings
// because this is deprecated.
//
// auto calamaresModule = py::module_("libcalamares");
//
// So create it by hand, using code cribbed from pybind11/embed.h
// to register an extension module. This does not make it
// available to the current interpreter.
//
static ::pybind11::module_::module_def libcalamares_def;
auto calamaresModule = py::module_::create_extension_module( "libcalamares", nullptr, &libcalamares_def );
pybind11_init_libcalamares( calamaresModule );
// Add libcalamares to the main namespace (as if it has already
// been imported) and also to sys.modules under its own name.
// Now `import libcalamares` in modules will find the already-
// loaded module.
auto scope = py::module_::import( "__main__" ).attr( "__dict__" );
scope[ "libcalamares" ] = calamaresModule;
auto sys = scope[ "sys" ].attr( "modules" );
sys[ "libcalamares" ] = calamaresModule;
calamaresModule.attr( "job" ) = Calamares::Python::JobProxy( this );
calamaresModule.attr( "globalstorage" )
= Calamares::Python::GlobalStorageProxy( JobQueue::instance()->globalStorage() );
}
catch ( const py::error_already_set& e )
{
cError() << "Error in import:" << e.what();
throw; // This is non-recoverable
}
if ( s_preScript )
{

View File

@@ -83,7 +83,7 @@ log_enabled( unsigned int level )
}
static void
log_implementation( const char* msg, unsigned int debugLevel, const bool withTime )
log_implementation( const char* msg, unsigned int debugLevel, const char* funcinfo )
{
Calamares::MutexLocker lock( &s_mutex );
@@ -93,18 +93,27 @@ log_implementation( const char* msg, unsigned int debugLevel, const bool withTim
// If we don't format the date as a Qt::ISODate then we get a crash when
// logging at exit as Qt tries to use QLocale to format, but QLocale is
// on its way out.
logfile << date.toUtf8().data() << " - " << time.toUtf8().data() << " [" << debugLevel << "]: " << msg << std::endl;
if ( funcinfo )
{
logfile << date.toUtf8().data() << " - " << time.toUtf8().data() << " [" << debugLevel << "]: " << funcinfo
<< '\n';
}
if ( msg )
{
logfile << date.toUtf8().data() << " - " << time.toUtf8().data() << " [" << debugLevel
<< ( funcinfo ? "]: " : "]: " ) << msg << '\n';
}
logfile.flush();
if ( logLevelEnabled( debugLevel ) )
{
if ( withTime )
if ( funcinfo )
{
std::cout << time.toUtf8().data() << " [" << debugLevel << "]: ";
std::cout << time.toUtf8().data() << " [" << debugLevel << "]: " << funcinfo
<< ( msg ? s_Continuation : "" );
}
// The endl is desired, since it also flushes (like the logfile, above)
std::cout << msg << std::endl;
std::cout << ( msg ? msg : "" ) << std::endl;
}
}
@@ -112,20 +121,25 @@ static void
CalamaresLogHandler( QtMsgType type, const QMessageLogContext&, const QString& msg )
{
unsigned int level = LOGVERBOSE;
const char* funcinfo = nullptr;
switch ( type )
{
case QtInfoMsg:
level = LOGVERBOSE;
funcinfo = "INFO";
break;
case QtDebugMsg:
level = LOGDEBUG;
funcinfo = "DEBUG";
break;
case QtWarningMsg:
level = LOGWARNING;
funcinfo = "WARNING";
break;
case QtCriticalMsg:
case QtFatalMsg:
level = LOGERROR;
funcinfo = "ERROR";
break;
}
@@ -134,7 +148,8 @@ CalamaresLogHandler( QtMsgType type, const QMessageLogContext&, const QString& m
return;
}
log_implementation( msg.toUtf8().constData(), level, true );
log_implementation(
nullptr, level, ( QString( funcinfo ) + QStringLiteral( " (Qt): " ) + msg ).toUtf8().constData() );
}
QString
@@ -202,12 +217,7 @@ CDebug::~CDebug()
{
if ( log_enabled( m_debugLevel ) )
{
if ( m_funcinfo )
{
m_msg.prepend( s_Continuation ); // Prepending, so back-to-front
m_msg.prepend( m_funcinfo );
}
log_implementation( m_msg.toUtf8().data(), m_debugLevel, bool( m_funcinfo ) );
log_implementation( m_msg.toUtf8().data(), m_debugLevel, m_funcinfo );
}
}

View File

@@ -139,17 +139,17 @@ Config::doNotify( bool hasFailed, bool sendAnyway )
QString message;
if ( hasFailed )
{
title = Calamares::Settings::instance()->isSetupMode() ? tr( "Setup Failed" ) : tr( "Installation Failed" );
title = Calamares::Settings::instance()->isSetupMode() ? tr( "Setup Failed", "@title" ) : tr( "Installation Failed", "@title" );
message = Calamares::Settings::instance()->isSetupMode()
? tr( "The setup of %1 did not complete successfully." )
: tr( "The installation of %1 did not complete successfully." );
? tr( "The setup of %1 did not complete successfully.", "@info" )
: tr( "The installation of %1 did not complete successfully.", "@info" );
}
else
{
title = Calamares::Settings::instance()->isSetupMode() ? tr( "Setup Complete" )
: tr( "Installation Complete" );
message = Calamares::Settings::instance()->isSetupMode() ? tr( "The setup of %1 is complete." )
: tr( "The installation of %1 is complete." );
title = Calamares::Settings::instance()->isSetupMode() ? tr( "Setup Complete", "@title" )
: tr( "Installation Complete", "@title" );
message = Calamares::Settings::instance()->isSetupMode() ? tr( "The setup of %1 is complete.", "@info" )
: tr( "The installation of %1 is complete.", "@info" );
}
const auto* branding = Calamares::Branding::instance();

View File

@@ -74,26 +74,26 @@ FinishedPage::retranslate()
{
ui->mainText->setText( tr( "<h1>All done.</h1><br/>"
"%1 has been set up on your computer.<br/>"
"You may now start using your new system." )
"You may now start using your new system.", "@info" )
.arg( branding->versionedName() ) );
ui->restartCheckBox->setToolTip( tr( "<html><head/><body>"
"<p>When this box is checked, your system will "
"restart immediately when you click on "
"<span style=\"font-style:italic;\">Done</span> "
"or close the setup program.</p></body></html>" ) );
"or close the setup program.</p></body></html>", "@tooltip" ) );
}
else
{
ui->mainText->setText( tr( "<h1>All done.</h1><br/>"
"%1 has been installed on your computer.<br/>"
"You may now restart into your new system, or continue "
"using the %2 Live environment." )
"using the %2 Live environment.", "@info" )
.arg( branding->versionedName(), branding->productName() ) );
ui->restartCheckBox->setToolTip( tr( "<html><head/><body>"
"<p>When this box is checked, your system will "
"restart immediately when you click on "
"<span style=\"font-style:italic;\">Done</span> "
"or close the installer.</p></body></html>" ) );
"or close the installer.</p></body></html>", "@tooltip" ) );
}
}
else
@@ -104,7 +104,7 @@ FinishedPage::retranslate()
{
ui->mainText->setText( tr( "<h1>Setup Failed</h1><br/>"
"%1 has not been set up on your computer.<br/>"
"The error message was: %2." )
"The error message was: %2.", "@info, %1 is product name with version" )
.arg( branding->versionedName() )
.arg( message ) );
}
@@ -112,7 +112,7 @@ FinishedPage::retranslate()
{
ui->mainText->setText( tr( "<h1>Installation Failed</h1><br/>"
"%1 has not been installed on your computer.<br/>"
"The error message was: %2." )
"The error message was: %2.", "@info, %1 is product name with version" )
.arg( branding->versionedName() )
.arg( message ) );
}

View File

@@ -43,7 +43,7 @@ FinishedViewStep::~FinishedViewStep()
QString
FinishedViewStep::prettyName() const
{
return tr( "Finish" );
return tr( "Finish", "@label" );
}

View File

@@ -32,7 +32,7 @@ FinishedQmlViewStep::FinishedQmlViewStep( QObject* parent )
QString
FinishedQmlViewStep::prettyName() const
{
return tr( "Finish" );
return tr( "Finish", "@label" );
}
bool

View File

@@ -32,7 +32,7 @@ Page {
horizontalAlignment: Qt.AlignHCenter
color: Kirigami.Theme.textColor
level: 1
text: qsTr("Installation Completed")
text: qsTr("Installation Completed", "@title")
Text {
anchors.top: header.bottom
@@ -40,7 +40,8 @@ Page {
horizontalAlignment: Text.AlignHCenter
font.pointSize: 12
text: qsTr("%1 has been installed on your computer.<br/>
You may now restart into your new system, or continue using the Live environment.").arg(Branding.string(Branding.ProductName))
You may now restart into your new system, or continue using the Live environment.", "@info, %1 is the product name")
.arg(Branding.string(Branding.ProductName))
}
Image {
@@ -61,13 +62,13 @@ Page {
Button {
id: button
text: qsTr("Close Installer")
text: qsTr("Close Installer", "@button")
icon.name: "application-exit"
onClicked: { ViewManager.quit(); }
}
Button {
text: qsTr("Restart System")
text: qsTr("Restart System", "@button")
icon.name: "system-reboot"
onClicked: { config.doRestart(true); }
}
@@ -86,7 +87,7 @@ Page {
anchors.top: parent.top
horizontalAlignment: Text.AlignHCenter
text: qsTr("<p>A full log of the install is available as installation.log in the home directory of the Live user.<br/>
This log is copied to /var/log/installation.log of the target system.</p>")
This log is copied to /var/log/installation.log of the target system.</p>", "@info")
}
}

View File

@@ -33,7 +33,7 @@ Page {
horizontalAlignment: Qt.AlignHCenter
color: Kirigami.Theme.textColor
level: 1
text: qsTr("Installation Completed")
text: qsTr("Installation Completed", "@title")
Text {
anchors.top: header.bottom
@@ -41,7 +41,8 @@ Page {
horizontalAlignment: Text.AlignHCenter
font.pointSize: 12
text: qsTr("%1 has been installed on your computer.<br/>
You may now restart your device.").arg(Branding.string(Branding.ProductName))
You may now restart your device.", "@info, %1 is the product name")
.arg(Branding.string(Branding.ProductName))
}
Image {
@@ -62,13 +63,13 @@ Page {
Button {
id: button
text: qsTr("Close")
text: qsTr("Close", "@button")
icon.name: "application-exit"
onClicked: { ViewManager.quit(); }
}
Button {
text: qsTr("Restart")
text: qsTr("Restart", "@button")
icon.name: "system-reboot"
onClicked: { config.doRestart(true); }
}

View File

@@ -40,7 +40,7 @@ ResizeFSJob::~ResizeFSJob() {}
QString
ResizeFSJob::prettyName() const
{
return tr( "Resize Filesystem Job" );
return tr( "Performing file system resize…", "@status" );
}
ResizeFSJob::PartitionMatch
@@ -159,15 +159,15 @@ ResizeFSJob::exec()
if ( !isValid() )
{
return Calamares::JobResult::error(
tr( "Invalid configuration" ),
tr( "The file-system resize job has an invalid configuration and will not run." ) );
tr( "Invalid configuration", "@error" ),
tr( "The file-system resize job has an invalid configuration and will not run.", "@error" ) );
}
if ( !m_kpmcore )
{
cWarning() << "Could not load KPMCore backend (2).";
return Calamares::JobResult::error( tr( "KPMCore not Available" ),
tr( "Calamares cannot start KPMCore for the file-system resize job." ) );
return Calamares::JobResult::error( tr( "KPMCore not available", "@error" ),
tr( "Calamares cannot start KPMCore for the file system resize job.", "@error" ) );
}
m_kpmcore.backend()->initFSSupport(); // Might not be enough, see below
@@ -176,20 +176,20 @@ ResizeFSJob::exec()
if ( !m.first || !m.second )
{
return Calamares::JobResult::error(
tr( "Resize Failed" ),
tr( "Resize failed.", "@error" ),
!m_fsname.isEmpty()
? tr( "The filesystem %1 could not be found in this system, and cannot be resized." ).arg( m_fsname )
: tr( "The device %1 could not be found in this system, and cannot be resized." ).arg( m_devicename ) );
? tr( "The filesystem %1 could not be found in this system, and cannot be resized.", "@info" ).arg( m_fsname )
: tr( "The device %1 could not be found in this system, and cannot be resized.", "@info" ).arg( m_devicename ) );
}
m.second->fileSystem().init(); // Initialize support for specific FS
if ( !ResizeOperation::canGrow( m.second ) )
{
cDebug() << "canGrow() returned false.";
return Calamares::JobResult::error( tr( "Resize Failed" ),
return Calamares::JobResult::error( tr( "Resize Failed", "@error" ),
!m_fsname.isEmpty()
? tr( "The filesystem %1 cannot be resized." ).arg( m_fsname )
: tr( "The device %1 cannot be resized." ).arg( m_devicename ) );
? tr( "The filesystem %1 cannot be resized.", "@error" ).arg( m_fsname )
: tr( "The device %1 cannot be resized.", "@error" ).arg( m_devicename ) );
}
qint64 new_end = findGrownEnd( m );
@@ -198,10 +198,10 @@ ResizeFSJob::exec()
if ( new_end < 0 )
{
return Calamares::JobResult::error( tr( "Resize Failed" ),
return Calamares::JobResult::error( tr( "Resize Failed", "@error" ),
!m_fsname.isEmpty()
? tr( "The filesystem %1 cannot be resized." ).arg( m_fsname )
: tr( "The device %1 cannot be resized." ).arg( m_devicename ) );
? tr( "The filesystem %1 cannot be resized.", "@error" ).arg( m_fsname )
: tr( "The device %1 cannot be resized.", "@error" ).arg( m_devicename ) );
}
if ( new_end == 0 )
{
@@ -209,9 +209,9 @@ ResizeFSJob::exec()
if ( m_required )
{
return Calamares::JobResult::error(
tr( "Resize Failed" ),
!m_fsname.isEmpty() ? tr( "The filesystem %1 must be resized, but cannot." ).arg( m_fsname )
: tr( "The device %1 must be resized, but cannot" ).arg( m_fsname ) );
tr( "Resize Failed", "@error" ),
!m_fsname.isEmpty() ? tr( "The file system %1 must be resized, but cannot.", "@info" ).arg( m_fsname )
: tr( "The device %1 must be resized, but cannot", "@info" ).arg( m_fsname ) );
}
return Calamares::JobResult::ok();
@@ -228,7 +228,7 @@ ResizeFSJob::exec()
else
{
cDebug() << "Resize failed." << op_report.output();
return Calamares::JobResult::error( tr( "Resize Failed" ), op_report.toText() );
return Calamares::JobResult::error( tr( "Resize Failed", "@error" ), op_report.toText() );
}
}

View File

@@ -36,7 +36,7 @@ HostInfoJob::~HostInfoJob() {}
QString
HostInfoJob::prettyName() const
{
return tr( "Collecting information about your machine." );
return tr( "Collecting information about your machine", "@status" );
}
QString

View File

@@ -28,7 +28,7 @@ InitcpioJob::~InitcpioJob() {}
QString
InitcpioJob::prettyName() const
{
return tr( "Creating initramfs with mkinitcpio." );
return tr( "Creating initramfs with mkinitcpio", "@status" );
}
/** @brief Sets secure permissions on each initramfs

View File

@@ -24,7 +24,7 @@ InitramfsJob::~InitramfsJob() {}
QString
InitramfsJob::prettyName() const
{
return tr( "Creating initramfs." );
return tr( "Creating initramfs", "@status" );
}
Calamares::JobResult

View File

@@ -46,8 +46,8 @@ void
InteractiveTerminalPage::errorKonsoleNotInstalled()
{
QMessageBox mb( QMessageBox::Critical,
tr( "Konsole not installed" ),
tr( "Please install KDE Konsole and try again!" ),
tr( "Konsole not installed.", "@error" ),
tr( "Please install KDE Konsole and try again!", "@info" ),
QMessageBox::Ok );
Calamares::fixButtonLabels( &mb );
mb.exec();
@@ -119,5 +119,5 @@ InteractiveTerminalPage::setCommand( const QString& command )
{
m_command = command;
CALAMARES_RETRANSLATE(
m_headerLabel->setText( tr( "Executing script: &nbsp;<code>%1</code>" ).arg( m_command ) ); );
m_headerLabel->setText( tr( "Executing script: &nbsp;<code>%1</code>", "@info" ).arg( m_command ) ); );
}

View File

@@ -37,7 +37,7 @@ InteractiveTerminalViewStep::~InteractiveTerminalViewStep()
QString
InteractiveTerminalViewStep::prettyName() const
{
return tr( "Script" );
return tr( "Script", "@label" );
}
QWidget*

View File

@@ -502,14 +502,14 @@ QString
Config::prettyStatus() const
{
QString status;
status += tr( "Set keyboard model to %1.<br/>" )
status += tr( "Keyboard model has been set to %1<br/>.", "@label, %1 is keyboard model, as in Apple Magic Keyboard" )
.arg( m_keyboardModelsModel->label( m_keyboardModelsModel->currentIndex() ) );
QString layout = m_keyboardLayoutsModel->item( m_keyboardLayoutsModel->currentIndex() ).second.description;
QString variant = m_keyboardVariantsModel->currentIndex() >= 0
? m_keyboardVariantsModel->label( m_keyboardVariantsModel->currentIndex() )
: QString( "<default>" );
status += tr( "Set keyboard layout to %1/%2." ).arg( layout, variant );
status += tr( "Keyboard layout has been set to %1/%2.", "@label, %1 is layout, %2 is layout variant" ).arg( layout, variant );
return status;
}

View File

@@ -71,7 +71,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Keyboard Model:</string>
<string>Keyboard model:</string>
</property>
</widget>
</item>
@@ -150,7 +150,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Keyboard Switch:</string>
<string>Keyboard switch:</string>
</property>
</widget>
</item>

View File

@@ -38,7 +38,7 @@ KeyboardViewStep::~KeyboardViewStep()
QString
KeyboardViewStep::prettyName() const
{
return tr( "Keyboard" );
return tr( "Keyboard", "@label" );
}

View File

@@ -63,7 +63,8 @@ SetKeyboardLayoutJob::SetKeyboardLayoutJob( const QString& model,
QString
SetKeyboardLayoutJob::prettyName() const
{
return tr( "Set keyboard model to %1, layout to %2-%3" ).arg( m_model ).arg( m_layout ).arg( m_variant );
return tr( "Setting keyboard model to %1, layout as %2-%3", "@status, %1 model, %2 layout, %3 variant" )
.arg( m_model ).arg( m_layout ).arg( m_variant );
}
@@ -364,8 +365,8 @@ SetKeyboardLayoutJob::exec()
if ( !writeVConsoleData( vconsoleConfPath, convertedKeymapPath ) )
{
return Calamares::JobResult::error( tr( "Failed to write keyboard configuration for the virtual console." ),
tr( "Failed to write to %1" ).arg( vconsoleConfPath ) );
return Calamares::JobResult::error( tr( "Failed to write keyboard configuration for the virtual console.", "@error" ),
tr( "Failed to write to %1", "@error, %1 is virtual console configuration path" ).arg( vconsoleConfPath ) );
}
// Get the path to the destination's /etc/X11/xorg.conf.d/00-keyboard.conf
@@ -390,8 +391,8 @@ SetKeyboardLayoutJob::exec()
if ( !writeX11Data( keyboardConfPath ) )
{
return Calamares::JobResult::error( tr( "Failed to write keyboard configuration for X11." ),
tr( "Failed to write to %1" ).arg( keyboardConfPath ) );
return Calamares::JobResult::error( tr( "Failed to write keyboard configuration for X11.", "@error" ),
tr( "Failed to write to %1", "@error, %1 is keyboard configuration path" ).arg( keyboardConfPath ) );
}
}
@@ -407,8 +408,8 @@ SetKeyboardLayoutJob::exec()
if ( !writeDefaultKeyboardData( defaultKeyboardPath ) )
{
return Calamares::JobResult::error(
tr( "Failed to write keyboard configuration to existing /etc/default directory." ),
tr( "Failed to write to %1" ).arg( defaultKeyboardPath ) );
tr( "Failed to write keyboard configuration to existing /etc/default directory.", "@error" ),
tr( "Failed to write to %1", "@error, %1 is default keyboard path" ).arg( defaultKeyboardPath ) );
}
}
}

View File

@@ -29,7 +29,7 @@ KeyboardQmlViewStep::KeyboardQmlViewStep( QObject* parent )
QString
KeyboardQmlViewStep::prettyName() const
{
return tr( "Keyboard" );
return tr( "Keyboard", "@label" );
}
QString

View File

@@ -58,7 +58,7 @@ Item {
Label {
id: header
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("To activate keyboard preview, select a layout.")
text: qsTr("Select a layout to activate keyboard preview", "@label")
color: textColor
font.bold: true
}
@@ -141,7 +141,7 @@ Item {
}
Text {
anchors.centerIn: parent
text: qsTr("<b>Keyboard Model:&nbsp;&nbsp;</b>") + models.currentItem.currentModel.label
text: qsTr("<b>Keyboard model:&nbsp;&nbsp;</b>", "@label") + models.currentItem.currentModel.label
color: textColor
}
Image {
@@ -182,7 +182,7 @@ Item {
z: 2
color:backgroundColor
Text {
text: qsTr("Layout")
text: qsTr("Layout", "@label")
anchors.centerIn: parent
color: textColor
font.bold: true
@@ -255,7 +255,7 @@ Item {
z: 2
color:backgroundColor
Text {
text: qsTr("Variant")
text: qsTr("Variant", "@label")
anchors.centerIn: parent
color: textColor
font.bold: true
@@ -308,7 +308,7 @@ Item {
TextField {
id: textInput
placeholderText: qsTr("Type here to test your keyboard")
placeholderText: qsTr("Type here to test your keyboard…", "@label")
height: 36
width: parent.width / 1.6
horizontalAlignment: TextInput.AlignHCenter

View File

@@ -58,7 +58,7 @@ Item {
Label {
id: header
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("To activate keyboard preview, select a layout.")
text: qsTr("Select a layout to activate keyboard preview", "@label")
color: textColor
font.bold: true
}
@@ -141,7 +141,7 @@ Item {
}
Text {
anchors.centerIn: parent
text: qsTr("<b>Keyboard Model:&nbsp;&nbsp;</b>") + models.currentItem.currentModel.label
text: qsTr("<b>Keyboard model:&nbsp;&nbsp;</b>", "@label") + models.currentItem.currentModel.label
color: textColor
}
Image {
@@ -182,7 +182,7 @@ Item {
z: 2
color:backgroundColor
Text {
text: qsTr("Layout")
text: qsTr("Layout", "@label")
anchors.centerIn: parent
color: textColor
font.bold: true
@@ -255,7 +255,7 @@ Item {
z: 2
color:backgroundColor
Text {
text: qsTr("Variant")
text: qsTr("Variant", "@label")
anchors.centerIn: parent
color: textColor
font.bold: true
@@ -308,7 +308,7 @@ Item {
TextField {
id: textInput
placeholderText: qsTr("Type here to test your keyboard")
placeholderText: qsTr("Type here to test your keyboard…", "@label")
height: 36
width: parent.width / 1.6
horizontalAlignment: TextInput.AlignHCenter

View File

@@ -139,17 +139,17 @@ LicensePage::setEntries( const QList< LicenseEntry >& entriesList )
void
LicensePage::retranslate()
{
ui->acceptCheckBox->setText( tr( "I accept the terms and conditions above." ) );
ui->acceptCheckBox->setText( tr( "I accept the terms and conditions above.", "@info" ) );
QString review = tr( "Please review the End User License Agreements (EULAs)." );
QString review = tr( "Please review the End User License Agreements (EULAs).", "@info" );
const auto br = QStringLiteral( "<br/>" );
if ( !m_allLicensesOptional )
{
ui->mainText->setText( tr( "This setup procedure will install proprietary "
"software that is subject to licensing terms." )
"software that is subject to licensing terms.", "@info" )
+ br + review );
QString mustAcceptText( tr( "If you do not agree with the terms, the setup procedure cannot continue." ) );
QString mustAcceptText( tr( "If you do not agree with the terms, the setup procedure cannot continue.", "@info" ) );
ui->acceptCheckBox->setToolTip( mustAcceptText );
}
else
@@ -157,10 +157,10 @@ LicensePage::retranslate()
ui->mainText->setText( tr( "This setup procedure can install proprietary "
"software that is subject to licensing terms "
"in order to provide additional features and enhance the user "
"experience." )
"experience.", "@info" )
+ br + review );
QString okAcceptText( tr( "If you do not agree with the terms, proprietary software will not "
"be installed, and open source alternatives will be used instead." ) );
"be installed, and open source alternatives will be used instead.", "@info" ) );
ui->acceptCheckBox->setToolTip( okAcceptText );
}
ui->retranslateUi( this );

View File

@@ -42,7 +42,7 @@ LicenseViewStep::~LicenseViewStep()
QString
LicenseViewStep::prettyName() const
{
return tr( "License" );
return tr( "License", "@label" );
}

View File

@@ -85,7 +85,7 @@ LicenseWidget::LicenseWidget( LicenseEntry entry, QWidget* parent )
}
else
{
m_licenceTextLabel->setText( tr( "URL: %1" ).arg( m_entry.m_url.toDisplayString() ) );
m_licenceTextLabel->setText( tr( "URL: %1", "@label" ).arg( m_entry.m_url.toDisplayString() ) );
connect( m_viewLicenseButton, &QAbstractButton::clicked, this, &LicenseWidget::viewClicked );
}
m_licenceTextLabel->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum );
@@ -107,38 +107,38 @@ LicenseWidget::retranslateUi()
case LicenseEntry::Type::Driver:
//: %1 is an untranslatable product name, example: Creative Audigy driver
productDescription = tr( "<strong>%1 driver</strong><br/>"
"by %2" )
"by %2", "@label, %1 is product name, %2 is product vendor" )
.arg( m_entry.m_prettyName )
.arg( m_entry.m_prettyVendor );
break;
case LicenseEntry::Type::GpuDriver:
//: %1 is usually a vendor name, example: Nvidia graphics driver
productDescription = tr( "<strong>%1 graphics driver</strong><br/>"
"<font color=\"Grey\">by %2</font>" )
"<font color=\"Grey\">by %2</font>", "@label, %1 is product name, %2 is product vendor" )
.arg( m_entry.m_prettyName )
.arg( m_entry.m_prettyVendor );
break;
case LicenseEntry::Type::BrowserPlugin:
productDescription = tr( "<strong>%1 browser plugin</strong><br/>"
"<font color=\"Grey\">by %2</font>" )
"<font color=\"Grey\">by %2</font>", "@label, %1 is product name, %2 is product vendor" )
.arg( m_entry.m_prettyName )
.arg( m_entry.m_prettyVendor );
break;
case LicenseEntry::Type::Codec:
productDescription = tr( "<strong>%1 codec</strong><br/>"
"<font color=\"Grey\">by %2</font>" )
"<font color=\"Grey\">by %2</font>", "@label, %1 is product name, %2 is product vendor" )
.arg( m_entry.m_prettyName )
.arg( m_entry.m_prettyVendor );
break;
case LicenseEntry::Type::Package:
productDescription = tr( "<strong>%1 package</strong><br/>"
"<font color=\"Grey\">by %2</font>" )
"<font color=\"Grey\">by %2</font>", "@label, %1 is product name, %2 is product vendor" )
.arg( m_entry.m_prettyName )
.arg( m_entry.m_prettyVendor );
break;
case LicenseEntry::Type::Software:
productDescription = tr( "<strong>%1</strong><br/>"
"<font color=\"Grey\">by %2</font>" )
"<font color=\"Grey\">by %2</font>", "@label, %1 is product name, %2 is product vendor" )
.arg( m_entry.m_prettyName )
.arg( m_entry.m_prettyVendor );
}
@@ -160,7 +160,7 @@ LicenseWidget::showLocalLicenseText()
{
fileName = fileName.remove( 0, 5 );
}
m_licenceTextLabel->setText( tr( "File: %1" ).arg( fileName ) );
m_licenceTextLabel->setText( tr( "File: %1", "@label" ).arg( fileName ) );
}
}
@@ -183,11 +183,11 @@ LicenseWidget::updateExpandToolTip()
{
if ( m_entry.isLocal() )
{
m_viewLicenseButton->setText( m_isExpanded ? tr( "Hide license text" ) : tr( "Show the license text" ) );
m_viewLicenseButton->setText( m_isExpanded ? tr( "Hide the license text", "@tooltip" ) : tr( "Show the license text", "@tooltip" ) );
}
else
{
m_viewLicenseButton->setText( tr( "Open license agreement in browser." ) );
m_viewLicenseButton->setText( tr( "Open the license agreement in browser", "@tooltip" ) );
}
}

View File

@@ -370,7 +370,7 @@ Config::setLCLocaleExplicitly( const QString& locale )
QString
Config::currentLocationStatus() const
{
return tr( "Set timezone to %1/%2." )
return tr( "Set timezone to %1/%2", "@action" )
.arg( m_currentLocation ? m_currentLocation->region() : QString(),
m_currentLocation ? m_currentLocation->zone() : QString() );
}
@@ -407,14 +407,14 @@ localeLabel( const QString& s )
QString
Config::currentLanguageStatus() const
{
return tr( "The system language will be set to %1." )
return tr( "The system language will be set to %1", "@info" )
.arg( localeLabel( m_selectedLocaleConfiguration.language() ) );
}
QString
Config::currentLCStatus() const
{
return tr( "The numbers and dates locale will be set to %1." )
return tr( "The numbers and dates locale will be set to %1", "@info" )
.arg( localeLabel( m_selectedLocaleConfiguration.lc_numeric ) );
}

View File

@@ -20,7 +20,7 @@ LCLocaleDialog::LCLocaleDialog( const QString& guessedLCLocale, const QStringLis
: QDialog( parent )
{
setModal( true );
setWindowTitle( tr( "System locale setting" ) );
setWindowTitle( tr( "System Locale Setting", "@title" ) );
QBoxLayout* mainLayout = new QVBoxLayout;
setLayout( mainLayout );
@@ -29,7 +29,7 @@ LCLocaleDialog::LCLocaleDialog( const QString& guessedLCLocale, const QStringLis
upperText->setWordWrap( true );
upperText->setText( tr( "The system locale setting affects the language and character "
"set for some command line user interface elements.<br/>"
"The current setting is <strong>%1</strong>." )
"The current setting is <strong>%1</strong>.", "@info" )
.arg( guessedLCLocale ) );
mainLayout->addWidget( upperText );
setMinimumWidth( upperText->fontMetrics().height() * 24 );
@@ -51,8 +51,8 @@ LCLocaleDialog::LCLocaleDialog( const QString& guessedLCLocale, const QStringLis
QDialogButtonBox* dbb
= new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this );
dbb->button( QDialogButtonBox::Cancel )->setText( tr( "&Cancel" ) );
dbb->button( QDialogButtonBox::Ok )->setText( tr( "&OK" ) );
dbb->button( QDialogButtonBox::Cancel )->setText( tr( "&Cancel", "@button" ) );
dbb->button( QDialogButtonBox::Ok )->setText( tr( "&OK", "@button" ) );
mainLayout->addWidget( dbb );

View File

@@ -127,10 +127,10 @@ LocalePage::~LocalePage() {}
void
LocalePage::updateLocaleLabels()
{
m_regionLabel->setText( tr( "Region:" ) );
m_zoneLabel->setText( tr( "Zone:" ) );
m_localeChangeButton->setText( tr( "&Change..." ) );
m_formatsChangeButton->setText( tr( "&Change..." ) );
m_regionLabel->setText( tr( "Region:", "@label" ) );
m_zoneLabel->setText( tr( "Zone:", "@label" ) );
m_localeChangeButton->setText( tr( "&Change", "@button" ) );
m_formatsChangeButton->setText( tr( "&Change", "@button" ) );
m_localeLabel->setText( m_config->currentLanguageStatus() );
m_formatsLabel->setText( m_config->currentLCStatus() );
}

View File

@@ -68,7 +68,7 @@ LocaleViewStep::setUpPage()
QString
LocaleViewStep::prettyName() const
{
return tr( "Location" );
return tr( "Location", "@label" );
}
QString

View File

@@ -29,7 +29,7 @@ SetTimezoneJob::SetTimezoneJob( const QString& region, const QString& zone )
QString
SetTimezoneJob::prettyName() const
{
return tr( "Set timezone to %1/%2" ).arg( m_region ).arg( m_zone );
return tr( "Setting timezone to %1/%2", "@status" ).arg( m_region ).arg( m_zone );
}
Calamares::JobResult
@@ -57,8 +57,8 @@ SetTimezoneJob::exec()
QFileInfo zoneFile( gs->value( "rootMountPoint" ).toString() + zoneinfoPath );
if ( !zoneFile.exists() || !zoneFile.isReadable() )
{
return Calamares::JobResult::error( tr( "Cannot access selected timezone path." ),
tr( "Bad path: %1" ).arg( zoneFile.absolutePath() ) );
return Calamares::JobResult::error( tr( "Cannot access selected timezone path.", "@error" ),
tr( "Bad path: %1", "@error" ).arg( zoneFile.absolutePath() ) );
}
// Make sure /etc/localtime doesn't exist, otherwise symlinking will fail
@@ -68,16 +68,16 @@ SetTimezoneJob::exec()
if ( ec )
{
return Calamares::JobResult::error(
tr( "Cannot set timezone." ),
tr( "Link creation failed, target: %1; link name: %2" ).arg( zoneinfoPath ).arg( "/etc/localtime" ) );
tr( "Cannot set timezone.", "@error" ),
tr( "Link creation failed, target: %1; link name: %2", "@info" ).arg( zoneinfoPath ).arg( "/etc/localtime" ) );
}
QFile timezoneFile( gs->value( "rootMountPoint" ).toString() + "/etc/timezone" );
if ( !timezoneFile.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) )
{
return Calamares::JobResult::error( tr( "Cannot set timezone," ),
tr( "Cannot open /etc/timezone for writing" ) );
return Calamares::JobResult::error( tr( "Cannot set timezone.", "@error" ),
tr( "Cannot open /etc/timezone for writing", "@info" ) );
}
QTextStream out( &timezoneFile );

View File

@@ -29,7 +29,7 @@ LocaleQmlViewStep::getConfig()
QString
LocaleQmlViewStep::prettyName() const
{
return tr( "Location" );
return tr( "Location", "@label" );
}
QString

View File

@@ -234,7 +234,7 @@ Column {
Text {
id: tzText
text: qsTr("Timezone: %1").arg(config.currentTimezoneName)
text: qsTr("Timezone: %1", "@label").arg(config.currentTimezoneName)
color: Kirigami.Theme.textColor
anchors.centerIn: parent
}
@@ -257,7 +257,7 @@ Column {
Kirigami.Theme.backgroundColor: Kirigami.Theme.backgroundColor
text: qsTr("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.")
to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming.", "@label")
}
}
}

View File

@@ -234,7 +234,7 @@ Column {
Text {
id: tzText
text: qsTr("Timezone: %1").arg(config.currentTimezoneName)
text: qsTr("Timezone: %1", "@label").arg(config.currentTimezoneName)
color: Kirigami.Theme.textColor
anchors.centerIn: parent
}
@@ -257,7 +257,7 @@ Column {
Kirigami.Theme.backgroundColor: Kirigami.Theme.backgroundColor
text: qsTr("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.")
to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming.", "@info")
}
}
}

View File

@@ -44,7 +44,7 @@ Page {
anchors.horizontalCenter: parent.horizontalCenter
color: textColor
horizontalAlignment: Text.AlignCenter
text: qsTr("Select your preferred Region, or use the default settings.")
text: qsTr("Select your preferred region, or use the default settings", "@label")
}
ListView {
@@ -100,7 +100,7 @@ Page {
list.currentIndex = index
control.currentRegion = model.name
config.regionalZonesModel.region = control.currentRegion
tztext.text = qsTr("Timezone: %1").arg(config.currentTimezoneName)
tztext.text = qsTr("Timezone: %1", "@label").arg(config.currentTimezoneName)
stack.push(zoneView)
}
}
@@ -117,7 +117,7 @@ Page {
id: zone
anchors.horizontalCenter: parent.horizontalCenter
color: textColor
text: qsTr("Select your preferred Zone within your Region.")
text: qsTr("Select your preferred zone within your region", "@label")
}
ListView {
@@ -177,7 +177,7 @@ Page {
list2.positionViewAtIndex(index, ListView.Center)
control.currentZone = model.name
config.setCurrentLocation(control.currentRegion, control.currentZone)
tztext.text = qsTr("Timezone: %1").arg(config.currentTimezoneName)
tztext.text = qsTr("Timezone: %1", "@label").arg(config.currentTimezoneName)
}
}
}
@@ -190,7 +190,7 @@ Page {
anchors.left: parent.left
anchors.leftMargin: parent.width / 15
icon.name: "go-previous"
text: qsTr("Zones")
text: qsTr("Zones", "@button")
onClicked: stack.pop()
}
}
@@ -221,7 +221,7 @@ Page {
Text {
id: tztext
text: qsTr("Timezone: %1").arg(config.currentTimezoneName)
text: qsTr("Timezone: %1", "@label").arg(config.currentTimezoneName)
color: Kirigami.Theme.textColor
anchors.centerIn: parent
}
@@ -237,7 +237,7 @@ Page {
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
Kirigami.Theme.backgroundColor: Kirigami.Theme.backgroundColor
text: qsTr("You can fine-tune Language and Locale settings below.")
text: qsTr("You can fine-tune language and locale settings below", "@label")
}
}
}

View File

@@ -44,7 +44,7 @@ Page {
anchors.horizontalCenter: parent.horizontalCenter
color: textColor
horizontalAlignment: Text.AlignCenter
text: qsTr("Select your preferred Region, or use the default settings.")
text: qsTr("Select your preferred region, or use the default settings", "@label")
}
ListView {
@@ -100,7 +100,7 @@ Page {
list.currentIndex = index
control.currentRegion = model.name
config.regionalZonesModel.region = control.currentRegion
tztext.text = qsTr("Timezone: %1").arg(config.currentTimezoneName)
tztext.text = qsTr("Timezone: %1", "@label").arg(config.currentTimezoneName)
stack.push(zoneView)
}
}
@@ -117,7 +117,7 @@ Page {
id: zone
anchors.horizontalCenter: parent.horizontalCenter
color: textColor
text: qsTr("Select your preferred Zone within your Region.")
text: qsTr("Select your preferred zone within your region", "@label")
}
ListView {
@@ -177,7 +177,7 @@ Page {
list2.positionViewAtIndex(index, ListView.Center)
control.currentZone = model.name
config.setCurrentLocation(control.currentRegion, control.currentZone)
tztext.text = qsTr("Timezone: %1").arg(config.currentTimezoneName)
tztext.text = qsTr("Timezone: %1", "@label").arg(config.currentTimezoneName)
}
}
}
@@ -190,7 +190,7 @@ Page {
anchors.left: parent.left
anchors.leftMargin: parent.width / 15
icon.name: "go-previous"
text: qsTr("Zones")
text: qsTr("Zones", "@button")
onClicked: stack.pop()
}
}
@@ -221,7 +221,7 @@ Page {
Text {
id: tztext
text: qsTr("Timezone: %1").arg(config.currentTimezoneName)
text: qsTr("Timezone: %1", "@label").arg(config.currentTimezoneName)
color: Kirigami.Theme.textColor
anchors.centerIn: parent
}
@@ -237,7 +237,7 @@ Page {
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
Kirigami.Theme.backgroundColor: Kirigami.Theme.backgroundColor
text: qsTr("You can fine-tune Language and Locale settings below.")
text: qsTr("You can fine-tune language and locale settings below", "@label")
}
}
}

View File

@@ -73,7 +73,7 @@ Page {
Button {
Layout.alignment: Qt.AlignRight|Qt.AlignVCenter
Layout.columnSpan: 2
text: qsTr("Change")
text: qsTr("Change", "@button")
onClicked: {
drawerLanguage.open()
}
@@ -103,7 +103,7 @@ Page {
Button {
Layout.alignment: Qt.AlignRight|Qt.AlignVCenter
Layout.columnSpan: 2
text: qsTr("Change")
text: qsTr("Change", "@button")
onClicked: {
drawerLocale.open()
}
@@ -140,7 +140,7 @@ Page {
anchors.fill: parent
wrapMode: Text.WordWrap
text: qsTr("<h3>Languages</h3> </br>
The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>.").arg(config.currentLanguageCode)
The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>.", "@info").arg(config.currentLanguageCode)
font.pointSize: 10
}
}
@@ -211,7 +211,7 @@ Page {
anchors.fill: parent
wrapMode: Text.WordWrap
text: qsTr("<h3>Locales</h3> </br>
The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>.").arg(config.currentLCCode)
The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>.", "@info").arg(config.currentLCCode)
font.pointSize: 10
}
}

View File

@@ -73,7 +73,7 @@ Page {
Button {
Layout.alignment: Qt.AlignRight|Qt.AlignVCenter
Layout.columnSpan: 2
text: qsTr("Change")
text: qsTr("Change", "@button")
onClicked: {
drawerLanguage.open()
}
@@ -103,7 +103,7 @@ Page {
Button {
Layout.alignment: Qt.AlignRight|Qt.AlignVCenter
Layout.columnSpan: 2
text: qsTr("Change")
text: qsTr("Change", "@button")
onClicked: {
drawerLocale.open()
}
@@ -140,7 +140,7 @@ Page {
anchors.fill: parent
wrapMode: Text.WordWrap
text: qsTr("<h3>Languages</h3> </br>
The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>.").arg(config.currentLanguageCode)
The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>.", "@info").arg(config.currentLanguageCode)
font.pointSize: 10
}
}
@@ -211,7 +211,7 @@ Page {
anchors.fill: parent
wrapMode: Text.WordWrap
text: qsTr("<h3>Locales</h3> </br>
The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>.").arg(config.currentLCCode)
The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>.", "@info").arg(config.currentLCCode)
font.pointSize: 10
}
}

View File

@@ -14,7 +14,6 @@
#include "Workers.h"
#include "utils/Logger.h"
#include "utils/NamedEnum.h"
#include "utils/System.h"
#include "utils/Variant.h"
@@ -23,25 +22,6 @@
#include <QFile>
const NamedEnumTable< MachineId::SystemdMachineIdStyle >&
styleNames()
{
using T = MachineId::SystemdMachineIdStyle;
// *INDENT-OFF*
// clang-format off
static const NamedEnumTable< MachineId::SystemdMachineIdStyle > names {
{ QStringLiteral( "none" ), T::Blank },
{ QStringLiteral( "blank" ), T::Blank },
{ QStringLiteral( "uuid" ), T::Uuid },
{ QStringLiteral( "systemd" ), T::Uuid },
{ QStringLiteral( "literal-uninitialized" ), T::Uninitialized },
};
// clang-format on
// *INDENT-ON*
return names;
}
MachineIdJob::MachineIdJob( QObject* parent )
: Calamares::CppJob( parent )
{
@@ -116,7 +96,7 @@ MachineIdJob::exec()
{
cWarning() << "Could not create systemd data-directory.";
}
auto r = MachineId::createSystemdMachineId( m_systemd_style, root, target_systemd_machineid_file );
auto r = MachineId::createSystemdMachineId( root, target_systemd_machineid_file );
if ( !r )
{
return r;
@@ -154,12 +134,6 @@ MachineIdJob::setConfigurationMap( const QVariantMap& map )
{
m_systemd = Calamares::getBool( map, "systemd", false );
const auto style = Calamares::getString( map, "systemd-style", QString() );
if ( !style.isEmpty() )
{
m_systemd_style = styleNames().find( style, MachineId::SystemdMachineIdStyle::Uuid );
}
m_dbus = Calamares::getBool( map, "dbus", false );
if ( map.contains( "dbus-symlink" ) )
{

View File

@@ -10,16 +10,16 @@
#ifndef MACHINEIDJOB_H
#define MACHINEIDJOB_H
#include "Workers.h"
#include "CppJob.h"
#include "DllMacro.h"
#include "utils/PluginFactory.h"
#include <QObject>
#include <QStringList>
#include <QVariantMap>
#include "CppJob.h"
#include "utils/PluginFactory.h"
#include "DllMacro.h"
/** @brief Write 'random' data: machine id, entropy, UUIDs
*
*/
@@ -48,8 +48,6 @@ public:
private:
bool m_systemd = false; ///< write systemd's files
MachineId::SystemdMachineIdStyle m_systemd_style = MachineId::SystemdMachineIdStyle::Uuid;
bool m_dbus = false; ///< write dbus files
bool m_dbus_symlink = false; ///< .. or just symlink to systemd

View File

@@ -141,10 +141,9 @@ createEntropy( const EntropyGeneration kind, const QString& rootMountPoint, cons
}
static Calamares::JobResult
runCmd( const QStringList& cmd, bool inTarget )
runCmd( const QStringList& cmd )
{
auto r = inTarget ? Calamares::System::instance()->targetEnvCommand( cmd )
: Calamares::System::instance()->runCommand( cmd, std::chrono::seconds( 0 ) );
auto r = Calamares::System::instance()->targetEnvCommand( cmd );
if ( r.getExitCode() )
{
return r.explainProcess( cmd, std::chrono::seconds( 0 ) );
@@ -154,26 +153,11 @@ runCmd( const QStringList& cmd, bool inTarget )
}
Calamares::JobResult
createSystemdMachineId( SystemdMachineIdStyle style, const QString& rootMountPoint, const QString& machineIdFile )
createSystemdMachineId( const QString& rootMountPoint, const QString& fileName )
{
switch ( style )
{
case SystemdMachineIdStyle::Uuid:
return runCmd(
QStringList { QStringLiteral( "systemd-machine-id-setup" ), QStringLiteral( "--root=" ) + rootMountPoint },
false );
case SystemdMachineIdStyle::Blank:
Calamares::System::instance()->createTargetFile(
machineIdFile, QByteArray(), Calamares::System::WriteMode::Overwrite );
return Calamares::JobResult::ok();
case SystemdMachineIdStyle::Uninitialized:
Calamares::System::instance()->createTargetFile(
machineIdFile, "uninitialized\n", Calamares::System::WriteMode::Overwrite );
return Calamares::JobResult::ok();
}
return Calamares::JobResult::internalError( QStringLiteral( "Invalid systemd-style" ),
QStringLiteral( "Invalid value %1" ).arg( int( style ) ),
Calamares::JobResult::InvalidConfiguration );
Q_UNUSED( rootMountPoint )
Q_UNUSED( fileName )
return runCmd( QStringList { QStringLiteral( "systemd-machine-id-setup" ) } );
}
Calamares::JobResult
@@ -181,14 +165,14 @@ createDBusMachineId( const QString& rootMountPoint, const QString& fileName )
{
Q_UNUSED( rootMountPoint )
Q_UNUSED( fileName )
return runCmd( QStringList { QStringLiteral( "dbus-uuidgen" ), QStringLiteral( "--ensure" ) }, true );
return runCmd( QStringList { QStringLiteral( "dbus-uuidgen" ), QStringLiteral( "--ensure" ) } );
}
Calamares::JobResult
createDBusLink( const QString& rootMountPoint, const QString& fileName, const QString& systemdFileName )
{
Q_UNUSED( rootMountPoint )
return runCmd( QStringList { QStringLiteral( "ln" ), QStringLiteral( "-sf" ), systemdFileName, fileName }, true );
return runCmd( QStringList { QStringLiteral( "ln" ), QStringLiteral( "-sf" ), systemdFileName, fileName } );
}
} // namespace MachineId

View File

@@ -52,7 +52,6 @@ createEntropy( const EntropyGeneration kind, const QString& rootMountPoint, cons
* Creating UUIDs for DBUS and SystemD.
*/
/// @brief Create a new DBus UUID file
Calamares::JobResult createDBusMachineId( const QString& rootMountPoint, const QString& fileName );
@@ -60,15 +59,7 @@ Calamares::JobResult createDBusMachineId( const QString& rootMountPoint, const Q
Calamares::JobResult
createDBusLink( const QString& rootMountPoint, const QString& fileName, const QString& systemdFileName );
enum class SystemdMachineIdStyle
{
Uuid,
Blank,
Uninitialized
};
Calamares::JobResult
createSystemdMachineId( SystemdMachineIdStyle style, const QString& rootMountPoint, const QString& fileName );
Calamares::JobResult createSystemdMachineId( const QString& rootMountPoint, const QString& fileName );
} // namespace MachineId

View File

@@ -13,13 +13,6 @@
# Whether to create /etc/machine-id for systemd.
# The default is *false*.
systemd: true
# If systemd is true, the kind of /etc/machine-id to create in the target
# - uuid (default) generates a UUID
# - systemd alias of uuid
# - blank creates the file but leaves it empty at 0 bytes
# - none alias of blank (use `systemd: false` if you don't want one at all)
# - literal-uninitialized creates the file and writes the string "uninitialized\n"
systemd-style: uuid
# Whether to create /var/lib/dbus/machine-id for D-Bus.
# The default is *false*.

View File

@@ -7,7 +7,6 @@ additionalProperties: false
type: object
properties:
systemd: { type: boolean, default: false }
"systemd-style": { type: string, enum: [ uuid, blank, literal-uninitialized ] }
dbus: { type: boolean, default: false }
"dbus-symlink": { type: boolean, default: false }
"entropy-copy": { type: boolean, default: false }

View File

@@ -298,7 +298,12 @@ def mount_partition(root_mount_point, partition, partitions, mount_options, moun
mount_option_no_subvol = get_mount_options("btrfs_swap", mount_options, partition)
else:
mount_option_no_subvol = get_mount_options(fstype, mount_options, partition)
mount_option = f"subvol={s['subvolume']},{mount_option_no_subvol}"
# Only add subvol= argument if we are not mounting the entire filesystem
if s['subvolume']:
mount_option = f"subvol={s['subvolume']},{mount_option_no_subvol}"
else:
mount_option = mount_option_no_subvol
subvolume_mountpoint = mount_point[:-1] + s['mountPoint']
mount_options_list.append({"mountpoint": s['mountPoint'], "option_string": mount_option_no_subvol})
if libcalamares.utils.mount(device,

View File

@@ -274,39 +274,66 @@ fillGSConfigurationEFI( Calamares::GlobalStorage* gs, const QVariantMap& configu
QString firmwareType( PartUtils::isEfiSystem() ? QStringLiteral( "efi" ) : QStringLiteral( "bios" ) );
gs->insert( "firmwareType", firmwareType );
gs->insert( "efiSystemPartition",
Calamares::getString( configurationMap, "efiSystemPartition", QStringLiteral( "/boot/efi" ) ) );
bool ok = false;
auto efiConfiguration = Calamares::getSubMap( configurationMap, "efi", ok );
// Read and parse key efiSystemPartitionSize
if ( configurationMap.contains( "efiSystemPartitionSize" ) )
// Mount Point
{
const QString sizeString = Calamares::getString( configurationMap, "efiSystemPartitionSize" );
Calamares::Partition::PartitionSize part_size = Calamares::Partition::PartitionSize( sizeString );
if ( part_size.isValid() )
{
// Insert once as string, once as a size-in-bytes;
// changes to these keys should be synchronized with PartUtils.cpp
gs->insert( "efiSystemPartitionSize", sizeString );
gs->insert( "efiSystemPartitionSize_i", part_size.toBytes() );
const auto efiSystemPartition = Calamares::getString(
efiConfiguration,
"mountPoint",
Calamares::getString( configurationMap, "efiSystemPartition", QStringLiteral( "/boot/efi" ) ) );
// This specific GS key is also used by bootloader and grubcfg modules,
// as well as partition module internalls.
gs->insert( "efiSystemPartition", efiSystemPartition );
}
// Assign long long int to long unsigned int to prevent compilation warning
auto byte_part_size = part_size.toBytes();
if ( byte_part_size != PartUtils::efiFilesystemMinimumSize() )
// Sizes
{
const auto efiRecommendedSize = Calamares::getString(
efiConfiguration, "recommendedSize", Calamares::getString( configurationMap, "efiSystemPartitionSize" ) );
if ( !efiRecommendedSize.isEmpty() )
{
Calamares::Partition::PartitionSize part_size = Calamares::Partition::PartitionSize( efiRecommendedSize );
if ( part_size.isValid() )
{
cWarning() << "EFI partition size" << sizeString << "has been adjusted to"
<< PartUtils::efiFilesystemMinimumSize() << "bytes";
gs->insert( PartUtils::efiFilesystemRecommendedSizeGSKey(), part_size.toBytes() );
// Assign long long int to long unsigned int to prevent compilation warning,
// checks for loss-of-precision in the conversion.
auto byte_part_size = part_size.toBytes();
if ( byte_part_size != PartUtils::efiFilesystemRecommendedSize() )
{
cWarning() << "EFI partition size" << efiRecommendedSize << "has been adjusted to"
<< PartUtils::efiFilesystemRecommendedSize() << "bytes";
}
}
else
{
cWarning() << "EFI partition size" << efiRecommendedSize << "is invalid, ignored";
}
}
else
const auto efiMinimumSize = Calamares::getString( efiConfiguration, "minimumSize" );
if ( !efiMinimumSize.isEmpty() )
{
cWarning() << "EFI partition size" << sizeString << "is invalid, ignored";
Calamares::Partition::PartitionSize part_size = Calamares::Partition::PartitionSize( efiMinimumSize );
if ( part_size.isValid() )
{
gs->insert( PartUtils::efiFilesystemMinimumSizeGSKey(), part_size.toBytes() );
}
}
}
// Read and parse key efiSystemPartitionName
if ( configurationMap.contains( "efiSystemPartitionName" ) )
// Name (label) of partition
{
gs->insert( "efiSystemPartitionName", Calamares::getString( configurationMap, "efiSystemPartitionName" ) );
const auto efiLabel = Calamares::getString(
efiConfiguration, "label", Calamares::getString( configurationMap, "efiSystemPartitionName" ) );
if ( !efiLabel.isEmpty() )
{
gs->insert( "efiSystemPartitionName", efiLabel );
}
}
}

View File

@@ -527,8 +527,8 @@ PartitionViewStep::onLeave()
Logger::Once o;
const bool okType = esp && PartUtils::isEfiFilesystemSuitableType( esp );
const bool okRecommendedSize = esp && PartUtils::isEfiFilesystemSuitableSize( esp );
const bool okMinimumSize = esp && PartUtils::isEfiFilesystemSuitableMinimumSize( esp );
const bool okRecommendedSize = esp && PartUtils::isEfiFilesystemRecommendedSize( esp );
const bool okMinimumSize = esp && PartUtils::isEfiFilesystemMinimumSize( esp );
const bool okFlag = esp && PartUtils::isEfiBootable( esp );
const bool espExistsButIsWrong = esp && !( okType && okMinimumSize && okFlag );
@@ -552,24 +552,21 @@ PartitionViewStep::onLeave()
const QString wrongFlagMessage = tr( "The filesystem must have flag <strong>%1</strong> set." )
.arg( PartitionTable::flagName( PartitionTable::Flag::Boot ) );
const auto recommendedMiB = Calamares::BytesToMiB( PartUtils::efiFilesystemRecommendedSize() );
const auto minimumMiB = Calamares::BytesToMiB( PartUtils::efiFilesystemMinimumSize() );
// Three flavors of size-is-wrong
using Calamares::Units::operator""_MiB;
const qint64 atLeastBytes = static_cast< qint64 >( PartUtils::efiFilesystemMinimumSize() );
const auto atLeastMiB = Calamares::BytesToMiB( atLeastBytes );
const QString requireConfiguredSize
= tr( "The filesystem must be at least %1 MiB in size." ).arg( atLeastMiB );
= tr( "The filesystem must be at least %1 MiB in size." ).arg( recommendedMiB );
const QString requiredMinimumSize
= tr( "The filesystem must be at least %1 MiB in size." ).arg( Calamares::BytesToMiB( 32_MiB ) );
= tr( "The filesystem must be at least %1 MiB in size." ).arg( minimumMiB );
const QString suggestConfiguredSize
= tr( "The minimum recommended size for the filesystem is %1 MiB." ).arg( atLeastMiB );
= tr( "The minimum recommended size for the filesystem is %1 MiB." ).arg( recommendedMiB );
const QString mayFail = tr( "You can continue without setting up an EFI system "
"partition but your system may fail to start." );
const QString possibleFail = tr( "You can continue with this EFI system "
"partition configuration but your system may fail to start." );
"partition configuration but your system may fail to start." );
const QString startList = QStringLiteral( "<br/><br/><ul>" );
const QString endList = QStringLiteral( "</ul><br/><br/>" );

View File

@@ -35,6 +35,10 @@
using Calamares::Partition::isPartitionFreeSpace;
using Calamares::Partition::isPartitionNew;
using Calamares::Units::operator""_MiB;
static constexpr qint64 efiSpecificationHardMinimumSize = 32_MiB;
namespace PartUtils
{
@@ -471,7 +475,7 @@ isEfiFilesystemSuitableType( const Partition* candidate )
}
bool
isEfiFilesystemSuitableSize( const Partition* candidate )
isEfiFilesystemRecommendedSize( const Partition* candidate )
{
auto size = candidate->capacity(); // bytes
if ( size <= 0 )
@@ -479,7 +483,7 @@ isEfiFilesystemSuitableSize( const Partition* candidate )
return false;
}
if ( size >= efiFilesystemMinimumSize() )
if ( size >= efiFilesystemRecommendedSize() )
{
return true;
}
@@ -491,7 +495,7 @@ isEfiFilesystemSuitableSize( const Partition* candidate )
}
bool
isEfiFilesystemSuitableMinimumSize( const Partition* candidate )
isEfiFilesystemMinimumSize( const Partition* candidate )
{
using Calamares::Units::operator""_MiB;
@@ -500,8 +504,12 @@ isEfiFilesystemSuitableMinimumSize( const Partition* candidate )
{
return false;
}
if ( size < efiSpecificationHardMinimumSize )
{
return false;
}
if ( size >= 32_MiB )
if ( size >= efiFilesystemMinimumSize() )
{
return true;
}
@@ -522,30 +530,65 @@ isEfiBootable( const Partition* candidate )
return flags.testFlag( KPM_PARTITION_FLAG_ESP );
}
// TODO: this is configurable via the config file **already**
qint64
efiFilesystemMinimumSize()
QString
efiFilesystemRecommendedSizeGSKey()
{
using Calamares::Units::operator""_MiB;
return QStringLiteral( "efiSystemPartitionSize_i" );
}
qint64
efiFilesystemRecommendedSize()
{
const QString key = efiFilesystemRecommendedSizeGSKey();
qint64 uefisys_part_sizeB = 300_MiB;
// The default can be overridden; the key used here comes
// from the partition module Config.cpp
auto* gs = Calamares::JobQueue::instance()->globalStorage();
if ( gs->contains( "efiSystemPartitionSize_i" ) )
if ( gs->contains( key ) )
{
qint64 v = gs->value( "efiSystemPartitionSize_i" ).toLongLong();
qint64 v = gs->value( key ).toLongLong();
uefisys_part_sizeB = v > 0 ? v : 0;
}
// There is a lower limit of what can be configured
if ( uefisys_part_sizeB < 32_MiB )
if ( uefisys_part_sizeB < efiSpecificationHardMinimumSize )
{
uefisys_part_sizeB = 32_MiB;
uefisys_part_sizeB = efiSpecificationHardMinimumSize;
}
return uefisys_part_sizeB;
}
QString
efiFilesystemMinimumSizeGSKey()
{
return QStringLiteral( "efiSystemPartitionMinimumSize_i" );
}
qint64
efiFilesystemMinimumSize()
{
const QString key = efiFilesystemMinimumSizeGSKey();
qint64 uefisys_part_sizeB = efiFilesystemRecommendedSize();
// The default can be overridden; the key used here comes
// from the partition module Config.cpp
auto* gs = Calamares::JobQueue::instance()->globalStorage();
if ( gs->contains( key ) )
{
qint64 v = gs->value( key ).toLongLong();
uefisys_part_sizeB = v > 0 ? v : 0;
}
// There is a lower limit of what can be configured
if ( uefisys_part_sizeB < efiSpecificationHardMinimumSize )
{
uefisys_part_sizeB = efiSpecificationHardMinimumSize;
}
return uefisys_part_sizeB;
return efiSpecificationHardMinimumSize;
}
QString
canonicalFilesystemName( const QString& fsName, FileSystem::Type* fsType )
{

View File

@@ -95,15 +95,15 @@ bool isEfiFilesystemSuitableType( const Partition* candidate );
/**
* @brief Is the @p partition suitable as an EFI boot partition?
* Checks for filesystem size (300MiB, see efiFilesystemMinimumSize).
* Checks for filesystem size (300MiB, see efi.recommendedSize).
*/
bool isEfiFilesystemSuitableSize( const Partition* candidate );
bool isEfiFilesystemRecommendedSize( const Partition* candidate );
/**
* @brief Is the @p candidate suitable as an EFI boot partition?
* This checks the bonkers-small minimum of 32MiB.
* Checks for filesystem size (32MiB at least, see efi.minimumSize).
*/
bool isEfiFilesystemSuitableMinimumSize( const Partition* candidate );
bool isEfiFilesystemMinimumSize( const Partition* candidate );
/** @brief Returns the minimum size of an EFI boot partition in bytes.
*
@@ -113,13 +113,25 @@ bool isEfiFilesystemSuitableMinimumSize( const Partition* candidate );
* by the standard and how all of those are different).
*
* This can be configured through the `partition.conf` file,
* key *efiSystemPartitionSize*, which will then apply to both
* key *efi.recommendedSize*, which will then apply to both
* automatic partitioning **and** the warning for manual partitioning.
*
* A minimum of 32MiB (which is bonkers-small) is enforced.
*/
qint64 efiFilesystemRecommendedSize();
// Helper for consistency: the GS key used to share the recommended size
QString efiFilesystemRecommendedSizeGSKey();
/** @brief Returns the hard-minimum size of an EFI boot partition in bytes.
*
* This is 32MiB, based on the FAT32 standard and EFI documentation.
*/
qint64 efiFilesystemMinimumSize();
// Helper for consistency: the GS key used to share the minimum size
QString efiFilesystemMinimumSizeGSKey();
/**
* @brief Is the given @p partition bootable in EFI? Depending on
* the partition table layout, this may mean different flags.

View File

@@ -118,7 +118,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO
if ( isEfi )
{
qint64 uefisys_part_sizeB = PartUtils::efiFilesystemMinimumSize();
qint64 uefisys_part_sizeB = PartUtils::efiFilesystemRecommendedSize();
qint64 efiSectorCount = Calamares::bytesToSectors( uefisys_part_sizeB, dev->logicalSize() );
Q_ASSERT( efiSectorCount > 0 );

View File

@@ -1,26 +1,49 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
# This setting specifies the mount point of the EFI system partition. Some
# distributions (Fedora, Debian, Manjaro, etc.) use /boot/efi, others (KaOS,
# etc.) use just /boot.
#
# Defaults to "/boot/efi", may be empty (but weird effects ensue)
efiSystemPartition: "/boot/efi"
# This optional setting specifies the size of the EFI system partition.
# If nothing is specified, the default size of 300MiB will be used.
# Options for EFI system partition.
#
# This size applies both to automatic partitioning and the checks
# during manual partitioning. A minimum of 32MiB is enforced,
# 300MiB is the default, M is treated as MiB, and if you really want
# one-million (10^6) bytes, use MB.
# - *mountPoint*
# This setting specifies the mount point of the EFI system partition. Some
# distributions (Fedora, Debian, Manjaro, etc.) use /boot/efi, others (KaOS,
# etc.) use just /boot.
#
# efiSystemPartitionSize: 300M
# Defaults to "/boot/efi", may be empty (but weird effects ensue)
# - *recommendedSize*
# This optional setting specifies the size of the EFI system partition.
# If nothing is specified, the default size of 300MiB will be used.
# When writing quantities here, M is treated as MiB, and if you really
# want one-million (10^6) bytes, use MB.
# - *minimumSize*
# This optional setting specifies the absolute minimum size of the EFI
# system partition. If nothing is specified, the *recommendedSize*
# is used instead.
# - *label*
# This optional setting specifies the name of the EFI system partition (see
# PARTLABEL; gpt only; requires KPMCore >= 4.2.0).
# If nothing is specified, the partition name is left unset.
#
# Going below the *recommended* size is allowed, but the user will
# get a warning that it might not work. Going below the *minimum*
# size is not allowed and the user will be told it will not work.
#
# Both quantities must be at least 32MiB, this is enforced by the EFI
# spec. If minimum is not specified, it defaults to the recommended
# size. Distro's that allow more user latitude can set the minimum lower.
efi:
mountPoint: "/boot/efi"
recommendedSize: 300MiB
minimumSize: 32MiB
label: "EFI"
# This optional setting specifies the name of the EFI system partition (see
# PARTLABEL; gpt only; requires KPMCore >= 4.2.0).
# If nothing is specified, the partition name is left unset.
# Deprecated alias of efi.mountPoint
# efiSystemPartition: "/boot/efi"
# Deprecated alias of efi.recommendedSize
# efiSystemPartitionSize: 300MiB
# Deprecated alias of efi.label
# efiSystemPartitionName: EFI
# In autogenerated partitioning, allow the user to select a swap size?
@@ -170,8 +193,8 @@ initialSwapChoice: none
# Default filesystem type, used when a "new" partition is made.
#
# When replacing a partition, the existing filesystem inside the
# partition is retained. In other cases, e.g. Erase and Alongside,
# When replacing a partition, the new filesystem type will be from the
# defaultFileSystemType value. In other cases, e.g. Erase and Alongside,
# as well as when using manual partitioning and creating a new
# partition, this filesystem type is pre-selected. Note that
# editing a partition in manual-creation mode will not automatically

View File

@@ -7,9 +7,18 @@ $id: https://calamares.io/schemas/partition
additionalProperties: false
type: object
properties:
efiSystemPartition: { type: string } # Mount point
efiSystemPartitionSize: { type: string }
efiSystemPartitionName: { type: string }
efiSystemPartition: { type: string } # Deprecated alias of efi.mountPoint
efiSystemPartitionSize: { type: string } # Deprecated alias of efi.recommendedSize
efiSystemPartitionName: { type: string } # Deprecated alias of efi.label
efi:
type: object
properties:
recommendedSize: { type: string }
minimumSize: { type: string }
label: { type: string }
mountPoint: { type: string }
additionalProperties: false
userSwapChoices: { type: array, items: { type: string, enum: [ none, reuse, small, suspend, file ] } }
# ensureSuspendToDisk: { type: boolean, default: true } # Legacy
@@ -34,5 +43,4 @@ properties:
requiredStorage: { type: number }
required:
- efiSystemPartition
- userSwapChoices

View File

@@ -0,0 +1,2 @@
---
efiSystemPartitionSize: 100MiB

View File

@@ -0,0 +1,2 @@
---
efiSystemPartitionSize: 100MB

View File

@@ -0,0 +1,9 @@
---
# Deprecated alias of efi.mountPoint
efiSystemPartition: "/boot/thisisatest"
# Deprecated alias of efi.recommendedSize
efiSystemPartitionSize: 75MiB
# Deprecated alias of efi.label
efiSystemPartitionName: testLabel

View File

@@ -0,0 +1,6 @@
---
efi:
mountPoint: "/boot/thisismodern"
recommendedSize: 80MiB
minimumSize: 65MiB
label: "UEFI"

View File

@@ -0,0 +1,7 @@
---
efi:
mountPoint: "/boot/thisismixed"
minimumSize: 80MiB
efiSystemPartitionSize: 175MiB
efiSystemPartitionName: legacy

View File

@@ -0,0 +1,9 @@
---
efi:
mountPoint: "/boot/thisoverlaps"
minimumSize: 100MiB
recommendedSize: 300MiB
efiSystemPartition: "/boot/ignored"
efiSystemPartitionSize: 175MiB
efiSystemPartitionName: legacy

View File

@@ -61,3 +61,16 @@ calamares_add_test(
LIBRARIES calamares::kpmcore
DEFINITIONS ${_partition_defs}
)
calamares_add_test(
partitionconfigtest
SOURCES
ConfigTests.cpp
${PartitionModule_SOURCE_DIR}/core/DeviceModel.cpp
${PartitionModule_SOURCE_DIR}/core/PartitionInfo.cpp
${PartitionModule_SOURCE_DIR}/core/PartUtils.cpp
${PartitionModule_SOURCE_DIR}/Config.cpp
LIBRARIES calamares::kpmcore Calamares::calamaresui
DEFINITIONS
${_partition_defs}
)

View File

@@ -0,0 +1,203 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2023 Adriaan de Groot <groot@kde.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Calamares is Free Software: see the License-Identifier above.
*
*/
#include "Config.h"
#include "core/PartUtils.h"
#include "GlobalStorage.h"
#include "JobQueue.h"
#include "utils/Logger.h"
#include "utils/System.h"
#include "utils/Yaml.h"
#include <QObject>
#include <QtTest/QtTest>
using Calamares::Units::operator""_MiB;
class ConfigTests : public QObject
{
Q_OBJECT
public:
ConfigTests();
private Q_SLOTS:
void initTestCase();
void testEmptyConfig();
void testLegacySize();
void testAll();
};
ConfigTests::ConfigTests() = default;
void
ConfigTests::initTestCase()
{
Logger::setupLogLevel( Logger::LOGVERBOSE );
// Ensure we have a system object, expect it to be a "bogus" one
Calamares::System* system = Calamares::System::instance();
QVERIFY( system );
QVERIFY( system->doChroot() );
// Ensure we have a system-wide GlobalStorage with /tmp as root
if ( !Calamares::JobQueue::instance() )
{
cDebug() << "Creating new JobQueue";
(void)new Calamares::JobQueue();
}
Calamares::GlobalStorage* gs
= Calamares::JobQueue::instance() ? Calamares::JobQueue::instance()->globalStorage() : nullptr;
QVERIFY( gs );
}
void
ConfigTests::testEmptyConfig()
{
Config c( nullptr );
c.setConfigurationMap( {} );
const auto* gs = Calamares::JobQueue::instanceGlobalStorage();
QVERIFY( gs );
QVERIFY( c.initialInstallChoice() == Config::InstallChoice::NoChoice );
QVERIFY( !gs->value( PartUtils::efiFilesystemRecommendedSizeGSKey() ).isValid() ); // Nothing filled in
QCOMPARE( PartUtils::efiFilesystemRecommendedSize(), 300_MiB ); // Default value
QCOMPARE( PartUtils::efiFilesystemMinimumSize(), 300_MiB ); // Default value
const auto firmware = gs->value( "firmwareType" ).toString();
QVERIFY( firmware == "efi" || firmware == "bios" );
QCOMPARE( gs->value( "efiSystemPartition" ).toString(), "/boot/efi" ); // Default
}
void
ConfigTests::testLegacySize()
{
Config c( nullptr );
auto* gs = Calamares::JobQueue::instanceGlobalStorage();
QVERIFY( gs );
// Config with just one legacy key
{
const auto file = QStringLiteral( BUILD_AS_TEST "/1a-legacy.conf" );
bool ok = false;
c.setConfigurationMap( Calamares::YAML::load( file, &ok ) );
cDebug() << "Tried to load" << file << "success?" << ok;
QVERIFY( ok );
QVERIFY( gs->value( PartUtils::efiFilesystemRecommendedSizeGSKey() ).isValid() ); // Something was filled in
QCOMPARE( PartUtils::efiFilesystemRecommendedSize(), 100_MiB ); // From config
QCOMPARE( PartUtils::efiFilesystemMinimumSize(), 100_MiB ); // Taken from config
}
// Different legacy key value
{
bool ok = false;
c.setConfigurationMap( Calamares::YAML::load( QStringLiteral( BUILD_AS_TEST "/1b-legacy.conf" ), &ok ) );
QVERIFY( ok );
QCOMPARE( PartUtils::efiFilesystemRecommendedSize(), 100000000 ); // From config, MB
QCOMPARE( PartUtils::efiFilesystemMinimumSize(), 100000000 ); // Taken from config
}
}
void
ConfigTests::testAll()
{
Config c( nullptr );
auto* gs = Calamares::JobQueue::instanceGlobalStorage();
QVERIFY( gs );
// Legacy only
{
gs->clear();
const auto file = QStringLiteral( BUILD_AS_TEST "/2a-legacy.conf" );
bool ok = false;
c.setConfigurationMap( Calamares::YAML::load( file, &ok ) );
cDebug() << "Tried to load" << file << "success?" << ok;
QVERIFY( ok );
QVERIFY( gs->value( PartUtils::efiFilesystemRecommendedSizeGSKey() ).isValid() ); // Something was filled in
QCOMPARE( PartUtils::efiFilesystemRecommendedSize(), 75_MiB ); // From config
QCOMPARE( PartUtils::efiFilesystemMinimumSize(), 75_MiB ); // No separate setting
QCOMPARE( gs->value( "efiSystemPartition" ).toString(), QStringLiteral( "/boot/thisisatest" ) );
QCOMPARE( gs->value( "efiSystemPartitionName" ).toString(), QStringLiteral( "testLabel" ) );
}
// Modern only
{
gs->clear();
bool ok = false;
c.setConfigurationMap( Calamares::YAML::load( QStringLiteral( BUILD_AS_TEST "/2b-modern.conf" ), &ok ) );
QVERIFY( ok );
QVERIFY( PartUtils::efiFilesystemRecommendedSizeGSKey() != PartUtils::efiFilesystemMinimumSizeGSKey() );
QCOMPARE( gs->value( PartUtils::efiFilesystemRecommendedSizeGSKey() ).toString(),
QStringLiteral( "83886080" ) );
QCOMPARE( gs->value( PartUtils::efiFilesystemMinimumSizeGSKey() ).toString(), QStringLiteral( "68157440" ) );
QCOMPARE( PartUtils::efiFilesystemRecommendedSize(), 80_MiB ); // From config
QCOMPARE( PartUtils::efiFilesystemMinimumSize(), 65_MiB ); // Taken from config
QCOMPARE( gs->value( "efiSystemPartition" ).toString(), QStringLiteral( "/boot/thisismodern" ) );
QCOMPARE( gs->value( "efiSystemPartitionName" ).toString(), QStringLiteral( "UEFI" ) );
}
// Mixed settings
{
gs->clear();
bool ok = false;
c.setConfigurationMap( Calamares::YAML::load( QStringLiteral( BUILD_AS_TEST "/2c-mixed.conf" ), &ok ) );
QVERIFY( ok );
QCOMPARE( PartUtils::efiFilesystemRecommendedSize(), 175_MiB ); // From config
QCOMPARE( PartUtils::efiFilesystemMinimumSize(), 80_MiB ); // Taken from config
QCOMPARE( gs->value( "efiSystemPartition" ).toString(), QStringLiteral( "/boot/thisismixed" ) );
QCOMPARE( gs->value( "efiSystemPartitionName" ).toString(), QStringLiteral( "legacy" ) );
}
// Mixed settings with overlap
{
gs->clear();
bool ok = false;
c.setConfigurationMap( Calamares::YAML::load( QStringLiteral( BUILD_AS_TEST "/2d-overlap.conf" ), &ok ) );
QVERIFY( ok );
QCOMPARE( PartUtils::efiFilesystemRecommendedSize(), 300_MiB ); // From modern config
QCOMPARE( PartUtils::efiFilesystemMinimumSize(), 100_MiB ); // Taken from modern config, legacy ignored
QCOMPARE( gs->value( "efiSystemPartition" ).toString(), QStringLiteral( "/boot/thisoverlaps" ) );
QCOMPARE( gs->value( "efiSystemPartitionName" ).toString(), QStringLiteral( "legacy" ) );
}
}
QTEST_GUILESS_MAIN( ConfigTests )
#include "utils/moc-warnings.h"
#include "ConfigTests.moc"

View File

@@ -176,7 +176,7 @@ def file_copy(source, entry, progress_cb):
num_files_total_local = 0
num_files_copied = 0 # Gets updated through rsync output
args = ['rsync', '-aHAXr', '--filter=-x trusted.overlay.*']
args = ['rsync', '-aHAXSr', '--filter=-x trusted.overlay.*']
args.extend(global_excludes())
if entry.excludeFile:
args.extend(["--exclude-from=" + entry.excludeFile])