Merge branch 'master' into network-mandatory-selection

This commit is contained in:
Softer 2026-04-21 12:22:43 +03:00
commit ccc378be56
67 changed files with 5301 additions and 876 deletions

View File

@ -33,7 +33,7 @@ jobs:
- run: pacman-key --init
- run: pacman --noconfirm -Sy archlinux-keyring
- run: ./build_iso.sh
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: Arch Live ISO
path: /tmp/archlive/out/*.iso

View File

@ -33,7 +33,7 @@ jobs:
archinstall --script guided -v
archinstall --script only_hd -v
archinstall --script minimal -v
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: archinstall
path: dist/*

View File

@ -5,5 +5,5 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: astral-sh/ruff-action@4919ec5cf1f49eff0871dbcea0da843445b837e6 # v3.6.1
- uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b # v4.0.0
- run: ruff format --diff

View File

@ -5,4 +5,4 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: astral-sh/ruff-action@4919ec5cf1f49eff0871dbcea0da843445b837e6 # v3.6.1
- uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b # v4.0.0

View File

@ -1,7 +1,7 @@
default_stages: ['pre-commit']
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.10
rev: v0.15.11
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.0
rev: v1.20.1
hooks:
- id: mypy
args: [

View File

@ -5,7 +5,7 @@
# Contributor: demostanis worlds <demostanis@protonmail.com>
pkgname=archinstall
pkgver=4.1
pkgver=4.3
pkgrel=1
pkgdesc="Just another guided/automated Arch Linux installer with a twist"
arch=(any)

View File

@ -0,0 +1,14 @@
from typing import TYPE_CHECKING
from archinstall.lib.models.application import FontsConfiguration
from archinstall.lib.output import debug
if TYPE_CHECKING:
from archinstall.lib.installer import Installer
class FontsApp:
def install(self, install_session: Installer, fonts_config: FontsConfiguration) -> None:
packages = [f.value for f in fonts_config.fonts]
debug(f'Installing fonts: {packages}')
install_session.add_additional_packages(packages)

View File

@ -21,6 +21,18 @@ class PowerManagementApp:
'tuned-ppd',
]
@property
def ppd_services(self) -> list[str]:
return [
'power-profiles-daemon.service',
]
@property
def tuned_services(self) -> list[str]:
return [
'tuned.service',
]
def install(
self,
install_session: Installer,
@ -31,5 +43,7 @@ class PowerManagementApp:
match power_management_config.power_management:
case PowerManagement.POWER_PROFILES_DAEMON:
install_session.add_additional_packages(self.ppd_packages)
install_session.enable_service(self.ppd_services)
case PowerManagement.TUNED:
install_session.add_additional_packages(self.tuned_packages)
install_session.enable_service(self.tuned_services)

View File

@ -212,6 +212,6 @@ class Profile:
text = tr('Installed packages') + ':\n'
for pkg in sorted(packages):
text += f'\t- {pkg}\n'
text += f' - {pkg}\n'
return text

View File

@ -3,6 +3,7 @@ from typing import TYPE_CHECKING
from archinstall.applications.audio import AudioApp
from archinstall.applications.bluetooth import BluetoothApp
from archinstall.applications.firewall import FirewallApp
from archinstall.applications.fonts import FontsApp
from archinstall.applications.power_management import PowerManagementApp
from archinstall.applications.print_service import PrintServiceApp
from archinstall.lib.models import Audio
@ -42,3 +43,9 @@ class ApplicationHandler:
install_session,
app_config.firewall_config,
)
if app_config.fonts_config:
FontsApp().install(
install_session,
app_config.fonts_config,
)

View File

@ -10,6 +10,8 @@ from archinstall.lib.models.application import (
BluetoothConfiguration,
Firewall,
FirewallConfiguration,
FontPackage,
FontsConfiguration,
PowerManagement,
PowerManagementConfiguration,
PrintServiceConfiguration,
@ -77,6 +79,13 @@ class ApplicationMenu(AbstractSubMenu[ApplicationConfiguration]):
preview_action=self._prev_firewall,
key='firewall_config',
),
MenuItem(
text=tr('Additional fonts'),
action=select_fonts,
value=self._app_config.fonts_config,
preview_action=self._prev_fonts,
key='fonts_config',
),
]
def _prev_power_management(self, item: MenuItem) -> str | None:
@ -115,6 +124,13 @@ class ApplicationMenu(AbstractSubMenu[ApplicationConfiguration]):
return f'{tr("Firewall")}: {config.firewall.value}'
return None
def _prev_fonts(self, item: MenuItem) -> str | None:
if item.value is not None:
config: FontsConfiguration = item.value
packages = ', '.join(f.value for f in config.fonts)
return f'{tr("Additional fonts")}: {packages}'
return None
async def select_power_management(preset: PowerManagementConfiguration | None = None) -> PowerManagementConfiguration | None:
group = MenuItemGroup.from_enum(PowerManagement)
@ -217,3 +233,31 @@ async def select_firewall(preset: FirewallConfiguration | None = None) -> Firewa
return FirewallConfiguration(firewall=result.get_value())
case ResultType.Reset:
return None
async def select_fonts(preset: FontsConfiguration | None = None) -> FontsConfiguration | None:
items = [MenuItem(f'{f.value} ({f.description()})', value=f) for f in FontPackage]
group = MenuItemGroup(items)
if preset:
for f in preset.fonts:
group.set_selected_by_value(f)
result = await Selection[FontPackage](
group,
header=tr('Select font packages to install'),
allow_skip=True,
allow_reset=True,
multi=True,
).show()
match result.type_:
case ResultType.Skip:
return preset
case ResultType.Selection:
selected = result.get_values()
if selected:
return FontsConfiguration(fonts=selected)
return None
case ResultType.Reset:
return None

View File

@ -22,6 +22,7 @@ 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.packages import Repository
from archinstall.lib.models.pacman import PacmanConfiguration
from archinstall.lib.models.profile import ProfileConfiguration
from archinstall.lib.models.users import Password, User, UserSerialization
from archinstall.lib.output import debug, error, logger, warn
@ -73,7 +74,7 @@ class ArchConfig:
kernels: list[str] = field(default_factory=lambda: ['linux'])
ntp: bool = True
packages: list[str] = field(default_factory=list)
parallel_downloads: int = 0
pacman_config: PacmanConfiguration = field(default_factory=PacmanConfiguration.default)
timezone: str = 'UTC'
services: list[str] = field(default_factory=list)
custom_commands: list[str] = field(default_factory=list)
@ -104,7 +105,7 @@ class ArchConfig:
'kernels': self.kernels,
'ntp': self.ntp,
'packages': self.packages,
'parallel_downloads': self.parallel_downloads,
'pacman_config': self.pacman_config.json(),
'swap': self.swap,
'timezone': self.timezone,
'services': self.services,
@ -142,6 +143,7 @@ class ArchConfig:
if archinstall_lang := args_config.get('archinstall-language', None):
arch_config.archinstall_language = translation_handler.get_language_by_name(archinstall_lang)
translation_handler.activate(arch_config.archinstall_language, set_font=False)
if disk_config := args_config.get('disk_config', {}):
enc_password = args_config.get('encryption_password', '')
@ -209,8 +211,10 @@ class ArchConfig:
if packages := args_config.get('packages', []):
arch_config.packages = packages
if parallel_downloads := args_config.get('parallel_downloads', 0):
arch_config.parallel_downloads = parallel_downloads
if pacman_config := args_config.get('pacman_config', None):
arch_config.pacman_config = PacmanConfiguration.parse_arg(pacman_config)
elif parallel_downloads := args_config.get('parallel_downloads', 0):
arch_config.pacman_config = PacmanConfiguration(parallel_downloads=int(parallel_downloads))
swap_arg = args_config.get('swap')
if swap_arg is not None:

View File

@ -4,7 +4,7 @@ from pathlib import Path
from types import TracebackType
from typing import ClassVar, Self
from archinstall.lib.command import SysCommand, SysCommandWorker, locate_binary
from archinstall.lib.command import SysCommand, SysCommandWorker
from archinstall.lib.exceptions import SysCallError
from archinstall.lib.output import error
@ -105,17 +105,7 @@ class Boot:
return self.session.is_alive()
def SysCommand(self, cmd: list[str], *args, **kwargs) -> SysCommand: # type: ignore[no-untyped-def]
if cmd[0][0] != '/' and cmd[0][:2] != './':
# This check is also done in SysCommand & SysCommandWorker.
# However, that check is done for `machinectl` and not for our chroot command.
# So this wrapper for SysCommand will do this additionally.
cmd[0] = locate_binary(cmd[0])
return SysCommand(['systemd-run', f'--machine={self.container_name}', '--pty', *cmd], *args, **kwargs)
def SysCommandWorker(self, cmd: list[str], *args, **kwargs) -> SysCommandWorker: # type: ignore[no-untyped-def]
if cmd[0][0] != '/' and cmd[0][:2] != './':
cmd[0] = locate_binary(cmd[0])
return SysCommandWorker(['systemd-run', f'--machine={self.container_name}', '--pty', *cmd], *args, **kwargs)

View File

@ -99,7 +99,7 @@ class DeviceHandler:
fs_type = self._determine_fs_type(partition, lsblk_info)
subvol_infos = []
if fs_type == FilesystemType.Btrfs:
if fs_type == FilesystemType.BTRFS:
subvol_infos = self.get_btrfs_info(partition.path, lsblk_info)
partition_infos.append(
@ -147,8 +147,8 @@ class DeviceHandler:
) -> FilesystemType | None:
try:
if partition.fileSystem:
if partition.fileSystem.type == FilesystemType.LinuxSwap.parted_value:
return FilesystemType.LinuxSwap
if partition.fileSystem.type == FilesystemType.LINUX_SWAP.parted_value:
return FilesystemType.LINUX_SWAP
return FilesystemType(partition.fileSystem.type)
elif lsblk_info is not None:
return FilesystemType(lsblk_info.fstype) if lsblk_info.fstype else None
@ -241,20 +241,20 @@ class DeviceHandler:
options = []
match fs_type:
case FilesystemType.Btrfs | FilesystemType.Xfs:
case FilesystemType.BTRFS | FilesystemType.XFS:
# Force overwrite
options.append('-f')
case FilesystemType.F2fs:
case FilesystemType.F2FS:
options.append('-f')
options.extend(('-O', 'extra_attr'))
case FilesystemType.Ext2 | FilesystemType.Ext3 | FilesystemType.Ext4:
case FilesystemType.EXT2 | FilesystemType.EXT3 | FilesystemType.EXT4:
# Force create
options.append('-F')
case FilesystemType.Fat12 | FilesystemType.Fat16 | FilesystemType.Fat32:
case FilesystemType.FAT12 | FilesystemType.FAT16 | FilesystemType.FAT32:
mkfs_type = 'fat'
# Set FAT size
options.extend(('-F', fs_type.value.removeprefix(mkfs_type)))
case FilesystemType.LinuxSwap:
case FilesystemType.LINUX_SWAP:
command = 'mkswap'
case _:
raise UnknownFilesystemFormat(f'Filetype "{fs_type.value}" is not supported')
@ -342,7 +342,7 @@ class DeviceHandler:
) -> None:
# when we require a delete and the partition to be (re)created
# already exists then we have to delete it first
if requires_delete and part_mod.status in [ModificationStatus.Modify, ModificationStatus.Delete]:
if requires_delete and part_mod.status in [ModificationStatus.MODIFY, ModificationStatus.DELETE]:
info(f'Delete existing partition: {part_mod.safe_dev_path}')
part_info = self.find_partition(part_mod.safe_dev_path)
@ -351,7 +351,7 @@ class DeviceHandler:
disk.deletePartition(part_info.partition)
if part_mod.status == ModificationStatus.Delete:
if part_mod.status == ModificationStatus.DELETE:
return
start_sector = part_mod.start.convert(
@ -505,7 +505,7 @@ class DeviceHandler:
debug(f'Unmounting: {partition.path}')
# un-mount for existing encrypted partitions
if partition.fs_type == FilesystemType.Crypto_luks:
if partition.fs_type == FilesystemType.CRYPTO_LUKS:
Luks2(partition.path).lock()
else:
umount(partition.path, recursive=True)

View File

@ -23,7 +23,6 @@ from archinstall.lib.models.device import (
LvmLayoutType,
LvmVolume,
LvmVolumeGroup,
LvmVolumeStatus,
ModificationStatus,
PartitionFlag,
PartitionModification,
@ -281,7 +280,7 @@ class DiskLayoutConfigurationMenu(AbstractSubMenu[DiskMenuConfig]):
if enc_config.encryption_password:
output += tr('Password') + f': {enc_config.encryption_password.hidden()}\n'
if enc_type != EncryptionType.NoEncryption:
if enc_type != EncryptionType.NO_ENCRYPTION:
output += tr('Iteration time') + f': {enc_config.iter_time or DEFAULT_ITER_TIME}ms\n'
if enc_config.partitions:
@ -503,22 +502,22 @@ def _boot_partition(sector_size: SectorSize, using_gpt: bool) -> PartitionModifi
# boot partition
return PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
status=ModificationStatus.CREATE,
type=PartitionType.PRIMARY,
start=start,
length=size,
mountpoint=Path('/boot'),
fs_type=FilesystemType.Fat32,
fs_type=FilesystemType.FAT32,
flags=flags,
)
async def select_main_filesystem_format() -> FilesystemType:
items = [
MenuItem('btrfs', value=FilesystemType.Btrfs),
MenuItem('ext4', value=FilesystemType.Ext4),
MenuItem('xfs', value=FilesystemType.Xfs),
MenuItem('f2fs', value=FilesystemType.F2fs),
MenuItem(FilesystemType.BTRFS.value, value=FilesystemType.BTRFS),
MenuItem(FilesystemType.EXT4.value, value=FilesystemType.EXT4),
MenuItem(FilesystemType.XFS.value, value=FilesystemType.XFS),
MenuItem(FilesystemType.F2FS.value, value=FilesystemType.F2FS),
]
group = MenuItemGroup(items, sort_items=False)
@ -601,7 +600,7 @@ async def suggest_single_disk_layout(
available_space = total_size
min_size_to_allow_home_part = Size(64, Unit.GiB, sector_size)
if filesystem_type == FilesystemType.Btrfs:
if filesystem_type == FilesystemType.BTRFS:
prompt = tr('Would you like to use BTRFS subvolumes with a default structure?') + '\n'
result = await Confirmation(
@ -655,8 +654,8 @@ async def suggest_single_disk_layout(
root_length = available_space - root_start
root_partition = PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
status=ModificationStatus.CREATE,
type=PartitionType.PRIMARY,
start=root_start,
length=root_length,
mountpoint=Path('/') if not using_subvolumes else None,
@ -680,8 +679,8 @@ async def suggest_single_disk_layout(
flags.append(PartitionFlag.LINUX_HOME)
home_partition = PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
status=ModificationStatus.CREATE,
type=PartitionType.PRIMARY,
start=home_start,
length=home_length,
mountpoint=Path('/home'),
@ -734,7 +733,7 @@ async def suggest_multi_disk_layout(
_ = await Notify(text).show()
return []
if filesystem_type == FilesystemType.Btrfs:
if filesystem_type == FilesystemType.BTRFS:
mount_options = await select_mount_options()
device_paths = ', '.join(str(d.device_info.path) for d in devices)
@ -765,8 +764,8 @@ async def suggest_multi_disk_layout(
# add root partition to the root device
root_partition = PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
status=ModificationStatus.CREATE,
type=PartitionType.PRIMARY,
start=root_start,
length=root_length,
mountpoint=Path('/'),
@ -787,8 +786,8 @@ async def suggest_multi_disk_layout(
# add home partition to home device
home_partition = PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
status=ModificationStatus.CREATE,
type=PartitionType.PRIMARY,
start=home_start,
length=home_length,
mountpoint=Path('/home'),
@ -817,7 +816,7 @@ async def suggest_lvm_layout(
if not filesystem_type:
filesystem_type = await select_main_filesystem_format()
if filesystem_type == FilesystemType.Btrfs:
if filesystem_type == FilesystemType.BTRFS:
prompt = tr('Would you like to use BTRFS subvolumes with a default structure?') + '\n'
result = await Confirmation(header=prompt, allow_skip=False, preset=True).show()
@ -851,7 +850,7 @@ async def suggest_lvm_layout(
lvm_vol_group = LvmVolumeGroup(vg_grp_name, pvs=other_part)
root_vol = LvmVolume(
status=LvmVolumeStatus.Create,
status=ModificationStatus.CREATE,
name='root',
fs_type=filesystem_type,
length=root_vol_size,
@ -864,7 +863,7 @@ async def suggest_lvm_layout(
if home_volume:
home_vol = LvmVolume(
status=LvmVolumeStatus.Create,
status=ModificationStatus.CREATE,
name='home',
fs_type=filesystem_type,
length=home_vol_size,

View File

@ -105,19 +105,19 @@ class DiskEncryptionMenu(AbstractSubMenu[DiskEncryption]):
def _check_dep_enc_type(self) -> bool:
enc_type: EncryptionType | None = self._item_group.find_by_key('encryption_type').value
if enc_type and enc_type != EncryptionType.NoEncryption:
if enc_type and enc_type != EncryptionType.NO_ENCRYPTION:
return True
return False
def _check_dep_partitions(self) -> bool:
enc_type: EncryptionType | None = self._item_group.find_by_key('encryption_type').value
if enc_type and enc_type in [EncryptionType.Luks, EncryptionType.LvmOnLuks]:
if enc_type and enc_type in [EncryptionType.LUKS, EncryptionType.LVM_ON_LUKS]:
return True
return False
def _check_dep_lvm_vols(self) -> bool:
enc_type: EncryptionType | None = self._item_group.find_by_key('encryption_type').value
if enc_type and enc_type == EncryptionType.LuksOnLvm:
if enc_type and enc_type == EncryptionType.LUKS_ON_LVM:
return True
return False
@ -137,13 +137,13 @@ class DiskEncryptionMenu(AbstractSubMenu[DiskEncryption]):
assert enc_partitions is not None
assert enc_lvm_vols is not None
if enc_type in [EncryptionType.Luks, EncryptionType.LvmOnLuks] and enc_partitions:
if enc_type in [EncryptionType.LUKS, EncryptionType.LVM_ON_LUKS] and enc_partitions:
enc_lvm_vols = []
if enc_type == EncryptionType.LuksOnLvm:
if enc_type == EncryptionType.LUKS_ON_LVM:
enc_partitions = []
if enc_type != EncryptionType.NoEncryption and enc_password and (enc_partitions or enc_lvm_vols):
if enc_type != EncryptionType.NO_ENCRYPTION and enc_password and (enc_partitions or enc_lvm_vols):
return DiskEncryption(
encryption_password=enc_password,
encryption_type=enc_type,
@ -227,7 +227,7 @@ class DiskEncryptionMenu(AbstractSubMenu[DiskEncryption]):
iter_time = item.value
enc_type = self._item_group.find_by_key('encryption_type').value
if iter_time and enc_type != EncryptionType.NoEncryption:
if iter_time and enc_type != EncryptionType.NO_ENCRYPTION:
return f'{tr("Iteration time")}: {iter_time}ms'
return None
@ -240,9 +240,9 @@ async def select_encryption_type(
options: list[EncryptionType] = []
if lvm_config:
options = [EncryptionType.LvmOnLuks, EncryptionType.LuksOnLvm]
options = [EncryptionType.LVM_ON_LUKS, EncryptionType.LUKS_ON_LVM]
else:
options = [EncryptionType.Luks]
options = [EncryptionType.LUKS]
if not preset:
preset = options[0]
@ -321,7 +321,7 @@ async def select_partitions_to_encrypt(
avail_partitions = [p for p in partitions if not p.exists()]
if avail_partitions:
group = MenuItemGroup.from_objects(partitions)
group = MenuItemGroup.from_objects(avail_partitions)
group.set_selected_by_value(preset)
result = await Table[PartitionModification](

View File

@ -70,7 +70,7 @@ class FilesystemHandler:
self._format_partitions(mod.partitions)
for part_mod in mod.partitions:
if part_mod.fs_type == FilesystemType.Btrfs and part_mod.is_create_or_modify():
if part_mod.fs_type == FilesystemType.BTRFS and part_mod.is_create_or_modify():
device_handler.create_btrfs_volumes(part_mod, enc_conf=self._enc_config)
def _format_partitions(
@ -113,7 +113,7 @@ class FilesystemHandler:
# verify that all partitions have a path set (which implies that they have been created)
lambda x: x.dev_path is None: ValueError('When formatting, all partitions must have a path set'),
# crypto luks is not a valid file system type
lambda x: x.fs_type is FilesystemType.Crypto_luks: ValueError('Crypto luks cannot be set as a filesystem type'),
lambda x: x.fs_type is FilesystemType.CRYPTO_LUKS: ValueError('Crypto luks cannot be set as a filesystem type'),
# file system type must be set
lambda x: x.fs_type is None: ValueError('File system type must be set for modification'),
}
@ -139,7 +139,7 @@ class FilesystemHandler:
self._format_lvm_vols(self._disk_config.lvm_config)
def _setup_lvm_encrypted(self, lvm_config: LvmConfiguration, enc_config: DiskEncryption) -> None:
if enc_config.encryption_type == EncryptionType.LvmOnLuks:
if enc_config.encryption_type == EncryptionType.LVM_ON_LUKS:
enc_mods = self._encrypt_partitions(enc_config, lock_after_create=False)
self._setup_lvm(lvm_config, enc_mods)
@ -148,7 +148,7 @@ class FilesystemHandler:
# Don't close LVM or LUKS during setup - keep everything active
# The installation phase will handle unlocking and mounting
# Closing causes "parent leaked" and lvchange errors
elif enc_config.encryption_type == EncryptionType.LuksOnLvm:
elif enc_config.encryption_type == EncryptionType.LUKS_ON_LVM:
self._setup_lvm(lvm_config)
enc_vols = self._encrypt_lvm_vols(lvm_config, enc_config, False)
self._format_lvm_vols(lvm_config, enc_vols)
@ -230,7 +230,7 @@ class FilesystemHandler:
# find the mapper device yet
device_handler.format(vol.fs_type, path)
if vol.fs_type == FilesystemType.Btrfs:
if vol.fs_type == FilesystemType.BTRFS:
device_handler.create_lvm_btrfs_subvolumes(path, vol.btrfs_subvols, vol.mount_options)
def _lvm_create_pvs(
@ -318,7 +318,7 @@ class FilesystemHandler:
# from arch wiki:
# If a logical volume will be formatted with ext4, leave at least 256 MiB
# free space in the volume group to allow using e2scrub
if any([vol.fs_type == FilesystemType.Ext4 for vol in vol_gp.volumes]):
if any([vol.fs_type == FilesystemType.EXT4 for vol in vol_gp.volumes]):
largest_vol = max(vol_gp.volumes, key=lambda x: x.length)
lvm_vol_reduce(

View File

@ -57,8 +57,8 @@ class DiskSegment:
return self.segment.table_data()
part_mod = PartitionModification(
status=ModificationStatus.Create,
type=PartitionType._Unknown,
status=ModificationStatus.CREATE,
type=PartitionType._UNKNOWN,
start=self.segment.start,
length=self.segment.length,
)
@ -209,7 +209,7 @@ class PartitioningList(ListManager[DiskSegment]):
@override
def selected_action_display(self, selection: DiskSegment) -> str:
if isinstance(selection.segment, PartitionModification):
if selection.segment.status == ModificationStatus.Create:
if selection.segment.status == ModificationStatus.CREATE:
return tr('Partition - New')
elif selection.segment.is_delete() and selection.segment.dev_path:
title = tr('Partition') + '\n\n'
@ -255,7 +255,7 @@ class PartitioningList(ListManager[DiskSegment]):
]
# non btrfs partitions shouldn't get btrfs options
if selection.segment.fs_type != FilesystemType.Btrfs:
if selection.segment.fs_type != FilesystemType.BTRFS:
not_filter += [
self._actions['btrfs_mark_compressed'],
self._actions['btrfs_mark_nodatacow'],
@ -332,7 +332,7 @@ class PartitioningList(ListManager[DiskSegment]):
partition.flags = []
partition.set_flag(PartitionFlag.SWAP)
# btrfs subvolumes will define mountpoints
if fs_type == FilesystemType.Btrfs:
if fs_type == FilesystemType.BTRFS:
partition.mountpoint = None
case 'btrfs_mark_compressed':
self._toggle_mount_option(partition, BtrfsMountOption.compress)
@ -357,7 +357,7 @@ class PartitioningList(ListManager[DiskSegment]):
data: list[DiskSegment],
) -> list[DiskSegment]:
if entry.is_exists_or_modify():
entry.status = ModificationStatus.Delete
entry.status = ModificationStatus.DELETE
part_mods = self.get_part_mods(data)
else:
part_mods = [d.segment for d in data if isinstance(d.segment, PartitionModification) and d.segment != entry]
@ -391,20 +391,20 @@ class PartitioningList(ListManager[DiskSegment]):
async def _prompt_formatting(self, partition: PartitionModification) -> None:
# an existing partition can toggle between Exist or Modify
if partition.is_modify():
partition.status = ModificationStatus.Exist
partition.status = ModificationStatus.EXIST
return
elif partition.exists():
partition.status = ModificationStatus.Modify
partition.status = ModificationStatus.MODIFY
# If we mark a partition for formatting, but the format is CRYPTO LUKS, there's no point in formatting it really
# without asking the user which inner-filesystem they want to use. Since the flag 'encrypted' = True is already set,
# it's safe to change the filesystem for this partition.
if partition.fs_type == FilesystemType.Crypto_luks:
if partition.fs_type == FilesystemType.CRYPTO_LUKS:
prompt = tr('This partition is currently encrypted, to format it a filesystem has to be specified') + '\n'
fs_type = await self._prompt_partition_fs_type(prompt)
partition.fs_type = fs_type
if fs_type == FilesystemType.Btrfs:
if fs_type == FilesystemType.BTRFS:
partition.mountpoint = None
async def _prompt_mountpoint(self) -> Path:
@ -417,7 +417,7 @@ class PartitioningList(ListManager[DiskSegment]):
return mountpoint
async def _prompt_partition_fs_type(self, prompt: str | None = None) -> FilesystemType:
fs_types = filter(lambda fs: fs != FilesystemType.Crypto_luks, FilesystemType)
fs_types = filter(lambda fs: fs != FilesystemType.CRYPTO_LUKS, FilesystemType)
items = [MenuItem(fs.value, value=fs) for fs in fs_types]
group = MenuItemGroup(items, sort_items=False)
@ -522,12 +522,12 @@ class PartitioningList(ListManager[DiskSegment]):
fs_type = await self._prompt_partition_fs_type()
mountpoint = None
if fs_type not in (FilesystemType.Btrfs, FilesystemType.LinuxSwap):
if fs_type not in (FilesystemType.BTRFS, FilesystemType.LINUX_SWAP):
mountpoint = await self._prompt_mountpoint()
partition = PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
status=ModificationStatus.CREATE,
type=PartitionType.PRIMARY,
start=free_space.start,
length=length,
fs_type=fs_type,

View File

@ -1,5 +1,4 @@
from archinstall.lib.general.general_menu import (
add_number_of_parallel_downloads,
select_archinstall_language,
select_hostname,
select_ntp,
@ -8,7 +7,6 @@ from archinstall.lib.general.general_menu import (
from archinstall.lib.general.system_menu import select_driver, select_kernel, select_swap
__all__ = [
'add_number_of_parallel_downloads',
'select_archinstall_language',
'select_driver',
'select_hostname',

View File

@ -3,7 +3,6 @@ from enum import Enum
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.pathnames import PACMAN_CONF
from archinstall.lib.translationhandler import Language, tr
from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup
from archinstall.tui.ui.result import ResultType
@ -106,9 +105,9 @@ async def select_archinstall_language(languages: list[Language], preset: Languag
group = MenuItemGroup(items, sort_items=True)
group.set_focus_by_value(preset)
title = 'NOTE: If a language can not displayed properly, a proper font must be set manually in the console.\n'
title += 'All available fonts can be found in "/usr/share/kbd/consolefonts"\n'
title += 'e.g. setfont LatGrkCyr-8x16 (to display latin/greek/cyrillic characters)\n'
title = 'NOTE: Console font will be set automatically for supported languages.\n'
title += 'For other languages, fonts can be found in "/usr/share/kbd/consolefonts"\n'
title += 'and set manually with: setfont <fontname>\n'
result = await Selection[Language](
header=title,
@ -126,55 +125,6 @@ async def select_archinstall_language(languages: list[Language], preset: Languag
raise ValueError('Language selection not handled')
async def add_number_of_parallel_downloads(preset: int = 1) -> int | None:
max_recommended = 5
header = tr('This option enables the number of parallel downloads that can occur during package downloads') + '\n'
header += tr(' - Maximum recommended value : {} ( Allows {} parallel downloads at a time )').format(max_recommended, max_recommended) + '\n\n'
header += tr('Enter the number of parallel downloads to be enabled')
def validator(s: str) -> str | None:
try:
value = int(s)
if 1 <= value <= max_recommended:
return None
return tr('Value must be between 1 and {}').format(max_recommended)
except Exception:
return tr('Please enter a valid number')
result = await Input(
header=header,
allow_skip=True,
allow_reset=True,
validator_callback=validator,
default_value=str(preset),
).show()
downloads = 1
match result.type_:
case ResultType.Skip:
return preset
case ResultType.Reset:
return downloads
case ResultType.Selection:
downloads = int(result.get_value())
with PACMAN_CONF.open() as f:
pacman_conf = f.read().split('\n')
with PACMAN_CONF.open('w') as fwrite:
for line in pacman_conf:
if 'ParallelDownloads' in line:
fwrite.write(f'ParallelDownloads = {downloads}\n')
else:
fwrite.write(f'{line}\n')
return downloads
async def select_post_installation(elapsed_time: float | None = None) -> PostInstallationAction:
header = 'Installation completed'
if elapsed_time is not None:

View File

@ -7,7 +7,7 @@ from archinstall.lib.authentication.authentication_menu import AuthenticationMen
from archinstall.lib.bootloader.bootloader_menu import BootloaderMenu
from archinstall.lib.configuration import save_config
from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu
from archinstall.lib.general.general_menu import add_number_of_parallel_downloads, select_hostname, select_ntp, select_timezone
from archinstall.lib.general.general_menu import select_hostname, select_ntp, select_timezone
from archinstall.lib.general.system_menu import select_kernel, select_swap
from archinstall.lib.hardware import SysInfo
from archinstall.lib.locale.locale_menu import LocaleMenu
@ -22,12 +22,15 @@ 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.packages import Repository
from archinstall.lib.models.pacman import PacmanConfiguration
from archinstall.lib.models.profile import ProfileConfiguration
from archinstall.lib.network.network_menu import select_network
from archinstall.lib.output import FormattedOutput
from archinstall.lib.packages.packages import list_available_packages, select_additional_packages
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
@ -37,11 +40,13 @@ class GlobalMenu(AbstractMenu[None]):
arch_config: ArchConfig,
mirror_list_handler: MirrorListHandler | None = None,
skip_boot: bool = False,
advanced: bool = False,
title: str | None = None,
) -> None:
self._arch_config = arch_config
self._mirror_list_handler = mirror_list_handler
self._skip_boot = skip_boot
self._advanced = advanced
self._uefi = SysInfo.has_uefi()
menu_options = self._get_menu_options()
@ -138,11 +143,11 @@ class GlobalMenu(AbstractMenu[None]):
key='network_config',
),
MenuItem(
text=tr('Parallel Downloads'),
action=add_number_of_parallel_downloads,
value=1,
preview_action=self._prev_parallel_dw,
key='parallel_downloads',
text=tr('Pacman'),
action=self._pacman_configuration,
value=PacmanConfiguration.default(),
preview_action=self._prev_pacman_config,
key='pacman_config',
),
MenuItem(
text=tr('Additional packages'),
@ -276,6 +281,8 @@ class GlobalMenu(AbstractMenu[None]):
if o.key is not None:
self._item_group.find_by_key(o.key).text = o.text
tui.translate_bindings()
async def _locale_selection(self, preset: LocaleConfiguration) -> LocaleConfiguration | None:
locale_config = await LocaleMenu(preset).show()
return locale_config
@ -411,10 +418,18 @@ class GlobalMenu(AbstractMenu[None]):
return f'{tr("Hostname")}: {item.value}'
return None
def _prev_parallel_dw(self, item: MenuItem) -> str | None:
if item.value is not None:
return f'{tr("Parallel Downloads")}: {item.value}'
return None
async def _pacman_configuration(self, preset: PacmanConfiguration) -> PacmanConfiguration | None:
return await PacmanMenu(preset, advanced=self._advanced).show()
def _prev_pacman_config(self, item: MenuItem) -> str | None:
if not item.value:
return None
config: PacmanConfiguration = item.value
output = ''
if self._advanced:
output += '{}: {}\n'.format(tr('Parallel Downloads'), config.parallel_downloads)
output += '{}: {}'.format(tr('Color'), config.color)
return output
def _prev_kernel(self, item: MenuItem) -> str | None:
if item.value:
@ -472,11 +487,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 not in [FilesystemType.FAT12, FilesystemType.FAT16, FilesystemType.FAT32]:
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]:
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:

View File

@ -73,7 +73,7 @@ class GfxDriver(Enum):
text = tr('Installed packages') + ':\n'
for p in sorted(pkg_names):
text += f'\t- {p}\n'
text += f' - {p}\n'
return text

View File

@ -48,12 +48,13 @@ 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.packages import Repository
from archinstall.lib.models.pacman import PacmanConfiguration
from archinstall.lib.models.users import User
from archinstall.lib.output import debug, error, info, log, logger, warn
from archinstall.lib.packages.packages import installed_package
from archinstall.lib.pacman.config import PacmanConfig
from archinstall.lib.pacman.pacman import Pacman
from archinstall.lib.pathnames import PACMAN_CONF
from archinstall.lib.pathnames import MIRRORLIST, PACMAN_CONF
from archinstall.lib.plugins import plugins
from archinstall.lib.translationhandler import tr
@ -81,7 +82,7 @@ class Installer:
self.kernels = kernels or ['linux']
self._disk_config = disk_config
self._disk_encryption = disk_config.disk_encryption or DiskEncryption(EncryptionType.NoEncryption)
self._disk_encryption = disk_config.disk_encryption or DiskEncryption(EncryptionType.NO_ENCRYPTION)
self.target: Path = target
self.init_time = time.strftime('%Y-%m-%d_%H-%M-%S')
@ -253,16 +254,16 @@ class Installer:
luks_handlers: dict[Any, Luks2] = {}
match self._disk_encryption.encryption_type:
case EncryptionType.NoEncryption:
case EncryptionType.NO_ENCRYPTION:
self._import_lvm()
self._mount_lvm_layout()
case EncryptionType.Luks:
case EncryptionType.LUKS:
luks_handlers = self._prepare_luks_partitions(self._disk_encryption.partitions)
case EncryptionType.LvmOnLuks:
case EncryptionType.LVM_ON_LUKS:
luks_handlers = self._prepare_luks_partitions(self._disk_encryption.partitions)
self._import_lvm()
self._mount_lvm_layout(luks_handlers)
case EncryptionType.LuksOnLvm:
case EncryptionType.LUKS_ON_LVM:
self._import_lvm()
luks_handlers = self._prepare_luks_lvm(self._disk_encryption.lvm_volumes)
self._mount_lvm_layout(luks_handlers)
@ -368,7 +369,7 @@ class Installer:
if part_mod.mountpoint:
target = self.target / part_mod.relative_mountpoint
mount(part_mod.dev_path, target, options=part_mod.mount_options)
elif part_mod.fs_type == FilesystemType.Btrfs:
elif part_mod.fs_type == FilesystemType.BTRFS:
# Only mount BTRFS subvolumes that have mountpoints specified
subvols_with_mountpoints = [sv for sv in part_mod.btrfs_subvols if sv.mountpoint is not None]
if subvols_with_mountpoints:
@ -381,12 +382,12 @@ class Installer:
swapon(part_mod.dev_path)
def _mount_lvm_vol(self, volume: LvmVolume) -> None:
if volume.fs_type != FilesystemType.Btrfs:
if volume.fs_type != FilesystemType.BTRFS:
if volume.mountpoint and volume.dev_path:
target = self.target / volume.relative_mountpoint
mount(volume.dev_path, target, options=volume.mount_options)
if volume.fs_type == FilesystemType.Btrfs and volume.dev_path:
if volume.fs_type == FilesystemType.BTRFS and volume.dev_path:
# Only mount BTRFS subvolumes that have mountpoints specified
subvols_with_mountpoints = [sv for sv in volume.btrfs_subvols if sv.mountpoint is not None]
if subvols_with_mountpoints:
@ -396,7 +397,7 @@ class Installer:
if not luks_handler.mapper_dev:
return None
if part_mod.fs_type == FilesystemType.Btrfs and part_mod.btrfs_subvols:
if part_mod.fs_type == FilesystemType.BTRFS and part_mod.btrfs_subvols:
# Only mount BTRFS subvolumes that have mountpoints specified
subvols_with_mountpoints = [sv for sv in part_mod.btrfs_subvols if sv.mountpoint is not None]
if subvols_with_mountpoints:
@ -406,12 +407,12 @@ class Installer:
mount(luks_handler.mapper_dev, target, options=part_mod.mount_options)
def _mount_luks_volume(self, volume: LvmVolume, luks_handler: Luks2) -> None:
if volume.fs_type != FilesystemType.Btrfs:
if volume.fs_type != FilesystemType.BTRFS:
if volume.mountpoint and luks_handler.mapper_dev:
target = self.target / volume.relative_mountpoint
mount(luks_handler.mapper_dev, target, options=volume.mount_options)
if volume.fs_type == FilesystemType.Btrfs and luks_handler.mapper_dev:
if volume.fs_type == FilesystemType.BTRFS and luks_handler.mapper_dev:
# Only mount BTRFS subvolumes that have mountpoints specified
subvols_with_mountpoints = [sv for sv in volume.btrfs_subvols if sv.mountpoint is not None]
if subvols_with_mountpoints:
@ -432,11 +433,11 @@ class Installer:
def generate_key_files(self) -> None:
match self._disk_encryption.encryption_type:
case EncryptionType.Luks:
case EncryptionType.LUKS:
self._generate_key_files_partitions()
case EncryptionType.LuksOnLvm:
case EncryptionType.LUKS_ON_LVM:
self._generate_key_file_lvm_volumes()
case EncryptionType.LvmOnLuks:
case EncryptionType.LVM_ON_LUKS:
# currently LvmOnLuks only supports a single
# partitioning layout (boot + partition)
# so we won't need any keyfile generation atm
@ -504,10 +505,9 @@ class Installer:
# Copy over the install log (if there is one) to the install medium if
# at least the base has been strapped in, otherwise we won't have a filesystem/structure to copy to.
if self._helper_flags.get('base-strapped', False) is True:
absolute_logfile = logger.path
logfile_target = self.target / absolute_logfile
logfile_target.parent.mkdir(parents=True, exist_ok=True)
absolute_logfile.copy(logfile_target, preserve_metadata=True)
logfile_target = self.target / LPath(logger.directory).relative_to_root()
logfile_target.mkdir(parents=True, exist_ok=True)
logger.path.copy_into(logfile_target, preserve_metadata=True)
return True
@ -565,9 +565,12 @@ class Installer:
if result := plugin.on_mirrors(mirror_config):
mirror_config = result
root = self.target if on_target else Path('/')
mirrorlist_config = root / 'etc/pacman.d/mirrorlist'
pacman_config = root / PACMAN_CONF.relative_to_root()
if on_target:
mirrorlist_config = self.target / MIRRORLIST.relative_to_root()
pacman_config = self.target / PACMAN_CONF.relative_to_root()
else:
mirrorlist_config = MIRRORLIST
pacman_config = PACMAN_CONF
repositories_config = mirror_config.repositories_config()
if repositories_config:
@ -863,7 +866,7 @@ class Installer:
self._base_packages.append(pkg)
# https://github.com/archlinux/archinstall/issues/1837
if fs_type == FilesystemType.Btrfs:
if fs_type == FilesystemType.BTRFS:
self._disable_fstrim = True
def _prepare_encrypt(self, before: str = 'filesystems') -> None:
@ -883,6 +886,7 @@ class Installer:
mkinitcpio: bool = True,
hostname: str | None = None,
locale_config: LocaleConfiguration | None = LocaleConfiguration.default(),
pacman_config: PacmanConfiguration | None = None,
) -> None:
if self._disk_config.lvm_config:
lvm = 'lvm2'
@ -894,7 +898,7 @@ class Installer:
if vol.fs_type is not None:
self._prepare_fs_type(vol.fs_type, vol.mountpoint)
types = (EncryptionType.LvmOnLuks, EncryptionType.LuksOnLvm)
types = (EncryptionType.LVM_ON_LUKS, EncryptionType.LUKS_ON_LVM)
if self._disk_encryption.encryption_type in types:
self._prepare_encrypt(lvm)
else:
@ -929,6 +933,9 @@ class Installer:
pacman_conf.persist()
if pacman_config:
pacman_conf.configure(pacman_config)
# Periodic TRIM may improve the performance and longevity of SSDs whilst
# having no adverse effect on other devices. Most distributions enable
# periodic TRIM by default.
@ -1129,7 +1136,7 @@ class Installer:
kernel_parameters = []
match self._disk_encryption.encryption_type:
case EncryptionType.LvmOnLuks:
case EncryptionType.LVM_ON_LUKS:
if not lvm.vg_name:
raise ValueError(f'Unable to determine VG name for {lvm.name}')
@ -1146,7 +1153,7 @@ class Installer:
else:
debug(f'LvmOnLuks, encrypted root partition, identifying by UUID: {uuid}')
kernel_parameters.append(f'cryptdevice=UUID={uuid}:cryptlvm root={lvm.safe_dev_path}')
case EncryptionType.LuksOnLvm:
case EncryptionType.LUKS_ON_LVM:
uuid = self._get_luks_uuid_from_mapper_dev(lvm.mapper_path)
if self._disk_encryption.hsm_device:
@ -1155,7 +1162,7 @@ class Installer:
else:
debug(f'LuksOnLvm, encrypted root partition, identifying by UUID: {uuid}')
kernel_parameters.append(f'cryptdevice=UUID={uuid}:root root=/dev/mapper/root')
case EncryptionType.NoEncryption:
case EncryptionType.NO_ENCRYPTION:
debug(f'Identifying root lvm by mapper device: {lvm.dev_path}')
kernel_parameters.append(f'root={lvm.safe_dev_path}')
@ -1482,7 +1489,7 @@ class Installer:
efi_dir_path.mkdir(parents=True, exist_ok=True)
for file in ('BOOTIA32.EFI', 'BOOTX64.EFI'):
(limine_path / file).copy(efi_dir_path)
(limine_path / file).copy_into(efi_dir_path)
except Exception as err:
raise DiskError(f'Failed to install Limine in {self.target}{efi_partition.mountpoint}: {err}')
@ -1531,7 +1538,7 @@ class Installer:
try:
# The `limine-bios.sys` file contains stage 3 code.
(limine_path / 'limine-bios.sys').copy(boot_limine_path)
(limine_path / 'limine-bios.sys').copy_into(boot_limine_path)
# `limine bios-install` deploys the stage 1 and 2 to the
self.arch_chroot(f'limine bios-install {parent_dev_path}', peek_output=True)
@ -1957,18 +1964,22 @@ 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]
try:
self.arch_chroot(f'sh -c "chsh -s {shell} {user}"')
run(cmd)
return True
except SysCallError:
except CalledProcessError as err:
debug(f'Error setting user shell: {err}')
return False
def chown(self, owner: str, path: str, options: list[str] = []) -> bool:
cleaned_path = path.replace("'", "\\'")
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]
try:
self.arch_chroot(f"sh -c 'chown {' '.join(options)} {owner} {cleaned_path}'")
run(cmd)
return True
except SysCallError:
except CalledProcessError as err:
debug(f'Error changing ownership of {path}: {err}')
return False
def set_vconsole(self, locale_config: LocaleConfiguration) -> None:

View File

@ -1,17 +1,18 @@
import time
import urllib
import urllib.parse
from pathlib import Path
from archinstall.lib.models import MirrorRegion
from archinstall.lib.models.mirrors import MirrorStatusEntryV3, MirrorStatusListV3
from archinstall.lib.networking import fetch_data_from_url
from archinstall.lib.output import debug, info
from archinstall.lib.pathnames import MIRRORLIST
class MirrorListHandler:
def __init__(
self,
local_mirrorlist: Path = Path('/etc/pacman.d/mirrorlist'),
local_mirrorlist: Path = MIRRORLIST,
offline: bool = False,
verbose: bool = False,
) -> None:

View File

@ -15,7 +15,6 @@ from archinstall.lib.models.device import (
LvmLayoutType,
LvmVolume,
LvmVolumeGroup,
LvmVolumeStatus,
ModificationStatus,
PartitionFlag,
PartitionModification,
@ -57,7 +56,6 @@ __all__ = [
'LvmLayoutType',
'LvmVolume',
'LvmVolumeGroup',
'LvmVolumeStatus',
'MirrorConfiguration',
'MirrorRegion',
'ModificationStatus',

View File

@ -2,10 +2,12 @@ from dataclasses import dataclass
from enum import StrEnum, auto
from typing import Any, NotRequired, Self, TypedDict
from archinstall.lib.translationhandler import tr
class PowerManagement(StrEnum):
POWER_PROFILES_DAEMON = 'power-profiles-daemon'
TUNED = 'tuned'
TUNED = auto()
class PowerManagementConfigSerialization(TypedDict):
@ -31,7 +33,7 @@ class PrintServiceConfigSerialization(TypedDict):
class Firewall(StrEnum):
UFW = 'ufw'
UFW = auto()
FWD = 'firewalld'
@ -39,12 +41,37 @@ class FirewallConfigSerialization(TypedDict):
firewall: str
class FontPackage(StrEnum):
NOTO = 'noto-fonts'
EMOJI = 'noto-fonts-emoji'
CJK = 'noto-fonts-cjk'
LIBERATION = 'ttf-liberation'
DEJAVU = 'ttf-dejavu'
def description(self) -> str:
match self:
case FontPackage.NOTO:
return tr('Unicode font coverage for most languages')
case FontPackage.EMOJI:
return tr('color emoji for browsers and apps')
case FontPackage.CJK:
return tr('Chinese, Japanese, Korean characters')
case FontPackage.LIBERATION:
return tr('Arial/Times/Courier replacement, Cyrillic support for Steam/games')
case FontPackage.DEJAVU:
return tr('wide Unicode coverage, good fallback font')
class FontsConfigSerialization(TypedDict):
fonts: list[str]
class ZramAlgorithm(StrEnum):
ZSTD = 'zstd'
ZSTD = auto()
LZO_RLE = 'lzo-rle'
LZO = 'lzo'
LZ4 = 'lz4'
LZ4HC = 'lz4hc'
LZO = auto()
LZ4 = auto()
LZ4HC = auto()
class ApplicationSerialization(TypedDict):
@ -53,6 +80,7 @@ class ApplicationSerialization(TypedDict):
power_management_config: NotRequired[PowerManagementConfigSerialization]
print_service_config: NotRequired[PrintServiceConfigSerialization]
firewall_config: NotRequired[FirewallConfigSerialization]
fonts_config: NotRequired[FontsConfigSerialization]
@dataclass
@ -127,6 +155,18 @@ class FirewallConfiguration:
)
@dataclass
class FontsConfiguration:
fonts: list[FontPackage]
def json(self) -> FontsConfigSerialization:
return {'fonts': [f.value for f in self.fonts]}
@classmethod
def parse_arg(cls, arg: FontsConfigSerialization) -> Self:
return cls(fonts=[FontPackage(f) for f in arg['fonts']])
@dataclass(frozen=True)
class ZramConfiguration:
enabled: bool
@ -149,6 +189,7 @@ class ApplicationConfiguration:
power_management_config: PowerManagementConfiguration | None = None
print_service_config: PrintServiceConfiguration | None = None
firewall_config: FirewallConfiguration | None = None
fonts_config: FontsConfiguration | None = None
@classmethod
def parse_arg(
@ -177,6 +218,9 @@ class ApplicationConfiguration:
if args and (firewall_config := args.get('firewall_config')) is not None:
app_config.firewall_config = FirewallConfiguration.parse_arg(firewall_config)
if args and (fonts_config := args.get('fonts_config')) is not None:
app_config.fonts_config = FontsConfiguration.parse_arg(fonts_config)
return app_config
def json(self) -> ApplicationSerialization:
@ -197,4 +241,7 @@ class ApplicationConfiguration:
if self.firewall_config:
config['firewall_config'] = self.firewall_config.json()
if self.fonts_config:
config['fonts_config'] = self.fonts_config.json()
return config

View File

@ -2,9 +2,9 @@ import builtins
import math
import uuid
from dataclasses import dataclass, field
from enum import Enum
from enum import Enum, StrEnum, auto
from pathlib import Path
from typing import NotRequired, Self, TypedDict, override
from typing import Any, NotRequired, Self, TypedDict, override
from uuid import UUID
import parted
@ -131,9 +131,14 @@ class DiskLayoutConfiguration:
for partition in entry.get('partitions', []):
flags = [flag for f in partition.get('flags', []) if (flag := PartitionFlag.from_string(f))]
if fs_type := partition.get('fs_type'):
fs_type = FilesystemType(fs_type)
else:
fs_type = None
device_partition = PartitionModification(
status=ModificationStatus(partition['status']),
fs_type=FilesystemType(partition['fs_type']) if partition.get('fs_type') else None,
fs_type=fs_type,
start=Size.parse_args(partition['start']),
length=Size.parse_args(partition['size']),
mount_options=partition['mount_options'],
@ -159,15 +164,15 @@ class DiskLayoutConfiguration:
continue
first = non_delete_partitions[0]
if first.status == ModificationStatus.Create and not first.start.is_valid_start():
if first.status == ModificationStatus.CREATE and not first.start.is_valid_start():
raise ValueError('First partition must start at no less than 1 MiB')
for i, current_partition in enumerate(non_delete_partitions[1:], start=1):
previous_partition = non_delete_partitions[i - 1]
if current_partition.status == ModificationStatus.Create and current_partition.start < previous_partition.end:
if current_partition.status == ModificationStatus.CREATE and current_partition.start < previous_partition.end:
raise ValueError('Partitions overlap')
create_partitions = [part_mod for part_mod in non_delete_partitions if part_mod.status == ModificationStatus.Create]
create_partitions = [part_mod for part_mod in non_delete_partitions if part_mod.status == ModificationStatus.CREATE]
if not create_partitions:
continue
@ -200,7 +205,7 @@ class DiskLayoutConfiguration:
def has_default_btrfs_vols(self) -> bool:
for mod in self.device_modifications:
for part in mod.partitions:
if not (part.is_create_or_modify() and part.fs_type == FilesystemType.Btrfs):
if not (part.is_create_or_modify() and part.fs_type == FilesystemType.BTRFS):
continue
if any(subvol.is_default_root() for subvol in part.btrfs_subvols):
@ -715,23 +720,23 @@ class BDevice:
return hash(self.disk.device.path)
class PartitionType(Enum):
Boot = 'boot'
Primary = 'primary'
_Unknown = 'unknown'
class PartitionType(StrEnum):
BOOT = auto()
PRIMARY = auto()
_UNKNOWN = 'unknown'
@classmethod
def get_type_from_code(cls, code: int) -> Self:
if code == parted.PARTITION_NORMAL:
return cls.Primary
return cls.PRIMARY
else:
debug(f'Partition code not supported: {code}')
return cls._Unknown
return cls._UNKNOWN
def get_partition_code(self) -> int | None:
if self == PartitionType.Primary:
if self == PartitionType.PRIMARY:
return parted.PARTITION_NORMAL
elif self == PartitionType.Boot:
elif self == PartitionType.BOOT:
return parted.PARTITION_BOOT
return None
@ -777,48 +782,48 @@ class PartitionGUID(Enum):
return uuid.UUID(self.value).bytes
class FilesystemType(Enum):
Btrfs = 'btrfs'
Ext2 = 'ext2'
Ext3 = 'ext3'
Ext4 = 'ext4'
F2fs = 'f2fs'
Fat12 = 'fat12'
Fat16 = 'fat16'
Fat32 = 'fat32'
Ntfs = 'ntfs'
Xfs = 'xfs'
LinuxSwap = 'linux-swap'
class FilesystemType(StrEnum):
BTRFS = auto()
EXT2 = auto()
EXT3 = auto()
EXT4 = auto()
F2FS = auto()
FAT12 = auto()
FAT16 = auto()
FAT32 = auto()
NTFS = auto()
XFS = auto()
LINUX_SWAP = 'linux-swap'
# this is not a FS known to parted, so be careful
# with the usage from this enum
Crypto_luks = 'crypto_LUKS'
CRYPTO_LUKS = 'crypto_LUKS'
def is_crypto(self) -> bool:
return self == FilesystemType.Crypto_luks
return self == FilesystemType.CRYPTO_LUKS
@property
def parted_value(self) -> str:
return self.value + '(v1)' if self == FilesystemType.LinuxSwap else self.value
return self.value + '(v1)' if self == FilesystemType.LINUX_SWAP else self.value
@property
def installation_pkg(self) -> str | None:
match self:
case FilesystemType.Btrfs:
case FilesystemType.BTRFS:
return 'btrfs-progs'
case FilesystemType.Xfs:
case FilesystemType.XFS:
return 'xfsprogs'
case FilesystemType.F2fs:
case FilesystemType.F2FS:
return 'f2fs-tools'
case _:
return None
class ModificationStatus(Enum):
Exist = 'existing'
Modify = 'modify'
Delete = 'delete'
Create = 'create'
class ModificationStatus(StrEnum):
EXIST = 'existing'
MODIFY = auto()
DELETE = auto()
CREATE = auto()
class _PartitionModificationSerialization(TypedDict):
@ -863,7 +868,7 @@ class PartitionModification:
if self.is_exists_or_modify() and not self.dev_path:
raise ValueError('If partition marked as existing a path must be set')
if self.fs_type is None and self.status == ModificationStatus.Modify:
if self.fs_type is None and self.status == ModificationStatus.MODIFY:
raise ValueError('FS type must not be empty on modifications with status type modify')
@override
@ -906,7 +911,7 @@ class PartitionModification:
subvol_mods = []
return cls(
status=ModificationStatus.Exist,
status=ModificationStatus.EXIST,
type=partition_info.type,
start=partition_info.start,
length=partition_info.length,
@ -953,26 +958,26 @@ class PartitionModification:
return False
def is_swap(self) -> bool:
return self.fs_type == FilesystemType.LinuxSwap
return self.fs_type == FilesystemType.LINUX_SWAP
def is_modify(self) -> bool:
return self.status == ModificationStatus.Modify
return self.status == ModificationStatus.MODIFY
def is_delete(self) -> bool:
return self.status == ModificationStatus.Delete
return self.status == ModificationStatus.DELETE
def exists(self) -> bool:
return self.status == ModificationStatus.Exist
return self.status == ModificationStatus.EXIST
def is_exists_or_modify(self) -> bool:
return self.status in [
ModificationStatus.Exist,
ModificationStatus.Delete,
ModificationStatus.Modify,
ModificationStatus.EXIST,
ModificationStatus.DELETE,
ModificationStatus.MODIFY,
]
def is_create_or_modify(self) -> bool:
return self.status in [ModificationStatus.Create, ModificationStatus.Modify]
return self.status in [ModificationStatus.CREATE, ModificationStatus.MODIFY]
@property
def mapper_name(self) -> str | None:
@ -1083,13 +1088,6 @@ class LvmVolumeGroup:
return lv in self.volumes
class LvmVolumeStatus(Enum):
Exist = 'existing'
Modify = 'modify'
Delete = 'delete'
Create = 'create'
class _LvmVolumeSerialization(TypedDict):
obj_id: str
status: str
@ -1103,7 +1101,7 @@ class _LvmVolumeSerialization(TypedDict):
@dataclass
class LvmVolume:
status: LvmVolumeStatus
status: ModificationStatus
name: str
fs_type: FilesystemType
length: Size
@ -1172,7 +1170,7 @@ class LvmVolume:
@classmethod
def parse_arg(cls, arg: _LvmVolumeSerialization) -> Self:
volume = cls(
status=LvmVolumeStatus(arg['status']),
status=ModificationStatus(arg['status']),
name=arg['name'],
fs_type=FilesystemType(arg['fs_type']),
length=Size.parse_args(arg['length']),
@ -1210,13 +1208,13 @@ class LvmVolume:
return part_mod
def is_modify(self) -> bool:
return self.status == LvmVolumeStatus.Modify
return self.status == ModificationStatus.MODIFY
def exists(self) -> bool:
return self.status == LvmVolumeStatus.Exist
return self.status == ModificationStatus.EXIST
def is_exists_or_modify(self) -> bool:
return self.status in [LvmVolumeStatus.Exist, LvmVolumeStatus.Modify]
return self.status in [ModificationStatus.EXIST, ModificationStatus.MODIFY]
def is_root(self) -> bool:
if self.mountpoint is not None:
@ -1402,19 +1400,19 @@ class DeviceModification:
}
class EncryptionType(Enum):
NoEncryption = 'no_encryption'
Luks = 'luks'
LvmOnLuks = 'lvm_on_luks'
LuksOnLvm = 'luks_on_lvm'
class EncryptionType(StrEnum):
NO_ENCRYPTION = auto()
LUKS = auto()
LVM_ON_LUKS = auto()
LUKS_ON_LVM = auto()
@classmethod
def _encryption_type_mapper(cls) -> dict[str, Self]:
return {
tr('No Encryption'): cls.NoEncryption,
tr('LUKS'): cls.Luks,
tr('LVM on LUKS'): cls.LvmOnLuks,
tr('LUKS on LVM'): cls.LuksOnLvm,
tr('No Encryption'): cls.NO_ENCRYPTION,
tr('LUKS'): cls.LUKS,
tr('LVM on LUKS'): cls.LVM_ON_LUKS,
tr('LUKS on LVM'): cls.LUKS_ON_LVM,
}
@classmethod
@ -1438,7 +1436,7 @@ class _DiskEncryptionSerialization(TypedDict):
@dataclass
class DiskEncryption:
encryption_type: EncryptionType = EncryptionType.NoEncryption
encryption_type: EncryptionType = EncryptionType.NO_ENCRYPTION
encryption_password: Password | None = None
partitions: list[PartitionModification] = field(default_factory=list)
lvm_volumes: list[LvmVolume] = field(default_factory=list)
@ -1446,10 +1444,10 @@ class DiskEncryption:
iter_time: int = DEFAULT_ITER_TIME
def __post_init__(self) -> None:
if self.encryption_type in [EncryptionType.Luks, EncryptionType.LvmOnLuks] and not self.partitions:
if self.encryption_type in [EncryptionType.LUKS, EncryptionType.LVM_ON_LUKS] and not self.partitions:
raise ValueError('Luks or LvmOnLuks encryption require partitions to be defined')
if self.encryption_type == EncryptionType.LuksOnLvm and not self.lvm_volumes:
if self.encryption_type == EncryptionType.LUKS_ON_LVM and not self.lvm_volumes:
raise ValueError('LuksOnLvm encryption require LMV volumes to be defined')
def should_generate_encryption_file(self, dev: PartitionModification | LvmVolume) -> bool:
@ -1592,14 +1590,18 @@ class LsblkInfo(BaseModel):
@field_validator('size', mode='before')
@classmethod
def convert_size(cls, v: int, info: ValidationInfo) -> Size:
sector_size = SectorSize(info.data['log_sec'], Unit.B)
return Size(v, Unit.B, sector_size)
def convert_size(cls, value: Any, info: ValidationInfo) -> Any:
if isinstance(value, int):
sector_size = SectorSize(info.data['log_sec'], Unit.B)
return Size(value, Unit.B, sector_size)
return value
@field_validator('mountpoints', 'fsroots', mode='before')
@classmethod
def remove_none(cls, v: list[Path | None]) -> list[Path]:
return [item for item in v if item is not None]
def remove_none(cls, value: Any) -> Any:
if isinstance(value, list):
return [item for item in value if item is not None]
return value
@field_serializer('size', when_used='json')
def serialize_size(self, size: Size) -> str:

View File

@ -0,0 +1,42 @@
from dataclasses import dataclass
from typing import Self, TypedDict
from archinstall.lib.translationhandler import tr
class PacmanConfigSerialization(TypedDict):
parallel_downloads: int
color: bool
@dataclass
class PacmanConfiguration:
parallel_downloads: int = 5
color: bool = True
@classmethod
def default(cls) -> Self:
return cls()
def json(self) -> PacmanConfigSerialization:
return {
'parallel_downloads': self.parallel_downloads,
'color': self.color,
}
def preview(self) -> str:
color_str = str(self.color)
output = '{}: {}\n'.format(tr('Parallel Downloads'), self.parallel_downloads)
output += '{}: {}'.format(tr('Color'), color_str)
return output
@classmethod
def parse_arg(cls, args: PacmanConfigSerialization) -> Self:
config = cls.default()
if 'parallel_downloads' in args:
config.parallel_downloads = int(args['parallel_downloads'])
if 'color' in args:
config.color = bool(args['color'])
return config

View File

@ -2,6 +2,7 @@ import re
from pathlib import Path
from archinstall.lib.models.packages import Repository
from archinstall.lib.models.pacman import PacmanConfiguration
from archinstall.lib.pathnames import PACMAN_CONF
@ -50,5 +51,23 @@ class PacmanConfig:
f.writelines(content)
def persist(self) -> None:
if self._repositories and self._config_remote_path:
if self._config_remote_path:
PACMAN_CONF.copy(self._config_remote_path, preserve_metadata=True)
def configure(self, pacman_config: PacmanConfiguration) -> None:
"""Apply PacmanConfiguration (Color, ParallelDownloads) to the target system's pacman.conf."""
if not self._config_remote_path or not self._config_remote_path.exists():
return
content = self._config_remote_path.read_text().splitlines()
result = []
for line in content:
if re.match(r'^#?\s*ParallelDownloads', line):
result.append(f'ParallelDownloads = {pacman_config.parallel_downloads}')
elif re.match(r'^#?\s*Color\s*$', line):
result.append('Color' if pacman_config.color else '#Color')
else:
result.append(line)
self._config_remote_path.write_text('\n'.join(result) + '\n')

View File

@ -0,0 +1,117 @@
from typing import override
from archinstall.lib.menu.abstract_menu import AbstractSubMenu
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
class PacmanMenu(AbstractSubMenu[PacmanConfiguration]):
def __init__(
self,
pacman_conf: PacmanConfiguration,
advanced: bool = False,
):
self._pacman_conf = pacman_conf
self._advanced = advanced
menu_options = self._define_menu_options()
self._item_group = MenuItemGroup(menu_options, sort_items=False, checkmarks=True)
super().__init__(
self._item_group,
config=self._pacman_conf,
allow_reset=True,
)
def _define_menu_options(self) -> list[MenuItem]:
return [
MenuItem(
text=tr('Parallel Downloads'),
action=select_parallel_downloads,
value=self._pacman_conf.parallel_downloads,
preview_action=lambda item: str(item.get_value()),
key='parallel_downloads',
enabled=self._advanced,
),
MenuItem(
text=tr('Color'),
action=select_color,
value=self._pacman_conf.color,
preview_action=lambda item: str(item.get_value()),
key='color',
),
]
@override
async def show(self) -> PacmanConfiguration | None:
config = await super().show()
if config is None:
return PacmanConfiguration.default()
_apply_to_live(config.parallel_downloads)
return config
def _apply_to_live(parallel_downloads: int) -> None:
"""Apply ParallelDownloads to live system pacman.conf for faster installation."""
with PACMAN_CONF.open() as f:
pacman_conf = f.read().split('\n')
with PACMAN_CONF.open('w') as fwrite:
for line in pacman_conf:
if 'ParallelDownloads' in line:
fwrite.write(f'ParallelDownloads = {parallel_downloads}\n')
else:
fwrite.write(f'{line}\n')
async def select_parallel_downloads(preset: int = 5) -> int | None:
max_recommended = 10
header = tr('Enter the number of parallel downloads (1-{})').format(max_recommended)
def validator(s: str) -> str | None:
try:
value = int(s)
if 1 <= value <= max_recommended:
return None
return tr('Value must be between 1 and {}').format(max_recommended)
except Exception:
return tr('Please enter a valid number')
result = await Input(
header=header,
allow_skip=True,
allow_reset=True,
validator_callback=validator,
default_value=str(preset),
).show()
match result.type_:
case ResultType.Skip:
return preset
case ResultType.Reset:
return 5
case ResultType.Selection:
return int(result.get_value())
async def select_color(preset: bool = True) -> bool | None:
result = await Confirmation(
header=tr('Enable colored output for pacman'),
preset=preset,
allow_skip=True,
).show()
match result.type_:
case ResultType.Skip:
return preset
case ResultType.Reset:
return True
case ResultType.Selection:
return result.get_value()

View File

@ -4,4 +4,5 @@ from typing import Final
from archinstall.lib.linux_path import LPath
ARCHISO_MOUNTPOINT: Final = Path('/run/archiso/airootfs')
MIRRORLIST: Final = LPath('/etc/pacman.d/mirrorlist')
PACMAN_CONF: Final = LPath('/etc/pacman.conf')

View File

@ -2,10 +2,16 @@ import builtins
import gettext
import json
import os
import tempfile
from dataclasses import dataclass
from pathlib import Path
from typing import override
from archinstall.lib.command import SysCommand
from archinstall.lib.exceptions import SysCallError
from archinstall.lib.output import debug
from archinstall.lib.utils.util import running_from_iso
@dataclass
class Language:
@ -14,6 +20,7 @@ class Language:
translation: gettext.NullTranslations
translation_percent: int
translated_lang: str | None
console_font: str | None = None
@property
def display_name(self) -> str:
@ -31,10 +38,18 @@ class Language:
return self.name_en
_DEFAULT_FONT = 'default8x16'
_ENV_FONT = os.environ.get('FONT')
class TranslationHandler:
def __init__(self) -> None:
self._base_pot = 'base.pot'
self._languages = 'languages.json'
self._active_language: Language | None = None
self._font_backup: Path | None = None
self._cmap_backup: Path | None = None
self._using_env_font: bool = False
self._total_messages = self._get_total_active_messages()
self._translated_languages = self._get_translations()
@ -43,6 +58,65 @@ class TranslationHandler:
def translated_languages(self) -> list[Language]:
return self._translated_languages
@property
def active_font(self) -> str | None:
if self._active_language is not None:
return self._active_language.console_font
return None
def _set_font(self, font_name: str | None) -> bool:
"""Set the console font via setfont. Only runs on ISO. Returns True on success."""
if not running_from_iso():
return False
target = font_name or _DEFAULT_FONT
try:
SysCommand(['setfont', target])
return True
except SysCallError as err:
debug(f'Failed to set console font {target}: {err}')
return False
def save_console_font(self) -> None:
"""Save the current console font (with unicode map) and console map to temp files."""
if not running_from_iso():
return
try:
font_fd, font_path = tempfile.mkstemp(prefix='archinstall_font_')
cmap_fd, cmap_path = tempfile.mkstemp(prefix='archinstall_cmap_')
os.close(font_fd)
os.close(cmap_fd)
self._font_backup = Path(font_path)
self._cmap_backup = Path(cmap_path)
SysCommand(['setfont', '-O', str(self._font_backup), '-om', str(self._cmap_backup)])
except SysCallError as err:
debug(f'Failed to save console font: {err}')
self._font_backup = None
self._cmap_backup = None
def restore_console_font(self) -> None:
"""Restore console font (with unicode map) and console map from backup."""
if not running_from_iso():
return
if self._font_backup is None or not self._font_backup.exists():
return
cmd = ['setfont', str(self._font_backup)]
if self._cmap_backup is not None and self._cmap_backup.exists():
cmd += ['-m', str(self._cmap_backup)]
try:
SysCommand(cmd)
except SysCallError as err:
debug(f'Failed to restore console font: {err}')
self._font_backup.unlink(missing_ok=True)
self._font_backup = None
if self._cmap_backup is not None:
self._cmap_backup.unlink(missing_ok=True)
self._cmap_backup = None
def _get_translations(self) -> list[Language]:
"""
Load all translated languages and return a list of such
@ -57,6 +131,7 @@ class TranslationHandler:
abbr = mapping_entry['abbr']
lang = mapping_entry['lang']
translated_lang = mapping_entry.get('translated_lang', None)
console_font = mapping_entry.get('console_font', None)
try:
# get a translation for a specific language
@ -71,7 +146,7 @@ class TranslationHandler:
# prevent cases where the .pot file is out of date and the percentage is above 100
percent = min(100, percent)
language = Language(abbr, lang, translation, percent, translated_lang)
language = Language(abbr, lang, translation, percent, translated_lang, console_font)
languages.append(language)
except FileNotFoundError as err:
raise FileNotFoundError(f"Could not locate language file for '{lang}': {err}")
@ -127,12 +202,39 @@ class TranslationHandler:
except Exception:
raise ValueError(f'No language with abbreviation "{abbr}" found')
def activate(self, language: Language) -> None:
def activate(self, language: Language, set_font: bool = True) -> None:
"""
Set the provided language as the current translation
"""
# The install() call has the side effect of assigning GNUTranslations.gettext to builtins._
language.translation.install()
self._active_language = language
if set_font and not self._using_env_font:
self._set_font(language.console_font)
def apply_console_font(self) -> None:
"""Apply console font from FONT env var or active language mapping.
If FONT env var is set and valid, use it and skip language mapping.
If FONT is set but invalid, fall back to language font.
If FONT is not set, use active language font.
"""
if not running_from_iso():
return
if _ENV_FONT:
if self._set_font(_ENV_FONT):
self._using_env_font = True
debug(f'Console font set from FONT env var: {_ENV_FONT}')
else:
debug(f'FONT={_ENV_FONT} could not be set, falling back to language font mapping')
if self.active_font:
self._set_font(self.active_font)
debug(f'Console font set from language mapping: {self.active_font}')
elif self.active_font:
self._set_font(self.active_font)
debug(f'Console font set from language mapping: {self.active_font}')
def _get_locales_dir(self) -> Path:
"""

File diff suppressed because it is too large Load Diff

View File

@ -833,6 +833,19 @@ msgstr ""
msgid "Parallel Downloads"
msgstr ""
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr ""
msgid "Enable colored output for pacman"
msgstr ""
msgid "ESC to skip"
msgstr ""
@ -1712,6 +1725,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)"
@ -1943,6 +2073,21 @@ msgstr ""
msgid "Firewall"
msgstr ""
msgid "Additional fonts"
msgstr ""
msgid "Select font packages to install"
msgstr ""
msgid "Unicode font coverage for most languages"
msgstr ""
msgid "color emoji for browsers and apps"
msgstr ""
msgid "Chinese, Japanese, Korean characters"
msgstr ""
msgid "Select audio configuration"
msgstr ""
@ -2073,3 +2218,42 @@ 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 ""
msgid "Dependencies"
msgstr ""
msgid "Package group"
msgstr ""
msgid "Extensive KDE Plasma installation"
msgstr ""
msgid "Packages in group"
msgstr ""
msgid "Minimal KDE Plasma installation"
msgstr ""
msgid "Description"
msgstr ""
msgid "Select a flavor of KDE Plasma to install"
msgstr ""
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
msgstr ""
msgid "wide Unicode coverage, good fallback font"
msgstr ""

View File

@ -823,6 +823,19 @@ msgstr "Entrada no vàlida! Intenteu-ho novament amb una entrada vàlida [1 a {m
msgid "Parallel Downloads"
msgstr "Descàrregues paral·leles"
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, fuzzy, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr "Introduïu el número de descàrregues paral·leles permeses"
msgid "Enable colored output for pacman"
msgstr ""
msgid "ESC to skip"
msgstr "ESC per a ometre"
@ -1663,6 +1676,139 @@ msgstr "Iniciar el mode de cerca"
msgid "Exit search mode"
msgstr "Sortir del mode de cerca"
msgid "General"
msgstr ""
#, fuzzy
msgid "Navigation"
msgstr "Guardar configuració"
#, fuzzy
msgid "Selection"
msgstr "Seleccioneu regions"
msgid "Search"
msgstr ""
msgid "Down"
msgstr ""
msgid "Up"
msgstr ""
#, fuzzy
msgid "Confirm"
msgstr "Confirmar i sortir"
#, fuzzy
msgid "Focus right"
msgstr "Mou a la dreta"
#, fuzzy
msgid "Focus left"
msgstr "Mou a l'esquerra"
msgid "Toggle"
msgstr ""
#, fuzzy
msgid "Show/Hide help"
msgstr "Mostrar l'ajuda"
msgid "Quit"
msgstr ""
msgid "First"
msgstr ""
msgid "Last"
msgstr ""
#, fuzzy
msgid "Select"
msgstr "Seleccioneu regions"
msgid "Page Up"
msgstr ""
msgid "Page Down"
msgstr ""
#, fuzzy
msgid "Page up"
msgstr "Group de paquets:"
#, fuzzy
msgid "Page down"
msgstr "Mou avall"
msgid "Page Left"
msgstr ""
#, fuzzy
msgid "Page Right"
msgstr "Mou a la dreta"
msgid "Cursor up"
msgstr ""
#, fuzzy
msgid "Cursor down"
msgstr "Mou avall"
#, fuzzy
msgid "Cursor right"
msgstr "Mou a la dreta"
#, fuzzy
msgid "Cursor left"
msgstr "Mou a l'esquerra"
msgid "Top"
msgstr ""
msgid "Bottom"
msgstr ""
msgid "Home"
msgstr ""
#, fuzzy
msgid "End"
msgstr "Activat"
#, fuzzy
msgid "Toggle option"
msgstr "Opcions del subvolum"
msgid "Scroll Up"
msgstr ""
#, fuzzy
msgid "Scroll Down"
msgstr "Previsualització avall"
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 necessita accés al vostre seient (gestor de dispositius de maquinari, com ara teclat, ratolí, etc)"
@ -1881,6 +2027,23 @@ msgstr "Utilitzar Network Manager (backend per a iwd)"
msgid "Firewall"
msgstr "Tallafocs"
#, fuzzy
msgid "Additional fonts"
msgstr "Repositoris addicionals"
#, fuzzy
msgid "Select font packages to install"
msgstr "Selecció del bootloader a instal·lar"
msgid "Unicode font coverage for most languages"
msgstr ""
msgid "color emoji for browsers and apps"
msgstr ""
msgid "Chinese, Japanese, Korean characters"
msgstr ""
msgid "Select audio configuration"
msgstr "Seleccionar configuració d'àudio"
@ -2002,3 +2165,52 @@ msgstr "Seguretat de la contrasenya: alta"
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr "El perfil d'escriptori seleccionat necessita de l'inici de sessió d'un usuari mitjançant el gestor"
#, fuzzy, python-brace-format
msgid "Environment type: {} {}"
msgstr "Tipus d'entorn: {}"
#, fuzzy
msgid "Input cannot be empty"
msgstr "El valor no pot ser buit"
msgid "Recommended"
msgstr ""
#, fuzzy
msgid "Package"
msgstr "Group de paquets:"
msgid "Curated selection of KDE Plasma packages"
msgstr ""
msgid "Dependencies"
msgstr ""
#, fuzzy
msgid "Package group"
msgstr "Group de paquets:"
msgid "Extensive KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Packages in group"
msgstr "Group de paquets:"
msgid "Minimal KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Description"
msgstr "Xifrat de disc"
#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
msgstr "Selecció del bootloader a instal·lar"
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
msgstr ""
msgid "wide Unicode coverage, good fallback font"
msgstr ""

View File

@ -815,6 +815,19 @@ msgstr "Neplatný vstup! Zkuste to, prosím, znovu s platným vstupem [1 až {ma
msgid "Parallel Downloads"
msgstr "Paralelní stahování"
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, fuzzy, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr "Zadejte povolený počet paralelních stahování, která mají být povolena"
msgid "Enable colored output for pacman"
msgstr ""
msgid "ESC to skip"
msgstr "Pomocí ESC přeskočíte"
@ -1655,6 +1668,139 @@ msgstr "Spustit režim vyhledávání"
msgid "Exit search mode"
msgstr "Opustit režim vyhledávání"
msgid "General"
msgstr ""
#, fuzzy
msgid "Navigation"
msgstr "Uložit konfiguraci"
#, fuzzy
msgid "Selection"
msgstr "Zvolte regiony"
msgid "Search"
msgstr ""
msgid "Down"
msgstr ""
msgid "Up"
msgstr ""
#, fuzzy
msgid "Confirm"
msgstr "Potvrdit a ukončit"
#, fuzzy
msgid "Focus right"
msgstr "Posunout doprava"
#, fuzzy
msgid "Focus left"
msgstr "Posunout doleva"
msgid "Toggle"
msgstr ""
#, fuzzy
msgid "Show/Hide help"
msgstr "Zobrazit nápovědu"
msgid "Quit"
msgstr ""
msgid "First"
msgstr ""
msgid "Last"
msgstr ""
#, fuzzy
msgid "Select"
msgstr "Zvolte regiony"
msgid "Page Up"
msgstr ""
msgid "Page Down"
msgstr ""
#, fuzzy
msgid "Page up"
msgstr "Skupina balíčků:"
#, fuzzy
msgid "Page down"
msgstr "Posunout dolů"
msgid "Page Left"
msgstr ""
#, fuzzy
msgid "Page Right"
msgstr "Posunout doprava"
msgid "Cursor up"
msgstr ""
#, fuzzy
msgid "Cursor down"
msgstr "Posunout dolů"
#, fuzzy
msgid "Cursor right"
msgstr "Posunout doprava"
#, fuzzy
msgid "Cursor left"
msgstr "Posunout doleva"
msgid "Top"
msgstr ""
msgid "Bottom"
msgstr ""
msgid "Home"
msgstr ""
#, fuzzy
msgid "End"
msgstr "Povoleno"
#, fuzzy
msgid "Toggle option"
msgstr "Přepínače podsvazku"
msgid "Scroll Up"
msgstr ""
#, fuzzy
msgid "Scroll Down"
msgstr "Posunout náhled dolů"
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 vyžaduje přístup k vašemu sezení (soubor zařízení jako např. klávesnice, myš, atd.)"
@ -1873,6 +2019,23 @@ msgstr "Použít Network Manager (iwd backend)"
msgid "Firewall"
msgstr "Firewall"
#, fuzzy
msgid "Additional fonts"
msgstr "Dodatečné repozitáře"
#, fuzzy
msgid "Select font packages to install"
msgstr "Zvolte zavaděč k instalaci"
msgid "Unicode font coverage for most languages"
msgstr ""
msgid "color emoji for browsers and apps"
msgstr ""
msgid "Chinese, Japanese, Korean characters"
msgstr ""
msgid "Select audio configuration"
msgstr "Zvolte konfiguraci zvuku"
@ -1900,6 +2063,7 @@ msgstr "Zvolte disky pro instalaci"
msgid "Enter a mountpoint"
msgstr "Zadejte přípojný bod"
#, python-brace-format
msgid "Enter a size (default: {}): "
msgstr "Zadejte velikost (výchozí: {}): "
@ -1994,3 +2158,52 @@ msgstr "Síla hesla: Silné"
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr "Zvolený profil plochy vyžaduje, aby se normální uživatel přihlásil prostřednictvím přihlašovací obrazovky"
#, fuzzy, python-brace-format
msgid "Environment type: {} {}"
msgstr "Typ prostředí: {}"
#, fuzzy
msgid "Input cannot be empty"
msgstr "Hodnota nesmí být prázdná"
msgid "Recommended"
msgstr ""
#, fuzzy
msgid "Package"
msgstr "Skupina balíčků:"
msgid "Curated selection of KDE Plasma packages"
msgstr ""
msgid "Dependencies"
msgstr ""
#, fuzzy
msgid "Package group"
msgstr "Skupina balíčků:"
msgid "Extensive KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Packages in group"
msgstr "Skupina balíčků:"
msgid "Minimal KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Description"
msgstr "Šifrování disku"
#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
msgstr "Zvolte zavaděč k instalaci"
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
msgstr ""
msgid "wide Unicode coverage, good fallback font"
msgstr ""

View File

@ -299,7 +299,7 @@ msgid "Automatic time sync (NTP)"
msgstr "Automatische Zeitsynchronisierung (NTP)"
msgid "Install ({} config(s) missing)"
msgstr "Installieren ({} Konfiguration(en) ausständig)"
msgstr "Installieren ({} Konfiguration(en) ausstehend)"
msgid ""
"You decided to skip harddrive selection\n"
@ -824,6 +824,19 @@ msgstr "Ungültige Eingabe! Erneut mit gültiger Eingabe versuchen [1 bis {max_d
msgid "Parallel Downloads"
msgstr "Parallele Downloads"
msgid "Pacman"
msgstr "Pacman"
msgid "Color"
msgstr "Farbe"
#, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr "Anzahl paralleler Downloads eingeben (1-{})"
msgid "Enable colored output for pacman"
msgstr "Farbige Ausgabe für Pacman aktivieren"
msgid "ESC to skip"
msgstr "Drücken Sie ESC, um zu überspringen"
@ -854,7 +867,7 @@ msgstr "Konnte Profil nicht von der angegebenen URL holen: {}"
#, python-brace-format
msgid "Profiles must have unique name, but profile definitions with duplicate name found: {}"
msgstr "Profile müssen einen eindeutige Namen haben, aber Profildefinition mit gleichem Namen gefunden: {}"
msgstr "Profile müssen einen eindeutigen Namen haben, aber Profildefinition mit gleichem Namen gefunden: {}"
msgid "Select one or more devices to use and configure"
msgstr "Wählen Sie ein oder mehrere Gerät(e) aus, die konfiguriert und verwendet werden sollen"
@ -1037,7 +1050,7 @@ msgid "The proprietary Nvidia driver is not supported by Sway. It is likely that
msgstr "Der proprietäre Nvidia-Treiber wird von Sway nicht unterstützt. Es ist wahrscheinlich, dass Fehler auftreten werden, trotzdem fortfahren?"
msgid "Installed packages"
msgstr "Installiere Pakete"
msgstr "Installierte Pakete"
msgid "Add profile"
msgstr "Profil hinzufügen"
@ -1072,7 +1085,7 @@ msgid ""
msgstr ""
"\n"
"\n"
"Wählen sie einen Grafiktreiber aus oder leer lassen um alle quelloffenen Treiber zu installieren"
"Wählen Sie einen Grafiktreiber aus oder leer lassen, um alle quelloffenen Treiber zu installieren"
msgid "Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
msgstr "Sway benötigt Zugriff auf ihren Seat (Sammlung von Hardwaregeräten wie Tastatur, Maus, usw.)"
@ -1467,7 +1480,7 @@ msgid "Confirm password"
msgstr "Passwort bestätigen"
msgid "The confirmation password did not match, please try again"
msgstr "Das Passwort stimmt nicht überein, bitte versuche es erneut"
msgstr "Das Passwort stimmt nicht überein, bitte versuchen Sie es erneut"
msgid "Not a valid directory"
msgstr "Ungültiges Verzeichnis"
@ -1546,7 +1559,7 @@ msgid "Some packages could not be found in the repository"
msgstr "Einige Pakete konnten nicht in den Repositorien gefunden werden"
msgid "User"
msgstr "Benutzername"
msgstr "Benutzer"
msgid "The specified configuration will be applied"
msgstr "Die festgelegte Konfiguration wird angewendet"
@ -1665,6 +1678,123 @@ msgstr "Suchmodus starten"
msgid "Exit search mode"
msgstr "Suchmodus beenden"
msgid "General"
msgstr "Allgemein"
msgid "Navigation"
msgstr "Navigation"
msgid "Selection"
msgstr "Auswahl"
msgid "Search"
msgstr "Suchen"
msgid "Down"
msgstr "Runter"
msgid "Up"
msgstr "Hoch"
msgid "Confirm"
msgstr "Bestätigen und Schließen"
msgid "Focus right"
msgstr "Nach rechts bewegen"
msgid "Focus left"
msgstr "Nach links bewegen"
msgid "Toggle"
msgstr "Umschalten"
msgid "Show/Hide help"
msgstr "Hilfe anzeigen/ausblenden"
msgid "Quit"
msgstr "Beenden"
msgid "First"
msgstr "Erste"
msgid "Last"
msgstr "Letzte"
msgid "Select"
msgstr "Auswählen"
msgid "Page Up"
msgstr "Bild nach oben"
msgid "Page Down"
msgstr "Bild nach unten"
msgid "Page up"
msgstr "Bild nach oben"
msgid "Page down"
msgstr "Bild nach unten"
msgid "Page Left"
msgstr "Seite nach links"
msgid "Page Right"
msgstr "Seite nach rechts"
msgid "Cursor up"
msgstr "Cursor nach oben"
msgid "Cursor down"
msgstr "Cursor nach unten"
msgid "Cursor right"
msgstr "Cursor nach rechts"
msgid "Cursor left"
msgstr "Cursor nach links"
msgid "Top"
msgstr "Zum Anfang"
msgid "Bottom"
msgstr "Zum Ende"
msgid "Home"
msgstr "Pos1"
msgid "End"
msgstr "Ende"
msgid "Toggle option"
msgstr "Option umschalten"
msgid "Scroll Up"
msgstr "Nach oben scrollen"
msgid "Scroll Down"
msgstr "Nach unten scrollen"
msgid "Scroll Left"
msgstr "Nach links scrollen"
msgid "Scroll Right"
msgstr "Nach rechts scrollen"
msgid "Scroll Home"
msgstr "Zum Anfang scrollen"
msgid "Scroll End"
msgstr "Zum Ende scrollen"
msgid "Focus Next"
msgstr "Nächstes fokussieren"
msgid "Focus Previous"
msgstr "Vorheriges fokussieren"
msgid "Copy selected text"
msgstr "Ausgewählten Text kopieren"
msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
msgstr "labwc benötigt Zugriff auf ihren Seat (Sammlung von Hardwaregeräten wie Tastatur, Maus, usw.)"
@ -1740,10 +1870,10 @@ msgid "Print service"
msgstr "Drucker-Service"
msgid "Would you like to configure the print service?"
msgstr "Möchten Sie Bluetooth aktivieren?"
msgstr "Möchten Sie den Drucker-Service konfigurieren?"
msgid "Power management"
msgstr "Partitionsverwaltung: {}"
msgstr "Energieverwaltung"
msgid "Authentication"
msgstr "Authentifizierung"
@ -1794,31 +1924,31 @@ msgid "You may need to enter the PIN and then touch your U2F device to register
msgstr "Sie müssen möglicherweise Ihre PIN eingeben und danach Ihr U2F-Gerät berühren, um es zu registrieren"
msgid "Starting device modifications in "
msgstr ""
msgstr "Starte Geräteänderungen in "
msgid "No network connection found"
msgstr "Keine Netzwerkkonfiguration"
msgstr "Keine Netzwerkverbindung gefunden"
msgid "Would you like to connect to a Wifi?"
msgstr "Möchten Sie fortfahren?"
msgstr "Möchten Sie sich mit einem WLAN verbinden?"
msgid "No wifi interface found"
msgstr "Schnittstellen konfigurieren"
msgstr "Kein WLAN-Interface gefunden"
msgid "Select wifi network to connect to"
msgstr "Wählen Sie einen Netzwerkadapter zur Konfiguration aus"
msgstr "WLAN-Netzwerk zum Verbinden auswählen"
msgid "Scanning wifi networks..."
msgstr "Suche nach WLAN-Netzwerken..."
msgid "No wifi networks found"
msgstr "Keine Netzwerkkonfiguration"
msgstr "Keine WLAN-Netzwerke gefunden"
msgid "Failed setting up wifi"
msgstr "WLAN-Einrichtung fehlgeschlagen."
msgid "Enter wifi password"
msgstr "Passwort eingeben: "
msgstr "WLAN-Passwort eingeben"
msgid "Ok"
msgstr "Ok"
@ -1869,10 +1999,10 @@ msgid "Compression algorithm"
msgstr "Komprimierungsalgorithmus"
msgid "Only packages such as base, sudo, linux, linux-firmware, efibootmgr and optional profile packages are installed."
msgstr "Nur Pakete wie base, base-devel, linux, linux-firmware, efibootmgr und optionale Profilpakete werden installiert."
msgstr "Nur Pakete wie base, sudo, linux, linux-firmware, efibootmgr und optionale Profilpakete werden installiert."
msgid "Select zram compression algorithm:"
msgstr "Wählen Sie einen Einhängeort aus:"
msgstr "Zram-Komprimierungsalgorithmus auswählen:"
msgid "Use Network Manager (default backend)"
msgstr "NetworkManager verwenden (Standard-Backend)"
@ -1881,160 +2011,188 @@ msgid "Use Network Manager (iwd backend)"
msgstr "NetworkManager verwenden (iwd-Backend)"
msgid "Firewall"
msgstr "Firewall"
#, fuzzy
msgid "Additional fonts"
msgstr "Zusätzliche Repositorien"
#, fuzzy
msgid "Select font packages to install"
msgstr "Bootloader zur Installation auswählen"
msgid "Unicode font coverage for most languages"
msgstr ""
#, fuzzy
msgid "Select audio configuration"
msgstr "Benutzerkonfiguration speichern"
msgid "color emoji for browsers and apps"
msgstr ""
msgid "Chinese, Japanese, Korean characters"
msgstr ""
msgid "Select audio configuration"
msgstr "Audiokonfiguration auswählen"
#, fuzzy
msgid "Enter credentials file decryption password"
msgstr "Passwort für die Entschlüsselung der Anmeldedaten-Datei"
#, fuzzy
msgid "Enter root password"
msgstr "Passwort eingeben: "
msgstr "Root-Passwort eingeben"
msgid "Select bootloader to install"
msgstr ""
msgstr "Bootloader zur Installation auswählen"
#, fuzzy
msgid "Configuration preview"
msgstr "Konfiguration"
msgstr "Konfigurationsvorschau"
#, fuzzy
msgid "Enter a directory for the configuration(s) to be saved"
msgstr "Geben Sie einen Ordner an, in dem Konfigurationen gespeichert werden sollen: "
msgstr "Verzeichnis für die zu speichernden Konfiguration(en) eingeben"
#, fuzzy
msgid "Select encryption type"
msgstr "Verschlüsselungstyp"
#, fuzzy
msgid "Select disks for the installation"
msgstr "Gewünschter Gerätename/Hostname für die Installation: "
msgstr "Festplatten für die Installation auswählen"
#, fuzzy
msgid "Enter a mountpoint"
msgstr "Wählen Sie einen Einhängeort aus:"
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Enter a size (default: {}): "
msgstr "Geben Sie das Ende ein (Standard: {}): "
msgstr "Größe eingeben (Standard: {}): "
#, fuzzy
msgid "Enter subvolume name"
msgstr "Name des Subvolumes"
#, fuzzy
msgid "Enter subvolume mountpoint"
msgstr "Subvolume-Einhängeort"
#, fuzzy
msgid "Select a disk configuration"
msgstr "Laufwerkskonfiguration"
#, fuzzy
msgid "Enter root mount directory"
msgstr "Einhängeverzeichnis der Root-Partition"
msgid "You will use whatever drive-setup is mounted at the specified directory"
msgstr ""
msgstr "Es wird das Laufwerk-Setup verwendet, das im angegebenen Verzeichnis eingehängt ist"
msgid "WARNING: Archinstall won't check the suitability of this setup"
msgstr ""
msgstr "WARNUNG: Archinstall überprüft die Eignung dieser Konfiguration nicht"
#, fuzzy
msgid "Select main filesystem"
msgstr "Dateisystem ändern"
msgstr "Hauptdateisystem auswählen"
msgid "Enter a hostname"
msgstr ""
msgstr "Hostnamen eingeben"
#, fuzzy
msgid "Select timezone"
msgstr "Wählen Sie eine Zeitzone aus"
#, fuzzy
msgid "Enter the number of parallel downloads to be enabled"
msgstr ""
"Geben Sie die Nummer an parallelen Downloads an.\n"
"\n"
"Achtung:\n"
msgstr "Anzahl paralleler Downloads eingeben"
#, python-brace-format
msgid "Value must be between 1 and {}"
msgstr ""
msgstr "Der Wert muss zwischen 1 und {} liegen"
#, fuzzy
msgid "Select which kernel(s) to install"
msgstr "Bitte den zu installierenden Greeter (Begrüßer/Anmeldebildschirm) auswählen"
msgstr "Zu installierenden Kernel auswählen"
#, fuzzy
msgid "Enter a respository name"
msgstr "Name des Repositoriums"
#, fuzzy
msgid "Enter the repository url"
msgstr "Benutzerdefiniertes Repositorium bearbeiten"
msgstr "Repository-URL eingeben"
#, fuzzy
msgid "Enter server url"
msgstr "Server-URL"
#, fuzzy
msgid "Select mirror regions to be enabled"
msgstr "Ausgewählte Spiegelserver-Regionen"
msgstr "Zu aktivierende Spiegelserver-Regionen auswählen"
#, fuzzy
msgid "Select optional repositories to be enabled"
msgstr "Wählen Sie aus, welche zusätzlichen Repositories verwendet werden sollen"
msgstr "Optionale Repositorien auswählen"
#, fuzzy
msgid "Select an interface"
msgstr "Verbindung löschen"
msgstr "Netzwerkschnittstelle auswählen"
#, fuzzy
msgid "Choose network configuration"
msgstr "Keine Netzwerkkonfiguration"
msgstr "Netzwerkkonfiguration wählen"
#, fuzzy
msgid "No packages found"
msgstr "Keine U2F-Geräte gefunden"
msgstr "Keine Pakete gefunden"
#, fuzzy
msgid "Select which greeter to install"
msgstr "Bitte den zu installierenden Greeter (Begrüßer/Anmeldebildschirm) auswählen"
msgstr "Zu installierenden Greeter auswählen"
#, fuzzy
msgid "Select a profile type"
msgstr "Ausgewählte Profile: "
msgstr "Profiltyp auswählen"
#, fuzzy
msgid "Enter new password"
msgstr "Passwort eingeben: "
msgstr "Neues Passwort eingeben"
msgid "Enter a username"
msgstr ""
msgstr "Benutzernamen eingeben"
#, fuzzy
msgid "Enter a password"
msgstr "Passwort eingeben: "
#, fuzzy
msgid "The password did not match, please try again"
msgstr "Das Passwort stimmt nicht überein, bitte versuche es erneut"
msgstr "Das Passwort stimmt nicht überein, bitte versuchen Sie es erneut"
msgid "Password strength: Weak"
msgstr ""
msgstr "Passwortstärke: Schwach"
msgid "Password strength: Moderate"
msgstr ""
msgstr "Passwortstärke: Mittel"
msgid "Password strength: Strong"
msgstr ""
msgstr "Passwortstärke: Stark"
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr "Das ausgewählte Desktop-Profil erfordert einen regulären Benutzer zur Anmeldung über den Greeter"
#, python-brace-format
msgid "Environment type: {} {}"
msgstr "Umgebungstyp: {} {}"
msgid "Input cannot be empty"
msgstr "Der Wert darf nicht leer sein"
msgid "Recommended"
msgstr "Empfohlen"
msgid "Package"
msgstr "Paket"
msgid "Curated selection of KDE Plasma packages"
msgstr "Kuratierte Auswahl an KDE-Plasma-Paketen"
msgid "Dependencies"
msgstr "Abhängigkeiten"
msgid "Package group"
msgstr "Paketgruppe"
msgid "Extensive KDE Plasma installation"
msgstr "Umfangreiche KDE-Plasma-Installation"
msgid "Packages in group"
msgstr "Pakete in der Gruppe"
msgid "Minimal KDE Plasma installation"
msgstr "Minimale KDE-Plasma-Installation"
msgid "Description"
msgstr "Beschreibung"
msgid "Select a flavor of KDE Plasma to install"
msgstr "KDE-Plasma-Variante zur Installation auswählen"
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
msgstr ""
msgid "wide Unicode coverage, good fallback font"
msgstr ""
#~ msgid "All open-source"

View File

@ -823,6 +823,22 @@ msgstr "Μη έγκυρη είσοδος! Προσπαθήστε ξανά με
msgid "Parallel Downloads"
msgstr "Παράλληλες Λήψεις"
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, fuzzy, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr ""
"Εισάγετε τον αριθμό των παράλληλων λήψεων προς ενεργοποίηση.\n"
" (Εισάγετε μία τιμή από 1 μέχρι {})\n"
"Σημείωση:"
msgid "Enable colored output for pacman"
msgstr ""
#, fuzzy
msgid "ESC to skip"
msgstr "Χρησιμοποιήστε ESC για παράλειψη"
@ -1791,6 +1807,128 @@ msgstr ""
msgid "Exit search mode"
msgstr ""
msgid "General"
msgstr ""
#, fuzzy
msgid "Navigation"
msgstr "Αποθήκευση διαμόρφωσης"
#, fuzzy
msgid "Selection"
msgstr "Επιλέξτε διεπαφή προς προσθήκη"
msgid "Search"
msgstr ""
msgid "Down"
msgstr ""
msgid "Up"
msgstr ""
#, fuzzy
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 ""
#, fuzzy
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 ""
#, fuzzy
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 ""
@ -2042,6 +2180,23 @@ msgstr ""
msgid "Firewall"
msgstr ""
#, fuzzy
msgid "Additional fonts"
msgstr "Προαιρετικά αποθετήρια"
#, fuzzy
msgid "Select font packages to install"
msgstr "Επιλέξτε ποιες διαμερίσεις να κρυπτογραφηθούν."
msgid "Unicode font coverage for most languages"
msgstr ""
msgid "color emoji for browsers and apps"
msgstr ""
msgid "Chinese, Japanese, Korean characters"
msgstr ""
#, fuzzy
msgid "Select audio configuration"
msgstr "Αποθήκευση διαμόρφωσης χρήστη"
@ -2192,3 +2347,49 @@ msgstr ""
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr ""
#, fuzzy, 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 ""
msgid "Dependencies"
msgstr ""
#, fuzzy
msgid "Package group"
msgstr "Διαμορφωμένες {} διεπαφές"
msgid "Extensive KDE Plasma installation"
msgstr ""
msgid "Packages in group"
msgstr ""
msgid "Minimal KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Description"
msgstr "Κρυπτογράφηση δίσκου"
#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
msgstr "Επιλέξτε ποιες διαμερίσεις να κρυπτογραφηθούν."
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
msgstr ""
msgid "wide Unicode coverage, good fallback font"
msgstr ""

View File

@ -774,6 +774,19 @@ msgstr ""
msgid "Parallel Downloads"
msgstr ""
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr ""
msgid "Enable colored output for pacman"
msgstr ""
msgid "ESC to skip"
msgstr ""
@ -1598,6 +1611,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 ""
@ -1816,6 +1946,21 @@ msgstr ""
msgid "Firewall"
msgstr ""
msgid "Additional fonts"
msgstr ""
msgid "Select font packages to install"
msgstr ""
msgid "Unicode font coverage for most languages"
msgstr ""
msgid "color emoji for browsers and apps"
msgstr ""
msgid "Chinese, Japanese, Korean characters"
msgstr ""
msgid "Select audio configuration"
msgstr ""
@ -1937,3 +2082,46 @@ 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 ""
msgid "Dependencies"
msgstr ""
msgid "Package group"
msgstr ""
msgid "Extensive KDE Plasma installation"
msgstr ""
msgid "Packages in group"
msgstr ""
msgid "Minimal KDE Plasma installation"
msgstr ""
msgid "Description"
msgstr ""
msgid "Select a flavor of KDE Plasma to install"
msgstr ""
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
msgstr ""
msgid "wide Unicode coverage, good fallback font"
msgstr ""

View File

@ -826,6 +826,19 @@ msgstr "¡Entrada no válida! Intente nuevamente con una entrada válida [1 a {m
msgid "Parallel Downloads"
msgstr "Descargas paralelas"
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, fuzzy, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr "Ingrese el número de descargas paralelas que desea habilitar"
msgid "Enable colored output for pacman"
msgstr ""
msgid "ESC to skip"
msgstr "ESC para omitir"
@ -1667,6 +1680,139 @@ msgstr "Iniciar modo de búsqueda"
msgid "Exit search mode"
msgstr "Salir del modo de búsqueda"
msgid "General"
msgstr ""
#, fuzzy
msgid "Navigation"
msgstr "Guardar configuración"
#, fuzzy
msgid "Selection"
msgstr "Seleccione regiones"
msgid "Search"
msgstr ""
msgid "Down"
msgstr ""
msgid "Up"
msgstr ""
#, fuzzy
msgid "Confirm"
msgstr "Confirmar y salir"
#, fuzzy
msgid "Focus right"
msgstr "Mover a la derecha"
#, fuzzy
msgid "Focus left"
msgstr "Mover a la izquierda"
msgid "Toggle"
msgstr ""
#, fuzzy
msgid "Show/Hide help"
msgstr "Mostrar ayuda"
msgid "Quit"
msgstr ""
msgid "First"
msgstr ""
msgid "Last"
msgstr ""
#, fuzzy
msgid "Select"
msgstr "Seleccione regiones"
msgid "Page Up"
msgstr ""
msgid "Page Down"
msgstr ""
#, fuzzy
msgid "Page up"
msgstr "Grupo de paquetes:"
#, fuzzy
msgid "Page down"
msgstr "Bajar"
msgid "Page Left"
msgstr ""
#, fuzzy
msgid "Page Right"
msgstr "Mover a la derecha"
msgid "Cursor up"
msgstr ""
#, fuzzy
msgid "Cursor down"
msgstr "Bajar"
#, fuzzy
msgid "Cursor right"
msgstr "Mover a la derecha"
#, fuzzy
msgid "Cursor left"
msgstr "Mover a la izquierda"
msgid "Top"
msgstr ""
msgid "Bottom"
msgstr ""
msgid "Home"
msgstr ""
#, fuzzy
msgid "End"
msgstr "Habilitado"
#, fuzzy
msgid "Toggle option"
msgstr "Opciones del subvolumen"
msgid "Scroll Up"
msgstr ""
#, fuzzy
msgid "Scroll Down"
msgstr "Bajar en vista previa"
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 necesita acceso a su asiento (colección de dispositivos de hardware, es decir, teclado, ratón, etc.)"
@ -1885,6 +2031,23 @@ msgstr "Usar gestor de Red (backend iwd)"
msgid "Firewall"
msgstr "Cortafuegos"
#, fuzzy
msgid "Additional fonts"
msgstr "Repositorios adicionales"
#, fuzzy
msgid "Select font packages to install"
msgstr "Seleccione el gestor de arranque que desea instalar"
msgid "Unicode font coverage for most languages"
msgstr ""
msgid "color emoji for browsers and apps"
msgstr ""
msgid "Chinese, Japanese, Korean characters"
msgstr ""
msgid "Select audio configuration"
msgstr "Seleccionar configuración de audio"
@ -2007,6 +2170,55 @@ 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
msgid "Environment type: {} {}"
msgstr "Tipo de entorno: {}"
#, fuzzy
msgid "Input cannot be empty"
msgstr "El valor no puede estár vacío"
msgid "Recommended"
msgstr ""
#, fuzzy
msgid "Package"
msgstr "Grupo de paquetes:"
msgid "Curated selection of KDE Plasma packages"
msgstr ""
msgid "Dependencies"
msgstr ""
#, fuzzy
msgid "Package group"
msgstr "Grupo de paquetes:"
msgid "Extensive KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Packages in group"
msgstr "Grupo de paquetes:"
msgid "Minimal KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Description"
msgstr "Cifrado de disco"
#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
msgstr "Seleccione el gestor de arranque que desea instalar"
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
msgstr ""
msgid "wide Unicode coverage, good fallback font"
msgstr ""
#~ msgid "Add :"
#~ msgstr "Añadir :"

View File

@ -838,6 +838,22 @@ msgstr "Vale sisestus! Proovige uuesti kehtiva sisendiga [1 {max_downloads} või
msgid "Parallel Downloads"
msgstr "Paralleelsed allalaadimised"
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, fuzzy, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr ""
"Sisestage lubatavate paralleelsete allalaadimiste arv.\n"
" (Sisestage väärtus vahemikus 1 kuni {max_downloads})\n"
"note:"
msgid "Enable colored output for pacman"
msgstr ""
msgid "ESC to skip"
msgstr "ESC vahelejätmiseks"
@ -1774,6 +1790,128 @@ msgstr ""
msgid "Exit search mode"
msgstr ""
msgid "General"
msgstr ""
#, fuzzy
msgid "Navigation"
msgstr "Salvesta konfiguratsioon"
#, fuzzy
msgid "Selection"
msgstr "Valige allkirja valik"
msgid "Search"
msgstr ""
msgid "Down"
msgstr ""
msgid "Up"
msgstr ""
#, fuzzy
msgid "Confirm"
msgstr "Kinnita ja lahku"
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 ""
#, fuzzy
msgid "Select"
msgstr "Valige allkirja valik"
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 ""
#, fuzzy
msgid "Toggle option"
msgstr "Alamhulga valikud"
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 ""
#, fuzzy
msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
msgstr "Sway vajab juurdepääsu teie seatile (riistvaraseadmete kogum, st klaviatuur, hiir jne."
@ -2030,6 +2168,23 @@ msgstr ""
msgid "Firewall"
msgstr ""
#, fuzzy
msgid "Additional fonts"
msgstr "Valikulised repositooriumid"
#, fuzzy
msgid "Select font packages to install"
msgstr "Palun valige millist tervitajat installida"
msgid "Unicode font coverage for most languages"
msgstr ""
msgid "color emoji for browsers and apps"
msgstr ""
msgid "Chinese, Japanese, Korean characters"
msgstr ""
#, fuzzy
msgid "Select audio configuration"
msgstr "Salvesta kasutaja konfiguratsioon"
@ -2180,3 +2335,49 @@ msgstr ""
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr ""
#, fuzzy, python-brace-format
msgid "Environment type: {} {}"
msgstr "Keskkonna tüüp: {}"
msgid "Input cannot be empty"
msgstr ""
msgid "Recommended"
msgstr ""
msgid "Package"
msgstr ""
msgid "Curated selection of KDE Plasma packages"
msgstr ""
msgid "Dependencies"
msgstr ""
#, fuzzy
msgid "Package group"
msgstr "Konfigureeritud {} liidesed"
msgid "Extensive KDE Plasma installation"
msgstr ""
msgid "Packages in group"
msgstr ""
msgid "Minimal KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Description"
msgstr "Ketta krüpteerimine"
#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
msgstr "Palun valige millist tervitajat installida"
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
msgstr ""
msgid "wide Unicode coverage, good fallback font"
msgstr ""

View File

@ -824,6 +824,22 @@ msgstr "Virheellinen arvo! Yritä uudelleen kelvollisella arvolla [1 - {max_down
msgid "Parallel Downloads"
msgstr "Rinnakkaiset lataukset"
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, fuzzy, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr ""
"Anna rinnakkaisten latausten määrä.\n"
"\n"
"Huomaa:\n"
msgid "Enable colored output for pacman"
msgstr ""
msgid "ESC to skip"
msgstr "Ohita painamalla ESC"
@ -1744,6 +1760,137 @@ msgstr ""
msgid "Exit search mode"
msgstr ""
msgid "General"
msgstr ""
#, fuzzy
msgid "Navigation"
msgstr "Tallenna määritykset"
#, fuzzy
msgid "Selection"
msgstr "Valitse allekirjoituksen asetus"
msgid "Search"
msgstr ""
msgid "Down"
msgstr ""
msgid "Up"
msgstr ""
#, fuzzy
msgid "Confirm"
msgstr "Vahvista ja poistu"
#, fuzzy
msgid "Focus right"
msgstr "Liiku oikealle"
#, fuzzy
msgid "Focus left"
msgstr "Liiku vasemmalle"
msgid "Toggle"
msgstr ""
#, fuzzy
msgid "Show/Hide help"
msgstr "Näytä apua"
msgid "Quit"
msgstr ""
msgid "First"
msgstr ""
msgid "Last"
msgstr ""
#, fuzzy
msgid "Select"
msgstr "Valitse allekirjoituksen asetus"
msgid "Page Up"
msgstr ""
msgid "Page Down"
msgstr ""
msgid "Page up"
msgstr ""
#, fuzzy
msgid "Page down"
msgstr "Liikku alas"
msgid "Page Left"
msgstr ""
#, fuzzy
msgid "Page Right"
msgstr "Liiku oikealle"
msgid "Cursor up"
msgstr ""
#, fuzzy
msgid "Cursor down"
msgstr "Liikku alas"
#, fuzzy
msgid "Cursor right"
msgstr "Liiku oikealle"
#, fuzzy
msgid "Cursor left"
msgstr "Liiku vasemmalle"
msgid "Top"
msgstr ""
msgid "Bottom"
msgstr ""
msgid "Home"
msgstr ""
#, fuzzy
msgid "End"
msgstr "Käytössä"
#, fuzzy
msgid "Toggle option"
msgstr "Alitaltion valinnat"
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 ""
#, 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.)"
@ -2000,6 +2147,23 @@ msgstr ""
msgid "Firewall"
msgstr ""
#, fuzzy
msgid "Additional fonts"
msgstr "Valinnaiset arkistot"
#, fuzzy
msgid "Select font packages to install"
msgstr "Valitse asennettava käyttöliittymä"
msgid "Unicode font coverage for most languages"
msgstr ""
msgid "color emoji for browsers and apps"
msgstr ""
msgid "Chinese, Japanese, Korean characters"
msgstr ""
#, fuzzy
msgid "Select audio configuration"
msgstr "Tallenna käyttäjän määritykset"
@ -2150,3 +2314,49 @@ msgstr ""
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr ""
#, fuzzy, python-brace-format
msgid "Environment type: {} {}"
msgstr "Ympäristötyyppi: {}"
msgid "Input cannot be empty"
msgstr ""
msgid "Recommended"
msgstr ""
msgid "Package"
msgstr ""
msgid "Curated selection of KDE Plasma packages"
msgstr ""
msgid "Dependencies"
msgstr ""
#, fuzzy
msgid "Package group"
msgstr "Määritetty {} liittymää"
msgid "Extensive KDE Plasma installation"
msgstr ""
msgid "Packages in group"
msgstr ""
msgid "Minimal KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Description"
msgstr "Levyn salaus"
#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
msgstr "Valitse asennettava käyttöliittymä"
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
msgstr ""
msgid "wide Unicode coverage, good fallback font"
msgstr ""

View File

@ -823,6 +823,22 @@ msgstr "Entrée invalide ! Réessayer avec une entrée valide [1 pour {max_downl
msgid "Parallel Downloads"
msgstr "Téléchargements parallèles"
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, fuzzy, 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"
msgid "Enable colored output for pacman"
msgstr ""
msgid "ESC to skip"
msgstr "ESC pour ignorer"
@ -1663,6 +1679,139 @@ msgstr "Démarrer le mode de recherche"
msgid "Exit search mode"
msgstr "Quitter le mode de recherche"
msgid "General"
msgstr ""
#, fuzzy
msgid "Navigation"
msgstr "Enregistrer la configuration"
#, fuzzy
msgid "Selection"
msgstr "Sélectionner des régions"
msgid "Search"
msgstr ""
msgid "Down"
msgstr ""
msgid "Up"
msgstr ""
#, fuzzy
msgid "Confirm"
msgstr "Confirmer et quitter"
#, fuzzy
msgid "Focus right"
msgstr "Déplacer vers la droite"
#, fuzzy
msgid "Focus left"
msgstr "Déplacer vers la gauche"
msgid "Toggle"
msgstr ""
#, fuzzy
msgid "Show/Hide help"
msgstr "Afficher de l'aide"
msgid "Quit"
msgstr ""
msgid "First"
msgstr ""
msgid "Last"
msgstr ""
#, fuzzy
msgid "Select"
msgstr "Sélectionner des régions"
msgid "Page Up"
msgstr ""
msgid "Page Down"
msgstr ""
#, fuzzy
msgid "Page up"
msgstr "Groupe de paquets :"
#, fuzzy
msgid "Page down"
msgstr "Déplacer vers le bas"
msgid "Page Left"
msgstr ""
#, fuzzy
msgid "Page Right"
msgstr "Déplacer vers la droite"
msgid "Cursor up"
msgstr ""
#, fuzzy
msgid "Cursor down"
msgstr "Déplacer vers le bas"
#, fuzzy
msgid "Cursor right"
msgstr "Déplacer vers la droite"
#, fuzzy
msgid "Cursor left"
msgstr "Déplacer vers la gauche"
msgid "Top"
msgstr ""
msgid "Bottom"
msgstr ""
msgid "Home"
msgstr ""
#, fuzzy
msgid "End"
msgstr "Activé"
#, fuzzy
msgid "Toggle option"
msgstr "Options de sous-volume"
msgid "Scroll Up"
msgstr ""
#, fuzzy
msgid "Scroll Down"
msgstr "Faire défiler laperçu vers le bas"
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 a besoin daccéder à votre siège (ensemble dappareils matériels, cest-à-dire clavier, souris, etc.)"
@ -1906,6 +2055,23 @@ msgstr ""
msgid "Firewall"
msgstr ""
#, fuzzy
msgid "Additional fonts"
msgstr "Dépôts supplémentaires"
#, fuzzy
msgid "Select font packages to install"
msgstr "Veuillez choisir le greeter (interface de connexion) à installer"
msgid "Unicode font coverage for most languages"
msgstr ""
msgid "color emoji for browsers and apps"
msgstr ""
msgid "Chinese, Japanese, Korean characters"
msgstr ""
#, fuzzy
msgid "Select audio configuration"
msgstr "Enregistrer la configuration utilisateur"
@ -2060,6 +2226,55 @@ msgstr ""
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr ""
#, fuzzy, python-brace-format
msgid "Environment type: {} {}"
msgstr "Type d'environnement : {}"
#, fuzzy
msgid "Input cannot be empty"
msgstr "La valeur ne peut pas être vide"
msgid "Recommended"
msgstr ""
#, fuzzy
msgid "Package"
msgstr "Groupe de paquets :"
msgid "Curated selection of KDE Plasma packages"
msgstr ""
msgid "Dependencies"
msgstr ""
#, fuzzy
msgid "Package group"
msgstr "Groupe de paquets :"
msgid "Extensive KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Packages in group"
msgstr "Groupe de paquets :"
msgid "Minimal KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Description"
msgstr "Chiffrement du disque"
#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
msgstr "Veuillez choisir le greeter (interface de connexion) à installer"
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
msgstr ""
msgid "wide Unicode coverage, good fallback font"
msgstr ""
#, python-brace-format
#~ msgid "Edit {origkey} :"
#~ msgstr "Modifier {origkey} :"

View File

@ -823,6 +823,22 @@ msgstr "Ionchur neamhbhailí! Bain triail eile as le hionchur bailí [1 go {max_
msgid "Parallel Downloads"
msgstr "Comhuaineach íosluchtuithe"
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, fuzzy, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr ""
"Cuir isteach líon na n-íoslódálacha comhthreomhara atá le cumasú.\n"
"\n"
"Nóta:\n"
msgid "Enable colored output for pacman"
msgstr ""
msgid "ESC to skip"
msgstr "ESC a scipeáil"
@ -1731,6 +1747,128 @@ msgstr ""
msgid "Exit search mode"
msgstr ""
msgid "General"
msgstr ""
#, fuzzy
msgid "Navigation"
msgstr "Sábháil cumraíocht"
#, fuzzy
msgid "Selection"
msgstr "Roghnaigh an rogha sínithe"
msgid "Search"
msgstr ""
msgid "Down"
msgstr ""
msgid "Up"
msgstr ""
#, fuzzy
msgid "Confirm"
msgstr "Deimhnigh agus scoir"
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 ""
#, fuzzy
msgid "Select"
msgstr "Roghnaigh an rogha sínithe"
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 ""
#, fuzzy
msgid "Toggle option"
msgstr "Roghanna subvolume"
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 ""
#, fuzzy
msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
msgstr "Teastaíonn rochtain ó Sway ar do shuíochán (bailiúchán de ghléasanna crua-earraí i.e. méarchlár, luch, srl)"
@ -1987,6 +2125,23 @@ msgstr ""
msgid "Firewall"
msgstr ""
#, fuzzy
msgid "Additional fonts"
msgstr "Taisclanna roghnacha"
#, fuzzy
msgid "Select font packages to install"
msgstr "Roghnaigh cé acu beannaitheoir atá le suiteáil"
msgid "Unicode font coverage for most languages"
msgstr ""
msgid "color emoji for browsers and apps"
msgstr ""
msgid "Chinese, Japanese, Korean characters"
msgstr ""
#, fuzzy
msgid "Select audio configuration"
msgstr "Sábháil cumraíocht úsáideora"
@ -2137,3 +2292,49 @@ msgstr ""
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr ""
#, fuzzy, python-brace-format
msgid "Environment type: {} {}"
msgstr "Cineál timpeallachta: {}"
msgid "Input cannot be empty"
msgstr ""
msgid "Recommended"
msgstr ""
msgid "Package"
msgstr ""
msgid "Curated selection of KDE Plasma packages"
msgstr ""
msgid "Dependencies"
msgstr ""
#, fuzzy
msgid "Package group"
msgstr "Comhéadain {} cumraithe"
msgid "Extensive KDE Plasma installation"
msgstr ""
msgid "Packages in group"
msgstr ""
msgid "Minimal KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Description"
msgstr "Criptiú diosca"
#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
msgstr "Roghnaigh cé acu beannaitheoir atá le suiteáil"
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
msgstr ""
msgid "wide Unicode coverage, good fallback font"
msgstr ""

View File

@ -826,6 +826,22 @@ msgstr "¡Entrada no válida! Intente nuevamente con unha entrada válida [1 a {
msgid "Parallel Downloads"
msgstr "Descargas paralelas"
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, fuzzy, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr ""
"Ingrese el número de descargas paralelas que se habilitarán.\n"
"\n"
"Nota:\n"
msgid "Enable colored output for pacman"
msgstr ""
msgid "ESC to skip"
msgstr "ESC para omitir"
@ -1667,6 +1683,139 @@ msgstr "Iniciar modo de búsqueda"
msgid "Exit search mode"
msgstr "Salir do modo de búsqueda"
msgid "General"
msgstr ""
#, fuzzy
msgid "Navigation"
msgstr "Guardar configuración"
#, fuzzy
msgid "Selection"
msgstr "Seleccione regiones"
msgid "Search"
msgstr ""
msgid "Down"
msgstr ""
msgid "Up"
msgstr ""
#, fuzzy
msgid "Confirm"
msgstr "Confirmar e salir"
#, fuzzy
msgid "Focus right"
msgstr "Mover a la dereita"
#, fuzzy
msgid "Focus left"
msgstr "Mover a la esquerda"
msgid "Toggle"
msgstr ""
#, fuzzy
msgid "Show/Hide help"
msgstr "Mostrar axuda"
msgid "Quit"
msgstr ""
msgid "First"
msgstr ""
msgid "Last"
msgstr ""
#, fuzzy
msgid "Select"
msgstr "Seleccione regiones"
msgid "Page Up"
msgstr ""
msgid "Page Down"
msgstr ""
#, fuzzy
msgid "Page up"
msgstr "Grupo de paquetes:"
#, fuzzy
msgid "Page down"
msgstr "Bajar"
msgid "Page Left"
msgstr ""
#, fuzzy
msgid "Page Right"
msgstr "Mover a la dereita"
msgid "Cursor up"
msgstr ""
#, fuzzy
msgid "Cursor down"
msgstr "Bajar"
#, fuzzy
msgid "Cursor right"
msgstr "Mover a la dereita"
#, fuzzy
msgid "Cursor left"
msgstr "Mover a la esquerda"
msgid "Top"
msgstr ""
msgid "Bottom"
msgstr ""
msgid "Home"
msgstr ""
#, fuzzy
msgid "End"
msgstr "Habilitado"
#, fuzzy
msgid "Toggle option"
msgstr "Opciones do subvolumen"
msgid "Scroll Up"
msgstr ""
#, fuzzy
msgid "Scroll Down"
msgstr "Bajar en vista previa"
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 necesita acceso a o seu asiento (colección de dispositivos de hardware, es decir, teclado, ratón, etc.)"
@ -2027,6 +2176,61 @@ msgstr "Ingrese unha contraseña: "
msgid "The password did not match, please try again"
msgstr "A contraseña de confirmación no coincide, por favor intente nuevamente"
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 ""
#, fuzzy, python-brace-format
msgid "Environment type: {} {}"
msgstr "Tipo de entorno: {}"
#, fuzzy
msgid "Input cannot be empty"
msgstr "O valor no pode estár vacío"
msgid "Recommended"
msgstr ""
#, fuzzy
msgid "Package"
msgstr "Grupo de paquetes:"
msgid "Curated selection of KDE Plasma packages"
msgstr ""
msgid "Dependencies"
msgstr ""
#, fuzzy
msgid "Package group"
msgstr "Grupo de paquetes:"
msgid "Extensive KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Packages in group"
msgstr "Grupo de paquetes:"
msgid "Minimal KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Description"
msgstr "Cifrado de disco"
#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
msgstr "Por favor, elixa qué xestor de inicio de sesión instalar"
#~ msgid "Add :"
#~ msgstr "Añadir :"

View File

@ -830,6 +830,22 @@ msgstr "קלט שגוי! נא לנסות שוב עם קלט תקין [1 עד {ma
msgid "Parallel Downloads"
msgstr "הורדות במקביל"
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, fuzzy, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr ""
"נא למלא את מספר ההורדות המקביליות להפעלה.\n"
"\n"
"‫הערה:\n"
msgid "Enable colored output for pacman"
msgstr ""
msgid "ESC to skip"
msgstr "ESC לדילוג"
@ -1691,6 +1707,129 @@ msgstr ""
msgid "Exit search mode"
msgstr ""
msgid "General"
msgstr ""
#, fuzzy
msgid "Navigation"
msgstr "שמירת הגדרה"
#, fuzzy
msgid "Selection"
msgstr "בחירת אפשרות חתימות"
msgid "Search"
msgstr ""
msgid "Down"
msgstr ""
msgid "Up"
msgstr ""
#, fuzzy
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 ""
#, fuzzy
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 ""
#, fuzzy
msgid "End"
msgstr "פעיל"
#, fuzzy
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 ""
#, fuzzy
msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
msgstr "Sway צריך גישה למושב (אוסף של התקני חומרה כמו למשל מקלדת, עכבר וכו׳) שלך"
@ -1938,6 +2077,23 @@ msgstr ""
msgid "Firewall"
msgstr ""
#, fuzzy
msgid "Additional fonts"
msgstr "מאגרים נוספים"
#, fuzzy
msgid "Select font packages to install"
msgstr "נא לבחור איזו מערכת קבלת פנים להתקין"
msgid "Unicode font coverage for most languages"
msgstr ""
msgid "color emoji for browsers and apps"
msgstr ""
msgid "Chinese, Japanese, Korean characters"
msgstr ""
#, fuzzy
msgid "Select audio configuration"
msgstr "שמירת הגדרת משתמש"
@ -2090,3 +2246,49 @@ msgstr ""
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr ""
#, fuzzy, 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 ""
msgid "Dependencies"
msgstr ""
#, fuzzy
msgid "Package group"
msgstr "הגדרת מנשקים"
msgid "Extensive KDE Plasma installation"
msgstr ""
msgid "Packages in group"
msgstr ""
msgid "Minimal KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Description"
msgstr "הצפנת כונן"
#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
msgstr "נא לבחור איזו מערכת קבלת פנים להתקין"
msgid "Arial/Times/Courier replacement, Cyrillic support for Steam/games"
msgstr ""
msgid "wide Unicode coverage, good fallback font"
msgstr ""

View File

@ -5,7 +5,7 @@ msgstr ""
"PO-Revision-Date: \n"
"Last-Translator: Atharv <atharvnegi26@gmail.com>\n"
"Language-Team: \n"
"Language: he\n"
"Language: hi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -807,10 +807,10 @@ msgstr ""
" (1 से {} के बीच मान दर्ज करें)\n"
"नोट:"
msgid " - Maximum value   : {} ( Allows {} parallel downloads, allows {} downloads at a time )"
msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {} downloads at a time )"
msgstr " - अधिकतम मान : {} ( {} समानांतर डाउनलोड की अनुमति देता है, एक समय में {} डाउनलोड की अनुमति देता है )"
msgid " - Minimum value   : 1 ( Allows 1 parallel download, allows 2 downloads at a time )"
msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a time )"
msgstr " - न्यूनतम मान : 1 ( 1 समानांतर डाउनलोड की अनुमति देता है, एक समय में 2 डाउनलोड की अनुमति देता है )"
msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )"
@ -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 दबाएँ"
@ -1163,7 +1176,7 @@ msgstr "मिरर (Mirrors)"
msgid "Mirror regions"
msgstr "मिरर क्षेत्र"
msgid " - Maximum value   : {} ( Allows {} parallel downloads, allows {max_downloads+1} downloads at a time )"
msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {max_downloads+1} downloads at a time )"
msgstr " - अधिकतम मान : {} ( {} समानांतर डाउनलोड की अनुमति देता है, एक समय में {max_downloads+1} डाउनलोड की अनुमति देता है )"
msgid "Invalid input! Try again with a valid input [1 to {}, or 0 to disable]"
@ -1412,6 +1425,7 @@ msgstr "आपके द्वारा दर्ज किया गया य
msgid "Username"
msgstr "उपयोगकर्ता नाम"
#, python-brace-format
msgid "Should \"{}\" be a superuser (sudo)?\n"
msgstr "क्या \"{}\" को superuser (sudo) होना चाहिए?\n"
@ -1489,7 +1503,7 @@ msgid "Disabled"
msgstr "अक्षम"
msgid "Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues"
msgstr "कृपया इस समस्या (और फ़ाइल) को https://github.com/archlinux/archinstall/issues पर सबमिट करें"
msgstr "कृपया इस समस्या (और फ़ाइल) को https://github.com/archlinux/archinstall/issues पर सबमिट करें"
msgid "Mirror name"
msgstr "मिरर का नाम"
@ -1662,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 को आपकी सीट (हार्डवेयर डिवाइसेज का संग्रह यानी कीबोर्ड, माउस, आदि) तक पहुंच की आवश्यकता है"
@ -1876,3 +2007,186 @@ msgstr "नेटवर्क मैनेजर का उपयोग कर
msgid "Use Network Manager (iwd backend)"
msgstr "नेटवर्क मैनेजर का उपयोग करें (iwd बैकएंड)"
msgid "Firewall"
msgstr "फ़ायरवॉल"
msgid "Additional fonts"
msgstr "अतिरिक्त फ़ॉन्ट"
msgid "Select font packages to install"
msgstr "इंस्टॉल करने के लिए फ़ॉन्ट पैकेज चुनें"
msgid "Unicode font coverage for most languages"
msgstr "अधिकांश भाषाओं के लिए यूनिकोड फ़ॉन्ट समर्थन"
msgid "color emoji for browsers and apps"
msgstr "ब्राउज़र और ऐप्स के लिए रंगीन इमोजी"
msgid "Chinese, Japanese, Korean characters"
msgstr "चीनी, जापानी, कोरियाई वर्ण"
msgid "Select audio configuration"
msgstr "ऑडियो कॉन्फ़िगरेशन चुनें"
msgid "Enter credentials file decryption password"
msgstr "क्रेडेंशियल्स फ़ाइल डिक्रिप्शन पासवर्ड दर्ज करें"
msgid "Enter root password"
msgstr "रूट पासवर्ड दर्ज करें"
msgid "Select bootloader to install"
msgstr "इंस्टॉल करने के लिए बूटलोडर चुनें"
msgid "Configuration preview"
msgstr "कॉन्फ़िगरेशन पूर्वावलोकन देखें"
msgid "Enter a directory for the configuration(s) to be saved"
msgstr "कॉन्फ़िगरेशन सहेजने के लिए डायरेक्टरी दर्ज करें"
msgid "Select encryption type"
msgstr "एन्क्रिप्शन प्रकार चुनें"
msgid "Select disks for the installation"
msgstr "इंस्टॉलेशन के लिए डिस्क चुनें"
msgid "Enter a mountpoint"
msgstr "माउंटपॉइंट दर्ज करें"
#, python-brace-format
msgid "Enter a size (default: {}): "
msgstr "आकार दर्ज करें (डिफ़ॉल्ट: {}): "
msgid "Enter subvolume name"
msgstr "सबवॉल्यूम का नाम दर्ज करें"
msgid "Enter subvolume mountpoint"
msgstr "सबवॉल्यूम माउंटपॉइंट दर्ज करें"
msgid "Select a disk configuration"
msgstr "एक डिस्क कॉन्फ़िगरेशन चुनें"
msgid "Enter root mount directory"
msgstr "रूट माउंट डायरेक्टरी दर्ज करें"
msgid "You will use whatever drive-setup is mounted at the specified directory"
msgstr "आप निर्दिष्ट डायरेक्टरी पर माउंट किए गए किसी भी ड्राइव-सेटअप का उपयोग करेंगे"
msgid "WARNING: Archinstall won't check the suitability of this setup"
msgstr "चेतावनी: Archinstall इस सेटअप की उपयुक्तता की जाँच नहीं करेगा"
msgid "Select main filesystem"
msgstr "मुख्य फ़ाइलसिस्टम चुनें"
msgid "Enter a hostname"
msgstr "होस्टनेम दर्ज करें"
msgid "Select timezone"
msgstr "समयक्षेत्र चुनें"
msgid "Enter the number of parallel downloads to be enabled"
msgstr "सक्षम किए जाने वाले समानांतर डाउनलोड की संख्या दर्ज करें"
#, python-brace-format
msgid "Value must be between 1 and {}"
msgstr "मान 1 और {} के बीच होना चाहिए"
msgid "Select which kernel(s) to install"
msgstr "इंस्टॉल करने के लिए कौन से कर्नेल चुनें"
msgid "Enter a respository name"
msgstr "रिपॉजिटरी का नाम दर्ज करें"
msgid "Enter the repository url"
msgstr "रिपॉजिटरी URL दर्ज करें"
msgid "Enter server url"
msgstr "सर्वर URL दर्ज करें"
msgid "Select mirror regions to be enabled"
msgstr "सक्षम करने के लिए मिरर क्षेत्र चुनें"
msgid "Select optional repositories to be enabled"
msgstr "सक्षम करने के लिए वैकल्पिक रिपॉजिटरी चुनें"
msgid "Select an interface"
msgstr "एक इंटरफ़ेस चुनें"
msgid "Choose network configuration"
msgstr "नेटवर्क कॉन्फ़िगरेशन चुनें"
msgid "No packages found"
msgstr "कोई पैकेज नहीं मिला"
msgid "Select which greeter to install"
msgstr "कौन सा ग्रीटर इंस्टॉल करना है चुनें"
msgid "Select a profile type"
msgstr "प्रोफ़ाइल प्रकार चुनें"
msgid "Enter new password"
msgstr "नया पासवर्ड दर्ज करें"
msgid "Enter a username"
msgstr "यूज़रनेम दर्ज करें"
msgid "Enter a password"
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/गेम्स के लिए Cyrillic समर्थन"
msgid "wide Unicode coverage, good fallback font"
msgstr "विस्तृत यूनिकोड कवरेज, अच्छा फॉलबैक फ़ॉन्ट"

View File

@ -2,14 +2,14 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2026-01-20 19:23+0100\n"
"PO-Revision-Date: 2026-04-12 10:26+0200\n"
"Last-Translator: Van Matten\n"
"Language-Team: Alessio Cuccovillo <alessio.cuccovillo.dev@gmail.com>, Van Matten\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.8\n"
"X-Generator: Poedit 3.9\n"
"X-Poedit-Basepath: ../..\n"
"X-Poedit-SearchPath-0: base.pot\n"
@ -1028,7 +1028,7 @@ msgid "Back"
msgstr "Indietro"
msgid "Please chose which greeter to install for the chosen profiles: {}"
msgstr "Scegli quale messaggio di benvenuto installare per i profili scelti: {}"
msgstr "Scegli quale greeter installare per i profili scelti: {}"
#, python-brace-format
msgid "Environment type: {}"
@ -1090,10 +1090,10 @@ msgid "Graphics driver"
msgstr "Driver grafici"
msgid "Greeter"
msgstr "Programma di benvenuto"
msgstr "Greeter"
msgid "Please chose which greeter to install"
msgstr "Scegli quale programma di benvenuto installare"
msgstr "Scegli quale greeter installare"
msgid "This is a list of pre-programmed default_profiles"
msgstr "Questo è un elenco di default_profiles preprogrammati"
@ -1243,7 +1243,7 @@ msgid ""
msgstr ""
"\n"
"\n"
"Scegli unopzione per concedere a Hyprland l'accesso al tuo hardware a Hyprland"
"Scegli unopzione per concedere a Hyprland l'accesso al tuo hardware"
msgid "All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..."
msgstr "Tutti i valori immessi possono avere come suffisso ununità: %, B, KB, KiB, MB, MiB…"
@ -1561,7 +1561,7 @@ msgid "Loading packages..."
msgstr "Caricamento pacchetti in corso..."
msgid "Select any packages from the below list that should be installed additionally"
msgstr "Seleziona dalla lista sotto i pacchetti da installare"
msgstr "Seleziona dalla lista sotto i pacchetti aggiuntivi da installare"
msgid "Add a custom repository"
msgstr "Aggiungi una repository personalizzata"
@ -1621,10 +1621,10 @@ msgid "Exit help"
msgstr "Chiudi aiuto"
msgid "Preview scroll up"
msgstr "Anteprima scorrimento vero l'alto"
msgstr "Anteprima scorrimento su"
msgid "Preview scroll down"
msgstr "Anteprima scorrimento vero il basso"
msgstr "Anteprima scorrimento giù"
msgid "Move up"
msgstr "Muovi su"
@ -1665,6 +1665,123 @@ msgstr "Avvia modalità ricerca"
msgid "Exit search mode"
msgstr "Chiudi modalità ricerca"
msgid "General"
msgstr "Generale"
msgid "Navigation"
msgstr "Navigazione"
msgid "Selection"
msgstr "Selezione"
msgid "Search"
msgstr "Cerca"
msgid "Down"
msgstr "In fondo"
msgid "Up"
msgstr "Su"
msgid "Confirm"
msgstr "Conferma"
msgid "Focus right"
msgstr "Vai a destra"
msgid "Focus left"
msgstr "Vai a sinistra"
msgid "Toggle"
msgstr "Attiva/disattiva"
msgid "Show/Hide help"
msgstr "Mostra/nascondi aiuto"
msgid "Quit"
msgstr "Esci"
msgid "First"
msgstr "Primo"
msgid "Last"
msgstr "Ultimo"
msgid "Select"
msgstr "Seleziona"
msgid "Page Up"
msgstr "Pagina su"
msgid "Page Down"
msgstr "Pagina su"
msgid "Page up"
msgstr "Pagina su"
msgid "Page down"
msgstr "Pagina giù"
msgid "Page Left"
msgstr "Pagina a sinistra"
msgid "Page Right"
msgstr "Pagina a destra"
msgid "Cursor up"
msgstr "Cursore su"
msgid "Cursor down"
msgstr "Cursore giù"
msgid "Cursor right"
msgstr "Cursore a destra"
msgid "Cursor left"
msgstr "Cursore a sinistra"
msgid "Top"
msgstr "In cima"
msgid "Bottom"
msgstr "In fondo"
msgid "Home"
msgstr "Inizio"
msgid "End"
msgstr "Fine"
msgid "Toggle option"
msgstr "Opzioni di attivazione"
msgid "Scroll Up"
msgstr "Scorri Su"
msgid "Scroll Down"
msgstr "Scorri giù"
msgid "Scroll Left"
msgstr "Scorri a sinistra"
msgid "Scroll Right"
msgstr "Scorri a destra"
msgid "Scroll Home"
msgstr "Scorri all'inizio"
msgid "Scroll End"
msgstr "Scorri alla fine"
msgid "Focus Next"
msgstr "Vai al successivo"
msgid "Focus Previous"
msgstr "Vai al precedente"
msgid "Copy selected text"
msgstr "Copia il testo selezionato"
msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
msgstr "labwc ha bisogno dellaccesso al tuo posto (insieme di dispositivi hardware, ad esempio tastiera, mouse, ecc.)"
@ -1883,39 +2000,24 @@ msgstr "Usa NetworkManager (backend iwd)"
msgid "Firewall"
msgstr "Firewall"
msgid "Enter credentials file decryption password"
msgstr "Inserici la password di decrittazione del file delle credenziali"
msgid "Configuration preview"
msgstr "Anteprima della configurazione"
msgid "Enter a directory for the configuration(s) to be saved"
msgstr "Inserisci una cartella in cui salvare le configurazioni"
msgid "Enter a respository name"
msgstr "Inserisci il nome di un repository"
msgid "Enter the repository url"
msgstr "Inserisci l'URL della repository"
msgid "Enter server url"
msgstr "Inserisci l'URL del server"
msgid "Select mirror regions to be enabled"
msgstr "Seleziona quali regioni dei mirror abilitare"
msgid "Select optional repositories to be enabled"
msgstr "Seleziona quali repository aggiuntive opzionali abilitare"
msgid "Select audio configuration"
msgstr "Seleziona la configurazione audio"
msgid "Enter credentials file decryption password"
msgstr "Inserici la password di decrittazione del file delle credenziali"
msgid "Enter root password"
msgstr "Inserisci la password di root"
msgid "Select bootloader to install"
msgstr "Seleziona il bootloader da installare"
msgid "Configuration preview"
msgstr "Anteprima della configurazione"
msgid "Enter a directory for the configuration(s) to be saved"
msgstr "Inserisci una cartella in cui salvare le configurazioni"
msgid "Select encryption type"
msgstr "Seleziona il tipo di crittografia"
@ -1956,9 +2058,6 @@ msgstr "Inserisci un nome dell'host"
msgid "Select timezone"
msgstr "Seleziona il fuso orario"
msgid "No packages found"
msgstr "Nessun pacchetto trovato"
msgid "Enter the number of parallel downloads to be enabled"
msgstr "Inserisci il numero di download in parallelo da abilitare"
@ -1966,6 +2065,39 @@ msgstr "Inserisci il numero di download in parallelo da abilitare"
msgid "Value must be between 1 and {}"
msgstr "Il valore deve essere tra 1 e {}"
msgid "Select which kernel(s) to install"
msgstr "Scegli quali kernel installare"
msgid "Enter a respository name"
msgstr "Inserisci il nome di un repository"
msgid "Enter the repository url"
msgstr "Inserisci l'URL della repository"
msgid "Enter server url"
msgstr "Inserisci l'URL del server"
msgid "Select mirror regions to be enabled"
msgstr "Seleziona quali regioni dei mirror abilitare"
msgid "Select optional repositories to be enabled"
msgstr "Seleziona quali repository aggiuntive opzionali abilitare"
msgid "Select an interface"
msgstr "Seleziona un'interfaccia"
msgid "Choose network configuration"
msgstr "Scegli la configurazione di rete"
msgid "No packages found"
msgstr "Nessun pacchetto trovato"
msgid "Select which greeter to install"
msgstr "Seleziona quale greeter installare"
msgid "Select a profile type"
msgstr "Seleziona un tipo di profilo"
msgid "Enter new password"
msgstr "Inserisci una nuova password"
@ -1975,20 +2107,54 @@ msgstr "Inserisci un nome utente"
msgid "Enter a password"
msgstr "Inserisci una password"
msgid "Select an interface"
msgstr "Seleziona un'interfaccia"
msgid "Choose network configuration"
msgstr "Scegli la configurazione di rete"
msgid "Select which kernel(s) to install"
msgstr "Scegli quali kernel installare"
msgid "Select which greeter to install"
msgstr "Seleziona quale schermata di benvenuto installare"
msgid "Select a profile type"
msgstr "Seleziona un tipo di profilo"
msgid "The password did not match, please try again"
msgstr "La password non corrisponde, prova ancora"
msgid "Password strength: Weak"
msgstr "Complessità password: Bassa"
msgid "Password strength: Moderate"
msgstr "Complessità password: Media"
msgid "Password strength: Strong"
msgstr "Complessità password: Alta"
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr "Il profilo desktop selezionato richiede un utente regolare per accedere via greeter"
#, python-brace-format
msgid "Environment type: {} {}"
msgstr "Tipo di ambiente: {} {}"
msgid "Recommended"
msgstr "Raccomandato"
msgid "Package"
msgstr "Pacchetto"
msgid "Curated selection of KDE Plasma packages"
msgstr "Selezione curata di pacchetti di KDE Plasma"
msgid "Dependencies"
msgstr "Dipendenze"
msgid "Package group"
msgstr "Gruppo di pacchetti"
msgid "Extensive KDE Plasma installation"
msgstr "Installazione di KDE Plasma estesa"
msgid "Packages in group"
msgstr "Pacchetti nel gruppo"
msgid "Minimal KDE Plasma installation"
msgstr "Installazione di KDE Plasma minimale"
msgid "Description"
msgstr "Descrizione"
msgid "Select a flavor of KDE Plasma to install"
msgstr "Seleziona la configurazione di KDE Plasma da installare"
msgid "Input cannot be empty"
msgstr "Il campo non può essere vuoto"

View File

@ -823,6 +823,22 @@ msgstr "Têketineke nederbasdar! Bi têketineke derbasdar re dîsa hewl bide [1
msgid "Parallel Downloads"
msgstr "Daxistinên parallel"
msgid "Pacman"
msgstr ""
msgid "Color"
msgstr ""
#, fuzzy, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr ""
"Jimara daxistinên paralel ên ku werin çalakkirin têxîne.\n"
"\n"
"Nîşe:\n"
msgid "Enable colored output for pacman"
msgstr ""
msgid "ESC to skip"
msgstr "ESC bo derbas bikî"
@ -1663,6 +1679,139 @@ msgstr "Awaya lêgerînê dest pê bike"
msgid "Exit search mode"
msgstr "Awaya lêgerînê bi dawî bike"
msgid "General"
msgstr ""
#, fuzzy
msgid "Navigation"
msgstr "Rêkxisitinê tomar bike"
#, fuzzy
msgid "Selection"
msgstr "Herêman hilbijêre"
msgid "Search"
msgstr ""
msgid "Down"
msgstr ""
msgid "Up"
msgstr ""
#, fuzzy
msgid "Confirm"
msgstr "Biperjîne û derkeve"
#, fuzzy
msgid "Focus right"
msgstr "Bilivîne rastê"
#, fuzzy
msgid "Focus left"
msgstr "Bilivîne çepê"
msgid "Toggle"
msgstr ""
#, fuzzy
msgid "Show/Hide help"
msgstr "Alîkariyê nîşan bide"
msgid "Quit"
msgstr ""
msgid "First"
msgstr ""
msgid "Last"
msgstr ""
#, fuzzy
msgid "Select"
msgstr "Herêman hilbijêre"
msgid "Page Up"
msgstr ""
msgid "Page Down"
msgstr ""
#, fuzzy
msgid "Page up"
msgstr "Koma pakêtê:"
#, fuzzy
msgid "Page down"
msgstr "Bilivîne jêrê"
msgid "Page Left"
msgstr ""
#, fuzzy
msgid "Page Right"
msgstr "Bilivîne rastê"
msgid "Cursor up"
msgstr ""
#, fuzzy
msgid "Cursor down"
msgstr "Bilivîne jêrê"
#, fuzzy
msgid "Cursor right"
msgstr "Bilivîne rastê"
#, fuzzy
msgid "Cursor left"
msgstr "Bilivîne çepê"
msgid "Top"
msgstr ""
msgid "Bottom"
msgstr ""
msgid "Home"
msgstr ""
#, fuzzy
msgid "End"
msgstr "Çalakkirî"
#, fuzzy
msgid "Toggle option"
msgstr "Vebijêrkên binpeldankê"
msgid "Scroll Up"
msgstr ""
#, fuzzy
msgid "Scroll Down"
msgstr "Pêşdîtina şemitandina jêr"
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 gihîştina cihê te pêwîst dike (komek ji reqalavan b.m. kilîtdank, mişk, hwd)"
@ -1885,3 +2034,202 @@ msgstr ""
msgid "Use Network Manager (iwd backend)"
msgstr ""
msgid "Firewall"
msgstr ""
#, fuzzy
msgid "Select audio configuration"
msgstr "Rêkxisitinê bikarhêner tomar bike"
#, fuzzy
msgid "Enter credentials file decryption password"
msgstr "Borînpeyva şîfrekirina pelê bawernameyan"
#, fuzzy
msgid "Enter root password"
msgstr "Borînpeyvekê têxîne: "
msgid "Select bootloader to install"
msgstr ""
#, fuzzy
msgid "Configuration preview"
msgstr "Rêkxistin"
#, fuzzy
msgid "Enter a directory for the configuration(s) to be saved"
msgstr "Ji bo rêkxisitin ku werin tomarkirin pelrêçekê têxîne: "
#, fuzzy
msgid "Select encryption type"
msgstr "Cûreyê şîfrekirinê"
#, fuzzy
msgid "Select disks for the installation"
msgstr "Navê mêvandarê xwestî ji bo sazkirinê: "
#, fuzzy
msgid "Enter a mountpoint"
msgstr "Xaleke siwarkirinê hilbijêre:"
#, fuzzy, python-brace-format
msgid "Enter a size (default: {}): "
msgstr "Dawî têxîne (kesane: {}): "
#, fuzzy
msgid "Enter subvolume name"
msgstr "Navê binpeldankê"
#, fuzzy
msgid "Enter subvolume mountpoint"
msgstr "Xala siwarkirinê ya binpeldankê"
#, fuzzy
msgid "Select a disk configuration"
msgstr "Rêkxisitina dîskê"
#, fuzzy
msgid "Enter root mount directory"
msgstr "Pelrêça siwarkirina root"
msgid "You will use whatever drive-setup is mounted at the specified directory"
msgstr ""
msgid "WARNING: Archinstall won't check the suitability of this setup"
msgstr ""
#, fuzzy
msgid "Select main filesystem"
msgstr "Pergala pelê biguherîne"
msgid "Enter a hostname"
msgstr ""
#, fuzzy
msgid "Select timezone"
msgstr "Herêmeke demê hilbijêre"
#, fuzzy
msgid "Enter the number of parallel downloads to be enabled"
msgstr ""
"Jimara daxistinên paralel ên ku werin çalakkirin têxîne.\n"
"\n"
"Nîşe:\n"
#, python-brace-format
msgid "Value must be between 1 and {}"
msgstr ""
#, fuzzy
msgid "Select which kernel(s) to install"
msgstr "Tika ka kîjan silavkar divê were sazkirin hilbijêre"
#, fuzzy
msgid "Enter a respository name"
msgstr "Navê depoyê"
#, fuzzy
msgid "Enter the repository url"
msgstr "Depoya kesane biguherîne"
#, fuzzy
msgid "Enter server url"
msgstr "Girêdana rajekar"
#, fuzzy
msgid "Select mirror regions to be enabled"
msgstr "Herêmên eynikê ên hilbijartî"
#, fuzzy
msgid "Select optional repositories to be enabled"
msgstr "Ka kîjan depoyên vebijêrkî divê çalak bibe hilbijêre"
#, fuzzy
msgid "Select an interface"
msgstr "Navrûyê jê bibe"
#, fuzzy
msgid "Choose network configuration"
msgstr "Rêkxisitina torê tune ye"
#, fuzzy
msgid "No packages found"
msgstr "Amûrên U2F nehatin dîtin"
#, fuzzy
msgid "Select which greeter to install"
msgstr "Tika ka kîjan silavkar divê were sazkirin hilbijêre"
#, fuzzy
msgid "Select a profile type"
msgstr "Profîlên hilbijartî: "
#, fuzzy
msgid "Enter new password"
msgstr "Borînpeyva wifi têxîne"
msgid "Enter a username"
msgstr ""
#, fuzzy
msgid "Enter a password"
msgstr "Borînpeyvekê têxîne: "
#, fuzzy
msgid "The password did not match, please try again"
msgstr "Pejirandina borînpeyvê li hev nehat, tika dîsa hewl bide"
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 ""
#, fuzzy, python-brace-format
msgid "Environment type: {} {}"
msgstr "Cûreya jîngehê: {}"
#, fuzzy
msgid "Input cannot be empty"
msgstr "Nirx nabe ku vala be"
msgid "Recommended"
msgstr ""
#, fuzzy
msgid "Package"
msgstr "Koma pakêtê:"
msgid "Curated selection of KDE Plasma packages"
msgstr ""
msgid "Dependencies"
msgstr ""
#, fuzzy
msgid "Package group"
msgstr "Koma pakêtê:"
msgid "Extensive KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Packages in group"
msgstr "Koma pakêtê:"
msgid "Minimal KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Description"
msgstr "Şîfrekirina dîskê"
msgid "Select a flavor of KDE Plasma to install"
msgstr ""

View File

@ -169,7 +169,7 @@
{"abbr": "tr", "lang": "Turkish", "translated_lang" : "Türkçe"},
{"abbr": "tw", "lang": "Twi"},
{"abbr": "ug", "lang": "Uighur"},
{"abbr": "uk", "lang": "Ukrainian"},
{"abbr": "uk", "lang": "Ukrainian", "console_font": "UniCyr_8x16"},
{"abbr": "ur", "lang": "Urdu", "translated_lang": "اردو"},
{"abbr": "uz", "lang": "Uzbek", "translated_lang": "O'zbek"},
{"abbr": "ve", "lang": "Venda"},

Binary file not shown.

View File

@ -28,7 +28,7 @@ msgid " Please submit this issue (and file) to https://github.com/archlinux/a
msgstr " Por favor, envie este problema (e o arquivo) para: https://github.com/archlinux/archinstall/issues"
msgid "Do you really want to abort?"
msgstr "Tem certeza de que deseja abortar?"
msgstr "Tem certeza que deseja abortar?"
msgid "And one more time for verification: "
msgstr "Digite novamente para confirmação: "
@ -195,7 +195,7 @@ msgid "Select what you wish to do with the selected block devices"
msgstr "Selecione o que deseja fazer com os dispositivos de bloco selecionados"
msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments"
msgstr "Esta é uma lista de perfis pré-programados, que podem por exemplo facilitar a instalação de ambientes gráficos"
msgstr "Esta é uma lista de perfis pré-programados, que podem, por exemplo, facilitar a instalação de ambientes gráficos"
msgid "Select keyboard layout"
msgstr "Selecione o layout de teclado"
@ -207,10 +207,10 @@ msgid "Select one or more hard drives to use and configure"
msgstr "Selecione um ou mais discos rígidos para usar e 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 melhor compatibilidade com seu hardware AMD, recomenda-se usar a opção totalmente open source ou as opções AMD / ATI."
msgstr "Para melhor compatibilidade com seu hardware AMD, recomenda-se usar a opção totalmente open-source ou as opções 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 melhor compatibilidade com seu hardware Intel, recomenda-se usar a opção totalmente open source ou as opções Intel.\n"
msgstr "Para melhor compatibilidade com seu hardware Intel, recomenda-se usar a opção totalmente open-source ou as opções Intel.\n"
msgid "For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n"
msgstr "Para melhor compatibilidade com seu hardware Nvidia, recomenda-se usar o driver proprietário da Nvidia.\n"
@ -222,13 +222,13 @@ msgid ""
msgstr ""
"\n"
"\n"
"Selecione um driver de vídeo ou deixe em branco para instalar os drivers completamente open-source"
"Selecione um driver de vídeo ou deixe em branco para instalar os drivers open-source"
msgid "All open-source (default)"
msgstr "Tudo open-source (padrão)"
msgid "Choose which kernels to use or leave blank for default \"{}\""
msgstr "Escolhe quais kernels usar ou deixe em branco para o kernel padrão \"{}\""
msgstr "Escolha quais kernels usar ou deixe em branco para o kernel padrão \"{}\""
msgid "Choose which locale language to use"
msgstr "Escolha qual idioma de localização usar"
@ -249,7 +249,7 @@ msgid "You need to enter a valid fs-type in order to continue. See `man parted`
msgstr "Você precisa definir um tipo de sistema de arquivo válido. Consulte o `man parted` para verificar os tipos de sistemas de arquivo válido."
msgid "Error: Listing profiles on URL \"{}\" resulted in:"
msgstr "Erro: Listando os perfis em URL \"{}\" resulta em:"
msgstr "Erro: Listando os perfis em URL \"{}\" resultou em:"
msgid "Error: Could not decode \"{}\" result as JSON:"
msgstr "Erro: Não foi possível decodificar \"{}\" como JSON:"
@ -309,7 +309,7 @@ msgid "Automatic time sync (NTP)"
msgstr "Sincronização automática de tempo (NTP)"
msgid "Install ({} config(s) missing)"
msgstr "Instalar ({} configuração(s) em falta)"
msgstr "Instalar ({} a(s) configuração(ões) em falta)"
msgid ""
"You decided to skip harddrive selection\n"
@ -387,7 +387,7 @@ msgid "Enter disk encryption password (leave blank for no encryption): "
msgstr "Digite a senha de encriptação do disco (deixe em branco para não encriptar): "
msgid "Create a required super-user with sudo privileges: "
msgstr "Criar um superusuário requerido com privilégios de sudo: "
msgstr "Criar um superusuário necessário com privilégios de sudo: "
msgid "Enter root password (leave blank to disable root): "
msgstr "Digite uma senha de root (deixe em branco para desativar root): "
@ -446,7 +446,7 @@ msgid "Copy to new key:"
msgstr "Copiar para nova chave:"
msgid "Unknown nic type: {}. Possible values are {}"
msgstr "Tipo de NIC desconhecido: {}. Possíveis valores são {}"
msgstr "Tipo de NIC desconhecido: {}. Valores possíveis são {}"
msgid ""
"\n"
@ -456,7 +456,7 @@ msgstr ""
"Esta é a configuração escolhida escolhida por você:"
msgid "Pacman is already running, waiting maximum 10 minutes for it to terminate."
msgstr "O Pacman já está em execução, aguarde no máximo até 10 minutos para terminar."
msgstr "O Pacman já está em execução, esperando até o máximo de 10 minutos para terminar."
msgid "Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall."
msgstr "A trava pré-existente do Pacman não terminou. Por favor, limpe as sessões de pacman existentes antes de usar o archinstall."
@ -550,13 +550,13 @@ msgid "Missing configurations:\n"
msgstr "Configurações em falta:\n"
msgid "Either root-password or at least 1 superuser must be specified"
msgstr "Deve se especificar uma senha de root ou pelo menos 1 superusuário"
msgstr "Deve-se especificar uma senha de root ou pelo menos 1 superusuário"
msgid "Manage superuser accounts: "
msgstr "Administrar contas de superusuário: "
msgid "Manage ordinary user accounts: "
msgstr "Administrar contas de usuário padrão: "
msgstr "Administrar contas de usuário comuns: "
msgid " Subvolume :{:16}"
msgstr " Subvolume :{:16}"
@ -743,7 +743,7 @@ msgid "Value: "
msgstr "Valor: "
msgid "You can skip selecting a drive and partitioning and use whatever drive-setup is mounted at /mnt (experimental)"
msgstr "Você pode ignorar a seleção de unidade e particionar seja lá o que estiver montado em /mnt (experimental)"
msgstr "Você pode ignorar a seleção de unidade e particionar o que estiver montado em /mnt (experimental)"
msgid "Select one of the disks or skip and use /mnt as default"
msgstr "Selecione um dos discos ou ignore e use /mnt como padrão"
@ -833,8 +833,21 @@ msgstr "Entrada inválida! Tente novamente com uma entrada válida [1 para {max_
msgid "Parallel Downloads"
msgstr "Downloads Paralelos"
msgid "Pacman"
msgstr "Pacman"
msgid "Color"
msgstr "Cor"
#, fuzzy, python-brace-format
msgid "Enter the number of parallel downloads (1-{})"
msgstr "Insira o número de downloads paralelos (1-{})"
msgid "Enable colored output for pacman"
msgstr "Ative a saída colorida para o pacman"
msgid "ESC to skip"
msgstr "ESC para sair"
msgstr "ESC para pular"
msgid "CTRL+C to reset"
msgstr "CTRL+C para reiniciar"
@ -1674,6 +1687,139 @@ msgstr "Iniciar modo de busca"
msgid "Exit search mode"
msgstr "Sair do modo de busca"
msgid "General"
msgstr "Geral"
#, fuzzy
msgid "Navigation"
msgstr "Salvar configuração"
#, fuzzy
msgid "Selection"
msgstr "Selecionar regiões"
msgid "Search"
msgstr "Buscar"
msgid "Down"
msgstr "Abaixo"
msgid "Up"
msgstr "Acima"
#, fuzzy
msgid "Confirm"
msgstr "Confirmar"
#, fuzzy
msgid "Focus right"
msgstr "Focar à direita"
#, fuzzy
msgid "Focus left"
msgstr "Focar à esquerda"
msgid "Toggle"
msgstr "Alternar"
#, fuzzy
msgid "Show/Hide help"
msgstr "Mostrar/Esconder ajuda"
msgid "Quit"
msgstr "Sair"
msgid "First"
msgstr "Primeiro"
msgid "Last"
msgstr "Último"
#, fuzzy
msgid "Select"
msgstr "Selecionar"
msgid "Page Up"
msgstr "Página acima"
msgid "Page Down"
msgstr "Página abaixo"
#, fuzzy
msgid "Page up"
msgstr "Página acima"
#, fuzzy
msgid "Page down"
msgstr "Página abaixo"
msgid "Page Left"
msgstr "Página à esquerda"
#, fuzzy
msgid "Page Right"
msgstr "Página à direita"
msgid "Cursor up"
msgstr "Cursor acima"
#, fuzzy
msgid "Cursor down"
msgstr "Cursor abaixo"
#, fuzzy
msgid "Cursor right"
msgstr "Cursor à direita"
#, fuzzy
msgid "Cursor left"
msgstr "Cursor à esquerda"
msgid "Top"
msgstr "Topo"
msgid "Bottom"
msgstr "Rodapé"
msgid "Home"
msgstr "Início"
#, fuzzy
msgid "End"
msgstr "Final"
#, fuzzy
msgid "Toggle option"
msgstr "Alternar opção"
msgid "Scroll Up"
msgstr "Rolar visualização para cima"
#, fuzzy
msgid "Scroll Down"
msgstr "Rolar visualização para baixo"
msgid "Scroll Left"
msgstr "Rolar visualização para a esquerda"
msgid "Scroll Right"
msgstr "Rolar visualização para a direita"
msgid "Scroll Home"
msgstr "Rolar visualização até o começo"
msgid "Scroll End"
msgstr "Rolar visualização até o final"
msgid "Focus Next"
msgstr "Focar no próximo"
msgid "Focus Previous"
msgstr "Focar no anterior"
msgid "Copy selected text"
msgstr "Copiar o texto selecionado"
msgid "labwc needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)"
msgstr "labwc precisa de acesso ao seu seat (conjunto de dispositivos de hardware, como teclado, mouse etc.)"
@ -1866,7 +2012,7 @@ msgid "Will install to custom location with NVRAM entry"
msgstr "Será instalado em um local personalizado com entrada NVRAM"
msgid "Firmware that does not properly support NVRAM boot entries like most MSI motherboards,"
msgstr "Firmware que não oferece suporte adequado a entradas de boot na NVRAM,"
msgstr "Firmware que não oferece suporte adequado a entradas de boot na NVRAM, como a maioria das placas-mãe MSI,"
msgid "most Apple Macs, many laptops..."
msgstr "a maioria dos Macs da Apple, muitos laptops..."
@ -1875,7 +2021,7 @@ msgid "Language"
msgstr "Idioma"
msgid "Compression algorithm"
msgstr "Algorítimo de compressão"
msgstr "Algoritmo de compressão"
msgid "Only packages such as base, sudo, linux, linux-firmware, efibootmgr and optional profile packages are installed."
msgstr "Apenas pacotes como base, base-devel, linux, linux-firmware, efibootmgr e pacotes opcionais de perfil são instalados."
@ -1884,10 +2030,10 @@ msgid "Select zram compression algorithm:"
msgstr "Selecione o algoritmo de compressão zram:"
msgid "Use Network Manager (default backend)"
msgstr "Use o Network Manager (default backend)"
msgstr "Use o Network Manager (backend padrão)"
msgid "Use Network Manager (iwd backend)"
msgstr "Use o Network Manager (iwd backend)"
msgstr "Use o Network Manager (backend com iwd)"
msgid "Firewall"
msgstr "Firewall"
@ -2002,5 +2148,60 @@ msgstr "Digite uma senha"
msgid "The password did not match, please try again"
msgstr "A senha não corresponde. Tente novamente"
msgid "Password strength: Weak"
msgstr "Nível de segurança da senha: Fraca"
msgid "Password strength: Moderate"
msgstr "Nível de segurança da senha: Moderada"
msgid "Password strength: Strong"
msgstr "Nível de segurança da senha: Forte"
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr "O perfil de desktop selecionado requer um usuário regular para fazer o login pelo greeter"
#, fuzzy, python-brace-format
msgid "Environment type: {} {}"
msgstr "Tipo de ambiente: {}"
#, fuzzy
msgid "Input cannot be empty"
msgstr "Valor não pode estar vazio"
msgid "Recommended"
msgstr "Recomendado"
#, fuzzy
msgid "Package"
msgstr "Pacote"
msgid "Curated selection of KDE Plasma packages"
msgstr "Coleção selecionada de pacotes do KDE Plasma"
msgid "Dependencies"
msgstr "Dependências"
#, fuzzy
msgid "Package group"
msgstr "Grupo de pacotes:"
msgid "Extensive KDE Plasma installation"
msgstr "Instalação extensiva do KDE Plasma"
#, fuzzy
msgid "Packages in group"
msgstr "Pacotes no grupo"
msgid "Minimal KDE Plasma installation"
msgstr "Instalação mínima do KDE Plasma"
#, fuzzy
msgid "Description"
msgstr "Descrição"
#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
msgstr "Selecione uma versão do KDE Plasma para instalar"
#~ msgid "When picking a directory to save configuration files to, by default we will ignore the following folders: "
#~ msgstr "Ao selecionar um diretório para salvar arquivos de configuração, por padrão nós ignoramos as seguintes pastas: "

View File

@ -826,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, щоб пропустити"
@ -1666,6 +1679,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 потребує доступ до вашого місця (набору апаратних пристроїв, таких як клавіатура, миша тощо)"
@ -1884,6 +2014,21 @@ msgstr "Використовувати NetworkManager (з 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 "Оберіть конфігурацію аудіо"
@ -2008,3 +2153,46 @@ msgstr "Надійність пароля: Сильна"
msgid "The selected desktop profile requires a regular user to log in via the greeter"
msgstr "Обраний профіль робочого столу вимагає входу звичайного користувача через менеджер входу"
#, fuzzy, python-brace-format
msgid "Environment type: {} {}"
msgstr "Тип середовища: {}"
#, fuzzy
msgid "Input cannot be empty"
msgstr "Значення не може бути пустим"
msgid "Recommended"
msgstr ""
#, fuzzy
msgid "Package"
msgstr "Група пакетів:"
msgid "Curated selection of KDE Plasma packages"
msgstr ""
msgid "Dependencies"
msgstr ""
#, fuzzy
msgid "Package group"
msgstr "Група пакетів:"
msgid "Extensive KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Packages in group"
msgstr "Група пакетів:"
msgid "Minimal KDE Plasma installation"
msgstr ""
#, fuzzy
msgid "Description"
msgstr "Шифрування диска"
#, fuzzy
msgid "Select a flavor of KDE Plasma to install"
msgstr "Оберіть завантажувач для встановлення"

View File

@ -16,7 +16,7 @@ from archinstall.lib.networking import ping
from archinstall.lib.output import debug, error, info, warn
from archinstall.lib.packages.util import check_version_upgrade
from archinstall.lib.pacman.pacman import Pacman
from archinstall.lib.translationhandler import tr
from archinstall.lib.translationhandler import tr, translation_handler
from archinstall.lib.utils.util import running_from_iso
from archinstall.tui.ui.components import tui
@ -95,6 +95,8 @@ def run() -> int:
print(tr('Archinstall requires root privileges to run. See --help for more.'))
return 1
translation_handler.save_console_font()
_log_sys_info()
if not arch_config_handler.args.offline:
@ -159,6 +161,8 @@ def main() -> int:
_error_message(exc)
rc = 1
translation_handler.restore_console_font()
return rc

View File

@ -39,12 +39,10 @@ def show_menu(
arch_config_handler.config,
mirror_list_handler,
arch_config_handler.args.skip_boot,
advanced=arch_config_handler.args.advanced,
title=title_text,
)
if not arch_config_handler.args.advanced:
global_menu.set_enabled('parallel_downloads', False)
result: ArchConfig | None = tui.run(global_menu)
if result is None:
sys.exit(0)
@ -94,7 +92,7 @@ def perform_installation(
)
if disk_config.config_type != DiskLayoutType.Pre_mount:
if disk_config.disk_encryption and disk_config.disk_encryption.encryption_type != EncryptionType.NoEncryption:
if disk_config.disk_encryption and disk_config.disk_encryption.encryption_type != EncryptionType.NO_ENCRYPTION:
# generate encryption key files for the mounted luks devices
installation.generate_key_files()
@ -106,6 +104,7 @@ def perform_installation(
mkinitcpio=run_mkinitcpio,
hostname=arch_config_handler.config.hostname,
locale_config=locale_config,
pacman_config=config.pacman_config,
)
if mirror_config := config.mirror_config:

View File

@ -1,13 +1,13 @@
import sys
from abc import ABC, abstractmethod
from collections.abc import Awaitable, Callable
from dataclasses import dataclass
from dataclasses import dataclass, replace
from enum import Enum, auto
from typing import Any, ClassVar, Literal, TypeVar, cast, override
from textual import work
from textual.app import App, ComposeResult
from textual.binding import Binding
from textual.binding import Binding, BindingsMap
from textual.containers import Center, Horizontal, ScrollableContainer, Vertical
from textual.events import Key
from textual.geometry import Offset
@ -27,6 +27,18 @@ from archinstall.tui.ui.result import Result, ResultType
ValueT = TypeVar('ValueT')
def _translate_bindings(source: BindingsMap | None, target: BindingsMap) -> None:
"""Translate binding descriptions from source to target.
Uses source (original, immutable class-level cache) to avoid
double-translation on repeated calls (e.g. language switch).
"""
if source is None:
return
for key, bindings in source.key_to_bindings.items():
target.key_to_bindings[key] = [replace(b, description=tr(b.description)) if b.description else b for b in bindings]
class BaseScreen(Screen[Result[ValueT]]):
BINDINGS: ClassVar = [
Binding('escape', 'cancel_operation', 'Cancel', show=True),
@ -97,6 +109,7 @@ class LoadingScreen(BaseScreen[ValueT]):
yield Footer()
def on_mount(self) -> None:
_translate_bindings(self._merged_bindings, self._bindings)
if self._data_callback:
self._exec_callback()
else:
@ -129,6 +142,10 @@ class _OptionList(OptionList):
Binding('k', 'cursor_up', 'Up', show=False),
]
@override
def on_mount(self) -> None:
_translate_bindings(self._merged_bindings, self._bindings)
class OptionListScreen(BaseScreen[ValueT]):
"""
@ -271,6 +288,7 @@ class OptionListScreen(BaseScreen[ValueT]):
yield Footer()
def on_mount(self) -> None:
_translate_bindings(self._merged_bindings, self._bindings)
self._update_options(self._options)
self.query_one(OptionList).focus()
@ -356,6 +374,10 @@ class _SelectionList(SelectionList[ValueT]):
Binding('space', 'select', 'Toggle', show=True),
]
@override
def on_mount(self) -> None:
_translate_bindings(self._merged_bindings, self._bindings)
class SelectListScreen(BaseScreen[ValueT]):
"""
@ -500,6 +522,7 @@ class SelectListScreen(BaseScreen[ValueT]):
self._handle_search_action()
def on_mount(self) -> None:
_translate_bindings(self._merged_bindings, self._bindings)
self._update_options(self._options)
self.query_one(SelectionList).focus()
@ -670,6 +693,7 @@ class ConfirmationScreen(BaseScreen[ValueT]):
yield Footer()
def on_mount(self) -> None:
_translate_bindings(self._merged_bindings, self._bindings)
self._update_selection()
def action_focus_right(self) -> None:
@ -825,6 +849,7 @@ class InputScreen(BaseScreen[str]):
yield Footer()
def on_mount(self) -> None:
_translate_bindings(self._merged_bindings, self._bindings)
input_field = self.query_one('#main_input', Input)
input_field.focus()
@ -872,6 +897,10 @@ class _DataTable(DataTable[ValueT]):
Binding('enter', 'select_cursor', 'Confirm', show=True),
]
@override
def on_mount(self) -> None:
_translate_bindings(self._merged_bindings, self._bindings)
class TableSelectionScreen(BaseScreen[ValueT]):
BINDINGS: ClassVar = [
@ -992,6 +1021,7 @@ class TableSelectionScreen(BaseScreen[ValueT]):
yield Footer()
def on_mount(self) -> None:
_translate_bindings(self._merged_bindings, self._bindings)
self._display_header(True)
data_table = self.query_one(DataTable)
data_table.cell_padding = 2
@ -1016,6 +1046,20 @@ class TableSelectionScreen(BaseScreen[ValueT]):
header = self.query_one('#header_text', Label)
header.display = not is_loading
def _get_column_keys(self, items: list[MenuItem]) -> list[str]:
all_keys: list[str] = []
for item in items:
if item.value:
all_keys.extend(item.value.table_data().keys())
# Create unique list while preserving order
unique_keys: list[str] = list(dict.fromkeys(all_keys))
if self._multi:
unique_keys.insert(0, ' ')
return unique_keys
def _put_data_to_table(self, table: DataTable[ValueT], group: MenuItemGroup) -> None:
items = group.items
selected = group.selected_items
@ -1024,15 +1068,7 @@ class TableSelectionScreen(BaseScreen[ValueT]):
_ = self.dismiss(Result(ResultType.Selection))
return
value = items[0].value
if not value:
_ = self.dismiss(Result(ResultType.Selection))
return
cols = list(value.table_data().keys())
if self._multi:
cols.insert(0, ' ')
cols = self._get_column_keys(items)
table.add_columns(*cols)
@ -1236,6 +1272,13 @@ class _AppInstance(App[ValueT]):
super().__init__(ansi_color=True)
self._main = main
@override
async def _on_exit_app(self) -> None:
from archinstall.lib.translationhandler import translation_handler
translation_handler.restore_console_font()
await super()._on_exit_app()
def action_trigger_help(self) -> None:
from textual.widgets import HelpPanel
@ -1245,6 +1288,10 @@ class _AppInstance(App[ValueT]):
_ = self.screen.mount(HelpPanel())
def on_mount(self) -> None:
from archinstall.lib.translationhandler import translation_handler
translation_handler.apply_console_font()
_translate_bindings(self._merged_bindings, self._bindings)
self._run_worker()
@work
@ -1291,5 +1338,10 @@ class TApp:
assert TApp.app
TApp.app.exit(result)
def translate_bindings(self) -> None:
"""Re-translate app-level binding descriptions after language change."""
if TApp.app is not None:
_translate_bindings(TApp.app._merged_bindings, TApp.app._bindings)
tui = TApp()

View File

@ -64,8 +64,8 @@ After running ``python -m archinstall test_installer`` it should print something
_PartitionInfo(
partition=<parted.partition.Partition object at 0x7fbe166c4a90>,
name='primary',
type=<PartitionType.Primary: 'primary'>,
fs_type=<FilesystemType.Fat32: 'fat32'>,
type=<PartitionType.PRIMARY: 'primary'>,
fs_type=<FilesystemType.FAT32: 'fat32'>,
path='/dev/nvme0n1p1',
start=Size(value=2048, unit=<Unit.sectors: 'sectors'>, sector_size=SectorSize(value=512, unit=<Unit.B: 1>)),
length=Size(value=535822336, unit=<Unit.B: 1>, sector_size=SectorSize(value=512, unit=<Unit.B: 1>)),

View File

@ -37,20 +37,20 @@ device_modification = DeviceModification(device, wipe=True)
# create a new boot partition
boot_partition = PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
status=ModificationStatus.CREATE,
type=PartitionType.PRIMARY,
start=Size(1, Unit.MiB, device.device_info.sector_size),
length=Size(512, Unit.MiB, device.device_info.sector_size),
mountpoint=Path('/boot'),
fs_type=FilesystemType.Fat32,
fs_type=FilesystemType.FAT32,
flags=[PartitionFlag.BOOT],
)
device_modification.add_partition(boot_partition)
# create a root partition
root_partition = PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
status=ModificationStatus.CREATE,
type=PartitionType.PRIMARY,
start=Size(513, Unit.MiB, device.device_info.sector_size),
length=Size(20, Unit.GiB, device.device_info.sector_size),
mountpoint=None,
@ -64,8 +64,8 @@ length_home = device.device_info.total_size - start_home
# create a new home partition
home_partition = PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
status=ModificationStatus.CREATE,
type=PartitionType.PRIMARY,
start=start_home,
length=length_home,
mountpoint=Path('/home'),
@ -82,7 +82,7 @@ disk_config = DiskLayoutConfiguration(
# disk encryption configuration (Optional)
disk_encryption = DiskEncryption(
encryption_password=Password(plaintext='enc_password'),
encryption_type=EncryptionType.Luks,
encryption_type=EncryptionType.LUKS,
partitions=[home_partition],
hsm_device=None,
)

View File

@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "archinstall"
version = "4.1"
version = "4.3"
description = "Arch Linux installer - guided, templates etc."
authors = [
{name = "Anton Hvornum", email = "anton@hvornum.se"},
@ -18,11 +18,12 @@ classifiers = [
"Operating System :: POSIX :: Linux",
]
dependencies = [
"pyparted>=3.13.0",
"pyparted==3.13.0",
"pydantic==2.12.5",
"cryptography>=45.0.7",
"textual>=5.3.0",
"markdown-it-py[linkify]>=4.0.0",
"cryptography==46.0.7",
"textual==8.2.3",
"markdown-it-py==4.0.0",
"linkify-it-py==2.1.0",
]
[project.urls]
@ -33,10 +34,10 @@ Source = "https://github.com/archlinux/archinstall"
[project.optional-dependencies]
log = ["systemd_python==235"]
dev = [
"mypy==1.20.0",
"mypy==1.20.1",
"flake8==7.3.0",
"pre-commit==4.5.1",
"ruff==0.15.10",
"ruff==0.15.11",
"pylint==4.0.5",
"pytest==9.0.3",
]

View File

@ -8,6 +8,32 @@
"pre-commit": {
"enabled": true
},
"customManagers": [
{
"customType": "regex",
"description": "Track runtime Python deps via Arch Linux repos instead of PyPI",
"managerFilePatterns": ["**/pyproject.toml"],
"matchStrings": [
"\"(?<depName>pyparted|pydantic|cryptography|textual|markdown-it-py|linkify-it-py)==(?<currentValue>[^\"]+)\""
],
"depNameTemplate": "arch/python-{{{depName}}}",
"datasourceTemplate": "repology",
"versioningTemplate": "loose",
"extractVersionTemplate": "^(?<version>.+)-\\d+$"
},
{
"customType": "regex",
"description": "Track systemd_python via Arch Linux repos (different package name)",
"managerFilePatterns": ["**/pyproject.toml"],
"matchStrings": [
"\"systemd_python==(?<currentValue>[^\"]+)\""
],
"depNameTemplate": "arch/python-systemd",
"datasourceTemplate": "repology",
"versioningTemplate": "loose",
"extractVersionTemplate": "^(?<version>.+)-\\d+$"
}
],
"packageRules": [
{
"matchDepTypes": [
@ -24,6 +50,20 @@
"astral-sh/ruff-pre-commit"
],
"automerge": true
},
{
"description": "Disable PyPI updates for runtime deps tracked via Arch repos",
"matchDatasources": ["pypi"],
"matchPackageNames": [
"pyparted",
"pydantic",
"cryptography",
"textual",
"markdown-it-py",
"linkify-it-py",
"systemd_python"
],
"enabled": false
}
]
}

View File

@ -22,6 +22,7 @@ from archinstall.lib.models.locale import LocaleConfiguration
from archinstall.lib.models.mirrors import CustomRepository, CustomServer, MirrorConfiguration, MirrorRegion, SignCheck, SignOption
from archinstall.lib.models.network import NetworkConfiguration, Nic, NicType
from archinstall.lib.models.packages import Repository
from archinstall.lib.models.pacman import PacmanConfiguration
from archinstall.lib.models.profile import ProfileConfiguration
from archinstall.lib.models.users import Password, User
from archinstall.lib.profile.profiles_handler import profile_handler
@ -234,7 +235,7 @@ def test_config_file_parsing(
kernels=['linux-zen'],
ntp=True,
packages=['firefox'],
parallel_downloads=66,
pacman_config=PacmanConfiguration(parallel_downloads=66),
swap=ZramConfiguration(enabled=False),
timezone='UTC',
services=['service_1', 'service_2'],