Merge branch 'master' into network-mandatory-selection
# Conflicts: # archinstall/lib/configuration.py
This commit is contained in:
commit
73052558db
|
|
@ -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)
|
||||
|
|
@ -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: [
|
||||
|
|
|
|||
14
README.md
14
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.<br>
|
||||
`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.~~<br>
|
||||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ from archinstall.lib.models.device import DiskEncryption, DiskLayoutConfiguratio
|
|||
from archinstall.lib.models.locale import LocaleConfiguration
|
||||
from archinstall.lib.models.mirrors import MirrorConfiguration
|
||||
from archinstall.lib.models.network import NetworkConfiguration
|
||||
from archinstall.lib.models.package_types import DEFAULT_KERNEL
|
||||
from archinstall.lib.models.packages import Repository
|
||||
from archinstall.lib.models.pacman import PacmanConfiguration
|
||||
from archinstall.lib.models.profile import ProfileConfiguration
|
||||
|
|
@ -71,7 +72,7 @@ class ArchConfig:
|
|||
auth_config: AuthenticationConfiguration | None = None
|
||||
swap: ZramConfiguration | None = None
|
||||
hostname: str = 'archlinux'
|
||||
kernels: list[str] = field(default_factory=lambda: ['linux'])
|
||||
kernels: list[str] = field(default_factory=lambda: [DEFAULT_KERNEL.value])
|
||||
ntp: bool = True
|
||||
packages: list[str] = field(default_factory=list)
|
||||
pacman_config: PacmanConfiguration = field(default_factory=PacmanConfiguration.default)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ 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
|
||||
|
|
@ -59,6 +60,70 @@ class ConfigurationOutput:
|
|||
debug(' -- Chosen configuration --')
|
||||
debug(self.user_config_to_json())
|
||||
|
||||
def as_summary(self) -> str:
|
||||
"""
|
||||
Render a concise two-column summary of the current configuration.
|
||||
|
||||
The left column holds section labels, the right column holds values.
|
||||
Column width adapts to the longest translated label so translations
|
||||
do not break the alignment. Rows whose underlying config is not set
|
||||
are skipped.
|
||||
|
||||
Returns an empty string if nothing meaningful to show.
|
||||
"""
|
||||
rows: list[tuple[str, str]] = []
|
||||
|
||||
disk_config = self._config.disk_config
|
||||
if disk_config and disk_config.device_modifications:
|
||||
disk_parts: list[str] = []
|
||||
for mod in disk_config.device_modifications:
|
||||
path = str(mod.device_path)
|
||||
root_part = mod.get_root_partition()
|
||||
flags: list[str] = []
|
||||
if root_part and root_part.fs_type:
|
||||
flags.append(root_part.fs_type.value)
|
||||
if disk_config.disk_encryption:
|
||||
flags.append(tr('LUKS'))
|
||||
disk_parts.append(f'{path} ({" + ".join(flags)})' if flags else path)
|
||||
rows.append((tr('Disks'), ', '.join(disk_parts)))
|
||||
|
||||
bl_config = self._config.bootloader_config
|
||||
if bl_config and bl_config.bootloader != Bootloader.NO_BOOTLOADER:
|
||||
rows.append((tr('Bootloader'), bl_config.bootloader.value))
|
||||
|
||||
kernels = self._config.kernels
|
||||
if kernels:
|
||||
rows.append((tr('Kernel'), ', '.join(kernels)))
|
||||
|
||||
profile_config = self._config.profile_config
|
||||
if profile_config and profile_config.profile:
|
||||
names = profile_config.profile.current_selection_names()
|
||||
rows.append((tr('Profile'), ', '.join(names) if names else profile_config.profile.name))
|
||||
if profile_config.greeter:
|
||||
rows.append((tr('Greeter'), profile_config.greeter.value))
|
||||
|
||||
packages = self._config.packages
|
||||
if packages:
|
||||
rows.append((tr('Packages'), str(len(packages))))
|
||||
|
||||
net_config = self._config.network_config
|
||||
if isinstance(net_config, NetworkConfiguration):
|
||||
rows.append((tr('Network'), net_config.type.display_msg()))
|
||||
|
||||
locale_config = self._config.locale_config
|
||||
if locale_config:
|
||||
rows.append((tr('Locale'), locale_config.sys_lang))
|
||||
|
||||
tz = self._config.timezone
|
||||
if tz:
|
||||
rows.append((tr('Timezone'), tz))
|
||||
|
||||
if not rows:
|
||||
return ''
|
||||
|
||||
label_width = max(len(label) for label, _ in rows) + 2
|
||||
return '\n'.join(f'{label:<{label_width}}{value}' for label, value in rows)
|
||||
|
||||
async def confirm_config(self, show_install_warnings: bool = False) -> bool:
|
||||
header = f'{tr("The specified configuration will be applied")}. '
|
||||
header += tr('Would you like to continue?') + '\n'
|
||||
|
|
|
|||
|
|
@ -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)))
|
||||
|
|
|
|||
|
|
@ -3,29 +3,24 @@ from typing import assert_never
|
|||
from archinstall.lib.hardware import GfxDriver, SysInfo
|
||||
from archinstall.lib.menu.helpers import Confirmation, Selection
|
||||
from archinstall.lib.models.application import ZramAlgorithm, ZramConfiguration
|
||||
from archinstall.lib.models.package_types import DEFAULT_KERNEL, Kernel
|
||||
from archinstall.lib.translationhandler import tr
|
||||
from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
|
||||
from archinstall.tui.ui.result import ResultType
|
||||
|
||||
|
||||
async def select_kernel(preset: list[str] = []) -> list[str]:
|
||||
async def select_kernel(preset: list[Kernel] = []) -> list[Kernel]:
|
||||
"""
|
||||
Asks the user to select a kernel for system.
|
||||
|
||||
:return: The string as a selected kernel
|
||||
:rtype: string
|
||||
"""
|
||||
kernels = ['linux', 'linux-lts', 'linux-zen', 'linux-hardened']
|
||||
default_kernel = 'linux'
|
||||
group = MenuItemGroup.from_enum(Kernel, sort_items=True, preset=preset)
|
||||
group.set_default_by_value(DEFAULT_KERNEL)
|
||||
group.set_focus_by_value(DEFAULT_KERNEL)
|
||||
|
||||
items = [MenuItem(k, value=k) for k in kernels]
|
||||
|
||||
group = MenuItemGroup(items, sort_items=True)
|
||||
group.set_default_by_value(default_kernel)
|
||||
group.set_focus_by_value(default_kernel)
|
||||
group.set_selected_by_value(preset)
|
||||
|
||||
result = await Selection[str](
|
||||
result = await Selection[Kernel](
|
||||
group,
|
||||
header=tr('Select which kernel(s) to install'),
|
||||
allow_skip=True,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,7 @@ from archinstall.lib.plugins import plugins
|
|||
from archinstall.lib.translationhandler import tr
|
||||
|
||||
# Any package that the Installer() is responsible for (optional and the default ones)
|
||||
__packages__ = ['base', 'sudo', 'linux-firmware', 'linux', 'linux-lts', 'linux-zen', 'linux-hardened']
|
||||
__packages__ = ['base', 'sudo', 'linux-firmware'] + [k.value for k in Kernel]
|
||||
|
||||
# Additional packages that are installed if the user is running the Live ISO with accessibility tools enabled
|
||||
__accessibility_packages__ = ['brltty', 'espeakup', 'alsa-utils']
|
||||
|
|
@ -79,7 +81,7 @@ class Installer:
|
|||
It also wraps :py:func:`~archinstall.Installer.pacstrap` among other things.
|
||||
"""
|
||||
self._base_packages = base_packages or __packages__[:3]
|
||||
self.kernels = kernels or ['linux']
|
||||
self.kernels = kernels or [DEFAULT_KERNEL.value]
|
||||
self._disk_config = disk_config
|
||||
|
||||
self._disk_encryption = disk_config.disk_encryption or DiskEncryption(EncryptionType.NO_ENCRYPTION)
|
||||
|
|
@ -738,6 +740,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 +991,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 +1330,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 +1455,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 +1473,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 +1910,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 +1931,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 +1950,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 +1962,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 +1972,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 +1983,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'
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
from typing import override
|
||||
|
||||
from archinstall.lib.locale.utils import list_keyboard_languages, list_locales, set_kb_layout
|
||||
from archinstall.lib.locale.utils import list_console_fonts, list_keyboard_languages, list_locales, set_kb_layout
|
||||
from archinstall.lib.menu.abstract_menu import AbstractSubMenu
|
||||
from archinstall.lib.menu.helpers import Selection
|
||||
from archinstall.lib.models.locale import LocaleConfiguration
|
||||
|
|
@ -47,6 +47,13 @@ class LocaleMenu(AbstractSubMenu[LocaleConfiguration]):
|
|||
preview_action=lambda item: item.get_value(),
|
||||
key='sys_enc',
|
||||
),
|
||||
MenuItem(
|
||||
text=tr('Console font'),
|
||||
action=select_console_font,
|
||||
value=self._locale_conf.console_font,
|
||||
preview_action=lambda item: item.get_value(),
|
||||
key='console_font',
|
||||
),
|
||||
]
|
||||
|
||||
@override
|
||||
|
|
@ -140,3 +147,25 @@ async def select_kb_layout(preset: str | None = None) -> str | None:
|
|||
return preset
|
||||
case _:
|
||||
raise ValueError('Unhandled return type')
|
||||
|
||||
|
||||
async def select_console_font(preset: str | None = None) -> str | None:
|
||||
fonts = list_console_fonts()
|
||||
|
||||
items = [MenuItem(f, value=f) for f in fonts]
|
||||
group = MenuItemGroup(items, sort_items=False)
|
||||
group.set_focus_by_value(preset)
|
||||
|
||||
result = await Selection[str](
|
||||
header=tr('Console font'),
|
||||
group=group,
|
||||
enable_filter=True,
|
||||
).show()
|
||||
|
||||
match result.type_:
|
||||
case ResultType.Selection:
|
||||
return result.get_value()
|
||||
case ResultType.Skip:
|
||||
return preset
|
||||
case _:
|
||||
raise ValueError('Unhandled return type')
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -252,6 +252,9 @@ msgstr ""
|
|||
msgid "Locale encoding"
|
||||
msgstr ""
|
||||
|
||||
msgid "Console font"
|
||||
msgstr ""
|
||||
|
||||
msgid "Drive(s)"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -641,8 +644,8 @@ msgid ""
|
|||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Provides a selection of desktop environments and tiling window managers, "
|
||||
"e.g. gnome, kde, sway"
|
||||
"Provides a selection of desktop environments and tiling window managers, e."
|
||||
"g. gnome, kde, sway"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select your desired desktop environment"
|
||||
|
|
@ -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 ""
|
||||
|
||||
|
|
@ -1331,8 +1349,8 @@ msgid "Disable Copy-on-Write"
|
|||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Provides a selection of desktop environments and tiling window managers, "
|
||||
"e.g. GNOME, KDE Plasma, Sway"
|
||||
"Provides a selection of desktop environments and tiling window managers, e."
|
||||
"g. GNOME, KDE Plasma, Sway"
|
||||
msgstr ""
|
||||
|
||||
#, python-brace-format
|
||||
|
|
@ -2259,3 +2277,11 @@ msgstr ""
|
|||
|
||||
msgid "wide Unicode coverage, good fallback font"
|
||||
msgstr ""
|
||||
|
||||
#, python-brace-format
|
||||
msgid "Setting up U2F login: {u2f_config.u2f_login_method.value}"
|
||||
msgstr ""
|
||||
|
||||
#, python-brace-format
|
||||
msgid "Default: {DEFAULT_ITER_TIME}ms, Recommended range: 1000-60000"
|
||||
msgstr ""
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -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 :"
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
|
@ -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 "以下の値のいずれかを選択: "
|
||||
|
|
@ -449,7 +449,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 +823,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 +963,7 @@ msgid "Encryption type"
|
|||
msgstr "暗号化のタイプ"
|
||||
|
||||
msgid "Iteration time"
|
||||
msgstr "反復時間"
|
||||
msgstr "イテレーション時間"
|
||||
|
||||
msgid "Enter iteration time for LUKS encryption (in milliseconds)"
|
||||
msgstr "LUKS 暗号化のイテレーション時間(ミリ秒単位)を入力"
|
||||
|
|
@ -1030,7 +1043,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 +1186,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 "全体: {} / {}"
|
||||
|
|
@ -1296,7 +1309,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 +1563,7 @@ msgid "The specified configuration will be applied"
|
|||
msgstr "指定された設定が適用されます"
|
||||
|
||||
msgid "Wipe"
|
||||
msgstr "ワイプ"
|
||||
msgstr "消去"
|
||||
|
||||
msgid "Mark/Unmark as XBOOTLDR"
|
||||
msgstr "XBOOTLDR としてマーク/マーク解除"
|
||||
|
|
@ -1663,6 +1676,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 +2003,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 "オーディオ設定を選択"
|
||||
|
||||
|
|
@ -1990,3 +2135,66 @@ 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"
|
||||
|
|
|
|||
|
|
@ -256,6 +256,9 @@ msgstr "Мова локалізації"
|
|||
msgid "Locale encoding"
|
||||
msgstr "Кодування локалізації"
|
||||
|
||||
msgid "Console font"
|
||||
msgstr "Шрифт консолі"
|
||||
|
||||
msgid "Drive(s)"
|
||||
msgstr "Диск(и)"
|
||||
|
||||
|
|
@ -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 "Тип"
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import time
|
|||
from archinstall.lib.applications.application_handler import ApplicationHandler
|
||||
from archinstall.lib.args import ArchConfig, ArchConfigHandler
|
||||
from archinstall.lib.authentication.authentication_handler import AuthenticationHandler
|
||||
from archinstall.lib.bootloader.utils import validate_bootloader_layout
|
||||
from archinstall.lib.configuration import ConfigurationOutput
|
||||
from archinstall.lib.disk.filesystem import FilesystemHandler
|
||||
from archinstall.lib.disk.utils import disk_layouts
|
||||
|
|
@ -211,6 +212,15 @@ def main(arch_config_handler: ArchConfigHandler | None = None) -> None:
|
|||
config.write_debug()
|
||||
config.save()
|
||||
|
||||
# Safety net for silent/config-file flow. The TUI menu blocks Install via
|
||||
# GlobalMenu._validate_bootloader() before reaching this point.
|
||||
if failure := validate_bootloader_layout(
|
||||
arch_config_handler.config.bootloader_config,
|
||||
arch_config_handler.config.disk_config,
|
||||
):
|
||||
error(failure.description)
|
||||
return
|
||||
|
||||
if arch_config_handler.args.dry_run:
|
||||
return
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
from collections.abc import Awaitable, Callable
|
||||
from collections.abc import Awaitable, Callable, Iterable
|
||||
from dataclasses import dataclass, field
|
||||
from enum import Enum
|
||||
from functools import cached_property
|
||||
|
|
@ -148,7 +148,7 @@ class MenuItemGroup:
|
|||
cls,
|
||||
enum_cls: type[Enum],
|
||||
sort_items: bool = False,
|
||||
preset: Enum | None = None,
|
||||
preset: Iterable[Enum] | Enum | None = None,
|
||||
) -> Self:
|
||||
items = [MenuItem(elem.value, value=elem) for elem in enum_cls]
|
||||
group = cls(items, sort_items=sort_items)
|
||||
|
|
|
|||
|
|
@ -20,8 +20,8 @@ classifiers = [
|
|||
dependencies = [
|
||||
"pyparted==3.13.0",
|
||||
"pydantic==2.12.5",
|
||||
"cryptography==46.0.7",
|
||||
"textual==8.2.3",
|
||||
"cryptography==47.0.0",
|
||||
"textual==8.2.4",
|
||||
"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",
|
||||
]
|
||||
|
|
|
|||
Loading…
Reference in New Issue