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)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 22adc703..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
@@ -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: [
diff --git a/README.md b/README.md
index 1447c263..95d15702 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
@@ -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.
diff --git a/archinstall/default_profiles/desktop.py b/archinstall/default_profiles/desktop.py
index 7ffe31a8..19681bc7 100644
--- a/archinstall/default_profiles/desktop.py
+++ b/archinstall/default_profiles/desktop.py
@@ -4,8 +4,8 @@ from archinstall.default_profiles.profile import DisplayServerType, GreeterType,
from archinstall.lib.menu.helpers import Selection
from archinstall.lib.output import info
from archinstall.lib.profile.profiles_handler import profile_handler
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
if TYPE_CHECKING:
from archinstall.lib.installer import Installer
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
diff --git a/archinstall/default_profiles/desktops/cutefish.py b/archinstall/default_profiles/desktops/cutefish.py
deleted file mode 100644
index b014c8ca..00000000
--- a/archinstall/default_profiles/desktops/cutefish.py
+++ /dev/null
@@ -1,26 +0,0 @@
-from typing import override
-
-from archinstall.default_profiles.profile import DisplayServerType, GreeterType, Profile, ProfileType
-
-
-class CutefishProfile(Profile):
- def __init__(self) -> None:
- super().__init__(
- 'Cutefish',
- ProfileType.DesktopEnv,
- support_gfx_driver=True,
- display_server=DisplayServerType.Xorg,
- )
-
- @property
- @override
- def packages(self) -> list[str]:
- return [
- 'cutefish',
- 'noto-fonts',
- ]
-
- @property
- @override
- def default_greeter_type(self) -> GreeterType:
- return GreeterType.Sddm
diff --git a/archinstall/default_profiles/desktops/plasma.py b/archinstall/default_profiles/desktops/plasma.py
index e90f8a27..66a5ae9a 100644
--- a/archinstall/default_profiles/desktops/plasma.py
+++ b/archinstall/default_profiles/desktops/plasma.py
@@ -5,8 +5,8 @@ from archinstall.default_profiles.profile import CustomSetting, DisplayServerTyp
from archinstall.lib.menu.helpers import Selection
from archinstall.lib.packages.packages import available_package, package_group_info
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class PlasmaFlavor(StrEnum):
diff --git a/archinstall/default_profiles/desktops/utils.py b/archinstall/default_profiles/desktops/utils.py
index 46148e20..03e85aa5 100644
--- a/archinstall/default_profiles/desktops/utils.py
+++ b/archinstall/default_profiles/desktops/utils.py
@@ -2,8 +2,8 @@ from enum import Enum
from archinstall.lib.menu.helpers import Selection
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class SeatAccess(Enum):
diff --git a/archinstall/default_profiles/server.py b/archinstall/default_profiles/server.py
index 6833731f..bdd3d079 100644
--- a/archinstall/default_profiles/server.py
+++ b/archinstall/default_profiles/server.py
@@ -4,8 +4,8 @@ from archinstall.default_profiles.profile import Profile, ProfileType, SelectRes
from archinstall.lib.menu.helpers import Selection
from archinstall.lib.output import info
from archinstall.lib.profile.profiles_handler import profile_handler
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
if TYPE_CHECKING:
from archinstall.lib.installer import Installer
diff --git a/archinstall/lib/applications/application_menu.py b/archinstall/lib/applications/application_menu.py
index 990dcda7..99e48726 100644
--- a/archinstall/lib/applications/application_menu.py
+++ b/archinstall/lib/applications/application_menu.py
@@ -17,8 +17,8 @@ from archinstall.lib.models.application import (
PrintServiceConfiguration,
)
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class ApplicationMenu(AbstractSubMenu[ApplicationConfiguration]):
diff --git a/archinstall/lib/args.py b/archinstall/lib/args.py
index 79441a06..8d78f7e6 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
@@ -29,7 +30,7 @@ from archinstall.lib.output import debug, error, logger, warn
from archinstall.lib.plugins import load_plugin
from archinstall.lib.translationhandler import Language, tr, translation_handler
from archinstall.lib.version import get_version
-from archinstall.tui.ui.components import tui
+from archinstall.tui.components import tui
@p_dataclass
@@ -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/authentication/authentication_handler.py b/archinstall/lib/authentication/authentication_handler.py
index a0b8e132..3a3b8cd4 100644
--- a/archinstall/lib/authentication/authentication_handler.py
+++ b/archinstall/lib/authentication/authentication_handler.py
@@ -53,7 +53,7 @@ class AuthenticationHandler:
def _add_u2f_entry(self, file: Path, entry: str) -> None:
if not file.exists():
debug(f'File does not exist: {file}')
- return None
+ return
content = file.read_text().splitlines()
@@ -81,7 +81,7 @@ class AuthenticationHandler:
install_session.pacman.strap('pam-u2f')
- print(tr(f'Setting up U2F login: {u2f_config.u2f_login_method.value}'))
+ print(tr('Setting up U2F login: {}').format(u2f_config.u2f_login_method.value))
# https://developers.yubico.com/pam-u2f/
u2f_auth_file = install_session.target / 'etc/u2f_mappings'
diff --git a/archinstall/lib/authentication/authentication_menu.py b/archinstall/lib/authentication/authentication_menu.py
index 6bead8ca..5453099f 100644
--- a/archinstall/lib/authentication/authentication_menu.py
+++ b/archinstall/lib/authentication/authentication_menu.py
@@ -9,8 +9,8 @@ from archinstall.lib.models.users import Password, User
from archinstall.lib.output import FormattedOutput
from archinstall.lib.translationhandler import tr
from archinstall.lib.user.user_menu import select_users
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class AuthenticationMenu(AbstractSubMenu[AuthenticationConfiguration]):
diff --git a/archinstall/lib/bootloader/bootloader_menu.py b/archinstall/lib/bootloader/bootloader_menu.py
index 37eaeb8d..d32a5a21 100644
--- a/archinstall/lib/bootloader/bootloader_menu.py
+++ b/archinstall/lib/bootloader/bootloader_menu.py
@@ -5,8 +5,8 @@ from archinstall.lib.menu.abstract_menu import AbstractSubMenu
from archinstall.lib.menu.helpers import Confirmation, Selection
from archinstall.lib.models.bootloader import Bootloader, BootloaderConfiguration
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class BootloaderMenu(AbstractSubMenu[BootloaderConfiguration]):
diff --git a/archinstall/lib/bootloader/utils.py b/archinstall/lib/bootloader/utils.py
new file mode 100644
index 00000000..ed761722
--- /dev/null
+++ b/archinstall/lib/bootloader/utils.py
@@ -0,0 +1,86 @@
+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
+
+
+class BootloaderValidationFailureKind(Enum):
+ LimineNonFatBoot = auto()
+ LimineLayout = auto()
+ BootloaderRequiresUefi = auto()
+ EfistubNonFatBoot = 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
+
+ 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()):
+ 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/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
diff --git a/archinstall/lib/configuration.py b/archinstall/lib/configuration.py
index 39d39511..aba835d9 100644
--- a/archinstall/lib/configuration.py
+++ b/archinstall/lib/configuration.py
@@ -10,10 +10,12 @@ 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
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class ConfigurationOutput:
@@ -58,10 +60,77 @@ class ConfigurationOutput:
debug(' -- Chosen configuration --')
debug(self.user_config_to_json())
- async def confirm_config(self) -> bool:
+ 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, show_install_warnings: bool = False) -> bool:
header = f'{tr("The specified configuration will be applied")}. '
header += tr('Would you like to continue?') + '\n'
+ if show_install_warnings:
+ header += self._render_install_warnings()
+
group = MenuItemGroup.yes_no()
group.set_preview_for_all(lambda x: self.user_config_to_json())
@@ -79,6 +148,22 @@ class ConfigurationOutput:
return True
+ def get_install_warnings(self) -> list[str]:
+ warnings: list[str] = []
+
+ if not isinstance(self._config.network_config, NetworkConfiguration):
+ warnings.append(tr('Warning: no network configuration selected. Network will need to be set up manually on the installed system.'))
+
+ return warnings
+
+ def _render_install_warnings(self) -> str:
+ warnings = self.get_install_warnings()
+
+ if not warnings:
+ return ''
+
+ return '\n' + '\n'.join(f'[yellow]{w}[/]' for w in warnings) + '\n'
+
def _is_valid_path(self, dest_path: Path) -> bool:
dest_path_ok = dest_path.exists() and dest_path.is_dir()
if not dest_path_ok:
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/disk/disk_menu.py b/archinstall/lib/disk/disk_menu.py
index 9743ee78..26aa145d 100644
--- a/archinstall/lib/disk/disk_menu.py
+++ b/archinstall/lib/disk/disk_menu.py
@@ -37,8 +37,8 @@ from archinstall.lib.models.device import (
)
from archinstall.lib.output import FormattedOutput, debug
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
@dataclass
diff --git a/archinstall/lib/disk/encryption_menu.py b/archinstall/lib/disk/encryption_menu.py
index 39c631cd..f5d4f095 100644
--- a/archinstall/lib/disk/encryption_menu.py
+++ b/archinstall/lib/disk/encryption_menu.py
@@ -19,8 +19,8 @@ from archinstall.lib.models.device import (
from archinstall.lib.models.users import Password
from archinstall.lib.output import FormattedOutput
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class DiskEncryptionMenu(AbstractSubMenu[DiskEncryption]):
@@ -375,7 +375,7 @@ async def select_lvm_vols_to_encrypt(
async def select_iteration_time(preset: int | None = None) -> int | None:
header = tr('Enter iteration time for LUKS encryption (in milliseconds)') + '\n'
header += tr('Higher values increase security but slow down boot time') + '\n'
- header += tr(f'Default: {DEFAULT_ITER_TIME}ms, Recommended range: 1000-60000') + '\n'
+ header += tr('Default: {}ms, Recommended range: 1000-60000').format(DEFAULT_ITER_TIME) + '\n'
def validate_iter_time(value: str) -> str | None:
try:
diff --git a/archinstall/lib/disk/partitioning_menu.py b/archinstall/lib/disk/partitioning_menu.py
index 7e07d776..a524cf99 100644
--- a/archinstall/lib/disk/partitioning_menu.py
+++ b/archinstall/lib/disk/partitioning_menu.py
@@ -21,8 +21,8 @@ from archinstall.lib.models.device import (
)
from archinstall.lib.output import FormattedOutput
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class FreeSpace:
diff --git a/archinstall/lib/disk/subvolume_menu.py b/archinstall/lib/disk/subvolume_menu.py
index 0f8da9e7..94854b3c 100644
--- a/archinstall/lib/disk/subvolume_menu.py
+++ b/archinstall/lib/disk/subvolume_menu.py
@@ -6,7 +6,7 @@ from archinstall.lib.menu.list_manager import ListManager
from archinstall.lib.menu.util import prompt_dir
from archinstall.lib.models.device import SubvolumeModification
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.result import ResultType
class SubvolumeMenu(ListManager[SubvolumeModification]):
diff --git a/archinstall/lib/general/general_menu.py b/archinstall/lib/general/general_menu.py
index 257b61e5..be5498d8 100644
--- a/archinstall/lib/general/general_menu.py
+++ b/archinstall/lib/general/general_menu.py
@@ -4,8 +4,8 @@ from archinstall.lib.locale.utils import list_timezones
from archinstall.lib.menu.helpers import Confirmation, Input, Selection
from archinstall.lib.output import warn
from archinstall.lib.translationhandler import Language, tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class PostInstallationAction(Enum):
diff --git a/archinstall/lib/general/system_menu.py b/archinstall/lib/general/system_menu.py
index 5c4d4634..82dc4cdb 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
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.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 2baef93d..eac936bd 100644
--- a/archinstall/lib/global_menu.py
+++ b/archinstall/lib/global_menu.py
@@ -5,7 +5,8 @@ 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.configuration import save_config
+from archinstall.lib.bootloader.utils import validate_bootloader_layout
+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
@@ -17,10 +18,11 @@ 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
+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
@@ -30,8 +32,8 @@ from archinstall.lib.packages.packages import list_available_packages, select_ad
from archinstall.lib.pacman.config import PacmanConfig
from archinstall.lib.pacman.pacman_menu import PacmanMenu
from archinstall.lib.translationhandler import Language, tr, translation_handler
-from archinstall.tui.ui.components import tui
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.components import tui
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
class GlobalMenu(AbstractMenu[None]):
@@ -102,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,
@@ -460,8 +462,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():
@@ -486,16 +486,11 @@ 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'
-
- 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
@@ -509,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/lib/hardware.py b/archinstall/lib/hardware.py
index 09b3eb5f..2cfdb706 100644
--- a/archinstall/lib/hardware.py
+++ b/archinstall/lib/hardware.py
@@ -68,6 +68,19 @@ class GfxDriver(Enum):
case _:
return False
+ def is_nvidia_proprietary(self) -> bool:
+ """
+ True for Nvidia drivers that ship proprietary userspace components.
+ Currently only NvidiaOpenKernel (nvidia-open-dkms): open kernel module
+ paired with proprietary userspace. NvidiaOpenSource (nouveau) is fully
+ open and works with Sway, so it is excluded.
+ """
+ match self:
+ case GfxDriver.NvidiaOpenKernel:
+ return True
+ case _:
+ return False
+
def packages_text(self) -> str:
pkg_names = [p.value for p in self.gfx_packages()]
text = tr('Installed packages') + ':\n'
diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py
index 973e80ac..44a10eb2 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,
@@ -47,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
@@ -59,7 +61,12 @@ 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']
+# https://github.com/archlinux/archinstall/issues/4368
+# mkinitcpio is listed explicitly so pacstrap installs it deterministically. Otherwise
+# pacman picks the first initramfs provider from the host's pacman.conf, which on non-Arch
+# hosts (EndeavourOS prefers dracut, etc.) breaks the installer's mkinitcpio() and
+# _config_uki() methods that assume mkinitcpio is present in the chroot.
+__packages__ = ['base', 'sudo', 'linux-firmware', 'mkinitcpio'] + [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']
@@ -78,8 +85,8 @@ class Installer:
`Installer()` is the wrapper for most basic installation steps.
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._base_packages = base_packages or __packages__[:4]
+ self.kernels = kernels or [DEFAULT_KERNEL.value]
self._disk_config = disk_config
self._disk_encryption = disk_config.disk_encryption or DiskEncryption(EncryptionType.NO_ENCRYPTION)
@@ -182,10 +189,10 @@ class Installer:
if not skip_ntp:
info(tr('Waiting for time sync (timedatectl show) to complete.'))
- started_wait = time.time()
+ started_wait = time.monotonic()
notified = False
while True:
- if not notified and time.time() - started_wait > 5:
+ if not notified and time.monotonic() - started_wait > 5:
notified = True
warn(tr('Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/'))
@@ -395,7 +402,7 @@ class Installer:
def _mount_luks_partition(self, part_mod: PartitionModification, luks_handler: Luks2) -> None:
if not luks_handler.mapper_dev:
- return None
+ return
if part_mod.fs_type == FilesystemType.BTRFS and part_mod.btrfs_subvols:
# Only mount BTRFS subvolumes that have mountpoints specified
@@ -738,6 +745,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)
@@ -986,17 +996,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)
@@ -1335,13 +1335,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:
@@ -1466,6 +1460,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 +1478,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)
@@ -1917,16 +1915,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():
@@ -1937,7 +1936,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)
@@ -1952,7 +1955,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)
@@ -1964,7 +1967,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
@@ -1974,7 +1977,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
@@ -1985,12 +1988,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..add9fc2d 100644
--- a/archinstall/lib/locale/locale_menu.py
+++ b/archinstall/lib/locale/locale_menu.py
@@ -1,12 +1,12 @@
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
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class LocaleMenu(AbstractSubMenu[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/menu/abstract_menu.py b/archinstall/lib/menu/abstract_menu.py
index 084c6e4f..590cabf1 100644
--- a/archinstall/lib/menu/abstract_menu.py
+++ b/archinstall/lib/menu/abstract_menu.py
@@ -5,10 +5,9 @@ from typing import Any, Self, override
from archinstall.lib.menu.helpers import Selection
from archinstall.lib.output import error
from archinstall.lib.translationhandler import tr
-from archinstall.tui.types import Chars
-from archinstall.tui.ui.components import InstanceRunnable
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.components import InstanceRunnable
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
CONFIG_KEY = '__config__'
@@ -154,7 +153,7 @@ class AbstractSubMenu[ValueT](AbstractMenu[ValueT]):
auto_cursor: bool = True,
allow_reset: bool = False,
):
- back_text = f'{Chars.Right_arrow} ' + tr('Back')
+ back_text = '← ' + tr('Back')
item_group.add_item(MenuItem(text=back_text))
super().__init__(
diff --git a/archinstall/lib/menu/helpers.py b/archinstall/lib/menu/helpers.py
index 96361765..b512c956 100644
--- a/archinstall/lib/menu/helpers.py
+++ b/archinstall/lib/menu/helpers.py
@@ -4,9 +4,9 @@ from typing import Any, Literal, override
from textual.validation import ValidationResult, Validator
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.components import InputInfo, InputScreen, LoadingScreen, NotifyScreen, OptionListScreen, SelectListScreen, TableSelectionScreen
-from archinstall.tui.ui.menu_item import MenuItemGroup
-from archinstall.tui.ui.result import Result, ResultType
+from archinstall.tui.components import InputInfo, InputScreen, LoadingScreen, NotifyScreen, OptionListScreen, SelectListScreen, TableSelectionScreen
+from archinstall.tui.menu_item import MenuItemGroup
+from archinstall.tui.result import Result, ResultType
class Selection[ValueT]:
diff --git a/archinstall/lib/menu/list_manager.py b/archinstall/lib/menu/list_manager.py
index 54683f54..3b612162 100644
--- a/archinstall/lib/menu/list_manager.py
+++ b/archinstall/lib/menu/list_manager.py
@@ -4,8 +4,8 @@ from typing import cast
from archinstall.lib.menu.helpers import Selection
from archinstall.lib.menu.menu_helper import MenuHelper
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class ListManager[ValueT]:
diff --git a/archinstall/lib/menu/menu_helper.py b/archinstall/lib/menu/menu_helper.py
index 47e04fb8..6ca3b953 100644
--- a/archinstall/lib/menu/menu_helper.py
+++ b/archinstall/lib/menu/menu_helper.py
@@ -1,5 +1,5 @@
from archinstall.lib.output import FormattedOutput
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
class MenuHelper[ValueT]:
diff --git a/archinstall/lib/menu/util.py b/archinstall/lib/menu/util.py
index ff3dea47..10edfd49 100644
--- a/archinstall/lib/menu/util.py
+++ b/archinstall/lib/menu/util.py
@@ -5,8 +5,8 @@ from pathlib import Path
from archinstall.lib.menu.helpers import Confirmation, Input
from archinstall.lib.models.users import Password, PasswordStrength
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.components import InputInfo, InputInfoType, tui
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.components import InputInfo, InputInfoType, tui
+from archinstall.tui.result import ResultType
async def get_password(
diff --git a/archinstall/lib/mirror/mirror_menu.py b/archinstall/lib/mirror/mirror_menu.py
index 3e899cca..5158bffd 100644
--- a/archinstall/lib/mirror/mirror_menu.py
+++ b/archinstall/lib/mirror/mirror_menu.py
@@ -15,8 +15,8 @@ from archinstall.lib.models.mirrors import (
from archinstall.lib.models.packages import Repository
from archinstall.lib.output import FormattedOutput
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class CustomMirrorRepositoriesList(ListManager[CustomRepository]):
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
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/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/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/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(
diff --git a/archinstall/lib/network/network_menu.py b/archinstall/lib/network/network_menu.py
index bcf54698..120af19e 100644
--- a/archinstall/lib/network/network_menu.py
+++ b/archinstall/lib/network/network_menu.py
@@ -6,8 +6,8 @@ from archinstall.lib.menu.list_manager import ListManager
from archinstall.lib.models.network import NetworkConfiguration, Nic, NicType
from archinstall.lib.networking import list_interfaces
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class ManualNetworkConfig(ListManager[Nic]):
@@ -172,14 +172,17 @@ async def select_network(preset: NetworkConfiguration | None) -> NetworkConfigur
"""
items = [MenuItem(n.display_msg(), value=n) for n in NicType]
- group = MenuItemGroup(items, sort_items=True)
+ group = MenuItemGroup(items, sort_items=False)
if preset:
group.set_selected_by_value(preset.type)
+ header = tr('Choose network configuration') + '\n'
+ header += tr('Recommended: Network Manager for desktop, Manual for server') + '\n'
+
result = await Selection[NicType](
group,
- header=tr('Choose network configuration'),
+ header=header,
allow_reset=True,
allow_skip=True,
).show()
diff --git a/archinstall/lib/network/wifi_handler.py b/archinstall/lib/network/wifi_handler.py
index 0546310b..4c858601 100644
--- a/archinstall/lib/network/wifi_handler.py
+++ b/archinstall/lib/network/wifi_handler.py
@@ -9,9 +9,9 @@ from archinstall.lib.models.network import WifiConfiguredNetwork, WifiNetwork
from archinstall.lib.network.wpa_supplicant import WpaSupplicantConfig
from archinstall.lib.output import debug
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.components import ConfirmationScreen, InputScreen, InstanceRunnable, LoadingScreen, NotifyScreen, TableSelectionScreen, tui
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import Result, ResultType
+from archinstall.tui.components import ConfirmationScreen, InputScreen, InstanceRunnable, LoadingScreen, NotifyScreen, TableSelectionScreen, tui
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import Result, ResultType
@dataclass
diff --git a/archinstall/lib/networking.py b/archinstall/lib/networking.py
index ebf59990..e950a697 100644
--- a/archinstall/lib/networking.py
+++ b/archinstall/lib/networking.py
@@ -46,12 +46,12 @@ class DownloadTimer:
self.previous_handler = signal.signal(signal.SIGALRM, self.raise_timeout) # type: ignore[assignment]
self.previous_timer = signal.alarm(self.timeout)
- self.start_time = time.time()
+ self.start_time = time.monotonic()
return self
def __exit__(self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None) -> None:
if self.start_time:
- time_delta = time.time() - self.start_time
+ time_delta = time.monotonic() - self.start_time
signal.alarm(0)
self.time = time_delta
if self.timeout > 0:
@@ -165,7 +165,7 @@ def build_icmp(payload: bytes) -> bytes:
def ping(hostname: str, timeout: int = 5) -> int:
watchdog = select.epoll()
- started = time.time()
+ started = time.monotonic()
random_identifier = f'archinstall-{random.randint(1000, 9999)}'.encode()
# Create a raw socket (requires root, which should be fine on archiso)
@@ -180,7 +180,7 @@ def ping(hostname: str, timeout: int = 5) -> int:
# Gracefully wait for X amount of time
# for a ICMP response or exit with no latency
- while latency == -1 and time.time() - started < timeout:
+ while latency == -1 and time.monotonic() - started < timeout:
try:
for _fileno, _event in watchdog.poll(0.1):
response, _ = icmp_socket.recvfrom(1024)
@@ -188,7 +188,7 @@ def ping(hostname: str, timeout: int = 5) -> int:
# Check if it's an Echo Reply (ICMP type 0)
if icmp_type == 0 and response[-len(random_identifier) :] == random_identifier:
- latency = round((time.time() - started) * 1000)
+ latency = round((time.monotonic() - started) * 1000)
break
except OSError as e:
debug(f'Error: {e}')
diff --git a/archinstall/lib/output.py b/archinstall/lib/output.py
index e01da3eb..bc4bb113 100644
--- a/archinstall/lib/output.py
+++ b/archinstall/lib/output.py
@@ -133,7 +133,7 @@ class Journald:
try:
import systemd.journal # type: ignore[import-not-found]
except ModuleNotFoundError:
- return None
+ return
log_adapter = logging.getLogger('archinstall')
log_fmt = logging.Formatter('[%(levelname)s]: %(message)s')
diff --git a/archinstall/lib/packages/packages.py b/archinstall/lib/packages/packages.py
index 3572c6c4..dcc4da9e 100644
--- a/archinstall/lib/packages/packages.py
+++ b/archinstall/lib/packages/packages.py
@@ -6,8 +6,8 @@ from archinstall.lib.models.packages import AvailablePackage, LocalPackage, Pack
from archinstall.lib.output import debug
from archinstall.lib.pacman.pacman import Pacman
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
def installed_package(package: str) -> LocalPackage | None:
diff --git a/archinstall/lib/pacman/pacman.py b/archinstall/lib/pacman/pacman.py
index 5427214c..83f8b40d 100644
--- a/archinstall/lib/pacman/pacman.py
+++ b/archinstall/lib/pacman/pacman.py
@@ -29,11 +29,11 @@ class Pacman:
if pacman_db_lock.exists():
warn(tr('Pacman is already running, waiting maximum 10 minutes for it to terminate.'))
- started = time.time()
+ started = time.monotonic()
while pacman_db_lock.exists():
time.sleep(0.25)
- if time.time() - started > (60 * 10):
+ if time.monotonic() - started > (60 * 10):
error(tr('Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall.'))
sys.exit(1)
diff --git a/archinstall/lib/pacman/pacman_menu.py b/archinstall/lib/pacman/pacman_menu.py
index 010c3f6d..16ad6d2b 100644
--- a/archinstall/lib/pacman/pacman_menu.py
+++ b/archinstall/lib/pacman/pacman_menu.py
@@ -5,8 +5,8 @@ from archinstall.lib.menu.helpers import Confirmation, Input
from archinstall.lib.models.pacman import PacmanConfiguration
from archinstall.lib.pathnames import PACMAN_CONF
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class PacmanMenu(AbstractSubMenu[PacmanConfiguration]):
diff --git a/archinstall/lib/profile/profile_menu.py b/archinstall/lib/profile/profile_menu.py
index cb560c27..d3b35c82 100644
--- a/archinstall/lib/profile/profile_menu.py
+++ b/archinstall/lib/profile/profile_menu.py
@@ -7,8 +7,8 @@ from archinstall.lib.menu.abstract_menu import AbstractSubMenu
from archinstall.lib.menu.helpers import Confirmation, Selection
from archinstall.lib.models.profile import ProfileConfiguration
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import ResultType
class ProfileMenu(AbstractSubMenu[ProfileConfiguration]):
@@ -95,7 +95,7 @@ class ProfileMenu(AbstractSubMenu[ProfileConfiguration]):
driver = await select_driver(preset=preset)
if driver and 'Sway' in profile.current_selection_names():
- if driver.is_nvidia():
+ if driver.is_nvidia_proprietary():
header = tr('The proprietary Nvidia driver is not supported by Sway.') + '\n'
header += tr('It is likely that you will run into issues, are you okay with that?') + '\n'
@@ -105,8 +105,7 @@ class ProfileMenu(AbstractSubMenu[ProfileConfiguration]):
preset=False,
).show()
- if result.get_value():
- return preset
+ return driver if result.get_value() else preset
return driver
@@ -114,7 +113,7 @@ class ProfileMenu(AbstractSubMenu[ProfileConfiguration]):
if item.value:
driver = item.get_value().value
packages = item.get_value().packages_text()
- return f'Driver: {driver}\n{packages}'
+ return f'{tr("Graphics driver")}: {driver}\n{packages}'
return None
def _prev_greeter(self, item: MenuItem) -> str | None:
diff --git a/archinstall/lib/user/user_menu.py b/archinstall/lib/user/user_menu.py
index e7d77aab..8e6e48fd 100644
--- a/archinstall/lib/user/user_menu.py
+++ b/archinstall/lib/user/user_menu.py
@@ -6,8 +6,8 @@ from archinstall.lib.menu.list_manager import ListManager
from archinstall.lib.menu.util import get_password
from archinstall.lib.models.users import User
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem
-from archinstall.tui.ui.result import ResultType
+from archinstall.tui.menu_item import MenuItem
+from archinstall.tui.result import ResultType
class UserList(ListManager[User]):
diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot
index ac1728eb..31f5e196 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 ""
@@ -1245,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 ""
@@ -2174,6 +2192,14 @@ msgstr ""
msgid "Choose network configuration"
msgstr ""
+msgid "Recommended: Network Manager for desktop, Manual for server"
+msgstr ""
+
+msgid ""
+"Warning: no network configuration selected. Network will need to be set up "
+"manually on the installed system."
+msgstr ""
+
msgid "No packages found"
msgstr ""
@@ -2251,3 +2277,19 @@ 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 ""
+
+#, python-brace-format
+msgid "Setting up U2F login: {}"
+msgstr ""
+
+#, python-brace-format
+msgid "Default: {}ms, Recommended range: 1000-60000"
+msgstr ""
diff --git a/archinstall/locales/da/LC_MESSAGES/base.mo b/archinstall/locales/da/LC_MESSAGES/base.mo
new file mode 100644
index 00000000..b0cb0718
Binary files /dev/null and b/archinstall/locales/da/LC_MESSAGES/base.mo differ
diff --git a/archinstall/locales/da/LC_MESSAGES/base.po b/archinstall/locales/da/LC_MESSAGES/base.po
new file mode 100644
index 00000000..cc54891d
--- /dev/null
+++ b/archinstall/locales/da/LC_MESSAGES/base.po
@@ -0,0 +1,2224 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "[!] A log file has been created here: {} {}"
+msgstr "[!] En logfil er blevet oprettet her: {} {}"
+
+msgid " Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues"
+msgstr " Indsend venligst denne fejl (og filen) til https://github.com/archlinux/archinstall/issues"
+
+msgid "Do you really want to abort?"
+msgstr "Vil du virkelig afbryde?"
+
+msgid "And one more time for verification: "
+msgstr "Og én gang til for bekræftelse: "
+
+msgid "Would you like to use swap on zram?"
+msgstr "Vil du bruge swap på zram?"
+
+msgid "Desired hostname for the installation: "
+msgstr "Ønsket værtsnavn for installationen: "
+
+msgid "Username for required superuser with sudo privileges: "
+msgstr "Brugernavn til den påkrævede superbruger med sudo-rettigheder: "
+
+msgid "Any additional users to install (leave blank for no users): "
+msgstr "Eventuelle yderligere brugere der skal oprettes (lad feltet være tomt for ingen): "
+
+msgid "Should this user be a superuser (sudoer)?"
+msgstr "Skal denne bruger være superbruger (sudoer)?"
+
+msgid "Select a timezone"
+msgstr "Vælg en tidszone"
+
+msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?"
+msgstr "Vil du bruge GRUB som bootloader i stedet for systemd-boot?"
+
+msgid "Choose a bootloader"
+msgstr "Vælg en bootloader"
+
+msgid "Choose an audio server"
+msgstr "Vælg en lydserver"
+
+msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr and optional profile packages are installed."
+msgstr "Kun pakker som base, base-devel, linux, linux-firmware, efibootmgr og valgfrie profilpakker installeres."
+
+msgid "Note: base-devel is no longer installed by default. Add it here if you need build tools."
+msgstr "Bemærk: base-devel installeres ikke længere som standard. Tilføj den her, hvis du har brug for byggeværktøjer."
+
+msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt."
+msgstr "Hvis du ønsker en webbrowser, f.eks. firefox eller chromium, kan du angive den i næste prompt."
+
+msgid "Write additional packages to install (space separated, leave blank to skip): "
+msgstr "Skriv yderligere pakker der skal installeres (adskilt med mellemrum, lad feltet være tomt for at springe over): "
+
+msgid "Copy ISO network configuration to installation"
+msgstr "Kopiér ISO-netværkskonfigurationen til installationen"
+
+msgid "Use NetworkManager (necessary for configuring internet graphically in GNOME and KDE)"
+msgstr "Brug NetworkManager (nødvendigt for grafisk internetkonfiguration i GNOME og KDE)"
+
+msgid "Select one network interface to configure"
+msgstr "Vælg én netværksgrænseflade der skal konfigureres"
+
+msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\""
+msgstr "Vælg hvilken tilstand der skal konfigureres for \"{}\", eller spring over for at bruge standardtilstanden \"{}\""
+
+#, python-brace-format
+msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): "
+msgstr "Indtast IP og subnet for {} (eksempel: 192.168.0.5/24): "
+
+msgid "Enter your gateway (router) IP address or leave blank for none: "
+msgstr "Indtast IP-adressen på din gateway (router), eller lad feltet være tomt for ingen: "
+
+msgid "Enter your DNS servers (space separated, blank for none): "
+msgstr "Indtast dine DNS-servere (adskilt med mellemrum, tomt for ingen): "
+
+msgid "Select which filesystem your main partition should use"
+msgstr "Vælg hvilket filsystem din hovedpartition skal bruge"
+
+msgid "Current partition layout"
+msgstr "Nuværende partitionslayout"
+
+msgid ""
+"Select what to do with\n"
+"{}"
+msgstr ""
+"Vælg hvad der skal gøres med\n"
+"{}"
+
+msgid "Enter a desired filesystem type for the partition"
+msgstr "Indtast den ønskede filsystemtype for partitionen"
+
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr "Indtast startplaceringen (i parted-enheder: s, GB, %, osv.; standard: {}): "
+
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr "Indtast slutplaceringen (i parted-enheder: s, GB, %, osv.; f.eks.: {}): "
+
+msgid "{} contains queued partitions, this will remove those, are you sure?"
+msgstr "{} indeholder planlagte partitioner. Dette vil fjerne dem. Er du sikker?"
+
+msgid ""
+"{}\n"
+"\n"
+"Select by index which partitions to delete"
+msgstr ""
+"{}\n"
+"\n"
+"Vælg efter indeks hvilke partitioner der skal slettes"
+
+msgid ""
+"{}\n"
+"\n"
+"Select by index which partition to mount where"
+msgstr ""
+"{}\n"
+"\n"
+"Vælg efter indeks hvilken partition der skal monteres hveller"
+
+msgid " * Partition mount-points are relative to inside the installation, the boot would be /boot as an example."
+msgstr " * Partitionens monteringspunkter er relative inde i installationen; boot vil f.eks. være /boot."
+
+msgid "Select where to mount partition (leave blank to remove mountpoint): "
+msgstr "Vælg hvor partitionen skal monteres (lad feltet være tomt for at fjerne monteringspunktet): "
+
+msgid ""
+"{}\n"
+"\n"
+"Select which partition to mask for formatting"
+msgstr ""
+"{}\n"
+"\n"
+"Vælg hvilken partition der skal markeres til formatering"
+
+msgid ""
+"{}\n"
+"\n"
+"Select which partition to mark as encrypted"
+msgstr ""
+"{}\n"
+"\n"
+"Vælg hvilken partition der skal mark som krypteret"
+
+msgid ""
+"{}\n"
+"\n"
+"Select which partition to mark as bootable"
+msgstr ""
+"{}\n"
+"\n"
+"Vælg hvilken partition der skal mark som bootbar"
+
+msgid ""
+"{}\n"
+"\n"
+"Select which partition to set a filesystem on"
+msgstr ""
+"{}\n"
+"\n"
+"Vælg hvilken partition der skal set en filsystem on"
+
+msgid "Enter a desired filesystem type for the partition: "
+msgstr "Indtast den ønskede filsystemtype for partitionen: "
+
+msgid "Archinstall language"
+msgstr "Archinstall-sprog"
+
+msgid "Wipe all selected drives and use a best-effort default partition layout"
+msgstr "Slet alle valgte drev og brug et bedst muligt standardpartitionslayout"
+
+msgid "Select what to do with each individual drive (followed by partition usage)"
+msgstr "Vælg hvad der skal gøres med hvert enkelt drev (efterfulgt af partitionsbrug)"
+
+msgid "Select what you wish to do with the selected block devices"
+msgstr "Vælg hvad du vil gøre med de valgte blokenheder"
+
+msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments"
+msgstr "Dette er en liste over forudprogrammerede profiler, som kan gøre det lettere at installere ting som skrivebordsmiljøer"
+
+msgid "Select keyboard layout"
+msgstr "Vælg tastaturlayout"
+
+msgid "Select one of the regions to download packages from"
+msgstr "Vælg en af regionerne som pakker skal hentes fra"
+
+msgid "Select one or more hard drives to use and configure"
+msgstr "Vælg en eller flere harddiske der skal bruges og konfigureres"
+
+msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options."
+msgstr "For bedst kompatibilitet med din AMD-hardware kan du bruge enten alle open source-drivere eller AMD/ATI-valgene."
+
+msgid "For the best compatibility with your Intel hardware, you may want to use either the all open-source or Intel options.\n"
+msgstr "For bedst kompatibilitet med din Intel-hardware kan du bruge enten alle open source-drivere eller Intel-valgene.\n"
+
+msgid "For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n"
+msgstr "For bedst kompatibilitet med din Nvidia-hardware kan du bruge Nvidias proprietære driver.\n"
+
+msgid ""
+"\n"
+"\n"
+"Select a graphics driver or leave blank to install all open-source drivers"
+msgstr ""
+"\n"
+"\n"
+"Vælg en grafikdriver, eller lad feltet være tomt for at installere alle open source-drivere"
+
+msgid "All open-source (default)"
+msgstr "Alle open source-drivere (standard)"
+
+msgid "Choose which kernels to use or leave blank for default \"{}\""
+msgstr "Vælg hvilke kerner der skal bruges, eller lad feltet være tomt for standard \"{}\""
+
+msgid "Choose which locale language to use"
+msgstr "Vælg hvilket lokaliseringssprog der skal bruges"
+
+msgid "Choose which locale encoding to use"
+msgstr "Vælg hvilken lokaliseringskodning der skal bruges"
+
+msgid "Select one of the values shown below: "
+msgstr "Vælg en af værdierne nedenfor: "
+
+msgid "Select one or more of the options below: "
+msgstr "Vælg en eller flere af mulighederne nedenfor: "
+
+msgid "Adding partition...."
+msgstr "Tilføjer partition...."
+
+msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's."
+msgstr "Du skal indtaste en gyldig fs-type for at fortsætte. Se `man parted` for gyldige fs-typer."
+
+msgid "Error: Listing profiles on URL \"{}\" resulted in:"
+msgstr "Fejl: Liste over profiler fra URL \"{}\" gav:"
+
+msgid "Error: Could not decode \"{}\" result as JSON:"
+msgstr "Fejl: Kunne ikke afkode resultatet \"{}\" som JSON:"
+
+msgid "Keyboard layout"
+msgstr "Tastaturlayout"
+
+msgid "Mirror region"
+msgstr "Spejlregion"
+
+msgid "Locale language"
+msgstr "Lokaliseringssprog"
+
+msgid "Locale encoding"
+msgstr "Lokaliseringskodning"
+
+msgid "Console font"
+msgstr "Konsolskrifttype"
+
+msgid "Drive(s)"
+msgstr "Drev"
+
+msgid "Disk layout"
+msgstr "Disklayout"
+
+msgid "Encryption password"
+msgstr "Krypteringsadgangskode"
+
+msgid "Swap"
+msgstr "Swap"
+
+msgid "Bootloader"
+msgstr "Bootloader"
+
+msgid "Root password"
+msgstr "Root-adgangskode"
+
+msgid "Superuser account"
+msgstr "Superbrugerkonto"
+
+msgid "User account"
+msgstr "Brugerkonto"
+
+msgid "Profile"
+msgstr "Profil"
+
+msgid "Audio"
+msgstr "Lyd"
+
+msgid "Kernels"
+msgstr "Kerner"
+
+msgid "Additional packages"
+msgstr "Yderligere pakker"
+
+msgid "Network configuration"
+msgstr "Netværkskonfiguration"
+
+msgid "Automatic time sync (NTP)"
+msgstr "Automatisk tidssynkronisering (NTP)"
+
+msgid "Install ({} config(s) missing)"
+msgstr "Installer ({} konfiguration(er) mangler)"
+
+msgid ""
+"You decided to skip harddrive selection\n"
+"and will use whatever drive-setup is mounted at {} (experimental)\n"
+"WARNING: Archinstall won't check the suitability of this setup\n"
+"Do you wish to continue?"
+msgstr ""
+"Du valgte at springe harddiskvalg over\n"
+"og vil bruge den drevopsætning der er monteret på {} (eksperimentelt)\n"
+"ADVARSEL: Archinstall kontrollerer ikke om denne opsætning er egnet\n"
+"Vil du fortsætte?"
+
+msgid "Re-using partition instance: {}"
+msgstr "Genbruger partitionsinstans: {}"
+
+msgid "Create a new partition"
+msgstr "Create en new partition"
+
+msgid "Delete a partition"
+msgstr "Slet en partition"
+
+msgid "Clear/Delete all partitions"
+msgstr "Clear/Slet all partitioner"
+
+msgid "Assign mount-point for a partition"
+msgstr "Tildel monteringspunkt til en partition"
+
+msgid "Mark/Unmark a partition to be formatted (wipes data)"
+msgstr "Markér/fjern markering en partition skal være fellermateret (wipes data)"
+
+msgid "Mark/Unmark a partition as encrypted"
+msgstr "Markér/fjern markering en partition som krypteret"
+
+msgid "Mark/Unmark a partition as bootable (automatic for /boot)"
+msgstr "Markér/fjern markering af en partition som bootbar (automatisk for /boot)"
+
+msgid "Set desired filesystem for a partition"
+msgstr "Angiv ønsket filsystem for en partition"
+
+msgid "Abort"
+msgstr "Afbryd"
+
+msgid "Hostname"
+msgstr "Værtsnavn"
+
+msgid "Not configured, unavailable unless setup manually"
+msgstr "Ikke konfigureret, utilgængelig medmindre det sættes op manuelt"
+
+msgid "Timezone"
+msgstr "Tidszone"
+
+msgid "Set/Modify the below options"
+msgstr "Angiv/ændr indstillingerne nedenfor"
+
+msgid "Install"
+msgstr "Installer"
+
+msgid ""
+"Use ESC to skip\n"
+"\n"
+msgstr ""
+"Brug ESC for at springe over\n"
+"\n"
+
+msgid "Suggest partition layout"
+msgstr "Foreslå partitionslayout"
+
+msgid "Enter a password: "
+msgstr "Indtast en adgangskode: "
+
+msgid "Enter a encryption password for {}"
+msgstr "Indtast en krypteringsadgangskode for {}"
+
+msgid "Enter disk encryption password (leave blank for no encryption): "
+msgstr "Indtast adgangskode til diskkryptering (lad feltet være tomt for ingen kryptering): "
+
+msgid "Create a required super-user with sudo privileges: "
+msgstr "Create en required super-bruger med sudo-rettigheder: "
+
+msgid "Enter root password (leave blank to disable root): "
+msgstr "Indtast root-adgangskode (lad feltet være tomt for at deaktivere root): "
+
+msgid "Password for user \"{}\": "
+msgstr "Adgangskode for brugeren \"{}\": "
+
+msgid "Verifying that additional packages exist (this might take a few seconds)"
+msgstr "Kontrollerer at de yderligere pakker findes (det kan tage et par sekunder)"
+
+msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n"
+msgstr "Vil du bruge automatisk tidssynkronisering (NTP) med standardtidserverne?\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 ""
+"Hardwaretid og andre efterkonfigurationstrin kan være nødvendige for at NTP virker.\n"
+"Se Arch-wikien for mere information"
+
+msgid "Enter a username to create an additional user (leave blank to skip): "
+msgstr "Indtast et brugernavn for at oprette en ekstra bruger (lad feltet være tomt for at springe over): "
+
+msgid "Use ESC to skip\n"
+msgstr "Brug ESC for at springe over\n"
+
+msgid ""
+"\n"
+" Choose an object from the list, and select one of the available actions for it to execute"
+msgstr ""
+"\n"
+" Vælg et objekt fra listen, og vælg en af de tilgængelige handlinger der skal udføres"
+
+msgid "Cancel"
+msgstr "Annuller"
+
+msgid "Confirm and exit"
+msgstr "Bekræft og afslut"
+
+msgid "Add"
+msgstr "Tilføj"
+
+msgid "Copy"
+msgstr "Kopiér"
+
+msgid "Edit"
+msgstr "Redigér"
+
+msgid "Delete"
+msgstr "Slet"
+
+msgid "Select an action for '{}'"
+msgstr "Vælg en handling for '{}'"
+
+msgid "Copy to new key:"
+msgstr "Kopiér til ny nøgle:"
+
+msgid "Unknown nic type: {}. Possible values are {}"
+msgstr "Ukendt NIC-type: {}. Mulige værdier er {}"
+
+msgid ""
+"\n"
+"This is your chosen configuration:"
+msgstr ""
+"\n"
+"Dette er din valgte konfiguration:"
+
+msgid "Pacman is already running, waiting maximum 10 minutes for it to terminate."
+msgstr "Pacman kører allerede. Venter højst 10 minutter på at den afsluttes."
+
+msgid "Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall."
+msgstr "En eksisterende pacman-lås blev aldrig afsluttet. Ryd op i eventuelle eksisterende pacman-sessioner før du bruger archinstall."
+
+msgid "Choose which optional additional repositories to enable"
+msgstr "Vælg hvilke valgfrie ekstra pakkearkiver der skal aktiveres"
+
+msgid "Add a user"
+msgstr "Tilføj en bruger"
+
+msgid "Change password"
+msgstr "Skift adgangskode"
+
+msgid "Promote/Demote user"
+msgstr "Forfrem/degrader bruger"
+
+msgid "Delete User"
+msgstr "Slet bruger"
+
+msgid ""
+"\n"
+"Define a new user\n"
+msgstr ""
+"\n"
+"Definér en ny bruger\n"
+
+msgid "User Name : "
+msgstr "Brugernavn: "
+
+msgid "Should {} be a superuser (sudoer)?"
+msgstr "Skal {} være superbruger (sudoer)?"
+
+msgid "Define users with sudo privilege: "
+msgstr "Definér brugere med sudo-rettigheder: "
+
+msgid "No network configuration"
+msgstr "Ingen netværkskonfiguration"
+
+msgid "Set desired subvolumes on a btrfs partition"
+msgstr "Set desired underenheds on en btrfs partition"
+
+msgid ""
+"{}\n"
+"\n"
+"Select which partition to set subvolumes on"
+msgstr ""
+"{}\n"
+"\n"
+"Vælg hvilken partition der skal set underenheds on"
+
+msgid "Manage btrfs subvolumes for current partition"
+msgstr "Administrér btrfs-underenheder for den aktuelle partition"
+
+msgid "No configuration"
+msgstr "Ingen konfiguration"
+
+msgid "Save user configuration"
+msgstr "Gem brugerkonfiguration"
+
+msgid "Save user credentials"
+msgstr "Gem brugerlegitimationsoplysninger"
+
+msgid "Save disk layout"
+msgstr "Gem disklayout"
+
+msgid "Save all"
+msgstr "Gem alt"
+
+msgid "Choose which configuration to save"
+msgstr "Vælg hvilken konfiguration der skal gemmes"
+
+msgid "Enter a directory for the configuration(s) to be saved: "
+msgstr "Indtast en mappe hvor konfigurationen/konfigurationerne skal gemmes: "
+
+msgid "Not a valid directory: {}"
+msgstr "Ikke en gyldig mappe: {}"
+
+msgid "The password you are using seems to be weak,"
+msgstr "Adgangskoden du bruger ser ud til at være svag,"
+
+msgid "are you sure you want to use it?"
+msgstr "er du sikker på at du vil bruge den?"
+
+msgid "Optional repositories"
+msgstr "Valgfrie pakkearkiver"
+
+msgid "Save configuration"
+msgstr "Gem konfiguration"
+
+msgid "Missing configurations:\n"
+msgstr "Manglende konfigurationer:\n"
+
+msgid "Either root-password or at least 1 superuser must be specified"
+msgstr "Enten root-adgangskode eller mindst 1 superbruger skal angives"
+
+msgid "Manage superuser accounts: "
+msgstr "Administrér superbrugerkonti: "
+
+msgid "Manage ordinary user accounts: "
+msgstr "Administrér almindelige brugerkonti: "
+
+msgid " Subvolume :{:16}"
+msgstr " Underenhed :{:16}"
+
+msgid " mounted at {:16}"
+msgstr " montereed at {:16}"
+
+msgid " with option {}"
+msgstr " med mulighed {}"
+
+msgid ""
+"\n"
+" Fill the desired values for a new subvolume \n"
+msgstr ""
+"\n"
+" Udfyld de ønskede værdier for en ny underenhed \n"
+
+msgid "Subvolume name "
+msgstr "Subvolume navn "
+
+msgid "Subvolume mountpoint"
+msgstr "Subvolume monteringspunkt"
+
+msgid "Subvolume options"
+msgstr "Subvolume muligheds"
+
+msgid "Save"
+msgstr "Gem"
+
+msgid "Subvolume name :"
+msgstr "Subvolume navn :"
+
+msgid "Select a mount point :"
+msgstr "Vælg en montere point :"
+
+msgid "Select the desired subvolume options "
+msgstr "Vælg desired underenhed muligheds "
+
+msgid "Define users with sudo privilege, by username: "
+msgstr "Define brugers med sudo privilege, by brugernavn: "
+
+#, python-brace-format
+msgid "[!] A log file has been created here: {}"
+msgstr "[!] A log fil has been created here: {}"
+
+msgid "Would you like to use BTRFS subvolumes with a default structure?"
+msgstr "Vil du bruge BTRFS-underenheder med en standardstruktur?"
+
+msgid "Would you like to use BTRFS compression?"
+msgstr "Vil du bruge BTRFS-komprimering?"
+
+msgid "Would you like to create a separate partition for /home?"
+msgstr "Vil du oprette en separat partition til /home?"
+
+msgid "The selected drives do not have the minimum capacity required for an automatic suggestion\n"
+msgstr "De valgte drev har ikke den minimumskapacitet der kræves for et automatisk forslag\n"
+
+msgid "Minimum capacity for /home partition: {}GB\n"
+msgstr "Minimumskapacitet for /home-partition: {} GB\n"
+
+msgid "Minimum capacity for Arch Linux partition: {}GB"
+msgstr "Minimumskapacitet for Arch Linux-partition: {} GB"
+
+msgid "Continue"
+msgstr "Fortsæt"
+
+msgid "yes"
+msgstr "ja"
+
+msgid "no"
+msgstr "nej"
+
+msgid "set: {}"
+msgstr "angivet: {}"
+
+msgid "Manual configuration setting must be a list"
+msgstr "Manuel konfigurationsindstilling skal være en liste"
+
+msgid "No iface specified for manual configuration"
+msgstr "Ingen grænseflade angivet til manuel konfiguration"
+
+msgid "Manual nic configuration with no auto DHCP requires an IP address"
+msgstr "Manuel NIC-konfiguration uden automatisk DHCP kræver en IP-adresse"
+
+msgid "Add interface"
+msgstr "Tilføj grænseflade"
+
+msgid "Edit interface"
+msgstr "Redigér grænseflade"
+
+msgid "Delete interface"
+msgstr "Slet grænseflade"
+
+msgid "Select interface to add"
+msgstr "Vælg grænseflade der skal tilføjes"
+
+msgid "Manual configuration"
+msgstr "Manuel konfiguration"
+
+msgid "Mark/Unmark a partition as compressed (btrfs only)"
+msgstr "Markér/fjern markering en partition som komprimeret (btrfs only)"
+
+msgid "The password you are using seems to be weak, are you sure you want to use it?"
+msgstr "Adgangskoden du bruger ser ud til at være svag. Er du sikker på at du vil bruge den?"
+
+msgid "Provides a selection of desktop environments and tiling window managers, e.g. gnome, kde, sway"
+msgstr "Giver et udvalg af skrivebordsmiljøer og flisebaserede vindueshåndterere, f.eks. gnome, kde, sway"
+
+msgid "Select your desired desktop environment"
+msgstr "Vælg dit ønskede skrivebordsmiljø"
+
+msgid "A very basic installation that allows you to customize Arch Linux as you see fit."
+msgstr "En meget grundlæggende installation, der lader dig tilpasse Arch Linux som du ønsker."
+
+msgid "Provides a selection of various server packages to install and enable, e.g. httpd, nginx, mariadb"
+msgstr "Giver et udvalg af forskellige serverpakker der kan installeres og aktiveres, f.eks. httpd, nginx, mariadb"
+
+msgid "Choose which servers to install, if none then a minimal installation will be done"
+msgstr "Vælg hvilke servere der skal installeres. Hvis ingen vælges, udføres en minimal installation"
+
+msgid "Installs a minimal system as well as xorg and graphics drivers."
+msgstr "Installerer et minimalt system samt xorg og grafikdrivere."
+
+msgid "Press Enter to continue."
+msgstr "Tryk Enter for at fortsætte."
+
+msgid "Would you like to chroot into the newly created installation and perform post-installation configuration?"
+msgstr "Vil du chroote ind i den nyoprettede installation og udføre efterkonfiguration?"
+
+msgid "Are you sure you want to reset this setting?"
+msgstr "Er du sikker på at du vil nulstille denne indstilling?"
+
+msgid "Select one or more hard drives to use and configure\n"
+msgstr "Vælg en eller flere harddiske der skal bruges og konfigureres\n"
+
+msgid "Any modifications to the existing setting will reset the disk layout!"
+msgstr "Enhver ændring af den eksisterende indstilling vil nulstille disklayoutet!"
+
+msgid "If you reset the harddrive selection this will also reset the current disk layout. Are you sure?"
+msgstr "Hvis du nulstiller harddiskvalget, nulstilles det nuværende disklayout også. Er du sikker?"
+
+msgid "Save and exit"
+msgstr "Gem og afslut"
+
+msgid ""
+"{}\n"
+"contains queued partitions, this will remove those, are you sure?"
+msgstr ""
+"{}\n"
+"indeholder planlagte partitioner. Dette vil fjerne dem. Er du sikker?"
+
+msgid "No audio server"
+msgstr "Ingen lydserver"
+
+msgid "(default)"
+msgstr "(standard)"
+
+msgid "Use ESC to skip"
+msgstr "Brug ESC for at springe over"
+
+msgid ""
+"Use CTRL+C to reset current selection\n"
+"\n"
+msgstr ""
+"Brug CTRL+C for at nulstille det aktuelle valg\n"
+"\n"
+
+msgid "Copy to: "
+msgstr "Kopiér til: "
+
+msgid "Edit: "
+msgstr "Redigér: "
+
+msgid "Key: "
+msgstr "Nøgle: "
+
+msgid "Edit {}: "
+msgstr "Redigér {}: "
+
+msgid "Add: "
+msgstr "Tilføj: "
+
+msgid "Value: "
+msgstr "Værdi: "
+
+msgid "You can skip selecting a drive and partitioning and use whatever drive-setup is mounted at /mnt (experimental)"
+msgstr "You can springe over selecting en drev og partitioning og use whatever drev-setup is montereed at /mnt (experimental)"
+
+msgid "Select one of the disks or skip and use /mnt as default"
+msgstr "Vælg en af diskene, eller spring over og brug /mnt som standard"
+
+msgid "Select which partitions to mark for formatting:"
+msgstr "Vælg hvilke partitioner der skal markeres til formatering:"
+
+msgid "Use HSM to unlock encrypted drive"
+msgstr "Brug HSM til at låse krypteret drev op"
+
+msgid "Device"
+msgstr "Enhed"
+
+msgid "Size"
+msgstr "Størrelse"
+
+msgid "Free space"
+msgstr "Ledig plads"
+
+msgid "Bus-type"
+msgstr "Bustype"
+
+msgid "Either root-password or at least 1 user with sudo privileges must be specified"
+msgstr "Enten root-adgangskode eller mindst 1 bruger med sudo-rettigheder skal angives"
+
+msgid "Enter username (leave blank to skip): "
+msgstr "Indtast brugernavn (lad feltet være tomt for at springe over): "
+
+msgid "The username you entered is invalid. Try again"
+msgstr "The brugernavn you entered is ingyldig. Try again"
+
+msgid "Should \"{}\" be a superuser (sudo)?"
+msgstr "Skal \"{}\" være superbruger (sudo)?"
+
+msgid "Select which partitions to encrypt"
+msgstr "Vælg hvilke partitioner der skal krypteres"
+
+msgid "very weak"
+msgstr "meget svag"
+
+msgid "weak"
+msgstr "svag"
+
+msgid "moderate"
+msgstr "moderat"
+
+msgid "strong"
+msgstr "stærk"
+
+msgid "Add subvolume"
+msgstr "Tilføj underenhed"
+
+msgid "Edit subvolume"
+msgstr "Redigér underenhed"
+
+msgid "Delete subvolume"
+msgstr "Slet underenhed"
+
+msgid "Configured {} interfaces"
+msgstr "Configured {} grænseflades"
+
+msgid "This option enables the number of parallel downloads that can occur during installation"
+msgstr "Denne indstilling aktiverer antallet af parallelle downloads under installationen"
+
+msgid ""
+"Enter the number of parallel downloads to be enabled.\n"
+" (Enter a value between 1 to {})\n"
+"Note:"
+msgstr ""
+"Indtast antallet af parallelle downloads der skal aktiveres.\n"
+" (Indtast en værdi mellem 1 og {})\n"
+"Bemærk:"
+
+msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {} downloads at a time )"
+msgstr " - Maksimumsværdi : {} (tillader {} parallelle downloads, {} downloads ad gangen)"
+
+msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a time )"
+msgstr " - Minimumsværdi : 1 (tillader 1 parallel download, 2 downloads ad gangen)"
+
+msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )"
+msgstr " - Deaktiver/standard : 0 (deaktiverer parallel download og tillader kun 1 download ad gangen)"
+
+#, python-brace-format
+msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]"
+msgstr "Ugyldigt input! Prøv igen med et gyldigt input [1 til {max_downloads}, eller 0 for at deaktivere]"
+
+msgid "Parallel Downloads"
+msgstr "Parallelle downloads"
+
+msgid "Pacman"
+msgstr "Pacman"
+
+msgid "Color"
+msgstr "Farve"
+
+#, python-brace-format
+msgid "Enter the number of parallel downloads (1-{})"
+msgstr "Indtast antallet af parallelle downloads (1-{})"
+
+msgid "Enable colored output for pacman"
+msgstr "Aktivér farvet output for pacman"
+
+msgid "ESC to skip"
+msgstr "ESC for at springe over"
+
+msgid "CTRL+C to reset"
+msgstr "CTRL+C for at nulstille"
+
+msgid "TAB to select"
+msgstr "TAB for at vælge"
+
+msgid "[Default value: 0] > "
+msgstr "[Standard værdi: 0] > "
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr "For at kunne bruge denne oversættelse skal du manuelt installere en skrifttype der understøtter sproget."
+
+msgid "The font should be stored as {}"
+msgstr "Skrifttypen skal gemmes som {}"
+
+msgid "Archinstall requires root privileges to run. See --help for more."
+msgstr "Archinstall kræver root-rettigheder for at køre. Se --help for mere information."
+
+msgid "Select an execution mode"
+msgstr "Vælg en execution tilstand"
+
+#, python-brace-format
+msgid "Unable to fetch profile from specified url: {}"
+msgstr "Kan ikke hente profil fra den angivne URL: {}"
+
+#, python-brace-format
+msgid "Profiles must have unique name, but profile definitions with duplicate name found: {}"
+msgstr "Profils must have unique navn, but profil definitions med duplicate navn found: {}"
+
+msgid "Select one or more devices to use and configure"
+msgstr "Vælg en eller flere enheder der skal bruges og konfigureres"
+
+msgid "If you reset the device selection this will also reset the current disk layout. Are you sure?"
+msgstr "Hvis du nulstiller enhedsvalget, nulstilles det aktuelle disklayout også. Er du sikker?"
+
+msgid "Existing Partitions"
+msgstr "Existing Partitioner"
+
+msgid "Select a partitioning option"
+msgstr "Vælg en partitioning mulighed"
+
+msgid "Enter the root directory of the mounted devices: "
+msgstr "Indtast root-mappen for de monterede enheder: "
+
+#, python-brace-format
+msgid "Minimum capacity for /home partition: {}GiB\n"
+msgstr "Minimumskapacitet for /home-partition: {} GiB\n"
+
+#, python-brace-format
+msgid "Minimum capacity for Arch Linux partition: {}GiB"
+msgstr "Minimumskapacitet for Arch Linux-partition: {} GiB"
+
+msgid "This is a list of pre-programmed profiles_bck, they might make it easier to install things like desktop environments"
+msgstr "Dette er en liste over forudprogrammerede profiles_bck, som kan gøre det lettere at installere ting som skrivebordsmiljøer"
+
+msgid "Current profile selection"
+msgstr "Nuværende profil selection"
+
+msgid "Remove all newly added partitions"
+msgstr "Remove all newly tilføjed partitioner"
+
+msgid "Assign mountpoint"
+msgstr "Assign monteringspunkt"
+
+msgid "Mark/Unmark to be formatted (wipes data)"
+msgstr "Markér/fjern markering skal være fellermateret (wipes data)"
+
+msgid "Mark/Unmark as bootable"
+msgstr "Markér/fjern markering som bootbar"
+
+msgid "Change filesystem"
+msgstr "Ændr filsystem"
+
+msgid "Mark/Unmark as compressed"
+msgstr "Markér/fjern markering som komprimeret"
+
+msgid "Set subvolumes"
+msgstr "Set underenheds"
+
+msgid "Delete partition"
+msgstr "Slet partition"
+
+msgid "Partition"
+msgstr "Partition"
+
+msgid "This partition is currently encrypted, to format it a filesystem has to be specified"
+msgstr "Denne partition er i øjeblikket krypteret. For at formatere den skal der angives et filsystem."
+
+msgid "Partition mount-points are relative to inside the installation, the boot would be /boot as an example."
+msgstr "Partitionens monteringspunkter er relative inde i installationen; boot vil f.eks. være /boot."
+
+msgid "If mountpoint /boot is set, then the partition will also be marked as bootable."
+msgstr "Hvis monteringspunktet /boot angives, markeres partitionen også som bootbar."
+
+msgid "Mountpoint: "
+msgstr "Monteringspunkt: "
+
+msgid "Current free sectors on device {}:"
+msgstr "Nuværende free sectellers on enhed {}:"
+
+msgid "Total sectors: {}"
+msgstr "Total sectellers: {}"
+
+msgid "Enter the start sector (default: {}): "
+msgstr "Indtast start secteller (standard: {}): "
+
+msgid "Enter the end sector of the partition (percentage or block number, default: {}): "
+msgstr "Indtast partitionens slutsektor (procent eller bloknummer, standard: {}): "
+
+msgid "This will remove all newly added partitions, continue?"
+msgstr "Dette vil fjerne alle nyligt tilføjede partitioner. Fortsæt?"
+
+#, python-brace-format
+msgid "Partition management: {}"
+msgstr "Partitionshåndtering: {}"
+
+#, python-brace-format
+msgid "Total length: {}"
+msgstr "Samlet længde: {}"
+
+msgid "Encryption type"
+msgstr "Krypteringstype"
+
+msgid "Iteration time"
+msgstr "Iterationstid"
+
+msgid "Enter iteration time for LUKS encryption (in milliseconds)"
+msgstr "Indtast iterationstid for LUKS-kryptering (i millisekunder)"
+
+msgid "Higher values increase security but slow down boot time"
+msgstr "Higher værdis increase security but slow down boot time"
+
+msgid "Default: 10000ms, Recommended range: 1000-60000"
+msgstr "Standard: 10000 ms, anbefalet område: 1000-60000"
+
+msgid "Iteration time cannot be empty"
+msgstr "Iterationstid må ikke være tom"
+
+msgid "Iteration time must be at least 100ms"
+msgstr "Iterationstid skal være mindst 100 ms"
+
+msgid "Iteration time must be at most 120000ms"
+msgstr "Iterationstid må højst være 120000 ms"
+
+msgid "Please enter a valid number"
+msgstr "Indtast venligst et gyldigt tal"
+
+msgid "Partitions"
+msgstr "Partitioner"
+
+msgid "No HSM devices available"
+msgstr "No HSM enheds available"
+
+msgid "Partitions to be encrypted"
+msgstr "Partitioner skal være krypteret"
+
+msgid "Select disk encryption option"
+msgstr "Vælg disk kryptering mulighed"
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr "Vælg en FIDO2-enhed der skal bruges til HSM"
+
+msgid "Use a best-effort default partition layout"
+msgstr "Use en best-effellert standard partition layout"
+
+msgid "Manual Partitioning"
+msgstr "Manuel partitionering"
+
+msgid "Pre-mounted configuration"
+msgstr "Pre-montereed konfiguration"
+
+msgid "Unknown"
+msgstr "Ukendt"
+
+msgid "Partition encryption"
+msgstr "Partition kryptering"
+
+#, python-brace-format
+msgid " ! Formatting {} in "
+msgstr " ! Fellermatting {} in "
+
+#, fuzzy
+msgid "← Back"
+msgstr " Tilbage"
+
+msgid "Disk encryption"
+msgstr "Disk kryptering"
+
+msgid "Configuration"
+msgstr "Konfiguration"
+
+msgid "Password"
+msgstr "Adgangskode"
+
+msgid "All settings will be reset, are you sure?"
+msgstr "Alle indstillinger nulstilles. Er du sikker?"
+
+msgid "Back"
+msgstr "Tilbage"
+
+msgid "Please chose which greeter to install for the chosen profiles: {}"
+msgstr "Vælg hvilken login-skærm der skal installeres for de valgte profiler: {}"
+
+#, python-brace-format
+msgid "Environment type: {}"
+msgstr "Miljøtype: {}"
+
+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 "Den proprietære Nvidia-driver understøttes ikke af Sway. Du vil sandsynligvis støde på problemer. Er det i orden?"
+
+msgid "Installed packages"
+msgstr "Installered pakker"
+
+msgid "Add profile"
+msgstr "Tilføj profil"
+
+msgid "Edit profile"
+msgstr "Redigér profil"
+
+msgid "Delete profile"
+msgstr "Slet profil"
+
+msgid "Profile name: "
+msgstr "Profil navn: "
+
+msgid "The profile name you entered is already in use. Try again"
+msgstr "The profil navn you entered is already in use. Try again"
+
+msgid "Packages to be install with this profile (space separated, leave blank to skip): "
+msgstr "Pakker der skal installeres med denne profil (adskilt med mellemrum, lad feltet være tomt for at springe over): "
+
+msgid "Services to be enabled with this profile (space separated, leave blank to skip): "
+msgstr "Tjenester der skal aktiveres med denne profil (adskilt med mellemrum, lad feltet være tomt for at springe over): "
+
+msgid "Should this profile be enabled for installation?"
+msgstr "Skal denne profil aktiveres til installation?"
+
+msgid "Create your own"
+msgstr "Opret din egen"
+
+msgid ""
+"\n"
+"Select a graphics driver or leave blank to install all open-source drivers"
+msgstr ""
+"\n"
+"Vælg en grafikdriver, eller lad feltet være tomt for at installere alle open source-drivere"
+
+msgid "Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
+msgstr "Sway skal have adgang til dit seat (samling af hardwareenheder, dvs. tastatur, mus osv.)"
+
+msgid ""
+"\n"
+"\n"
+"Choose an option to give Sway access to your hardware"
+msgstr ""
+"\n"
+"\n"
+"Vælg en mulighed for at give Sway adgang til din hardware"
+
+msgid "Graphics driver"
+msgstr "Grafikdriver"
+
+msgid "Greeter"
+msgstr "Login-skærm"
+
+msgid "Please chose which greeter to install"
+msgstr "Vælg hvilken login-skærm der skal installeres"
+
+msgid "This is a list of pre-programmed default_profiles"
+msgstr "Dette er en liste over forudprogrammerede default_profiles"
+
+msgid "Disk configuration"
+msgstr "Diskkonfiguration"
+
+msgid "Profiles"
+msgstr "Profiler"
+
+msgid "Finding possible directories to save configuration files ..."
+msgstr "Finder mulige mapper til at gemme konfigurationsfiler ..."
+
+msgid "Select directory (or directories) for saving configuration files"
+msgstr "Vælg mappe (eller mapper) til lagring af konfigurationsfiler"
+
+msgid "Add a custom mirror"
+msgstr "Tilføj en brugerdefineret spejl"
+
+msgid "Change custom mirror"
+msgstr "Ændr brugerdefineret spejl"
+
+msgid "Delete custom mirror"
+msgstr "Slet brugerdefineret spejl"
+
+msgid "Enter name (leave blank to skip): "
+msgstr "Indtast navn (lad feltet være tomt for at springe over): "
+
+msgid "Enter url (leave blank to skip): "
+msgstr "Indtast URL (lad feltet være tomt for at springe over): "
+
+msgid "Select signature check option"
+msgstr "Vælg signatur kontrol mulighed"
+
+msgid "Select signature option"
+msgstr "Vælg signatur mulighed"
+
+msgid "Custom mirrors"
+msgstr "Brugerdefinerede spejle"
+
+msgid "Defined"
+msgstr "Defineret"
+
+msgid "Save user configuration (including disk layout)"
+msgstr "Gem bruger konfiguration (including disk layout)"
+
+msgid ""
+"Enter a directory for the configuration(s) to be saved (tab completion enabled)\n"
+"Save directory: "
+msgstr ""
+"Indtast en mappe hvor konfigurationen/konfigurationerne skal gemmes (tab-fuldførelse aktiveret)\n"
+"Gemmemappe: "
+
+msgid ""
+"Do you want to save {} configuration file(s) in the following location?\n"
+"\n"
+"{}"
+msgstr ""
+"Vil du gemme {} konfigurationsfil(er) på følgende placering?\n"
+"\n"
+"{}"
+
+msgid "Saving {} configuration files to {}"
+msgstr "Gemmer {} konfigurationsfiler til {}"
+
+msgid "Mirrors"
+msgstr "Spejle"
+
+msgid "Mirror regions"
+msgstr "Mirreller regioner"
+
+msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {max_downloads+1} downloads at a time )"
+msgstr " - Maksimumsværdi : {} (tillader {} parallelle downloads, {max_downloads+1} downloads ad gangen)"
+
+msgid "Invalid input! Try again with a valid input [1 to {}, or 0 to disable]"
+msgstr "Ugyldigt input! Prøv igen med et gyldigt input [1 til {}, eller 0 for at deaktivere]"
+
+msgid "Locales"
+msgstr "Lokaliseringer"
+
+msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)"
+msgstr "Brug NetworkManager (nødvendigt for at konfigurere internet grafisk i GNOME og KDE)"
+
+msgid "Total: {} / {}"
+msgstr "I alt: {} / {}"
+
+msgid "All entered values can be suffixed with a unit: B, KB, KiB, MB, MiB..."
+msgstr "Alle indtastede værdier kan afsluttes med en enhed: B, KB, KiB, MB, MiB..."
+
+msgid "If no unit is provided, the value is interpreted as sectors"
+msgstr "If no unit is provided, værdi is interpreted som sectellers"
+
+msgid "Enter start (default: sector {}): "
+msgstr "Indtast start (standard: secteller {}): "
+
+msgid "Enter end (default: {}): "
+msgstr "Indtast end (standard: {}): "
+
+msgid "Unable to determine fido2 devices. Is libfido2 installed?"
+msgstr "Kan ikke registrere fido2-enheder. Er libfido2 installeret?"
+
+msgid "Path"
+msgstr "Sti"
+
+msgid "Manufacturer"
+msgstr "Producent"
+
+msgid "Product"
+msgstr "Produkt"
+
+#, python-brace-format
+msgid "Invalid configuration: {error}"
+msgstr "Ugyldig konfiguration: {error}"
+
+msgid "Ready to install"
+msgstr "Klar til installation"
+
+msgid "Disks"
+msgstr "Diske"
+
+msgid "Packages"
+msgstr "Pakker"
+
+msgid "Network"
+msgstr "Netværk"
+
+msgid "Locale"
+msgstr "Lokalisering"
+
+msgid "Type"
+msgstr "Type"
+
+msgid "This option enables the number of parallel downloads that can occur during package downloads"
+msgstr "Denne indstilling aktiverer antallet af parallelle downloads under pakkehentning"
+
+msgid ""
+"Enter the number of parallel downloads to be enabled.\n"
+"\n"
+"Note:\n"
+msgstr ""
+"Indtast antallet af parallelle downloads der skal aktiveres.\n"
+"\n"
+"Bemærk:\n"
+
+#, python-brace-format
+msgid " - Maximum recommended value : {} ( Allows {} parallel downloads at a time )"
+msgstr " - Maksimal anbefalet værdi : {} (tillader {} parallelle downloads ad gangen)"
+
+msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )\n"
+msgstr " - Deaktiver/standard : 0 (deaktiverer parallel download og tillader kun 1 download ad gangen)\n"
+
+msgid "Invalid input! Try again with a valid input [or 0 to disable]"
+msgstr "Ugyldigt input! Prøv igen med et gyldigt input [eller 0 for at deaktivere]"
+
+msgid "Hyprland needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
+msgstr "Hyprland skal have adgang til dit seat (samling af hardwareenheder, dvs. tastatur, mus osv.)"
+
+msgid ""
+"\n"
+"\n"
+"Choose an option to give Hyprland access to your hardware"
+msgstr ""
+"\n"
+"\n"
+"Vælg en mulighed for at give Hyprland adgang til din hardware"
+
+msgid "All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..."
+msgstr "Alle indtastede værdier kan afsluttes med en enhed: %, B, KB, KiB, MB, MiB..."
+
+msgid "Would you like to use unified kernel images?"
+msgstr "Vil du use unified kerne images?"
+
+msgid "Unified kernel images"
+msgstr "Unified kerne images"
+
+msgid "Waiting for time sync (timedatectl show) to complete."
+msgstr "Venter på at tidssynkronisering (timedatectl show) bliver fuldført."
+
+msgid "Time syncronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/"
+msgstr "Tidssynkronisering fuldføres ikke. Mens du venter, kan du se dokumentationen for løsninger: https://archinstall.readthedocs.io/"
+
+msgid "Skipping waiting for automatic time sync (this can cause issues if time is out of sync during installation)"
+msgstr "Springer ventetid på automatisk tidssynkronisering over (det kan give problemer, hvis tiden ikke er synkroniseret under installationen)"
+
+msgid "Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete."
+msgstr "Venter på at Arch Linux-nøgleringssynkronisering (archlinux-keyring-wkd-sync) bliver fuldført."
+
+msgid "Selected profiles: "
+msgstr "Vælged profils: "
+
+msgid "Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/"
+msgstr "Tidssynkronisering fuldføres ikke. Mens du venter, kan du se dokumentationen for løsninger: https://archinstall.readthedocs.io/"
+
+msgid "Mark/Unmark as nodatacow"
+msgstr "Markér/fjern markering som nodatacow"
+
+msgid "Would you like to use compression or disable CoW?"
+msgstr "Vil du use komprimering eller deaktivere CoW?"
+
+msgid "Use compression"
+msgstr "Use komprimering"
+
+msgid "Disable Copy-on-Write"
+msgstr "Deaktiver Copy-on-Write"
+
+msgid "Provides a selection of desktop environments and tiling window managers, e.g. GNOME, KDE Plasma, Sway"
+msgstr "Giver et udvalg af skrivebordsmiljøer og flisebaserede vindueshåndterere, f.eks. GNOME, KDE Plasma, Sway"
+
+#, python-brace-format
+msgid "Configuration type: {}"
+msgstr "Konfiguration type: {}"
+
+msgid "LVM configuration type"
+msgstr "LVM konfiguration type"
+
+msgid "LVM disk encryption with more than 2 partitions is currently not supported"
+msgstr "LVM disk kryptering med mellere than 2 partitioner is aktuellely not suppellerted"
+
+msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)"
+msgstr "Brug NetworkManager (nødvendigt for at konfigurere internet grafisk i GNOME og KDE Plasma)"
+
+msgid "Select a LVM option"
+msgstr "Vælg en LVM mulighed"
+
+msgid "Partitioning"
+msgstr "Partitionering"
+
+msgid "Logical Volume Management (LVM)"
+msgstr "Logisk diskenhedshåndtering (LVM)"
+
+msgid "Physical volumes"
+msgstr "Fysiske diskenheder"
+
+msgid "Volumes"
+msgstr "Diskenheder"
+
+msgid "LVM volumes"
+msgstr "LVM-diskenheder"
+
+msgid "LVM volumes to be encrypted"
+msgstr "LVM volumes skal være krypteret"
+
+msgid "Select which LVM volumes to encrypt"
+msgstr "Vælg hvilke LVM-diskenheder der skal krypteres"
+
+msgid "Default layout"
+msgstr "Standard layout"
+
+msgid "No Encryption"
+msgstr "Ingen kryptering"
+
+msgid "LUKS"
+msgstr "LUKS"
+
+msgid "LVM on LUKS"
+msgstr "LVM på LUKS"
+
+msgid "LUKS on LVM"
+msgstr "LUKS på LVM"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nej"
+
+msgid "Archinstall help"
+msgstr "Archinstallere help"
+
+msgid " (default)"
+msgstr " (standard)"
+
+msgid "Press Ctrl+h for help"
+msgstr "Tryk Ctrl+h for hjælp"
+
+msgid "Choose an option to give Sway access to your hardware"
+msgstr "Vælg en mulighed for at give Sway adgang til din hardware"
+
+msgid "Seat access"
+msgstr "Seat-adgang"
+
+msgid "Mountpoint"
+msgstr "Monteringspunkt"
+
+msgid "HSM"
+msgstr "HSM"
+
+msgid "Enter disk encryption password (leave blank for no encryption)"
+msgstr "Indtast adgangskode til diskkryptering (lad feltet være tomt for ingen kryptering)"
+
+msgid "Disk encryption password"
+msgstr "Disk kryptering adgangskode"
+
+msgid "Partition - New"
+msgstr "Partition - ny"
+
+msgid "Filesystem"
+msgstr "Filsystem"
+
+msgid "Invalid size"
+msgstr "Ugyldig størrelse"
+
+msgid "Start (default: sector {}): "
+msgstr "Start (standard: secteller {}): "
+
+msgid "End (default: {}): "
+msgstr "End (standard: {}): "
+
+msgid "Subvolume name"
+msgstr "Subvolume navn"
+
+msgid "Disk configuration type"
+msgstr "Disk konfiguration type"
+
+msgid "Root mount directory"
+msgstr "Root-monteringsmappe"
+
+msgid "Select language"
+msgstr "Vælg sprog"
+
+msgid "Write additional packages to install (space separated, leave blank to skip)"
+msgstr "Skriv yderligere pakker der skal installeres (adskilt med mellemrum, lad feltet være tomt for at springe over)"
+
+msgid "Invalid download number"
+msgstr "Ugyldigt downloadantal"
+
+msgid "Number downloads"
+msgstr "Antal downloads"
+
+msgid "The username you entered is invalid"
+msgstr "The brugernavn you entered is ingyldig"
+
+msgid "Username"
+msgstr "Brugernavn"
+
+#, python-brace-format
+msgid "Should \"{}\" be a superuser (sudo)?\n"
+msgstr "Skal \"{}\" være superbruger (sudo)?\n"
+
+msgid "Interfaces"
+msgstr "Grænseflader"
+
+msgid "You need to enter a valid IP in IP-config mode"
+msgstr "Du skal indtaste en gyldig IP i IP-konfigurationstilstand"
+
+msgid "Modes"
+msgstr "Tilstande"
+
+msgid "IP address"
+msgstr "IP-adresse"
+
+msgid "Enter your gateway (router) IP address (leave blank for none)"
+msgstr "Indtast IP-adressen på din gateway (router) (lad feltet være tomt for ingen)"
+
+msgid "Gateway address"
+msgstr "Gateway-adresse"
+
+msgid "Enter your DNS servers with space separated (leave blank for none)"
+msgstr "Indtast dine DNS-servere adskilt med mellemrum (lad feltet være tomt for ingen)"
+
+msgid "DNS servers"
+msgstr "DNS-servere"
+
+msgid "Configure interfaces"
+msgstr "Configure grænseflades"
+
+msgid "Kernel"
+msgstr "Kerne"
+
+msgid "UEFI is not detected and some options are disabled"
+msgstr "UEFI is not detected og some muligheds are deaktiveret"
+
+msgid "Info"
+msgstr "Info"
+
+msgid "The proprietary Nvidia driver is not supported by Sway."
+msgstr "The proprietary Nvidia drevr is not suppellerted by Sway."
+
+msgid "It is likely that you will run into issues, are you okay with that?"
+msgstr "Du vil sandsynligvis støde på problemer. Er det i orden?"
+
+msgid "Main profile"
+msgstr "Main profil"
+
+msgid "Confirm password"
+msgstr "Confirm adgangskode"
+
+msgid "The confirmation password did not match, please try again"
+msgstr "The confirmation adgangskode did not match, please try again"
+
+msgid "Not a valid directory"
+msgstr "Not en gyldig mappe"
+
+msgid "Would you like to continue?"
+msgstr "Vil du fellertsætte?"
+
+msgid "Directory"
+msgstr "Mappe"
+
+msgid "Enter a directory for the configuration(s) to be saved (tab completion enabled)"
+msgstr "Indtast en mappe hvor konfigurationen/konfigurationerne skal gemmes (tab-fuldførelse aktiveret)"
+
+#, python-brace-format
+msgid "Do you want to save the configuration file(s) to {}?"
+msgstr "Vil du gem konfiguration fil(s) to {}?"
+
+msgid "Enabled"
+msgstr "Aktiveret"
+
+msgid "Disabled"
+msgstr "Deaktiveret"
+
+msgid "Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues"
+msgstr "Indsend venligst denne fejl (og filen) til https://github.com/archlinux/archinstall/issues"
+
+msgid "Mirror name"
+msgstr "Spejlnavn"
+
+msgid "Url"
+msgstr "URL"
+
+msgid "Select signature check"
+msgstr "Vælg signatur kontrol"
+
+msgid "Select execution mode"
+msgstr "Vælg execution tilstand"
+
+msgid "Press ? for help"
+msgstr "Tryk ? for hjælp"
+
+msgid "Choose an option to give Hyprland access to your hardware"
+msgstr "Vælg en mulighed for at give Hyprland adgang til din hardware"
+
+msgid "Additional repositories"
+msgstr "Yderligere pakkearkiver"
+
+msgid "NTP"
+msgstr "NTP"
+
+msgid "Swap on zram"
+msgstr "Swap på zram"
+
+msgid "Name"
+msgstr "Navn"
+
+msgid "Signature check"
+msgstr "Signaturkontrol"
+
+#, python-brace-format
+msgid "Selected free space segment on device {}:"
+msgstr "Vælged ledig plads segment on enhed {}:"
+
+#, python-brace-format
+msgid "Size: {} / {}"
+msgstr "Størrelse: {} / {}"
+
+#, python-brace-format
+msgid "Size (default: {}): "
+msgstr "Størrelse (standard: {}): "
+
+msgid "HSM device"
+msgstr "HSM-enhed"
+
+msgid "Some packages could not be found in the repository"
+msgstr "Nogle pakker kunne ikke findes i pakkearkivet"
+
+msgid "User"
+msgstr "Bruger"
+
+msgid "The specified configuration will be applied"
+msgstr "Den angivne konfiguration vil blive anvendt"
+
+msgid "Wipe"
+msgstr "Slet"
+
+msgid "Mark/Unmark as XBOOTLDR"
+msgstr "Markér/fjern markering som XBOOTLDR"
+
+msgid "Loading packages..."
+msgstr "Indlæser pakker..."
+
+msgid "Select any packages from the below list that should be installed additionally"
+msgstr "Vælg eventuelle pakker fra listen nedenfor som også skal installeres"
+
+msgid "Add a custom repository"
+msgstr "Tilføj en brugerdefineret pakkearkiv"
+
+msgid "Change custom repository"
+msgstr "Ændr brugerdefineret pakkearkiv"
+
+msgid "Delete custom repository"
+msgstr "Slet brugerdefineret pakkearkiv"
+
+msgid "Repository name"
+msgstr "Arkivnavn"
+
+msgid "Add a custom server"
+msgstr "Tilføj en brugerdefineret server"
+
+msgid "Change custom server"
+msgstr "Ændr brugerdefineret server"
+
+msgid "Delete custom server"
+msgstr "Slet brugerdefineret server"
+
+msgid "Server url"
+msgstr "Server-URL"
+
+msgid "Select regions"
+msgstr "Vælg regioner"
+
+msgid "Add custom servers"
+msgstr "Tilføj brugerdefineret servers"
+
+msgid "Add custom repository"
+msgstr "Tilføj brugerdefineret pakkearkiv"
+
+msgid "Loading mirror regions..."
+msgstr "Loading spejl regioner..."
+
+msgid "Mirrors and repositories"
+msgstr "Mirrellers og pakkearkiver"
+
+msgid "Selected mirror regions"
+msgstr "Vælged spejl regioner"
+
+msgid "Custom servers"
+msgstr "Brugerdefinerede servere"
+
+msgid "Custom repositories"
+msgstr "Brugerdefinerede pakkearkiver"
+
+msgid "Only ASCII characters are supported"
+msgstr "Only ASCII characters are suppellerted"
+
+msgid "Show help"
+msgstr "Vis hjælp"
+
+msgid "Exit help"
+msgstr "Afslut hjælp"
+
+msgid "Preview scroll up"
+msgstr "Forhåndsvisning rul op"
+
+msgid "Preview scroll down"
+msgstr "Forhåndsvisning rul ned"
+
+msgid "Move up"
+msgstr "Flyt op"
+
+msgid "Move down"
+msgstr "Flyt ned"
+
+msgid "Move right"
+msgstr "Flyt til højre"
+
+msgid "Move left"
+msgstr "Flyt til venstre"
+
+msgid "Jump to entry"
+msgstr "Hop til post"
+
+msgid "Skip selection (if available)"
+msgstr "Spring over selection (if available)"
+
+msgid "Reset selection (if available)"
+msgstr "Nulstil valg (hvis tilgængeligt)"
+
+msgid "Select on single select"
+msgstr "Vælg on single select"
+
+msgid "Select on multi select"
+msgstr "Vælg on multi select"
+
+msgid "Reset"
+msgstr "Nulstil"
+
+msgid "Skip selection menu"
+msgstr "Spring over selection menu"
+
+msgid "Start search mode"
+msgstr "Start search tilstand"
+
+msgid "Exit search mode"
+msgstr "Exit search tilstand"
+
+msgid "General"
+msgstr "Generelt"
+
+msgid "Navigation"
+msgstr "Navigation"
+
+msgid "Selection"
+msgstr "Valg"
+
+msgid "Search"
+msgstr "Søg"
+
+msgid "Down"
+msgstr "Ned"
+
+msgid "Up"
+msgstr "Op"
+
+msgid "Confirm"
+msgstr "Bekræft"
+
+msgid "Focus right"
+msgstr "Fokus til højre"
+
+msgid "Focus left"
+msgstr "Fokus til venstre"
+
+msgid "Toggle"
+msgstr "Slå til/fra"
+
+msgid "Show/Hide help"
+msgstr "Vis/skjul hjælp"
+
+msgid "Quit"
+msgstr "Afslut"
+
+msgid "First"
+msgstr "Første"
+
+msgid "Last"
+msgstr "Sidste"
+
+msgid "Select"
+msgstr "Vælg"
+
+msgid "Page Up"
+msgstr "Side op"
+
+msgid "Page Down"
+msgstr "Side ned"
+
+msgid "Page up"
+msgstr "Side op"
+
+msgid "Page down"
+msgstr "Side ned"
+
+msgid "Page Left"
+msgstr "Side venstre"
+
+msgid "Page Right"
+msgstr "Side højre"
+
+msgid "Cursor up"
+msgstr "Markør op"
+
+msgid "Cursor down"
+msgstr "Markør ned"
+
+msgid "Cursor right"
+msgstr "Markør højre"
+
+msgid "Cursor left"
+msgstr "Markør venstre"
+
+msgid "Top"
+msgstr "Top"
+
+msgid "Bottom"
+msgstr "Bund"
+
+msgid "Home"
+msgstr "Hjem"
+
+msgid "End"
+msgstr "Slut"
+
+msgid "Toggle option"
+msgstr "Toggle mulighed"
+
+msgid "Scroll Up"
+msgstr "Rul op"
+
+msgid "Scroll Down"
+msgstr "Rul ned"
+
+msgid "Scroll Left"
+msgstr "Rul til venstre"
+
+msgid "Scroll Right"
+msgstr "Rul til højre"
+
+msgid "Scroll Home"
+msgstr "Rul til start"
+
+msgid "Scroll End"
+msgstr "Rul til slut"
+
+msgid "Focus Next"
+msgstr "Fokusér næste"
+
+msgid "Focus Previous"
+msgstr "Fokusér forrige"
+
+msgid "Copy selected text"
+msgstr "Kopiér markeret tekst"
+
+msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
+msgstr "labwc skal have adgang til dit seat (samling af hardwareenheder, dvs. tastatur, mus osv.)"
+
+msgid "Choose an option to give labwc access to your hardware"
+msgstr "Vælg en mulighed for at give labwc adgang til din hardware"
+
+msgid "niri needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
+msgstr "niri skal have adgang til dit seat (samling af hardwareenheder, dvs. tastatur, mus osv.)"
+
+msgid "Choose an option to give niri access to your hardware"
+msgstr "Vælg en mulighed for at give niri adgang til din hardware"
+
+msgid "Mark/Unmark as ESP"
+msgstr "Markér/fjern markering som ESP"
+
+msgid "Package group:"
+msgstr "Pakkegruppe:"
+
+msgid "Exit archinstall"
+msgstr "Afslut archinstall"
+
+msgid "Reboot system"
+msgstr "Genstart systemet"
+
+msgid "chroot into installation for post-installation configurations"
+msgstr "chroot ind i installationen for efterinstallationskonfiguration"
+
+msgid "Installation completed"
+msgstr "Installationen er fuldført"
+
+msgid "What would you like to do next?"
+msgstr "Hvad vil du gøre nu?"
+
+#, python-brace-format
+msgid "Select which mode to configure for \"{}\""
+msgstr "Vælg hvilken tilstand der skal konfigureres for \"{}\""
+
+msgid "Incorrect credentials file decryption password"
+msgstr "Incellerrect credentials fil decryption adgangskode"
+
+msgid "Incorrect password"
+msgstr "Incellerrect adgangskode"
+
+msgid "Credentials file decryption password"
+msgstr "Credentials fil decryption adgangskode"
+
+msgid "Do you want to encrypt the user_credentials.json file?"
+msgstr "Vil du encrypt bruger_credentials.json fil?"
+
+msgid "Credentials file encryption password"
+msgstr "Credentials fil kryptering adgangskode"
+
+#, python-brace-format
+msgid "Repositories: {}"
+msgstr "Repositelleries: {}"
+
+msgid "New version available"
+msgstr "Ny version tilgængelig"
+
+msgid "Passwordless login"
+msgstr "Adgangskodeless login"
+
+msgid "Second factor login"
+msgstr "Second facteller login"
+
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+msgid "Would you like to configure Bluetooth?"
+msgstr "Vil du configure Bluetooth?"
+
+msgid "Print service"
+msgstr "Udskriftstjeneste"
+
+msgid "Would you like to configure the print service?"
+msgstr "Vil du configure udskriftstjeneste?"
+
+msgid "Power management"
+msgstr "Strømstyring"
+
+msgid "Authentication"
+msgstr "Godkendelse"
+
+msgid "Applications"
+msgstr "Programmer"
+
+msgid "U2F login method: "
+msgstr "U2F-loginmetode: "
+
+msgid "Passwordless sudo: "
+msgstr "Adgangskodeless sudo: "
+
+#, python-brace-format
+msgid "Btrfs snapshot type: {}"
+msgstr "Btrfs-snapshot-type: {}"
+
+msgid "Syncing the system..."
+msgstr "Syncing system..."
+
+msgid "Value cannot be empty"
+msgstr "Værdien må ikke være tom"
+
+msgid "Snapshot type"
+msgstr "Snapshot-type"
+
+#, python-brace-format
+msgid "Snapshot type: {}"
+msgstr "Snapshot-type: {}"
+
+msgid "U2F login setup"
+msgstr "Opsætning af U2F-login"
+
+msgid "No U2F devices found"
+msgstr "No U2F enheds found"
+
+msgid "U2F Login Method"
+msgstr "U2F-loginmetode"
+
+msgid "Enable passwordless sudo?"
+msgstr "Enable adgangskodeless sudo?"
+
+#, python-brace-format
+msgid "Setting up U2F device for user: {}"
+msgstr "Sætter U2F-enhed op for bruger: {}"
+
+msgid "You may need to enter the PIN and then touch your U2F device to register it"
+msgstr "Du skal muligvis indtaste PIN-koden og derefter røre ved din U2F-enhed for at registrere den"
+
+msgid "Starting device modifications in "
+msgstr "Starting enhed modifications in "
+
+msgid "No network connection found"
+msgstr "No netværk connection found"
+
+msgid "Would you like to connect to a Wifi?"
+msgstr "Vil du oprette forbindelse til Wi-Fi?"
+
+msgid "No wifi interface found"
+msgstr "No wifi grænseflade found"
+
+msgid "Select wifi network to connect to"
+msgstr "Vælg det Wi-Fi-netværk der skal oprettes forbindelse til"
+
+msgid "Scanning wifi networks..."
+msgstr "Scanning wifi netværks..."
+
+msgid "No wifi networks found"
+msgstr "No wifi netværks found"
+
+msgid "Failed setting up wifi"
+msgstr "Kunne ikke sætte wifi op"
+
+msgid "Enter wifi password"
+msgstr "Indtast wifi adgangskode"
+
+msgid "Ok"
+msgstr "OK"
+
+msgid "Removable"
+msgstr "Flytbar"
+
+msgid "Install to removable location"
+msgstr "Installer til flytbar placering"
+
+msgid "Will install to /EFI/BOOT/ (removable location)"
+msgstr "Installerer til /EFI/BOOT/ (flytbar placering)"
+
+msgid "Will install to standard location with NVRAM entry"
+msgstr "Installerer til standardplacering med NVRAM-post"
+
+msgid "Would you like to install the bootloader to the default removable media search location?"
+msgstr "Vil du installere bootloaderen på standardplaceringen for søgning efter flytbare medier?"
+
+msgid "This installs the bootloader to /EFI/BOOT/BOOTX64.EFI (or similar) which is useful for:"
+msgstr "Dette installerer bootloaderen til /EFI/BOOT/BOOTX64.EFI (eller tilsvarende), hvilket er nyttigt for:"
+
+msgid "USB drives or other portable external media."
+msgstr "USB drevs eller other pellertable external media."
+
+msgid "Systems where you want the disk to be bootable on any computer."
+msgstr "Systems where you want disk skal være bootbar on any computer."
+
+msgid "Firmware that does not properly support NVRAM boot entries."
+msgstr "Firmware der ikke korrekt understøtter NVRAM-bootposter."
+
+msgid "Will install to /EFI/BOOT/ (removable location, safe default)"
+msgstr "Installerer til /EFI/BOOT/ (flytbar placering, sikker standard)"
+
+msgid "Will install to custom location with NVRAM entry"
+msgstr "Installerer til brugerdefineret placering med NVRAM-post"
+
+msgid "Firmware that does not properly support NVRAM boot entries like most MSI motherboards,"
+msgstr "Firmware der ikke korrekt understøtter NVRAM-bootposter, som de fleste MSI-bundkort,"
+
+msgid "most Apple Macs, many laptops..."
+msgstr "de fleste Apple Mac-computere, mange bærbare..."
+
+msgid "Language"
+msgstr "Sprog"
+
+msgid "Compression algorithm"
+msgstr "Komprimeringsalgoritme"
+
+msgid "Only packages such as base, sudo, linux, linux-firmware, efibootmgr and optional profile packages are installed."
+msgstr "Only pakker such som base, sudo, linux, linux-firmware, efibootmgr og mulighedal profil pakker are installereed."
+
+msgid "Select zram compression algorithm:"
+msgstr "Vælg zram komprimering algellerithm:"
+
+msgid "Use Network Manager (default backend)"
+msgstr "Use Netværk Manager (standard backend)"
+
+msgid "Use Network Manager (iwd backend)"
+msgstr "Use Netværk Manager (iwd backend)"
+
+msgid "Firewall"
+msgstr "Firewall"
+
+msgid "Additional fonts"
+msgstr "Yderligere skrifttyper"
+
+msgid "Select font packages to install"
+msgstr "Vælg skrifttypepakker der skal installeres"
+
+msgid "Unicode font coverage for most languages"
+msgstr "Unicode-skrifttypedækning for de fleste sprog"
+
+msgid "color emoji for browsers and apps"
+msgstr "farveemoji til browsere og apps"
+
+msgid "Chinese, Japanese, Korean characters"
+msgstr "Chinese, Japanese, Kellerean characters"
+
+msgid "Select audio configuration"
+msgstr "Vælg lyd konfiguration"
+
+msgid "Enter credentials file decryption password"
+msgstr "Indtast credentials fil decryption adgangskode"
+
+msgid "Enter root password"
+msgstr "Indtast root-adgangskode"
+
+msgid "Select bootloader to install"
+msgstr "Vælg bootloader der skal installeres"
+
+msgid "Configuration preview"
+msgstr "Konfigurationsforhåndsvisning"
+
+msgid "Enter a directory for the configuration(s) to be saved"
+msgstr "Indtast en mappe hvor konfigurationen/konfigurationerne skal gemmes"
+
+msgid "Select encryption type"
+msgstr "Vælg kryptering type"
+
+msgid "Select disks for the installation"
+msgstr "Vælg diske til installationen"
+
+msgid "Enter a mountpoint"
+msgstr "Indtast en monteringspunkt"
+
+#, python-brace-format
+msgid "Enter a size (default: {}): "
+msgstr "Indtast en størrelse (standard: {}): "
+
+msgid "Enter subvolume name"
+msgstr "Indtast underenhed navn"
+
+msgid "Enter subvolume mountpoint"
+msgstr "Indtast underenhed monteringspunkt"
+
+msgid "Select a disk configuration"
+msgstr "Vælg en disk konfiguration"
+
+msgid "Enter root mount directory"
+msgstr "Indtast root montere mappe"
+
+msgid "You will use whatever drive-setup is mounted at the specified directory"
+msgstr "You will use whatever drev-setup is montereed at specified mappe"
+
+msgid "WARNING: Archinstall won't check the suitability of this setup"
+msgstr "ADVARSEL: Archinstall kontrollerer ikke om denne opsætning er egnet"
+
+msgid "Select main filesystem"
+msgstr "Vælg main filsystem"
+
+msgid "Enter a hostname"
+msgstr "Indtast en hostnavn"
+
+msgid "Select timezone"
+msgstr "Vælg timezone"
+
+msgid "Enter the number of parallel downloads to be enabled"
+msgstr "Indtast antallet af parallelle downloads der skal aktiveres"
+
+#, python-brace-format
+msgid "Value must be between 1 and {}"
+msgstr "Værdien skal være mellem 1 og {}"
+
+msgid "Select which kernel(s) to install"
+msgstr "Vælg hvilke kerner der skal installeres"
+
+msgid "Enter a respository name"
+msgstr "Indtast en respositellery navn"
+
+msgid "Enter the repository url"
+msgstr "Indtast pakkearkiv url"
+
+msgid "Enter server url"
+msgstr "Indtast server url"
+
+msgid "Select mirror regions to be enabled"
+msgstr "Vælg spejl regioner skal være aktiveret"
+
+msgid "Select optional repositories to be enabled"
+msgstr "Vælg mulighedal pakkearkiver skal være aktiveret"
+
+msgid "Select an interface"
+msgstr "Vælg en grænseflade"
+
+msgid "Choose network configuration"
+msgstr "Vælg netværk konfiguration"
+
+msgid "Recommended: Network Manager for desktop, Manual for server"
+msgstr "Anbefalet: Network Manager til desktop, manuel til server"
+
+msgid "Warning: no network configuration selected. Network will need to be set up manually on the installed system."
+msgstr "Advarsel: ingen netværkskonfiguration valgt. Netværket skal sættes op manuelt på det installerede system."
+
+msgid "No packages found"
+msgstr "Ingen pakker fundet"
+
+msgid "Select which greeter to install"
+msgstr "Vælg hvilken login-skærm der skal installeres"
+
+msgid "Select a profile type"
+msgstr "Vælg en profil type"
+
+msgid "Enter new password"
+msgstr "Indtast ny adgangskode"
+
+msgid "Enter a username"
+msgstr "Indtast et brugernavn"
+
+msgid "Enter a password"
+msgstr "Indtast en adgangskode"
+
+msgid "The password did not match, please try again"
+msgstr "The adgangskode did not match, please try again"
+
+msgid "Password strength: Weak"
+msgstr "Adgangskodestyrke: Svag"
+
+msgid "Password strength: Moderate"
+msgstr "Adgangskodestyrke: Moderat"
+
+msgid "Password strength: Strong"
+msgstr "Adgangskodestyrke: Stærk"
+
+msgid "The selected desktop profile requires a regular user to log in via the greeter"
+msgstr "Den valgte skrivebordsprofil kræver en almindelig bruger for at logge ind via login-skærmen"
+
+#, python-brace-format
+msgid "Environment type: {} {}"
+msgstr "Miljøtype: {} {}"
+
+msgid "Input cannot be empty"
+msgstr "Input må ikke være tomt"
+
+msgid "Recommended"
+msgstr "Anbefalet"
+
+msgid "Package"
+msgstr "Pakke"
+
+msgid "Curated selection of KDE Plasma packages"
+msgstr "Kurateret udvalg af KDE Plasma-pakker"
+
+msgid "Dependencies"
+msgstr "Afhængigheder"
+
+msgid "Package group"
+msgstr "Pakkegruppe"
+
+msgid "Extensive KDE Plasma installation"
+msgstr "Extensive KDE Plasma installereation"
+
+msgid "Packages in group"
+msgstr "Pakker i gruppen"
+
+msgid "Minimal KDE Plasma installation"
+msgstr "Minimal KDE Plasma installereation"
+
+msgid "Description"
+msgstr "Beskrivelse"
+
+msgid "Select a flavor of KDE Plasma to install"
+msgstr "Vælg hvilken variant af KDE Plasma der skal installeres"
+
+msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
+msgstr "Erstatning for Arial/Times/Courier, kyrillisk understøttelse til Steam/spil"
+
+msgid "wide Unicode coverage, good fallback font"
+msgstr "wide Unicode coverage, good fallback skrifttype"
+
+#, python-brace-format
+msgid "Setting up U2F login: {u2f_config.u2f_login_method.value}"
+msgstr "Sætter U2F-login op: {u2f_config.u2f_login_method.value}"
+
+#, python-brace-format
+msgid "Default: {DEFAULT_ITER_TIME}ms, Recommended range: 1000-60000"
+msgstr "Standard: {DEFAULT_ITER_TIME} ms, anbefalet område: 1000-60000"
diff --git a/archinstall/locales/es/LC_MESSAGES/base.mo b/archinstall/locales/es/LC_MESSAGES/base.mo
index 3c3993f7..5701d454 100644
Binary files a/archinstall/locales/es/LC_MESSAGES/base.mo and b/archinstall/locales/es/LC_MESSAGES/base.mo differ
diff --git a/archinstall/locales/es/LC_MESSAGES/base.po b/archinstall/locales/es/LC_MESSAGES/base.po
index d311804c..d4300a4f 100644
--- a/archinstall/locales/es/LC_MESSAGES/base.po
+++ b/archinstall/locales/es/LC_MESSAGES/base.po
@@ -54,7 +54,7 @@ msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr
msgstr "Solo paquetes como base, base-devel, linux, linux-firmware, efibootmgr y paquetes opcionales de perfil se instalan."
msgid "Note: base-devel is no longer installed by default. Add it here if you need build tools."
-msgstr "Nota: base-devel ya no viene instalado por defecto. Agreguelo aquí si necesita herramientas de build."
+msgstr "Nota: base-devel ya no viene instalado por defecto. Agreguelo aquí si necesita herramientas de compilación."
msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt."
msgstr "Si desea un navegador web, como firefox o chromium, puede especificarlo en el siguiente mensaje."
@@ -173,7 +173,7 @@ msgid "Enter a desired filesystem type for the partition: "
msgstr "Ingrese un tipo de sistema de archivos deseado para la partición: "
msgid "Archinstall language"
-msgstr "Idioma de Archinstall"
+msgstr "Idioma de archinstall"
msgid "Wipe all selected drives and use a best-effort default partition layout"
msgstr "Borrar todas las unidades seleccionadas y usar un diseño de partición predeterminado de mejor esfuerzo"
@@ -197,7 +197,7 @@ msgid "Select one or more hard drives to use and configure"
msgstr "Seleccione uno o más discos duros para usar y configurar"
msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options."
-msgstr "Para obtener la mejor compatibilidad con su hardware AMD, es posible que desee utilizar las opciones de código abierto o AMD / ATI."
+msgstr "Para obtener la mejor compatibilidad con su hardware AMD, es posible que desee utilizar las opciones de código abierto o 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 "Para obtener la mejor compatibilidad con su hardware Intel, es posible que desee utilizar las opciones de código abierto o de Intel.\n"
@@ -218,7 +218,7 @@ msgid "All open-source (default)"
msgstr "Todos de código abierto (predeterminado)"
msgid "Choose which kernels to use or leave blank for default \"{}\""
-msgstr "Elija qué kernel usar o déjelo en blanco para usar el kernel \"{}\" predeterminado"
+msgstr "Elija qué núcleo usar o deje en blanco para usar el núcleo \"{}\" predeterminado"
msgid "Choose which locale language to use"
msgstr "Elija qué idioma local usar"
@@ -382,7 +382,7 @@ msgid "Create a required super-user with sudo privileges: "
msgstr "Crear un super-usuario requerido con privilegios sudo: "
msgid "Enter root password (leave blank to disable root): "
-msgstr "Ingrese la contraseña de root (deje en blanco para deshabilitar root): "
+msgstr "Ingrese la contraseña de root (deje en blanco para desactivar root): "
msgid "Password for user \"{}\": "
msgstr "Contraseña para el usuario “{}”: "
@@ -454,7 +454,7 @@ msgid "Pre-existing pacman lock never exited. Please clean up any existing pacma
msgstr "El bloqueo de pacman preexistente nunca se cerró. Limpie cualquier sesión de pacman existente antes de usar archinstall."
msgid "Choose which optional additional repositories to enable"
-msgstr "Elija qué repositorios adicionales opcionales habilitar"
+msgstr "Elija qué repositorios adicionales opcionales activar"
msgid "Add a user"
msgstr "Añadir un usuario"
@@ -489,7 +489,7 @@ msgid "No network configuration"
msgstr "Sin configuración de red"
msgid "Set desired subvolumes on a btrfs partition"
-msgstr "Establecer los subvolúmenes deseados en una partición btrfs"
+msgstr "Establecer los subvolúmenes deseados en una partición BTRFS"
msgid ""
"{}\n"
@@ -501,7 +501,7 @@ msgstr ""
"Seleccione en qué partición configurar los subvolúmenes"
msgid "Manage btrfs subvolumes for current partition"
-msgstr "Administrar subvolúmenes btrfs para la partición actual"
+msgstr "Administrar subvolúmenes BTRFS para la partición actual"
msgid "No configuration"
msgstr "Sin configuración"
@@ -650,7 +650,7 @@ msgid "Manual configuration"
msgstr "Configuración manual"
msgid "Mark/Unmark a partition as compressed (btrfs only)"
-msgstr "Marcar/Desmarcar una partición como comprimida (solo btrfs)"
+msgstr "Marcar/Desmarcar una partición como comprimida (solo BTRFS)"
msgid "The password you are using seems to be weak, are you sure you want to use it?"
msgstr "La contraseña que está utilizando parece ser débil, ¿está seguro de que desea usarla?"
@@ -665,7 +665,7 @@ msgid "A very basic installation that allows you to customize Arch Linux as you
msgstr "Una instalación muy básica que te permite personalizar Arch Linux como mejor te parezca."
msgid "Provides a selection of various server packages to install and enable, e.g. httpd, nginx, mariadb"
-msgstr "Proporciona una selección de varios paquetes de servidor para instalar y habilitar, p.e. httpd, nginx, mariadb"
+msgstr "Proporciona una selección de varios paquetes de servidor para instalar y activar, p.ej. httpd, nginx, mariadb"
msgid "Choose which servers to install, if none then a minimal installation will be done"
msgstr "Elija qué servidores instalar, si no hay ninguno, se realizará una instalación mínima"
@@ -799,45 +799,45 @@ msgid "Configured {} interfaces"
msgstr "Interfaces {} configuradas"
msgid "This option enables the number of parallel downloads that can occur during installation"
-msgstr "Esta opción habilita la cantidad de descargas paralelas que pueden ocurrir durante la instalación"
+msgstr "Esta opción activa la cantidad de descargas paralelas que pueden ocurrir durante la instalación"
msgid ""
"Enter the number of parallel downloads to be enabled.\n"
" (Enter a value between 1 to {})\n"
"Note:"
msgstr ""
-"Ingrese el número de descargas paralelas que se habilitarán.\n"
+"Ingrese el número de descargas paralelas que se activarán.\n"
" (Ingrese un valor entre 1 y {})\n"
"Nota:"
msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {} downloads at a time )"
-msgstr " - Valor máximo : {} ( Habilita {} descargas paralelas, permite {} descargas simultáneas )"
+msgstr " - Valor máximo : {} (Permitir {} descargas paralelas, permite {} descargas simultáneas)"
msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a time )"
-msgstr " - Valor mínimo : 1 ( Habilita 1 descarga paralela, permite 2 descargas simultáneas )"
+msgstr " - Valor mínimo : 1 (Permitir 1 descarga paralela, permite 2 descargas simultáneas)"
msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )"
-msgstr " - Deshabilitar/Predeterminado : 0 ( Deshabilita la descarga paralela, permite solo 1 descarga simultánea )"
+msgstr " - Desactivar/Predeterminado : 0 (Desactiva la descarga paralela, permite solo 1 descarga simultánea)"
#, python-brace-format
msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]"
-msgstr "¡Entrada no válida! Intente nuevamente con una entrada válida [1 a {max_downloads}, o 0 para deshabilitar]"
+msgstr "¡Entrada no válida! Intente nuevamente con una entrada válida [1 a {max_downloads}, o 0 para desactivar]"
msgid "Parallel Downloads"
msgstr "Descargas paralelas"
msgid "Pacman"
-msgstr ""
+msgstr "Pacman"
msgid "Color"
-msgstr ""
+msgstr "Color"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
-msgstr "Ingrese el número de descargas paralelas que desea habilitar"
+msgstr "Ingrese el número de descargas paralelas (1-{})"
msgid "Enable colored output for pacman"
-msgstr ""
+msgstr "Activa salida a color para pacman"
msgid "ESC to skip"
msgstr "ESC para omitir"
@@ -975,7 +975,7 @@ msgid "Higher values increase security but slow down boot time"
msgstr "Valores más grandes mejoran la seguridad pero aumentan el tiempo de arranque"
msgid "Default: 10000ms, Recommended range: 1000-60000"
-msgstr "Por defecto: 10000ms, Rango recomendado 1000-60000"
+msgstr "Predeterminado: 10000ms, Rango recomendado 1000-60000"
msgid "Iteration time cannot be empty"
msgstr "Tiempo de iteración no puede estar vacío"
@@ -1073,10 +1073,10 @@ msgid "Packages to be install with this profile (space separated, leave blank to
msgstr "Paquetes que se instalarán con este perfil (separados por espacios, déjelo en blanco para omitir): "
msgid "Services to be enabled with this profile (space separated, leave blank to skip): "
-msgstr "Servicios que se habilitarán con este perfil (separados por espacios, deje en blanco para omitir): "
+msgstr "Servicios que se activarán con este perfil (separados por espacios, deje en blanco para omitir): "
msgid "Should this profile be enabled for installation?"
-msgstr "¿Debería habilitarse este perfil para la instalación?"
+msgstr "¿Debería activarse este perfil para la instalación?"
msgid "Create your own"
msgstr "Crear tu propio"
@@ -1158,7 +1158,7 @@ msgid ""
"Enter a directory for the configuration(s) to be saved (tab completion enabled)\n"
"Save directory: "
msgstr ""
-"Ingrese un directorio para guardar las configuraciones (completar con tabulación habilitado)\n"
+"Ingrese un directorio para guardar las configuraciones (completar con tabulación activado)\n"
"Guardar directorio: "
msgid ""
@@ -1180,10 +1180,10 @@ msgid "Mirror regions"
msgstr "Regiones de espejos"
msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {max_downloads+1} downloads at a time )"
-msgstr " - Valor máximo : {} ( Habilita {} descargas paralelas, permite {max_downloads+1} descargas simultáneas )"
+msgstr " - Valor máximo : {} (Permitir {} descargas paralelas, permite {max_downloads+1} descargas simultáneas)"
msgid "Invalid input! Try again with a valid input [1 to {}, or 0 to disable]"
-msgstr "¡Entrada no válida! Intente nuevamente con una entrada válida [1 a {}, o 0 para deshabilitar]"
+msgstr "¡Entrada no válida! Intente nuevamente con una entrada válida [1 a {}, o 0 para desactivar]"
msgid "Locales"
msgstr "Localidades"
@@ -1226,26 +1226,26 @@ msgid "Type"
msgstr "Tipo"
msgid "This option enables the number of parallel downloads that can occur during package downloads"
-msgstr "Esta opción habilita la cantidad de descargas paralelas que pueden ocurrir durante las descargas de paquetes"
+msgstr "Esta opción activa la cantidad de descargas paralelas que pueden ocurrir durante las descargas de paquetes"
msgid ""
"Enter the number of parallel downloads to be enabled.\n"
"\n"
"Note:\n"
msgstr ""
-"Ingrese el número de descargas paralelas que se habilitarán.\n"
+"Ingrese el número de descargas paralelas que se activarán.\n"
"\n"
"Nota:\n"
#, python-brace-format
msgid " - Maximum recommended value : {} ( Allows {} parallel downloads at a time )"
-msgstr " - Valor máximo recomendado : {} ( Permite {} descargas paralelas simultáneas )"
+msgstr " - Valor máximo recomendado : {} (Permite {} descargas paralelas simultáneas)"
msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )\n"
-msgstr " - Deshabilitar/Predeterminado : 0 ( Deshabilita la descarga paralela, permite solo 1 descarga simultánea )\n"
+msgstr " - Desactivar/Predeterminado : 0 (Desactiva la descarga paralela, permite solo 1 descarga simultánea)\n"
msgid "Invalid input! Try again with a valid input [or 0 to disable]"
-msgstr "¡Entrada no válida! Intente nuevamente con una entrada válida [o 0 para deshabilitar]"
+msgstr "¡Entrada no válida! Intente nuevamente con una entrada válida [o 0 para desactivar]"
msgid "Hyprland needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
msgstr "Hyprland necesita acceso a su asiento (colección de dispositivos de hardware, es decir, teclado, mouse, etc.)"
@@ -1263,10 +1263,10 @@ msgid "All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB...
msgstr "Todos los valores introducidos pueden tener como sufijo una unidad: %, B, KB, KiB, MB, MiB..."
msgid "Would you like to use unified kernel images?"
-msgstr "¿Le gustaría utilizar imágenes del kernel unificadas?"
+msgstr "¿Le gustaría utilizar imágenes del núcleo unificadas?"
msgid "Unified kernel images"
-msgstr "Imágenes del kernel unificadas"
+msgstr "Imágenes del núcleo unificadas"
msgid "Waiting for time sync (timedatectl show) to complete."
msgstr "Esperando a que se complete la sincronización de la hora (timedatectl show)."
@@ -1449,7 +1449,7 @@ msgid "Enter your gateway (router) IP address (leave blank for none)"
msgstr "Ingrese la dirección IP de su puerta de enlace (enrutador) (deje en blanco si no hay ninguna)"
msgid "Gateway address"
-msgstr "Dirección de puerta de enlace"
+msgstr "Dirección de la puerta de enlace"
msgid "Enter your DNS servers with space separated (leave blank for none)"
msgstr "Ingrese sus servidores DNS separados por espacios (deje en blanco si no hay ninguno)"
@@ -1464,7 +1464,7 @@ msgid "Kernel"
msgstr "Núcleo"
msgid "UEFI is not detected and some options are disabled"
-msgstr "No se detecta UEFI y algunas opciones están deshabilitadas"
+msgstr "No se detecta UEFI y algunas opciones están desactivadas"
msgid "Info"
msgstr "Info"
@@ -1494,17 +1494,17 @@ msgid "Directory"
msgstr "Directorio"
msgid "Enter a directory for the configuration(s) to be saved (tab completion enabled)"
-msgstr "Ingrese un directorio para guardar las configuraciones (autocompletado de tabulación habilitado)"
+msgstr "Ingrese un directorio para guardar las configuraciones (autocompletado de tabulación activado)"
#, python-brace-format
msgid "Do you want to save the configuration file(s) to {}?"
msgstr "¿Desea guardar los archivos de configuración en {}?"
msgid "Enabled"
-msgstr "Habilitado"
+msgstr "Activado"
msgid "Disabled"
-msgstr "Deshabilitado"
+msgstr "Desactivado"
msgid "Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues"
msgstr "Envíe este problema (y archivo) a https://github.com/archlinux/archinstall/issues"
@@ -1681,137 +1681,121 @@ msgid "Exit search mode"
msgstr "Salir del modo de búsqueda"
msgid "General"
-msgstr ""
+msgstr "General"
-#, fuzzy
msgid "Navigation"
-msgstr "Guardar configuración"
+msgstr "Navegación"
-#, fuzzy
msgid "Selection"
-msgstr "Seleccione regiones"
+msgstr "Selección"
msgid "Search"
-msgstr ""
+msgstr "Buscar"
msgid "Down"
-msgstr ""
+msgstr "Abajo"
msgid "Up"
-msgstr ""
+msgstr "Arriba"
-#, fuzzy
msgid "Confirm"
-msgstr "Confirmar y salir"
+msgstr "Confirmar"
-#, fuzzy
msgid "Focus right"
-msgstr "Mover a la derecha"
+msgstr "Enfocar a la derecha"
-#, fuzzy
msgid "Focus left"
-msgstr "Mover a la izquierda"
+msgstr "Enfocar a la izquierda"
msgid "Toggle"
-msgstr ""
+msgstr "Alternar"
-#, fuzzy
msgid "Show/Hide help"
-msgstr "Mostrar ayuda"
+msgstr "Mostrar/Ocultar ayuda"
msgid "Quit"
-msgstr ""
+msgstr "Salir"
msgid "First"
-msgstr ""
+msgstr "Primero"
msgid "Last"
-msgstr ""
+msgstr "Último"
-#, fuzzy
msgid "Select"
-msgstr "Seleccione regiones"
+msgstr "Seleccionar"
msgid "Page Up"
-msgstr ""
+msgstr "Subir página"
msgid "Page Down"
-msgstr ""
+msgstr "Bajar página"
-#, fuzzy
msgid "Page up"
-msgstr "Grupo de paquetes:"
+msgstr "Subir página"
-#, fuzzy
msgid "Page down"
-msgstr "Bajar"
+msgstr "Bajar página"
msgid "Page Left"
-msgstr ""
+msgstr "Página izquierda"
-#, fuzzy
msgid "Page Right"
-msgstr "Mover a la derecha"
+msgstr "Página derecha"
msgid "Cursor up"
-msgstr ""
+msgstr "Subir"
-#, fuzzy
msgid "Cursor down"
-msgstr "Bajar"
+msgstr "Cursor hacia abajo"
-#, fuzzy
msgid "Cursor right"
-msgstr "Mover a la derecha"
+msgstr "Cursor hacia la derecha"
-#, fuzzy
msgid "Cursor left"
-msgstr "Mover a la izquierda"
+msgstr "Cursor hacia la izquierda"
msgid "Top"
-msgstr ""
+msgstr "Arriba"
msgid "Bottom"
-msgstr ""
+msgstr "Abajo"
msgid "Home"
-msgstr ""
+msgstr "Inicio"
-#, fuzzy
msgid "End"
-msgstr "Habilitado"
+msgstr "Final"
-#, fuzzy
msgid "Toggle option"
-msgstr "Opciones del subvolumen"
+msgstr "Opción de alternancia"
msgid "Scroll Up"
-msgstr ""
+msgstr "Mover Arriba"
-#, fuzzy
msgid "Scroll Down"
-msgstr "Bajar en vista previa"
+msgstr "Deslizar hacia abajo"
msgid "Scroll Left"
-msgstr ""
+msgstr "Mover hacia la izquierda"
msgid "Scroll Right"
-msgstr ""
+msgstr "Mover hacia la derecha"
msgid "Scroll Home"
-msgstr ""
+msgstr "Ir al Inicio"
msgid "Scroll End"
-msgstr ""
+msgstr "Ir al Final"
msgid "Focus Next"
-msgstr ""
+msgstr "Enfocar a la siguiente"
msgid "Focus Previous"
-msgstr ""
+msgstr "Enfocar a la anterior"
msgid "Copy selected text"
-msgstr ""
+msgstr "Copiar texto seleccionado"
msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
msgstr "labwc necesita acceso a su asiento (colección de dispositivos de hardware, es decir, teclado, ratón, etc.)"
@@ -1838,7 +1822,7 @@ msgid "Reboot system"
msgstr "Reiniciar el sistema"
msgid "chroot into installation for post-installation configurations"
-msgstr "chroot en la instalación para configuraciones posteriores a la instalación"
+msgstr "Hacer chroot en la instalación para configuraciones posteriores a la instalación"
msgid "Installation completed"
msgstr "Instalación completada"
@@ -1907,7 +1891,7 @@ msgstr "Sudo sin contraseña: "
#, python-brace-format
msgid "Btrfs snapshot type: {}"
-msgstr "Tipo de snapshot Btrfs: {}"
+msgstr "Tipo de instantánea BTRFS: {}"
msgid "Syncing the system..."
msgstr "Sincronizando el sistema..."
@@ -1932,7 +1916,7 @@ msgid "U2F Login Method"
msgstr "Método de inicio de sesión U2F"
msgid "Enable passwordless sudo?"
-msgstr "Habilitar sudo sin contraseña?"
+msgstr "¿Activar sudo sin contraseña?"
#, python-brace-format
msgid "Setting up U2F device for user: {}"
@@ -1948,25 +1932,25 @@ msgid "No network connection found"
msgstr "No se encontró una conección de red"
msgid "Would you like to connect to a Wifi?"
-msgstr "¿Desea conectarse a Wifi?"
+msgstr "¿Desea conectarse al Wi-Fi?"
msgid "No wifi interface found"
-msgstr "No se encontró ninguna interfaz de wifi"
+msgstr "No se encontró ninguna interfaz Wi-Fi"
msgid "Select wifi network to connect to"
-msgstr "Seleccione una red de wifi para conectarse"
+msgstr "Seleccione una red Wi-Fi para conectarse"
msgid "Scanning wifi networks..."
-msgstr "Buscando redes de wifi..."
+msgstr "Buscando redes Wi-Fi..."
msgid "No wifi networks found"
-msgstr "No se encontró redes de wifi"
+msgstr "No se encontró redes Wi-Fi"
msgid "Failed setting up wifi"
-msgstr "Error configurando wifi"
+msgstr "Error al configurar el Wi-Fi"
msgid "Enter wifi password"
-msgstr "Ingrese contraseña de wifi"
+msgstr "Ingrese la contraseña del Wi-Fi"
msgid "Ok"
msgstr "Ok"
@@ -2017,7 +2001,7 @@ msgid "Compression algorithm"
msgstr "Algoritmo de compresión"
msgid "Only packages such as base, sudo, linux, linux-firmware, efibootmgr and optional profile packages are installed."
-msgstr "Solo paquetes como base, base-devel, linux, linux-firmware, efibootmgr y paquetes opcionales de perfil se instalan."
+msgstr "Solo paquetes como base, sudo, linux, linux-firmware, efibootmgr y paquetes opcionales de perfil se instalan."
msgid "Select zram compression algorithm:"
msgstr "Seleccione algorimto de compresión zram:"
@@ -2031,22 +2015,20 @@ msgstr "Usar gestor de Red (backend iwd)"
msgid "Firewall"
msgstr "Cortafuegos"
-#, fuzzy
msgid "Additional fonts"
-msgstr "Repositorios adicionales"
+msgstr "Fuentes adicionales"
-#, fuzzy
msgid "Select font packages to install"
-msgstr "Seleccione el gestor de arranque que desea instalar"
+msgstr "Seleccione los paquetes de fuentes que desea instalar"
msgid "Unicode font coverage for most languages"
-msgstr ""
+msgstr "Fuente unicode cubierta para la mayoría de idiomas"
msgid "color emoji for browsers and apps"
-msgstr ""
+msgstr "Emoji de colores para navegadores y aplicaciones"
msgid "Chinese, Japanese, Korean characters"
-msgstr ""
+msgstr "Carácteres Chino, Japonés, Koreano"
msgid "Select audio configuration"
msgstr "Seleccionar configuración de audio"
@@ -2107,7 +2089,7 @@ msgid "Select timezone"
msgstr "Seleccione una zona horaria"
msgid "Enter the number of parallel downloads to be enabled"
-msgstr "Ingrese el número de descargas paralelas que desea habilitar"
+msgstr "Ingrese el número de descargas paralelas que desea activar"
#, python-brace-format
msgid "Value must be between 1 and {}"
@@ -2126,10 +2108,10 @@ msgid "Enter server url"
msgstr "Ingrese la URL del servidor"
msgid "Select mirror regions to be enabled"
-msgstr "Seleccione las regiones espejo que se habilitarán"
+msgstr "Seleccione las regiones espejo que se activarán"
msgid "Select optional repositories to be enabled"
-msgstr "Seleccione repositorios opcionales para habilitar"
+msgstr "Seleccione repositorios opcionales para activar"
msgid "Select an interface"
msgstr "Seleccione una interfaz"
@@ -2170,54 +2152,56 @@ msgstr "Seguridad de la contraseña: Fuerte"
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr "El perfil de escritorio seleccionado requiere que un usuario estándar inicie sesión a través de la pantalla de bienvenida"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Environment type: {} {}"
-msgstr "Tipo de entorno: {}"
+msgstr "Tipo de entorno: {} {}"
-#, fuzzy
msgid "Input cannot be empty"
-msgstr "El valor no puede estár vacío"
+msgstr "La entrada no debe estar vacía"
msgid "Recommended"
-msgstr ""
+msgstr "Recomendado"
-#, fuzzy
msgid "Package"
-msgstr "Grupo de paquetes:"
+msgstr "Paquete"
msgid "Curated selection of KDE Plasma packages"
-msgstr ""
+msgstr "Selección curada de paquetes KDE Plasma"
msgid "Dependencies"
-msgstr ""
+msgstr "Dependencias"
-#, fuzzy
msgid "Package group"
-msgstr "Grupo de paquetes:"
+msgstr "Grupo de paquetes"
msgid "Extensive KDE Plasma installation"
-msgstr ""
+msgstr "Instalación KDE Plasma Extensible"
-#, fuzzy
msgid "Packages in group"
-msgstr "Grupo de paquetes:"
+msgstr "Paquetes en grupo"
msgid "Minimal KDE Plasma installation"
-msgstr ""
+msgstr "Instalación minima de KDE Plasma"
-#, fuzzy
msgid "Description"
-msgstr "Cifrado de disco"
+msgstr "Descripción"
-#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
-msgstr "Seleccione el gestor de arranque que desea instalar"
+msgstr "Seleccione una variante de KDE Plasma para instalar"
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
-msgstr ""
+msgstr "Sustitución de Arial/Times/Courier, compatibilidad con caracteres cirílicos para Steam/juegos"
msgid "wide Unicode coverage, good fallback font"
-msgstr ""
+msgstr "Amplia cobertura Unicode, buena fuente de reserva"
+
+#, python-brace-format
+msgid "Setting up U2F login: {u2f_config.u2f_login_method.value}"
+msgstr "Configurando Inicio U2F: {u2f_config.u2f_login_method.value}"
+
+#, python-brace-format
+msgid "Default: {DEFAULT_ITER_TIME}ms, Recommended range: 1000-60000"
+msgstr "Predeterminado: {DEFAULT_ITER_TIME}ms, Rango recomendado: 1000-60000"
#~ msgid "Add :"
#~ msgstr "Añadir :"
diff --git a/archinstall/locales/fi/LC_MESSAGES/base.mo b/archinstall/locales/fi/LC_MESSAGES/base.mo
index f6edf647..287472f9 100644
Binary files a/archinstall/locales/fi/LC_MESSAGES/base.mo and b/archinstall/locales/fi/LC_MESSAGES/base.mo differ
diff --git a/archinstall/locales/fi/LC_MESSAGES/base.po b/archinstall/locales/fi/LC_MESSAGES/base.po
index 7651bb13..31cf6af2 100644
--- a/archinstall/locales/fi/LC_MESSAGES/base.po
+++ b/archinstall/locales/fi/LC_MESSAGES/base.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
-"Last-Translator: Aleksi Puhakainen \n"
+"Last-Translator: Aron R, Github aronmr-1\n"
"Language-Team: \n"
"Language: fi\n"
"MIME-Version: 1.0\n"
@@ -28,10 +28,10 @@ msgid "Would you like to use swap on zram?"
msgstr "Haluatko käyttää swap:ia zram:ssa?"
msgid "Desired hostname for the installation: "
-msgstr "Valitse hostname asennukselle: "
+msgstr "Valitse isäntänimi asennukselle: "
msgid "Username for required superuser with sudo privileges: "
-msgstr "Käyttäjänimi superkäyttäjälle, jolla on sudo-oikeudet: "
+msgstr "Käyttäjänimi pakolliselle superkäyttäjälle, jolla on sudo-oikeudet: "
msgid "Any additional users to install (leave blank for no users): "
msgstr "Muut asennettavat käyttäjät (jätä tyhjäksi, jos ei muita käyttäjiä): "
@@ -55,7 +55,7 @@ msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr
msgstr "Vain paketit, kuten base, base-devel, linux, linux-firmware, efibootmgr ja valinnaiset profiili-paketit, asennetaan."
msgid "Note: base-devel is no longer installed by default. Add it here if you need build tools."
-msgstr ""
+msgstr "Huomio: base-devel ei enään asenneta oletuksena. Lisää se tähän jos tarvitset työkaluja pakettejen rakentamiseen"
msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt."
msgstr "Jos haluat selaimen, kuten firefox tai chromium, voit valita sen seuraavassa kohdassa."
@@ -67,7 +67,7 @@ msgid "Copy ISO network configuration to installation"
msgstr "Kopioi ISO verkkoasetukset asennukseen"
msgid "Use NetworkManager (necessary for configuring internet graphically in GNOME and KDE)"
-msgstr "Käytä NetworkManager ohjelmaa (Internetin graafinen määritys GNOME ja KDE)"
+msgstr "Käytä NetworkManager ohjelmaa (tarvitaan verkon graafiseen määritykseen GNOMEssa ja KDEssa)"
msgid "Select one network interface to configure"
msgstr "Valitse yksi määritettävä verkkoliitäntä"
@@ -83,10 +83,10 @@ msgid "Enter your gateway (router) IP address or leave blank for none: "
msgstr "Anna yhdyskäytävän (reitittimen) IP-osoite tai jätä tyhjäksi: "
msgid "Enter your DNS servers (space separated, blank for none): "
-msgstr "Anna DNS-osoitteet (välilyönti erottaa kaksi osoitetta toisistaan, tyhjä ei mitään): "
+msgstr "Syötä nimipalvelimet (välilyönti erottaa kaksi osoitetta toisistaan, tyhjä ei mitään): "
msgid "Select which filesystem your main partition should use"
-msgstr "Valitse, mitä tiedostojärjestelmä pääosiolle"
+msgstr "Valitse tiedostojärjestelmä pääosiolle"
msgid "Current partition layout"
msgstr "Tämänhetkinen osion asettelu"
@@ -150,7 +150,7 @@ msgid ""
msgstr ""
"{}\n"
"\n"
-"Valitse, mikä osio merkitään salattavaksi"
+"Valitse mikä osio merkitään salattavaksi"
msgid ""
"{}\n"
@@ -159,8 +159,9 @@ msgid ""
msgstr ""
"{}\n"
"\n"
-"Valitse, mikä osio merkitään käynnistyväksi"
+"Valitse mikä osio merkitään käynnistyväksi"
+# unsure
msgid ""
"{}\n"
"\n"
@@ -168,7 +169,7 @@ msgid ""
msgstr ""
"{}\n"
"\n"
-"Valitse, mikä osio merkitään tiedostojärjestelmää varten"
+"Valitse osio johon määrittää tiedostojärjestelmä"
msgid "Enter a desired filesystem type for the partition: "
msgstr "Anna osiolle haluttu tiedostojärjestelmän tyyppi: "
@@ -176,14 +177,17 @@ msgstr "Anna osiolle haluttu tiedostojärjestelmän tyyppi: "
msgid "Archinstall language"
msgstr "Archinstall kieli"
+# unsure
msgid "Wipe all selected drives and use a best-effort default partition layout"
-msgstr "Pyyhi kaikki valitut asemat ja käytä parasta mahdollista oletusosion asettelua"
+msgstr "Pyyhi kaikki valitut asemat ja käytä automaattisen oletusosioinnin asettelua"
+# unsure
msgid "Select what to do with each individual drive (followed by partition usage)"
-msgstr "Valitse, mitä tehdään kullekin yksittäiselle asemalle (ja osion käytölle)"
+msgstr "Valitse mitä tehdään kullekin yksittäiselle asemalle (ja osion käytölle)"
+# unsure
msgid "Select what you wish to do with the selected block devices"
-msgstr "Valitse, mitä haluat tehdä valituilla lohkoilla"
+msgstr "Valitse mitä haluat tehdä valituilla massamuistilaitteilla"
msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments"
msgstr "Tämä on lista valmiista profiileista, jotka saattavat helpottaa esimerkiksi työpöytäympäristön asentamista"
@@ -197,6 +201,7 @@ msgstr "Valitse yksi alueista, joista paketit ladataan"
msgid "Select one or more hard drives to use and configure"
msgstr "Valitse yksi tai useampi kiintolevy käytettäväksi ja määritettäväksi"
+# unsure
msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options."
msgstr "Saat parhaan yhteensopivuuden AMD:n kanssa käyttämällä joko avoimen lähdekoodin vaihtoehtoja tai AMD/ATI valmistajan vaihtoehtoja."
@@ -206,6 +211,7 @@ msgstr "Saat parhaan yhteensopivuuden Intelin kanssa käyttämällä joko avoime
msgid "For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n"
msgstr "Saat parhaan yhteensopivuuden Nvidian kanssa käyttämällä Nvidia valmistajan omaa ohjainta.\n"
+# unsure
msgid ""
"\n"
"\n"
@@ -213,31 +219,32 @@ msgid ""
msgstr ""
"\n"
"\n"
-"Valitse näytönohjaimen ohjain tai jätä tyhjäksi niin kaikki asennetaan avoimen lähdekoodin ohjaimilla"
+"Valitse näytönohjaimen ohjain tai jätä tyhjäksi asentaaksesi ainoastaan avoimen lähdekoodin ajurit"
+# unsure
msgid "All open-source (default)"
-msgstr "Kaikki avoimet lähdekoodit (oletus)"
+msgstr "Kaikki avoimen lähdekoodina (oletus)"
msgid "Choose which kernels to use or leave blank for default \"{}\""
-msgstr "Valitse käytettävät kernelit tai jätä tyhjäksi oletuksena \"{}\""
+msgstr "Valitse käytettävät ytimet (kernels) tai jätä tyhjäksi oletuksena \"{}\""
msgid "Choose which locale language to use"
-msgstr "Valitse käytettävä kieli"
+msgstr "Valitse käytettävä lokaalin (locale) kieli"
msgid "Choose which locale encoding to use"
-msgstr "Valitse käytettävä kielialueen koodaus"
+msgstr "Valitse käytettävä lokaalin merkistö (locale encoding)"
msgid "Select one of the values shown below: "
msgstr "Valitse jokin alla olevista arvoista: "
msgid "Select one or more of the options below: "
-msgstr "Valitse yksi tai useampi alla olevista: "
+msgstr "Valitse yksi tai useampi alla olevista vaihtoehdoista: "
msgid "Adding partition...."
msgstr "Lisätään osiota...."
msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's."
-msgstr "Sinun on annettava kelvollinen fs-tyyppi jatkaaksesi. Katso kelvolliset fs-tyypit kohdasta \"man parted\"."
+msgstr "Sinun on annettava kelvollinen tiedostojärjestelmän tyyppi jatkaaksesi. Katso kelvolliset tiedostojärjestelmän tyyppi kohdasta \"man parted\"."
msgid "Error: Listing profiles on URL \"{}\" resulted in:"
msgstr "Virhe: Profiilien luettelointi URL \"{}\" johti:"
@@ -246,16 +253,19 @@ msgid "Error: Could not decode \"{}\" result as JSON:"
msgstr "Virhe: Tulosta \"{}\" ei voitu purkaa JSON-muodossa:"
msgid "Keyboard layout"
-msgstr "Näppäimistö"
+msgstr "Näppäimistön asettelu"
msgid "Mirror region"
-msgstr "Pakettivarasto"
+msgstr "Peilin alue (mirror region)"
msgid "Locale language"
-msgstr "Kieli"
+msgstr "Lokaalin kieli (locale)"
msgid "Locale encoding"
-msgstr "Kieli-koodaus"
+msgstr "Lokaalin merkistö (encoding)"
+
+msgid "Console font"
+msgstr "Päätteen kirjaintyyli"
msgid "Drive(s)"
msgstr "Levyasemat"
@@ -273,10 +283,10 @@ msgid "Bootloader"
msgstr "Käynnistyksenlataaja"
msgid "Root password"
-msgstr "Root salasana"
+msgstr "Rootin salasana"
msgid "Superuser account"
-msgstr "Superkäyttäjätili"
+msgstr "Superkäyttäjän tili"
msgid "User account"
msgstr "Käyttäjätili"
@@ -285,10 +295,10 @@ msgid "Profile"
msgstr "Profiili"
msgid "Audio"
-msgstr "Audio"
+msgstr "Ääni"
msgid "Kernels"
-msgstr "Kernelit"
+msgstr "Ytimet (kernels)"
msgid "Additional packages"
msgstr "Lisäpaketit"
@@ -297,7 +307,7 @@ msgid "Network configuration"
msgstr "Verkkoasetukset"
msgid "Automatic time sync (NTP)"
-msgstr "Autom. kellonajan synkronointi (NTP)"
+msgstr "Automaattisen kellonajan synkronointi (NTP)"
msgid "Install ({} config(s) missing)"
msgstr "Asenna ({} asetusta puuttuu)"
@@ -309,12 +319,12 @@ msgid ""
"Do you wish to continue?"
msgstr ""
"Päätit ohittaa kiintolevyn valinnan ja käyttää\n"
-"mitä tahansa asema-asetusta {} (kokeellinen)\n"
+"mitä tahansa asema-asetusta joka on liitetty kohteessa {} (kokeellinen)\n"
"VAROITUS: Archinstall ei voi tarkista asennuksen sopivuutta\n"
"Haluatko jatkaa?"
msgid "Re-using partition instance: {}"
-msgstr "Käytetään osiointi esimerkkiä: {}"
+msgstr "Uudelleenkäytetään osioinstanssia: {}"
msgid "Create a new partition"
msgstr "Luo uusi osio"
@@ -329,13 +339,13 @@ msgid "Assign mount-point for a partition"
msgstr "Määritä osion liitoskohta"
msgid "Mark/Unmark a partition to be formatted (wipes data)"
-msgstr "Merkitse/poista osion alustaminen (pyyhkii tiedot)"
+msgstr "Lisää/poista osion merkkaus formatointia varten (pyyhkii tiedot)"
msgid "Mark/Unmark a partition as encrypted"
-msgstr "Merkitse/poista osio salataan merkintä"
+msgstr "Lisää/poista osion merkkaus salatuksi (encrypted)"
msgid "Mark/Unmark a partition as bootable (automatic for /boot)"
-msgstr "Merkitse/poista osion merkintä käynnistyväksi (automaattinen /boot)"
+msgstr "Lisää/poista osion merkintä käynnistyväksi (/boot merkitään käynnistyväksi automaattisesti)"
msgid "Set desired filesystem for a partition"
msgstr "Aseta osiolle haluttu tiedostojärjestelmä"
@@ -344,10 +354,10 @@ msgid "Abort"
msgstr "Keskeytä"
msgid "Hostname"
-msgstr "Hostname \"kone-nimi\""
+msgstr "Isäntänimi"
msgid "Not configured, unavailable unless setup manually"
-msgstr "Ei määritetty, ei käytettävissä, ellei asennusta ole käsin määritetty"
+msgstr "Ei määritetty, käytettävissä ainoastaan jos asennus on käsin määritelty"
msgid "Timezone"
msgstr "Aikavyöhyke"
@@ -366,7 +376,7 @@ msgstr ""
"\n"
msgid "Suggest partition layout"
-msgstr "Ehdota osion asettelua"
+msgstr "Ehdota osion asettelu"
msgid "Enter a password: "
msgstr "Anna salasana: "
@@ -375,32 +385,32 @@ msgid "Enter a encryption password for {}"
msgstr "Anna salauksen salasana {}"
msgid "Enter disk encryption password (leave blank for no encryption): "
-msgstr "Anna levyn salauksen salasana (jätä tyhjäksi, jos et salaa): "
+msgstr "Anna levyn salauksen salasana (jätä tyhjäksi jos et salaa): "
msgid "Create a required super-user with sudo privileges: "
-msgstr "Luo vaadittu superkäyttäjä, jolla on sudo-oikeudet: "
+msgstr "Luo vaadittu superkäyttäjä jolla on sudo-oikeudet: "
msgid "Enter root password (leave blank to disable root): "
-msgstr "Anna root-salasana (jätä tyhjäksi niin root poistetaan käytöstä): "
+msgstr "Anna salasana rootille (jätä tyhjäksi niin root poistetaan käytöstä): "
msgid "Password for user \"{}\": "
msgstr "Salasana käyttäjälle \"{}\": "
msgid "Verifying that additional packages exist (this might take a few seconds)"
-msgstr "Varmistetaan, että lisäpaketit ovat olemassa (saattaa kestää muutaman sekunnin)"
+msgstr "Varmistetaan että lisäpaketit ovat olemassa (saattaa kestää muutaman sekunnin)"
msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n"
-msgstr "Haluatko käyttää automaattista ajan synkronointia oletus (NTP) aikapalvelinten kanssa?\n"
+msgstr "Haluatko käyttää automaattista ajan synkronointia (NTP) oletusaikapalvelimien kanssa?\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 ""
-"NTP:n toiminta saattaa vaatia laitteistolle muita määrityksen jälkeisiä vaiheita.\n"
+"NTP:n toimiminen saattaa vaatia laitteiston muita määrityksen jälkeisiä vaiheita.\n"
"Katso lisätietoja Arch-wiki"
msgid "Enter a username to create an additional user (leave blank to skip): "
-msgstr "Luo uusi käyttäjä antamalla käyttäjänimi (jätä tyhjäksi ja ohita): "
+msgstr "Luo uusi käyttäjä antamalla käyttäjänimi (jätä tyhjäksi ohittaaksesi): "
msgid "Use ESC to skip\n"
msgstr "Ohita painamalla ESC\n"
@@ -447,13 +457,13 @@ msgstr ""
"Tämä on sinun valitsema kokoonpano:"
msgid "Pacman is already running, waiting maximum 10 minutes for it to terminate."
-msgstr "Pacman on jo käynnissä, odota enintään 10 minuuttia sen päättymistä."
+msgstr "Pacman on jo käynnissä, odotetaan enintään 10 minuuttia sen päättymistä."
msgid "Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall."
-msgstr "Aiempi pacman-lukko ei ole poistunut. Lopeta kaikki olemassa olevat pacman-istunnot ennen archinstall ohjelman käyttöä."
+msgstr "Aiempi pacman-lukko ei ole poistunut. Lopeta kaikki olemassa olevat pacman-istunnot ennen archinstallin käyttöä."
msgid "Choose which optional additional repositories to enable"
-msgstr "Valitse, valinnaiset lisävarastot jotka otetaan käyttöön"
+msgstr "Valitse valinnaiset lisävarastot jotka otetaan käyttöön"
msgid "Add a user"
msgstr "Lisää käyttäjä"
@@ -502,7 +512,7 @@ msgid "Manage btrfs subvolumes for current partition"
msgstr "Hallitse nykyisen osion btrfs-alitaltioita"
msgid "No configuration"
-msgstr "Ei määritystä"
+msgstr "Ei konfiguraatiota"
msgid "Save user configuration"
msgstr "Tallenna käyttäjän määritykset"
@@ -517,10 +527,10 @@ msgid "Save all"
msgstr "Tallenna kaikki"
msgid "Choose which configuration to save"
-msgstr "Valitse tallennettavat määritykset"
+msgstr "Valitse tallennettavat konfiguraatiot"
msgid "Enter a directory for the configuration(s) to be saved: "
-msgstr "Anna hakemisto tallennettaville määrityksille: "
+msgstr "Anna hakemisto konfiguraation tallentamista varten: "
msgid "Not a valid directory: {}"
msgstr "Hakemisto ei ole kelvollinen: {}"
@@ -535,7 +545,7 @@ msgid "Optional repositories"
msgstr "Valinnaiset arkistot"
msgid "Save configuration"
-msgstr "Tallenna määritykset"
+msgstr "Tallenna konfiguraatio"
msgid "Missing configurations:\n"
msgstr "Puuttuvat määritykset:\n"
@@ -572,7 +582,7 @@ msgid "Subvolume mountpoint"
msgstr "Alitaltion liitoskohta"
msgid "Subvolume options"
-msgstr "Alitaltion valinnat"
+msgstr "Alitaltion asetukset"
msgid "Save"
msgstr "Tallenna"
@@ -587,29 +597,29 @@ msgid "Select the desired subvolume options "
msgstr "Valitse alitaltion asetukset "
msgid "Define users with sudo privilege, by username: "
-msgstr "Määritä käyttäjät, joilla on sudo-oikeudet, käyttäjänimen mukaan: "
+msgstr "Määritä sudo-oikeuksia omaavat käyttäjät käyttäjänimen mukaan: "
#, python-brace-format
msgid "[!] A log file has been created here: {}"
msgstr "[!] Lokitiedosto on luotu tähän: {}"
msgid "Would you like to use BTRFS subvolumes with a default structure?"
-msgstr "Haluatko käyttää BTRFS-alitaltioita oletusrakenteena?"
+msgstr "Haluatko käyttää BTRFS-alitaltioita oletusrakenteella?"
msgid "Would you like to use BTRFS compression?"
-msgstr "Haluatko käyttää BTRFS-pakkausta?"
+msgstr "Haluatko käyttää BTRFS kompressiota?"
msgid "Would you like to create a separate partition for /home?"
-msgstr "Haluatko luoda erillisen osion /home ?"
+msgstr "Haluatko luoda erillisen /home osion?"
msgid "The selected drives do not have the minimum capacity required for an automatic suggestion\n"
-msgstr "Valituilla asemilla ei ole automaattiseen ehdotukseen vaadittavaa vähimmäistilaa\n"
+msgstr "Valituilla asemilla ei ole automaattiseen osiointiin vaadittavaa vähimmäistilaa\n"
msgid "Minimum capacity for /home partition: {}GB\n"
-msgstr "Minimi tila /home osiolle: {}GB\n"
+msgstr "Pienin kapasiteetti /home osiolle: {}GB\n"
msgid "Minimum capacity for Arch Linux partition: {}GB"
-msgstr "Minimi tila Arch Linux osiolle: {}GB"
+msgstr "Pienin kapasiteetti Arch Linux osiolle: {}GB"
msgid "Continue"
msgstr "Jatka"
@@ -624,10 +634,10 @@ msgid "set: {}"
msgstr "aseta: {}"
msgid "Manual configuration setting must be a list"
-msgstr "Manuaaliset asetukset on oltava lista muodossa"
+msgstr "Manuaalinen konfiguraatio on oltava listan muodossa"
msgid "No iface specified for manual configuration"
-msgstr "Manuaalista määritystä varten iface on tekemättä"
+msgstr "Manuaalista määritystä varten iface on valitsematta"
msgid "Manual nic configuration with no auto DHCP requires an IP address"
msgstr "Manuaalinen verkkokortin määritys ilman autom. DHCP:tä vaatii IP-osoitteen"
@@ -645,7 +655,7 @@ msgid "Select interface to add"
msgstr "Valitse lisättävä liitäntä"
msgid "Manual configuration"
-msgstr "Käsin määrittely"
+msgstr "Manuaalinen konfiguraatio"
msgid "Mark/Unmark a partition as compressed (btrfs only)"
msgstr "Merkitse/poista osio pakatuksi (vain btrfs)"
@@ -654,28 +664,28 @@ msgid "The password you are using seems to be weak, are you sure you want to use
msgstr "Käyttämäsi salasana vaikuttaa heikolta, haluatko käyttää sitä?"
msgid "Provides a selection of desktop environments and tiling window managers, e.g. gnome, kde, sway"
-msgstr "Tarjoaa valikoiman erilaisia työpöytiä ja ikkunointia esim. gnome, kde, sway"
+msgstr "Tarjoaa valikoiman erilaisia työpöytäympäristöjä ja ikkunaympäristöjä esim. gnome, kde, sway"
msgid "Select your desired desktop environment"
-msgstr "Valitse haluamasi työpöytä"
+msgstr "Valitse haluamasi työpöytäympäristö"
msgid "A very basic installation that allows you to customize Arch Linux as you see fit."
-msgstr "Hyvin kevyt asennus, jonka avulla voit mukauttaa Arch Linuxia haluamallasi tavalla."
+msgstr "Hyvin yksinkertainen asennus, jonka avulla voit mukauttaa Arch Linuxia haluamallasi tavalla."
msgid "Provides a selection of various server packages to install and enable, e.g. httpd, nginx, mariadb"
-msgstr "Tarjoaa valikoiman erilaisia palvelinpaketteja ja saatavilla käyttöön esim. httpd, nginx, mariadb"
+msgstr "Tarjoaa valikoiman erilaisia palvelinpaketteja asennettavaksi ja aktivoitavaksi, esim. httpd, nginx, mariadb"
msgid "Choose which servers to install, if none then a minimal installation will be done"
-msgstr "Valitse mitkä palvelimet asennetaan. Jos ei yhtään, tehdään pienin mahdollinen asennus"
+msgstr "Valitse mitkä palvelimet asennetaan. Tyhjä valikoima asentaa minimaalisen asennuksen"
msgid "Installs a minimal system as well as xorg and graphics drivers."
-msgstr "Asentaa minimaalisen järjestelmän sekä xorg ja ohjaimet näytönohjaimelle."
+msgstr "Asentaa minimaalisen järjestelmän sekä xorgin ja näytönohjaimen ajurit."
msgid "Press Enter to continue."
msgstr "Paina ENTER ja jatka."
msgid "Would you like to chroot into the newly created installation and perform post-installation configuration?"
-msgstr "Haluatko chroot:in uuteen asennukseen ja suorittaa asennuksen jälkeiset asetukset?"
+msgstr "Haluatko liittyyä uuteen asennukseen chroot-tilassa ja suorittaa asennuksen jälkeinen konfigurointi?"
msgid "Are you sure you want to reset this setting?"
msgstr "Haluatko varmasti nollata tämän asetuksen?"
@@ -687,7 +697,7 @@ msgid "Any modifications to the existing setting will reset the disk layout!"
msgstr "Kaikki muutokset olemassa olevaan asetukseen nollaavat levyasettelun!"
msgid "If you reset the harddrive selection this will also reset the current disk layout. Are you sure?"
-msgstr "Jos nollaat kiintolevyn valinnan, tämä nollaa myös nykyisen levyasettelun. Oletko varma?"
+msgstr "Jos nollaat kiintolevyn valinnan tämä nollaa myös nykyisen levyasettelun. Oletko varma?"
msgid "Save and exit"
msgstr "Tallenna ja poistu"
@@ -716,7 +726,7 @@ msgstr ""
"\n"
msgid "Copy to: "
-msgstr "Kopioi…: "
+msgstr "Kopioi kohteeseen: "
msgid "Edit: "
msgstr "Muokkaa: "
@@ -734,7 +744,7 @@ msgid "Value: "
msgstr "Arvo: "
msgid "You can skip selecting a drive and partitioning and use whatever drive-setup is mounted at /mnt (experimental)"
-msgstr "Voit ohittaa aseman valinnan, sekä osioinnin ja käyttää mitä tahansa asemaa, joka on kytketty /mnt hakemistossa (kokeellinen)"
+msgstr "Voit ohittaa aseman valinnan sekä osioinnin ja käyttää /mnt hakemistoon kytkettyä aseman asetusta (kokeellinen)"
msgid "Select one of the disks or skip and use /mnt as default"
msgstr "Valitse jokin levyistä tai ohita ja käytä /mnt oletuksena"
@@ -797,7 +807,7 @@ msgid "Configured {} interfaces"
msgstr "Määritetty {} liittymää"
msgid "This option enables the number of parallel downloads that can occur during installation"
-msgstr "Tämä valinta mahdollistaa asennuksen aikana tapahtuvien rinnakkaisten latausten määrän"
+msgstr "Tämä valinta määrittää asennuksen aikana tapahtuvien rinnakkaisten latausten määrän"
msgid ""
"Enter the number of parallel downloads to be enabled.\n"
@@ -819,47 +829,44 @@ msgstr " - Pois/oletus : 0 ( ei salli rinnakkaisia latauksia, sallii vain 1 la
#, python-brace-format
msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]"
-msgstr "Virheellinen arvo! Yritä uudelleen kelvollisella arvolla [1 - {max_downloads}, tai 0 on poistettu]"
+msgstr "Virheellinen arvo! Yritä uudelleen kelvollisella arvolla [1 - {max_downloads}, tai 0 kytkeäksi pois päältä]"
msgid "Parallel Downloads"
msgstr "Rinnakkaiset lataukset"
msgid "Pacman"
-msgstr ""
+msgstr "Pacman"
msgid "Color"
-msgstr ""
+msgstr "Väri"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
-msgstr ""
-"Anna rinnakkaisten latausten määrä.\n"
-"\n"
-"Huomaa:\n"
+msgstr "Anna rinnakkaisten latausten määrä (1-{})"
msgid "Enable colored output for pacman"
-msgstr ""
+msgstr "Aktivoi värillinen ulostulo pacman:ille"
msgid "ESC to skip"
msgstr "Ohita painamalla ESC"
msgid "CTRL+C to reset"
-msgstr "CTRL+C nollaa"
+msgstr "CTRL+C nollaaksesi"
msgid "TAB to select"
msgstr "TAB valitsee"
msgid "[Default value: 0] > "
-msgstr "[oletusarvo: 0] > "
+msgstr "[Oletusarvo: 0] > "
msgid "To be able to use this translation, please install a font manually that supports the language."
-msgstr "Jotta voit käyttää tätä käännöstä, asenna käsin fontti, joka tukee tätä kieltä."
+msgstr "Jotta voit käyttää tätä käännöstä, asenna kieltä tukeva fontti manuaalisesti"
msgid "The font should be stored as {}"
msgstr "Fontti tulee tallentaa {}"
msgid "Archinstall requires root privileges to run. See --help for more."
-msgstr "Archinstall vaatii toimiakseen root oikeudet. Katso --help ja saat lisätietoja."
+msgstr "Archinstall vaatii rootin oikeudet toimiakseen. Katso --help ja saat lisätietoja."
msgid "Select an execution mode"
msgstr "Valitse suoritustila"
@@ -870,7 +877,7 @@ msgstr "Profiilia ei voi hakea määritetystä URL-osoitteesta: {}"
#, python-brace-format
msgid "Profiles must have unique name, but profile definitions with duplicate name found: {}"
-msgstr "Profiilin nimi on oltava yksilöllinen, mutta määrityksistä löytyy päällekkäinen nimi: {}"
+msgstr "Profiilin nimi on oltava yksilöllinen, mutta profiilien määrityksistä löytyy päällekkäinen nimi: {}"
msgid "Select one or more devices to use and configure"
msgstr "Valitse yksi tai useampi laite määritettäväksi"
@@ -885,18 +892,18 @@ msgid "Select a partitioning option"
msgstr "Valitse osiointivaihtoehto"
msgid "Enter the root directory of the mounted devices: "
-msgstr "Anna root hahemisto liitetylle laitteelle: "
+msgstr "Anna root hakemisto liitetylle laitteelle: "
#, python-brace-format
msgid "Minimum capacity for /home partition: {}GiB\n"
-msgstr "Minimi tila /home osiolle: {}GiB\n"
+msgstr "Minimi kapasiteetti /home osiolle: {}GiB\n"
#, python-brace-format
msgid "Minimum capacity for Arch Linux partition: {}GiB"
msgstr "Minimi tila Arch Linux osiolle: {}GiB"
msgid "This is a list of pre-programmed profiles_bck, they might make it easier to install things like desktop environments"
-msgstr "Lista esiohjelmoiduista profiles_bck paketeista, joka voivat helpottaa asioita, kuten työpöydän asentamista"
+msgstr "Tämä on lista esiohjelmoiduista profiles_bck instansseista, jotka voivat helpottaa työpöydäympäristön asentamista tai vastaavaa"
msgid "Current profile selection"
msgstr "Nykyinen profiilivalinta"
@@ -967,34 +974,34 @@ msgid "Encryption type"
msgstr "Salaustyyppi"
msgid "Iteration time"
-msgstr ""
+msgstr "Iteraatioaika"
msgid "Enter iteration time for LUKS encryption (in milliseconds)"
-msgstr ""
+msgstr "Anna iteraatioaika LUKS salaukselle (millisekunneissa)"
msgid "Higher values increase security but slow down boot time"
-msgstr ""
+msgstr "Suuremmat arvot parantavat tietosuojaa mutta hidastavat käynnistysaikaa"
msgid "Default: 10000ms, Recommended range: 1000-60000"
-msgstr ""
+msgstr "Oletusarvo: 10000ms, suositeltu 1000-60000ms"
msgid "Iteration time cannot be empty"
-msgstr ""
+msgstr "Iteraatioaika ei voi olla tyhjä"
msgid "Iteration time must be at least 100ms"
-msgstr ""
+msgstr "Iteraatioajan on oltava ainakin 100ms"
msgid "Iteration time must be at most 120000ms"
-msgstr ""
+msgstr "Iteraatioaika saa olla enintään 120000ms"
msgid "Please enter a valid number"
-msgstr ""
+msgstr "Ole hyvä ja syötä kelpaava numero"
msgid "Partitions"
msgstr "Osiot"
msgid "No HSM devices available"
-msgstr "Ei HSM-laitteita saatavilla"
+msgstr "HSM-laitteita ei saatavilla"
msgid "Partitions to be encrypted"
msgstr "Salattavat osiot"
@@ -1006,7 +1013,7 @@ msgid "Select a FIDO2 device to use for HSM"
msgstr "Valitse HSM:ään käytettävä FIDO2-laite"
msgid "Use a best-effort default partition layout"
-msgstr "Käytä parasta mahdollista oletusosion asettelua"
+msgstr "Käytä parhaan edellytyksen oletusosioinnin asettelua"
msgid "Manual Partitioning"
msgstr "Osiointi käsin"
@@ -1043,14 +1050,14 @@ msgid "Back"
msgstr "Takaisin"
msgid "Please chose which greeter to install for the chosen profiles: {}"
-msgstr "Valitse asennettava käyttöliittymä valituille profiileille: {}"
+msgstr "Valitse asennettava tervehtijä valituille profiileille: {}"
#, python-brace-format
msgid "Environment type: {}"
msgstr "Ympäristötyyppi: {}"
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 "Sway ei tue patentoitua Nvidia-ohjainta. Todennäköistä, että kohtaat joitain ongelmia, kelpaako se silti sinulle?"
+msgstr "Sway ei tue patentoitua Nvidia-ohjainta. On todennäköistä että kohtaat joitain ongelmia, kelpaako se silti sinulle?"
msgid "Installed packages"
msgstr "Asennetut paketit"
@@ -1087,7 +1094,7 @@ msgid ""
"Select a graphics driver or leave blank to install all open-source drivers"
msgstr ""
"\n"
-"Valitse näytönohjaimen ohjain tai jätä tyhjäksi niin kaikki asennetaan avoimen lähdekoodin ohjaimilla"
+"Valitse näytönohjaimen ajuri tai jätä tyhjäksi asentaaksesi ainoastaan kaikki avoimen lähdekoodin ajurit"
msgid "Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
msgstr "Sway tarvitsee pääsyn istuntoon (kokoelma laitteistoja, kuten näppäimistö, hiiri jne.)"
@@ -1102,13 +1109,13 @@ msgstr ""
"Valitse asetus antaaksesi Swaylle pääsyn laitteistoosi"
msgid "Graphics driver"
-msgstr "Näytönohjaimen ohjain"
+msgstr "Näytönohjaimen ajuri"
msgid "Greeter"
-msgstr "Käyttöliittymä"
+msgstr "Tervehtijä"
msgid "Please chose which greeter to install"
-msgstr "Valitse asennettava käyttöliittymä"
+msgstr "Valitse asennettava tervehtijä"
msgid "This is a list of pre-programmed default_profiles"
msgstr "Tämä on lista esiohjelmoiduista default_profiles"
@@ -1120,25 +1127,25 @@ msgid "Profiles"
msgstr "Profiilit"
msgid "Finding possible directories to save configuration files ..."
-msgstr "Etsitään hakemistoja asetustiedostojen tallentamiseen ..."
+msgstr "Etsitään mahdollisia hakemistoja asetustiedostojen tallentamiseen ..."
msgid "Select directory (or directories) for saving configuration files"
msgstr "Valitse hakemisto (tai hakemistot) asetustiedostojen tallentamiseen"
msgid "Add a custom mirror"
-msgstr "Lisää mukautettu peilipaikka"
+msgstr "Lisää mukautettu peili"
msgid "Change custom mirror"
-msgstr "Vaihda mukautettu peilipaikka"
+msgstr "Vaihda mukautettu peili"
msgid "Delete custom mirror"
-msgstr "Poista mukautettu peilipaikka"
+msgstr "Poista mukautettu peili"
msgid "Enter name (leave blank to skip): "
-msgstr "Anna nimi (jätä tyhjäksi ja ohita): "
+msgstr "Anna nimi (jätä tyhjäksi ohittaaksesi): "
msgid "Enter url (leave blank to skip): "
-msgstr "Anna url (jätä tyhjäksi ja ohita): "
+msgstr "Anna url (jätä tyhjäksi ohittaaksesi): "
msgid "Select signature check option"
msgstr "Valitse allekirjoituksen tarkistusvaihtoehto"
@@ -1147,19 +1154,19 @@ msgid "Select signature option"
msgstr "Valitse allekirjoituksen asetus"
msgid "Custom mirrors"
-msgstr "Mukautetut peilipaikat"
+msgstr "Mukautetut peilit"
msgid "Defined"
msgstr "Määritelty"
msgid "Save user configuration (including disk layout)"
-msgstr "Tallenna käyttäjän asetukset (myös levyasettelu)"
+msgstr "Tallenna käyttäjän asetukset (sisältäen levyasettelun)"
msgid ""
"Enter a directory for the configuration(s) to be saved (tab completion enabled)\n"
"Save directory: "
msgstr ""
-"Anna hakemisto tallennettaville määrityksille (välilehden viimeistely käytössä)\n"
+"Anna hakemisto konfiguraation(oiden) tallentamista varten (tab-viimeistely käytössä)\n"
"Tallennushakemisto: "
msgid ""
@@ -1167,30 +1174,30 @@ msgid ""
"\n"
"{}"
msgstr ""
-"Haluatko tallentaa {} asetustiedostoa seuraavaan paikkaan?\n"
+"Haluatko tallentaa {} asennustiedostot seuraavaan paikkaan?\n"
"\n"
"{}"
msgid "Saving {} configuration files to {}"
-msgstr "Tallennetaan {} määritystiedostoa {}"
+msgstr "Tallennetaan {} konfiguraatiotiedostot kohteeseen {}"
msgid "Mirrors"
-msgstr "Peilipaikat"
+msgstr "Peilit"
msgid "Mirror regions"
-msgstr "Peilipaikan maa"
+msgstr "Peilin maa"
msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {max_downloads+1} downloads at a time )"
msgstr " - Suurin arvo : {} ( sallii {} rinnakkaista latausta, sallii {max_downloads+1} latausta kerralla )"
msgid "Invalid input! Try again with a valid input [1 to {}, or 0 to disable]"
-msgstr "Virheellinen arvo! Yritä uudelleen kelvollisella arvolla [1 - {}, tai 0 on poistettu]"
+msgstr "Virheellinen arvo! Yritä uudelleen kelvollisella arvolla [1 - {}, 0 vastaa pois päältä]"
msgid "Locales"
msgstr "Alueet"
msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)"
-msgstr "Käytä NetworkManager -ohjelmaa (Internetin määritys graafisesti GNOME ja KDE)"
+msgstr "Käytä NetworkManager (Internetin määritys graafisesti GNOMEssa ja KDEssa)"
msgid "Total: {} / {}"
msgstr "Yhteensä: {} / {}"
@@ -1199,7 +1206,7 @@ msgid "All entered values can be suffixed with a unit: B, KB, KiB, MB, MiB..."
msgstr "Kaikki annetut arvot voidaan liittää käyttäen yksikköjä: B, KB, KiB, MB, MiB..."
msgid "If no unit is provided, the value is interpreted as sectors"
-msgstr "Jos yksikköä ei ole annettu, arvo tulkitaan sektoreiksi"
+msgstr "Jos yksikköä ei ole annettu, arvo tulkitaan sektoreina"
msgid "Enter start (default: sector {}): "
msgstr "Anna alku (oletus: sektori {}): "
@@ -1208,7 +1215,7 @@ msgid "Enter end (default: {}): "
msgstr "Anna loppu (oletus: {}): "
msgid "Unable to determine fido2 devices. Is libfido2 installed?"
-msgstr "Fido2-laitteita ei voida määrittää. Onko libfido2 asennettu?"
+msgstr "Fido2-laitteita ei voitu määrittää. Onko libfido2 asennettu?"
msgid "Path"
msgstr "Polku"
@@ -1223,6 +1230,21 @@ msgstr "Tuote"
msgid "Invalid configuration: {error}"
msgstr "Virheellinen määritys: {error}"
+msgid "Ready to install"
+msgstr "Valmis asentamaan"
+
+msgid "Disks"
+msgstr "Levyasemat"
+
+msgid "Packages"
+msgstr "Määritetty {} liittymää"
+
+msgid "Network"
+msgstr "Verkko"
+
+msgid "Locale"
+msgstr "Alueet"
+
msgid "Type"
msgstr "Tyyppi"
@@ -1263,209 +1285,182 @@ msgstr ""
msgid "All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..."
msgstr "Kaikki annetut arvot voidaan liittää käyttäen yksikköjä: B, KB, KiB, MB, MiB..."
+# unsure
msgid "Would you like to use unified kernel images?"
-msgstr "Haluatko käyttää Unified Kernel Images, joka voidaan käynnistää suoraan UEFI-ohjelmistosta?"
+msgstr "Haluatko käyttää unified kernel images?"
+# unsure
msgid "Unified kernel images"
-msgstr "UKI Unified Kernel Images"
+msgstr "Unified Kernel Images"
msgid "Waiting for time sync (timedatectl show) to complete."
-msgstr "Odotetaan ajan synkronoinnin (timedatectl show) päättymistä."
+msgstr "Odotetaan ajan synkronointia (timedatectl show) päättymistä."
msgid "Time syncronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/"
-msgstr "Ajan synkronointi ei ole valmis, kun odotat voit tarkistaa kiertotapoja: https://archinstall.readthedocs.io/"
+msgstr "Ajan synkronointi ei ole valmis, odottaessasi voit tarkistaa kiertotapoja: https://archinstall.readthedocs.io/"
msgid "Skipping waiting for automatic time sync (this can cause issues if time is out of sync during installation)"
-msgstr "Autom. ajan synkronoinnin odottaminen ohitetaan (voi aiheuttaa ongelmia, jos aikaa ei ole synkronoitu asennuksen aikana)"
+msgstr "Ohitetaan autom. ajan synkronoinnin (voi aiheuttaa ongelmia, jos aika ei ole synkronoitu asennuksen aikana)"
msgid "Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete."
-msgstr "Odotetaan Arch Linux avainten synkronoinnin valmistumista (archlinux-keyring-wkd-sync)."
+msgstr "Odotetaan Arch Linux avaimien synkronointia (archlinux-keyring-wkd-sync)."
msgid "Selected profiles: "
msgstr "Valitut profiilit: "
msgid "Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/"
-msgstr "Ajan synkronointi ei ole valmis, kun odotat voit tarkistaa kiertotapoja: https://archinstall.readthedocs.io/"
+msgstr "Ajan synkronointi ei ole valmistumassa, odottaessasi voit tarkistaa kiertotapoja: https://archinstall.readthedocs.io/"
msgid "Mark/Unmark as nodatacow"
-msgstr "Merkitse/poista nodatacow merkintä"
+msgstr "Lisää/poista nodatacow merkintä"
msgid "Would you like to use compression or disable CoW?"
-msgstr "Haluatko käyttää pakkausta vai poistaa CoW:n käytöstä?"
+msgstr "Haluatko käyttää kompressiota vai poistaa CoW:n käytöstä?"
msgid "Use compression"
-msgstr "Käytä pakkausta"
+msgstr "Käytä kompressiota"
msgid "Disable Copy-on-Write"
msgstr "Poista kopiointi kirjoittamisen yhteydessä"
-#, fuzzy
msgid "Provides a selection of desktop environments and tiling window managers, e.g. GNOME, KDE Plasma, Sway"
-msgstr "Tarjoaa valikoiman erilaisia työpöytiä ja ikkunointia esim. gnome, kde, sway"
+msgstr "Tarjoaa valikoiman erilaisia työpöytäympäristöjä ja järjesteleviä ikkunaympäristöjä esim. gnome, kde, sway"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Configuration type: {}"
-msgstr "Asetukset"
+msgstr "Konfiguraation tyyppi: {}"
-#, fuzzy
msgid "LVM configuration type"
-msgstr "Ei määritystä"
+msgstr "LVM konfiguraation tyyppi"
msgid "LVM disk encryption with more than 2 partitions is currently not supported"
-msgstr ""
+msgstr "LVM levyaseman salaus enemmällä kuin kahdella osiolla ei ole tällä hetkellä tuettu"
-#, fuzzy
msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)"
-msgstr "Käytä NetworkManager -ohjelmaa (Internetin määritys graafisesti GNOME ja KDE)"
+msgstr "Käytä NetworkManager (Internetin määritys graafisesti GNOME:ssa ja KDE Plasma:ssa)"
-#, fuzzy
msgid "Select a LVM option"
-msgstr "Valitse aikavyöhyke"
+msgstr "Valitse LVM optio"
-#, fuzzy
msgid "Partitioning"
-msgstr "Osio"
+msgstr "Osiointi"
msgid "Logical Volume Management (LVM)"
-msgstr ""
+msgstr "Looginen taltiohallinta (engl. 'Logical Volume Management', LVM)"
msgid "Physical volumes"
-msgstr ""
+msgstr "Fyysiset taltiot"
msgid "Volumes"
-msgstr ""
+msgstr "Taltiot"
-#, fuzzy
msgid "LVM volumes"
-msgstr "Aseta alitaltiot"
+msgstr "LVM taltiot"
-#, fuzzy
msgid "LVM volumes to be encrypted"
-msgstr "Salattavat osiot"
+msgstr "Salattavat LVM taltiot"
-#, fuzzy
msgid "Select which LVM volumes to encrypt"
-msgstr "Valitse salattavat osiot"
+msgstr "Valitse salattavat LVM taltiot"
-#, fuzzy
msgid "Default layout"
-msgstr "Levyn asettelu"
+msgstr "Oletusasettelu"
-#, fuzzy
msgid "No Encryption"
-msgstr "Salaustyyppi"
+msgstr "Ei salausta"
msgid "LUKS"
-msgstr ""
+msgstr "LUKS"
msgid "LVM on LUKS"
-msgstr ""
+msgstr "LVM LUKS:in päällä (LVM on LUKS)"
msgid "LUKS on LVM"
-msgstr ""
+msgstr "LUKS LVM:än päällä (LUKS on LVM)"
-#, fuzzy
msgid "Yes"
-msgstr "kyllä"
+msgstr "Kyllä"
msgid "No"
-msgstr ""
+msgstr "Ei"
-#, fuzzy
msgid "Archinstall help"
-msgstr "Archinstall kieli"
+msgstr "Archinstall apu"
-#, fuzzy
msgid " (default)"
msgstr "(oletus)"
msgid "Press Ctrl+h for help"
-msgstr ""
+msgstr "Paina Ctrl+h saadaksesi apua"
-#, fuzzy
msgid "Choose an option to give Sway access to your hardware"
-msgstr ""
-"\n"
-"\n"
-"Valitse asetus antaaksesi Swaylle pääsyn laitteistoosi"
+msgstr "Valitse asetus antaaksesi Swaylle pääsyn laitteistoosi"
msgid "Seat access"
-msgstr ""
+msgstr "Istunnon pääsy (seat)"
-#, fuzzy
msgid "Mountpoint"
msgstr "Liitoskohta: "
msgid "HSM"
-msgstr ""
+msgstr "HSM"
-#, fuzzy
msgid "Enter disk encryption password (leave blank for no encryption)"
msgstr "Anna levyn salauksen salasana (jätä tyhjäksi, jos et salaa): "
-#, fuzzy
msgid "Disk encryption password"
msgstr "Salauksen salasana"
-#, fuzzy
msgid "Partition - New"
-msgstr "Osio"
+msgstr "Osio - Uusi"
-#, fuzzy
msgid "Filesystem"
-msgstr "Vaihda tiedostojärjestelmä"
+msgstr "Tiedostojärjestelmä"
msgid "Invalid size"
-msgstr ""
+msgstr "Epäkelpo koko"
-#, fuzzy
msgid "Start (default: sector {}): "
-msgstr "Anna alku (oletus: sektori {}): "
+msgstr "Alku (oletus: sektori {}): "
-#, fuzzy
msgid "End (default: {}): "
-msgstr "Anna loppu (oletus: {}): "
+msgstr "Loppu (oletus: {}): "
-#, fuzzy
msgid "Subvolume name"
msgstr "Alitaltion nimi "
-#, fuzzy
+# unsure
msgid "Disk configuration type"
-msgstr "Kiintolevyn määritys"
+msgstr "Levyn konfiguraatiotyyppi"
msgid "Root mount directory"
-msgstr ""
+msgstr "Root:in liittämishakemisto (mount directory)"
-#, fuzzy
msgid "Select language"
-msgstr "Kieli"
+msgstr "Valitse kieli"
-#, fuzzy
msgid "Write additional packages to install (space separated, leave blank to skip)"
-msgstr "Kirjoita asennettavat lisäpaketit (välilyönnillä erotettuna, ohita vaihe jättämällä tyhjäksi): "
+msgstr "Kirjoita asennettavat lisäpaketit (välilyönnillä erotettuna, ohita jättämällä tyhjäksi): "
msgid "Invalid download number"
-msgstr ""
+msgstr "Epäkelpo numero lataukseen"
msgid "Number downloads"
-msgstr ""
+msgstr "Numero latauksia"
-#, fuzzy
msgid "The username you entered is invalid"
msgstr "Antamasi käyttäjänimi ei kelpaa. Yritä uudelleen"
-#, fuzzy
msgid "Username"
msgstr "Käyttäjänimi : "
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Should \"{}\" be a superuser (sudo)?\n"
-msgstr "Pitäisikö \"{}\" olla superkäyttäjä (sudo)?"
+msgstr "Pitäisikö \"{}\" olla superkäyttäjä (sudo)?\n"
-#, fuzzy
+# unsure
msgid "Interfaces"
-msgstr "Lisää liitäntä"
+msgstr "Verkkoliitännät (interfaces)"
msgid "You need to enter a valid IP in IP-config mode"
msgstr "Sinun on annettava kelvollinen IP-osoite IP-määritystilassa"
@@ -1474,255 +1469,212 @@ msgid "Modes"
msgstr "Tilat"
msgid "IP address"
-msgstr "IP osoite"
+msgstr "IP-osoite"
-#, fuzzy
msgid "Enter your gateway (router) IP address (leave blank for none)"
-msgstr "Anna yhdyskäytävän (reitittimen) IP-osoite tai jätä tyhjäksi: "
+msgstr "Anna yhdyskäytävän (reitittimen) IP-osoite (tai jätä tyhjäksi): "
msgid "Gateway address"
msgstr "Yhdyskäytävän osoite"
-#, fuzzy
msgid "Enter your DNS servers with space separated (leave blank for none)"
msgstr "Anna DNS-osoitteet (välilyönti erottaa kaksi osoitetta toisistaan, tyhjä ei mitään): "
-#, fuzzy
msgid "DNS servers"
-msgstr "Ei audiopalvelinta"
+msgstr "DNS-palvelimet"
-#, fuzzy
msgid "Configure interfaces"
-msgstr "Määritetty {} liittymää"
+msgstr "Määritä laitteet"
-#, fuzzy
msgid "Kernel"
-msgstr "Kernelit"
+msgstr "Ydin"
msgid "UEFI is not detected and some options are disabled"
-msgstr "UEFIa ei tunnisteta ja jotkin asetukset on poistettu käytöstä"
+msgstr "UEFIa ei tunnisteta ja jotkin asetukset ovat poistettu käytöstä"
msgid "Info"
msgstr "Informaatio"
-#, fuzzy
msgid "The proprietary Nvidia driver is not supported by Sway."
-msgstr "Sway ei tue patentoitua Nvidia-ohjainta. Todennäköistä, että kohtaat joitain ongelmia, kelpaako se silti sinulle?"
+msgstr "Sway ei tue patentoitua Nvidia-ohjainta."
-#, fuzzy
msgid "It is likely that you will run into issues, are you okay with that?"
-msgstr "Sway ei tue patentoitua Nvidia-ohjainta. Todennäköistä, että kohtaat joitain ongelmia, kelpaako se silti sinulle?"
+msgstr "On todennäköistä, että kohtaat joitain ongelmia, kelpaako se silti sinulle?"
-#, fuzzy
msgid "Main profile"
-msgstr "Muokkaa profiilia"
+msgstr "Pääprofiili"
-#, fuzzy
msgid "Confirm password"
-msgstr "Vaihda salasana"
+msgstr "Vahvista salasana"
msgid "The confirmation password did not match, please try again"
-msgstr ""
+msgstr "Salasanat eivät vastannet, ole hyvä ja koita uudestaan"
-#, fuzzy
msgid "Not a valid directory"
msgstr "Hakemisto ei ole kelvollinen: {}"
-#, fuzzy
msgid "Would you like to continue?"
-msgstr "Haluatko käyttää BTRFS-pakkausta?"
+msgstr "Haluatko jatkaa?"
msgid "Directory"
-msgstr ""
+msgstr "Hakemisto"
-#, fuzzy
msgid "Enter a directory for the configuration(s) to be saved (tab completion enabled)"
msgstr ""
-"Anna hakemisto tallennettaville määrityksille (välilehden viimeistely käytössä)\n"
+"Anna hakemisto konfiguraation(oiden) tallentamista varten (tab viimeistely käytössä)\n"
"Tallennushakemisto: "
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Do you want to save the configuration file(s) to {}?"
-msgstr ""
-"Haluatko tallentaa {} asetustiedostoa seuraavaan paikkaan?\n"
-"\n"
-"{}"
+msgstr "Haluatko tallentaa asetustiedoston(tot) kohteeseen {}?"
msgid "Enabled"
msgstr "Käytössä"
msgid "Disabled"
-msgstr "Pois Käytostä"
+msgstr "Pois käytostä"
-#, fuzzy
msgid "Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues"
-msgstr " Lähetä tämä ongelma (ja tiedosto) osoitteeseen https://github.com/archlinux/archinstall/issues"
+msgstr "Lähetä tämä ongelma (ja tiedosto) osoitteeseen https://github.com/archlinux/archinstall/issues"
-#, fuzzy
msgid "Mirror name"
-msgstr "Pakettivarasto"
+msgstr "Peilin nimi"
msgid "Url"
-msgstr ""
+msgstr "Url"
-#, fuzzy
msgid "Select signature check"
msgstr "Valitse allekirjoituksen tarkistusvaihtoehto"
-#, fuzzy
msgid "Select execution mode"
msgstr "Valitse suoritustila"
msgid "Press ? for help"
-msgstr ""
+msgstr "Paina ? saadaksesi apua"
-#, fuzzy
msgid "Choose an option to give Hyprland access to your hardware"
-msgstr ""
-"\n"
-"\n"
-"Valitse asetus antaaksesi Hyprlandille pääsyn laitteistoosi"
+msgstr "Valitse asetus antaaksesi Hyprlandille pääsyn laitteistoosi"
-#, fuzzy
msgid "Additional repositories"
msgstr "Valinnaiset arkistot"
msgid "NTP"
-msgstr ""
+msgstr "NTP"
msgid "Swap on zram"
-msgstr ""
+msgstr "Swap zram:illa (Swap on zram)"
msgid "Name"
msgstr "Nimi"
-#, fuzzy
msgid "Signature check"
msgstr "Valitse allekirjoituksen tarkistusvaihtoehto"
-#, fuzzy, python-brace-format
+# unsure
+#, python-brace-format
msgid "Selected free space segment on device {}:"
-msgstr "Laitteen nykyiset vapaat sektorit {}:"
+msgstr "Valittiin vapaan tilan osa laitteella {}:"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Size: {} / {}"
-msgstr "Yhteensä: {} / {}"
+msgstr "Koko: {} / {}"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Size (default: {}): "
-msgstr "Anna loppu (oletus: {}): "
+msgstr "Koko (oletus: {}): "
-#, fuzzy
msgid "HSM device"
-msgstr "Laite"
+msgstr "HSM laite"
msgid "Some packages could not be found in the repository"
-msgstr ""
+msgstr "Jotkut paketit eivät löytyneet repositoriosta"
-#, fuzzy
msgid "User"
-msgstr "Käyttäjänimi : "
+msgstr "Käyttäjä"
msgid "The specified configuration will be applied"
-msgstr ""
+msgstr "Käytetään valittua konfiguraatiota"
msgid "Wipe"
-msgstr ""
+msgstr "Pyyhi"
-#, fuzzy
msgid "Mark/Unmark as XBOOTLDR"
-msgstr "Merkitse/poista käynnistyvä"
+msgstr "Lisää/poista merkintö XBOOTLDRina"
-#, fuzzy
msgid "Loading packages..."
-msgstr "Lisäpaketit"
+msgstr "Ladataan paketteja..."
msgid "Select any packages from the below list that should be installed additionally"
-msgstr ""
+msgstr "Valitse alla olevalta listalta asennettavat lisäpaketit"
-#, fuzzy
msgid "Add a custom repository"
-msgstr "Lisää mukautettu peilipaikka"
+msgstr "Lisää mukautettu repositorio"
-#, fuzzy
msgid "Change custom repository"
-msgstr "Vaihda mukautettu peilipaikka"
+msgstr "Vaihda mukautettu repositorio"
-#, fuzzy
msgid "Delete custom repository"
-msgstr "Poista mukautettu peilipaikka"
+msgstr "Poista mukautettu repositorio"
-#, fuzzy
msgid "Repository name"
-msgstr "Pakettivarasto"
+msgstr "Repositorion nimi"
-#, fuzzy
msgid "Add a custom server"
-msgstr "Lisää mukautettu peilipaikka"
+msgstr "Lisää mukautettu palvelin"
-#, fuzzy
msgid "Change custom server"
-msgstr "Vaihda mukautettu peilipaikka"
+msgstr "Vaihda mukautettu palvelin"
-#, fuzzy
msgid "Delete custom server"
-msgstr "Poista mukautettu peilipaikka"
+msgstr "Poista mukautettu palvelin"
msgid "Server url"
-msgstr ""
+msgstr "Palvelimen url"
-#, fuzzy
msgid "Select regions"
-msgstr "Valitse allekirjoituksen asetus"
+msgstr "Valitse alueet"
-#, fuzzy
msgid "Add custom servers"
-msgstr "Lisää mukautettu peilipaikka"
+msgstr "Lisää mukautetut palvelimet"
-#, fuzzy
msgid "Add custom repository"
-msgstr "Lisää mukautettu peilipaikka"
+msgstr "Lisää mukautettu repositorio"
-#, fuzzy
msgid "Loading mirror regions..."
-msgstr "Peilipaikan maa"
+msgstr "Ladataan peilialueita..."
-#, fuzzy
msgid "Mirrors and repositories"
-msgstr "Valinnaiset arkistot"
+msgstr "Peilit ja repositoriot"
-#, fuzzy
msgid "Selected mirror regions"
-msgstr "Peilipaikan maa"
+msgstr "Valitut peilin aluuet"
-#, fuzzy
msgid "Custom servers"
-msgstr "Mukautetut peilipaikat"
+msgstr "Mukautetut palvelimet"
-#, fuzzy
msgid "Custom repositories"
-msgstr "Valinnaiset arkistot"
+msgstr "Mukautetut repositoriot"
msgid "Only ASCII characters are supported"
-msgstr ""
+msgstr "Ainoastaan ASCII hahmot ovat tuetut"
msgid "Show help"
-msgstr "Näytä apua"
+msgstr "Näytä apu"
msgid "Exit help"
-msgstr ""
+msgstr "Poistu avusta"
msgid "Preview scroll up"
-msgstr ""
+msgstr "Esikatsele ylöspäin scrollaamista"
msgid "Preview scroll down"
-msgstr ""
+msgstr "Esikatsele alaspäin scrollaamista"
msgid "Move up"
-msgstr "Liikku ylös"
+msgstr "Liiku ylös"
msgid "Move down"
-msgstr "Liikku alas"
+msgstr "Liiku alas"
msgid "Move right"
msgstr "Liiku oikealle"
@@ -1731,632 +1683,566 @@ msgid "Move left"
msgstr "Liiku vasemmalle"
msgid "Jump to entry"
-msgstr ""
+msgstr "Hyppää kohtaan"
msgid "Skip selection (if available)"
-msgstr ""
+msgstr "Hyppää valinnan yli (jos saatavilla)"
msgid "Reset selection (if available)"
-msgstr ""
+msgstr "Nollaa valinta (jos saatavilla)"
-#, fuzzy
msgid "Select on single select"
-msgstr "Valitse allekirjoituksen tarkistusvaihtoehto"
+msgstr "Valinta yksittöisellä valinnalla"
-#, fuzzy
msgid "Select on multi select"
-msgstr "Valitse aikavyöhyke"
+msgstr "Valinta multivalinnalla"
msgid "Reset"
-msgstr ""
+msgstr "Nollaa"
-#, fuzzy
msgid "Skip selection menu"
-msgstr "Valitse suoritustila"
+msgstr "Hyppää valintavalikon yli"
msgid "Start search mode"
-msgstr ""
+msgstr "Aloita hakutila"
msgid "Exit search mode"
-msgstr ""
+msgstr "Poistu hakutilasta"
msgid "General"
-msgstr ""
+msgstr "Yleinen"
-#, fuzzy
msgid "Navigation"
-msgstr "Tallenna määritykset"
+msgstr "Navigaatio"
-#, fuzzy
msgid "Selection"
-msgstr "Valitse allekirjoituksen asetus"
+msgstr "Valinta"
msgid "Search"
-msgstr ""
+msgstr "Haku"
msgid "Down"
-msgstr ""
+msgstr "Alas"
msgid "Up"
-msgstr ""
+msgstr "Ylös"
-#, fuzzy
msgid "Confirm"
-msgstr "Vahvista ja poistu"
+msgstr "Vahvista"
-#, fuzzy
msgid "Focus right"
-msgstr "Liiku oikealle"
+msgstr "Kohdista oikealle"
-#, fuzzy
msgid "Focus left"
-msgstr "Liiku vasemmalle"
+msgstr "Kohdista vasemmalle"
msgid "Toggle"
-msgstr ""
+msgstr "Vaihda"
-#, fuzzy
msgid "Show/Hide help"
-msgstr "Näytä apua"
+msgstr "Näytä/piilota apu"
msgid "Quit"
-msgstr ""
+msgstr "Poistu"
msgid "First"
-msgstr ""
+msgstr "Ensimmäinen"
msgid "Last"
-msgstr ""
+msgstr "Viimeinen"
-#, fuzzy
msgid "Select"
-msgstr "Valitse allekirjoituksen asetus"
+msgstr "Valitse"
msgid "Page Up"
-msgstr ""
+msgstr "Page up"
msgid "Page Down"
-msgstr ""
+msgstr "Page down"
msgid "Page up"
-msgstr ""
+msgstr "Page up"
-#, fuzzy
msgid "Page down"
-msgstr "Liikku alas"
+msgstr "Page down"
msgid "Page Left"
-msgstr ""
+msgstr "Sivu vasemmalle"
-#, fuzzy
msgid "Page Right"
-msgstr "Liiku oikealle"
+msgstr "Sivu oikealle"
msgid "Cursor up"
-msgstr ""
+msgstr "Kursori ylös"
-#, fuzzy
msgid "Cursor down"
-msgstr "Liikku alas"
+msgstr "Kursori alas"
-#, fuzzy
msgid "Cursor right"
-msgstr "Liiku oikealle"
+msgstr "Kursori oikealle"
-#, fuzzy
msgid "Cursor left"
-msgstr "Liiku vasemmalle"
+msgstr "Kursori vasemmalle"
msgid "Top"
-msgstr ""
+msgstr "Yläosa"
msgid "Bottom"
-msgstr ""
+msgstr "Pohja"
msgid "Home"
-msgstr ""
+msgstr "Home"
-#, fuzzy
msgid "End"
-msgstr "Käytössä"
+msgstr "End"
-#, fuzzy
msgid "Toggle option"
-msgstr "Alitaltion valinnat"
+msgstr "Vaihda optio"
msgid "Scroll Up"
-msgstr ""
+msgstr "Scrollaa ylös"
msgid "Scroll Down"
-msgstr ""
+msgstr "Scrollaa alas"
msgid "Scroll Left"
-msgstr ""
+msgstr "Scrollaa vasemmalle"
msgid "Scroll Right"
-msgstr ""
+msgstr "Scrollaa oikealle"
msgid "Scroll Home"
-msgstr ""
+msgstr "Scrollaa rivin alkuun"
msgid "Scroll End"
-msgstr ""
+msgstr "Scrollaa rivin loppuun"
msgid "Focus Next"
-msgstr ""
+msgstr "Kohdista seuraava"
msgid "Focus Previous"
-msgstr ""
+msgstr "Kohdista edeltävä"
msgid "Copy selected text"
-msgstr ""
+msgstr "Kopioi valittu teksti"
-#, fuzzy
msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
-msgstr "Sway tarvitsee pääsyn istuntoon (kokoelma laitteistoja, kuten näppäimistö, hiiri jne.)"
+msgstr "labwc tarvitsee pääsyn istuntoon (kokoelma laitteistoja, kuten näppäimistö, hiiri jne.)"
-#, fuzzy
msgid "Choose an option to give labwc access to your hardware"
-msgstr ""
-"\n"
-"\n"
-"Valitse asetus antaaksesi Swaylle pääsyn laitteistoosi"
+msgstr "Valitse asetus antaaksesi labwc:lle pääsyn laitteistoosi"
-#, fuzzy
msgid "niri needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
-msgstr "Sway tarvitsee pääsyn istuntoon (kokoelma laitteistoja, kuten näppäimistö, hiiri jne.)"
+msgstr "niri tarvitsee pääsyn istuntoon (kokoelma laitteistoja, kuten näppäimistö, hiiri jne.)"
-#, fuzzy
msgid "Choose an option to give niri access to your hardware"
-msgstr ""
-"\n"
-"\n"
-"Valitse asetus antaaksesi Swaylle pääsyn laitteistoosi"
+msgstr "Valitse asetus antaaksesi nirin pääsyn laitteistoosi"
-#, fuzzy
msgid "Mark/Unmark as ESP"
msgstr "Merkitse/poista käynnistyvä"
msgid "Package group:"
-msgstr ""
+msgstr "Pakettiryhmä:"
-#, fuzzy
msgid "Exit archinstall"
-msgstr "Archinstall kieli"
+msgstr "Poistu archinstall:ista"
-#, fuzzy
msgid "Reboot system"
-msgstr "Vaihda tiedostojärjestelmä"
+msgstr "Käynnistä järjestelmä uudelleen"
-#, fuzzy
msgid "chroot into installation for post-installation configurations"
msgstr "Haluatko chroot:in uuteen asennukseen ja suorittaa asennuksen jälkeiset asetukset?"
msgid "Installation completed"
-msgstr "Lataus valmis"
+msgstr "Asennus valmis"
-#, fuzzy
msgid "What would you like to do next?"
-msgstr "Haluatko käyttää BTRFS-pakkausta?"
+msgstr "Mitä haluaisit tehdä seuraavaksi?"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Select which mode to configure for \"{}\""
-msgstr "Valitse, mikä tila määritetään \"{}\", tai ohita ja käytä \"{}\" oletusta."
+msgstr "Valitse tila jolle tehdä konfiguraatio \"{}\""
-#, fuzzy
+# unsure
msgid "Incorrect credentials file decryption password"
-msgstr "Salauksen salasana"
+msgstr "Väärä salasana pääsytietojen salausta varten"
-#, fuzzy
msgid "Incorrect password"
-msgstr "Root salasana"
+msgstr "Väärä salasana"
-#, fuzzy
msgid "Credentials file decryption password"
-msgstr "Salauksen salasana"
+msgstr "Pääsytietotiedoston salauksen salasana"
-#, fuzzy
msgid "Do you want to encrypt the user_credentials.json file?"
-msgstr ""
-"Haluatko tallentaa {} asetustiedostoa seuraavaan paikkaan?\n"
-"\n"
-"{}"
+msgstr "Haluatko salata user_crendentials.json tiedoston?"
-#, fuzzy
msgid "Credentials file encryption password"
-msgstr "Salauksen salasana"
+msgstr "Pääsytietotiedoston salauksen salasana"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Repositories: {}"
-msgstr "Pakettivarasto"
+msgstr "Repositoriot: {}"
-#, fuzzy
msgid "New version available"
-msgstr "Ei HSM-laitteita saatavilla"
+msgstr "Uusi versio saatavilla"
-#, fuzzy
msgid "Passwordless login"
-msgstr "Salasana"
+msgstr "Salasanaton kirjautuminen"
msgid "Second factor login"
-msgstr ""
+msgstr "Toisen faktorin kirjautuminen"
msgid "Bluetooth"
-msgstr ""
+msgstr "Bluetooth"
-#, fuzzy
msgid "Would you like to configure Bluetooth?"
-msgstr "Haluatko käyttää BTRFS-pakkausta?"
+msgstr "Haluatko konfiguroida Bluetooth:in?"
msgid "Print service"
-msgstr ""
+msgstr "Printtauspalvelu"
-#, fuzzy
msgid "Would you like to configure the print service?"
-msgstr "Haluatko käyttää BTRFS-pakkausta?"
+msgstr "Haluatko konfiguroida printtauspalvelun"
-#, fuzzy
msgid "Power management"
-msgstr "Osioiden hallinta: {}"
+msgstr "Tehohallinta"
msgid "Authentication"
msgstr "Todennus"
msgid "Applications"
-msgstr ""
+msgstr "Applikaatiot"
msgid "U2F login method: "
-msgstr ""
+msgstr "U2F kirjautumismenetelmä"
msgid "Passwordless sudo: "
msgstr "Salasanaton sudo"
#, python-brace-format
msgid "Btrfs snapshot type: {}"
-msgstr ""
+msgstr "Btrfs tilankuvien tyyppi: {}"
msgid "Syncing the system..."
-msgstr ""
+msgstr "Järjestelmän synkronointi"
msgid "Value cannot be empty"
-msgstr ""
+msgstr "Arvo ei voi olla tyhjä"
msgid "Snapshot type"
-msgstr ""
+msgstr "Tilannekuvan tyyppi"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Snapshot type: {}"
-msgstr "Ympäristötyyppi: {}"
+msgstr "Tilannekuvan tyyppi: {}"
msgid "U2F login setup"
-msgstr ""
+msgstr "U2F kirjautumisen konfigurointi"
msgid "No U2F devices found"
-msgstr ""
+msgstr "U2F laitteita ei löydetty"
msgid "U2F Login Method"
-msgstr ""
+msgstr "U2F kirjautumisen menetelmä"
-#, fuzzy
msgid "Enable passwordless sudo?"
-msgstr "Anna salasana: "
+msgstr "Aktivoi salasanaton sudo?"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Setting up U2F device for user: {}"
-msgstr "Valitse HSM:ään käytettävä FIDO2-laite"
+msgstr "Määritetään U2F laitetta käyttäjälle: {}"
msgid "You may need to enter the PIN and then touch your U2F device to register it"
-msgstr ""
+msgstr "Voit joutua syöttämään PIN:in ja koskettaa U2F laitettasi rekisteröidäksesi sen"
msgid "Starting device modifications in "
-msgstr ""
+msgstr "Aloitetaan laitteen muokkausta "
-#, fuzzy
msgid "No network connection found"
-msgstr "Ei verkkoasetuksia"
+msgstr "Verkkoyhteyttä ei löydetty"
-#, fuzzy
msgid "Would you like to connect to a Wifi?"
-msgstr "Haluatko käyttää BTRFS-pakkausta?"
+msgstr "Haluaisitko liittyä langattomaan verkkoon?"
-#, fuzzy
msgid "No wifi interface found"
-msgstr "Määritetty {} liittymää"
+msgstr "Langattomia liittymiä ei löydetty"
-#, fuzzy
msgid "Select wifi network to connect to"
-msgstr "Valitse yksi määritettävä verkkoliitäntä"
+msgstr "Valitse wifiverkko johon yhdistää"
msgid "Scanning wifi networks..."
-msgstr ""
+msgstr "Etsitään wifiyhteyksiä..."
-#, fuzzy
msgid "No wifi networks found"
-msgstr "Ei verkkoasetuksia"
+msgstr "Wifiverkkoja ei löytynyt"
msgid "Failed setting up wifi"
-msgstr ""
+msgstr "Langattoman verkon määrittäminen epäonnistui"
-#, fuzzy
msgid "Enter wifi password"
-msgstr "Anna salasana: "
+msgstr "Anna wifi salasana"
msgid "Ok"
-msgstr ""
+msgstr "Ok"
msgid "Removable"
-msgstr ""
+msgstr "Irrotettava"
msgid "Install to removable location"
-msgstr ""
+msgstr "Asenna irrotettavaan sijaintiin"
msgid "Will install to /EFI/BOOT/ (removable location)"
-msgstr ""
+msgstr "Asennetaan sijaintiin /EFI/BOOT (irrotettava sijainti)"
msgid "Will install to standard location with NVRAM entry"
-msgstr ""
+msgstr "Asennetaan oletuskohteeseen NVRAM kohteella"
msgid "Would you like to install the bootloader to the default removable media search location?"
-msgstr ""
+msgstr "Haluatko asentaa käynnistyslataajan (bootloader) irrotettavan median oletushakukohteeseen?"
msgid "This installs the bootloader to /EFI/BOOT/BOOTX64.EFI (or similar) which is useful for:"
-msgstr ""
+msgstr "Tämä asentaa käynnistyslataajan sijaintiin /EFI/BOOT/BOOTX64.EFI (tai vastaava) joka on hyödyllistä seuraaville:"
msgid "USB drives or other portable external media."
-msgstr ""
+msgstr "USB levyt ja muu kannettava ulkoinen media."
msgid "Systems where you want the disk to be bootable on any computer."
-msgstr ""
+msgstr "Järjestelmät joissa haluat että levy käynnistyvä millä tahansa koneella."
msgid "Firmware that does not properly support NVRAM boot entries."
-msgstr ""
+msgstr "Firmware joka ei kunnolla tue NVRAM käynnistyskohteita."
msgid "Will install to /EFI/BOOT/ (removable location, safe default)"
-msgstr ""
+msgstr "Asennetaan sijaintiin /EFI/BOOT (irrotettava sijainti, varma oletusarvo)"
msgid "Will install to custom location with NVRAM entry"
-msgstr ""
+msgstr "Asennetaan omaan sijaintiin NVRAM kohteella"
msgid "Firmware that does not properly support NVRAM boot entries like most MSI motherboards,"
-msgstr ""
+msgstr "Firmware joka ei kunnolla tue NVRAM käynnistyskohteita kuten useimmat MSI emolevyt,"
msgid "most Apple Macs, many laptops..."
-msgstr ""
+msgstr "useimmat Apple Macit, monet kannettavat tietokoneet..."
-#, fuzzy
msgid "Language"
msgstr "Kieli"
msgid "Compression algorithm"
-msgstr ""
+msgstr "Kompressioalgoritmi"
-#, fuzzy
msgid "Only packages such as base, sudo, linux, linux-firmware, efibootmgr and optional profile packages are installed."
-msgstr "Vain paketit, kuten base, base-devel, linux, linux-firmware, efibootmgr ja valinnaiset profiili-paketit, asennetaan."
+msgstr "Vain paketit, kuten base, sudo, linux, linux-firmware, efibootmgr ja valinnaiset profiili-paketit ovat asennettu."
-#, fuzzy
msgid "Select zram compression algorithm:"
-msgstr "Valitse liitoskohta :"
+msgstr "Valitse zram kompression algoritmi:"
msgid "Use Network Manager (default backend)"
-msgstr ""
+msgstr "Käytä Network Manager (oletus backendi)"
msgid "Use Network Manager (iwd backend)"
-msgstr ""
+msgstr "Käytä Network Manager (iwd backendi)"
msgid "Firewall"
-msgstr ""
+msgstr "Palomuuri"
-#, fuzzy
msgid "Additional fonts"
-msgstr "Valinnaiset arkistot"
+msgstr "Lisäfontit"
-#, fuzzy
msgid "Select font packages to install"
-msgstr "Valitse asennettava käyttöliittymä"
+msgstr "Valitse asennettavat fonttipaketit"
msgid "Unicode font coverage for most languages"
-msgstr ""
+msgstr "Unicode fontin kattavuus useimmille kielille"
msgid "color emoji for browsers and apps"
-msgstr ""
+msgstr "väri emojit selaimille ja sovelluksille"
msgid "Chinese, Japanese, Korean characters"
-msgstr ""
+msgstr "Kiinalaiset, japanilaiset, korealaiset kirjaimet"
-#, fuzzy
msgid "Select audio configuration"
-msgstr "Tallenna käyttäjän määritykset"
+msgstr "Valitse äänen konfiguraatio"
-#, fuzzy
msgid "Enter credentials file decryption password"
-msgstr "Salauksen salasana"
+msgstr "Syötä pääsytietotiedoston salauksen salasana"
-#, fuzzy
msgid "Enter root password"
-msgstr "Anna salasana: "
+msgstr "Anna rootin salasana"
msgid "Select bootloader to install"
-msgstr ""
+msgstr "Valitse asennettava käynnistyslataaja"
-#, fuzzy
msgid "Configuration preview"
-msgstr "Asetukset"
+msgstr "Konfiguraation esikatselu"
-#, fuzzy
msgid "Enter a directory for the configuration(s) to be saved"
msgstr "Anna hakemisto tallennettaville määrityksille: "
-#, fuzzy
msgid "Select encryption type"
msgstr "Salaustyyppi"
-#, fuzzy
msgid "Select disks for the installation"
-msgstr "Valitse hostname asennukselle: "
+msgstr "Valitse levyasemat asennukselle"
-#, fuzzy
msgid "Enter a mountpoint"
msgstr "Valitse liitoskohta :"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Enter a size (default: {}): "
-msgstr "Anna loppu (oletus: {}): "
+msgstr "Anna koko (oletus: {}): "
-#, fuzzy
msgid "Enter subvolume name"
-msgstr "Alitaltion nimi "
+msgstr "Anna alitaltion nimi "
-#, fuzzy
msgid "Enter subvolume mountpoint"
-msgstr "Alitaltion liitoskohta"
+msgstr "Anna alitaltion liitoskohta"
-#, fuzzy
msgid "Select a disk configuration"
msgstr "Kiintolevyn määritys"
msgid "Enter root mount directory"
-msgstr ""
+msgstr "Syötä juuren liitoshakemisto"
msgid "You will use whatever drive-setup is mounted at the specified directory"
-msgstr ""
+msgstr "Käytät mitä tahansa levykonfiguraatiota joka on liitetty valittuun hakemistoon"
msgid "WARNING: Archinstall won't check the suitability of this setup"
-msgstr ""
+msgstr "VAROITUS: Archinstall ei tarkista konfiguraation soveltuvuutta"
-#, fuzzy
msgid "Select main filesystem"
-msgstr "Vaihda tiedostojärjestelmä"
+msgstr "Vaihda päätiedostojärjestelmä"
msgid "Enter a hostname"
-msgstr ""
+msgstr "Syötä isäntänimi (hostname)"
-#, fuzzy
msgid "Select timezone"
msgstr "Valitse aikavyöhyke"
-#, fuzzy
msgid "Enter the number of parallel downloads to be enabled"
-msgstr ""
-"Anna rinnakkaisten latausten määrä.\n"
-"\n"
-"Huomaa:\n"
+msgstr "Anna rinnakkaisten latausten määrä"
#, python-brace-format
msgid "Value must be between 1 and {}"
-msgstr ""
+msgstr "Arvon on oltava yhden ja {} välillä"
-#, fuzzy
msgid "Select which kernel(s) to install"
-msgstr "Valitse asennettava käyttöliittymä"
+msgstr "Valitse asennettavat ytimet (kernel)"
-#, fuzzy
msgid "Enter a respository name"
-msgstr "Pakettivarasto"
+msgstr "Syötä pakettivaraston nimi"
-#, fuzzy
msgid "Enter the repository url"
-msgstr "Vaihda mukautettu peilipaikka"
+msgstr "Syötä pakettivarason url"
msgid "Enter server url"
-msgstr ""
+msgstr "Syötä palvelimen url"
-#, fuzzy
msgid "Select mirror regions to be enabled"
-msgstr "Peilipaikan maa"
+msgstr "Valitse käytössä olevien peilien alueet"
-#, fuzzy
msgid "Select optional repositories to be enabled"
-msgstr "Valitse, valinnaiset lisävarastot jotka otetaan käyttöön"
+msgstr "Valitse valinnaiset repositoriot jotka otetaan käyttöön"
-#, fuzzy
msgid "Select an interface"
-msgstr "Poista liitäntä"
+msgstr "Valitse liitäntä"
-#, fuzzy
msgid "Choose network configuration"
-msgstr "Ei verkkoasetuksia"
+msgstr "Valitse verkkokonfiguraatio"
+
+msgid "Recommended: Network Manager for desktop, Manual for server"
+msgstr "Suositeltu: Network Manager työpöydälle, manuaali palvelinta varten"
+
+msgid "Warning: no network configuration selected. Network will need to be set up manually on the installed system."
+msgstr "Varoitus: verkkokonfiguraatiota ei löytynyt. Verkon on asetettava manuaalisesti asennetulla järjestelmällä."
-#, fuzzy
msgid "No packages found"
-msgstr "Määritetty {} liittymää"
+msgstr "Paketteja ei löytynyt"
-#, fuzzy
msgid "Select which greeter to install"
-msgstr "Valitse asennettava käyttöliittymä"
+msgstr "Valitse asennettava tervehtijä (greeter)"
-#, fuzzy
msgid "Select a profile type"
-msgstr "Valitut profiilit: "
+msgstr "Valitse profiilityyppi"
-#, fuzzy
msgid "Enter new password"
-msgstr "Anna salasana: "
+msgstr "Anna uusi salasana: "
msgid "Enter a username"
-msgstr ""
+msgstr "Anna käyttäjänimi"
-#, fuzzy
msgid "Enter a password"
msgstr "Anna salasana: "
msgid "The password did not match, please try again"
-msgstr ""
+msgstr "Salasanat eivät vastanneet, ole hyvä ja yritä uudelleen"
msgid "Password strength: Weak"
-msgstr ""
+msgstr "Salasanan vahvuus on heikko"
msgid "Password strength: Moderate"
-msgstr ""
+msgstr "Salasanan vahvuus on keskiverto"
msgid "Password strength: Strong"
-msgstr ""
+msgstr "Salasanan vahvuus on vahva"
msgid "The selected desktop profile requires a regular user to log in via the greeter"
-msgstr ""
+msgstr "Valittu työpöydän profiili vaati tavallisen käyttäjän kirjautumisen tervehtijällä"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Environment type: {} {}"
msgstr "Ympäristötyyppi: {}"
msgid "Input cannot be empty"
-msgstr ""
+msgstr "Syöttö ei voi olla tyhjä"
msgid "Recommended"
-msgstr ""
+msgstr "Suositeltu"
msgid "Package"
-msgstr ""
+msgstr "Paketti"
msgid "Curated selection of KDE Plasma packages"
-msgstr ""
+msgstr "Kuratoitu valikoima KDE Plasma paketteja"
msgid "Dependencies"
-msgstr ""
+msgstr "Riippuvuudet"
-#, fuzzy
msgid "Package group"
-msgstr "Määritetty {} liittymää"
+msgstr "Pakettiryhmä"
msgid "Extensive KDE Plasma installation"
-msgstr ""
+msgstr "Laaja KDE Plasman asennus"
msgid "Packages in group"
-msgstr ""
+msgstr "Paketit ryhmässä"
msgid "Minimal KDE Plasma installation"
-msgstr ""
+msgstr "Minimaalinen KDE Plasma asennus"
-#, fuzzy
msgid "Description"
-msgstr "Levyn salaus"
+msgstr "Kuvaus"
-#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
-msgstr "Valitse asennettava käyttöliittymä"
+msgstr "Valitse asennettavan KDE Plasman maku"
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
-msgstr ""
+msgstr "Arial/Times/Courier korvaus, kyrillisen kirjaimiston tuki Steam/pelejä varten"
msgid "wide Unicode coverage, good fallback font"
-msgstr ""
+msgstr "laaja Unicode kattavuus, hyvä varafontti "
+
+#, python-brace-format
+msgid "Setting up U2F login: {u2f_config.u2f_login_method.value}"
+msgstr "Määritellään U2F kirjautuminen: {u2f_config.u2f_login_method.value}"
+
+#, python-brace-format
+msgid "Default: {DEFAULT_ITER_TIME}ms, Recommended range: 1000-60000"
+msgstr "Oletus: {DEFAULT_ITER_TIME}ms, suositeltu väli: 1000-60000"
+
+#, python-brace-format
+msgid "Setting up U2F login: {}"
+msgstr "Määritetään U2F laitetta käyttäjälle: {}"
+
+#, python-brace-format
+msgid "Default: {}ms, Recommended range: 1000-60000"
+msgstr "Oletusarvo: 10000ms, suositeltu 1000-60000ms"
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} :"
diff --git a/archinstall/locales/ja/LC_MESSAGES/base.mo b/archinstall/locales/ja/LC_MESSAGES/base.mo
index 3ad3d1a2..96b625c6 100644
Binary files a/archinstall/locales/ja/LC_MESSAGES/base.mo and b/archinstall/locales/ja/LC_MESSAGES/base.mo differ
diff --git a/archinstall/locales/ja/LC_MESSAGES/base.po b/archinstall/locales/ja/LC_MESSAGES/base.po
index 8919d213..1e0f52e1 100644
--- a/archinstall/locales/ja/LC_MESSAGES/base.po
+++ b/archinstall/locales/ja/LC_MESSAGES/base.po
@@ -63,10 +63,10 @@ msgid "Write additional packages to install (space separated, leave blank to ski
msgstr "追加でインストールするパッケージを書く(スペースで区切る。無記入でスキップ): "
msgid "Copy ISO network configuration to installation"
-msgstr "ISO ネットワーク設定をインストール環境にコピー"
+msgstr "ISO のネットワーク設定をインストール環境にコピー"
msgid "Use NetworkManager (necessary for configuring internet graphically in GNOME and KDE)"
-msgstr "NetworkManager を使用(GNOME と KDE でインターネットをグラフィカルに設定するのに必要)"
+msgstr "ネットワークマネージャーを使用(GNOME と KDE でインターネットをグラフィカルに設定するのに必要)"
msgid "Select one network interface to configure"
msgstr "設定するネットワークインターフェイスを 1 つ選択"
@@ -224,7 +224,7 @@ msgid "Choose which locale language to use"
msgstr "使用するロケール言語を選択"
msgid "Choose which locale encoding to use"
-msgstr "使用するロケール エンコーディングを選択"
+msgstr "使用するロケールエンコーディングを選択"
msgid "Select one of the values shown below: "
msgstr "以下の値のいずれかを選択: "
@@ -256,6 +256,9 @@ msgstr "ロケール言語"
msgid "Locale encoding"
msgstr "ロケールエンコーディング"
+msgid "Console font"
+msgstr "コンソールフォント"
+
msgid "Drive(s)"
msgstr "ドライブ"
@@ -449,7 +452,7 @@ msgid "Pacman is already running, waiting maximum 10 minutes for it to terminate
msgstr "Pacman はすでに実行されており、終了するまで最大 10 分間待機します。"
msgid "Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall."
-msgstr "既存の pacman のロックが終了しませんでした。Archinstall を使用する前に、既存の pacman セッションをクリーンアップしてください。"
+msgstr "既存の pacman のロックが終了しませんでした。archinstall を使用する前に、既存の pacman セッションをすべてクリーンアップしてください。"
msgid "Choose which optional additional repositories to enable"
msgstr "オプションで有効にする追加リポジトリを選択"
@@ -823,6 +826,19 @@ msgstr "無効な入力です!有効な入力を使用して再試行してく
msgid "Parallel Downloads"
msgstr "並行ダウンロード"
+msgid "Pacman"
+msgstr "Pacman"
+
+msgid "Color"
+msgstr "カラー"
+
+#, python-brace-format
+msgid "Enter the number of parallel downloads (1-{})"
+msgstr "並列ダウンロード数を入力 (1-{})"
+
+msgid "Enable colored output for pacman"
+msgstr "pacman でカラー出力を有効にする"
+
msgid "ESC to skip"
msgstr "Esc でスキップ"
@@ -950,7 +966,7 @@ msgid "Encryption type"
msgstr "暗号化のタイプ"
msgid "Iteration time"
-msgstr "反復時間"
+msgstr "イテレーション時間"
msgid "Enter iteration time for LUKS encryption (in milliseconds)"
msgstr "LUKS 暗号化のイテレーション時間(ミリ秒単位)を入力"
@@ -1030,7 +1046,7 @@ msgstr "選択したプロファイルにインストールするグリーター
#, python-brace-format
msgid "Environment type: {}"
-msgstr "環境のタイプ: {}"
+msgstr "環境タイプ: {}"
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 "プロプライエタリの Nvidia ドライバーは Sway ではサポートされていません。問題が発生する可能性がありますが、よろしいですか?"
@@ -1173,7 +1189,7 @@ msgid "Locales"
msgstr "ロケール"
msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)"
-msgstr "NetworkManager を使用(GNOME と KDE でインターネットをグラフィカルに設定するのに必要)"
+msgstr "ネットワークマネージャーを使用(GNOME と KDE でインターネットをグラフィカルに設定するのに必要)"
msgid "Total: {} / {}"
msgstr "全体: {} / {}"
@@ -1206,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 "タイプ"
@@ -1296,7 +1327,7 @@ msgid "LVM disk encryption with more than 2 partitions is currently not supporte
msgstr "パーティションが2個を超える場合の LVM ディスク暗号化は、現在サポートしていません"
msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)"
-msgstr "NetworkManager を使用する(GNOME と KDE Plasma でインターネットをグラフィカルに設定するのに必要)"
+msgstr "ネットワークマネージャーを使用(GNOME と KDE Plasma でインターネットをグラフィカルに設定するのに必要)"
msgid "Select a LVM option"
msgstr "LVM のオプションを選択"
@@ -1550,7 +1581,7 @@ msgid "The specified configuration will be applied"
msgstr "指定された設定が適用されます"
msgid "Wipe"
-msgstr "ワイプ"
+msgstr "消去"
msgid "Mark/Unmark as XBOOTLDR"
msgstr "XBOOTLDR としてマーク/マーク解除"
@@ -1663,6 +1694,123 @@ msgstr "検索モードを開始"
msgid "Exit search mode"
msgstr "検索モードを終了"
+msgid "General"
+msgstr "一般"
+
+msgid "Navigation"
+msgstr "ナビゲーション"
+
+msgid "Selection"
+msgstr "選択"
+
+msgid "Search"
+msgstr "検索"
+
+msgid "Down"
+msgstr "下へ"
+
+msgid "Up"
+msgstr "上へ"
+
+msgid "Confirm"
+msgstr "確認"
+
+msgid "Focus right"
+msgstr "右にフォーカス"
+
+msgid "Focus left"
+msgstr "左にフォーカス"
+
+msgid "Toggle"
+msgstr "切り替え"
+
+msgid "Show/Hide help"
+msgstr "ヘルプを表示/隠す"
+
+msgid "Quit"
+msgstr "終了"
+
+msgid "First"
+msgstr "最初"
+
+msgid "Last"
+msgstr "最後"
+
+msgid "Select"
+msgstr "選択"
+
+msgid "Page Up"
+msgstr "上のページへ"
+
+msgid "Page Down"
+msgstr "下のページへ"
+
+msgid "Page up"
+msgstr "上のページへ"
+
+msgid "Page down"
+msgstr "下のページへ"
+
+msgid "Page Left"
+msgstr "左のページへ"
+
+msgid "Page Right"
+msgstr "右のページへ"
+
+msgid "Cursor up"
+msgstr "カーソルを上へ"
+
+msgid "Cursor down"
+msgstr "カースルを下へ"
+
+msgid "Cursor right"
+msgstr "カーソルを右へ"
+
+msgid "Cursor left"
+msgstr "カーソルを左へ"
+
+msgid "Top"
+msgstr "一番上へ"
+
+msgid "Bottom"
+msgstr "一番下へ"
+
+msgid "Home"
+msgstr "ホーム"
+
+msgid "End"
+msgstr "最後へ"
+
+msgid "Toggle option"
+msgstr "オプションを切り替え"
+
+msgid "Scroll Up"
+msgstr "上にスクロール"
+
+msgid "Scroll Down"
+msgstr "下にスクロール"
+
+msgid "Scroll Left"
+msgstr "左にスクロール"
+
+msgid "Scroll Right"
+msgstr "右にスクロール"
+
+msgid "Scroll Home"
+msgstr "ホームにスクロール"
+
+msgid "Scroll End"
+msgstr "一番下にスクロール"
+
+msgid "Focus Next"
+msgstr "次にフォーカス"
+
+msgid "Focus Previous"
+msgstr "前にフォーカス"
+
+msgid "Copy selected text"
+msgstr "選択したテキストをコピー"
+
msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
msgstr "labwc はお使いの Seat(キーボード、マウスなどのハードウェアデバイス群)にアクセスする必要があります"
@@ -1873,14 +2021,29 @@ msgid "Select zram compression algorithm:"
msgstr "zram 圧縮アルゴリズムを選択:"
msgid "Use Network Manager (default backend)"
-msgstr "NetworkManager(デフォルトのバックエンド)を使用する"
+msgstr "Network Manager を使用(デフォルトのバックエンド)"
msgid "Use Network Manager (iwd backend)"
-msgstr "NetworkManager (iwd バックエンド) を使用する"
+msgstr "Network Manager を使用(iwd バックエンド)"
msgid "Firewall"
msgstr "ファイアウォール"
+msgid "Additional fonts"
+msgstr "追加フォント"
+
+msgid "Select font packages to install"
+msgstr "インストールするフォントパッケージを選択"
+
+msgid "Unicode font coverage for most languages"
+msgstr "ほとんどの言語をカバーする Unicode フォント"
+
+msgid "color emoji for browsers and apps"
+msgstr "ブラウザやアプリ用のカラー絵文字"
+
+msgid "Chinese, Japanese, Korean characters"
+msgstr "日本語、中国語、韓国語の文字"
+
msgid "Select audio configuration"
msgstr "オーディオ設定を選択"
@@ -1888,7 +2051,7 @@ msgid "Enter credentials file decryption password"
msgstr "認証情報ファイルの復号パスワードを入力"
msgid "Enter root password"
-msgstr "ルートパスワードを入力"
+msgstr "root パスワードを入力"
msgid "Select bootloader to install"
msgstr "インストールするブートローダーを選択"
@@ -1970,6 +2133,12 @@ msgstr "インターフェースを選択"
msgid "Choose network configuration"
msgstr "ネットワーク設定を選択"
+msgid "Recommended: Network Manager for desktop, Manual for server"
+msgstr "推奨: デスクトップのネットワークマネージャー、サーバーのマニュアル"
+
+msgid "Warning: no network configuration selected. Network will need to be set up manually on the installed system."
+msgstr "警告: ネットワーク設定が選択されていません。インストール後のシステムで、ネットワークを手動で設定する必要があります。"
+
msgid "No packages found"
msgstr "パッケージが見つかりません"
@@ -1990,3 +2159,74 @@ msgstr "パスワードを入力"
msgid "The password did not match, please try again"
msgstr "パスワードが一致しません。もう一度試してください"
+
+msgid "Password strength: Weak"
+msgstr "パスワードの強度: 弱い"
+
+msgid "Password strength: Moderate"
+msgstr "パスワードの強度: 中程度"
+
+msgid "Password strength: Strong"
+msgstr "パスワードの強度: 強い"
+
+msgid "The selected desktop profile requires a regular user to log in via the greeter"
+msgstr "選択されたデスクトッププロファイルでは、一般ユーザーがグリーター経由でログインする必要があります"
+
+#, python-brace-format
+msgid "Environment type: {} {}"
+msgstr "環境タイプ: {} {}"
+
+msgid "Input cannot be empty"
+msgstr "入力は空にできません"
+
+msgid "Recommended"
+msgstr "推奨"
+
+msgid "Package"
+msgstr "パッケージ"
+
+msgid "Curated selection of KDE Plasma packages"
+msgstr "厳選した KDE Plasma パッケージ"
+
+msgid "Dependencies"
+msgstr "依存関係"
+
+msgid "Package group"
+msgstr "パッケージグループ"
+
+msgid "Extensive KDE Plasma installation"
+msgstr "広範囲の KDE Plasma インストール"
+
+msgid "Packages in group"
+msgstr "グループ内のパッケージ"
+
+msgid "Minimal KDE Plasma installation"
+msgstr "最小限の KDE Plasma インストール"
+
+msgid "Description"
+msgstr "説明"
+
+msgid "Select a flavor of KDE Plasma to install"
+msgstr "インストールする KDE Plasma のバージョンを選択"
+
+msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
+msgstr "Arial/Times/Courier フォントの代替、Steam/ゲームにおけるキリル文字のサポート"
+
+msgid "wide Unicode coverage, good fallback font"
+msgstr "Unicode を広くカバーする良い代替フォント"
+
+#, python-brace-format
+msgid "Setting up U2F login: {u2f_config.u2f_login_method.value}"
+msgstr "U2F ログインの設定: {u2f_config.u2f_login_method.value}"
+
+#, python-brace-format
+msgid "Default: {DEFAULT_ITER_TIME}ms, Recommended range: 1000-60000"
+msgstr "デフォルト: {DEFAULT_ITER_TIME}ms, 推奨範囲: 1000-60000"
+
+#, python-brace-format
+msgid "Setting up U2F login: {}"
+msgstr "U2F ログインの設定: {}"
+
+#, python-brace-format
+msgid "Default: {}ms, Recommended range: 1000-60000"
+msgstr "デフォルト: {}ms, 推奨範囲: 1000-60000"
diff --git a/archinstall/locales/languages.json b/archinstall/locales/languages.json
index 2dbcf3b4..22c9c9ec 100644
--- a/archinstall/locales/languages.json
+++ b/archinstall/locales/languages.json
@@ -42,7 +42,7 @@
{"abbr": "fo", "lang": "Faroese"},
{"abbr": "fa", "lang": "Persian"},
{"abbr": "fj", "lang": "Fijian"},
- {"abbr": "fi", "lang": "Finnish"},
+ {"abbr": "fi", "lang": "Finnish", "translated_lang": "Suomi"},
{"abbr": "fr", "lang": "French", "translated_lang": "Français"},
{"abbr": "fy", "lang": "Western Frisian"},
{"abbr": "ff", "lang": "Fulah"},
diff --git a/archinstall/locales/uk/LC_MESSAGES/base.mo b/archinstall/locales/uk/LC_MESSAGES/base.mo
index 1cb241b9..7c0230e6 100644
Binary files a/archinstall/locales/uk/LC_MESSAGES/base.mo and b/archinstall/locales/uk/LC_MESSAGES/base.mo differ
diff --git a/archinstall/locales/uk/LC_MESSAGES/base.po b/archinstall/locales/uk/LC_MESSAGES/base.po
index a178ac2d..fab48b2b 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 "Диск(и)"
@@ -1039,7 +1042,7 @@ msgid "Back"
msgstr "Назад"
msgid "Please chose which greeter to install for the chosen profiles: {}"
-msgstr "Будь ласка, виберіть, який екран привітання встановити для обраних профілів: {}"
+msgstr "Будь ласка, виберіть, який менеджер входу встановити для обраних профілів: {}"
#, python-brace-format
msgid "Environment type: {}"
@@ -1101,10 +1104,10 @@ msgid "Graphics driver"
msgstr "Графічні драйвери"
msgid "Greeter"
-msgstr "Дисплейний менеджер"
+msgstr "Менеджер входу"
msgid "Please chose which greeter to install"
-msgstr "Виберіть, який дисплейний менеджер встановлювати"
+msgstr "Виберіть, який менеджер входу встановлювати"
msgid "This is a list of pre-programmed default_profiles"
msgstr "Список попередньо налаштованих default_profiles"
@@ -1219,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 "Тип"
@@ -1903,7 +1921,7 @@ msgid "Snapshot type: {}"
msgstr "Тип знімка: {}"
msgid "U2F login setup"
-msgstr "Налаштування входу з пристроєм двофакторної авторизації"
+msgstr "Налаштування входу з пристроєм двофакторної автентифікації"
msgid "No U2F devices found"
msgstr "Не знайдено жодного пристрою двофакторної автентифікації"
@@ -1919,7 +1937,7 @@ msgid "Setting up U2F device for user: {}"
msgstr "Налаштування пристроя двофакторної автентифікації для користувача: {}"
msgid "You may need to enter the PIN and then touch your U2F device to register it"
-msgstr "Ви повинні написати PIN та потім торкнутися вашого пристрою двофакторної авторизації, щоб зареєструвати його"
+msgstr "Ви повинні написати PIN та потім торкнутися вашого пристрою двофакторної автентифікації, щоб зареєструвати його"
msgid "Starting device modifications in "
msgstr "Початок модифікацій пристрою в "
@@ -2115,6 +2133,12 @@ msgstr "Оберіть інтерфейс"
msgid "Choose network configuration"
msgstr "Оберіть конфігурацію мережі"
+msgid "Recommended: Network Manager for desktop, Manual for server"
+msgstr "Рекомендовано: Network Manager для робочого столу, ручне налаштування для сервера"
+
+msgid "Warning: no network configuration selected. Network will need to be set up manually on the installed system."
+msgstr "Попередження: конфігурацію мережі не обрано. Мережу доведеться налаштувати вручну на встановленій системі."
+
msgid "No packages found"
msgstr "Пакети не знайдено"
@@ -2148,45 +2172,61 @@ msgstr "Надійність пароля: Сильна"
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr "Обраний профіль робочого столу вимагає входу звичайного користувача через менеджер входу"
-#, fuzzy, python-brace-format
+#, python-brace-format
msgid "Environment type: {} {}"
-msgstr "Тип середовища: {}"
+msgstr "Тип середовища: {} {}"
-#, fuzzy
msgid "Input cannot be empty"
msgstr "Значення не може бути пустим"
msgid "Recommended"
-msgstr ""
+msgstr "Рекомендовано"
-#, fuzzy
msgid "Package"
-msgstr "Група пакетів:"
+msgstr "Пакет"
msgid "Curated selection of KDE Plasma packages"
-msgstr ""
+msgstr "Підібраний набір пакетів KDE Plasma"
msgid "Dependencies"
-msgstr ""
+msgstr "Залежності"
-#, fuzzy
msgid "Package group"
-msgstr "Група пакетів:"
+msgstr "Група пакетів"
msgid "Extensive KDE Plasma installation"
-msgstr ""
+msgstr "Розширене встановлення KDE Plasma"
-#, fuzzy
msgid "Packages in group"
-msgstr "Група пакетів:"
+msgstr "Пакети у групі"
msgid "Minimal KDE Plasma installation"
-msgstr ""
+msgstr "Мінімальне встановлення KDE Plasma"
-#, fuzzy
msgid "Description"
-msgstr "Шифрування диска"
+msgstr "Опис"
-#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
-msgstr "Оберіть завантажувач для встановлення"
+msgstr "Оберіть варіант KDE Plasma для встановлення"
+
+msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
+msgstr "заміна Arial/Times/Courier, підтримка кирилиці для Steam та ігор"
+
+msgid "wide Unicode coverage, good fallback font"
+msgstr "широке покриття Unicode, хороший резервний шрифт"
+
+#, python-brace-format
+msgid "Setting up U2F login: {u2f_config.u2f_login_method.value}"
+msgstr "Налаштування входу з пристроєм двофакторної автентифікації: {u2f_config.u2f_login_method.value}"
+
+#, python-brace-format
+msgid "Default: {DEFAULT_ITER_TIME}ms, Recommended range: 1000-60000"
+msgstr "Стандартно: {DEFAULT_ITER_TIME}мс, Рекомендований діапазон - 1000-60000"
+
+#, python-brace-format
+msgid "Setting up U2F login: {}"
+msgstr "Налаштування входу з пристроєм двофакторної автентифікації: {}"
+
+#, python-brace-format
+msgid "Default: {}ms, Recommended range: 1000-60000"
+msgstr "Стандартно: {}мс, Рекомендований діапазон - 1000-60000"
diff --git a/archinstall/main.py b/archinstall/main.py
index cf0e42f6..505652a4 100644
--- a/archinstall/main.py
+++ b/archinstall/main.py
@@ -18,7 +18,7 @@ from archinstall.lib.packages.util import check_version_upgrade
from archinstall.lib.pacman.pacman import Pacman
from archinstall.lib.translationhandler import tr, translation_handler
from archinstall.lib.utils.util import running_from_iso
-from archinstall.tui.ui.components import tui
+from archinstall.tui.components import tui
def _log_sys_info() -> None:
diff --git a/archinstall/scripts/guided.py b/archinstall/scripts/guided.py
index 34133722..899683f2 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
@@ -21,7 +22,7 @@ from archinstall.lib.output import debug, error, info
from archinstall.lib.packages.util import check_version_upgrade
from archinstall.lib.profile.profiles_handler import profile_handler
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.components import tui
+from archinstall.tui.components import tui
def show_menu(
@@ -211,12 +212,21 @@ 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
if not arch_config_handler.args.silent:
aborted = False
- res: bool = tui.run(config.confirm_config)
+ res: bool = tui.run(lambda: config.confirm_config(show_install_warnings=True))
if not res:
debug('Installation aborted')
diff --git a/archinstall/scripts/minimal.py b/archinstall/scripts/minimal.py
index 4e897142..ee4b49c7 100644
--- a/archinstall/scripts/minimal.py
+++ b/archinstall/scripts/minimal.py
@@ -12,7 +12,7 @@ from archinstall.lib.network.network_handler import install_network_config
from archinstall.lib.output import debug, error, info
from archinstall.lib.profile.profiles_handler import profile_handler
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.components import tui
+from archinstall.tui.components import tui
def perform_installation(arch_config_handler: ArchConfigHandler) -> None:
@@ -77,7 +77,7 @@ async def main(arch_config_handler: ArchConfigHandler | None = None) -> None:
if not arch_config_handler.args.silent:
aborted = False
- res: bool = tui.run(config.confirm_config)
+ res: bool = tui.run(lambda: config.confirm_config(show_install_warnings=True))
if not res:
debug('Installation aborted')
diff --git a/archinstall/scripts/only_hd.py b/archinstall/scripts/only_hd.py
index afb1f919..5df72965 100644
--- a/archinstall/scripts/only_hd.py
+++ b/archinstall/scripts/only_hd.py
@@ -10,7 +10,7 @@ from archinstall.lib.installer import Installer
from archinstall.lib.menu.util import delayed_warning
from archinstall.lib.output import debug, error
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.components import tui
+from archinstall.tui.components import tui
def show_menu(arch_config_handler: ArchConfigHandler) -> None:
diff --git a/archinstall/tui/ui/components.py b/archinstall/tui/components.py
similarity index 99%
rename from archinstall/tui/ui/components.py
rename to archinstall/tui/components.py
index c51d35f9..f92364bb 100644
--- a/archinstall/tui/ui/components.py
+++ b/archinstall/tui/components.py
@@ -21,8 +21,8 @@ from textual.worker import WorkerCancelled
from archinstall.lib.output import debug
from archinstall.lib.translationhandler import tr
-from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
-from archinstall.tui.ui.result import Result, ResultType
+from archinstall.tui.menu_item import MenuItem, MenuItemGroup
+from archinstall.tui.result import Result, ResultType
ValueT = TypeVar('ValueT')
@@ -350,7 +350,7 @@ class OptionListScreen(BaseScreen[ValueT]):
def _set_preview(self, item_id: str) -> None:
if self._preview_location is None:
- return None
+ return
preview_widget = self.query_one('#preview_content', Label)
item = self._group.find_by_id(item_id)
@@ -530,7 +530,7 @@ class SelectListScreen(BaseScreen[ValueT]):
selection_list = self.query_one(SelectionList)
if not selection_list.has_focus or event.key != 'enter':
- return None
+ return
if len(self._selected_items) < 1:
index = selection_list.highlighted
@@ -743,7 +743,7 @@ class ConfirmationScreen(BaseScreen[ValueT]):
if self._is_btn_focus():
item = self._group.focus_item
if not item:
- return None
+ return
_ = self.dismiss(Result(ResultType.Selection, _item=item))
diff --git a/archinstall/tui/curses_menu.py b/archinstall/tui/curses_menu.py
deleted file mode 100644
index b64a800c..00000000
--- a/archinstall/tui/curses_menu.py
+++ /dev/null
@@ -1,1369 +0,0 @@
-import curses
-import os
-import signal
-import sys
-from abc import ABCMeta, abstractmethod
-from collections.abc import Callable
-from curses.ascii import isprint
-from curses.textpad import Textbox
-from types import FrameType, TracebackType
-from typing import ClassVar, Literal, Self, override
-
-from archinstall.lib.translationhandler import tr
-from archinstall.tui.help import Help
-from archinstall.tui.menu_item import MenuItem, MenuItemGroup, MenuItemsState
-from archinstall.tui.result import Result, ResultType
-from archinstall.tui.types import (
- SCROLL_INTERVAL,
- STYLE,
- Alignment,
- Chars,
- FrameDim,
- FrameProperties,
- FrameStyle,
- MenuKeys,
- Orientation,
- PreviewStyle,
- ViewportEntry,
-)
-
-
-class AbstractCurses[ValueT](metaclass=ABCMeta):
- def __init__(self) -> None:
- self._help_window = self._set_help_viewport()
-
- @abstractmethod
- def resize_win(self) -> None:
- pass
-
- @abstractmethod
- def kickoff(self, win: curses.window) -> Result[ValueT]:
- pass
-
- def clear_all(self) -> None:
- Tui.t().screen.clear()
- Tui.t().screen.refresh()
-
- def clear_help_win(self) -> None:
- self._help_window.erase()
-
- def _set_help_viewport(self) -> Viewport:
- max_height, max_width = Tui.t().max_yx
- height = max_height - 10
-
- max_help_width = max([len(line) for line in Help.get_help_text().split('\n')])
- x_start = int((max_width / 2) - (max_help_width / 2))
-
- return Viewport(
- max_help_width + 10,
- height,
- x_start,
- int((max_height / 2) - height / 2),
- frame=FrameProperties.min(tr('Archinstall help')),
- )
-
- def _confirm_interrupt(self, warning: str) -> bool:
- while True:
- result = SelectMenu[bool](
- MenuItemGroup.yes_no(),
- header=warning,
- alignment=Alignment.CENTER,
- columns=2,
- orientation=Orientation.HORIZONTAL,
- ).run()
-
- match result.type_:
- case ResultType.Selection:
- if result.item() == MenuItem.yes():
- return True
-
- return False
-
- def help_text(self) -> str:
- return tr('Press Ctrl+h for help')
-
- def _show_help(self) -> None:
- help_text = Help.get_help_text()
- lines = help_text.split('\n')
-
- entries = [ViewportEntry('', 0, 0, STYLE.NORMAL)]
- entries += [ViewportEntry(f' {e} ', idx + 1, 0, STYLE.NORMAL) for idx, e in enumerate(lines)]
- self._help_window.update(entries, 0)
-
- def get_header_entries(self, header: str) -> list[ViewportEntry]:
- full_header = []
- rows = header.split('\n')
-
- for cur_row, line in enumerate(rows):
- full_header += [ViewportEntry(line, cur_row, 0, STYLE.NORMAL)]
-
- return full_header
-
-
-class AbstractViewport:
- def __init__(self) -> None:
- pass
-
- def add_str(self, screen: curses.window, row: int, col: int, text: str, color: STYLE) -> None:
- try:
- screen.addstr(row, col, text, Tui.t().get_color(color))
- except curses.error:
- # debug(f'Curses error while adding string to viewport: {text}')
- pass
-
- def add_frame(
- self,
- entries: list[ViewportEntry],
- max_width: int,
- max_height: int,
- frame: FrameProperties,
- scroll_pct: int | None = None,
- ) -> list[ViewportEntry]:
- if not entries:
- return []
-
- dim = self._get_frame_dim(entries, max_width, max_height, frame)
-
- h_bar = Chars.Horizontal * (dim.x_delta() - 2)
- top_ve = self._get_top(dim, h_bar, frame, scroll_pct)
- bottom_ve = self._get_bottom(dim, h_bar, scroll_pct)
-
- frame_border = []
-
- for i in range(1, dim.height):
- frame_border += [ViewportEntry(Chars.Vertical, i, dim.x_start, STYLE.NORMAL)]
-
- frame_border += self._get_right_frame(dim, scroll_pct)
-
- # adjust the original rows and cols of the entries as
- # they need to be shrunk by 1 to make space for the frame
- entries = self._adjust_entries(entries)
-
- framed_entries = [
- top_ve,
- bottom_ve,
- *frame_border,
- *entries,
- ]
-
- return framed_entries
-
- def align_center(self, lines: list[ViewportEntry], width: int) -> int:
- max_col = self._max_col(lines)
- x_offset = int((width / 2) - (max_col / 2))
- return x_offset
-
- def _get_right_frame(
- self,
- dim: FrameDim,
- scroll_percentage: int | None = None,
- ) -> list[ViewportEntry]:
- right_frame = {}
- scroll_height = int(dim.height * scroll_percentage // 100) if scroll_percentage else 0
-
- if scroll_height <= 0:
- scroll_height = 1
- elif scroll_height >= dim.height:
- scroll_height = dim.height - 1
-
- for i in range(1, dim.height):
- right_frame[i] = ViewportEntry(Chars.Vertical, i, dim.x_end - 1, STYLE.NORMAL)
-
- if scroll_percentage is not None:
- right_frame[0] = ViewportEntry(Chars.Triangle_up, 0, dim.x_end - 1, STYLE.NORMAL)
- right_frame[scroll_height] = ViewportEntry(Chars.Block, scroll_height, dim.x_end - 1, STYLE.NORMAL)
- right_frame[dim.height] = ViewportEntry(Chars.Triangle_down, dim.height, dim.x_end - 1, STYLE.NORMAL)
-
- return list(right_frame.values())
-
- def _get_top(
- self,
- dim: FrameDim,
- h_bar: str,
- frame: FrameProperties,
- scroll_percentage: int | None = None,
- ) -> ViewportEntry:
- top = self._replace_str(h_bar, 1, f' {frame.header} ') if frame.header else h_bar
-
- if scroll_percentage is None:
- top = Chars.Upper_left + top + Chars.Upper_right
- else:
- top = Chars.Upper_left + top[:-1]
-
- return ViewportEntry(top, 0, dim.x_start, STYLE.NORMAL)
-
- def _get_bottom(
- self,
- dim: FrameDim,
- h_bar: str,
- scroll_pct: int | None = None,
- ) -> ViewportEntry:
- if scroll_pct is None:
- bottom = Chars.Lower_left + h_bar + Chars.Lower_right
- else:
- bottom = Chars.Lower_left + h_bar[:-1]
-
- return ViewportEntry(bottom, dim.height, dim.x_start, STYLE.NORMAL)
-
- def _get_frame_dim(
- self,
- entries: list[ViewportEntry],
- max_width: int,
- max_height: int,
- frame: FrameProperties,
- ) -> FrameDim:
- rows = self._assemble_entries(entries).split('\n')
- header_len = len(frame.header) if frame.header else 0
- header_len += 3 # for header padding
-
- if frame.w_frame_style == FrameStyle.MIN:
- frame_start = min([e.col for e in entries])
- max_row_cols = [(e.col + len(e.text) + 1) for e in entries]
- max_row_cols.append(header_len)
- frame_end = max(max_row_cols)
-
- # 2 for frames, 1 for extra space start away from frame
- # must align with def _adjust_entries
- # 2 for frame
- frame_end += 3
-
- frame_height = len(rows) + 1
- if frame_height > max_height:
- frame_height = max_height
- else:
- frame_start = 0
- frame_end = max_width
- frame_height = max_height - 1
-
- return FrameDim(frame_start, frame_end, frame_height)
-
- def _adjust_entries(
- self,
- entries: list[ViewportEntry],
- ) -> list[ViewportEntry]:
- for entry in entries:
- # top row frame offset
- entry.row += 1
- # left side frame offset + extra space from frame to start from
- entry.col += 2
-
- return entries
-
- def _num_unique_rows(self, entries: list[ViewportEntry]) -> int:
- return len(set([e.row for e in entries]))
-
- def _max_col(self, entries: list[ViewportEntry]) -> int:
- values = [len(e.text) + e.col for e in entries]
- if not values:
- return 0
- return max(values)
-
- def _replace_str(self, text: str, index: int = 0, replacement: str = '') -> str:
- len_replace = len(replacement)
- return f'{text[:index]}{replacement}{text[index + len_replace :]}'
-
- def _assemble_entries(self, entries: list[ViewportEntry]) -> str:
- if not entries:
- return ''
-
- max_col = self._max_col(entries)
- view = [max_col * ' '] * self._num_unique_rows(entries)
-
- for e in entries:
- view[e.row] = self._replace_str(view[e.row], e.col, e.text)
-
- view = [v.rstrip() for v in view]
-
- return '\n'.join(view)
-
-
-class EditViewport(AbstractViewport):
- def __init__(
- self,
- width: int,
- edit_width: int,
- edit_height: int,
- x_start: int,
- y_start: int,
- process_key: Callable[[int], int],
- frame: FrameProperties,
- alignment: Alignment = Alignment.CENTER,
- hide_input: bool = False,
- ) -> None:
- super().__init__()
-
- self._max_height, self._max_width = Tui.t().max_yx
-
- self._width = width
- self._edit_width = edit_width
- self._edit_height = edit_height
- self.x_start = x_start
- self.y_start = y_start
- self._process_key_cb = process_key
- self._frame = frame
- self._alignment = alignment
- self._hide_input = hide_input
-
- self._main_win: curses.window | None = None
- self._edit_win: curses.window | None = None
- self._textbox: Textbox | None = None
-
- self._init_wins()
-
- def _init_wins(self) -> None:
- self._main_win = curses.newwin(self._edit_height, self._width, self.y_start, 0)
- self._main_win.nodelay(False)
-
- x_offset = 0
- if self._alignment == Alignment.CENTER:
- x_offset = int((self._width / 2) - (self._edit_width / 2))
-
- self._edit_win = self._main_win.subwin(
- 1,
- self._edit_width - 2,
- self.y_start + 1,
- self.x_start + x_offset + 1,
- )
-
- def update(self) -> None:
- if not self._main_win:
- return
-
- self._main_win.erase()
-
- framed = self.add_frame(
- [ViewportEntry('', 0, 0, STYLE.NORMAL)],
- self._edit_width,
- 3,
- frame=self._frame,
- )
-
- x_offset = 0
- if self._alignment == Alignment.CENTER:
- x_offset = self.align_center(framed, self._width)
-
- for row in framed:
- self.add_str(
- self._main_win,
- row.row,
- row.col + x_offset,
- row.text,
- row.style,
- )
-
- self._main_win.refresh()
-
- def textbox_value(self) -> str:
- if not self._textbox:
- return ''
- return self._textbox.gather().strip()
-
- def erase(self) -> None:
- if self._main_win:
- self._main_win.erase()
- self._main_win.refresh()
-
- def edit(self, default_text: str | None = None) -> None:
- assert self._edit_win and self._main_win
-
- self._edit_win.erase()
-
- if default_text is not None and len(default_text) > 0:
- self._edit_win.addstr(0, 0, default_text)
-
- # if this gets initialized multiple times it will be an overlay
- # and ENTER has to be pressed multiple times to accept
- if not self._textbox:
- self._textbox = Textbox(self._edit_win)
- self._main_win.refresh()
-
- self._textbox.edit(self._process_key_cb)
-
-
-class Viewport(AbstractViewport):
- def __init__(
- self,
- width: int,
- height: int,
- x_start: int,
- y_start: int,
- frame: FrameProperties | None = None,
- alignment: Alignment = Alignment.LEFT,
- ):
- super().__init__()
-
- self.width = width
- self.height = height
- self.x_start = x_start
- self.y_start = y_start
- self._frame = frame
- self._alignment = alignment
-
- self._main_win = curses.newwin(self.height, self.width, self.y_start, self.x_start)
- self._main_win.nodelay(False)
- self._main_win.standout()
-
- def getch(self) -> int:
- return self._main_win.getch()
-
- def erase(self) -> None:
- self._main_win.erase()
- self._main_win.refresh()
-
- def update(
- self,
- entries: list[ViewportEntry],
- cur_pos: int = 0,
- scroll_pos: int | None = None,
- ) -> None:
- # self._state = self._get_viewport_state(lines, cur_pos, scroll_pos)
- # visible_entries = self._adjust_entries_row(self._state.displayed_entries)
- visible_entries = entries
-
- if self._frame:
- visible_entries = self.add_frame(
- visible_entries,
- self.width,
- self.height,
- frame=self._frame,
- scroll_pct=scroll_pos,
- )
-
- x_offset = 0
- if self._alignment == Alignment.CENTER:
- x_offset = self.align_center(visible_entries, self.width)
-
- self._main_win.erase()
-
- for entry in visible_entries:
- self.add_str(
- self._main_win,
- entry.row,
- entry.col + x_offset,
- entry.text,
- entry.style,
- )
-
- self._main_win.refresh()
-
-
-class EditMenu(AbstractCurses[str]):
- def __init__(
- self,
- title: str,
- edit_width: int = 50,
- header: str | None = None,
- validator: Callable[[str | None], str | None] | None = None,
- allow_skip: bool = False,
- allow_reset: bool = False,
- reset_warning_msg: str | None = None,
- alignment: Alignment = Alignment.CENTER,
- default_text: str | None = None,
- hide_input: bool = False,
- ):
- super().__init__()
-
- self._max_height, self._max_width = Tui.t().max_yx
-
- self._header = header
-
- self._header_entries = []
- if header:
- self._header_entries = self.get_header_entries(header)
-
- self._validator = validator
- self._allow_skip = allow_skip
- self._allow_reset = allow_reset
- self._interrupt_warning = reset_warning_msg
- self._alignment = alignment
- self._edit_width = edit_width
- self._default_text = default_text
- self._hide_input = hide_input
-
- if self._interrupt_warning is None:
- self._interrupt_warning = tr('Are you sure you want to reset this setting?') + '\n'
-
- title = f'* {title}' if not self._allow_skip else title
- self._frame = FrameProperties(title, FrameStyle.MAX)
-
- self._title_vp: Viewport | None = None
- self._header_vp: Viewport | None = None
- self._input_vp: EditViewport | None = None
- self._info_vp: Viewport | None = None
-
- self._set_default_info = True
- self._only_ascii_text = ViewportEntry(tr('Only ASCII characters are supported'), 0, 0, STYLE.NORMAL)
-
- self._init_viewports()
-
- self._last_state: Result[str] | None = None
- self._help_active = False
-
- self._current_text = default_text or ''
- self._real_input = default_text or ''
-
- def _init_viewports(self) -> None:
- y_offset = 0
-
- self._title_vp = Viewport(self._max_width, 2, 0, y_offset)
- y_offset += 2
-
- if self._header_entries:
- header_height = len(self._header_entries)
- self._header_vp = Viewport(self._max_width, header_height, 0, y_offset, alignment=self._alignment)
- y_offset += header_height
-
- self._input_vp = EditViewport(
- self._max_width,
- self._edit_width,
- 3,
- 0,
- y_offset,
- self._process_edit_key,
- frame=self._frame,
- alignment=self._alignment,
- hide_input=self._hide_input,
- )
-
- y_offset += 3
- self._info_vp = Viewport(self._max_width, 1, 0, y_offset, alignment=self._alignment)
-
- def input(self) -> Result[str]:
- result = Tui.run(self)
-
- assert not result.has_item() or isinstance(result.text(), str)
-
- self._clear_all()
- return result
-
- @override
- def resize_win(self) -> None:
- self._draw()
-
- def _clear_all(self) -> None:
- if self._title_vp:
- self._title_vp.erase()
- if self._header_vp:
- self._header_vp.erase()
- if self._input_vp:
- self._input_vp.erase()
- if self._info_vp:
- self._info_vp.erase()
-
- def _get_input_text(self) -> str | None:
- assert self._input_vp
- assert self._info_vp
-
- text = self._real_input
-
- self.clear_all()
-
- if self._validator:
- if (err := self._validator(text)) is not None:
- self.clear_all()
- entry = ViewportEntry(err, 0, 0, STYLE.ERROR)
- self._info_vp.update([entry], 0)
- self._set_default_info = False
-
- if self._hide_input:
- self._real_input = ''
-
- return None
-
- return text
-
- def _draw(self) -> None:
- if self._title_vp:
- help_text = self.help_text()
- help_entry = ViewportEntry(help_text, 0, 0, STYLE.NORMAL)
- self._title_vp.update([help_entry], 0)
-
- if self._header_entries and self._header_vp:
- self._header_vp.update(self._header_entries, 0)
-
- if self._input_vp:
- self._input_vp.update()
-
- if self._set_default_info and self._info_vp:
- self._info_vp.update([self._only_ascii_text], 0)
-
- self._input_vp.edit(default_text=self._real_input)
-
- @override
- def kickoff(self, win: curses.window) -> Result[str]:
- try:
- self._draw()
- except KeyboardInterrupt:
- if not self._handle_interrupt():
- return self.kickoff(win)
- else:
- self._last_state = Result(ResultType.Reset, None)
-
- if self._last_state is None:
- return self.kickoff(win)
-
- if self._last_state.type_ == ResultType.Selection:
- text = self._get_input_text()
-
- if text is None:
- return self.kickoff(win)
- else:
- if not text and not self._allow_skip:
- return self.kickoff(win)
-
- return Result(ResultType.Selection, text)
-
- return self._last_state
-
- def _process_edit_key(self, key: int) -> int:
- key_handles = MenuKeys.from_ord(key)
-
- if self._help_active:
- if MenuKeys.ESC in key_handles:
- self._help_active = False
- self.clear_help_win()
- return 7
- return 0
-
- # remove standard keys from the list of key handles
- key_handles = [key for key in key_handles if key != MenuKeys.STD_KEYS]
-
- # regular key stroke should be passed to the editor
- if key_handles:
- special_key = key_handles[0]
-
- match special_key:
- case MenuKeys.HELP:
- assert self._input_vp
- self._current_text = self._input_vp.textbox_value()
- self._clear_all()
- self._help_active = True
- self._show_help()
- return 0
- case MenuKeys.ESC:
- if self._allow_skip:
- self._last_state = Result(ResultType.Skip, None)
- key = 7
- case MenuKeys.ACCEPT:
- self._last_state = Result(ResultType.Selection, None)
- key = 7
- case MenuKeys.BACKSPACE:
- if len(self._real_input) > 0:
- self._real_input = self._real_input[:-1]
- case _:
- if isprint(key):
- self._real_input += chr(key)
- if self._hide_input:
- key = 42
- else:
- try:
- if isprint(key):
- self._real_input += chr(key)
- if self._hide_input:
- key = 42
- except Exception:
- pass
-
- return key
-
- def _handle_interrupt(self) -> bool:
- if self._allow_reset:
- if self._interrupt_warning:
- return self._confirm_interrupt(self._interrupt_warning)
- else:
- return False
-
- return True
-
-
-class SelectMenu[ValueT](AbstractCurses[ValueT]):
- def __init__(
- self,
- group: MenuItemGroup,
- multi: bool = False,
- orientation: Orientation = Orientation.VERTICAL,
- alignment: Alignment = Alignment.LEFT,
- columns: int = 1,
- column_spacing: int = 10,
- header: str | None = None,
- frame: FrameProperties | None = None,
- cursor_char: str = '>',
- search_enabled: bool = True,
- allow_skip: bool = False,
- allow_reset: bool = False,
- reset_warning_msg: str | None = None,
- preview_style: PreviewStyle = PreviewStyle.NONE,
- preview_size: float | Literal['auto'] = 0.2,
- preview_frame: FrameProperties | None = None,
- additional_title: str | None = None,
- ):
- super().__init__()
-
- self._multi = multi
- self._cursor_char = f'{cursor_char} '
- self._search_enabled = search_enabled
- self._allow_skip = allow_skip
- self._allow_reset = allow_reset
- self._active_search = False
- self._help_active = False
- self._item_group = group
- self._preview_style = preview_style
- self._preview_frame = preview_frame
- self._orientation = orientation
- self._column_spacing = column_spacing
- self._alignment = alignment
- self._footers = self._footer_entries()
- self._frame = frame
- self._interrupt_warning = reset_warning_msg
- self._header = header
- self._additional_title = additional_title
-
- self._header_entries = []
- if header:
- self._header_entries = self.get_header_entries(header)
-
- if self._interrupt_warning is None:
- self._interrupt_warning = tr('Are you sure you want to reset this setting?') + '\n'
-
- if self._orientation == Orientation.HORIZONTAL:
- self._horizontal_cols = columns
- else:
- self._horizontal_cols = 1
-
- self._prev_scroll_pos: int = 0
-
- self._visible_entries: list[ViewportEntry] = []
- self._max_height, self._max_width = Tui.t().max_yx
-
- self._title_vp: Viewport | None = None
- self._header_vp: Viewport | None = None
- self._footer_vp: Viewport | None = None
- self._menu_vp: Viewport | None = None
- self._preview_vp: Viewport | None = None
-
- self._init_viewports(preview_size)
-
- assert self._menu_vp is not None
- self._items_state: MenuItemsState = MenuItemsState( # type: ignore[unreachable]
- self._item_group,
- total_cols=self._horizontal_cols,
- total_rows=self._menu_vp.height,
- with_frame=self._frame is not None,
- )
-
- def run(self) -> Result[ValueT]:
- result = Tui.run(self)
- self._clear_all()
- return result
-
- @override
- def kickoff(self, win: curses.window) -> Result[ValueT]:
- self._draw()
-
- while True:
- try:
- if not self._help_active:
- self._draw()
-
- key = win.getch()
-
- ret = self._process_input_key(key)
-
- if ret is not None:
- return ret
- except KeyboardInterrupt:
- if self._handle_interrupt():
- return Result(ResultType.Reset, None)
- else:
- return self.kickoff(win)
-
- @override
- def resize_win(self) -> None:
- self._draw()
-
- def _clear_all(self) -> None:
- self.clear_help_win()
-
- if self._header_vp:
- self._header_vp.erase()
- if self._menu_vp:
- self._menu_vp.erase()
- if self._preview_vp:
- self._preview_vp.erase()
- if self._footer_vp:
- self._footer_vp.erase()
- if self._title_vp:
- self._title_vp.erase()
-
- def _footer_entries(self) -> list[ViewportEntry]:
- if self._active_search:
- filter_pattern = self._item_group.filter_pattern
- return [ViewportEntry(f'/{filter_pattern}', 0, 0, STYLE.NORMAL)]
-
- return []
-
- def _init_viewports(self, arg_prev_size: float | Literal['auto']) -> None:
- footer_height = 2 # possible filter at the bottom
- y_offset = 0
-
- self._title_vp = Viewport(self._max_width, 2, 0, y_offset)
- y_offset += 2
-
- if self._header_entries:
- header_height = len(self._header_entries)
- self._header_vp = Viewport(
- self._max_width,
- header_height,
- 0,
- y_offset,
- alignment=self._alignment,
- )
- y_offset += header_height
-
- prev_offset = y_offset + footer_height
- prev_size = self._determine_prev_size(arg_prev_size, offset=prev_offset)
- available_height = self._max_height - y_offset - footer_height
-
- match self._preview_style:
- case PreviewStyle.BOTTOM:
- menu_height = available_height - prev_size
-
- self._menu_vp = Viewport(
- self._max_width,
- menu_height,
- 0,
- y_offset,
- frame=self._frame,
- alignment=self._alignment,
- )
- self._preview_vp = Viewport(
- self._max_width,
- prev_size,
- 0,
- menu_height + y_offset,
- frame=self._preview_frame,
- )
- case PreviewStyle.RIGHT:
- menu_width = self._max_width - prev_size
-
- self._menu_vp = Viewport(
- menu_width,
- available_height,
- 0,
- y_offset,
- frame=self._frame,
- alignment=self._alignment,
- )
- self._preview_vp = Viewport(
- prev_size,
- available_height,
- menu_width,
- y_offset,
- frame=self._preview_frame,
- alignment=self._alignment,
- )
- case PreviewStyle.TOP:
- menu_height = available_height - prev_size
-
- self._menu_vp = Viewport(
- self._max_width,
- menu_height,
- 0,
- prev_size + y_offset,
- frame=self._frame,
- alignment=self._alignment,
- )
- self._preview_vp = Viewport(
- self._max_width,
- prev_size,
- 0,
- y_offset,
- frame=self._preview_frame,
- alignment=self._alignment,
- )
- case PreviewStyle.NONE:
- self._menu_vp = Viewport(
- self._max_width,
- available_height,
- 0,
- y_offset,
- frame=self._frame,
- alignment=self._alignment,
- )
-
- self._footer_vp = Viewport(
- self._max_width,
- footer_height,
- 0,
- self._max_height - footer_height,
- )
-
- def _determine_prev_size(
- self,
- preview_size: float | Literal['auto'],
- offset: int = 0,
- ) -> int:
- if not isinstance(preview_size, float) and preview_size != 'auto':
- raise ValueError('preview size must be a float or "auto"')
-
- prev_size: int = 0
-
- if preview_size == 'auto':
- match self._preview_style:
- case PreviewStyle.RIGHT:
- menu_width = self._item_group.get_max_width() + 5
- if self._multi:
- menu_width += 5
- prev_size = self._max_width - menu_width
- case PreviewStyle.BOTTOM:
- menu_height = len(self._item_group.items) + 1 # leave empty line between menu and preview
- prev_size = self._max_height - offset - menu_height
- case PreviewStyle.TOP:
- menu_height = len(self._item_group.items)
- prev_size = self._max_height - offset - menu_height
- else:
- match self._preview_style:
- case PreviewStyle.RIGHT:
- prev_size = int(self._max_width * preview_size)
- case PreviewStyle.BOTTOM:
- prev_size = int((self._max_height - offset) * preview_size)
- case PreviewStyle.TOP:
- prev_size = int((self._max_height - offset) * preview_size)
-
- return prev_size
-
- def _draw(self) -> None:
- footer_entries = self._footer_entries()
-
- items = self._items_state.get_view_items()
- vp_entries = self._item_to_vp_entry(items)
-
- if self._title_vp:
- title_text = self.help_text()
-
- if self._additional_title is not None:
- title_text += f' {self._additional_title}'
-
- title_vp_entry = ViewportEntry(title_text, 0, 0, STYLE.NORMAL)
-
- self._update_viewport(self._title_vp, [title_vp_entry])
-
- if self._header_vp:
- self._update_viewport(self._header_vp, self._header_entries)
-
- if self._menu_vp:
- self._update_viewport(self._menu_vp, vp_entries)
-
- if vp_entries:
- self._update_preview()
- elif self._preview_vp:
- self._update_viewport(self._preview_vp, [])
-
- if self._footer_vp:
- self._update_viewport(self._footer_vp, footer_entries, 0)
-
- def _update_viewport(
- self,
- viewport: Viewport,
- entries: list[ViewportEntry],
- cur_pos: int = 0,
- ) -> None:
- if entries:
- viewport.update(entries, cur_pos=cur_pos)
- else:
- viewport.update([])
-
- def _get_col_widths(self, items: list[list[MenuItem]]) -> list[int]:
- cols_widths = self._calc_col_widths(items, self._horizontal_cols)
- return [col_width + len(self._cursor_char) + self._item_distance() for col_width in cols_widths]
-
- def _item_distance(self) -> int:
- if self._horizontal_cols == 1:
- return 0
- else:
- return self._column_spacing
-
- def _item_to_vp_entry(self, items: list[list[MenuItem]]) -> list[ViewportEntry]:
- entries = []
- cols_widths = self._get_col_widths(items)
-
- for row_idx, row in enumerate(items):
- cur_pos = len(self._cursor_char)
-
- for col_idx, cell in enumerate(row):
- cur_text = ''
- style = STYLE.NORMAL
-
- if cell == self._item_group.focus_item:
- cur_text = self._cursor_char
- style = STYLE.MENU_STYLE
-
- entries += [ViewportEntry(cur_text, row_idx, cur_pos - len(self._cursor_char), STYLE.CURSOR_STYLE)]
-
- menu_item_text = self._menu_item_text(cell)
- entries += [ViewportEntry(menu_item_text, row_idx, cur_pos, style)]
- cur_pos += len(menu_item_text)
-
- if col_idx < len(row) - 1:
- spacer_len = cols_widths[col_idx] - len(menu_item_text)
- entries += [ViewportEntry(' ' * spacer_len, row_idx, cur_pos, STYLE.NORMAL)]
- cur_pos += spacer_len
-
- return entries
-
- def _calc_col_widths(self, rows: list[list[MenuItem]], columns: int) -> list[int]:
- col_widths = []
-
- for row in rows:
- col_entries = []
- for column in range(columns):
- if column < len(row):
- col_entries += [len(row[column].text)]
-
- if col_entries:
- col_widths += [max(col_entries)]
-
- return col_widths
-
- def _menu_item_text(self, item: MenuItem) -> str:
- item_text = ''
-
- if self._multi and not item.is_empty():
- item_text += self._multi_prefix(item)
-
- item_text += self._item_group.get_item_text(item)
- return item_text
-
- def _update_preview(self) -> None:
- if not self._preview_vp:
- return
-
- focus_item = self._item_group.focus_item
-
- if not focus_item or focus_item.preview_action is None:
- self._preview_vp.update([])
- return
-
- action_text = focus_item.preview_action(focus_item)
-
- if not action_text:
- self._preview_vp.update([])
- return
-
- preview_text = action_text.split('\n')
- entries = [ViewportEntry(e, idx, 0, STYLE.NORMAL) for idx, e in enumerate(preview_text)]
-
- total_prev_rows = max([e.row for e in entries]) + 1 # rows start with 0 and we need the count
- available_rows = self._preview_vp.height - 2 # for the preview frame
-
- self._calc_prev_scroll_pos(entries, total_prev_rows)
- prev_entries = self._get_scroll_win_prev_entries(entries, total_prev_rows, available_rows)
- scroll_pct = self._get_scroll_pct(total_prev_rows, available_rows)
-
- self._preview_vp.update(prev_entries, scroll_pos=scroll_pct)
-
- def _get_scroll_pct(
- self,
- total_prev_rows: int,
- available_rows: int,
- ) -> int | None:
- assert self._preview_vp is not None
-
- if total_prev_rows <= available_rows:
- return None
-
- pct = int(self._prev_scroll_pos / total_prev_rows * 100)
-
- if pct + SCROLL_INTERVAL > 100:
- pct = 100
-
- if pct < 0:
- pct = 0
-
- return pct
-
- def _get_scroll_win_prev_entries(
- self,
- entries: list[ViewportEntry],
- total_prev_rows: int,
- available_rows: int,
- ) -> list[ViewportEntry]:
- assert self._preview_vp is not None
-
- if total_prev_rows <= available_rows:
- start_row = 0
- else:
- start_row = self._prev_scroll_pos
-
- end_row = start_row + available_rows
-
- if end_row > total_prev_rows:
- end_row = total_prev_rows
-
- prev_entries = [e for e in entries if start_row <= e.row < end_row]
-
- # normalize the rows
- for e in prev_entries:
- e.row -= start_row
-
- return prev_entries
-
- def _calc_prev_scroll_pos(
- self,
- entries: list[ViewportEntry],
- total_prev_rows: int,
- ) -> None:
- if self._prev_scroll_pos >= total_prev_rows:
- self._prev_scroll_pos = total_prev_rows - 2
- elif self._prev_scroll_pos < 0:
- self._prev_scroll_pos = 0
-
- def _multi_prefix(self, item: MenuItem) -> str:
- if item.read_only:
- return ' '
- elif self._item_group.is_item_selected(item):
- return '[x] '
- else:
- return '[ ] '
-
- def _handle_interrupt(self) -> bool:
- if self._allow_reset and self._interrupt_warning:
- return self._confirm_interrupt(self._interrupt_warning)
- else:
- return False
-
- def _process_input_key(self, key: int) -> Result[ValueT] | None:
- key_handles = MenuKeys.from_ord(key)
-
- if self._help_active:
- if MenuKeys.ESC in key_handles:
- self._help_active = False
- self.clear_help_win()
- self._draw()
- return None
-
- # special case when search is currently active
- if self._active_search:
- if MenuKeys.STD_KEYS in key_handles:
- self._item_group.append_filter(chr(key))
- self._draw()
- return None
- elif MenuKeys.BACKSPACE in key_handles:
- self._item_group.reduce_filter()
- self._draw()
- return None
-
- # remove standard keys from the list of key handles
- key_handles = [key for key in key_handles if key != MenuKeys.STD_KEYS]
-
- if len(key_handles) > 1:
- decoded = MenuKeys.decode(key)
- handles = ', '.join(k.name for k in key_handles)
- raise ValueError(f'Multiple key matches for key {decoded}: {handles}')
- elif len(key_handles) == 0:
- return None
-
- handle = key_handles[0]
-
- match handle:
- case MenuKeys.HELP:
- self._help_active = True
- self._clear_all()
- self._show_help()
- return None
- case MenuKeys.ACCEPT:
- if self._multi:
- if self._item_group.is_mandatory_fulfilled():
- if self._item_group.focus_item is not None:
- if self._item_group.focus_item not in self._item_group.selected_items:
- self._item_group.selected_items.append(self._item_group.focus_item)
- return Result(ResultType.Selection, self._item_group.selected_items)
- else:
- item = self._item_group.focus_item
- if item:
- if item.action:
- item.value = item.action(item.value)
-
- if self._item_group.is_mandatory_fulfilled():
- return Result(ResultType.Selection, self._item_group.focus_item)
-
- return None
- case MenuKeys.MENU_DOWN | MenuKeys.MENU_RIGHT:
- self._focus_item('next')
- case MenuKeys.MENU_UP | MenuKeys.MENU_LEFT:
- self._focus_item('prev')
- case MenuKeys.MENU_START:
- self._focus_item('first')
- case MenuKeys.MENU_END:
- self._focus_item('last')
- case MenuKeys.MULTI_SELECT:
- if self._multi:
- self._item_group.select_current_item()
- case MenuKeys.ENABLE_SEARCH:
- if self._search_enabled and not self._active_search:
- self._active_search = True
- self._item_group.set_filter_pattern('')
- case MenuKeys.ESC:
- if self._active_search:
- self._active_search = False
- self._item_group.set_filter_pattern('')
- else:
- if self._allow_skip:
- return Result(ResultType.Skip, None)
- case MenuKeys.NUM_KEYS:
- self._item_group.focus_index(key - 49)
- case MenuKeys.SCROLL_DOWN:
- self._prev_scroll_pos += SCROLL_INTERVAL
- case MenuKeys.SCROLL_UP:
- self._prev_scroll_pos -= SCROLL_INTERVAL
- case _:
- pass
-
- return None
-
- def _focus_item(self, direction: Literal['next', 'prev', 'first', 'last']) -> None:
- # reset the preview scroll as the newly focused item
- # may have a different preview row count and it'll blow up
- self._prev_scroll_pos = 0
-
- match direction:
- case 'next':
- self._item_group.focus_next()
- case 'prev':
- self._item_group.focus_prev()
- case 'first':
- self._item_group.focus_first()
- case 'last':
- self._item_group.focus_last()
-
-
-class Tui:
- _t: ClassVar[Self | None] = None
-
- def __enter__(self) -> None:
- if Tui._t is None:
- tui = self.init()
- Tui._t = tui
-
- def __exit__(self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None) -> None:
- self.stop()
-
- @property
- def screen(self) -> curses.window:
- return self._screen
-
- @classmethod
- def t(cls) -> Self:
- assert cls._t is not None
- return cls._t
-
- @staticmethod
- def shutdown() -> None:
- if Tui._t is None:
- return
-
- Tui.t().stop()
-
- def init(self) -> Self:
- self._screen = curses.initscr()
- curses.noecho()
- curses.cbreak()
- curses.curs_set(0)
- curses.set_escdelay(25)
-
- self._screen.keypad(True)
- self._screen.scrollok(True)
-
- if curses.has_colors():
- curses.start_color()
- self._set_up_colors()
-
- signal.signal(signal.SIGWINCH, self._sig_win_resize)
- self._screen.refresh()
-
- return self
-
- def stop(self) -> None:
- try:
- curses.nocbreak()
-
- try:
- self.screen.keypad(False)
- except Exception:
- pass
-
- curses.echo()
- curses.curs_set(True)
- curses.endwin()
- except Exception:
- # this may happen when curses has not been initialized
- pass
-
- Tui._t = None
-
- @staticmethod
- def print(
- text: str,
- row: int = 0,
- col: int = 0,
- endl: str = '\n',
- clear_screen: bool = False,
- ) -> None:
- if clear_screen:
- os.system('clear') # type: ignore[deprecated]
-
- if Tui._t is None:
- print(text, end=endl)
- sys.stdout.flush()
-
- return
-
- # will append the row at the very bottom of the screen
- # and also scroll the existing text up by 1 line
- if row == -1:
- last_row = Tui.t().max_yx[0] - 1
- Tui.t().screen.scroll(1)
- Tui.t().screen.addstr(last_row, col, text)
- else:
- Tui.t().screen.addstr(row, col, text)
-
- Tui.t().screen.refresh()
-
- @property
- def max_yx(self) -> tuple[int, int]:
- return self._screen.getmaxyx()
-
- @staticmethod
- def run[ValueT](component: AbstractCurses[ValueT]) -> Result[ValueT]:
- if Tui._t is None:
- tui = Tui().init()
- tui.screen.clear()
- results = tui._main_loop(component)
- Tui().stop()
- return results
- else:
- tui = Tui._t
- tui.screen.clear()
- return Tui.t()._main_loop(component)
-
- def _sig_win_resize(self, signum: int, frame: FrameType | None) -> None:
- if hasattr(self, '_component') and self._component is not None: # pylint: disable=no-member
- self._component.resize_win() # pylint: disable=no-member
-
- def _main_loop[ValueT](self, component: AbstractCurses[ValueT]) -> Result[ValueT]:
- self._screen.refresh()
- return component.kickoff(self._screen)
-
- def _reset_terminal(self) -> None:
- os.system('reset') # type: ignore[deprecated]
-
- def _set_up_colors(self) -> None:
- curses.init_pair(STYLE.NORMAL.value, curses.COLOR_WHITE, curses.COLOR_BLACK)
- curses.init_pair(STYLE.CURSOR_STYLE.value, curses.COLOR_CYAN, curses.COLOR_BLACK)
- curses.init_pair(STYLE.MENU_STYLE.value, curses.COLOR_WHITE, curses.COLOR_BLUE)
- curses.init_pair(STYLE.MENU_STYLE.value, curses.COLOR_WHITE, curses.COLOR_BLUE)
- curses.init_pair(STYLE.HELP.value, curses.COLOR_GREEN, curses.COLOR_BLACK)
- curses.init_pair(STYLE.ERROR.value, curses.COLOR_RED, curses.COLOR_BLACK)
-
- def get_color(self, color: STYLE) -> int:
- return curses.color_pair(color.value)
diff --git a/archinstall/tui/help.py b/archinstall/tui/help.py
deleted file mode 100644
index 2a1ab106..00000000
--- a/archinstall/tui/help.py
+++ /dev/null
@@ -1,109 +0,0 @@
-from dataclasses import dataclass, field
-from enum import Enum
-
-from archinstall.lib.translationhandler import tr
-
-
-class HelpTextGroupId(Enum):
- GENERAL = 'General'
- NAVIGATION = 'Navigation'
- SELECTION = 'Selection'
- SEARCH = 'Search'
-
-
-@dataclass
-class HelpText:
- description: str
- keys: list[str] = field(default_factory=list)
-
-
-@dataclass
-class HelpGroup:
- group_id: HelpTextGroupId
- group_entries: list[HelpText]
-
- def get_desc_width(self) -> int:
- return max([len(e.description) for e in self.group_entries])
-
- def get_key_width(self) -> int:
- return max([len(', '.join(e.keys)) for e in self.group_entries])
-
-
-class Help:
- # the groups needs to be classmethods not static methods
- # because they rely on the DeferredTranslation setup first;
- # if they are static methods, they will be called before the
- # translation setup is done
-
- @staticmethod
- def general() -> HelpGroup:
- return HelpGroup(
- group_id=HelpTextGroupId.GENERAL,
- group_entries=[
- HelpText(tr('Show help'), ['Ctrl+h']),
- HelpText(tr('Exit help'), ['Esc']),
- ],
- )
-
- @staticmethod
- def navigation() -> HelpGroup:
- return HelpGroup(
- group_id=HelpTextGroupId.NAVIGATION,
- group_entries=[
- HelpText(tr('Preview scroll up'), ['PgUp']),
- HelpText(tr('Preview scroll down'), ['PgDown']),
- HelpText(tr('Move up'), ['k', '↑']),
- HelpText(tr('Move down'), ['j', '↓']),
- HelpText(tr('Move right'), ['l', '→']),
- HelpText(tr('Move left'), ['h', '←']),
- HelpText(tr('Jump to entry'), ['1..9']),
- ],
- )
-
- @staticmethod
- def selection() -> HelpGroup:
- return HelpGroup(
- group_id=HelpTextGroupId.SELECTION,
- group_entries=[
- HelpText(tr('Skip selection (if available)'), ['Esc']),
- HelpText(tr('Reset selection (if available)'), ['Ctrl+c']),
- HelpText(tr('Select on single select'), ['Enter']),
- HelpText(tr('Select on multi select'), ['Space', 'Tab']),
- HelpText(tr('Reset'), ['Ctrl-C']),
- HelpText(tr('Skip selection menu'), ['Esc']),
- ],
- )
-
- @staticmethod
- def search() -> HelpGroup:
- return HelpGroup(
- group_id=HelpTextGroupId.SEARCH,
- group_entries=[
- HelpText(tr('Start search mode'), ['/']),
- HelpText(tr('Exit search mode'), ['Esc']),
- ],
- )
-
- @staticmethod
- def get_help_text() -> str:
- help_output = ''
- help_texts = [
- Help.general(),
- Help.navigation(),
- Help.selection(),
- Help.search(),
- ]
- max_desc_width = max([help.get_desc_width() for help in help_texts]) + 2
- max_key_width = max([help.get_key_width() for help in help_texts])
-
- for help_group in help_texts:
- help_output += f'{help_group.group_id.value}\n'
- divider_len = max_desc_width + max_key_width
- help_output += '-' * divider_len + '\n'
-
- for entry in help_group.group_entries:
- help_output += entry.description.ljust(max_desc_width, ' ') + ', '.join(entry.keys) + '\n'
-
- help_output += '\n'
-
- return help_output
diff --git a/archinstall/tui/menu_item.py b/archinstall/tui/menu_item.py
index 418a4409..4c10e275 100644
--- a/archinstall/tui/menu_item.py
+++ b/archinstall/tui/menu_item.py
@@ -1,18 +1,17 @@
-from collections.abc import Callable
+from collections.abc import Awaitable, Callable, Iterable
from dataclasses import dataclass, field
from enum import Enum
from functools import cached_property
from typing import Any, ClassVar, Self, override
from archinstall.lib.translationhandler import tr
-from archinstall.lib.utils.encoding import unicode_ljust
@dataclass
class MenuItem:
text: str
value: Any | None = None
- action: Callable[[Any], Any] | None = None
+ action: Callable[[Any], Awaitable[Any]] | None = None
enabled: bool = True
read_only: bool = False
mandatory: bool = False
@@ -23,6 +22,7 @@ class MenuItem:
key: str | None = None
_id: str = ''
+
_yes: ClassVar[Self | None] = None
_no: ClassVar[Self | None] = None
@@ -110,6 +110,11 @@ class MenuItemGroup:
if self.focus_item not in self.items:
raise ValueError(f'Selected item not in menu: {self.focus_item}')
+ @classmethod
+ def from_objects(cls, items: list[Any]) -> Self:
+ items = [MenuItem(str(id(item)), value=item) for item in items]
+ return cls(items)
+
def add_item(self, item: MenuItem) -> None:
self._menu_items.append(item)
del self.items # resetting the cache
@@ -143,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)
@@ -198,60 +203,10 @@ class MenuItemGroup:
return None
- def index_focus(self) -> int | None:
- if self.focus_item and self.items:
- try:
- return self.items.index(self.focus_item)
- except ValueError:
- # on large menus (15k+) when filtering very quickly
- # the index search is too slow while the items are reduced
- # by the filter and it will blow up as it cannot find the
- # focus item
- pass
-
- return None
-
- @property
- def size(self) -> int:
- return len(self.items)
-
- def get_max_width(self) -> int:
- # use the menu_items not the items here otherwise the preview
- # will get resized all the time when a filter is applied
- return max([len(self.get_item_text(item)) for item in self._menu_items])
-
@cached_property
def _max_items_text_width(self) -> int:
return max([len(item.text) for item in self._menu_items])
- def get_item_text(self, item: MenuItem) -> str:
- if item.is_empty():
- return ''
-
- max_width = self._max_items_text_width
- display_text = item.get_display_value()
-
- default_text = self._default_suffix(item)
-
- text = unicode_ljust(str(item.text), max_width, ' ')
- spacing = ' ' * 4
-
- if display_text:
- text = f'{text}{spacing}{display_text}'
- elif self._checkmarks:
- from archinstall.tui.types import Chars
-
- if item.has_value():
- if item.get_value() is not False:
- text = f'{text}{spacing}{Chars.Check}'
- else:
- text = item.text
-
- if default_text:
- text = f'{text} {default_text}'
-
- return text.rstrip(' ')
-
def _default_suffix(self, item: MenuItem) -> str:
if self.default_item == item:
return tr(' (default)')
@@ -274,45 +229,11 @@ class MenuItemGroup:
return 0
return 1
- @property
- def filter_pattern(self) -> str:
- return self._filter_pattern
-
- def has_filter(self) -> bool:
- return self._filter_pattern != ''
-
def set_filter_pattern(self, pattern: str) -> None:
self._filter_pattern = pattern
del self.items # resetting the cache
self.focus_first()
- def append_filter(self, pattern: str) -> None:
- self._filter_pattern += pattern
- del self.items # resetting the cache
- self.focus_first()
-
- def reduce_filter(self) -> None:
- self._filter_pattern = self._filter_pattern[:-1]
- del self.items # resetting the cache
- self.focus_first()
-
- def _reload_focus_item(self) -> None:
- if len(self.items) > 0:
- if self.focus_item not in self.items:
- self.focus_first()
- else:
- self.focus_item = None
-
- def is_item_selected(self, item: MenuItem) -> bool:
- return item in self.selected_items
-
- def select_current_item(self) -> None:
- if self.focus_item:
- if self.focus_item in self.selected_items:
- self.selected_items.remove(self.focus_item)
- else:
- self.selected_items.append(self.focus_item)
-
def focus_index(self, index: int) -> None:
enabled = self.get_enabled_items()
self.focus_item = enabled[index]
@@ -379,12 +300,6 @@ class MenuItemGroup:
return None
- def is_mandatory_fulfilled(self) -> bool:
- for item in self._menu_items:
- if item.mandatory and not item.value:
- return False
- return True
-
def max_item_width(self) -> int:
spaces = [len(str(it.text)) for it in self.items]
if spaces:
@@ -417,99 +332,3 @@ class MenuItemGroup:
return False
return True
-
-
-class MenuItemsState:
- def __init__(
- self,
- item_group: MenuItemGroup,
- total_cols: int,
- total_rows: int,
- with_frame: bool,
- ) -> None:
- self._item_group = item_group
- self._total_cols = total_cols
- self._total_rows = total_rows - 2 if with_frame else total_rows
-
- self._prev_row_idx: int = -1
- self._prev_visible_rows: list[int] = []
- self._view_items: list[list[MenuItem]] = []
-
- def _determine_focus_row(self) -> int | None:
- focus_index = self._item_group.index_focus()
-
- if focus_index is None:
- return None
-
- row_index = focus_index // self._total_cols
- return row_index
-
- def get_view_items(self) -> list[list[MenuItem]]:
- enabled_items = self._item_group.get_enabled_items()
- focus_row_idx = self._determine_focus_row()
-
- if focus_row_idx is None:
- return []
-
- start, end = 0, 0
-
- if len(self._view_items) == 0 or self._prev_row_idx == -1 or focus_row_idx == 0: # initial setup
- if focus_row_idx < self._total_rows:
- start = 0
- end = self._total_rows
- elif focus_row_idx > len(enabled_items) - self._total_rows:
- start = len(enabled_items) - self._total_rows
- end = len(enabled_items)
- else:
- start = focus_row_idx
- end = focus_row_idx + self._total_rows
- elif len(enabled_items) <= self._total_rows: # the view can handle all items
- start = 0
- end = self._total_rows
- elif not self._item_group.has_filter() and focus_row_idx in self._prev_visible_rows: # focus is in the same view
- self._prev_row_idx = focus_row_idx
- return self._view_items
- else:
- if self._item_group.has_filter():
- start = focus_row_idx
- end = focus_row_idx + self._total_rows
- else:
- delta = focus_row_idx - self._prev_row_idx
-
- if delta > 0: # cursor is on the bottom most row
- start = focus_row_idx - self._total_rows + 1
- end = focus_row_idx + 1
- else: # focus is on the top most row
- start = focus_row_idx
- end = focus_row_idx + self._total_rows
-
- self._view_items = self._get_view_items(enabled_items, start, end)
- self._prev_visible_rows = list(range(start, end))
- self._prev_row_idx = focus_row_idx
-
- return self._view_items
-
- def _get_view_items(
- self,
- items: list[MenuItem],
- start_row: int,
- total_rows: int,
- ) -> list[list[MenuItem]]:
- groups: list[list[MenuItem]] = []
- nr_items = self._total_cols * min(total_rows, len(items))
-
- for x in range(start_row, nr_items, self._total_cols):
- groups.append(
- items[x : x + self._total_cols],
- )
-
- return groups
-
- def _max_visible_items(self) -> int:
- return self._total_cols * self._total_rows
-
- def _remaining_next_spots(self) -> int:
- return self._max_visible_items() - self._prev_row_idx
-
- def _remaining_prev_spots(self) -> int:
- return self._max_visible_items() - self._remaining_next_spots()
diff --git a/archinstall/tui/result.py b/archinstall/tui/result.py
index 13f12794..a2232a4f 100644
--- a/archinstall/tui/result.py
+++ b/archinstall/tui/result.py
@@ -1,5 +1,6 @@
from dataclasses import dataclass
from enum import Enum, auto
+from typing import Self, cast
from archinstall.tui.menu_item import MenuItem
@@ -13,25 +14,58 @@ class ResultType(Enum):
@dataclass
class Result[ValueT]:
type_: ResultType
- _item: MenuItem | list[MenuItem] | str | None
+ _data: ValueT | list[ValueT] | None = None
+ _item: MenuItem | list[MenuItem] | None = None
- def has_item(self) -> bool:
+ @classmethod
+ def true(cls) -> Self:
+ return cls(ResultType.Selection, _data=True) # type: ignore[arg-type]
+
+ @classmethod
+ def false(cls) -> Self:
+ return cls(ResultType.Selection, _data=False) # type: ignore[arg-type]
+
+ @classmethod
+ def reset(cls) -> Self:
+ return cls(ResultType.Reset)
+
+ @classmethod
+ def selection(cls, value: ValueT | list[ValueT] | None) -> Self:
+ return cls(ResultType.Selection, _data=value)
+
+ @classmethod
+ def skip(cls) -> Self:
+ return cls(ResultType.Skip)
+
+ def has_data(self) -> bool:
+ return self._data is not None
+
+ def has_value(self) -> bool:
return self._item is not None
- def get_value(self) -> ValueT:
- return self.item().get_value() # type: ignore[no-any-return]
-
- def get_values(self) -> list[ValueT]:
- return [i.get_value() for i in self.items()]
-
def item(self) -> MenuItem:
- assert self._item is not None and isinstance(self._item, MenuItem)
+ if isinstance(self._item, list) or self._item is None:
+ raise ValueError('Invalid item type')
return self._item
def items(self) -> list[MenuItem]:
- assert self._item is not None and isinstance(self._item, list)
- return self._item
+ if isinstance(self._item, list):
+ return self._item
- def text(self) -> str:
- assert self._item is not None and isinstance(self._item, str)
- return self._item
+ raise ValueError('Invalid item type')
+
+ def get_value(self) -> ValueT:
+ if self._item is not None:
+ return self.item().get_value() # type: ignore[no-any-return]
+
+ if type(self._data) is not list and self._data is not None:
+ return cast(ValueT, self._data)
+
+ raise ValueError('No value found')
+
+ def get_values(self) -> list[ValueT]:
+ if self._item is not None:
+ return [i.get_value() for i in self.items()]
+
+ assert type(self._data) is list
+ return cast(list[ValueT], self._data)
diff --git a/archinstall/tui/types.py b/archinstall/tui/types.py
deleted file mode 100644
index d57123ae..00000000
--- a/archinstall/tui/types.py
+++ /dev/null
@@ -1,144 +0,0 @@
-import curses
-from dataclasses import dataclass
-from enum import Enum, auto
-from typing import Self
-
-SCROLL_INTERVAL = 10
-
-
-class STYLE(Enum):
- NORMAL = 1
- CURSOR_STYLE = 2
- MENU_STYLE = 3
- HELP = 4
- ERROR = 5
-
-
-class MenuKeys(Enum):
- # latin keys
- STD_KEYS = frozenset(range(32, 127))
- # numbers
- NUM_KEYS = frozenset(range(49, 58))
- # Menu up: up, k
- MENU_UP = frozenset({259, 107})
- # Menu down: down, j
- MENU_DOWN = frozenset({258, 106})
- # Menu left: left, h
- MENU_LEFT = frozenset({260, 104})
- # Menu right: right, l
- MENU_RIGHT = frozenset({261, 108})
- # Menu start: home CTRL-a
- MENU_START = frozenset({262, 1})
- # Menu end: end CTRL-e
- MENU_END = frozenset({360, 5})
- # Enter
- ACCEPT = frozenset({10})
- # Selection: space, tab
- MULTI_SELECT = frozenset({32, 9})
- # Search: /
- ENABLE_SEARCH = frozenset({47})
- # ESC
- ESC = frozenset({27})
- # BACKSPACE (search)
- BACKSPACE = frozenset({127, 263})
- # Help view: ctrl+h
- HELP = frozenset({8})
- # Scroll up: PGUP
- SCROLL_UP = frozenset({339})
- # Scroll down: PGDOWN
- SCROLL_DOWN = frozenset({338})
-
- @classmethod
- def from_ord(cls, key: int) -> list[Self]:
- matches: list[Self] = []
-
- for group in cls:
- if key in group.value:
- matches.append(group)
-
- return matches
-
- @classmethod
- def decode(cls, key: int) -> str:
- byte_str = curses.keyname(key)
- return byte_str.decode('utf-8')
-
-
-class FrameStyle(Enum):
- MAX = auto()
- MIN = auto()
-
-
-@dataclass
-class FrameProperties:
- header: str
- w_frame_style: FrameStyle = FrameStyle.MAX
- h_frame_style: FrameStyle = FrameStyle.MAX
-
- @classmethod
- def max(cls, header: str) -> Self:
- return cls(
- header,
- FrameStyle.MAX,
- FrameStyle.MAX,
- )
-
- @classmethod
- def min(cls, header: str) -> Self:
- return cls(
- header,
- FrameStyle.MIN,
- FrameStyle.MIN,
- )
-
-
-class Orientation(Enum):
- VERTICAL = auto()
- HORIZONTAL = auto()
-
-
-class PreviewStyle(Enum):
- NONE = auto()
- BOTTOM = auto()
- RIGHT = auto()
- TOP = auto()
-
-
-# https://www.compart.com/en/unicode/search?q=box+drawings#characters
-# https://en.wikipedia.org/wiki/Box-drawing_characters
-class Chars:
- Horizontal = '─'
- Vertical = '│'
- Upper_left = '┌'
- Upper_right = '┐'
- Lower_left = '└'
- Lower_right = '┘'
- Block = '█'
- Triangle_up = '▲'
- Triangle_down = '▼'
- Check = '+'
- Cross = 'x'
- Right_arrow = '←'
-
-
-@dataclass
-class ViewportEntry:
- text: str
- row: int
- col: int
- style: STYLE
-
-
-class Alignment(Enum):
- LEFT = auto()
- CENTER = auto()
-
-
-@dataclass
-class FrameDim:
- x_start: int
- x_end: int
- height: int
-
- def x_delta(self) -> int:
- return self.x_end - self.x_start
diff --git a/archinstall/tui/ui/__init__.py b/archinstall/tui/ui/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/archinstall/tui/ui/menu_item.py b/archinstall/tui/ui/menu_item.py
deleted file mode 100644
index ed5a16ec..00000000
--- a/archinstall/tui/ui/menu_item.py
+++ /dev/null
@@ -1,334 +0,0 @@
-from collections.abc import Awaitable, Callable
-from dataclasses import dataclass, field
-from enum import Enum
-from functools import cached_property
-from typing import Any, ClassVar, Self, override
-
-from archinstall.lib.translationhandler import tr
-
-
-@dataclass
-class MenuItem:
- text: str
- value: Any | None = None
- action: Callable[[Any], Awaitable[Any]] | None = None
- enabled: bool = True
- read_only: bool = False
- mandatory: bool = False
- dependencies: list[str | Callable[[], bool]] = field(default_factory=list)
- dependencies_not: list[str] = field(default_factory=list)
- display_action: Callable[[Any], str] | None = None
- preview_action: Callable[[Self], str | None] | None = None
- key: str | None = None
-
- _id: str = ''
-
- _yes: ClassVar[Self | None] = None
- _no: ClassVar[Self | None] = None
-
- def __post_init__(self) -> None:
- if self.key is not None:
- self._id = self.key
- else:
- self._id = str(id(self))
-
- @override
- def __hash__(self) -> int:
- return hash(self._id)
-
- def get_id(self) -> str:
- return self._id
-
- def get_value(self) -> Any:
- assert self.value is not None
- return self.value
-
- @classmethod
- def yes(cls, action: Callable[[Any], Any] | None = None) -> Self:
- if cls._yes is None:
- cls._yes = cls(tr('Yes'), value=True, key='yes', action=action)
-
- return cls._yes
-
- @classmethod
- def no(cls, action: Callable[[Any], Any] | None = None) -> Self:
- if cls._no is None:
- cls._no = cls(tr('No'), value=False, key='no', action=action)
-
- return cls._no
-
- def is_empty(self) -> bool:
- return self.text == '' or self.text is None
-
- def has_value(self) -> bool:
- if self.value is None:
- return False
- elif isinstance(self.value, list) and len(self.value) == 0:
- return False
- elif isinstance(self.value, dict) and len(self.value) == 0:
- return False
- else:
- return True
-
- def get_display_value(self) -> str | None:
- if self.display_action is not None:
- return self.display_action(self.value)
-
- return None
-
-
-class MenuItemGroup:
- def __init__(
- self,
- menu_items: list[MenuItem],
- focus_item: MenuItem | None = None,
- default_item: MenuItem | None = None,
- sort_items: bool = False,
- sort_case_sensitive: bool = True,
- checkmarks: bool = False,
- ) -> None:
- if len(menu_items) < 1:
- raise ValueError('Menu must have at least one item')
-
- if sort_items:
- if sort_case_sensitive:
- menu_items = sorted(menu_items, key=lambda x: x.text)
- else:
- menu_items = sorted(menu_items, key=lambda x: x.text.lower())
-
- self._filter_pattern: str = ''
- self._checkmarks: bool = checkmarks
-
- self._menu_items: list[MenuItem] = menu_items
- self.focus_item: MenuItem | None = focus_item
- self.selected_items: list[MenuItem] = []
- self.default_item: MenuItem | None = default_item
-
- if not focus_item:
- self.focus_first()
-
- if self.focus_item not in self.items:
- raise ValueError(f'Selected item not in menu: {self.focus_item}')
-
- @classmethod
- def from_objects(cls, items: list[Any]) -> Self:
- items = [MenuItem(str(id(item)), value=item) for item in items]
- return cls(items)
-
- def add_item(self, item: MenuItem) -> None:
- self._menu_items.append(item)
- del self.items # resetting the cache
-
- def find_by_id(self, item_id: str) -> MenuItem:
- for item in self._menu_items:
- if item.get_id() == item_id:
- return item
-
- raise ValueError(f'No item found for id: {item_id}')
-
- def find_by_key(self, key: str) -> MenuItem:
- for item in self._menu_items:
- if item.key == key:
- return item
-
- raise ValueError(f'No item found for key: {key}')
-
- def get_enabled_items(self) -> list[MenuItem]:
- return [it for it in self.items if self.is_enabled(it)]
-
- @classmethod
- def yes_no(cls) -> Self:
- return cls(
- [MenuItem.yes(), MenuItem.no()],
- sort_items=True,
- )
-
- @classmethod
- def from_enum(
- cls,
- enum_cls: type[Enum],
- sort_items: bool = False,
- preset: Enum | None = None,
- ) -> Self:
- items = [MenuItem(elem.value, value=elem) for elem in enum_cls]
- group = cls(items, sort_items=sort_items)
-
- if preset is not None:
- group.set_selected_by_value(preset)
-
- return group
-
- def set_preview_for_all(self, action: Callable[[Any], str | None]) -> None:
- for item in self.items:
- item.preview_action = action
-
- def set_focus_by_value(self, value: Any) -> None:
- for item in self._menu_items:
- if item.value == value:
- self.focus_item = item
- break
-
- def set_default_by_value(self, value: Any) -> None:
- for item in self._menu_items:
- if item.value == value:
- self.default_item = item
- break
-
- def set_selected_by_value(self, values: Any | list[Any] | None) -> None:
- if values is None:
- return
-
- if not isinstance(values, list):
- values = [values]
-
- for item in self._menu_items:
- if item.value in values:
- self.selected_items.append(item)
-
- if values:
- self.set_focus_by_value(values[0])
-
- def get_focused_index(self) -> int | None:
- items = self.get_enabled_items()
-
- if self.focus_item and items:
- try:
- return items.index(self.focus_item)
- except ValueError:
- # on large menus (15k+) when filtering very quickly
- # the index search is too slow while the items are reduced
- # by the filter and it will blow up as it cannot find the
- # focus item
- pass
-
- return None
-
- @cached_property
- def _max_items_text_width(self) -> int:
- return max([len(item.text) for item in self._menu_items])
-
- def _default_suffix(self, item: MenuItem) -> str:
- if self.default_item == item:
- return tr(' (default)')
- return ''
-
- def set_action_for_all(self, action: Callable[[Any], Any]) -> None:
- for item in self.items:
- item.action = action
-
- @cached_property
- def items(self) -> list[MenuItem]:
- pattern = self._filter_pattern.lower()
- items = filter(lambda item: item.is_empty() or pattern in item.text.lower(), self._menu_items)
- l_items = sorted(items, key=self._items_score)
- return l_items
-
- def _items_score(self, item: MenuItem) -> int:
- pattern = self._filter_pattern.lower()
- if item.text.lower().startswith(pattern):
- return 0
- return 1
-
- def set_filter_pattern(self, pattern: str) -> None:
- self._filter_pattern = pattern
- del self.items # resetting the cache
- self.focus_first()
-
- def focus_index(self, index: int) -> None:
- enabled = self.get_enabled_items()
- self.focus_item = enabled[index]
-
- def focus_first(self) -> None:
- if len(self.items) == 0:
- return
-
- first_item: MenuItem | None = self.items[0]
-
- if first_item and not self._is_selectable(first_item):
- first_item = self._find_next_selectable_item(self.items, first_item, 1)
-
- if first_item is not None:
- self.focus_item = first_item
-
- def focus_last(self) -> None:
- if len(self.items) == 0:
- return
-
- last_item: MenuItem | None = self.items[-1]
-
- if last_item and not self._is_selectable(last_item):
- last_item = self._find_next_selectable_item(self.items, last_item, -1)
-
- if last_item is not None:
- self.focus_item = last_item
-
- def focus_prev(self, skip_empty: bool = True) -> None:
- # e.g. when filter shows no items
- if self.focus_item is None:
- return
-
- item = self._find_next_selectable_item(self.items, self.focus_item, -1)
-
- if item is not None:
- self.focus_item = item
-
- def focus_next(self, skip_not_enabled: bool = True) -> None:
- # e.g. when filter shows no items
- if self.focus_item is None:
- return
-
- item = self._find_next_selectable_item(self.items, self.focus_item, 1)
-
- if item is not None:
- self.focus_item = item
-
- def _find_next_selectable_item(
- self,
- items: list[MenuItem],
- start_item: MenuItem,
- direction: int,
- ) -> MenuItem | None:
- start_index = self.items.index(start_item)
- n = len(items)
-
- current_index = start_index
- for _ in range(n):
- current_index = (current_index + direction) % n
-
- if self._is_selectable(items[current_index]):
- return items[current_index]
-
- return None
-
- def max_item_width(self) -> int:
- spaces = [len(str(it.text)) for it in self.items]
- if spaces:
- return max(spaces)
- return 0
-
- def _is_selectable(self, item: MenuItem) -> bool:
- if item.is_empty():
- return False
- elif item.read_only:
- return False
-
- return self.is_enabled(item)
-
- def is_enabled(self, item: MenuItem) -> bool:
- if not item.enabled:
- return False
-
- for dep in item.dependencies:
- if isinstance(dep, str):
- item = self.find_by_key(dep)
- if not item.value or not self.is_enabled(item):
- return False
- else:
- return dep()
-
- for dep_not in item.dependencies_not:
- item = self.find_by_key(dep_not)
- if item.value is not None:
- return False
-
- return True
diff --git a/archinstall/tui/ui/result.py b/archinstall/tui/ui/result.py
deleted file mode 100644
index 6258bccf..00000000
--- a/archinstall/tui/ui/result.py
+++ /dev/null
@@ -1,71 +0,0 @@
-from dataclasses import dataclass
-from enum import Enum, auto
-from typing import Self, cast
-
-from archinstall.tui.ui.menu_item import MenuItem
-
-
-class ResultType(Enum):
- Selection = auto()
- Skip = auto()
- Reset = auto()
-
-
-@dataclass
-class Result[ValueT]:
- type_: ResultType
- _data: ValueT | list[ValueT] | None = None
- _item: MenuItem | list[MenuItem] | None = None
-
- @classmethod
- def true(cls) -> Self:
- return cls(ResultType.Selection, _data=True) # type: ignore[arg-type]
-
- @classmethod
- def false(cls) -> Self:
- return cls(ResultType.Selection, _data=False) # type: ignore[arg-type]
-
- @classmethod
- def reset(cls) -> Self:
- return cls(ResultType.Reset)
-
- @classmethod
- def selection(cls, value: ValueT | list[ValueT] | None) -> Self:
- return cls(ResultType.Selection, _data=value)
-
- @classmethod
- def skip(cls) -> Self:
- return cls(ResultType.Skip)
-
- def has_data(self) -> bool:
- return self._data is not None
-
- def has_value(self) -> bool:
- return self._item is not None
-
- def item(self) -> MenuItem:
- if isinstance(self._item, list) or self._item is None:
- raise ValueError('Invalid item type')
- return self._item
-
- def items(self) -> list[MenuItem]:
- if isinstance(self._item, list):
- return self._item
-
- raise ValueError('Invalid item type')
-
- def get_value(self) -> ValueT:
- if self._item is not None:
- return self.item().get_value() # type: ignore[no-any-return]
-
- if type(self._data) is not list and self._data is not None:
- return cast(ValueT, self._data)
-
- raise ValueError('No value found')
-
- def get_values(self) -> list[ValueT]:
- if self._item is not None:
- return [i.get_value() for i in self.items()]
-
- assert type(self._data) is list
- return cast(list[ValueT], self._data)
diff --git a/docs/help/known_issues.rst b/docs/help/known_issues.rst
index bf039dcb..90945894 100644
--- a/docs/help/known_issues.rst
+++ b/docs/help/known_issues.rst
@@ -22,7 +22,7 @@ Restarting ``systemd-timesyncd.service`` might work but most often you need to c
Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete. `#2679`_
------------------------------
-The ``archlinux-keyring-wkd-sync.service`` or ``archlinux-keyring-wkd-sync.timer`` can hang "indefinitely" some times.
+The ``archlinux-keyring-wkd-sync.service`` or ``archlinux-keyring-wkd-sync.timer`` can hang "indefinitely" sometimes.
This is usually due to an inability to reach the key servers, or a slow connection towards key servers.
The script ``/usr/bin/archlinux-keyring-wkd-sync`` can be run manually, to verify if it's executing slowly or not.
@@ -65,7 +65,7 @@ ARM, 32bit and other CPU types error out `#1686`_, `#2185`_
This is a bit of a catch-all known issue.
Officially `x86_64`_ is only supported by Arch Linux.
-Hence little effort have been put into supporting other platforms.
+Hence little effort has been put into supporting other platforms.
In theory, other architectures should work but small quirks might arise.
@@ -79,10 +79,10 @@ Missing key-issues tend to be that the `archlinux-keyring`_ package is out of da
There is an attempt from upstream to fix this issue, and it's the `archlinux-keyring-wkd-sync.service`_
The service starts almost immediately during boot, and if network is not configured in time — the service will fail.
-Subsequently the ``archinstall`` run might operate on a old keyring despite there being an update service for this.
+Subsequently the ``archinstall`` run might operate on an old keyring despite there being an update service for this.
There is really no way to reliably over time work around this issue in ``archinstall``.
-Instead, efforts to the upstream service should be considered the way forward. And/or keys not expiring between a sane amount of ISO's.
+Instead, efforts to the upstream service should be considered the way forward. And/or keys not expiring between a sane amount of ISOs.
.. note::
diff --git a/pyproject.toml b/pyproject.toml
index 944d1294..358c4ceb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -20,8 +20,8 @@ classifiers = [
dependencies = [
"pyparted==3.13.0",
"pydantic==2.12.5",
- "cryptography==46.0.7",
- "textual==8.2.4",
+ "cryptography==47.0.0",
+ "textual==8.2.5",
"markdown-it-py==4.0.0",
"linkify-it-py==2.1.0",
]
@@ -34,10 +34,10 @@ 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",
+ "pre-commit==4.6.0",
+ "ruff==0.15.12",
"pylint==4.0.5",
"pytest==9.0.3",
]
@@ -172,6 +172,23 @@ score = false
[tool.pylint.variables]
init-import = true
+[tool.pyrefly]
+python-version = "3.14"
+
+replace-imports-with-any = [
+ "parted", # pyparted doesn't have type hints
+]
+
+[tool.pyrefly.errors]
+# Enable some additional rules that are disabled by default
+implicit-abstract-class = true
+missing-override-decorator = true
+missing-source = true
+not-required-key-access = true
+open-unpacking = true
+unannotated-parameter = true
+unused-ignore = true
+
[tool.ruff]
target-version = "py314"
line-length = 160