From b842e5409182c9a0062527c85bb4f59e1854f961 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2026 19:52:17 +1000 Subject: [PATCH 01/23] Update dependency arch/python-textual to v8.2.4 (#4448) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index cffb51e0..944d1294 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ dependencies = [ "pyparted==3.13.0", "pydantic==2.12.5", "cryptography==46.0.7", - "textual==8.2.3", + "textual==8.2.4", "markdown-it-py==4.0.0", "linkify-it-py==2.1.0", ] From fa54c9d6c9b804a44d29d0c90fe5a35dc087856f Mon Sep 17 00:00:00 2001 From: stinga11 Date: Tue, 21 Apr 2026 20:23:09 -0400 Subject: [PATCH 02/23] Change Budgie display server and update packages (#4450) Some changes consistent with other distros. --- archinstall/default_profiles/desktops/budgie.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/archinstall/default_profiles/desktops/budgie.py b/archinstall/default_profiles/desktops/budgie.py index e6680b7a..f156a53b 100644 --- a/archinstall/default_profiles/desktops/budgie.py +++ b/archinstall/default_profiles/desktops/budgie.py @@ -9,7 +9,7 @@ class BudgieProfile(Profile): 'Budgie', ProfileType.DesktopEnv, support_gfx_driver=True, - display_server=DisplayServerType.Xorg, + display_server=DisplayServerType.Wayland, ) @property @@ -18,12 +18,12 @@ class BudgieProfile(Profile): return [ 'materia-gtk-theme', 'budgie', - 'mate-terminal', - 'nemo', + 'konsole', + 'dolphin', 'papirus-icon-theme', ] @property @override def default_greeter_type(self) -> GreeterType: - return GreeterType.LightdmSlick + return GreeterType.Sddm From 094798b496896f7657be57a3ce62e0e35d31eae8 Mon Sep 17 00:00:00 2001 From: javier-anton-ordonez <93844376+javier-anton-ordonez@users.noreply.github.com> Date: Wed, 22 Apr 2026 02:34:41 +0200 Subject: [PATCH 03/23] ES Language updated (#4456) * ES langauje updated and added diferent translations * Update archinstall/locales/es/LC_MESSAGES/base.po Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Cerrar -> Ocultar Github copilot suggested * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix Spanish translations and accents in base.po Github suggestions * ./locales_generator.sh generated * Accent updated and ./locales_generator.sh generated --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- archinstall/locales/base.pot | 16 +++-- archinstall/locales/es/LC_MESSAGES/base.mo | Bin 63147 -> 65086 bytes archinstall/locales/es/LC_MESSAGES/base.po | 78 ++++++++++++--------- 3 files changed, 55 insertions(+), 39 deletions(-) diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index ac1728eb..f707ec7a 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -641,8 +641,8 @@ msgid "" msgstr "" msgid "" -"Provides a selection of desktop environments and tiling window managers, " -"e.g. gnome, kde, sway" +"Provides a selection of desktop environments and tiling window managers, e." +"g. gnome, kde, sway" msgstr "" msgid "Select your desired desktop environment" @@ -1331,8 +1331,8 @@ msgid "Disable Copy-on-Write" msgstr "" msgid "" -"Provides a selection of desktop environments and tiling window managers, " -"e.g. GNOME, KDE Plasma, Sway" +"Provides a selection of desktop environments and tiling window managers, e." +"g. GNOME, KDE Plasma, Sway" msgstr "" #, python-brace-format @@ -2251,3 +2251,11 @@ msgstr "" msgid "wide Unicode coverage, good fallback font" msgstr "" + +#, python-brace-format +msgid "Setting up U2F login: {u2f_config.u2f_login_method.value}" +msgstr "" + +#, python-brace-format +msgid "Default: {DEFAULT_ITER_TIME}ms, Recommended range: 1000-60000" +msgstr "" diff --git a/archinstall/locales/es/LC_MESSAGES/base.mo b/archinstall/locales/es/LC_MESSAGES/base.mo index 3c3993f7ee87559f7726ebb709f40d6dd7842c61..14e916ef66dffeec86c2631fab615c138248130d 100644 GIT binary patch delta 15362 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 Date: Wed, 22 Apr 2026 07:31:06 -0400 Subject: [PATCH 04/23] Use staticmethod for PasswordStrength methods (#4461) The methods don't need access to the class, so they don't need to be classmethods. This change reduces the number of 'bad return' warnings seen when running Pyright, Pyrefly, and ty. --- archinstall/lib/models/users.py | 45 ++++++++++++++++----------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/archinstall/lib/models/users.py b/archinstall/lib/models/users.py index 8fda6888..92546076 100644 --- a/archinstall/lib/models/users.py +++ b/archinstall/lib/models/users.py @@ -36,67 +36,66 @@ class PasswordStrength(Enum): case PasswordStrength.STRONG: return 'green' - @classmethod - def strength(cls, password: str) -> Self: + @staticmethod + def strength(password: str) -> PasswordStrength: digit = any(character.isdigit() for character in password) upper = any(character.isupper() for character in password) lower = any(character.islower() for character in password) symbol = any(not character.isalnum() for character in password) - return cls._check_password_strength(digit, upper, lower, symbol, len(password)) + return PasswordStrength._check_password_strength(digit, upper, lower, symbol, len(password)) - @classmethod + @staticmethod def _check_password_strength( - cls, digit: bool, upper: bool, lower: bool, symbol: bool, length: int, - ) -> Self: + ) -> PasswordStrength: # suggested evaluation # https://github.com/archlinux/archinstall/issues/1304#issuecomment-1146768163 if digit and upper and lower and symbol: match length: case num if 13 <= num: - return cls.STRONG + return PasswordStrength.STRONG case num if 11 <= num <= 12: - return cls.MODERATE + return PasswordStrength.MODERATE case num if 7 <= num <= 10: - return cls.WEAK + return PasswordStrength.WEAK case num if num <= 6: - return cls.VERY_WEAK + return PasswordStrength.VERY_WEAK elif digit and upper and lower: match length: case num if 14 <= num: - return cls.STRONG + return PasswordStrength.STRONG case num if 11 <= num <= 13: - return cls.MODERATE + return PasswordStrength.MODERATE case num if 7 <= num <= 10: - return cls.WEAK + return PasswordStrength.WEAK case num if num <= 6: - return cls.VERY_WEAK + return PasswordStrength.VERY_WEAK elif upper and lower: match length: case num if 15 <= num: - return cls.STRONG + return PasswordStrength.STRONG case num if 12 <= num <= 14: - return cls.MODERATE + return PasswordStrength.MODERATE case num if 7 <= num <= 11: - return cls.WEAK + return PasswordStrength.WEAK case num if num <= 6: - return cls.VERY_WEAK + return PasswordStrength.VERY_WEAK elif lower or upper: match length: case num if 18 <= num: - return cls.STRONG + return PasswordStrength.STRONG case num if 14 <= num <= 17: - return cls.MODERATE + return PasswordStrength.MODERATE case num if 9 <= num <= 13: - return cls.WEAK + return PasswordStrength.WEAK case num if num <= 8: - return cls.VERY_WEAK + return PasswordStrength.VERY_WEAK - return cls.VERY_WEAK + return PasswordStrength.VERY_WEAK UserSerialization = TypedDict( From e7d38d0e8204c0baaf36b8baf37ed0cff9701ccb Mon Sep 17 00:00:00 2001 From: Softer Date: Wed, 22 Apr 2026 14:32:41 +0300 Subject: [PATCH 05/23] Fix Limine install with ESP mounted outside /boot (#4442) * Fix Limine install with ESP mounted outside /boot Place limine.conf next to the EFI binary on the ESP so it is found regardless of ESP mountpoint, and block unbootable layouts (non-UKI Limine with ESP not at /boot and no separate /boot partition) in GlobalMenu validation, guided.main() and _add_limine_bootloader(). Fixes #4333 * Extract bootloader layout validation into lib/bootloader/utils * Consolidate Limine layout validation in bootloader utils Move the boot-partition FAT check from GlobalMenu into validate_bootloader_layout so all three call sites (GlobalMenu, guided.py, Installer._add_limine_bootloader) share one function. Return a BootloaderValidationFailure dataclass (kind + description) instead of str | None, so callers can match on the failure kind and the description is built where partition context is in scope. * Encapsulate FAT filesystem detection in FilesystemType.is_fat() --- archinstall/lib/bootloader/utils.py | 63 ++++++++++++++++++++++++++ archinstall/lib/disk/device_handler.py | 2 +- archinstall/lib/global_menu.py | 15 +++--- archinstall/lib/installer.py | 17 ++++--- archinstall/lib/models/device.py | 3 ++ archinstall/scripts/guided.py | 10 ++++ 6 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 archinstall/lib/bootloader/utils.py diff --git a/archinstall/lib/bootloader/utils.py b/archinstall/lib/bootloader/utils.py new file mode 100644 index 00000000..a732f4e1 --- /dev/null +++ b/archinstall/lib/bootloader/utils.py @@ -0,0 +1,63 @@ +from dataclasses import dataclass +from enum import Enum, auto +from pathlib import Path + +from archinstall.lib.models.bootloader import Bootloader, BootloaderConfiguration +from archinstall.lib.models.device import DiskLayoutConfiguration + + +class BootloaderValidationFailureKind(Enum): + LimineNonFatBoot = auto() + LimineLayout = auto() + + +@dataclass(frozen=True) +class BootloaderValidationFailure: + kind: BootloaderValidationFailureKind + description: str + + +def validate_bootloader_layout( + bootloader_config: BootloaderConfiguration | None, + disk_config: DiskLayoutConfiguration | None, +) -> BootloaderValidationFailure | None: + """Validate bootloader configuration against disk layout. + + Returns a failure with a human-readable description if the configuration + would produce an unbootable system, or None if it is valid. + """ + if not (bootloader_config and disk_config): + return None + + if bootloader_config.bootloader == Bootloader.Limine: + boot_part = next( + (p for m in disk_config.device_modifications if (p := m.get_boot_partition())), + None, + ) + + # Limine reads its config and kernels from the boot partition, which + # must be FAT. + if boot_part and (boot_part.fs_type is None or not boot_part.fs_type.is_fat()): + return BootloaderValidationFailure( + kind=BootloaderValidationFailureKind.LimineNonFatBoot, + description='Limine does not support booting with a non-FAT boot partition.', + ) + + # When the ESP is the boot partition but mounted outside /boot and + # UKI is disabled, kernels end up on the root filesystem which + # Limine cannot access. + if not bootloader_config.uki: + efi_part = next( + (p for m in disk_config.device_modifications if (p := m.get_efi_partition())), + None, + ) + if efi_part and efi_part == boot_part and efi_part.mountpoint != Path('/boot'): + return BootloaderValidationFailure( + kind=BootloaderValidationFailureKind.LimineLayout, + description=( + f'Limine requires kernels on a FAT partition. The ESP is mounted at {efi_part.mountpoint}, ' + 'enable UKI or add a separate /boot partition to install Limine.' + ), + ) + + return None diff --git a/archinstall/lib/disk/device_handler.py b/archinstall/lib/disk/device_handler.py index 7ac05a31..2e51d3d2 100644 --- a/archinstall/lib/disk/device_handler.py +++ b/archinstall/lib/disk/device_handler.py @@ -250,7 +250,7 @@ class DeviceHandler: case FilesystemType.EXT2 | FilesystemType.EXT3 | FilesystemType.EXT4: # Force create options.append('-F') - case FilesystemType.FAT12 | FilesystemType.FAT16 | FilesystemType.FAT32: + case _ if fs_type.is_fat(): mkfs_type = 'fat' # Set FAT size options.extend(('-F', fs_type.value.removeprefix(mkfs_type))) diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index 2baef93d..3d94f31e 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -5,6 +5,7 @@ from archinstall.lib.applications.application_menu import ApplicationMenu from archinstall.lib.args import ArchConfig from archinstall.lib.authentication.authentication_menu import AuthenticationMenu from archinstall.lib.bootloader.bootloader_menu import BootloaderMenu +from archinstall.lib.bootloader.utils import validate_bootloader_layout from archinstall.lib.configuration import save_config from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu from archinstall.lib.general.general_menu import select_hostname, select_ntp, select_timezone @@ -17,7 +18,7 @@ from archinstall.lib.mirror.mirror_menu import MirrorMenu from archinstall.lib.models.application import ApplicationConfiguration, ZramConfiguration from archinstall.lib.models.authentication import AuthenticationConfiguration from archinstall.lib.models.bootloader import Bootloader, BootloaderConfiguration -from archinstall.lib.models.device import DiskLayoutConfiguration, DiskLayoutType, FilesystemType, PartitionModification +from archinstall.lib.models.device import DiskLayoutConfiguration, DiskLayoutType, PartitionModification from archinstall.lib.models.locale import LocaleConfiguration from archinstall.lib.models.mirrors import MirrorConfiguration from archinstall.lib.models.network import NetworkConfiguration, NicType @@ -486,16 +487,14 @@ class GlobalMenu(AbstractMenu[None]): if efi_partition is None: return 'EFI system partition (ESP) not found' - if efi_partition.fs_type not in [FilesystemType.FAT12, FilesystemType.FAT16, FilesystemType.FAT32]: + if efi_partition.fs_type is None or not efi_partition.fs_type.is_fat(): return 'ESP must be formatted as a FAT filesystem' - if bootloader == Bootloader.Limine: - if boot_partition.fs_type not in [FilesystemType.FAT12, FilesystemType.FAT16, FilesystemType.FAT32]: - return 'Limine does not support booting with a non-FAT boot partition' + if bootloader == Bootloader.Refind and not self._uefi: + return 'rEFInd can only be used on UEFI systems' - elif bootloader == Bootloader.Refind: - if not self._uefi: - return 'rEFInd can only be used on UEFI systems' + if failure := validate_bootloader_layout(bootloader_config, disk_config): + return failure.description return None diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 973e80ac..19560d75 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -12,6 +12,7 @@ from types import TracebackType from typing import Any, Self from archinstall.lib.boot import Boot +from archinstall.lib.bootloader.utils import validate_bootloader_layout from archinstall.lib.command import SysCommand, run from archinstall.lib.disk.fido import Fido2 from archinstall.lib.disk.luks import Luks2, unlock_luks2_dev @@ -30,7 +31,7 @@ from archinstall.lib.linux_path import LPath from archinstall.lib.locale.utils import verify_keyboard_layout, verify_x11_keyboard_layout from archinstall.lib.mirror.mirror_handler import MirrorListHandler from archinstall.lib.models.application import ZramAlgorithm -from archinstall.lib.models.bootloader import Bootloader +from archinstall.lib.models.bootloader import Bootloader, BootloaderConfiguration from archinstall.lib.models.device import ( DiskEncryption, DiskLayoutConfiguration, @@ -1466,6 +1467,14 @@ class Installer: elif not efi_partition.mountpoint: raise ValueError('EFI partition is not mounted') + # Safety net for programmatic callers that bypass GlobalMenu and + # guided.py validation. + if failure := validate_bootloader_layout( + BootloaderConfiguration(bootloader=Bootloader.Limine, uki=uki_enabled), + self._disk_config, + ): + raise DiskError(failure.description) + info(f'Limine EFI partition: {efi_partition.dev_path}') parent_dev_path = get_parent_device_path(efi_partition.safe_dev_path) @@ -1476,15 +1485,11 @@ class Installer: if bootloader_removable: efi_dir_path = efi_dir_path / 'BOOT' efi_dir_path_target = efi_dir_path_target / 'BOOT' - - boot_limine_path = self.target / 'boot' / 'limine' - boot_limine_path.mkdir(parents=True, exist_ok=True) - config_path = boot_limine_path / 'limine.conf' else: efi_dir_path = efi_dir_path / 'arch-limine' efi_dir_path_target = efi_dir_path_target / 'arch-limine' - config_path = efi_dir_path / 'limine.conf' + config_path = efi_dir_path / 'limine.conf' efi_dir_path.mkdir(parents=True, exist_ok=True) diff --git a/archinstall/lib/models/device.py b/archinstall/lib/models/device.py index 3015833d..7fa05407 100644 --- a/archinstall/lib/models/device.py +++ b/archinstall/lib/models/device.py @@ -802,6 +802,9 @@ class FilesystemType(StrEnum): def is_crypto(self) -> bool: return self == FilesystemType.CRYPTO_LUKS + def is_fat(self) -> bool: + return self in (FilesystemType.FAT12, FilesystemType.FAT16, FilesystemType.FAT32) + @property def parted_value(self) -> str: return self.value + '(v1)' if self == FilesystemType.LINUX_SWAP else self.value diff --git a/archinstall/scripts/guided.py b/archinstall/scripts/guided.py index 34133722..5cdcdad9 100644 --- a/archinstall/scripts/guided.py +++ b/archinstall/scripts/guided.py @@ -5,6 +5,7 @@ import time from archinstall.lib.applications.application_handler import ApplicationHandler from archinstall.lib.args import ArchConfig, ArchConfigHandler from archinstall.lib.authentication.authentication_handler import AuthenticationHandler +from archinstall.lib.bootloader.utils import validate_bootloader_layout from archinstall.lib.configuration import ConfigurationOutput from archinstall.lib.disk.filesystem import FilesystemHandler from archinstall.lib.disk.utils import disk_layouts @@ -211,6 +212,15 @@ def main(arch_config_handler: ArchConfigHandler | None = None) -> None: config.write_debug() config.save() + # Safety net for silent/config-file flow. The TUI menu blocks Install via + # GlobalMenu._validate_bootloader() before reaching this point. + if failure := validate_bootloader_layout( + arch_config_handler.config.bootloader_config, + arch_config_handler.config.disk_config, + ): + error(failure.description) + return + if arch_config_handler.args.dry_run: return From 00834f9c6ec034cbdd840ecfe9cfa40bdd4724df Mon Sep 17 00:00:00 2001 From: correctmost <134317971+correctmost@users.noreply.github.com> Date: Wed, 22 Apr 2026 07:33:35 -0400 Subject: [PATCH 06/23] Use bools instead of time values for SysCommandWorker attributes (#4462) Only the truthiness of the time values was being evaluated. This also reduces the usage of time.time(), which makes the codebase more resilient against clock drift issues. --- archinstall/lib/command.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/archinstall/lib/command.py b/archinstall/lib/command.py index a9d65cb0..b99854d2 100644 --- a/archinstall/lib/command.py +++ b/archinstall/lib/command.py @@ -44,8 +44,8 @@ class SysCommandWorker: self._trace_log_pos = 0 self.poll_object = epoll() self.child_fd: int | None = None - self.started: float | None = None - self.ended: float | None = None + self.started = False + self.ended = False self.remove_vt100_escape_codes_from_lines: bool = remove_vt100_escape_codes_from_lines def __contains__(self, key: bytes) -> bool: @@ -117,7 +117,7 @@ class SysCommandWorker: def is_alive(self) -> bool: self.poll() - if self.started and self.ended is None: + if self.started and not self.ended: return True return False @@ -173,11 +173,11 @@ class SysCommandWorker: self.peak(output) self._trace_log += output except OSError: - self.ended = time.time() + self.ended = True break if self.ended or (not got_output and not _pid_exists(self.pid)): - self.ended = time.time() + self.ended = True try: wait_status = os.waitpid(self.pid, 0)[1] self.exit_code = os.waitstatus_to_exitcode(wait_status) @@ -215,7 +215,7 @@ class SysCommandWorker: # Only parent process moves back to the original working directory os.chdir(old_dir) - self.started = time.time() + self.started = True self.poll_object.register(self.child_fd, EPOLLIN | EPOLLHUP) return True From 80ae85cc8b74b23556b8f033894bb6a274c3d711 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 21:41:09 +1000 Subject: [PATCH 07/23] Update dependency mypy to v1.20.2 (#4458) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 944d1294..e9c7285c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,7 @@ Source = "https://github.com/archlinux/archinstall" [project.optional-dependencies] log = ["systemd_python==235"] dev = [ - "mypy==1.20.1", + "mypy==1.20.2", "flake8==7.3.0", "pre-commit==4.5.1", "ruff==0.15.11", From 6652197e3557d2024b15a230b6cbdef5eef66434 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 11:06:09 +1000 Subject: [PATCH 08/23] Update pre-commit hook pre-commit/mirrors-mypy to v1.20.2 (#4463) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 22adc703..a496557e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,7 +31,7 @@ repos: args: [--config=.flake8] fail_fast: true - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.20.1 + rev: v1.20.2 hooks: - id: mypy args: [ From 6e222bcdd899e9b51aab00e9e08562d30246410d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 11:08:51 +1000 Subject: [PATCH 09/23] Update dependency pre-commit to v4.6.0 (#4459) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e9c7285c..dd42c642 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ log = ["systemd_python==235"] dev = [ "mypy==1.20.2", "flake8==7.3.0", - "pre-commit==4.5.1", + "pre-commit==4.6.0", "ruff==0.15.11", "pylint==4.0.5", "pytest==9.0.3", From de430190947549f3312e9d262e9ca55a34952896 Mon Sep 17 00:00:00 2001 From: Thierry M <52124613+roxfr@users.noreply.github.com> Date: Thu, 23 Apr 2026 12:07:54 +0200 Subject: [PATCH 10/23] Update base.po (#4467) --- archinstall/locales/fr/LC_MESSAGES/base.po | 1133 ++++++++++++-------- 1 file changed, 712 insertions(+), 421 deletions(-) diff --git a/archinstall/locales/fr/LC_MESSAGES/base.po b/archinstall/locales/fr/LC_MESSAGES/base.po index 042f5d69..d19a3938 100644 --- a/archinstall/locales/fr/LC_MESSAGES/base.po +++ b/archinstall/locales/fr/LC_MESSAGES/base.po @@ -2,20 +2,24 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2025-04-11 23:02+0200\n" -"Last-Translator: Roxfr \n" +"PO-Revision-Date: 2026-04-23 11:28+0200\n" +"Last-Translator: Roxfr \n" "Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.6\n" +"X-Generator: Poedit 3.9\n" msgid "[!] A log file has been created here: {} {}" msgstr "[!] Un fichier journal a été créé ici : {} {}" -msgid " Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues" -msgstr " Veuillez soumettre ce problème (et le fichier) à https://github.com/archlinux/archinstall/issues" +msgid "" +" Please submit this issue (and file) to https://github.com/archlinux/" +"archinstall/issues" +msgstr "" +" Veuillez soumettre ce problème (et le fichier) à https://github.com/" +"archlinux/archinstall/issues" msgid "Do you really want to abort?" msgstr "Voulez-vous vraiment abandonner ?" @@ -30,10 +34,13 @@ msgid "Desired hostname for the installation: " msgstr "Nom d'hôte souhaité pour l'installation : " msgid "Username for required superuser with sudo privileges: " -msgstr "Nom d'utilisateur pour le superutilisateur requis avec les privilèges sudo : " +msgstr "" +"Nom d'utilisateur pour le superutilisateur requis avec les privilèges sudo : " msgid "Any additional users to install (leave blank for no users): " -msgstr "Utilisateur supplémentaire à installer (laisser vide pour aucun utilisateur) : " +msgstr "" +"Utilisateur supplémentaire à installer (laisser vide pour aucun " +"utilisateur) : " msgid "Should this user be a superuser (sudoer)?" msgstr "Cet utilisateur doit-il être un superutilisateur (sudoer) ?" @@ -42,7 +49,9 @@ msgid "Select a timezone" msgstr "Sélectionner un fuseau horaire" msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?" -msgstr "Souhaitez-vous utiliser GRUB comme chargeur de démarrage au lieu de systemd-boot ?" +msgstr "" +"Souhaitez-vous utiliser GRUB comme chargeur de démarrage au lieu de systemd-" +"boot ?" msgid "Choose a bootloader" msgstr "Choisir un chargeur de démarrage" @@ -50,42 +59,68 @@ msgstr "Choisir un chargeur de démarrage" msgid "Choose an audio server" msgstr "Choisir un serveur audio" -msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr and optional profile packages are installed." -msgstr "Seuls les paquets tels que base, base-devel, linux, linux-firmware, efibootmgr et les paquets de profil optionnels sont installés." - -msgid "Note: base-devel is no longer installed by default. Add it here if you need build tools." +msgid "" +"Only packages such as base, base-devel, linux, linux-firmware, efibootmgr " +"and optional profile packages are installed." msgstr "" +"Seuls les paquets tels que base, base-devel, linux, linux-firmware, " +"efibootmgr et les paquets de profil optionnels sont installés." -msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt." -msgstr "Si vous désirez un navigateur Web, tel que firefox ou chrome, vous pouvez le spécifier dans l'invite suivante." +msgid "" +"Note: base-devel is no longer installed by default. Add it here if you need " +"build tools." +msgstr "" +"Remarque : base-devel n’est plus installé par défaut. Ajoutez-le ici si vous " +"avez besoin d’outils de compilation." -msgid "Write additional packages to install (space separated, leave blank to skip): " -msgstr "Saisir les paquets supplémentaires à installer (séparés par des espaces, vide pour ignorer) : " +msgid "" +"If you desire a web browser, such as firefox or chromium, you may specify it " +"in the following prompt." +msgstr "" +"Si vous désirez un navigateur Web, tel que firefox ou chrome, vous pouvez le " +"spécifier dans l'invite suivante." + +msgid "" +"Write additional packages to install (space separated, leave blank to skip): " +msgstr "" +"Saisir les paquets supplémentaires à installer (séparés par des espaces, " +"vide pour ignorer) : " msgid "Copy ISO network configuration to installation" msgstr "Copier la configuration réseau ISO dans l'installation" -msgid "Use NetworkManager (necessary for configuring internet graphically in GNOME and KDE)" -msgstr "Utiliser NetworkManager (nécessaire pour configurer graphiquement Internet dans GNOME et KDE)" +msgid "" +"Use NetworkManager (necessary for configuring internet graphically in GNOME " +"and KDE)" +msgstr "" +"Utiliser NetworkManager (nécessaire pour configurer graphiquement Internet " +"dans GNOME et KDE)" msgid "Select one network interface to configure" msgstr "Sélectionner une interface réseau à configurer" -msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" -msgstr "Sélectionner le mode à configurer pour \"{}\" ou ignorer pour utiliser le mode par défaut \"{}\"" +msgid "" +"Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" +msgstr "" +"Sélectionner le mode à configurer pour \"{}\" ou ignorer pour utiliser le " +"mode par défaut \"{}\"" #, python-brace-format msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " msgstr "Entrer l'IP et le sous-réseau pour {} (exemple : 192.168.0.5/24) : " msgid "Enter your gateway (router) IP address or leave blank for none: " -msgstr "Entrer l'adresse IP de votre passerelle (routeur) ou laisser vide pour aucune : " +msgstr "" +"Entrer l'adresse IP de votre passerelle (routeur) ou laisser vide pour " +"aucune : " msgid "Enter your DNS servers (space separated, blank for none): " msgstr "Entrer vos serveurs DNS (séparés par des espaces, vide pour aucun) : " msgid "Select which filesystem your main partition should use" -msgstr "Sélectionner le système de fichiers que votre partition principale doit utiliser" +msgstr "" +"Sélectionner le système de fichiers que votre partition principale doit " +"utiliser" msgid "Current partition layout" msgstr "Disposition actuelle des partitions" @@ -100,14 +135,21 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Entrer un type de système de fichiers souhaité pour la partition" -msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " -msgstr "Entrer l'emplacement de départ (en unités séparées : s, Go, %, etc. ; par défaut : {}) : " +msgid "" +"Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" +"Entrer l'emplacement de départ (en unités séparées : s, Go, %, etc. ; par " +"défaut : {}) : " msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " -msgstr "Entrer l'emplacement de fin (en unités séparées : s, Go, %, etc. ; ex : {}) : " +msgstr "" +"Entrer l'emplacement de fin (en unités séparées : s, Go, %, etc. ; ex : " +"{}) : " msgid "{} contains queued partitions, this will remove those, are you sure?" -msgstr "{} contient des partitions en file d'attente, cela les supprimera, êtes-vous sûr ?" +msgstr "" +"{} contient des partitions en file d'attente, cela les supprimera, êtes-vous " +"sûr ?" msgid "" "{}\n" @@ -127,11 +169,17 @@ msgstr "" "\n" "Sélectionner par index où et quelle partition montée" -msgid " * Partition mount-points are relative to inside the installation, the boot would be /boot as an example." -msgstr " * Les points de montage de la partition sont relatifs à l'intérieur de l'installation, le démarrage serait /boot par exemple." +msgid "" +" * Partition mount-points are relative to inside the installation, the boot " +"would be /boot as an example." +msgstr "" +" * Les points de montage de la partition sont relatifs à l'intérieur de " +"l'installation, le démarrage serait /boot par exemple." msgid "Select where to mount partition (leave blank to remove mountpoint): " -msgstr "Sélectionner où monter la partition (laisser vide pour supprimer le point de montage) : " +msgstr "" +"Sélectionner où monter la partition (laisser vide pour supprimer le point de " +"montage) : " msgid "" "{}\n" @@ -176,34 +224,58 @@ msgid "Archinstall language" msgstr "Langue d'Archinstall" msgid "Wipe all selected drives and use a best-effort default partition layout" -msgstr "Effacer tous les lecteurs sélectionnés et utiliser une disposition de partition par défaut optimale" +msgstr "" +"Effacer tous les lecteurs sélectionnés et utiliser une disposition de " +"partition par défaut optimale" -msgid "Select what to do with each individual drive (followed by partition usage)" -msgstr "Sélectionner ce qu'il faut faire avec chaque lecteur individuel (suivi de l'utilisation de la partition)" +msgid "" +"Select what to do with each individual drive (followed by partition usage)" +msgstr "" +"Sélectionner ce qu'il faut faire avec chaque lecteur individuel (suivi de " +"l'utilisation de la partition)" msgid "Select what you wish to do with the selected block devices" -msgstr "Sélectionner ce que vous souhaitez faire avec les périphériques de bloc sélectionnés" +msgstr "" +"Sélectionner ce que vous souhaitez faire avec les périphériques de bloc " +"sélectionnés" -msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments" -msgstr "Ceci est une liste préprogrammée de profiles, ils pourraient faciliter l'installation d'outils comme les environnements de bureau" +msgid "" +"This is a list of pre-programmed profiles, they might make it easier to " +"install things like desktop environments" +msgstr "" +"Ceci est une liste préprogrammée de profiles, ils pourraient faciliter " +"l'installation d'outils comme les environnements de bureau" msgid "Select keyboard layout" msgstr "Sélectionner la disposition du clavier" msgid "Select one of the regions to download packages from" -msgstr "Sélectionner l'une des régions depuis lesquelles télécharger les paquets" +msgstr "" +"Sélectionner l'une des régions depuis lesquelles télécharger les paquets" msgid "Select one or more hard drives to use and configure" msgstr "Sélectionner un ou plusieurs disques durs à utiliser et à configurer" -msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options." -msgstr "Pour une meilleure compatibilité avec votre matériel AMD, vous pouvez utiliser les options entièrement open source ou AMD / ATI." +msgid "" +"For the best compatibility with your AMD hardware, you may want to use " +"either the all open-source or AMD / ATI options." +msgstr "" +"Pour une meilleure compatibilité avec votre matériel AMD, vous pouvez " +"utiliser les options entièrement open source ou AMD / ATI." -msgid "For the best compatibility with your Intel hardware, you may want to use either the all open-source or Intel options.\n" -msgstr "Pour une compatibilité optimale avec votre matériel Intel, vous pouvez utiliser les options entièrement open source ou Intel.\n" +msgid "" +"For the best compatibility with your Intel hardware, you may want to use " +"either the all open-source or Intel options.\n" +msgstr "" +"Pour une compatibilité optimale avec votre matériel Intel, vous pouvez " +"utiliser les options entièrement open source ou Intel.\n" -msgid "For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n" -msgstr "Pour une meilleure compatibilité avec votre matériel Nvidia, vous pouvez utiliser le pilote propriétaire Nvidia.\n" +msgid "" +"For the best compatibility with your Nvidia hardware, you may want to use " +"the Nvidia proprietary driver.\n" +msgstr "" +"Pour une meilleure compatibilité avec votre matériel Nvidia, vous pouvez " +"utiliser le pilote propriétaire Nvidia.\n" msgid "" "\n" @@ -212,7 +284,8 @@ msgid "" msgstr "" "\n" "\n" -"Sélectionner un pilote graphique ou laisser vide pour installer tous les pilotes open-source" +"Sélectionner un pilote graphique ou laisser vide pour installer tous les " +"pilotes open-source" msgid "All open-source (default)" msgstr "Tout open-source (par défaut)" @@ -235,8 +308,12 @@ msgstr "Sélectionner une ou plusieurs des options ci-dessous : " msgid "Adding partition...." msgstr "Ajout de la partition...." -msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's." -msgstr "Vous devez entrer un type de fs valide pour continuer. Voir `man parted` pour les types de fs valides." +msgid "" +"You need to enter a valid fs-type in order to continue. See `man parted` for " +"valid fs-type's." +msgstr "" +"Vous devez entrer un type de fs valide pour continuer. Voir `man parted` " +"pour les types de fs valides." msgid "Error: Listing profiles on URL \"{}\" resulted in:" msgstr "Erreur : la liste des profils sur l'URL \"{}\" a entraîné :" @@ -309,7 +386,8 @@ msgid "" msgstr "" "Vous avez décidé d'ignorer la sélection du disque dur\n" "et vous utiliserez la configuration de disque montée sur {} (expérimental)\n" -"ATTENTION : Archinstall ne vérifiera pas l'adéquation de cette configuration\n" +"ATTENTION : Archinstall ne vérifiera pas l'adéquation de cette " +"configuration\n" "Souhaitez-vous continuer ?" msgid "Re-using partition instance: {}" @@ -334,7 +412,8 @@ msgid "Mark/Unmark a partition as encrypted" msgstr "Marquer/Démarquer une partition comme encrypté" msgid "Mark/Unmark a partition as bootable (automatic for /boot)" -msgstr "Marquer/Démarquer une partition comme amorçable (automatique pour /boot)" +msgstr "" +"Marquer/Démarquer une partition comme amorçable (automatique pour /boot)" msgid "Set desired filesystem for a partition" msgstr "Définir le système de fichiers souhaité pour une partition" @@ -374,7 +453,9 @@ msgid "Enter a encryption password for {}" msgstr "Entrer un mot de passe de chiffrement pour {}" msgid "Enter disk encryption password (leave blank for no encryption): " -msgstr "Entrer le mot de passe de chiffrement du disque (laisser vide pour aucun chiffrement) : " +msgstr "" +"Entrer le mot de passe de chiffrement du disque (laisser vide pour aucun " +"chiffrement) : " msgid "Create a required super-user with sudo privileges: " msgstr "Créer un super-utilisateur requis avec les privilèges sudo : " @@ -385,31 +466,44 @@ msgstr "Entrer le mot de passe root (laisser vide pour désactiver root) : " msgid "Password for user \"{}\": " msgstr "Mot de passe pour l'utilisateur \"{}\" : " -msgid "Verifying that additional packages exist (this might take a few seconds)" -msgstr "Vérifier que des paquets supplémentaires existent (cela peut prendre quelques secondes)" - -msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n" -msgstr "Souhaitez-vous utiliser la synchronisation automatique de l'heure (NTP) avec les serveurs de temps par défaut ?\n" +msgid "" +"Verifying that additional packages exist (this might take a few seconds)" +msgstr "" +"Vérifier que des paquets supplémentaires existent (cela peut prendre " +"quelques secondes)" msgid "" -"Hardware time and other post-configuration steps might be required in order for NTP to work.\n" +"Would you like to use automatic time synchronization (NTP) with the default " +"time servers?\n" +msgstr "" +"Souhaitez-vous utiliser la synchronisation automatique de l'heure (NTP) avec " +"les serveurs de temps par défaut ?\n" + +msgid "" +"Hardware time and other post-configuration steps might be required in order " +"for NTP to work.\n" "For more information, please check the Arch wiki" msgstr "" -"Le temps matériel et d'autres étapes de post-configuration peuvent être nécessaires pour que NTP fonctionne.\n" +"Le temps matériel et d'autres étapes de post-configuration peuvent être " +"nécessaires pour que NTP fonctionne.\n" "Pour plus d'informations, veuillez consulter le wiki Arch" msgid "Enter a username to create an additional user (leave blank to skip): " -msgstr "Entrer un nom d'utilisateur pour créer un utilisateur supplémentaire (laisser vide pour ignorer) : " +msgstr "" +"Entrer un nom d'utilisateur pour créer un utilisateur supplémentaire " +"(laisser vide pour ignorer) : " msgid "Use ESC to skip\n" msgstr "Utiliser ESC pour ignorer\n" msgid "" "\n" -" Choose an object from the list, and select one of the available actions for it to execute" +" Choose an object from the list, and select one of the available actions for " +"it to execute" msgstr "" "\n" -"Choisir un objet dans la liste et sélectionner l'une des actions disponibles pour qu'il s'exécute" +"Choisir un objet dans la liste et sélectionner l'une des actions disponibles " +"pour qu'il s'exécute" msgid "Cancel" msgstr "Annuler" @@ -445,11 +539,18 @@ msgstr "" "\n" "Voici la configuration choisie :" -msgid "Pacman is already running, waiting maximum 10 minutes for it to terminate." -msgstr "Pacman est déjà en cours d'exécution, attendez au maximum 10 minutes pour qu'il se termine." +msgid "" +"Pacman is already running, waiting maximum 10 minutes for it to terminate." +msgstr "" +"Pacman est déjà en cours d'exécution, attendez au maximum 10 minutes pour " +"qu'il se termine." -msgid "Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall." -msgstr "Le verrou pacman préexistant n'a jamais été fermé. Veuillez nettoyer toutes les sessions pacman existantes avant d'utiliser archinstall." +msgid "" +"Pre-existing pacman lock never exited. Please clean up any existing pacman " +"sessions before using archinstall." +msgstr "" +"Le verrou pacman préexistant n'a jamais été fermé. Veuillez nettoyer toutes " +"les sessions pacman existantes avant d'utiliser archinstall." msgid "Choose which optional additional repositories to enable" msgstr "Choisir les dépôts supplémentaires en option à activer" @@ -586,14 +687,17 @@ msgid "Select the desired subvolume options " msgstr "Sélectionner les options de sous-volume souhaitées " msgid "Define users with sudo privilege, by username: " -msgstr "Définir les utilisateurs avec le privilège sudo, par nom d'utilisateur : " +msgstr "" +"Définir les utilisateurs avec le privilège sudo, par nom d'utilisateur : " #, python-brace-format msgid "[!] A log file has been created here: {}" msgstr "[!] Un fichier journal a été créé ici : {}" msgid "Would you like to use BTRFS subvolumes with a default structure?" -msgstr "Souhaitez-vous utiliser des sous-volumes BTRFS avec une structure par défaut ?" +msgstr "" +"Souhaitez-vous utiliser des sous-volumes BTRFS avec une structure par " +"défaut ?" msgid "Would you like to use BTRFS compression?" msgstr "Souhaitez-vous utiliser la compression BTRFS ?" @@ -601,8 +705,12 @@ msgstr "Souhaitez-vous utiliser la compression BTRFS ?" msgid "Would you like to create a separate partition for /home?" msgstr "Souhaitez-vous créer une partition séparée pour /home ?" -msgid "The selected drives do not have the minimum capacity required for an automatic suggestion\n" -msgstr "Les disques sélectionnés n'ont pas la capacité minimale requise pour une suggestion automatique\n" +msgid "" +"The selected drives do not have the minimum capacity required for an " +"automatic suggestion\n" +msgstr "" +"Les disques sélectionnés n'ont pas la capacité minimale requise pour une " +"suggestion automatique\n" msgid "Minimum capacity for /home partition: {}GB\n" msgstr "Capacité minimale pour la partition /home : {} Go\n" @@ -629,7 +737,9 @@ msgid "No iface specified for manual configuration" msgstr "Aucun iface spécifié pour la configuration manuelle" msgid "Manual nic configuration with no auto DHCP requires an IP address" -msgstr "La configuration manuelle de la carte réseau sans DHCP automatique nécessite une adresse IP" +msgstr "" +"La configuration manuelle de la carte réseau sans DHCP automatique nécessite " +"une adresse IP" msgid "Add interface" msgstr "Ajouter une interface" @@ -649,23 +759,42 @@ msgstr "Configuration manuelle" msgid "Mark/Unmark a partition as compressed (btrfs only)" msgstr "Marquer/Démarquer une partition comme compressée (btrfs uniquement)" -msgid "The password you are using seems to be weak, are you sure you want to use it?" -msgstr "Le mot de passe que vous utilisez semble faible, êtes-vous sûr de vouloir l'utiliser ?" +msgid "" +"The password you are using seems to be weak, are you sure you want to use it?" +msgstr "" +"Le mot de passe que vous utilisez semble faible, êtes-vous sûr de vouloir " +"l'utiliser ?" -msgid "Provides a selection of desktop environments and tiling window managers, e.g. gnome, kde, sway" -msgstr "Fournit une sélection d'environnements de bureau et de gestionnaires de fenêtres en mosaïque, par ex. gnome, kde, sway" +msgid "" +"Provides a selection of desktop environments and tiling window managers, " +"e.g. gnome, kde, sway" +msgstr "" +"Fournit une sélection d'environnements de bureau et de gestionnaires de " +"fenêtres en mosaïque, par ex. gnome, kde, sway" msgid "Select your desired desktop environment" msgstr "Sélectionner l'environnement de bureau souhaité" -msgid "A very basic installation that allows you to customize Arch Linux as you see fit." -msgstr "Une installation très basique qui vous permet de personnaliser Arch Linux comme bon vous semble." +msgid "" +"A very basic installation that allows you to customize Arch Linux as you see " +"fit." +msgstr "" +"Une installation très basique qui vous permet de personnaliser Arch Linux " +"comme bon vous semble." -msgid "Provides a selection of various server packages to install and enable, e.g. httpd, nginx, mariadb" -msgstr "Fournit une sélection de divers paquets de serveur à installer et à activer, par ex. httpd, nginx, mariadb" +msgid "" +"Provides a selection of various server packages to install and enable, e.g. " +"httpd, nginx, mariadb" +msgstr "" +"Fournit une sélection de divers paquets de serveur à installer et à activer, " +"par ex. httpd, nginx, mariadb" -msgid "Choose which servers to install, if none then a minimal installation will be done" -msgstr "Choisir les serveurs à installer, s'il n'y en a pas, alors une installation minimale sera effectuée" +msgid "" +"Choose which servers to install, if none then a minimal installation will be " +"done" +msgstr "" +"Choisir les serveurs à installer, s'il n'y en a pas, alors une installation " +"minimale sera effectuée" msgid "Installs a minimal system as well as xorg and graphics drivers." msgstr "Installe un système minimal ainsi que les pilotes graphiques et xorg." @@ -673,8 +802,12 @@ msgstr "Installe un système minimal ainsi que les pilotes graphiques et xorg." msgid "Press Enter to continue." msgstr "Appuyer sur Entrée pour continuer." -msgid "Would you like to chroot into the newly created installation and perform post-installation configuration?" -msgstr "Souhaitez-vous chrooter dans l'installation nouvellement créée et effectuer la configuration post-installation ?" +msgid "" +"Would you like to chroot into the newly created installation and perform " +"post-installation configuration?" +msgstr "" +"Souhaitez-vous chrooter dans l'installation nouvellement créée et effectuer " +"la configuration post-installation ?" msgid "Are you sure you want to reset this setting?" msgstr "Voulez-vous vraiment réinitialiser ce paramètre ?" @@ -683,10 +816,16 @@ msgid "Select one or more hard drives to use and configure\n" msgstr "Sélectionner un ou plusieurs disques durs à utiliser et à configurer\n" msgid "Any modifications to the existing setting will reset the disk layout!" -msgstr "Toute modification du paramètre existant réinitialisera la disposition du disque !" +msgstr "" +"Toute modification du paramètre existant réinitialisera la disposition du " +"disque !" -msgid "If you reset the harddrive selection this will also reset the current disk layout. Are you sure?" -msgstr "Si vous réinitialisez la sélection du disque dur, cela réinitialisera également la disposition actuelle du disque. Êtes-vous sûr ?" +msgid "" +"If you reset the harddrive selection this will also reset the current disk " +"layout. Are you sure?" +msgstr "" +"Si vous réinitialisez la sélection du disque dur, cela réinitialisera " +"également la disposition actuelle du disque. Êtes-vous sûr ?" msgid "Save and exit" msgstr "Sauvegarder et quitter" @@ -696,7 +835,8 @@ msgid "" "contains queued partitions, this will remove those, are you sure?" msgstr "" "{}\n" -"contient des partitions en file d'attente, cela les supprimera, êtes-vous sûr ?" +"contient des partitions en file d'attente, cela les supprimera, êtes-vous " +"sûr ?" msgid "No audio server" msgstr "Pas de serveur audio" @@ -732,8 +872,13 @@ msgstr "Ajouter : " msgid "Value: " msgstr "Valeur : " -msgid "You can skip selecting a drive and partitioning and use whatever drive-setup is mounted at /mnt (experimental)" -msgstr "Vous pouvez ignorer la sélection d'un lecteur et le partitionnement et utiliser n'importe quelle configuration de lecteur montée sur /mnt (expérimental)" +msgid "" +"You can skip selecting a drive and partitioning and use whatever drive-setup " +"is mounted at /mnt (experimental)" +msgstr "" +"Vous pouvez ignorer la sélection d'un lecteur et le partitionnement et " +"utiliser n'importe quelle configuration de lecteur montée sur /mnt " +"(expérimental)" msgid "Select one of the disks or skip and use /mnt as default" msgstr "Sélectionner l'un des disques ou ignorer et utiliser /mnt par défaut" @@ -756,8 +901,12 @@ msgstr "Espace libre" msgid "Bus-type" msgstr "Type de bus" -msgid "Either root-password or at least 1 user with sudo privileges must be specified" -msgstr "Le mot de passe root ou au moins 1 utilisateur avec des privilèges sudo doit être spécifié" +msgid "" +"Either root-password or at least 1 user with sudo privileges must be " +"specified" +msgstr "" +"Le mot de passe root ou au moins 1 utilisateur avec des privilèges sudo doit " +"être spécifié" msgid "Enter username (leave blank to skip): " msgstr "Entrer le nom d'utilisateur (laisser vide pour ignorer) : " @@ -795,8 +944,12 @@ msgstr "Supprimer le sous-volume" msgid "Configured {} interfaces" msgstr "Interfaces {} configurées" -msgid "This option enables the number of parallel downloads that can occur during installation" -msgstr "Cette option active le nombre de téléchargements parallèles qui peuvent se produire pendant l'installation" +msgid "" +"This option enables the number of parallel downloads that can occur during " +"installation" +msgstr "" +"Cette option active le nombre de téléchargements parallèles qui peuvent se " +"produire pendant l'installation" msgid "" "Enter the number of parallel downloads to be enabled.\n" @@ -807,37 +960,50 @@ msgstr "" " (Entrer une valeur comprise entre 1 et {})\n" "Note :" -msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {} downloads at a time )" -msgstr " - Valeur maximale : {} (Autorise {} téléchargements parallèles, autorise {} téléchargements à la fois)" +msgid "" +" - Maximum value : {} ( Allows {} parallel downloads, allows {} downloads " +"at a time )" +msgstr "" +" - Valeur maximale : {} (Autorise {} téléchargements parallèles, autorise {} " +"téléchargements à la fois)" -msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a time )" -msgstr " - Valeur minimale : 1 (Autorise 1 téléchargement parallèle, autorise 2 téléchargements à la fois)" +msgid "" +" - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a " +"time )" +msgstr "" +" - Valeur minimale : 1 (Autorise 1 téléchargement parallèle, autorise 2 " +"téléchargements à la fois)" -msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )" -msgstr " - Désactiver/Défaut : 0 (Désactive le téléchargement parallèle, n'autorise qu'un seul téléchargement à la fois)" +msgid "" +" - Disable/Default : 0 ( Disables parallel downloading, allows only 1 " +"download at a time )" +msgstr "" +" - Désactiver/Défaut : 0 (Désactive le téléchargement parallèle, n'autorise " +"qu'un seul téléchargement à la fois)" #, python-brace-format -msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]" -msgstr "Entrée invalide ! Réessayer avec une entrée valide [1 pour {max_downloads}, ou 0 pour désactiver]" +msgid "" +"Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to " +"disable]" +msgstr "" +"Entrée invalide ! Réessayer avec une entrée valide [1 pour {max_downloads}, " +"ou 0 pour désactiver]" msgid "Parallel Downloads" msgstr "Téléchargements parallèles" msgid "Pacman" -msgstr "" +msgstr "Pacman" msgid "Color" -msgstr "" +msgstr "Couleur" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Enter the number of parallel downloads (1-{})" -msgstr "" -"Saisir le nombre de téléchargements parallèles à activer.\n" -"\n" -"Note :\n" +msgstr "Entrer le nombre de téléchargements simultanés (1–{})" msgid "Enable colored output for pacman" -msgstr "" +msgstr "Activer l’affichage en couleur pour pacman" msgid "ESC to skip" msgstr "ESC pour ignorer" @@ -851,14 +1017,20 @@ msgstr "TAB pour sélectionner" msgid "[Default value: 0] > " msgstr "[Valeur par défaut : 0] > " -msgid "To be able to use this translation, please install a font manually that supports the language." -msgstr "Pour pouvoir utiliser cette traduction, veuillez installer manuellement une police prenant en charge la langue." +msgid "" +"To be able to use this translation, please install a font manually that " +"supports the language." +msgstr "" +"Pour pouvoir utiliser cette traduction, veuillez installer manuellement une " +"police prenant en charge la langue." msgid "The font should be stored as {}" msgstr "La police d'écriture doit être stockée sous {}" msgid "Archinstall requires root privileges to run. See --help for more." -msgstr "Archinstall nécessite des privilèges root pour s'exécuter. Voir --help pour plus d'informations." +msgstr "" +"Archinstall nécessite des privilèges root pour s'exécuter. Voir --help pour " +"plus d'informations." msgid "Select an execution mode" msgstr "Sélectionner un mode d'exécution" @@ -868,14 +1040,22 @@ msgid "Unable to fetch profile from specified url: {}" msgstr "Impossible de récupérer le profil à partir de l'URL spécifiée : {}" #, python-brace-format -msgid "Profiles must have unique name, but profile definitions with duplicate name found: {}" -msgstr "Les profils doivent avoir un nom unique, mais des définitions de profil avec un nom en double ont été trouvées : {}" +msgid "" +"Profiles must have unique name, but profile definitions with duplicate name " +"found: {}" +msgstr "" +"Les profils doivent avoir un nom unique, mais des définitions de profil avec " +"un nom en double ont été trouvées : {}" msgid "Select one or more devices to use and configure" msgstr "Sélectionner un ou plusieurs périphériques à utiliser et à configurer" -msgid "If you reset the device selection this will also reset the current disk layout. Are you sure?" -msgstr "Si vous réinitialisez la sélection de périphérique, cela réinitialisera également la disposition actuelle du disque. Etes-vous sûr ?" +msgid "" +"If you reset the device selection this will also reset the current disk " +"layout. Are you sure?" +msgstr "" +"Si vous réinitialisez la sélection de périphérique, cela réinitialisera " +"également la disposition actuelle du disque. Etes-vous sûr ?" msgid "Existing Partitions" msgstr "Partitions existantes" @@ -894,8 +1074,12 @@ msgstr "Capacité minimale pour la partition /home : {} Gio\n" msgid "Minimum capacity for Arch Linux partition: {}GiB" msgstr "Capacité minimale pour la partition Arch Linux : {} Gio" -msgid "This is a list of pre-programmed profiles_bck, they might make it easier to install things like desktop environments" -msgstr "Ceci est une liste préprogrammée de profiles_bck, ils pourraient faciliter l'installation de choses comme les environnements de bureau" +msgid "" +"This is a list of pre-programmed profiles_bck, they might make it easier to " +"install things like desktop environments" +msgstr "" +"Ceci est une liste préprogrammée de profiles_bck, ils pourraient faciliter " +"l'installation de choses comme les environnements de bureau" msgid "Current profile selection" msgstr "Sélection du profil actuel" @@ -927,14 +1111,26 @@ msgstr "Supprimer la partition" msgid "Partition" msgstr "Partition" -msgid "This partition is currently encrypted, to format it a filesystem has to be specified" -msgstr "Cette partition est actuellement encrypté, pour la formater, un système de fichiers doit être spécifié" +msgid "" +"This partition is currently encrypted, to format it a filesystem has to be " +"specified" +msgstr "" +"Cette partition est actuellement encrypté, pour la formater, un système de " +"fichiers doit être spécifié" -msgid "Partition mount-points are relative to inside the installation, the boot would be /boot as an example." -msgstr "Les points de montage de partition sont relatifs à l'intérieur de l'installation, le démarrage serait /boot par exemple." +msgid "" +"Partition mount-points are relative to inside the installation, the boot " +"would be /boot as an example." +msgstr "" +"Les points de montage de partition sont relatifs à l'intérieur de " +"l'installation, le démarrage serait /boot par exemple." -msgid "If mountpoint /boot is set, then the partition will also be marked as bootable." -msgstr "Si le point de montage /boot est défini, la partition sera également marquée comme amorçable." +msgid "" +"If mountpoint /boot is set, then the partition will also be marked as " +"bootable." +msgstr "" +"Si le point de montage /boot est défini, la partition sera également marquée " +"comme amorçable." msgid "Mountpoint: " msgstr "Point de montage : " @@ -948,11 +1144,17 @@ msgstr "Total des secteurs : {}" msgid "Enter the start sector (default: {}): " msgstr "Saisir le secteur de début (par défaut : {}) : " -msgid "Enter the end sector of the partition (percentage or block number, default: {}): " -msgstr "Saisir le secteur de fin de la partition (pourcentage ou numéro de bloc, par défaut : {}) : " +msgid "" +"Enter the end sector of the partition (percentage or block number, default: " +"{}): " +msgstr "" +"Saisir le secteur de fin de la partition (pourcentage ou numéro de bloc, par " +"défaut : {}) : " msgid "This will remove all newly added partitions, continue?" -msgstr "Cela supprimera toutes les partitions nouvellement ajoutées, voulez-vous continuer ?" +msgstr "" +"Cela supprimera toutes les partitions nouvellement ajoutées, voulez-vous " +"continuer ?" #, python-brace-format msgid "Partition management: {}" @@ -966,13 +1168,16 @@ msgid "Encryption type" msgstr "Type de chiffrement" msgid "Iteration time" -msgstr "" +msgstr "Temps d’itération" msgid "Enter iteration time for LUKS encryption (in milliseconds)" msgstr "" +"Entrer le temps d’itération pour le chiffrement LUKS (en millisecondes)" msgid "Higher values increase security but slow down boot time" -msgstr "Des valeurs plus grandes peuvent agrandir la sécurité, mais peuvent ralentir le temps de démarrage" +msgstr "" +"Des valeurs plus grandes peuvent agrandir la sécurité, mais peuvent ralentir " +"le temps de démarrage" msgid "Default: 10000ms, Recommended range: 1000-60000" msgstr "Par défaut: 10000ms, range recommandé: 1000-60000" @@ -1042,14 +1247,20 @@ msgid "Back" msgstr "Retour" msgid "Please chose which greeter to install for the chosen profiles: {}" -msgstr "Veuillez choisir le greeter (interface de connexion) à installer pour les profils choisis : {}" +msgstr "" +"Veuillez choisir le greeter (interface de connexion) à installer pour les " +"profils choisis : {}" #, python-brace-format msgid "Environment type: {}" msgstr "Type d'environnement : {}" -msgid "The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues, are you okay with that?" -msgstr "Le pilote Nvidia propriétaire n'est pas pris en charge par Sway. Il est probable que vous rencontriez des problèmes, êtes-vous d'accord avec cela ?" +msgid "" +"The proprietary Nvidia driver is not supported by Sway. It is likely that " +"you will run into issues, are you okay with that?" +msgstr "" +"Le pilote Nvidia propriétaire n'est pas pris en charge par Sway. Il est " +"probable que vous rencontriez des problèmes, êtes-vous d'accord avec cela ?" msgid "Installed packages" msgstr "Paquets installés" @@ -1067,13 +1278,22 @@ msgid "Profile name: " msgstr "Nom de profil : " msgid "The profile name you entered is already in use. Try again" -msgstr "Le nom de profil que vous avez saisi est déjà utilisé. Essayer à nouveau" +msgstr "" +"Le nom de profil que vous avez saisi est déjà utilisé. Essayer à nouveau" -msgid "Packages to be install with this profile (space separated, leave blank to skip): " -msgstr "Saisir les paquets à installer avec ce profil (séparés par des espaces, vide pour ignorer) : " +msgid "" +"Packages to be install with this profile (space separated, leave blank to " +"skip): " +msgstr "" +"Saisir les paquets à installer avec ce profil (séparés par des espaces, vide " +"pour ignorer) : " -msgid "Services to be enabled with this profile (space separated, leave blank to skip): " -msgstr "Saisir les services à activer avec ce profil (séparés par des espaces, vide pour ignorer) : " +msgid "" +"Services to be enabled with this profile (space separated, leave blank to " +"skip): " +msgstr "" +"Saisir les services à activer avec ce profil (séparés par des espaces, vide " +"pour ignorer) : " msgid "Should this profile be enabled for installation?" msgstr "Ce profil doit-il être activé pour l'installation ?" @@ -1086,10 +1306,15 @@ msgid "" "Select a graphics driver or leave blank to install all open-source drivers" msgstr "" "\n" -"Sélectionner un pilote graphique ou laisser vide pour installer tous les pilotes open source" +"Sélectionner un pilote graphique ou laisser vide pour installer tous les " +"pilotes open source" -msgid "Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" -msgstr "Sway a besoin d'accéder à votre espace (ensemble de périphériques matériels : clavier, souris, etc.)" +msgid "" +"Sway needs access to your seat (collection of hardware devices i.e. " +"keyboard, mouse, etc)" +msgstr "" +"Sway a besoin d'accéder à votre espace (ensemble de périphériques " +"matériels : clavier, souris, etc.)" msgid "" "\n" @@ -1119,10 +1344,14 @@ msgid "Profiles" msgstr "Profils" msgid "Finding possible directories to save configuration files ..." -msgstr "Recherche des répertoires possibles pour enregistrer les fichiers de configuration..." +msgstr "" +"Recherche des répertoires possibles pour enregistrer les fichiers de " +"configuration..." msgid "Select directory (or directories) for saving configuration files" -msgstr "Sélectionner le répertoire (ou les répertoires) pour enregistrer les fichiers de configuration" +msgstr "" +"Sélectionner le répertoire (ou les répertoires) pour enregistrer les " +"fichiers de configuration" msgid "Add a custom mirror" msgstr "Ajouter un miroir personnalisé" @@ -1152,13 +1381,16 @@ msgid "Defined" msgstr "Défini" msgid "Save user configuration (including disk layout)" -msgstr "Enregistrer la configuration utilisateur (y compris la disposition du disque)" +msgstr "" +"Enregistrer la configuration utilisateur (y compris la disposition du disque)" msgid "" -"Enter a directory for the configuration(s) to be saved (tab completion enabled)\n" +"Enter a directory for the configuration(s) to be saved (tab completion " +"enabled)\n" "Save directory: " msgstr "" -"Saisir un répertoire pour la/les configuration(s) à enregistrer (complétion par tabulation activée)\n" +"Saisir un répertoire pour la/les configuration(s) à enregistrer (complétion " +"par tabulation activée)\n" "Entrer le nom du répertoire de sauvegarde : " msgid "" @@ -1166,7 +1398,8 @@ msgid "" "\n" "{}" msgstr "" -"Voulez-vous enregistrer {} fichier(s) de configuration à l'emplacement suivant ?\n" +"Voulez-vous enregistrer {} fichier(s) de configuration à l'emplacement " +"suivant ?\n" "\n" "{}" @@ -1179,26 +1412,39 @@ msgstr "Miroirs" msgid "Mirror regions" msgstr "Régions miroir" -msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {max_downloads+1} downloads at a time )" -msgstr " - Valeur maximale : {} (Autorise {} téléchargements parallèles, autorise {max_downloads+1} téléchargements à la fois)" +msgid "" +" - Maximum value : {} ( Allows {} parallel downloads, allows " +"{max_downloads+1} downloads at a time )" +msgstr "" +" - Valeur maximale : {} (Autorise {} téléchargements parallèles, autorise " +"{max_downloads+1} téléchargements à la fois)" msgid "Invalid input! Try again with a valid input [1 to {}, or 0 to disable]" -msgstr "Entrée invalide ! Réessayer avec une entrée valide [1 pour {}, ou 0 pour désactiver]" +msgstr "" +"Entrée invalide ! Réessayer avec une entrée valide [1 pour {}, ou 0 pour " +"désactiver]" msgid "Locales" msgstr "Paramètres régionaux" -msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)" -msgstr "Utiliser NetworkManager (nécessaire pour configurer graphiquement internet dans GNOME et KDE)" +msgid "" +"Use NetworkManager (necessary to configure internet graphically in GNOME and " +"KDE)" +msgstr "" +"Utiliser NetworkManager (nécessaire pour configurer graphiquement internet " +"dans GNOME et KDE)" msgid "Total: {} / {}" msgstr "Total (taille) : {} / {}" msgid "All entered values can be suffixed with a unit: B, KB, KiB, MB, MiB..." -msgstr "Toutes les valeurs saisies peuvent être saccompagnées par une unité : B, KB, KiB, MB, MiB..." +msgstr "" +"Toutes les valeurs saisies peuvent être saccompagnées par une unité : B, KB, " +"KiB, MB, MiB..." msgid "If no unit is provided, the value is interpreted as sectors" -msgstr "Si aucune unité n'est fournie, la valeur est interprétée comme des secteurs\"" +msgstr "" +"Si aucune unité n'est fournie, la valeur est interprétée comme des secteurs\"" msgid "Enter start (default: sector {}): " msgstr "Saisir le secteur de début (par défaut : secteur {}) : " @@ -1207,7 +1453,9 @@ msgid "Enter end (default: {}): " msgstr "Saisir le secteur de fin (par défaut : secteur {}) : " msgid "Unable to determine fido2 devices. Is libfido2 installed?" -msgstr "Impossible de déterminer les appareils fido2. Est-ce que libfido2 est installé ?" +msgstr "" +"Impossible de déterminer les appareils fido2. Est-ce que libfido2 est " +"installé ?" msgid "Path" msgstr "Chemin" @@ -1225,8 +1473,12 @@ msgstr "Configuration invalide : {error}" msgid "Type" msgstr "Type" -msgid "This option enables the number of parallel downloads that can occur during package downloads" -msgstr "Cette option active le nombre de téléchargements parallèles pouvant avoir lieu lors des téléchargements des paquets" +msgid "" +"This option enables the number of parallel downloads that can occur during " +"package downloads" +msgstr "" +"Cette option active le nombre de téléchargements parallèles pouvant avoir " +"lieu lors des téléchargements des paquets" msgid "" "Enter the number of parallel downloads to be enabled.\n" @@ -1238,17 +1490,29 @@ msgstr "" "Note :\n" #, python-brace-format -msgid " - Maximum recommended value : {} ( Allows {} parallel downloads at a time )" -msgstr " - Valeur maximale recommandée : {} (Autorise {} téléchargements parallèles à la fois)" +msgid "" +" - Maximum recommended value : {} ( Allows {} parallel downloads at a time )" +msgstr "" +" - Valeur maximale recommandée : {} (Autorise {} téléchargements parallèles " +"à la fois)" -msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )\n" -msgstr " - Désactiver/Par défaut : 0 (Désactive le téléchargement parallèle, autorise un seul téléchargement à la fois)\n" +msgid "" +" - Disable/Default : 0 ( Disables parallel downloading, allows only 1 " +"download at a time )\n" +msgstr "" +" - Désactiver/Par défaut : 0 (Désactive le téléchargement parallèle, " +"autorise un seul téléchargement à la fois)\n" msgid "Invalid input! Try again with a valid input [or 0 to disable]" -msgstr "Entrée invalide ! Réessayer avec une entrée valide [ou 0 pour désactiver]" +msgstr "" +"Entrée invalide ! Réessayer avec une entrée valide [ou 0 pour désactiver]" -msgid "Hyprland needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" -msgstr "Hyprland a besoin d'accéder à votre espace (ensemble de périphériques matériels, par exemple clavier, souris, etc)" +msgid "" +"Hyprland needs access to your seat (collection of hardware devices i.e. " +"keyboard, mouse, etc)" +msgstr "" +"Hyprland a besoin d'accéder à votre espace (ensemble de périphériques " +"matériels, par exemple clavier, souris, etc)" msgid "" "\n" @@ -1259,8 +1523,11 @@ msgstr "" "\n" "Choisir une option pour donner à Hyprland l'accès à votre matériel" -msgid "All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..." -msgstr "Toutes les valeurs saisies peuvent être accompagnées par une unité : %, B, KB, KiB, MB, MiB..." +msgid "" +"All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..." +msgstr "" +"Toutes les valeurs saisies peuvent être accompagnées par une unité : %, B, " +"KB, KiB, MB, MiB..." msgid "Would you like to use unified kernel images?" msgstr "Souhaitez-vous utiliser des images de noyau unifiées ?" @@ -1269,28 +1536,50 @@ msgid "Unified kernel images" msgstr "Images du noyau unifiées" msgid "Waiting for time sync (timedatectl show) to complete." -msgstr "En attente de la fin de la synchronisation de l'heure (timedatectl show) de finir." +msgstr "" +"En attente de la fin de la synchronisation de l'heure (timedatectl show) de " +"finir." -msgid "Time syncronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" -msgstr "La synchronisation de l'heure ne se termine pas, veuillez consulter la documentation afin de trouver des solutions de contournement : https://archinstall.readthedocs.io/" +msgid "" +"Time syncronization not completing, while you wait - check the docs for " +"workarounds: https://archinstall.readthedocs.io/" +msgstr "" +"La synchronisation de l'heure ne se termine pas, veuillez consulter la " +"documentation afin de trouver des solutions de contournement : https://" +"archinstall.readthedocs.io/" -msgid "Skipping waiting for automatic time sync (this can cause issues if time is out of sync during installation)" -msgstr "Ignorer l'attente de la synchronisation automatique de l'heure (cela peut entraîner des problèmes si l'heure n'est pas synchronisée lors de l'installation)" +msgid "" +"Skipping waiting for automatic time sync (this can cause issues if time is " +"out of sync during installation)" +msgstr "" +"Ignorer l'attente de la synchronisation automatique de l'heure (cela peut " +"entraîner des problèmes si l'heure n'est pas synchronisée lors de " +"l'installation)" -msgid "Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." -msgstr "En attente de la fin de la synchronisation du trousseau de clés d'Arch Linux (archlinux-keyring-wkd-sync) de finir." +msgid "" +"Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." +msgstr "" +"En attente de la fin de la synchronisation du trousseau de clés d'Arch Linux " +"(archlinux-keyring-wkd-sync) de finir." msgid "Selected profiles: " msgstr "Profils sélectionnés : " -msgid "Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" -msgstr "La synchronisation de l'heure ne se termine pas, veuillez consulter la documentation afin de trouver des solutions de contournement : https://archinstall.readthedocs.io/" +msgid "" +"Time synchronization not completing, while you wait - check the docs for " +"workarounds: https://archinstall.readthedocs.io/" +msgstr "" +"La synchronisation de l'heure ne se termine pas, veuillez consulter la " +"documentation afin de trouver des solutions de contournement : https://" +"archinstall.readthedocs.io/" msgid "Mark/Unmark as nodatacow" msgstr "Marquer/Démarquer comme nodatacow" msgid "Would you like to use compression or disable CoW?" -msgstr "Souhaitez-vous utiliser la compression ou désactiver la copie à l'écriture (CoW) ?" +msgstr "" +"Souhaitez-vous utiliser la compression ou désactiver la copie à l'écriture " +"(CoW) ?" msgid "Use compression" msgstr "Utiliser la compression" @@ -1298,8 +1587,12 @@ msgstr "Utiliser la compression" msgid "Disable Copy-on-Write" msgstr "Désactiver la copie à l'écriture (CoW)" -msgid "Provides a selection of desktop environments and tiling window managers, e.g. GNOME, KDE Plasma, Sway" -msgstr "Fournit une sélection d'environnements de bureau et de gestionnaires de fenêtres en mosaïque, par ex. GNOME, KDE Plasma, Sway" +msgid "" +"Provides a selection of desktop environments and tiling window managers, " +"e.g. GNOME, KDE Plasma, Sway" +msgstr "" +"Fournit une sélection d'environnements de bureau et de gestionnaires de " +"fenêtres en mosaïque, par ex. GNOME, KDE Plasma, Sway" #, python-brace-format msgid "Configuration type: {}" @@ -1308,11 +1601,18 @@ msgstr "Type de configuration : {}" msgid "LVM configuration type" msgstr "Type de configuration LVM" -msgid "LVM disk encryption with more than 2 partitions is currently not supported" -msgstr "Le chiffrement de disque LVM avec plus de 2 partitions n'est actuellement pas pris en charge" +msgid "" +"LVM disk encryption with more than 2 partitions is currently not supported" +msgstr "" +"Le chiffrement de disque LVM avec plus de 2 partitions n'est actuellement " +"pas pris en charge" -msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)" -msgstr "Utiliser NetworkManager (nécessaire pour configurer internet graphiquement dans GNOME et KDE Plasma)" +msgid "" +"Use NetworkManager (necessary to configure internet graphically in GNOME and " +"KDE Plasma)" +msgstr "" +"Utiliser NetworkManager (nécessaire pour configurer internet graphiquement " +"dans GNOME et KDE Plasma)" msgid "Select a LVM option" msgstr "Sélectionner une option LVM" @@ -1381,7 +1681,9 @@ msgid "HSM" msgstr "Gestion hiérarchique du stockage (HSM)" msgid "Enter disk encryption password (leave blank for no encryption)" -msgstr "Entrer le mot de passe de chiffrement du disque (laisser vide pour aucun chiffrement)" +msgstr "" +"Entrer le mot de passe de chiffrement du disque (laisser vide pour aucun " +"chiffrement)" msgid "Disk encryption password" msgstr "Mot de passe de chiffrement du disque" @@ -1413,8 +1715,11 @@ msgstr "Répertoire de montage racine" msgid "Select language" msgstr "Sélectionner la langue" -msgid "Write additional packages to install (space separated, leave blank to skip)" -msgstr "Écrire les paquets supplémentaires à installer (séparés par des espaces, laisser vide pour ignorer)" +msgid "" +"Write additional packages to install (space separated, leave blank to skip)" +msgstr "" +"Écrire les paquets supplémentaires à installer (séparés par des espaces, " +"laisser vide pour ignorer)" msgid "Invalid download number" msgstr "Numéro de téléchargement invalide" @@ -1445,13 +1750,15 @@ msgid "IP address" msgstr "Adresse IP" msgid "Enter your gateway (router) IP address (leave blank for none)" -msgstr "Entrer l'adresse IP de votre passerelle (routeur) (laisser vide pour aucun)" +msgstr "" +"Entrer l'adresse IP de votre passerelle (routeur) (laisser vide pour aucun)" msgid "Gateway address" msgstr "Adresse de passerelle" msgid "Enter your DNS servers with space separated (leave blank for none)" -msgstr "Entrer vos serveurs DNS séparés par des espaces (laisser vide pour aucun)" +msgstr "" +"Entrer vos serveurs DNS séparés par des espaces (laisser vide pour aucun)" msgid "DNS servers" msgstr "Serveurs DNS" @@ -1472,7 +1779,9 @@ msgid "The proprietary Nvidia driver is not supported by Sway." msgstr "Le pilote propriétaire Nvidia n'est pas supporté par Sway." msgid "It is likely that you will run into issues, are you okay with that?" -msgstr "Il est probable que vous rencontriez des problèmes, êtes-vous d'accord avec cela ?" +msgstr "" +"Il est probable que vous rencontriez des problèmes, êtes-vous d'accord avec " +"cela ?" msgid "Main profile" msgstr "Profil principal" @@ -1492,8 +1801,12 @@ msgstr "Voulez-vous continuer ?" msgid "Directory" msgstr "Répertoire" -msgid "Enter a directory for the configuration(s) to be saved (tab completion enabled)" -msgstr "Entrer un répertoire pour que la(les) configuration(s) soit(ent) enregistrée(s) (complétion par tabulation activée)" +msgid "" +"Enter a directory for the configuration(s) to be saved (tab completion " +"enabled)" +msgstr "" +"Entrer un répertoire pour que la(les) configuration(s) soit(ent) " +"enregistrée(s) (complétion par tabulation activée)" #, python-brace-format msgid "Do you want to save the configuration file(s) to {}?" @@ -1505,8 +1818,12 @@ msgstr "Activé" msgid "Disabled" msgstr "Désactivé" -msgid "Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues" -msgstr "Veuillez soumettre ce problème (et fichier) à https://github.com/archlinux/archinstall/issues" +msgid "" +"Please submit this issue (and file) to https://github.com/archlinux/" +"archinstall/issues" +msgstr "" +"Veuillez soumettre ce problème (et fichier) à https://github.com/archlinux/" +"archinstall/issues" msgid "Mirror name" msgstr "Nom du miroir" @@ -1574,8 +1891,10 @@ msgstr "Marquer/Démarquer comme XBOOTLDR" msgid "Loading packages..." msgstr "Chargement des paquets..." -msgid "Select any packages from the below list that should be installed additionally" -msgstr "Sélectionner les paquets à installer en supplément dans la liste ci-dessous" +msgid "" +"Select any packages from the below list that should be installed additionally" +msgstr "" +"Sélectionner les paquets à installer en supplément dans la liste ci-dessous" msgid "Add a custom repository" msgstr "Ajouter un dépôt personnalisé" @@ -1629,7 +1948,7 @@ msgid "Only ASCII characters are supported" msgstr "Seuls les caractères ASCII sont pris en charge" msgid "Show help" -msgstr "Afficher de l'aide" +msgstr "Afficher l’aide" msgid "Exit help" msgstr "Quitter l’aide" @@ -1680,146 +1999,138 @@ msgid "Exit search mode" msgstr "Quitter le mode de recherche" msgid "General" -msgstr "" +msgstr "Général" -#, fuzzy msgid "Navigation" -msgstr "Enregistrer la configuration" +msgstr "Navigation" -#, fuzzy msgid "Selection" -msgstr "Sélectionner des régions" +msgstr "Sélection" msgid "Search" -msgstr "" +msgstr "Rechercher" msgid "Down" -msgstr "" +msgstr "Bas" msgid "Up" -msgstr "" +msgstr "Haut" -#, fuzzy msgid "Confirm" -msgstr "Confirmer et quitter" +msgstr "Confirmer" -#, fuzzy msgid "Focus right" -msgstr "Déplacer vers la droite" +msgstr "Focus à droite" -#, fuzzy msgid "Focus left" -msgstr "Déplacer vers la gauche" +msgstr "Focus à gauche" msgid "Toggle" -msgstr "" +msgstr "Basculer" -#, fuzzy msgid "Show/Hide help" -msgstr "Afficher de l'aide" +msgstr "Afficher/Masquer l’aide" msgid "Quit" -msgstr "" +msgstr "Quitter" msgid "First" -msgstr "" +msgstr "Premier" msgid "Last" -msgstr "" +msgstr "Dernier" -#, fuzzy msgid "Select" -msgstr "Sélectionner des régions" +msgstr "Sélectionner" msgid "Page Up" -msgstr "" +msgstr "Page précédente" msgid "Page Down" -msgstr "" +msgstr "Page suivante" -#, fuzzy msgid "Page up" -msgstr "Groupe de paquets :" +msgstr "Page précédente" -#, fuzzy msgid "Page down" -msgstr "Déplacer vers le bas" +msgstr "Page suivante" msgid "Page Left" -msgstr "" +msgstr "Page à gauche" -#, fuzzy msgid "Page Right" -msgstr "Déplacer vers la droite" +msgstr "Page à droite" msgid "Cursor up" -msgstr "" +msgstr "Curseur vers le haut" -#, fuzzy msgid "Cursor down" -msgstr "Déplacer vers le bas" +msgstr "Curseur vers le bas" -#, fuzzy msgid "Cursor right" -msgstr "Déplacer vers la droite" +msgstr "Curseur vers la droite" -#, fuzzy msgid "Cursor left" -msgstr "Déplacer vers la gauche" +msgstr "Curseur vers la gauche" msgid "Top" -msgstr "" +msgstr "Haut" msgid "Bottom" -msgstr "" +msgstr "Bas" msgid "Home" -msgstr "" +msgstr "Début" -#, fuzzy msgid "End" -msgstr "Activé" +msgstr "Fin" -#, fuzzy msgid "Toggle option" -msgstr "Options de sous-volume" +msgstr "Basculer l’option" msgid "Scroll Up" -msgstr "" +msgstr "Défilement vers le haut" -#, fuzzy msgid "Scroll Down" -msgstr "Faire défiler l’aperçu vers le bas" +msgstr "Défilement vers le bas" msgid "Scroll Left" -msgstr "" +msgstr "Défilement vers la gauche" msgid "Scroll Right" -msgstr "" +msgstr "Défilement vers la droite" msgid "Scroll Home" -msgstr "" +msgstr "Défilement au début" msgid "Scroll End" -msgstr "" +msgstr "Défilement à la fin" msgid "Focus Next" -msgstr "" +msgstr "Élément suivant (focus)" msgid "Focus Previous" -msgstr "" +msgstr "Élément précédent (focus)" msgid "Copy selected text" -msgstr "" +msgstr "Copier le texte sélectionné" -msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" -msgstr "labwc a besoin d’accéder à votre siège (ensemble d’appareils matériels, c’est-à-dire clavier, souris, etc.)" +msgid "" +"labwc needs access to your seat (collection of hardware devices i.e. " +"keyboard, mouse, etc)" +msgstr "" +"labwc a besoin d’accéder à votre siège (ensemble d’appareils matériels, " +"c’est-à-dire clavier, souris, etc.)" msgid "Choose an option to give labwc access to your hardware" msgstr "Choisir une option pour donner à labwc l’accès à votre matériel" -msgid "niri needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" -msgstr "niri a besoin d’accéder à vos périphériques (ensemble d’appareils matériels, c’est-à-dire clavier, souris, etc.)" +msgid "" +"niri needs access to your seat (collection of hardware devices i.e. " +"keyboard, mouse, etc)" +msgstr "" +"niri a besoin d’accéder à vos périphériques (ensemble d’appareils matériels, " +"c’est-à-dire clavier, souris, etc.)" msgid "Choose an option to give niri access to your hardware" msgstr "Choisir une option pour donner à niri l’accès à votre matériel" @@ -1830,58 +2141,49 @@ msgstr "Marquer/Démarquer comme ESP" msgid "Package group:" msgstr "Groupe de paquets :" -#, fuzzy msgid "Exit archinstall" -msgstr "Sortir d'Archinstall" +msgstr "Quitter archinstall" -#, fuzzy msgid "Reboot system" msgstr "Redémarrer le système" -#, fuzzy msgid "chroot into installation for post-installation configurations" -msgstr "Souhaitez-vous chrooter dans l'installation nouvellement créée et effectuer la configuration post-installation ?" +msgstr "" +"Entrer en chroot dans l’installation pour effectuer les configurations post-" +"installation" msgid "Installation completed" -msgstr "Installation complétée" +msgstr "Installation terminée" -#, fuzzy msgid "What would you like to do next?" -msgstr "Voulez-vous continuer ?" +msgstr "Quelle action souhaitez-vous effectuer ensuite ?" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Select which mode to configure for \"{}\"" -msgstr "Sélectionner le mode à configurer pour \"{}\" ou ignorer pour utiliser le mode par défaut \"{}\"" +msgstr "Sélectionner le mode à configurer pour \"{}\"" -#, fuzzy msgid "Incorrect credentials file decryption password" -msgstr "Mot de passe de déchiffrement du disque" +msgstr "Mot de passe de déchiffrement du fichier d’identifiants incorrect" -#, fuzzy msgid "Incorrect password" msgstr "Mot de passe incorrect" -#, fuzzy msgid "Credentials file decryption password" -msgstr "Mot de passe de déchiffrement du disque" +msgstr "Mot de passe de déchiffrement du fichier d’identifiants" -#, fuzzy msgid "Do you want to encrypt the user_credentials.json file?" -msgstr "Voulez-vous enregistrer le(s) fichier(s) de configuration dans {} ?" +msgstr "Voulez-vous chiffrer le fichier user_credentials.json ?" -#, fuzzy msgid "Credentials file encryption password" -msgstr "Mot de passe de l'encryption du disque" +msgstr "Mot de passe de chiffrement du fichier d’identifiants" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Repositories: {}" -msgstr "Nom du dépôt" +msgstr "Dépôts : {}" -#, fuzzy msgid "New version available" msgstr "Nouvelle version disponible" -#, fuzzy msgid "Passwordless login" msgstr "Connexion sans mot de passe" @@ -1891,20 +2193,17 @@ msgstr "Connexion à deux facteurs" msgid "Bluetooth" msgstr "Bluetooth" -#, fuzzy msgid "Would you like to configure Bluetooth?" -msgstr "Voulez-vous configurer le Bluetooth ?" +msgstr "Souhaitez-vous configurer le Bluetooth ?" msgid "Print service" -msgstr "" +msgstr "Service d’impression" -#, fuzzy msgid "Would you like to configure the print service?" -msgstr "Voulez-vous configurer le Bluetooth ?" +msgstr "Souhaitez-vous configurer le service d’impression ?" -#, fuzzy msgid "Power management" -msgstr "Gestion des partitions : {}" +msgstr "Gestion de l’alimentation" msgid "Authentication" msgstr "Authentification" @@ -1913,7 +2212,7 @@ msgid "Applications" msgstr "Applications" msgid "U2F login method: " -msgstr "Méthode\tde connexion U2F : " +msgstr "Méthode de connexion U2F : " msgid "Passwordless sudo: " msgstr "Sudo sans mot de passe : " @@ -1925,14 +2224,13 @@ msgstr "Type de\tsnapshot Btrfs : {}" msgid "Syncing the system..." msgstr "Synchronisation du système..." -#, fuzzy msgid "Value cannot be empty" msgstr "La valeur ne peut pas être vide" msgid "Snapshot type" msgstr "Type de snapshot" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Snapshot type: {}" msgstr "Type de snapshot : {}" @@ -1945,335 +2243,328 @@ msgstr "Pas de périphériques U2F trouvés" msgid "U2F Login Method" msgstr "Méthode de connexion U2F" -#, fuzzy msgid "Enable passwordless sudo?" msgstr "Activer sudo sans mot de passe ?" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Setting up U2F device for user: {}" -msgstr "Configuration du périphérique U2F pour l'utilisateur : {}" +msgstr "Configuration d’un périphérique U2F pour l’utilisateur : {}" -msgid "You may need to enter the PIN and then touch your U2F device to register it" -msgstr "Vous devez peut-être entrer le code PIN, puis toucher votre périphérique U2F pour l'enregistrer" +msgid "" +"You may need to enter the PIN and then touch your U2F device to register it" +msgstr "" +"Vous devez peut-être entrer le code PIN, puis toucher votre périphérique U2F " +"pour l'enregistrer" msgid "Starting device modifications in " -msgstr "" +msgstr "Démarrage des modifications du périphérique dans " -#, fuzzy msgid "No network connection found" -msgstr "Aucune configuration réseau" +msgstr "Aucune connexion réseau détectée" -#, fuzzy msgid "Would you like to connect to a Wifi?" -msgstr "Voulez-vous continuer ?" +msgstr "Souhaitez-vous vous connecter à un réseau Wi-Fi ?" -#, fuzzy msgid "No wifi interface found" -msgstr "Configurer les interfaces" +msgstr "Aucune interface Wi-Fi détectée" -#, fuzzy msgid "Select wifi network to connect to" -msgstr "Sélectionner une interface réseau à configurer" +msgstr "Sélectionner le réseau Wi-Fi auquel vous connecter" msgid "Scanning wifi networks..." -msgstr "" +msgstr "Recherche des réseaux Wi-Fi..." -#, fuzzy msgid "No wifi networks found" -msgstr "Aucune configuration réseau" +msgstr "Aucun réseau Wi-Fi trouvé" msgid "Failed setting up wifi" -msgstr "" +msgstr "Échec de la configuration du Wi-Fi" -#, fuzzy msgid "Enter wifi password" -msgstr "Entrer un mot de passe : " +msgstr "Entrer le mot de passe Wi-Fi" msgid "Ok" -msgstr "" +msgstr "Ok" msgid "Removable" -msgstr "" +msgstr "Amovible" msgid "Install to removable location" -msgstr "" +msgstr "Installer sur un support amovible" msgid "Will install to /EFI/BOOT/ (removable location)" -msgstr "" +msgstr "Installation dans /EFI/BOOT/ (emplacement amovible)" msgid "Will install to standard location with NVRAM entry" -msgstr "" +msgstr "Installation dans l’emplacement standard avec entrée NVRAM" -msgid "Would you like to install the bootloader to the default removable media search location?" +msgid "" +"Would you like to install the bootloader to the default removable media " +"search location?" msgstr "" +"Souhaitez-vous installer le chargeur d’amorçage dans l’emplacement de " +"recherche par défaut des supports amovibles ?" -msgid "This installs the bootloader to /EFI/BOOT/BOOTX64.EFI (or similar) which is useful for:" +msgid "" +"This installs the bootloader to /EFI/BOOT/BOOTX64.EFI (or similar) which is " +"useful for:" msgstr "" +"Cela installe le chargeur d’amorçage dans /EFI/BOOT/BOOTX64.EFI (ou " +"équivalent), ce qui est utile pour :" msgid "USB drives or other portable external media." -msgstr "" +msgstr "Clés USB ou autres supports externes portables." msgid "Systems where you want the disk to be bootable on any computer." msgstr "" +"Systèmes où vous souhaitez que le disque soit amorçable sur n’importe quel " +"ordinateur." msgid "Firmware that does not properly support NVRAM boot entries." msgstr "" +"Firmware ne prenant pas correctement en charge les entrées de démarrage " +"NVRAM." msgid "Will install to /EFI/BOOT/ (removable location, safe default)" msgstr "" +"Installation dans /EFI/BOOT/ (emplacement amovible, option sûre par défaut)" msgid "Will install to custom location with NVRAM entry" -msgstr "" +msgstr "Installation dans un emplacement personnalisé avec entrée NVRAM" -msgid "Firmware that does not properly support NVRAM boot entries like most MSI motherboards," +msgid "" +"Firmware that does not properly support NVRAM boot entries like most MSI " +"motherboards," msgstr "" +"Firmware ne prenant pas correctement en charge les entrées de démarrage " +"NVRAM, comme la plupart des cartes mères MSI, " msgid "most Apple Macs, many laptops..." -msgstr "" +msgstr "la plupart des Mac Apple, de nombreux ordinateurs portables…" -#, fuzzy msgid "Language" -msgstr "Langue locale" +msgstr "Langue" msgid "Compression algorithm" +msgstr "Algorithme de compression" + +msgid "" +"Only packages such as base, sudo, linux, linux-firmware, efibootmgr and " +"optional profile packages are installed." msgstr "" +"Seuls des paquets tels que base, sudo, linux, linux-firmware, efibootmgr et " +"les paquets de profil optionnels sont installés." -#, fuzzy -msgid "Only packages such as base, sudo, linux, linux-firmware, efibootmgr and optional profile packages are installed." -msgstr "Seuls les paquets tels que base, base-devel, linux, linux-firmware, efibootmgr et les paquets de profil optionnels sont installés." - -#, fuzzy msgid "Select zram compression algorithm:" -msgstr "Sélectionner un point de montage :" +msgstr "Sélectionner l’algorithme de compression zram :" msgid "Use Network Manager (default backend)" -msgstr "" +msgstr "Utiliser Network Manager (backend par défaut)" msgid "Use Network Manager (iwd backend)" -msgstr "" +msgstr "Utiliser Network Manager (backend iwd)" msgid "Firewall" -msgstr "" +msgstr "Pare-feu" -#, fuzzy msgid "Additional fonts" -msgstr "Dépôts supplémentaires" +msgstr "Polices supplémentaires" -#, fuzzy msgid "Select font packages to install" -msgstr "Veuillez choisir le greeter (interface de connexion) à installer" +msgstr "Sélectionner les paquets de polices à installer" msgid "Unicode font coverage for most languages" -msgstr "" +msgstr "Couverture Unicode des polices pour la plupart des langues" msgid "color emoji for browsers and apps" -msgstr "" +msgstr "émojis en couleur pour les navigateurs et les applications" msgid "Chinese, Japanese, Korean characters" -msgstr "" +msgstr "Caractères chinois, japonais et coréens" -#, fuzzy msgid "Select audio configuration" -msgstr "Enregistrer la configuration utilisateur" +msgstr "Sélectionner la configuration audio" -#, fuzzy msgid "Enter credentials file decryption password" -msgstr "Mot de passe de déchiffrement du disque" +msgstr "Entrer le mot de passe de déchiffrement du fichier d’identifiants" -#, fuzzy msgid "Enter root password" -msgstr "Entrer un mot de passe : " +msgstr "Entrer le mot de passe root" msgid "Select bootloader to install" -msgstr "" +msgstr "Sélectionner le chargeur d’amorçage à installer" -#, fuzzy msgid "Configuration preview" -msgstr "Configuration" +msgstr "Aperçu de la configuration" -#, fuzzy msgid "Enter a directory for the configuration(s) to be saved" -msgstr "Saisir un répertoire pour la ou les configuration(s) à enregistrer : " +msgstr "Entrer un répertoire pour enregistrer la ou les configurations" -#, fuzzy msgid "Select encryption type" -msgstr "Type de chiffrement" +msgstr "Sélectionner le type de chiffrement" -#, fuzzy msgid "Select disks for the installation" -msgstr "Nom d'hôte souhaité pour l'installation : " +msgstr "Sélectionner les disques pour l’installation" -#, fuzzy msgid "Enter a mountpoint" -msgstr "Sélectionner un point de montage :" +msgstr "Entrer un point de montage" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Enter a size (default: {}): " -msgstr "Saisir le secteur de fin (par défaut : secteur {}) : " +msgstr "Entrer une taille (par défaut : {}) : " -#, fuzzy msgid "Enter subvolume name" -msgstr "Nom du sous-volume" +msgstr "Entrer le nom du sous-volume" -#, fuzzy msgid "Enter subvolume mountpoint" -msgstr "Point de montage du sous-volume" +msgstr "Entrer le point de montage du sous-volume" -#, fuzzy msgid "Select a disk configuration" -msgstr "Configuration du disque" +msgstr "Sélectionner une configuration de disque" -#, fuzzy msgid "Enter root mount directory" -msgstr "Répertoire de montage racine" +msgstr "Entrer le répertoire de montage racine" msgid "You will use whatever drive-setup is mounted at the specified directory" msgstr "" +"Vous utiliserez toute configuration de disque montée dans le répertoire " +"spécifié" msgid "WARNING: Archinstall won't check the suitability of this setup" msgstr "" +"AVERTISSEMENT : Archinstall ne vérifiera pas la compatibilité de cette " +"configuration" -#, fuzzy msgid "Select main filesystem" -msgstr "Changer le système de fichiers" +msgstr "Sélectionner le système de fichiers principal" msgid "Enter a hostname" -msgstr "" +msgstr "Entrer un nom d’hôte" -#, fuzzy msgid "Select timezone" -msgstr "Sélectionner un fuseau horaire" +msgstr "Sélectionner le fuseau horaire" -#, fuzzy msgid "Enter the number of parallel downloads to be enabled" -msgstr "" -"Saisir le nombre de téléchargements parallèles à activer.\n" -"\n" -"Note :\n" +msgstr "Entrer le nombre de téléchargements simultanés à activer" #, python-brace-format msgid "Value must be between 1 and {}" -msgstr "" +msgstr "La valeur doit être comprise entre 1 et {}" -#, fuzzy msgid "Select which kernel(s) to install" -msgstr "Veuillez choisir le greeter (interface de connexion) à installer" +msgstr "Sélectionner le ou les noyaux à installer" -#, fuzzy msgid "Enter a respository name" -msgstr "Nom du dépôt" +msgstr "Entrer un nom de dépôt" -#, fuzzy msgid "Enter the repository url" -msgstr "Modifier le dépôt personnalisé" +msgstr "Entrer l’URL du dépôt" -#, fuzzy msgid "Enter server url" -msgstr "URL du serveur" +msgstr "Entrer l’URL du serveur" -#, fuzzy msgid "Select mirror regions to be enabled" -msgstr "Régions de miroirs sélectionnées" +msgstr "Sélectionner les régions de miroirs à activer" -#, fuzzy msgid "Select optional repositories to be enabled" -msgstr "Choisir les dépôts supplémentaires en option à activer" +msgstr "Sélectionner les dépôts optionnels à activer" -#, fuzzy msgid "Select an interface" -msgstr "Supprimer l'interface" +msgstr "Sélectionner une interface" -#, fuzzy msgid "Choose network configuration" -msgstr "Aucune configuration réseau" +msgstr "Choisir la configuration réseau" -#, fuzzy msgid "No packages found" -msgstr "Pas de périphériques U2F trouvés" +msgstr "Aucun paquet trouvé" -#, fuzzy msgid "Select which greeter to install" -msgstr "Veuillez choisir le greeter (interface de connexion) à installer" +msgstr "Sélectionner le gestionnaire d’accueil à installer" -#, fuzzy msgid "Select a profile type" -msgstr "Profils sélectionnés : " +msgstr "Sélectionner un type de profil" -#, fuzzy msgid "Enter new password" -msgstr "Entrer un mot de passe : " +msgstr "Entrer un nouveau mot de passe" msgid "Enter a username" -msgstr "" +msgstr "Entrer un nom d’utilisateur" -#, fuzzy msgid "Enter a password" -msgstr "Entrer un mot de passe : " +msgstr "Entrer un mot de passe" -#, fuzzy msgid "The password did not match, please try again" -msgstr "Le mot de passe de confirmation ne correspond pas, veuillez réessayer" +msgstr "Les mots de passe ne correspondent pas, veuillez réessayer" msgid "Password strength: Weak" -msgstr "" +msgstr "Force du mot de passe : Faible" msgid "Password strength: Moderate" -msgstr "" +msgstr "Force du mot de passe : Modéré" msgid "Password strength: Strong" -msgstr "" +msgstr "Force du mot de passe : Fort" -msgid "The selected desktop profile requires a regular user to log in via the greeter" +msgid "" +"The selected desktop profile requires a regular user to log in via the " +"greeter" msgstr "" +"Le profil de bureau sélectionné nécessite qu’un utilisateur standard se " +"connecte via le gestionnaire d’accueil" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment type: {} {}" -msgstr "Type d'environnement : {}" +msgstr "Type d’environnement : {} {}" -#, fuzzy msgid "Input cannot be empty" -msgstr "La valeur ne peut pas être vide" +msgstr "La saisie ne peut pas être vide" msgid "Recommended" -msgstr "" +msgstr "Recommandé" -#, fuzzy msgid "Package" -msgstr "Groupe de paquets :" +msgstr "Groupe de paquets" msgid "Curated selection of KDE Plasma packages" -msgstr "" +msgstr "Sélection de paquets KDE Plasma soigneusement choisie" msgid "Dependencies" -msgstr "" +msgstr "Dépendances" -#, fuzzy msgid "Package group" -msgstr "Groupe de paquets :" +msgstr "Groupe de paquets" msgid "Extensive KDE Plasma installation" -msgstr "" +msgstr "Installation complète de KDE Plasma" -#, fuzzy msgid "Packages in group" -msgstr "Groupe de paquets :" +msgstr "Paquets dans le groupe" msgid "Minimal KDE Plasma installation" -msgstr "" +msgstr "Installation minimale de KDE Plasma" -#, fuzzy msgid "Description" -msgstr "Chiffrement du disque" +msgstr "Description" -#, fuzzy msgid "Select a flavor of KDE Plasma to install" -msgstr "Veuillez choisir le greeter (interface de connexion) à installer" +msgstr "Sélectionner une variante de KDE Plasma à installer" msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games" msgstr "" +"Remplacement d’Arial/Times/Courier, prise en charge du cyrillique pour Steam/" +"jeux" msgid "wide Unicode coverage, good fallback font" +msgstr "large prise en charge Unicode, bonne police de secours" + +#, python-brace-format +msgid "Setting up U2F login: {u2f_config.u2f_login_method.value}" msgstr "" +"Mise en place de la connexion U2F : {u2f_config.u2f_login_method.value}" + +#, python-brace-format +msgid "Default: {DEFAULT_ITER_TIME}ms, Recommended range: 1000-60000" +msgstr "Par défaut : {DEFAULT_ITER_TIME} ms, plage recommandée : 1000–60000" #, python-brace-format #~ msgid "Edit {origkey} :" From bb46e295d1483060e36db3b0b50e9d3635c813f9 Mon Sep 17 00:00:00 2001 From: Softer Date: Fri, 24 Apr 2026 13:19:01 +0300 Subject: [PATCH 11/23] Fix OVMF paths in README QEMU examples (#4472) All three qemu-system-x86_64 examples in README pointed both -drive if=pflash entries at the same file (/usr/share/ovmf/x64/OVMF.4m.fd). OVMF needs CODE for the first pflash and VARS for the second; as written, EFI NVRAM is not initialized correctly. The path /usr/share/ovmf/x64/ is also stale - the ovmf package has been replaced by edk2-ovmf, which installs under /usr/share/edk2/x64/. Fix both in the three examples (testimage loop section, base Boot ISO block, espeakup variant). --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1447c263..75631b6b 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,7 @@ This can be done by installing `pacman -S arch-install-scripts util-linux` local # losetup --partscan --show ./testimage.img # pip install --upgrade archinstall # python -m archinstall --script guided - # qemu-system-x86_64 -enable-kvm -machine q35,accel=kvm -device intel-iommu -cpu host -m 4096 -boot order=d -drive file=./testimage.img,format=raw -drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/x64/OVMF.4m.fd -drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/x64/OVMF.4m.fd + # qemu-system-x86_64 -enable-kvm -machine q35,accel=kvm -device intel-iommu -cpu host -m 4096 -boot order=d -drive file=./testimage.img,format=raw -drive if=pflash,format=raw,readonly,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd -drive if=pflash,format=raw,readonly,file=/usr/share/edk2/x64/OVMF_VARS.4m.fd This will create a *20 GB* `testimage.img` and create a loop device which we can use to format and install to.
`archinstall` is installed and executed in [guided mode](#docs-todo). Once the installation is complete, ~~you can use qemu/kvm to boot the test media.~~
@@ -199,8 +199,8 @@ You may want to boot an ISO image in a VM to test `archinstall` in there. qemu-system-x86_64 -enable-kvm \ -machine q35,accel=kvm -device intel-iommu \ -cpu host -m 4096 -boot order=d \ --drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/x64/OVMF.4m.fd \ --drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/x64/OVMF.4m.fd \ +-drive if=pflash,format=raw,readonly,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd \ +-drive if=pflash,format=raw,readonly,file=/usr/share/edk2/x64/OVMF_VARS.4m.fd \ -drive file=./archlinux-2025.12.01-x86_64.iso,format=raw ``` @@ -209,8 +209,8 @@ HINT: For espeakup support qemu-system-x86_64 -enable-kvm \ -machine q35,accel=kvm -device intel-iommu \ -cpu host -m 4096 -boot order=d \ --drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/x64/OVMF.4m.fd \ --drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/x64/OVMF.4m.fd \ +-drive if=pflash,format=raw,readonly,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd \ +-drive if=pflash,format=raw,readonly,file=/usr/share/edk2/x64/OVMF_VARS.4m.fd \ -drive file=./archlinux-2025.12.01-x86_64.iso,format=raw \ -device intel-hda -device hda-duplex,audiodev=snd0 \ -audiodev pa,id=snd0,server=/run/user/1000/pulse/native From c8e5c85e20db591617cee0fce173b259b213acd6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 26 Apr 2026 18:35:31 +1000 Subject: [PATCH 12/23] Update dependency ruff to v0.15.12 (#4476) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index dd42c642..5d34f793 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,7 +37,7 @@ dev = [ "mypy==1.20.2", "flake8==7.3.0", "pre-commit==4.6.0", - "ruff==0.15.11", + "ruff==0.15.12", "pylint==4.0.5", "pytest==9.0.3", ] From efda78cad5a076ac1a39695c82a8ab93ed7c9342 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 26 Apr 2026 18:36:10 +1000 Subject: [PATCH 13/23] Update pre-commit hook astral-sh/ruff-pre-commit to v0.15.12 (#4477) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a496557e..7ee79056 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ default_stages: ['pre-commit'] repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.15.11 + rev: v0.15.12 hooks: # fix unused imports and sort them - id: ruff From 3c4c87bdd6e05d246da2762d91983d9fa1ff0bda Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 26 Apr 2026 19:03:16 +1000 Subject: [PATCH 14/23] Update dependency arch/python-cryptography to v47 (#4478) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5d34f793..95d85144 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ classifiers = [ dependencies = [ "pyparted==3.13.0", "pydantic==2.12.5", - "cryptography==46.0.7", + "cryptography==47.0.0", "textual==8.2.4", "markdown-it-py==4.0.0", "linkify-it-py==2.1.0", From d836ab0a6690c13a6d7a97f62e30837a2873b864 Mon Sep 17 00:00:00 2001 From: Softer Date: Sun, 26 Apr 2026 12:14:23 +0300 Subject: [PATCH 15/23] Extend validate_bootloader_layout with UEFI-dependent checks (#4474) * Extend validate_bootloader_layout with UEFI-dependent checks Add is_uefi parameter and three new validations: Systemd-boot, Efistub and rEFInd require UEFI; Efistub additionally requires a FAT boot partition. Move the rEFInd UEFI-only check out of GlobalMenu so guided.py and Installer silent-install paths get the same coverage. * Encapsulate UEFI-only flag in Bootloader enum Replace module-level _UEFI_ONLY_BOOTLOADERS tuple with an is_uefi_only() method on the Bootloader enum, mirroring the existing has_uki_support() / has_removable_support() pattern. * Drop is_uefi parameter from validate_bootloader_layout The UEFI flag is a constant system fact for the run, so the validator retrieves it via SysInfo.has_uefi() directly instead of having every caller pass it in. Updates all three call sites in global_menu.py, installer.py and guided.py, and removes the now-unused SysInfo import from guided.py. --- archinstall/lib/bootloader/utils.py | 31 ++++++++++++++++++++++++---- archinstall/lib/global_menu.py | 5 ----- archinstall/lib/models/bootloader.py | 7 +++++++ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/archinstall/lib/bootloader/utils.py b/archinstall/lib/bootloader/utils.py index a732f4e1..ed761722 100644 --- a/archinstall/lib/bootloader/utils.py +++ b/archinstall/lib/bootloader/utils.py @@ -2,6 +2,7 @@ from dataclasses import dataclass from enum import Enum, auto from pathlib import Path +from archinstall.lib.hardware import SysInfo from archinstall.lib.models.bootloader import Bootloader, BootloaderConfiguration from archinstall.lib.models.device import DiskLayoutConfiguration @@ -9,6 +10,8 @@ from archinstall.lib.models.device import DiskLayoutConfiguration class BootloaderValidationFailureKind(Enum): LimineNonFatBoot = auto() LimineLayout = auto() + BootloaderRequiresUefi = auto() + EfistubNonFatBoot = auto() @dataclass(frozen=True) @@ -29,12 +32,32 @@ def validate_bootloader_layout( if not (bootloader_config and disk_config): return None - if bootloader_config.bootloader == Bootloader.Limine: - boot_part = next( - (p for m in disk_config.device_modifications if (p := m.get_boot_partition())), - None, + bootloader = bootloader_config.bootloader + + if bootloader == Bootloader.NO_BOOTLOADER: + return None + + if bootloader.is_uefi_only() and not SysInfo.has_uefi(): + return BootloaderValidationFailure( + kind=BootloaderValidationFailureKind.BootloaderRequiresUefi, + description=f'{bootloader.value} requires a UEFI system.', ) + boot_part = next( + (p for m in disk_config.device_modifications if (p := m.get_boot_partition())), + None, + ) + + if bootloader == Bootloader.Efistub: + # The UEFI firmware reads the kernel directly from the boot partition, + # which must be FAT. + if boot_part and (boot_part.fs_type is None or not boot_part.fs_type.is_fat()): + return BootloaderValidationFailure( + kind=BootloaderValidationFailureKind.EfistubNonFatBoot, + description='Efistub does not support booting with a non-FAT boot partition.', + ) + + if bootloader == Bootloader.Limine: # Limine reads its config and kernels from the boot partition, which # must be FAT. if boot_part and (boot_part.fs_type is None or not boot_part.fs_type.is_fat()): diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index 3d94f31e..e327b388 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -461,8 +461,6 @@ class GlobalMenu(AbstractMenu[None]): if not bootloader_config or bootloader_config.bootloader == Bootloader.NO_BOOTLOADER: return None - bootloader = bootloader_config.bootloader - if disk_config := self._item_group.find_by_key('disk_config').value: for layout in disk_config.device_modifications: if root_partition := layout.get_root_partition(): @@ -490,9 +488,6 @@ class GlobalMenu(AbstractMenu[None]): if efi_partition.fs_type is None or not efi_partition.fs_type.is_fat(): return 'ESP must be formatted as a FAT filesystem' - if bootloader == Bootloader.Refind and not self._uefi: - return 'rEFInd can only be used on UEFI systems' - if failure := validate_bootloader_layout(bootloader_config, disk_config): return failure.description diff --git a/archinstall/lib/models/bootloader.py b/archinstall/lib/models/bootloader.py index 68c0bf98..5d8d0d80 100644 --- a/archinstall/lib/models/bootloader.py +++ b/archinstall/lib/models/bootloader.py @@ -25,6 +25,13 @@ class Bootloader(Enum): case _: return False + def is_uefi_only(self) -> bool: + match self: + case Bootloader.Systemd | Bootloader.Efistub | Bootloader.Refind: + return True + case _: + return False + def json(self) -> str: return self.value From 9e05260df55ed3a2ad3a3546521919317dda94c5 Mon Sep 17 00:00:00 2001 From: Softer Date: Mon, 27 Apr 2026 02:24:51 +0300 Subject: [PATCH 16/23] Fix argv injection in _create_user and gpasswd loop (#4473) * Fix argv injection in _create_user and gpasswd loop Use argv list with run() instead of f-string interpolation into SysCommand, add debug logging on failure. * Extract _chroot_argv helper and harden user/file ops Address svartkanin's review on #4473: factor the ['arch-chroot', '-S', str(self.target), ...] boilerplate into a private Installer._chroot_argv() helper, and migrate the seven existing argv-form call sites to it (useradd, gpasswd, chpasswd, chsh, chown, snapper-create-config, grub-install). Two related hardening tweaks while in the area: - Raise gpasswd failure log from debug() to warn(). The group-add loop has no return-False feedback channel for the caller, so a silent debug() means a half-configured user looks like a successful install. - Add `--` end-of-options separator for useradd and chown so a username or path starting with `-` cannot smuggle flags. The TUI validates usernames, but parse_arguments() in models/users.py does not, so config.json is the residual hole; this closes it for these two sites at zero cost. --- archinstall/lib/installer.py | 46 +++++++++++++++--------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 19560d75..e596f7fe 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -739,6 +739,9 @@ class Installer: return self.run_command(cmd, peek_output=peek_output) + def _chroot_argv(self, *args: str) -> list[str]: + return ['arch-chroot', '-S', str(self.target), *args] + def drop_to_shell(self) -> None: subprocess.check_call(f'arch-chroot {self.target}', shell=True) @@ -987,17 +990,7 @@ class Installer: } for config_name, mountpoint in snapper.items(): - command = [ - 'arch-chroot', - '-S', - str(self.target), - 'snapper', - '--no-dbus', - '-c', - config_name, - 'create-config', - mountpoint, - ] + command = self._chroot_argv('snapper', '--no-dbus', '-c', config_name, 'create-config', mountpoint) try: SysCommand(command, peek_output=True) @@ -1336,13 +1329,7 @@ class Installer: boot_dir = Path('/boot') - command = [ - 'arch-chroot', - '-S', - str(self.target), - 'grub-install', - '--debug', - ] + command = self._chroot_argv('grub-install', '--debug') if SysInfo.has_uefi(): if not efi_partition: @@ -1922,16 +1909,17 @@ class Installer: if not handled_by_plugin: info(f'Creating user {user.username}') - cmd = 'useradd -m' + cmd = self._chroot_argv('useradd', '-m') if user.sudo: - cmd += ' -G wheel' + cmd += ['-G', 'wheel'] - cmd += f' {user.username}' + cmd += ['--', user.username] try: - self.arch_chroot(cmd) - except SysCallError as err: + run(cmd) + except CalledProcessError as err: + debug(f'Error creating user {user.username}: {err}') raise SystemError(f'Could not create user inside installation: {err}') for plugin in plugins.values(): @@ -1942,7 +1930,11 @@ class Installer: self.set_user_password(user) for group in user.groups: - self.arch_chroot(f'gpasswd -a {user.username} {group}') + cmd = self._chroot_argv('gpasswd', '-a', user.username, group) + try: + run(cmd) + except CalledProcessError as err: + warn(f'Failed to add {user.username} to group {group}: {err}') if user.sudo: self.enable_sudo(user) @@ -1957,7 +1949,7 @@ class Installer: return False input_data = f'{user.username}:{enc_password}'.encode() - cmd = ['arch-chroot', '-S', str(self.target), 'chpasswd', '--encrypted'] + cmd = self._chroot_argv('chpasswd', '--encrypted') try: run(cmd, input_data=input_data) @@ -1969,7 +1961,7 @@ class Installer: def user_set_shell(self, user: str, shell: str) -> bool: info(f'Setting shell for {user} to {shell}') - cmd = ['arch-chroot', '-S', str(self.target), 'chsh', '-s', shell, user] + cmd = self._chroot_argv('chsh', '-s', shell, user) try: run(cmd) return True @@ -1979,7 +1971,7 @@ class Installer: def chown(self, owner: str, path: str, options: list[str] | None = None) -> bool: options = options or [] - cmd = ['arch-chroot', '-S', str(self.target), 'chown', *options, owner, path] + cmd = self._chroot_argv('chown', *options, '--', owner, path) try: run(cmd) return True From 210329ed808628cf11fa3a8543d8f5da33c5c4a5 Mon Sep 17 00:00:00 2001 From: Softer Date: Mon, 27 Apr 2026 02:30:20 +0300 Subject: [PATCH 17/23] Add console font selection to Locales menu (#4469) * Add console font selection to Locales menu Add a 4th menu item "Console font" to the Locales configuration, allowing users to select a console font for the target system. The selected font is written to /etc/vconsole.conf. If a terminus font (ter-*) is selected, the terminus-font package is automatically installed on the target system. * Switch list_console_fonts to pathlib and add @lru_cache Address svartkanin's review on #4469. Replace os.listdir + chained removesuffix with Path.glob('*.gz') + split('.')[0], and cache the result via lru_cache - the kbd consolefonts directory is static at runtime so re-scanning on every menu reopen was wasted I/O. --- archinstall/lib/installer.py | 8 +++--- archinstall/lib/locale/locale_menu.py | 31 +++++++++++++++++++++- archinstall/lib/locale/utils.py | 10 +++++++ archinstall/lib/models/locale.py | 11 +++++++- archinstall/locales/base.pot | 3 +++ archinstall/locales/uk/LC_MESSAGES/base.po | 3 +++ 6 files changed, 59 insertions(+), 7 deletions(-) diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index e596f7fe..ff530df0 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -1982,12 +1982,10 @@ class Installer: def set_vconsole(self, locale_config: LocaleConfiguration) -> None: # use the already set kb layout kb_vconsole: str = locale_config.kb_layout - # this is the default used in ISO other option for hdpi screens TER16x32 - # can be checked using - # zgrep "CONFIG_FONT" /proc/config.gz - # https://wiki.archlinux.org/title/Linux_console#Fonts + font_vconsole = locale_config.console_font - font_vconsole = 'default8x16' + if font_vconsole.startswith('ter-'): + self.pacman.strap(['terminus-font']) # Ensure /etc exists vconsole_dir: Path = self.target / 'etc' diff --git a/archinstall/lib/locale/locale_menu.py b/archinstall/lib/locale/locale_menu.py index c03824a1..dc743fd3 100644 --- a/archinstall/lib/locale/locale_menu.py +++ b/archinstall/lib/locale/locale_menu.py @@ -1,6 +1,6 @@ from typing import override -from archinstall.lib.locale.utils import list_keyboard_languages, list_locales, set_kb_layout +from archinstall.lib.locale.utils import list_console_fonts, list_keyboard_languages, list_locales, set_kb_layout from archinstall.lib.menu.abstract_menu import AbstractSubMenu from archinstall.lib.menu.helpers import Selection from archinstall.lib.models.locale import LocaleConfiguration @@ -47,6 +47,13 @@ class LocaleMenu(AbstractSubMenu[LocaleConfiguration]): preview_action=lambda item: item.get_value(), key='sys_enc', ), + MenuItem( + text=tr('Console font'), + action=select_console_font, + value=self._locale_conf.console_font, + preview_action=lambda item: item.get_value(), + key='console_font', + ), ] @override @@ -140,3 +147,25 @@ async def select_kb_layout(preset: str | None = None) -> str | None: return preset case _: raise ValueError('Unhandled return type') + + +async def select_console_font(preset: str | None = None) -> str | None: + fonts = list_console_fonts() + + items = [MenuItem(f, value=f) for f in fonts] + group = MenuItemGroup(items, sort_items=False) + group.set_focus_by_value(preset) + + result = await Selection[str]( + header=tr('Console font'), + group=group, + enable_filter=True, + ).show() + + match result.type_: + case ResultType.Selection: + return result.get_value() + case ResultType.Skip: + return preset + case _: + raise ValueError('Unhandled return type') diff --git a/archinstall/lib/locale/utils.py b/archinstall/lib/locale/utils.py index e7229160..497e1fcb 100644 --- a/archinstall/lib/locale/utils.py +++ b/archinstall/lib/locale/utils.py @@ -1,3 +1,6 @@ +from functools import lru_cache +from pathlib import Path + from archinstall.lib.command import SysCommand from archinstall.lib.exceptions import ServiceException, SysCallError from archinstall.lib.output import error @@ -26,6 +29,13 @@ def list_locales() -> list[str]: return locales +@lru_cache +def list_console_fonts() -> list[str]: + directory = Path('/usr/share/kbd/consolefonts') + fonts = {path.name.split('.')[0] for path in directory.glob('*.gz')} + return sorted(fonts) + + def list_x11_keyboard_languages() -> list[str]: return ( SysCommand( diff --git a/archinstall/lib/models/locale.py b/archinstall/lib/models/locale.py index 15dee2f6..8f580989 100644 --- a/archinstall/lib/models/locale.py +++ b/archinstall/lib/models/locale.py @@ -10,6 +10,11 @@ class LocaleConfiguration: kb_layout: str sys_lang: str sys_enc: str + # this is the default used in ISO other option for hdpi screens TER16x32 + # can be checked using + # zgrep "CONFIG_FONT" /proc/config.gz + # https://wiki.archlinux.org/title/Linux_console#Font + console_font: str = 'default8x16' @classmethod def default(cls) -> Self: @@ -23,12 +28,14 @@ class LocaleConfiguration: 'kb_layout': self.kb_layout, 'sys_lang': self.sys_lang, 'sys_enc': self.sys_enc, + 'console_font': self.console_font, } def preview(self) -> str: output = '{}: {}\n'.format(tr('Keyboard layout'), self.kb_layout) output += '{}: {}\n'.format(tr('Locale language'), self.sys_lang) - output += '{}: {}'.format(tr('Locale encoding'), self.sys_enc) + output += '{}: {}\n'.format(tr('Locale encoding'), self.sys_enc) + output += '{}: {}'.format(tr('Console font'), self.console_font) return output def _load_config(self, args: dict[str, str]) -> None: @@ -38,6 +45,8 @@ class LocaleConfiguration: self.sys_enc = args['sys_enc'] if 'kb_layout' in args: self.kb_layout = args['kb_layout'] + if 'console_font' in args: + self.console_font = args['console_font'] @classmethod def parse_arg(cls, args: dict[str, Any]) -> Self: diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index f707ec7a..a0c4c5b7 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -252,6 +252,9 @@ msgstr "" msgid "Locale encoding" msgstr "" +msgid "Console font" +msgstr "" + msgid "Drive(s)" msgstr "" diff --git a/archinstall/locales/uk/LC_MESSAGES/base.po b/archinstall/locales/uk/LC_MESSAGES/base.po index a178ac2d..ffab244f 100644 --- a/archinstall/locales/uk/LC_MESSAGES/base.po +++ b/archinstall/locales/uk/LC_MESSAGES/base.po @@ -256,6 +256,9 @@ msgstr "Мова локалізації" msgid "Locale encoding" msgstr "Кодування локалізації" +msgid "Console font" +msgstr "Шрифт консолі" + msgid "Drive(s)" msgstr "Диск(и)" From 3795bfc21a87224f9dd8e983a5a736b58cda06ad Mon Sep 17 00:00:00 2001 From: utuhiro78 <34818411+utuhiro78@users.noreply.github.com> Date: Mon, 27 Apr 2026 08:32:10 +0900 Subject: [PATCH 18/23] Update Japanese translation (#4482) --- archinstall/locales/ja/LC_MESSAGES/base.mo | Bin 68172 -> 72857 bytes archinstall/locales/ja/LC_MESSAGES/base.po | 230 ++++++++++++++++++++- 2 files changed, 219 insertions(+), 11 deletions(-) diff --git a/archinstall/locales/ja/LC_MESSAGES/base.mo b/archinstall/locales/ja/LC_MESSAGES/base.mo index 3ad3d1a276e7039db33fe23806d6b3fcdd109ba2..bfdce38d646ec876e4516067ceaba61ea4c87c39 100644 GIT binary patch delta 17972 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 delta 13924 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 wKg!_gll8y)=)_mI%?$HY3kpk5 Date: Mon, 27 Apr 2026 02:35:34 +0300 Subject: [PATCH 19/23] Remove disabled translation-check workflow (#4483) The workflow has been fully commented out since #2119 (2023-09-28) when translation handling was reworked. Because the file has no `on:` triggers, GitHub Actions creates a failed workflow run for every push, polluting the Actions tab without affecting PR check-runs. --- .github/workflows/translation-check.yaml | 28 ------------------------ 1 file changed, 28 deletions(-) delete mode 100644 .github/workflows/translation-check.yaml diff --git a/.github/workflows/translation-check.yaml b/.github/workflows/translation-check.yaml deleted file mode 100644 index 3cd4d14c..00000000 --- a/.github/workflows/translation-check.yaml +++ /dev/null @@ -1,28 +0,0 @@ -#on: -# push: -# paths: -# - 'archinstall/locales/**' -# pull_request: -# paths: -# - 'archinstall/locales/**' -#name: Verify local_generate script was run on translation changes -#jobs: -# translation-check: -# runs-on: ubuntu-latest -# container: -# image: archlinux/archlinux:latest -# steps: -# - uses: actions/checkout@v4 -# - run: pacman --noconfirm -Syu python git diffutils -# - name: Verify all translation scripts are up to date -# run: | -# cd .. -# cp -r archinstall archinstall_orig -# cd archinstall/archinstall/locales -# bash locales_generator.sh 1> /dev/null -# cd ../../.. -# git diff \ -# --quiet --no-index --name-only \ -# archinstall_orig/archinstall/locales \ -# archinstall/archinstall/locales \ -# || (echo "Translation files have not been updated after translation, please run ./locales_generator.sh once more and commit" && exit 1) From 074dfbb1784a374f6f2a548a2c027b1f942b153d Mon Sep 17 00:00:00 2001 From: Anton Hvornum Date: Mon, 27 Apr 2026 08:44:14 +0200 Subject: [PATCH 20/23] Adding a reference to why AUR is not bundled as an option in archinstall (#4468) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 75631b6b..95d15702 100644 --- a/README.md +++ b/README.md @@ -219,6 +219,10 @@ qemu-system-x86_64 -enable-kvm \ # FAQ +## AUR + +`archinstall` will not offer or bundle AUR helpers or AUR packages due to a current consensus. This is not any individual developers decision. The reasons and discussions for this stance on the topic can be found on our mailing list thread: [(optional) AUR helper in archinstall](https://lists.archlinux.org/archives/list/arch-dev-public@lists.archlinux.org/thread/VYOULH2GOJLFM2BXOFLWH3D754YXFPSL/). + ## Keyring out-of-date For a description of the problem see https://archinstall.archlinux.page/help/known_issues.html#keyring-is-out-of-date-2213 and discussion in issue https://github.com/archlinux/archinstall/issues/2213. From 9010ccf9eb3369f713d60cefc0b17e619f23c143 Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Tue, 28 Apr 2026 03:08:19 -0400 Subject: [PATCH 21/23] Add kernel enum (#4489) --- archinstall/lib/args.py | 3 ++- archinstall/lib/general/system_menu.py | 17 ++++++----------- archinstall/lib/global_menu.py | 3 ++- archinstall/lib/installer.py | 5 +++-- archinstall/lib/models/package_types.py | 12 ++++++++++++ archinstall/tui/ui/menu_item.py | 4 ++-- 6 files changed, 27 insertions(+), 17 deletions(-) create mode 100644 archinstall/lib/models/package_types.py diff --git a/archinstall/lib/args.py b/archinstall/lib/args.py index 79441a06..77545736 100644 --- a/archinstall/lib/args.py +++ b/archinstall/lib/args.py @@ -21,6 +21,7 @@ from archinstall.lib.models.device import DiskEncryption, DiskLayoutConfiguratio from archinstall.lib.models.locale import LocaleConfiguration from archinstall.lib.models.mirrors import MirrorConfiguration from archinstall.lib.models.network import NetworkConfiguration +from archinstall.lib.models.package_types import DEFAULT_KERNEL from archinstall.lib.models.packages import Repository from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.models.profile import ProfileConfiguration @@ -71,7 +72,7 @@ class ArchConfig: auth_config: AuthenticationConfiguration | None = None swap: ZramConfiguration | None = None hostname: str = 'archlinux' - kernels: list[str] = field(default_factory=lambda: ['linux']) + kernels: list[str] = field(default_factory=lambda: [DEFAULT_KERNEL.value]) ntp: bool = True packages: list[str] = field(default_factory=list) pacman_config: PacmanConfiguration = field(default_factory=PacmanConfiguration.default) diff --git a/archinstall/lib/general/system_menu.py b/archinstall/lib/general/system_menu.py index 5c4d4634..7fa0d1f2 100644 --- a/archinstall/lib/general/system_menu.py +++ b/archinstall/lib/general/system_menu.py @@ -3,29 +3,24 @@ from typing import assert_never from archinstall.lib.hardware import GfxDriver, SysInfo from archinstall.lib.menu.helpers import Confirmation, Selection from archinstall.lib.models.application import ZramAlgorithm, ZramConfiguration +from archinstall.lib.models.package_types import DEFAULT_KERNEL, Kernel from archinstall.lib.translationhandler import tr from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup from archinstall.tui.ui.result import ResultType -async def select_kernel(preset: list[str] = []) -> list[str]: +async def select_kernel(preset: list[Kernel] = []) -> list[Kernel]: """ Asks the user to select a kernel for system. :return: The string as a selected kernel :rtype: string """ - kernels = ['linux', 'linux-lts', 'linux-zen', 'linux-hardened'] - default_kernel = 'linux' + group = MenuItemGroup.from_enum(Kernel, sort_items=True, preset=preset) + group.set_default_by_value(DEFAULT_KERNEL) + group.set_focus_by_value(DEFAULT_KERNEL) - items = [MenuItem(k, value=k) for k in kernels] - - group = MenuItemGroup(items, sort_items=True) - group.set_default_by_value(default_kernel) - group.set_focus_by_value(default_kernel) - group.set_selected_by_value(preset) - - result = await Selection[str]( + result = await Selection[Kernel]( group, header=tr('Select which kernel(s) to install'), allow_skip=True, diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index e327b388..3bfefce7 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -22,6 +22,7 @@ from archinstall.lib.models.device import DiskLayoutConfiguration, DiskLayoutTyp from archinstall.lib.models.locale import LocaleConfiguration from archinstall.lib.models.mirrors import MirrorConfiguration from archinstall.lib.models.network import NetworkConfiguration, NicType +from archinstall.lib.models.package_types import DEFAULT_KERNEL from archinstall.lib.models.packages import Repository from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.models.profile import ProfileConfiguration @@ -103,7 +104,7 @@ class GlobalMenu(AbstractMenu[None]): ), MenuItem( text=tr('Kernels'), - value=['linux'], + value=[DEFAULT_KERNEL], action=select_kernel, preview_action=self._prev_kernel, mandatory=True, diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index ff530df0..ca98fdb9 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -48,6 +48,7 @@ from archinstall.lib.models.device import ( from archinstall.lib.models.locale import LocaleConfiguration from archinstall.lib.models.mirrors import MirrorConfiguration from archinstall.lib.models.network import Nic +from archinstall.lib.models.package_types import DEFAULT_KERNEL, Kernel from archinstall.lib.models.packages import Repository from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.models.users import User @@ -60,7 +61,7 @@ from archinstall.lib.plugins import plugins from archinstall.lib.translationhandler import tr # Any package that the Installer() is responsible for (optional and the default ones) -__packages__ = ['base', 'sudo', 'linux-firmware', 'linux', 'linux-lts', 'linux-zen', 'linux-hardened'] +__packages__ = ['base', 'sudo', 'linux-firmware'] + [k.value for k in Kernel] # Additional packages that are installed if the user is running the Live ISO with accessibility tools enabled __accessibility_packages__ = ['brltty', 'espeakup', 'alsa-utils'] @@ -80,7 +81,7 @@ class Installer: It also wraps :py:func:`~archinstall.Installer.pacstrap` among other things. """ self._base_packages = base_packages or __packages__[:3] - self.kernels = kernels or ['linux'] + self.kernels = kernels or [DEFAULT_KERNEL.value] self._disk_config = disk_config self._disk_encryption = disk_config.disk_encryption or DiskEncryption(EncryptionType.NO_ENCRYPTION) diff --git a/archinstall/lib/models/package_types.py b/archinstall/lib/models/package_types.py new file mode 100644 index 00000000..e314c30a --- /dev/null +++ b/archinstall/lib/models/package_types.py @@ -0,0 +1,12 @@ +from enum import StrEnum, auto +from typing import Final + + +class Kernel(StrEnum): + LINUX = auto() + LINUX_LTS = 'linux-lts' + LINUX_ZEN = 'linux-zen' + LINUX_HARDENED = 'linux-hardened' + + +DEFAULT_KERNEL: Final = Kernel.LINUX diff --git a/archinstall/tui/ui/menu_item.py b/archinstall/tui/ui/menu_item.py index ed5a16ec..4c10e275 100644 --- a/archinstall/tui/ui/menu_item.py +++ b/archinstall/tui/ui/menu_item.py @@ -1,4 +1,4 @@ -from collections.abc import Awaitable, Callable +from collections.abc import Awaitable, Callable, Iterable from dataclasses import dataclass, field from enum import Enum from functools import cached_property @@ -148,7 +148,7 @@ class MenuItemGroup: cls, enum_cls: type[Enum], sort_items: bool = False, - preset: Enum | None = None, + preset: Iterable[Enum] | Enum | None = None, ) -> Self: items = [MenuItem(elem.value, value=elem) for elem in enum_cls] group = cls(items, sort_items=sort_items) From 8cc35f41d8da44b1665e3f8b41a10bb22bb0b1c7 Mon Sep 17 00:00:00 2001 From: Franco Castillo Date: Tue, 28 Apr 2026 04:08:39 -0300 Subject: [PATCH 22/23] Update Spanish translation (#4490) Signed-off-by: Franco Castillo --- archinstall/locales/es/LC_MESSAGES/base.mo | Bin 65086 -> 67046 bytes archinstall/locales/es/LC_MESSAGES/base.po | 200 +++++++++------------ 2 files changed, 88 insertions(+), 112 deletions(-) diff --git a/archinstall/locales/es/LC_MESSAGES/base.mo b/archinstall/locales/es/LC_MESSAGES/base.mo index 14e916ef66dffeec86c2631fab615c138248130d..5701d45472451d2476f3d5d88f44cf536839ce2b 100644 GIT binary patch delta 16896 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 roibA Date: Tue, 28 Apr 2026 12:22:01 +0300 Subject: [PATCH 23/23] Show install summary when configuration is valid (#4475) * Show install summary when configuration is valid Previously the Install menu preview was empty when everything was valid, leaving the user with no "ready" signal. Now show "Ready to install" plus a two-column summary of the current configuration. - New _install_summary() composes an aligned key/value table with rows for disks+FS+LUKS, bootloader, kernel, profile, greeter, package count, network, locale and timezone. Column width adapts to the longest translated label so translations keep the alignment. - Rows whose underlying config is not set are skipped rather than rendered as empty. - base.pot / uk base.po: add new msgids for summary labels. * Move install summary into ConfigurationOutput The summary helper that renders the install preview's two-column configuration overview lived in GlobalMenu. Move it to ConfigurationOutput.as_summary() so it sits alongside the JSON output methods that share the same role. The preview now syncs menu state to ArchConfig and delegates rendering. --- archinstall/lib/configuration.py | 66 ++++++++++++++++++++++ archinstall/lib/global_menu.py | 8 ++- archinstall/locales/base.pot | 15 +++++ archinstall/locales/uk/LC_MESSAGES/base.po | 15 +++++ 4 files changed, 102 insertions(+), 2 deletions(-) diff --git a/archinstall/lib/configuration.py b/archinstall/lib/configuration.py index 39d39511..0f22190e 100644 --- a/archinstall/lib/configuration.py +++ b/archinstall/lib/configuration.py @@ -10,6 +10,8 @@ from archinstall.lib.args import ArchConfig from archinstall.lib.crypt import encrypt from archinstall.lib.menu.helpers import Confirmation, Selection from archinstall.lib.menu.util import get_password, prompt_dir +from archinstall.lib.models.bootloader import Bootloader +from archinstall.lib.models.network import NetworkConfiguration from archinstall.lib.output import debug, logger, warn from archinstall.lib.translationhandler import tr from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup @@ -58,6 +60,70 @@ class ConfigurationOutput: debug(' -- Chosen configuration --') debug(self.user_config_to_json()) + def as_summary(self) -> str: + """ + Render a concise two-column summary of the current configuration. + + The left column holds section labels, the right column holds values. + Column width adapts to the longest translated label so translations + do not break the alignment. Rows whose underlying config is not set + are skipped. + + Returns an empty string if nothing meaningful to show. + """ + rows: list[tuple[str, str]] = [] + + disk_config = self._config.disk_config + if disk_config and disk_config.device_modifications: + disk_parts: list[str] = [] + for mod in disk_config.device_modifications: + path = str(mod.device_path) + root_part = mod.get_root_partition() + flags: list[str] = [] + if root_part and root_part.fs_type: + flags.append(root_part.fs_type.value) + if disk_config.disk_encryption: + flags.append(tr('LUKS')) + disk_parts.append(f'{path} ({" + ".join(flags)})' if flags else path) + rows.append((tr('Disks'), ', '.join(disk_parts))) + + bl_config = self._config.bootloader_config + if bl_config and bl_config.bootloader != Bootloader.NO_BOOTLOADER: + rows.append((tr('Bootloader'), bl_config.bootloader.value)) + + kernels = self._config.kernels + if kernels: + rows.append((tr('Kernel'), ', '.join(kernels))) + + profile_config = self._config.profile_config + if profile_config and profile_config.profile: + names = profile_config.profile.current_selection_names() + rows.append((tr('Profile'), ', '.join(names) if names else profile_config.profile.name)) + if profile_config.greeter: + rows.append((tr('Greeter'), profile_config.greeter.value)) + + packages = self._config.packages + if packages: + rows.append((tr('Packages'), str(len(packages)))) + + net_config = self._config.network_config + if isinstance(net_config, NetworkConfiguration): + rows.append((tr('Network'), net_config.type.display_msg())) + + locale_config = self._config.locale_config + if locale_config: + rows.append((tr('Locale'), locale_config.sys_lang)) + + tz = self._config.timezone + if tz: + rows.append((tr('Timezone'), tz)) + + if not rows: + return '' + + label_width = max(len(label) for label, _ in rows) + 2 + return '\n'.join(f'{label:<{label_width}}{value}' for label, value in rows) + async def confirm_config(self) -> bool: header = f'{tr("The specified configuration will be applied")}. ' header += tr('Would you like to continue?') + '\n' diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index 3bfefce7..cdd820a9 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -6,7 +6,7 @@ from archinstall.lib.args import ArchConfig from archinstall.lib.authentication.authentication_menu import AuthenticationMenu from archinstall.lib.bootloader.bootloader_menu import BootloaderMenu from archinstall.lib.bootloader.utils import validate_bootloader_layout -from archinstall.lib.configuration import save_config +from archinstall.lib.configuration import ConfigurationOutput, save_config from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu from archinstall.lib.general.general_menu import select_hostname, select_ntp, select_timezone from archinstall.lib.general.system_menu import select_kernel, select_swap @@ -504,7 +504,11 @@ class GlobalMenu(AbstractMenu[None]): if error := self._validate_bootloader(): return tr(f'Invalid configuration: {error}') - return None + self.sync_all_to_config() + summary = ConfigurationOutput(self._arch_config).as_summary() + if summary: + return f'{tr("Ready to install")}\n\n{summary}' + return tr('Ready to install') def _prev_profile(self, item: MenuItem) -> str | None: profile_config: ProfileConfiguration | None = item.value diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index a0c4c5b7..b7e1184b 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -1248,6 +1248,21 @@ msgstr "" msgid "Invalid configuration: {error}" msgstr "" +msgid "Ready to install" +msgstr "" + +msgid "Disks" +msgstr "" + +msgid "Packages" +msgstr "" + +msgid "Network" +msgstr "" + +msgid "Locale" +msgstr "" + msgid "Type" msgstr "" diff --git a/archinstall/locales/uk/LC_MESSAGES/base.po b/archinstall/locales/uk/LC_MESSAGES/base.po index ffab244f..88bf9ede 100644 --- a/archinstall/locales/uk/LC_MESSAGES/base.po +++ b/archinstall/locales/uk/LC_MESSAGES/base.po @@ -1222,6 +1222,21 @@ msgstr "Модель" msgid "Invalid configuration: {error}" msgstr "Неправильна конфігурація: {error}" +msgid "Ready to install" +msgstr "Готово до встановлення" + +msgid "Disks" +msgstr "Диски" + +msgid "Packages" +msgstr "Пакети" + +msgid "Network" +msgstr "Мережа" + +msgid "Locale" +msgstr "Локаль" + msgid "Type" msgstr "Тип"