index : archinstall32 | |
Archlinux32 installer | gitolite user |
summaryrefslogtreecommitdiff |
diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 4cd32a93..647ad70e 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -19,8 +19,8 @@ jobs: pip install build twine - name: Build archinstall run: | - python -m build + python -m build . --wheel - uses: actions/upload-artifact@v3 with: name: archinstall - path: dist/* + path: dist/*
\ No newline at end of file diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index dd25a105..8a5bd679 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -24,7 +24,7 @@ jobs: pip install build twine - name: Build archinstall run: | - python -m build + python -m build . --wheel - name: Publish archinstall to PyPi env: TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} @@ -4,44 +4,63 @@ # Contributor: demostanis worlds <demostanis@protonmail.com> pkgname=archinstall -pkgver=2.5.0 -#pkgver=$(git describe --long | sed 's/\([^-]*-g\)/r\1/;s/-/./g') +pkgver=2.5.4 pkgrel=1 pkgdesc="Just another guided/automated Arch Linux installer with a twist" arch=(any) url="https://github.com/archlinux/archinstall" license=(GPL3) -depends=(python) -makedepends=(python-build python-installer python-flit python-setuptools python-sphinx python-wheel) -provides=(python-archinstall) -conflicts=(python-archinstall) -replaces=(python-archinstall) +depends=( + 'python' + 'systemd' +) +makedepends=( + 'python-setuptools' + 'python-sphinx' + 'python-build' + 'python-installer' + 'python-wheel' +) +optdepends=( + 'python-systemd: Adds journald logging' +) +provides=(python-archinstall archinstall) +conflicts=(python-archinstall archinstall-git) +replaces=(python-archinstall archinstall-git) source=( $pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz $pkgname-$pkgver.tar.gz.sig::$url/releases/download/v$pkgver/$pkgname-$pkgver.tar.gz.sig ) -sha512sums=('9516719c4e4fe0423224a35b4846cf5c8daeb931cff6fed588957840edc5774e9c6fe18619d2356a6d76681ae3216ba19f5d0f0bd89c6301b4ff9b128d037d13' +sha512sums=('64cb3593c5091b3885ad14ef073cfab31090b4f9bcb4405b18cf9b19adb5ca42255ba8891ec62e21f92d59872541ef6d94f186fb05c625822af63525441e08d9' 'SKIP') -b2sums=('a29ae767756f74ce296d53e31bb8376cfa7db19a53b8c3997b2d8747a60842ba88e8b18c505bc56a36d685f73f7a6d9e53adff17953c8a4ebaabc67c6db8e583' +b2sums=('9c0ec0871841804377ba8310dc744711adcec4eed7319a8d89d684af8e7b822bb9d47540b00f4d746a9fcd7b9ea1b9e07bac773e6c28fabc760e4df38b16748b' 'SKIP') validpgpkeys=('256F73CEEFC6705C6BBAB20E5FBBB32941E3740A') # Anton Hvornum (Torxed) <anton@hvornum.se> +pkgver() { + cd $pkgname-$pkgver + + awk '$1 ~ /^__version__/ {gsub("\"", ""); print $3}' archinstall/__init__.py +} + prepare() { cd $pkgname-$pkgver + # use real directories for examples and profiles, as symlinks do not work - # with flit or setuptools PEP517 backends rm -fv $pkgname/{examples,profiles} mv -v examples profiles $pkgname/ } build() { cd $pkgname-$pkgver + python -m build --wheel --no-isolation PYTHONDONTWRITEBYTECODE=1 make man -C docs } package() { cd "$pkgname-$pkgver" + python -m installer --destdir="$pkgdir" dist/*.whl install -vDm 644 docs/_build/man/archinstall.1 -t "$pkgdir/usr/share/man/man1/" -}
\ No newline at end of file +} @@ -46,7 +46,7 @@ English Deutsch Español Français -Indonesia +Indonesian Italiano Nederlands Polskie @@ -168,6 +168,7 @@ you can replace the version of archinstall with a new version and run that with 5. Enter the repository with `cd archinstall` *At this stage, you can choose to check out a feature branch for instance with `git checkout v2.3.1-rc1`* 6. Build the project and install it using `python setup.py install` + *If you get a 'No Module named setuptools' error, run `pacman -S python-setuptools`* After this, running archinstall with `python -m archinstall` will run against whatever branch you chose in step 5. diff --git a/archinstall/__init__.py b/archinstall/__init__.py index e496d213..9de4a3ec 100644 --- a/archinstall/__init__.py +++ b/archinstall/__init__.py @@ -47,7 +47,7 @@ from .lib.configuration import * from .lib.udev import udevadm_info parser = ArgumentParser() -__version__ = "2.5.2" +__version__ = "2.5.4" storage['__version__'] = __version__ # add the custome _ as a builtin, it can now be used anywhere in the @@ -221,11 +221,8 @@ def load_config(): selected_region = arguments.get('mirror-region', None) arguments['mirror-region'] = {selected_region: list_mirrors()[selected_region]} - if arguments.get('sys-language', None) is not None: - arguments['sys-language'] = arguments.get('sys-language', 'en_US') - - if arguments.get('sys-encoding', None) is not None: - arguments['sys-encoding'] = arguments.get('sys-encoding', 'utf-8') + arguments.setdefault('sys-language', 'en_US') + arguments.setdefault('sys-encoding', 'utf-8') if arguments.get('gfx_driver', None) is not None: storage['gfx_driver_packages'] = AVAILABLE_GFX_DRIVERS.get(arguments.get('gfx_driver', None), None) @@ -243,6 +240,14 @@ def load_config(): superusers = arguments.get('!superusers', None) arguments['!users'] = User.parse_arguments(users, superusers) + if arguments.get('disk_encryption', None) is not None and arguments.get('disk_layouts', None) is not None: + password = arguments.get('encryption_password', '') + arguments['disk_encryption'] = DiskEncryption.parse_arg( + arguments['disk_layouts'], + arguments['disk_encryption'], + password + ) + def post_process_arguments(arguments): storage['arguments'] = arguments diff --git a/archinstall/lib/configuration.py b/archinstall/lib/configuration.py index ad537b21..c036783f 100644 --- a/archinstall/lib/configuration.py +++ b/archinstall/lib/configuration.py @@ -44,7 +44,7 @@ class ConfigurationOutput: self._disk_layout_file = "user_disk_layout.json" self._sensitive = ['!users'] - self._ignore = ['abort', 'install', 'config', 'creds', 'dry_run', 'disk_encryption'] + self._ignore = ['abort', 'install', 'config', 'creds', 'dry_run'] self._process_config() @@ -71,6 +71,9 @@ class ConfigurationOutput: else: self._user_config[key] = self._config[key] + if key == 'disk_encryption' and self._config[key]: # special handling for encryption password + self._user_credentials['encryption_password'] = self._config[key].encryption_password + def user_config_to_json(self) -> str: return json.dumps({ 'config_version': storage['__version__'], # Tells us what version was used to generate the config diff --git a/archinstall/lib/disk/encryption.py b/archinstall/lib/disk/encryption.py index 67f656c8..c7496bfa 100644 --- a/archinstall/lib/disk/encryption.py +++ b/archinstall/lib/disk/encryption.py @@ -46,7 +46,7 @@ class DiskEncryptionMenu(AbstractSubMenu): Selector( _('Partitions'), func=lambda preset: select_partitions_to_encrypt(self._disk_layouts, preset), - display_func=lambda x: f'{len(x)} {_("Partitions")}' if x else None, + display_func=lambda x: f'{sum([len(y) for y in x.values()])} {_("Partitions")}' if x else None, dependencies=['encryption_password'], default=self._preset.partitions, preview_func=self._prev_disk_layouts, @@ -86,9 +86,14 @@ class DiskEncryptionMenu(AbstractSubMenu): def _prev_disk_layouts(self) -> Optional[str]: selector = self._menu_options['partitions'] if selector.has_selection(): - partitions: List[Any] = selector.current_selection + partitions: Dict[str, Any] = selector.current_selection + + all_partitions = [] + for parts in partitions.values(): + all_partitions += parts + output = str(_('Partitions to be encrypted')) + '\n' - output += current_partition_layout(partitions, with_title=False) + output += current_partition_layout(all_partitions, with_title=False) return output.rstrip() return None @@ -132,7 +137,7 @@ def select_hsm(preset: Optional[Fido2Device] = None) -> Optional[Fido2Device]: return None -def select_partitions_to_encrypt(disk_layouts: Dict[str, Any], preset: List[Any]) -> List[Any]: +def select_partitions_to_encrypt(disk_layouts: Dict[str, Any], preset: Dict[str, Any]) -> Dict[str, Any]: # If no partitions was marked as encrypted, but a password was supplied and we have some disks to format.. # Then we need to identify which partitions to encrypt. This will default to / (root). all_partitions = [] @@ -153,10 +158,17 @@ def select_partitions_to_encrypt(disk_layouts: Dict[str, Any], preset: List[Any] match choice.type_: case MenuSelectionType.Reset: - return [] + return {} case MenuSelectionType.Skip: return preset case MenuSelectionType.Selection: - return choice.value # type: ignore + selections: List[Any] = choice.value # type: ignore + partitions = {} + + for path, device in disk_layouts.items(): + for part in selections: + if part in device.get('partitions', []): + partitions.setdefault(path, []).append(part) - return [] + return partitions + return {} diff --git a/archinstall/lib/disk/filesystem.py b/archinstall/lib/disk/filesystem.py index bdfa502a..1083df53 100644 --- a/archinstall/lib/disk/filesystem.py +++ b/archinstall/lib/disk/filesystem.py @@ -113,7 +113,7 @@ class Filesystem: format_options = partition.get('options',[]) + partition.get('filesystem',{}).get('format_options',[]) disk_encryption: DiskEncryption = storage['arguments'].get('disk_encryption') - if partition in disk_encryption.partitions: + if disk_encryption and partition in disk_encryption.all_partitions: if not partition['device_instance']: raise DiskError(f"Internal error caused us to loose the partition. Please report this issue upstream!") diff --git a/archinstall/lib/disk/helpers.py b/archinstall/lib/disk/helpers.py index a5164b76..80d0cb53 100644 --- a/archinstall/lib/disk/helpers.py +++ b/archinstall/lib/disk/helpers.py @@ -212,6 +212,47 @@ def all_disks() -> List[BlockDevice]: log(f"[Deprecated] archinstall.all_disks() is deprecated. Use archinstall.all_blockdevices() with the appropriate filters instead.", level=logging.WARNING, fg="yellow") return all_blockdevices(partitions=False, mappers=False) +def get_blockdevice_info(device_path, exclude_iso_dev :bool = True) -> Dict[str, Any]: + for retry_attempt in range(storage['DISK_RETRY_ATTEMPTS']): + partprobe(device_path) + time.sleep(max(0.1, storage['DISK_TIMEOUTS'] * retry_attempt)) + + try: + if exclude_iso_dev: + # exclude all devices associated with the iso boot locations + iso_devs = ['/run/archiso/airootfs', '/run/archiso/bootmnt'] + + try: + lsblk_info = get_lsblk_info(device_path) + except DiskError: + continue + + if any([dev in lsblk_info.mountpoints for dev in iso_devs]): + continue + + information = blkid(f'blkid -p -o export {device_path}') + return enrich_blockdevice_information(information) + except SysCallError as ex: + if ex.exit_code == 2: + # Assume that it's a loop device, and try to get info on it + try: + resolved_device_name = device_path.readlink().name + except OSError: + resolved_device_name = device_path.name + + try: + information = get_loop_info(device_path) + if not information: + raise SysCallError(f"Could not get loop information for {resolved_device_name}", exit_code=1) + return enrich_blockdevice_information(information) + + except SysCallError: + information = get_blockdevice_uevent(resolved_device_name) + return enrich_blockdevice_information(information) + else: + # We could not reliably get any information, perhaps the disk is clean of information? + if retry_attempt == storage['DISK_RETRY_ATTEMPTS'] - 1: + raise ex def all_blockdevices( mappers: bool = False, @@ -230,40 +271,18 @@ def all_blockdevices( # we'll iterate the /sys/class definitions and find the information # from there. for block_device in glob.glob("/sys/class/block/*"): - device_path = pathlib.Path(f"/dev/{pathlib.Path(block_device).readlink().name}") + try: + device_path = pathlib.Path(f"/dev/{pathlib.Path(block_device).readlink().name}") + except FileNotFoundError: + log(f"Unknown device found by '/sys/class/block/*', ignoring: {device_path}", level=logging.WARNING, fg="yellow") if device_path.exists() is False: log(f"Unknown device found by '/sys/class/block/*', ignoring: {device_path}", level=logging.WARNING, fg="yellow") continue - try: - if exclude_iso_dev: - # exclude all devices associated with the iso boot locations - iso_devs = ['/run/archiso/airootfs', '/run/archiso/bootmnt'] - lsblk_info = get_lsblk_info(device_path) - if any([dev in lsblk_info.mountpoints for dev in iso_devs]): - continue - - information = blkid(f'blkid -p -o export {device_path}') - except SysCallError as ex: - if ex.exit_code in (512, 2): - # Assume that it's a loop device, and try to get info on it - try: - information = get_loop_info(device_path) - if not information: - print("Exit code for blkid -p -o export was:", ex.exit_code) - raise SysCallError("Could not get loop information", exit_code=1) - - except SysCallError: - print("Not a loop device, trying uevent rules.") - information = get_blockdevice_uevent(pathlib.Path(block_device).readlink().name) - else: - # We could not reliably get any information, perhaps the disk is clean of information? - print("Raising ex because:", ex.exit_code) - raise ex - # return instances - - information = enrich_blockdevice_information(information) + information = get_blockdevice_info(device_path) + if not information: + continue for path, path_info in information.items(): if path_info.get('DMCRYPT_NAME'): @@ -409,7 +428,6 @@ def get_partitions_in_use(mountpoint :str) -> Dict[str, Any]: return {} output = json.loads(output) - # print(output) mounts = {} @@ -421,11 +439,13 @@ def get_partitions_in_use(mountpoint :str) -> Dict[str, Any]: continue if isinstance(blockdev, Partition): - for blockdev_mountpoint in blockdev.mountpoints: - block_devices_mountpoints[blockdev_mountpoint] = blockdev + if blockdev.mountpoints: + for blockdev_mountpoint in blockdev.mountpoints: + block_devices_mountpoints[blockdev_mountpoint] = blockdev else: - for blockdev_mountpoint in blockdev.mount_information: - block_devices_mountpoints[blockdev_mountpoint['target']] = blockdev + if blockdev.mount_information: + for blockdev_mountpoint in blockdev.mount_information: + block_devices_mountpoints[blockdev_mountpoint['target']] = blockdev log(f'Filtering available mounts {block_devices_mountpoints} to those under {mountpoint}', level=logging.DEBUG) diff --git a/archinstall/lib/disk/mapperdev.py b/archinstall/lib/disk/mapperdev.py index 71ef2a79..bf1b3583 100644 --- a/archinstall/lib/disk/mapperdev.py +++ b/archinstall/lib/disk/mapperdev.py @@ -25,6 +25,10 @@ class MapperDev: return f"/dev/mapper/{self.mappername}" @property + def part_uuid(self): + return self.partition.part_uuid + + @property def partition(self): from .helpers import uevent, get_parent_of_partition from .partition import Partition diff --git a/archinstall/lib/disk/partition.py b/archinstall/lib/disk/partition.py index 9febf102..87eaa6a7 100644 --- a/archinstall/lib/disk/partition.py +++ b/archinstall/lib/disk/partition.py @@ -98,17 +98,18 @@ class Partition: if mountpoint: self.mount(mountpoint) - self._partition_info = self._fetch_information() - - if not autodetect_filesystem and filesystem: - self._partition_info.filesystem_type = filesystem + try: + self._partition_info = self._fetch_information() + + if not autodetect_filesystem and filesystem: + self._partition_info.filesystem_type = filesystem - if self._partition_info.filesystem_type == 'crypto_LUKS': - self._encrypted = True + if self._partition_info.filesystem_type == 'crypto_LUKS': + self._encrypted = True + except DiskError: + self._partition_info = None - # I hate doint this but I'm currently unsure where this - # is acutally used to be able to fix the typing issues properly - @typing.no_type_check + @typing.no_type_check # I hate doint this but I'm currently unsure where this is used. def __lt__(self, left_comparitor :BlockDevice) -> bool: if type(left_comparitor) == Partition: left_comparitor = left_comparitor.path @@ -120,14 +121,17 @@ class Partition: def __repr__(self, *args :str, **kwargs :str) -> str: mount_repr = '' - if mountpoint := self._partition_info.get_first_mountpoint(): - mount_repr = f", mounted={mountpoint}" - elif self._target_mountpoint: - mount_repr = f", rel_mountpoint={self._target_mountpoint}" + if self._partition_info: + if mountpoint := self._partition_info.get_first_mountpoint(): + mount_repr = f", mounted={mountpoint}" + elif self._target_mountpoint: + mount_repr = f", rel_mountpoint={self._target_mountpoint}" classname = self.__class__.__name__ - if self._encrypted: + if not self._partition_info: + return f'{classname}(path={self._path})' + elif self._encrypted: return f'{classname}(path={self._path}, size={self.size}, PARTUUID={self.part_uuid}, parent={self.real_device}, fs={self._partition_info.filesystem_type}{mount_repr})' else: return f'{classname}(path={self._path}, size={self.size}, PARTUUID={self.part_uuid}, fs={self._partition_info.filesystem_type}{mount_repr})' @@ -146,7 +150,7 @@ class Partition: 'encrypted': self._encrypted, 'start': self.start, 'size': self.end, - 'filesystem': self._partition_info.filesystem_type + 'filesystem': self._partition_info.filesystem_type if self._partition_info else 'Unknown' } return partition_info @@ -164,34 +168,37 @@ class Partition: 'start': self.start, 'size': self.end, 'filesystem': { - 'format': self._partition_info.filesystem_type + 'format': self._partition_info.filesystem_type if self._partition_info else 'None' } } def _call_lsblk(self) -> Dict[str, Any]: - self.partprobe() - # This sleep might be overkill, but lsblk is known to - # work against a chaotic cache that can change during call - # causing no information to be returned (blkid is better) - # time.sleep(1) + for retry_attempt in range(storage['DISK_RETRY_ATTEMPTS']): + self.partprobe() + time.sleep(max(0.1, storage['DISK_TIMEOUTS'] * retry_attempt)) # TODO: Remove, we should be relying on blkid instead of lsblk + # This sleep might be overkill, but lsblk is known to + # work against a chaotic cache that can change during call + # causing no information to be returned (blkid is better) + # time.sleep(1) - # TODO: Maybe incorporate a re-try system here based on time.sleep(max(0.1, storage.get('DISK_TIMEOUTS', 1))) + # TODO: Maybe incorporate a re-try system here based on time.sleep(max(0.1, storage.get('DISK_TIMEOUTS', 1))) - try: - output = SysCommand(f"lsblk --json -b -o+LOG-SEC,SIZE,PTTYPE,PARTUUID,UUID,FSTYPE {self.device_path}").decode('UTF-8') - except SysCallError as error: - # It appears as if lsblk can return exit codes like 8192 to indicate something. - # But it does return output so we'll try to catch it. - output = error.worker.decode('UTF-8') - - if output: try: - lsblk_info = json.loads(output) - return lsblk_info - except json.decoder.JSONDecodeError: - log(f"Could not decode JSON: {output}", fg="red", level=logging.ERROR) - - raise DiskError(f'Failed to read disk "{self.device_path}" with lsblk') + output = SysCommand(f"lsblk --json -b -o+LOG-SEC,SIZE,PTTYPE,PARTUUID,UUID,FSTYPE {self.device_path}").decode('UTF-8') + except SysCallError as error: + # Get the output minus the message/info from lsblk if it returns a non-zero exit code. + output = error.worker.decode('UTF-8') + if '{' in output: + output = output[output.find('{'):] + + if output: + try: + lsblk_info = json.loads(output) + return lsblk_info + except json.decoder.JSONDecodeError: + log(f"Could not decode JSON: {output}", fg="red", level=logging.ERROR) + + raise DiskError(f'Failed to get partition information "{self.device_path}" with lsblk') def _call_sfdisk(self) -> Dict[str, Any]: output = SysCommand(f"sfdisk --json {self.block_device.path}").decode('UTF-8') @@ -212,9 +219,12 @@ class Partition: lsblk_info = self._call_lsblk() sfdisk_info = self._call_sfdisk() - if not (device := lsblk_info.get('blockdevices', [None])[0]): + if not (device := lsblk_info.get('blockdevices', [])): raise DiskError(f'Failed to retrieve information for "{self.device_path}" with lsblk') + # Grab the first (and only) block device in the list as we're targeting a specific partition + device = device[0] + mountpoints = [Path(mountpoint) for mountpoint in device['mountpoints'] if mountpoint] bootable = sfdisk_info.get('bootable', False) or sfdisk_info.get('type', '') == 'C12A7328-F81F-11D2-BA4B-00A0C93EC93B' @@ -243,7 +253,8 @@ class Partition: @property def filesystem(self) -> str: - return self._partition_info.filesystem_type + if self._partition_info: + return self._partition_info.filesystem_type @property def mountpoint(self) -> Optional[Path]: @@ -253,43 +264,51 @@ class Partition: @property def mountpoints(self) -> List[Path]: - return self._partition_info.mountpoints + if self._partition_info: + return self._partition_info.mountpoints @property def sector_size(self) -> int: - return self._partition_info.sector_size + if self._partition_info: + return self._partition_info.sector_size @property def start(self) -> Optional[int]: - return self._partition_info.start + if self._partition_info: + return self._partition_info.start @property def end(self) -> Optional[int]: - return self._partition_info.end + if self._partition_info: + return self._partition_info.end @property def end_sectors(self) -> Optional[int]: - start = self._partition_info.start - end = self._partition_info.end - if start and end: - return start + end - return None + if self._partition_info: + start = self._partition_info.start + end = self._partition_info.end + if start and end: + return start + end @property def size(self) -> Optional[float]: - return self._partition_info.size + if self._partition_info: + return self._partition_info.size @property def boot(self) -> bool: - return self._partition_info.bootable + if self._partition_info: + return self._partition_info.bootable @property def partition_type(self) -> Optional[str]: - return self._partition_info.pttype + if self._partition_info: + return self._partition_info.pttype @property def part_uuid(self) -> str: - return self._partition_info.partuuid + if self._partition_info: + return self._partition_info.partuuid @property def uuid(self) -> Optional[str]: @@ -355,7 +374,8 @@ class Partition: log(f"Could not get PARTUUID of partition using 'blkid -s PARTUUID -o value {self.device_path}': {error}") - return self._partition_info.uuid + if self._partition_info: + return self._partition_info.uuid @property def encrypted(self) -> Union[bool, None]: @@ -611,14 +631,7 @@ class Partition: return False def unmount(self) -> bool: - worker = SysCommand(f"/usr/bin/umount {self._path}") - exit_code = worker.exit_code - - # Without to much research, it seams that low error codes are errors. - # And above 8k is indicators such as "/dev/x not mounted.". - # So anything in between 0 and 8k are errors (?). - if exit_code and 0 < exit_code < 8000: - raise SysCallError(f"Could not unmount {self._path} properly: {worker}", exit_code=exit_code) + SysCommand(f"/usr/bin/umount {self._path}") # Update the partition info since the mount info has changed after this call. self._partition_info = self._fetch_information() diff --git a/archinstall/lib/disk/validators.py b/archinstall/lib/disk/validators.py index 54808886..076a8ba2 100644 --- a/archinstall/lib/disk/validators.py +++ b/archinstall/lib/disk/validators.py @@ -7,10 +7,12 @@ def valid_parted_position(pos :str) -> bool: if pos.isdigit(): return True - if pos.lower().endswith('b') and pos[:-1].isdigit(): + pos_lower = pos.lower() + + if (pos_lower.endswith('b') or pos_lower.endswith('s')) and pos[:-1].isdigit(): return True - if any(pos.lower().endswith(size) and pos[:-len(size)].replace(".", "", 1).isdigit() + if any(pos_lower.endswith(size) and pos[:-len(size)].replace(".", "", 1).isdigit() for size in ['%', 'kb', 'mb', 'gb', 'tb', 'kib', 'mib', 'gib', 'tib']): return True diff --git a/archinstall/lib/general.py b/archinstall/lib/general.py index 8c7aed91..79ab024b 100644 --- a/archinstall/lib/general.py +++ b/archinstall/lib/general.py @@ -130,7 +130,10 @@ class JsonEncoder: copy[JsonEncoder._encode(key)] = val return copy elif hasattr(obj, 'json'): - return obj.json() + # json() is a friendly name for json-helper, it should return + # a dictionary representation of the object so that it can be + # processed by the json library. + return json.loads(json.dumps(obj.json(), cls=JSON)) elif hasattr(obj, '__dump__'): return obj.__dump__() elif isinstance(obj, (datetime, date)): @@ -185,12 +188,16 @@ class SysCommandWorker: def __init__(self, cmd :Union[str, List[str]], callbacks :Optional[Dict[str, Any]] = None, + peek_output :Optional[bool] = False, peak_output :Optional[bool] = False, environment_vars :Optional[Dict[str, Any]] = None, logfile :Optional[None] = None, working_directory :Optional[str] = './', remove_vt100_escape_codes_from_lines :bool = True): + if peak_output: + log("SysCommandWorker()'s peak_output is deprecated, use peek_output instead.", level=logging.WARNING, fg='red') + if not callbacks: callbacks = {} if not environment_vars: @@ -208,7 +215,9 @@ class SysCommandWorker: self.cmd = cmd self.callbacks = callbacks - self.peak_output = peak_output + self.peek_output = peek_output + if not self.peek_output and peak_output: + self.peek_output = peak_output # define the standard locale for command outputs. For now the C ascii one. Can be overridden self.environment_vars = {**storage.get('CMD_LOCALE',{}),**environment_vars} self.logfile = logfile @@ -262,7 +271,7 @@ class SysCommandWorker: except: pass - if self.peak_output: + if self.peek_output: # To make sure any peaked output didn't leave us hanging # on the same line we were on. sys.stdout.write("\n") @@ -307,7 +316,7 @@ class SysCommandWorker: self._trace_log_pos = min(max(0, pos), len(self._trace_log)) def peak(self, output: Union[str, bytes]) -> bool: - if self.peak_output: + if self.peek_output: if type(output) == bytes: try: output = output.decode('UTF-8') @@ -320,8 +329,8 @@ class SysCommandWorker: if peak_logfile.exists() is False: change_perm = True - with peak_logfile.open("a") as peak_output_log: - peak_output_log.write(output) + with peak_logfile.open("a") as peek_output_log: + peek_output_log.write(output) if change_perm: os.chmod(str(peak_logfile), stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP) @@ -349,10 +358,12 @@ class SysCommandWorker: if self.ended or (got_output is False and pid_exists(self.pid) is False): self.ended = time.time() try: - self.exit_code = os.waitpid(self.pid, 0)[1] + wait_status = os.waitpid(self.pid, 0)[1] + self.exit_code = os.waitstatus_to_exitcode(wait_status) except ChildProcessError: try: - self.exit_code = os.waitpid(self.child_fd, 0)[1] + wait_status = os.waitpid(self.child_fd, 0)[1] + self.exit_code = os.waitstatus_to_exitcode(wait_status) except ChildProcessError: self.exit_code = 1 @@ -385,6 +396,13 @@ class SysCommandWorker: os.chmod(str(history_logfile), stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP) except PermissionError: pass + # If history_logfile does not exist, ignore the error + except FileNotFoundError: + pass + except Exception as e: + exception_type = type(e).__name__ + log(f"Unexpected {exception_type} occurred in {self.cmd}: {e}", level=logging.ERROR) + raise e os.execve(self.cmd[0], list(self.cmd), {**os.environ, **self.environment_vars}) if storage['arguments'].get('debug'): @@ -412,11 +430,15 @@ class SysCommand: cmd :Union[str, List[str]], callbacks :Optional[Dict[str, Callable[[Any], Any]]] = None, start_callback :Optional[Callable[[Any], Any]] = None, + peek_output :Optional[bool] = False, peak_output :Optional[bool] = False, environment_vars :Optional[Dict[str, Any]] = None, working_directory :Optional[str] = './', remove_vt100_escape_codes_from_lines :bool = True): + if peak_output: + log("SysCommandWorker()'s peak_output is deprecated, use peek_output instead.", level=logging.WARNING, fg='red') + _callbacks = {} if callbacks: for hook, func in callbacks.items(): @@ -426,7 +448,9 @@ class SysCommand: self.cmd = cmd self._callbacks = _callbacks - self.peak_output = peak_output + self.peek_output = peek_output + if not self.peek_output and peak_output: + self.peek_output = peak_output self.environment_vars = environment_vars self.working_directory = working_directory self.remove_vt100_escape_codes_from_lines = remove_vt100_escape_codes_from_lines @@ -469,7 +493,7 @@ class SysCommand: return { 'cmd': self.cmd, 'callbacks': self._callbacks, - 'peak': self.peak_output, + 'peak': self.peek_output, 'environment_vars': self.environment_vars, 'session': True if self.session else False } @@ -478,7 +502,7 @@ class SysCommand: """ Initiates a :ref:`SysCommandWorker` session in this class ``.session``. It then proceeds to poll the process until it ends, after which it also - clears any printed output if ``.peak_output=True``. + clears any printed output if ``.peek_output=True``. """ if self.session: return self.session @@ -486,7 +510,7 @@ class SysCommand: with SysCommandWorker( self.cmd, callbacks=self._callbacks, - peak_output=self.peak_output, + peek_output=self.peek_output, environment_vars=self.environment_vars, remove_vt100_escape_codes_from_lines=self.remove_vt100_escape_codes_from_lines, working_directory=self.working_directory) as session: @@ -497,7 +521,7 @@ class SysCommand: while self.session.ended is None: self.session.poll() - if self.peak_output: + if self.peek_output: sys.stdout.write('\n') sys.stdout.flush() diff --git a/archinstall/lib/hsm/fido.py b/archinstall/lib/hsm/fido.py index 4cd956a3..1c226322 100644 --- a/archinstall/lib/hsm/fido.py +++ b/archinstall/lib/hsm/fido.py @@ -1,9 +1,11 @@ +from __future__ import annotations + import getpass import logging from dataclasses import dataclass from pathlib import Path -from typing import List +from typing import List, Dict from ..general import SysCommand, SysCommandWorker, clear_vt100_escape_codes from ..disk.partition import Partition @@ -16,6 +18,21 @@ class Fido2Device: manufacturer: str product: str + def json(self) -> Dict[str, str]: + return { + 'path': str(self.path), + 'manufacturer': self.manufacturer, + 'product': self.product + } + + @classmethod + def parse_arg(cls, arg: Dict[str, str]) -> 'Fido2Device': + return Fido2Device( + Path(arg['path']), + arg['manufacturer'], + arg['product'] + ) + class Fido2: _loaded: bool = False @@ -76,7 +93,7 @@ class Fido2: @classmethod def fido2_enroll(cls, hsm_device: Fido2Device, partition :Partition, password :str): - worker = SysCommandWorker(f"systemd-cryptenroll --fido2-device={hsm_device.path} {partition.real_device}", peak_output=True) + worker = SysCommandWorker(f"systemd-cryptenroll --fido2-device={hsm_device.path} {partition.real_device}", peek_output=True) pw_inputted = False pin_inputted = False diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 1926f593..f1c7b3db 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -132,6 +132,7 @@ class Installer: # if HSM is not used to encrypt the root volume. Check mkinitcpio() function for that override. self.HOOKS = ["base", "systemd", "autodetect", "keyboard", "sd-vconsole", "modconf", "block", "filesystems", "fsck"] self.KERNEL_PARAMS = [] + self.FSTAB_ENTRIES = [] self._zram_enabled = False @@ -198,7 +199,7 @@ class Installer: def _create_keyfile(self,luks_handle , partition :dict, password :str): """ roiutine to create keyfiles, so it can be moved elsewhere """ - if self._disk_encryption.generate_encryption_file(partition): + if self._disk_encryption and self._disk_encryption.generate_encryption_file(partition): if not (cryptkey_dir := pathlib.Path(f"{self.target}/etc/cryptsetup-keys.d")).exists(): cryptkey_dir.mkdir(parents=True) # Once we store the key as ../xyzloop.key systemd-cryptsetup can automatically load this key @@ -246,20 +247,21 @@ class Installer: mount_queue = {} # we manage the encrypted partititons - for partition in self._disk_encryption.partitions: - # open the luks device and all associate stuff - loopdev = f"{storage.get('ENC_IDENTIFIER', 'ai')}{pathlib.Path(partition['device_instance'].path).name}" - - # note that we DON'T auto_unmount (i.e. close the encrypted device so it can be used - with (luks_handle := luks2(partition['device_instance'], loopdev, self._disk_encryption.encryption_password, auto_unmount=False)) as unlocked_device: - if self._disk_encryption.generate_encryption_file(partition) and not self._has_root(partition): - list_luks_handles.append([luks_handle, partition, self._disk_encryption.encryption_password]) - # this way all the requesrs will be to the dm_crypt device and not to the physical partition - partition['device_instance'] = unlocked_device - - if self._has_root(partition) and self._disk_encryption.generate_encryption_file(partition) is False: - if self._disk_encryption.hsm_device: - Fido2.fido2_enroll(self._disk_encryption.hsm_device, partition['device_instance'], self._disk_encryption.encryption_password) + if self._disk_encryption: + for partition in self._disk_encryption.all_partitions: + # open the luks device and all associate stuff + loopdev = f"{storage.get('ENC_IDENTIFIER', 'ai')}{pathlib.Path(partition['device_instance'].path).name}" + + # note that we DON'T auto_unmount (i.e. close the encrypted device so it can be used + with (luks_handle := luks2(partition['device_instance'], loopdev, self._disk_encryption.encryption_password, auto_unmount=False)) as unlocked_device: + if self._disk_encryption.generate_encryption_file(partition) and not self._has_root(partition): + list_luks_handles.append([luks_handle, partition, self._disk_encryption.encryption_password]) + # this way all the requesrs will be to the dm_crypt device and not to the physical partition + partition['device_instance'] = unlocked_device + + if self._has_root(partition) and self._disk_encryption.generate_encryption_file(partition) is False: + if self._disk_encryption.hsm_device: + Fido2.fido2_enroll(self._disk_encryption.hsm_device, partition['device_instance'], self._disk_encryption.encryption_password) btrfs_subvolumes = [entry for entry in list_part if entry.get('btrfs', {}).get('subvolumes', [])] @@ -292,7 +294,7 @@ class Installer: else: mount_queue[mountpoint] = lambda instance=partition['device_instance'], target=f"{self.target}{mountpoint}": instance.mount(target) - log(f"Using mount order: {list(sorted(mount_queue.items(), key=lambda item: item[0]))}", level=logging.INFO, fg="white") + log(f"Using mount order: {list(sorted(mount_queue.items(), key=lambda item: item[0]))}", level=logging.DEBUG, fg="white") # We mount everything by sorting on the mountpoint itself. for mountpoint, frozen_func in sorted(mount_queue.items(), key=lambda item: item[0]): @@ -317,6 +319,26 @@ class Installer: partition.mount(f'{self.target}{mountpoint}', options=options) + def add_swapfile(self, size='4G', enable_resume=True, file='/swapfile'): + if file[:1] != '/': + file = f"/{file}" + if len(file.strip()) <= 0 or file == '/': + raise ValueError(f"The filename for the swap file has to be a valid path, not: {self.target}{file}") + + SysCommand(f'dd if=/dev/zero of={self.target}{file} bs={size} count=1') + SysCommand(f'chmod 0600 {self.target}{file}') + SysCommand(f'mkswap {self.target}{file}') + + self.FSTAB_ENTRIES.append(f'{file} none swap defaults 0 0') + + if enable_resume: + resume_uuid = SysCommand(f'findmnt -no UUID -T {self.target}{file}').decode('UTF-8').strip() + resume_offset = SysCommand(f'/usr/bin/filefrag -v {self.target}{file}').decode('UTF-8').split('0:', 1)[1].split(":", 1)[1].split("..", 1)[0].strip() + + self.HOOKS.append('resume') + self.KERNEL_PARAMS.append(f'resume=UUID={resume_uuid}') + self.KERNEL_PARAMS.append(f'resume_offset={resume_offset}') + def post_install_check(self, *args :str, **kwargs :str) -> List[str]: return [step for step, flag in self.helper_flags.items() if flag is False] @@ -396,7 +418,8 @@ class Installer: raise RequirementError(f'Could not sync mirrors: {error}', level=logging.ERROR, fg="red") try: - return SysCommand(f'/usr/bin/pacstrap -C /etc/pacman.conf {self.target} {" ".join(packages)} --noconfirm', peak_output=True).exit_code == 0 + SysCommand(f'/usr/bin/pacstrap -C /etc/pacman.conf -K {self.target} {" ".join(packages)} --noconfirm', peek_output=True) + return True except SysCallError as error: self.log(f'Could not strap in packages: {error}', level=logging.ERROR, fg="red") @@ -417,8 +440,10 @@ class Installer: def genfstab(self, flags :str = '-pU') -> bool: self.log(f"Updating {self.target}/etc/fstab", level=logging.INFO) - if not (fstab := SysCommand(f'/usr/bin/genfstab {flags} {self.target}')).exit_code == 0: - raise RequirementError(f'Could not generate fstab, strapping in packages most likely failed (disk out of space?)\n Error: {fstab}') + try: + fstab = SysCommand(f'/usr/bin/genfstab {flags} {self.target}') + except SysCallError as error: + raise RequirementError(f'Could not generate fstab, strapping in packages most likely failed (disk out of space?)\n Error: {error}') with open(f"{self.target}/etc/fstab", 'a') as fstab_fh: fstab_fh.write(fstab.decode()) @@ -431,6 +456,10 @@ class Installer: if plugin.on_genfstab(self) is True: break + with open(f"{self.target}/etc/fstab", 'a') as fstab_fh: + for entry in self.FSTAB_ENTRIES: + fstab_fh.write(f'{entry}\n') + return True def set_hostname(self, hostname: str, *args :str, **kwargs :str) -> None: @@ -463,7 +492,11 @@ class Installer: with open(f'{self.target}/etc/locale.conf', 'w') as fh: fh.write(f'LANG={locale}.{encoding}{modifier}\n') - return True if SysCommand(f'/usr/bin/arch-chroot {self.target} locale-gen').exit_code == 0 else False + try: + SysCommand(f'/usr/bin/arch-chroot {self.target} locale-gen') + return True + except SysCallError: + return False def set_timezone(self, zone :str, *args :str, **kwargs :str) -> bool: if not zone: @@ -519,8 +552,10 @@ class Installer: def enable_service(self, *services :str) -> None: for service in services: self.log(f'Enabling service {service}', level=logging.INFO) - if (output := self.arch_chroot(f'systemctl enable {service}')).exit_code != 0: - raise ServiceException(f"Unable to start service {service}: {output}") + try: + self.arch_chroot(f'systemctl enable {service}') + except SysCallError as error: + raise ServiceException(f"Unable to start service {service}: {error}") for plugin in plugins.values(): if hasattr(plugin, 'on_service'): @@ -641,12 +676,17 @@ class Installer: if plugin.on_mkinitcpio(self): return True + # mkinitcpio will error out if there's no vconsole. + if (vconsole := pathlib.Path(f"{self.target}/etc/vconsole.conf")).exists() is False: + with vconsole.open('w') as fh: + fh.write(f"KEYMAP={storage['arguments']['keyboard-layout']}\n") + with open(f'{self.target}/etc/mkinitcpio.conf', 'w') as mkinit: mkinit.write(f"MODULES=({' '.join(self.MODULES)})\n") mkinit.write(f"BINARIES=({' '.join(self.BINARIES)})\n") mkinit.write(f"FILES=({' '.join(self.FILES)})\n") - if not self._disk_encryption.hsm_device: + if self._disk_encryption and not self._disk_encryption.hsm_device: # For now, if we don't use HSM we revert to the old # way of setting up encryption hooks for mkinitcpio. # This is purely for stability reasons, we're going away from this. @@ -656,7 +696,11 @@ class Installer: mkinit.write(f"HOOKS=({' '.join(self.HOOKS)})\n") - return SysCommand(f'/usr/bin/arch-chroot {self.target} mkinitcpio {" ".join(flags)}').exit_code == 0 + try: + SysCommand(f'/usr/bin/arch-chroot {self.target} mkinitcpio {" ".join(flags)}') + return True + except SysCallError: + return False def minimal_installation( self, testing: bool = False, multilib: bool = False, @@ -690,7 +734,7 @@ class Installer: self.HOOKS.remove('fsck') if self.detect_encryption(partition): - if self._disk_encryption.hsm_device: + if self._disk_encryption and self._disk_encryption.hsm_device: # Required bby mkinitcpio to add support for fido2-device options self.pacstrap('libfido2') @@ -754,14 +798,6 @@ class Installer: # TODO: Use python functions for this SysCommand(f'/usr/bin/arch-chroot {self.target} chmod 700 /root') - if self._disk_encryption.hsm_device: - # TODO: - # A bit of a hack, but we need to get vconsole.conf in there - # before running `mkinitcpio` because it expects it in HSM mode. - if (vconsole := pathlib.Path(f"{self.target}/etc/vconsole.conf")).exists() is False: - with vconsole.open('w') as fh: - fh.write(f"KEYMAP={storage['arguments']['keyboard-layout']}\n") - self.mkinitcpio('-P') self.helper_flags['base'] = True @@ -841,60 +877,68 @@ class Installer: os.makedirs(f'{self.target}/boot/loader/entries') for kernel in self.kernels: - # Setup the loader entry - with open(f'{self.target}/boot/loader/entries/{self.init_time}_{kernel}.conf', 'w') as entry: - entry.write('# Created by: archinstall\n') - entry.write(f'# Created on: {self.init_time}\n') - entry.write(f'title Arch Linux ({kernel})\n') - entry.write(f"linux /vmlinuz-{kernel}\n") - if not is_vm(): - vendor = cpu_vendor() - if vendor == "AuthenticAMD": - entry.write("initrd /amd-ucode.img\n") - elif vendor == "GenuineIntel": - entry.write("initrd /intel-ucode.img\n") + for variant in ("", "-fallback"): + # Setup the loader entry + with open(f'{self.target}/boot/loader/entries/{self.init_time}_{kernel}{variant}.conf', 'w') as entry: + entry.write('# Created by: archinstall\n') + entry.write(f'# Created on: {self.init_time}\n') + entry.write(f'title Arch Linux ({kernel}{variant})\n') + entry.write(f"linux /vmlinuz-{kernel}\n") + if not is_vm(): + vendor = cpu_vendor() + if vendor == "AuthenticAMD": + entry.write("initrd /amd-ucode.img\n") + elif vendor == "GenuineIntel": + entry.write("initrd /intel-ucode.img\n") + else: + self.log(f"Unknown CPU vendor '{vendor}' detected. Archinstall won't add any ucode to systemd-boot config.", level=logging.DEBUG) + entry.write(f"initrd /initramfs-{kernel}{variant}.img\n") + # blkid doesn't trigger on loopback devices really well, + # so we'll use the old manual method until we get that sorted out. + root_fs_type = get_mount_fs_type(root_partition.filesystem) + + if root_fs_type is not None: + options_entry = f'rw rootfstype={root_fs_type} {" ".join(self.KERNEL_PARAMS)}\n' else: - self.log(f"Unknown CPU vendor '{vendor}' detected. Archinstall won't add any ucode to systemd-boot config.", level=logging.DEBUG) - entry.write(f"initrd /initramfs-{kernel}.img\n") - # blkid doesn't trigger on loopback devices really well, - # so we'll use the old manual method until we get that sorted out. - root_fs_type = get_mount_fs_type(root_partition.filesystem) - - if root_fs_type is not None: - options_entry = f'rw rootfstype={root_fs_type} {" ".join(self.KERNEL_PARAMS)}\n' - else: - options_entry = f'rw {" ".join(self.KERNEL_PARAMS)}\n' + options_entry = f'rw {" ".join(self.KERNEL_PARAMS)}\n' - for subvolume in root_partition.subvolumes: - if subvolume.root is True and subvolume.name != '<FS_TREE>': - options_entry = f"rootflags=subvol={subvolume.name} " + options_entry + for subvolume in root_partition.subvolumes: + if subvolume.root is True and subvolume.name != '<FS_TREE>': + options_entry = f"rootflags=subvol={subvolume.name} " + options_entry - # Zswap should be disabled when using zram. - # - # https://github.com/archlinux/archinstall/issues/881 - if self._zram_enabled: - options_entry = "zswap.enabled=0 " + options_entry + # Zswap should be disabled when using zram. + # + # https://github.com/archlinux/archinstall/issues/881 + if self._zram_enabled: + options_entry = "zswap.enabled=0 " + options_entry - if real_device := self.detect_encryption(root_partition): - # TODO: We need to detect if the encrypted device is a whole disk encryption, - # or simply a partition encryption. Right now we assume it's a partition (and we always have) - log(f"Identifying root partition by PART-UUID on {real_device}: '{real_device.uuid}/{real_device.part_uuid}'.", level=logging.DEBUG) + if real_device := self.detect_encryption(root_partition): + # TODO: We need to detect if the encrypted device is a whole disk encryption, + # or simply a partition encryption. Right now we assume it's a partition (and we always have) + log(f"Identifying root partition by PART-UUID on {real_device}: '{real_device.uuid}/{real_device.part_uuid}'.", level=logging.DEBUG) - kernel_options = f"options" + kernel_options = f"options" - if self._disk_encryption.hsm_device: + if self._disk_encryption.hsm_device: + # Note: lsblk UUID must be used, not PARTUUID for sd-encrypt to work + kernel_options += f" rd.luks.name={real_device.uuid}=luksdev" + # Note: tpm2-device and fido2-device don't play along very well: + # https://github.com/archlinux/archinstall/pull/1196#issuecomment-1129715645 + kernel_options += f" rd.luks.options=fido2-device=auto,password-echo=no" + else: + kernel_options += f" cryptdevice=PARTUUID={real_device.part_uuid}:luksdev" + + entry.write(f'{kernel_options} root=/dev/mapper/luksdev {options_entry}') + + if self._disk_encryption and self._disk_encryption.hsm_device: # Note: lsblk UUID must be used, not PARTUUID for sd-encrypt to work kernel_options += f" rd.luks.name={real_device.uuid}=luksdev" # Note: tpm2-device and fido2-device don't play along very well: # https://github.com/archlinux/archinstall/pull/1196#issuecomment-1129715645 kernel_options += f" rd.luks.options=fido2-device=auto,password-echo=no" else: - kernel_options += f" cryptdevice=PARTUUID={real_device.part_uuid}:luksdev" - - entry.write(f'{kernel_options} root=/dev/mapper/luksdev {options_entry}') - else: - log(f"Identifying root partition by PARTUUID on {root_partition}, looking for '{root_partition.part_uuid}'.", level=logging.DEBUG) - entry.write(f'options root=PARTUUID={root_partition.part_uuid} {options_entry}') + log(f"Identifying root partition by PARTUUID on {root_partition}, looking for '{root_partition.part_uuid}'.", level=logging.DEBUG) + entry.write(f'options root=PARTUUID={root_partition.part_uuid} {options_entry}') self.helper_flags['bootloader'] = "systemd" @@ -923,15 +967,15 @@ class Installer: if has_uefi(): self.pacstrap('efibootmgr') # TODO: Do we need? Yes, but remove from minimal_installation() instead? try: - SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --debug --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --removable', peak_output=True) + SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --debug --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --removable', peek_output=True) except SysCallError: try: - SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --debug --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --removable', peak_output=True) + SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --debug --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --removable', peek_output=True) except SysCallError as error: raise DiskError(f"Could not install GRUB to {self.target}/boot: {error}") else: try: - SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --debug --target=i386-pc --recheck {boot_partition.parent}', peak_output=True) + SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --debug --target=i386-pc --recheck {boot_partition.parent}', peek_output=True) except SysCallError as error: raise DiskError(f"Could not install GRUB to {boot_partition.path}: {error}") @@ -1109,8 +1153,10 @@ class Installer: if not handled_by_plugin: self.log(f'Creating user {user}', level=logging.INFO) - if not (output := SysCommand(f'/usr/bin/arch-chroot {self.target} useradd -m -G wheel {user}')).exit_code == 0: - raise SystemError(f"Could not create user inside installation: {output}") + try: + SysCommand(f'/usr/bin/arch-chroot {self.target} useradd -m -G wheel {user}') + except SysCallError as error: + raise SystemError(f"Could not create user inside installation: {error}") for plugin in plugins.values(): if hasattr(plugin, 'on_user_created'): @@ -1138,17 +1184,28 @@ class Installer: echo = shlex.join(['echo', combo]) sh = shlex.join(['sh', '-c', echo]) - result = SysCommand(f"/usr/bin/arch-chroot {self.target} " + sh[:-1] + " | chpasswd'") - return result.exit_code == 0 + try: + SysCommand(f"/usr/bin/arch-chroot {self.target} " + sh[:-1] + " | chpasswd'") + return True + except SysCallError: + return False def user_set_shell(self, user :str, shell :str) -> bool: self.log(f'Setting shell for {user} to {shell}', level=logging.INFO) - return SysCommand(f"/usr/bin/arch-chroot {self.target} sh -c \"chsh -s {shell} {user}\"").exit_code == 0 + try: + SysCommand(f"/usr/bin/arch-chroot {self.target} sh -c \"chsh -s {shell} {user}\"") + return True + except SysCallError: + return False def chown(self, owner :str, path :str, options :List[str] = []) -> bool: cleaned_path = path.replace('\'', '\\\'') - return SysCommand(f"/usr/bin/arch-chroot {self.target} sh -c 'chown {' '.join(options)} {owner} {cleaned_path}'").exit_code == 0 + try: + SysCommand(f"/usr/bin/arch-chroot {self.target} sh -c 'chown {' '.join(options)} {owner} {cleaned_path}'") + return True + except SysCallError: + return False def create_file(self, filename :str, owner :Optional[str] = None) -> InstallationFile: return InstallationFile(self, filename, owner) @@ -1166,8 +1223,10 @@ class Installer: with Boot(self) as session: os.system('/usr/bin/systemd-run --machine=archinstall --pty localectl set-keymap ""') - if (output := session.SysCommand(["localectl", "set-keymap", language])).exit_code != 0: - raise ServiceException(f"Unable to set locale '{language}' for console: {output}") + try: + session.SysCommand(["localectl", "set-keymap", language]) + except SysCallError as error: + raise ServiceException(f"Unable to set locale '{language}' for console: {error}") self.log(f"Keyboard language for this installation is now set to: {language}") else: @@ -1190,8 +1249,10 @@ class Installer: with Boot(self) as session: session.SysCommand(["localectl", "set-x11-keymap", '""']) - if (output := session.SysCommand(["localectl", "set-x11-keymap", language])).exit_code != 0: - raise ServiceException(f"Unable to set locale '{language}' for X11: {output}") + try: + session.SysCommand(["localectl", "set-x11-keymap", language]) + except SysCallError as error: + raise ServiceException(f"Unable to set locale '{language}' for X11: {error}") else: self.log(f'X11-Keyboard language was not changed from default (no language specified).', fg="yellow", level=logging.INFO) diff --git a/archinstall/lib/luks.py b/archinstall/lib/luks.py index 7e4534d8..ad6bf093 100644 --- a/archinstall/lib/luks.py +++ b/archinstall/lib/luks.py @@ -115,7 +115,7 @@ class luks2: if cmd_handle.exit_code != 0: raise DiskError(f'Could not encrypt volume "{partition.path}": {b"".join(cmd_handle)}') except SysCallError as err: - if err.exit_code == 256: + if err.exit_code == 1: log(f'{partition} is being used, trying to unmount and crypt-close the device and running one more attempt at encrypting the device.', level=logging.DEBUG) # Partition was in use, unmount it and try again partition.unmount() diff --git a/archinstall/lib/menu/abstract_menu.py b/archinstall/lib/menu/abstract_menu.py index 5a7ca03a..d659d709 100644 --- a/archinstall/lib/menu/abstract_menu.py +++ b/archinstall/lib/menu/abstract_menu.py @@ -17,14 +17,14 @@ class Selector: def __init__( self, description :str, - func :Callable = None, - display_func :Callable = None, + func :Optional[Callable] = None, + display_func :Optional[Callable] = None, default :Any = None, enabled :bool = False, dependencies :List = [], dependencies_not :List = [], - exec_func :Callable = None, - preview_func :Callable = None, + exec_func :Optional[Callable] = None, + preview_func :Optional[Callable] = None, mandatory :bool = False, no_store :bool = False ): @@ -165,7 +165,7 @@ class Selector: class AbstractMenu: - def __init__(self, data_store: Dict[str, Any] = None, auto_cursor=False, preview_size :float = 0.2): + def __init__(self, data_store: Optional[Dict[str, Any]] = None, auto_cursor=False, preview_size :float = 0.2): """ Create a new selection menu. @@ -226,7 +226,7 @@ class AbstractMenu: """ will be called before each action in the menu """ return - def post_callback(self, selection_name: str = None, value: Any = None): + def post_callback(self, selection_name: Optional[str] = None, value: Any = None): """ will be called after each action in the menu """ return True @@ -356,7 +356,7 @@ class AbstractMenu: config_name, selector = self._find_selection(selection_name) return self.exec_option(config_name, selector) - def exec_option(self, config_name :str, p_selector :Selector = None) -> bool: + def exec_option(self, config_name :str, p_selector :Optional[Selector] = None) -> bool: """ processes the execution of a given menu entry - pre process callback - selection function @@ -372,13 +372,13 @@ class AbstractMenu: self.pre_callback(config_name) result = None - if selector.func: + if selector.func is not None: presel_val = self.option(config_name).get_selection() result = selector.func(presel_val) self._menu_options[config_name].set_current_selection(result) if selector.do_store(): self._data_store[config_name] = result - exec_ret_val = selector.exec_func(config_name,result) if selector.exec_func else False + exec_ret_val = selector.exec_func(config_name,result) if selector.exec_func is not None else False self.post_callback(config_name,result) if exec_ret_val and self._check_mandatory_status(): @@ -478,7 +478,7 @@ class AbstractMenu: class AbstractSubMenu(AbstractMenu): - def __init__(self, data_store: Dict[str, Any] = None): + def __init__(self, data_store: Optional[Dict[str, Any]] = None): super().__init__(data_store=data_store) self._menu_options['__separator__'] = Selector('') diff --git a/archinstall/lib/menu/global_menu.py b/archinstall/lib/menu/global_menu.py index 0d348227..7c5b153e 100644 --- a/archinstall/lib/menu/global_menu.py +++ b/archinstall/lib/menu/global_menu.py @@ -197,11 +197,11 @@ class GlobalMenu(AbstractMenu): self._menu_options['abort'] = Selector(_('Abort'), exec_func=lambda n,v:exit(1)) - def _update_install_text(self, name :str = None, result :Any = None): + def _update_install_text(self, name :Optional[str] = None, result :Any = None): text = self._install_text() self._menu_options['install'].update_description(text) - def post_callback(self,name :str = None ,result :Any = None): + def post_callback(self,name :Optional[str] = None ,result :Any = None): self._update_install_text(name, result) def _install_text(self): @@ -279,8 +279,8 @@ class GlobalMenu(AbstractMenu): output = str(_('Encryption type')) + f': {enc_type}\n' output += str(_('Password')) + f': {secret(encryption.encryption_password)}\n' - if encryption.partitions: - output += 'Partitions: {} selected'.format(len(encryption.partitions)) + '\n' + if encryption.all_partitions: + output += 'Partitions: {} selected'.format(len(encryption.all_partitions)) + '\n' if encryption.hsm_device: output += f'HSM: {encryption.hsm_device.manufacturer}' @@ -377,9 +377,9 @@ class GlobalMenu(AbstractMenu): return harddrives - def _select_profile(self, preset): + def _select_profile(self, preset) -> Optional[Profile]: + ret: Optional[Profile] = None profile = select_profile(preset) - ret = None if profile is None: if any([ @@ -403,7 +403,7 @@ class GlobalMenu(AbstractMenu): namespace = f'{profile.namespace}.py' with profile.load_instructions(namespace=namespace) as imported: if imported._prep_function(servers=servers, desktop=desktop, desktop_env=desktop_env, gfx_driver=gfx_driver): - ret: Profile = profile + ret = profile match ret.name: case 'minimal': diff --git a/archinstall/lib/models/disk_encryption.py b/archinstall/lib/models/disk_encryption.py index 3edab93e..a4a501d9 100644 --- a/archinstall/lib/models/disk_encryption.py +++ b/archinstall/lib/models/disk_encryption.py @@ -1,5 +1,7 @@ +from __future__ import annotations + from dataclasses import dataclass, field -from enum import Enum, auto +from enum import Enum from typing import Optional, List, Dict, TYPE_CHECKING, Any from ..hsm.fido import Fido2Device @@ -9,8 +11,7 @@ if TYPE_CHECKING: class EncryptionType(Enum): - Partition = auto() - # FullDiskEncryption = auto() + Partition = 'partition' @classmethod def _encryption_type_mapper(cls) -> Dict[str, 'EncryptionType']: @@ -35,9 +36,55 @@ class EncryptionType(Enum): class DiskEncryption: encryption_type: EncryptionType = EncryptionType.Partition encryption_password: str = '' - partitions: List[str] = field(default_factory=list) + partitions: Dict[str, List[Dict[str, Any]]] = field(default_factory=dict) hsm_device: Optional[Fido2Device] = None + @property + def all_partitions(self) -> List[Dict[str, Any]]: + _all: List[Dict[str, Any]] = [] + for parts in self.partitions.values(): + _all += parts + return _all + def generate_encryption_file(self, partition) -> bool: - return partition in self.partitions and partition['mountpoint'] != '/' - + return partition in self.all_partitions and partition['mountpoint'] != '/' + + def json(self) -> Dict[str, Any]: + obj = { + 'encryption_type': self.encryption_type.value, + 'partitions': self.partitions + } + + if self.hsm_device: + obj['hsm_device'] = self.hsm_device.json() + + return obj + + @classmethod + def parse_arg( + cls, + disk_layout: Dict[str, Any], + arg: Dict[str, Any], + password: str = '' + ) -> 'DiskEncryption': + # we have to map the enc partition config to the disk layout objects + # they both need to point to the same object as it will get modified + # during the installation process + enc_partitions: Dict[str, List[Dict[str, Any]]] = {} + + for path, partitions in disk_layout.items(): + conf_partitions = arg['partitions'].get(path, []) + for part in partitions['partitions']: + if part in conf_partitions: + enc_partitions.setdefault(path, []).append(part) + + enc = DiskEncryption( + EncryptionType(arg['encryption_type']), + password, + enc_partitions + ) + + if hsm := arg.get('hsm_device', None): + enc.hsm_device = Fido2Device.parse_arg(hsm) + + return enc diff --git a/archinstall/lib/packages/packages.py b/archinstall/lib/packages/packages.py index d5834f43..0743e83b 100644 --- a/archinstall/lib/packages/packages.py +++ b/archinstall/lib/packages/packages.py @@ -1,3 +1,4 @@ +import dataclasses import json import ssl from typing import Dict, Any, Tuple, List @@ -112,4 +113,4 @@ def installed_package(package :str) -> LocalPackage: except SysCallError: pass - return LocalPackage(**package_info) + return LocalPackage({field.name: package_info.get(field.name) for field in dataclasses.fields(LocalPackage)}) diff --git a/archinstall/lib/systemd.py b/archinstall/lib/systemd.py index f459f94b..64ffcae4 100644 --- a/archinstall/lib/systemd.py +++ b/archinstall/lib/systemd.py @@ -97,8 +97,6 @@ class Boot: shutdown = SysCommand(f'systemd-run --machine={self.container_name} --pty shutdown now') except SysCallError as error: shutdown_exit_code = error.exit_code - # if error.exit_code == 256: - # pass while self.session.is_alive(): time.sleep(0.25) diff --git a/archinstall/lib/user_interaction/general_conf.py b/archinstall/lib/user_interaction/general_conf.py index 76631a98..fc7ded45 100644 --- a/archinstall/lib/user_interaction/general_conf.py +++ b/archinstall/lib/user_interaction/general_conf.py @@ -174,7 +174,10 @@ def select_profile(preset) -> Optional[Profile]: storage['profile_minimal'] = False storage['_selected_servers'] = [] storage['_desktop_profile'] = None + storage['sway_sys_priv_ctrl'] = None + storage['arguments']['sway_sys_priv_ctrl'] = None storage['arguments']['desktop-environment'] = None + storage['arguments']['gfx_driver'] = None storage['arguments']['gfx_driver_packages'] = None return None case MenuSelectionType.Skip: diff --git a/archinstall/lib/user_interaction/partitioning_conf.py b/archinstall/lib/user_interaction/partitioning_conf.py index cff76dc2..0a5ede51 100644 --- a/archinstall/lib/user_interaction/partitioning_conf.py +++ b/archinstall/lib/user_interaction/partitioning_conf.py @@ -208,7 +208,7 @@ def manage_new_and_existing_partitions(block_device: 'BlockDevice') -> Dict[str, if fs_choice.type_ == MenuSelectionType.Skip: continue - prompt = str(_('Enter the start sector (percentage or block number, default: {}): ')).format( + prompt = str(_('Enter the start location (in parted units: s, GB, %, etc. ; default: {}): ')).format( block_device.first_free_sector ) start = input(prompt).strip() @@ -219,7 +219,7 @@ def manage_new_and_existing_partitions(block_device: 'BlockDevice') -> Dict[str, else: end_suggested = '100%' - prompt = str(_('Enter the end sector of the partition (percentage or block number, ex: {}): ')).format( + prompt = str(_('Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): ')).format( end_suggested ) end = input(prompt).strip() diff --git a/archinstall/lib/user_interaction/save_conf.py b/archinstall/lib/user_interaction/save_conf.py index d60ef995..5b4ae2b3 100644 --- a/archinstall/lib/user_interaction/save_conf.py +++ b/archinstall/lib/user_interaction/save_conf.py @@ -1,9 +1,12 @@ from __future__ import annotations +import logging + from pathlib import Path from typing import Any, Dict, TYPE_CHECKING from ..configuration import ConfigurationOutput +from ..general import SysCommand from ..menu import Menu from ..menu.menu import MenuSelectionType from ..output import log @@ -58,20 +61,75 @@ def save_config(config: Dict): if choice.type_ == MenuSelectionType.Skip: return - while True: - path = input(_('Enter a directory for the configuration(s) to be saved: ')).strip(' ') - dest_path = Path(path) - if dest_path.exists() and dest_path.is_dir(): - break - log(_('Not a valid directory: {}').format(dest_path), fg='red') - - if options['user_config'] == choice.value: - config_output.save_user_config(dest_path) - elif options['user_creds'] == choice.value: - config_output.save_user_creds(dest_path) - elif options['disk_layout'] == choice.value: - config_output.save_disk_layout(dest_path) - elif options['all'] == choice.value: - config_output.save_user_config(dest_path) - config_output.save_user_creds(dest_path) - config_output.save_disk_layout(dest_path) + dirs_to_exclude = [ + '/bin', + '/dev', + '/lib', + '/lib64', + '/lost+found', + '/opt', + '/proc', + '/run', + '/sbin', + '/srv', + '/sys', + '/usr', + '/var', + ] + log( + _('When picking a directory to save configuration files to,' + ' by default we will ignore the following folders: ') + ','.join(dirs_to_exclude), + level=logging.DEBUG + ) + + log(_('Finding possible directories to save configuration files ...'), level=logging.INFO) + + find_exclude = '-path ' + ' -prune -o -path '.join(dirs_to_exclude) + ' -prune ' + file_picker_command = f'find / {find_exclude} -o -type d -print0' + possible_save_dirs = list( + filter(None, SysCommand(file_picker_command).decode().split('\x00')) + ) + + selection = Menu( + _('Select directory (or directories) for saving configuration files'), + possible_save_dirs, + multi=True, + skip=True, + allow_reset=False, + ).run() + + match selection.type_: + case MenuSelectionType.Skip: + return + case _: + save_dirs = selection.value + + prompt = _('Do you want to save {} configuration file(s) in the following locations?\n\n{}').format( + list(options.keys())[list(options.values()).index(choice.value)], + save_dirs + ) + save_confirmation = Menu(prompt, Menu.yes_no(), default_option=Menu.yes()).run() + if save_confirmation == Menu.no(): + return + + log( + _('Saving {} configuration files to {}').format( + list(options.keys())[list(options.values()).index(choice.value)], + save_dirs + ), + level=logging.DEBUG + ) + + if save_dirs is not None: + for save_dir_str in save_dirs: + save_dir = Path(save_dir_str) + if options['user_config'] == choice.value: + config_output.save_user_config(save_dir) + elif options['user_creds'] == choice.value: + config_output.save_user_creds(save_dir) + elif options['disk_layout'] == choice.value: + config_output.save_disk_layout(save_dir) + elif options['all'] == choice.value: + config_output.save_user_config(save_dir) + config_output.save_user_creds(save_dir) + config_output.save_disk_layout(save_dir) diff --git a/archinstall/lib/user_interaction/system_conf.py b/archinstall/lib/user_interaction/system_conf.py index 8454a3da..68a1a7d2 100644 --- a/archinstall/lib/user_interaction/system_conf.py +++ b/archinstall/lib/user_interaction/system_conf.py @@ -60,7 +60,6 @@ def select_harddrives(preset: List[str] = []) -> List[str]: selected_harddrive = Menu( title, list(options.keys()), - preset_values=preset, multi=True, allow_reset=True, allow_reset_warning_msg=warning diff --git a/archinstall/locales/ar/LC_MESSAGES/base.po b/archinstall/locales/ar/LC_MESSAGES/base.po index 1a9fc1aa..c9540b38 100644 --- a/archinstall/locales/ar/LC_MESSAGES/base.po +++ b/archinstall/locales/ar/LC_MESSAGES/base.po @@ -97,10 +97,10 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "" -msgid "Enter the start sector (percentage or block number, default: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" @@ -782,3 +782,45 @@ msgstr "" msgid "TAB to select" msgstr "" + +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +msgid "Encryption type" +msgstr "" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +msgid "Partitions to be encrypted" +msgstr "" + +msgid "Select disk encryption option" +msgstr "" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +msgid "All settings will be reset, are you sure?" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +msgid "Password" +msgstr "" + +msgid "Partition encryption" +msgstr "" diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index 2becbbf3..651fbd58 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -97,11 +97,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "" -msgid "Enter the start sector (percentage or block number, default: {}): " +msgid "" +"Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " msgstr "" -msgid "" -"Enter the end sector of the partition (percentage or block number, ex: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" @@ -843,3 +843,36 @@ msgstr "" msgid "The font should be stored as {}" msgstr "" + +msgid "Encryption type" +msgstr "" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +msgid "Partitions to be encrypted" +msgstr "" + +msgid "Select disk encryption option" +msgstr "" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +msgid "All settings will be reset, are you sure?" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +msgid "Password" +msgstr "" + +msgid "Partition encryption" +msgstr "" diff --git a/archinstall/locales/cs/LC_MESSAGES/base.mo b/archinstall/locales/cs/LC_MESSAGES/base.mo Binary files differindex b175a54e..a256081c 100644 --- a/archinstall/locales/cs/LC_MESSAGES/base.mo +++ b/archinstall/locales/cs/LC_MESSAGES/base.mo diff --git a/archinstall/locales/cs/LC_MESSAGES/base.po b/archinstall/locales/cs/LC_MESSAGES/base.po index b3dea244..a09c6001 100644 --- a/archinstall/locales/cs/LC_MESSAGES/base.po +++ b/archinstall/locales/cs/LC_MESSAGES/base.po @@ -94,11 +94,11 @@ msgstr "Zvolte co dělat s {}" msgid "Enter a desired filesystem type for the partition" msgstr "Zadejte požadovaný souborový systém pro oddíl" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Zadejte počáteční sektor (procenta nebo číslo bloku, výchozí: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Zadejte koncový sektor oddílu (procenta nebo číslo bloku, např. {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} obsahuje oddíly ve frontě, toto je odstraní, jste si jisti?" @@ -821,3 +821,55 @@ msgstr "" msgid "TAB to select" msgstr "" + +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +#, fuzzy +msgid "Encryption type" +msgstr "Šifrovací heslo" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Zvolte oddíl, který bude označen jako šifrovaný" + +msgid "Select disk encryption option" +msgstr "" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} obsahuje oddíly ve frontě, toto je odstraní, jste si jisti?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Heslo správce (root)" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Zadejte počáteční sektor (procenta nebo číslo bloku, výchozí: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Zadejte koncový sektor oddílu (procenta nebo číslo bloku, např. {}): " diff --git a/archinstall/locales/de/LC_MESSAGES/base.mo b/archinstall/locales/de/LC_MESSAGES/base.mo Binary files differindex ca3f2971..0572f28b 100644 --- a/archinstall/locales/de/LC_MESSAGES/base.mo +++ b/archinstall/locales/de/LC_MESSAGES/base.mo diff --git a/archinstall/locales/de/LC_MESSAGES/base.po b/archinstall/locales/de/LC_MESSAGES/base.po index dee2b481..ac677188 100644 --- a/archinstall/locales/de/LC_MESSAGES/base.po +++ b/archinstall/locales/de/LC_MESSAGES/base.po @@ -96,11 +96,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Bitte wählen Sie einen Dateisystemtyp für die Partition aus" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Bitte geben Sie den start Sektor ein (in Prozent oder Blocknummer, default: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "Bitte geben Sie die Startposition ein (in parted Einheiten: s, GB, %, etc. ; default: {}): " -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Bitte geben Sie den end Sektor ein (in Prozent oder Blocknummer, default: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "Bitte geben Sie die Endposition ein (in parted Einheiten: s, GB, %, etc. ; default: {}): " msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} enthält Partitionen in der Warteschlange, dies werden damit entfernt, sind sie sicher?" @@ -841,8 +841,52 @@ msgstr "" msgid "TAB to select" msgstr "" -#~ msgid "Select disk layout" -#~ msgstr "Laufwerke-layout auswählen" +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +#, fuzzy +msgid "Encryption type" +msgstr "Verschlüsselungspasswort angeben" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Bitte wählen sie welche Partition verschlüsselt werden soll" + +#, fuzzy +msgid "Select disk encryption option" +msgstr "Laufwerke-layout auswählen" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} enthält Partitionen in der Warteschlange, dies werden damit entfernt, sind sie sicher?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Root Passwort" + +msgid "Partition encryption" +msgstr "" #~ msgid "Add :" #~ msgstr "Hinzufügen :" diff --git a/archinstall/locales/el/LC_MESSAGES/base.mo b/archinstall/locales/el/LC_MESSAGES/base.mo Binary files differindex beae2659..103eaf0c 100644 --- a/archinstall/locales/el/LC_MESSAGES/base.mo +++ b/archinstall/locales/el/LC_MESSAGES/base.mo diff --git a/archinstall/locales/el/LC_MESSAGES/base.po b/archinstall/locales/el/LC_MESSAGES/base.po index c41dbb7e..efcd6b49 100644 --- a/archinstall/locales/el/LC_MESSAGES/base.po +++ b/archinstall/locales/el/LC_MESSAGES/base.po @@ -96,11 +96,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Εισάγετε ένα επιθυμητό τύπο συστήματος αρχείων για τη διαμέριση" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Εισάγετε τον start sector (ποσοστό ή αριθμό block, προκαθορισμένο {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Εισάγετε τον end sector της διαμέρισης (ποσοστό ή αριθμό block, πχ: {}) " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} περιέχει διαμερίσεις στην ουρά, αυτό θα τις διαγράψει, είστε σίγουρη/ος;" @@ -828,3 +828,55 @@ msgstr "" msgid "TAB to select" msgstr "" + +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +#, fuzzy +msgid "Encryption type" +msgstr "Κωδικός κρυπτογράφησης" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Επιλέξτε ποιες διαμερίσεις να κρυπτογραφηθούν." + +msgid "Select disk encryption option" +msgstr "" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} περιέχει διαμερίσεις στην ουρά, αυτό θα τις διαγράψει, είστε σίγουρη/ος;" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Κωδικός root" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Εισάγετε τον start sector (ποσοστό ή αριθμό block, προκαθορισμένο {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Εισάγετε τον end sector της διαμέρισης (ποσοστό ή αριθμό block, πχ: {}) " diff --git a/archinstall/locales/en/LC_MESSAGES/base.po b/archinstall/locales/en/LC_MESSAGES/base.po index 62543eaa..f1722ef9 100644 --- a/archinstall/locales/en/LC_MESSAGES/base.po +++ b/archinstall/locales/en/LC_MESSAGES/base.po @@ -94,10 +94,10 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "" -msgid "Enter the start sector (percentage or block number, default: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" @@ -778,3 +778,45 @@ msgstr "" msgid "TAB to select" msgstr "" + +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +msgid "Encryption type" +msgstr "" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +msgid "Partitions to be encrypted" +msgstr "" + +msgid "Select disk encryption option" +msgstr "" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +msgid "All settings will be reset, are you sure?" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +msgid "Password" +msgstr "" + +msgid "Partition encryption" +msgstr "" diff --git a/archinstall/locales/es/LC_MESSAGES/base.mo b/archinstall/locales/es/LC_MESSAGES/base.mo Binary files differindex 6006c274..7194020e 100644 --- a/archinstall/locales/es/LC_MESSAGES/base.mo +++ b/archinstall/locales/es/LC_MESSAGES/base.mo diff --git a/archinstall/locales/es/LC_MESSAGES/base.po b/archinstall/locales/es/LC_MESSAGES/base.po index f744daae..20101de0 100644 --- a/archinstall/locales/es/LC_MESSAGES/base.po +++ b/archinstall/locales/es/LC_MESSAGES/base.po @@ -96,11 +96,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Ingrese un tipo de sistema de archivos deseado para la partición" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Introduzca el sector de inicio (porcentaje o número de bloque, predeterminado: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Ingrese el sector final de la partición (porcentaje o número de bloque, ej: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} contiene particiones en cola, esto eliminará esas particiones, ¿estás seguro?" @@ -827,8 +827,58 @@ msgstr "" msgid "TAB to select" msgstr "" -#~ msgid "Select disk layout" -#~ msgstr "Seleccione el diseño del disco" +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +#, fuzzy +msgid "Encryption type" +msgstr "Contraseña de cifrado" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Seleccione qué particiones cifrar" + +#, fuzzy +msgid "Select disk encryption option" +msgstr "Seleccione el diseño del disco" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} contiene particiones en cola, esto eliminará esas particiones, ¿estás seguro?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Contraseña de root" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Introduzca el sector de inicio (porcentaje o número de bloque, predeterminado: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Ingrese el sector final de la partición (porcentaje o número de bloque, ej: {}): " #~ msgid "Add :" #~ msgstr "Añadir :" diff --git a/archinstall/locales/fr/LC_MESSAGES/base.mo b/archinstall/locales/fr/LC_MESSAGES/base.mo Binary files differindex b8f19aa7..16b8a6cf 100644 --- a/archinstall/locales/fr/LC_MESSAGES/base.mo +++ b/archinstall/locales/fr/LC_MESSAGES/base.mo diff --git a/archinstall/locales/fr/LC_MESSAGES/base.po b/archinstall/locales/fr/LC_MESSAGES/base.po index f5946503..76080e40 100644 --- a/archinstall/locales/fr/LC_MESSAGES/base.po +++ b/archinstall/locales/fr/LC_MESSAGES/base.po @@ -3,13 +3,13 @@ msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" -"Last-Translator: roxfr <roxfr@outlook.fr>\n" +"Last-Translator: \n" "Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.2.2\n" msgid "[!] A log file has been created here: {} {}" msgstr "[!] Un fichier journal a été créé ici : {} {}" @@ -69,7 +69,7 @@ msgid "Select one network interface to configure" msgstr "Sélectionner une interface réseau à configurer" msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" -msgstr "Sélectionner le mode à configurer pour \"{}\" ou ignorer pour utiliser le mode par défaut \"{}\"" +msgstr "" msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " msgstr "Entrer l'IP et le sous-réseau pour {} (exemple : 192.168.0.5/24) : " @@ -96,11 +96,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Entrer un type de système de fichiers souhaité pour la partition" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Entrer le secteur de début (pourcentage ou numéro de bloc, par défaut : {}) : " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Entrer le secteur de fin de la partition (pourcentage ou numéro de bloc, ex : {}) : " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} contient des partitions en file d'attente, cela les supprimera, êtes-vous sûr ?" @@ -214,7 +214,7 @@ msgid "All open-source (default)" msgstr "Tout open-source (par défaut)" msgid "Choose which kernels to use or leave blank for default \"{}\"" -msgstr "Choisir les noyaux à utiliser ou laissez vide par défaut \"{}\"" +msgstr "" msgid "Choose which locale language to use" msgstr "Choisir la langue locale à utiliser" @@ -659,7 +659,6 @@ msgstr "Une installation très basique qui vous permet de personnaliser Arch Lin msgid "Provides a selection of various server packages to install and enable, e.g. httpd, nginx, mariadb" msgstr "Fournit une sélection de divers paquets de serveur à installer et à activer, par ex. httpd, nginx, mariadb" -#, fuzzy msgid "Choose which servers to install, if none then a minimal installation will be done" msgstr "Choisir les serveurs à installer, s'il n'y en a pas, une installation minimale sera effectuée" @@ -756,7 +755,7 @@ msgid "Either root-password or at least 1 user with sudo privileges must be spec msgstr "Le mot de passe root ou au moins 1 utilisateur avec des privilèges sudo doit être spécifié" msgid "Enter username (leave blank to skip): " -msgstr "Entrer le nom d'utilisateur (laisser vide pour passer) :" +msgstr "Entrer le nom d'utilisateur (laisser vide pour passer) : " msgid "The username you entered is invalid. Try again" msgstr "Le nom d'utilisateur que vous avez saisi n'est pas valide. Réessayer" @@ -764,38 +763,35 @@ msgstr "Le nom d'utilisateur que vous avez saisi n'est pas valide. Réessayer" msgid "Should \"{}\" be a superuser (sudo)?" msgstr "\"{}\" devrait-il être un superutilisateur (sudo) ?" -#, fuzzy msgid "Select which partitions to encrypt" -msgstr "Sélectionner la partition à marquer comme chiffrée" +msgstr "Sélectionner les partitions à chiffrer" msgid "very weak" -msgstr "" +msgstr "très faible" msgid "weak" -msgstr "" +msgstr "faible" msgid "moderate" -msgstr "" +msgstr "modéré" msgid "strong" -msgstr "" +msgstr "fort" -#, fuzzy msgid "Add subvolume" -msgstr " Sous-volume : {:16}" +msgstr "Ajouter un sous-volume" msgid "Edit subvolume" -msgstr "" +msgstr "Modifier le sous-volume" -#, fuzzy msgid "Delete subvolume" -msgstr "Supprimer l'utilisateur" +msgstr "Supprimer le sous-volume" msgid "Configured {} interfaces" -msgstr "" +msgstr "Interfaces {} configurées" msgid "This option enables the number of parallel downloads that can occur during installation" -msgstr "" +msgstr "Cette option active le nombre de téléchargements parallèles qui peuvent se produire pendant l'installation" #, python-brace-format msgid "" @@ -803,35 +799,87 @@ msgid "" " (Enter a value between 1 to {max_downloads})\n" "Note:" msgstr "" +"Saisir le nombre de téléchargements parallèles à activer.\n" +" (Entrer une valeur comprise entre 1 et {max_downloads})\n" +"Note :" msgid " - Maximum value : {max_downloads} ( Allows {max_downloads} parallel downloads, allows {max_downloads+1} downloads at a time )" -msgstr "" +msgstr " - Valeur maximale : {max_downloads} (Autorise {max_downloads} téléchargements parallèles, autorise {max_downloads+1} téléchargements à la fois)" msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a time )" -msgstr "" +msgstr " - Valeur minimale : 1 (Autorise 1 téléchargement parallèle, autorise 2 téléchargements à la fois)" msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )" -msgstr "" +msgstr " - Désactiver/Défaut : 0 (Désactive le téléchargement parallèle, n'autorise qu'un seul téléchargement à la fois)" #, python-brace-format msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]" -msgstr "" +msgstr "Entrée invalide ! Réessayer avec une entrée valide [1 pour {max_downloads}, ou 0 pour désactiver]" msgid "Parallel Downloads" -msgstr "" +msgstr "Téléchargements parallèles" -#, fuzzy msgid "ESC to skip" -msgstr "Utiliser ESC pour ignorer" +msgstr "ESC pour ignorer" msgid "CTRL+C to reset" -msgstr "" +msgstr "CTRL+C pour réinitialiser" msgid "TAB to select" +msgstr "TAB pour sélectionner" + +msgid "[Default value: 0] > " +msgstr "[Valeur par défaut : 0] > " + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "Pour pouvoir utiliser cette traduction, veuillez installer manuellement une police prenant en charge la langue." + +msgid "The font should be stored as {}" +msgstr "La police doit être stockée sous {}" + +#, fuzzy +msgid "Encryption type" +msgstr "Mot de passe de chiffrement" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Sélectionner les partitions à chiffrer" + +#, fuzzy +msgid "Select disk encryption option" +msgstr "Sélectionner la disposition du disque" + +msgid "Select a FIDO2 device to use for HSM" msgstr "" -#~ msgid "Select disk layout" -#~ msgstr "Sélectionner la disposition du disque" +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} contient des partitions en file d'attente, cela les supprimera, êtes-vous sûr ?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Mot de passe root" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Entrer le secteur de début (pourcentage ou numéro de bloc, par défaut : {}) : " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Entrer le secteur de fin de la partition (pourcentage ou numéro de bloc, ex : {}) : " #, python-brace-format #~ msgid "Edit {origkey} :" diff --git a/archinstall/locales/id/LC_MESSAGES/base.mo b/archinstall/locales/id/LC_MESSAGES/base.mo Binary files differindex c02df9eb..6e707237 100644 --- a/archinstall/locales/id/LC_MESSAGES/base.mo +++ b/archinstall/locales/id/LC_MESSAGES/base.mo diff --git a/archinstall/locales/id/LC_MESSAGES/base.po b/archinstall/locales/id/LC_MESSAGES/base.po index 85479389..6cc19cbf 100644 --- a/archinstall/locales/id/LC_MESSAGES/base.po +++ b/archinstall/locales/id/LC_MESSAGES/base.po @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.1\n" +"X-Generator: Poedit 3.2.2\n" msgid "[!] A log file has been created here: {} {}" msgstr "[!] File log telah dibuat di sini: {} {}" @@ -96,14 +96,14 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Masukkan jenis filesystem yang diinginkan untuk partisi" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Masukkan sektor awal (persentase atau nomor blok, default: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "Masukkan lokasi awal (dalam satuan parted: s, GB, %, dll. ; default: {}): " -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Masukkan sektor akhir partisi (persentase atau nomor blok, mis: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "Masukkan lokasi akhir (dalam satuan parted: s, GB, %, dll. ; cth: {}): " msgid "{} contains queued partitions, this will remove those, are you sure?" -msgstr "{} berisi partisi yang mengantri, ini akan menghapusnya, apakah Anda yakin?" +msgstr "{} berisi partisi yang telah di-queue, tindakan ini akan menghapusnya, apakah Anda yakin?" msgid "" "{}\n" @@ -561,7 +561,7 @@ msgstr "" "Isi nilai yang diinginkan untuk subvolume baru\n" msgid "Subvolume name " -msgstr " Nama subvolume" +msgstr "Nama subvolume " msgid "Subvolume mountpoint" msgstr "Titik mount subvolume" @@ -755,7 +755,7 @@ msgid "Either root-password or at least 1 user with sudo privileges must be spec msgstr "Baik kata sandi root atau setidaknya 1 pengguna dengan hak sudo harus ditentukan" msgid "Enter username (leave blank to skip): " -msgstr " Masukkan nama pengguna (kosongkan untuk melewati):" +msgstr "Masukkan nama pengguna (kosongkan untuk melewati): " msgid "The username you entered is invalid. Try again" msgstr "Nama pengguna yang Anda masukkan tidak valid. Coba lagi" @@ -830,3 +830,48 @@ msgstr "TAB untuk memilih" msgid "[Default value: 0] > " msgstr "[Nilai default: 0] > " + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "Untuk dapat menggunakan terjemahan ini, silakan instal font yang mendukung bahasa tersebut secara manual." + +msgid "The font should be stored as {}" +msgstr "Font harus disimpan sebagai {}" + +msgid "Encryption type" +msgstr "Tipe enkripsi" + +msgid "Partitions" +msgstr "Partisi" + +msgid "No HSM devices available" +msgstr "Tidak ada perangkat HSM yang tersedia" + +msgid "Partitions to be encrypted" +msgstr "Partisi yang akan dienkripsi" + +msgid "Select disk encryption option" +msgstr "Pilih opsi enkripsi disk" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "Pilih perangkat FID02 yang akan digunakan untuk HSM" + +msgid "All settings will be reset, are you sure?" +msgstr "Semua pengaturan akan direset, apakah Anda yakin?" + +msgid "Back" +msgstr "Kembali" + +msgid "Disk encryption" +msgstr "Enkripsi disk" + +msgid "Password" +msgstr "Kata sandi" + +msgid "Partition encryption" +msgstr "Enkripsi partisi" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Masukkan sektor awal (persentase atau nomor blok, default: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Masukkan sektor akhir partisi (persentase atau nomor blok, mis: {}): " diff --git a/archinstall/locales/it/LC_MESSAGES/base.mo b/archinstall/locales/it/LC_MESSAGES/base.mo Binary files differindex e1dccd81..f199746c 100644 --- a/archinstall/locales/it/LC_MESSAGES/base.mo +++ b/archinstall/locales/it/LC_MESSAGES/base.mo diff --git a/archinstall/locales/it/LC_MESSAGES/base.po b/archinstall/locales/it/LC_MESSAGES/base.po index 176d3959..00df1a3f 100644 --- a/archinstall/locales/it/LC_MESSAGES/base.po +++ b/archinstall/locales/it/LC_MESSAGES/base.po @@ -96,11 +96,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Immettere un tipo di filesystem desiderato per la partizione" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Inserisci il settore iniziale (percentuale o numero di blocco, predefinito: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Inserisci il settore finale (percentuale o numero di blocco, predefinito: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} contiene partizioni in coda, questo le rimuoverà, sei sicuro?" @@ -836,3 +836,46 @@ msgstr "Per poter utilizzare questa traduzione, installa manualmente un font che msgid "The font should be stored as {}" msgstr "Il carattere dovrebbe essere memorizzato come {}" + +#, fuzzy +msgid "Encryption type" +msgstr "Password di crittografia" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Seleziona le partizioni da crittografare" + +msgid "Select disk encryption option" +msgstr "" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} contiene partizioni in coda, questo le rimuoverà, sei sicuro?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Password di root" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Inserisci il settore iniziale (percentuale o numero di blocco, predefinito: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Inserisci il settore finale (percentuale o numero di blocco, predefinito: {}): " diff --git a/archinstall/locales/ka/LC_MESSAGES/base.mo b/archinstall/locales/ka/LC_MESSAGES/base.mo Binary files differnew file mode 100644 index 00000000..b95a6e0e --- /dev/null +++ b/archinstall/locales/ka/LC_MESSAGES/base.mo diff --git a/archinstall/locales/ka/LC_MESSAGES/base.po b/archinstall/locales/ka/LC_MESSAGES/base.po new file mode 100644 index 00000000..c89ec795 --- /dev/null +++ b/archinstall/locales/ka/LC_MESSAGES/base.po @@ -0,0 +1,878 @@ +msgid "" +msgstr "" +"Project-Id-Version: archinstall\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n" +"Language-Team: Georgian <(nothing)>\n" +"Language: ka\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.2.2\n" + +msgid "[!] A log file has been created here: {} {}" +msgstr "[!] ჟურნალის ფაილი შეიქმნა აქ: {} {}" + +msgid " Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues" +msgstr " ეს პრობლემა და ფაილი გადმოგვიგზავნეთ ბმულზე https://github.com/archlinux/archinstall/issues" + +msgid "Do you really want to abort?" +msgstr "გნებავთ, გააუქმოთ?" + +msgid "And one more time for verification: " +msgstr "და კიდევ ერთხელ, გადასამოწმებლად: " + +msgid "Would you like to use swap on zram?" +msgstr "გნებავთ სვოპის ZRAM-ზე გამოყენება?" + +msgid "Desired hostname for the installation: " +msgstr "ჰოსტის სასურველი სახელი, დაყენებისთვის: " + +msgid "Username for required superuser with sudo privileges: " +msgstr "Sudo პრივილეგიების მქონე ზემომხმარებლის მომხმარებლის სახელი: " + +msgid "Any additional users to install (leave blank for no users): " +msgstr "დამატებითი მომხმარებლები დასაყენებლად (მომხმარებლების გარეშე გასაგრძელებლად ცარიელი დატოვეთ): " + +msgid "Should this user be a superuser (sudoer)?" +msgstr "უნდა იყოს ეს მომხმარებელი ზემომხმარებელი (sudoer)?" + +msgid "Select a timezone" +msgstr "აირჩიეთ დროის სარტყელი" + +msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?" +msgstr "გნებავთ ჩამტვირთავად system-boot-ის მაგიერ GRUB-ი გამოიყენოთ?" + +msgid "Choose a bootloader" +msgstr "აირჩიეთ ჩამტვირთავი" + +msgid "Choose an audio server" +msgstr "აირჩიეთ აუდიოსერვერი" + +msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr and optional profile packages are installed." +msgstr "მოხდება მხოლოდ ისეთი პაკეტების დაყენება, როგორებიცაა base, base-devel, linux, linux-firmware, efibootmgr და არასავალდებულო პროფილის პაკეტი." + +msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt." +msgstr "თუ გნებავთ ბრაუზერის, როგორებიცაა firefox ან chromium, ქონა, შემდეგი რამ უნდა მიუთითოთ." + +msgid "Write additional packages to install (space separated, leave blank to skip): " +msgstr "დამატებითი პაკეტები დასაყენებლად (გამოტოვებით გამოყოფილი, გამოსატოვებლად ცარიელი დატოვეთ): " + +msgid "Copy ISO network configuration to installation" +msgstr "ISO-ის ქსელის კონფიგურაციის კოპირება დაყენების დროს" + +msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)" +msgstr "NetworkManager-ის გამოყენება (აუცილებელია ინტერნეტის GNOME/KDE-დან მოსარგებად)" + +msgid "Select one network interface to configure" +msgstr "მოსარგებად ერთ-ერთი ქსელის ინტერფეისი აირჩიეთ" + +msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" +msgstr "აირჩიეთ მოსარგები რეჟიმი \"{}\"-სთვის ან გამოტოვეთ ნაგულისხმები რეჟიმის \"{}\" გამოსაყენებლად" + +msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " +msgstr "შეიყვანეთ IP მისამართი და ქვექსელი {}-სთვის (მაგ: 192.168.0.5/24): " + +msgid "Enter your gateway (router) IP address or leave blank for none: " +msgstr "აირჩიეთ ნაგულისხმები რაუტერის IP მისამართი, ან ცარიელი დატოვეთ: " + +msgid "Enter your DNS servers (space separated, blank for none): " +msgstr "შეიყვანეთ თქვენი DNS სერვერების მისამართები (გამოყოფილი ცარიელი ადგილით. ცარიელი, თუ არ გნებავთ, გამოიყენოთ): " + +msgid "Select which filesystem your main partition should use" +msgstr "რომელ ფაილურ სისტემას გამოიყენებს თქვენი მთავარი დანაყოფი" + +msgid "Current partition layout" +msgstr "მიმდინარე დანაყოფების განლაგება" + +msgid "" +"Select what to do with\n" +"{}" +msgstr "" +"აირჩიეთ, რა მოუვა\n" +"{}" + +msgid "Enter a desired filesystem type for the partition" +msgstr "შეიყვანეთ დანაყოფის სასურველი ფაილური სისტემის ტიპი" + +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" + +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" + +msgid "{} contains queued partitions, this will remove those, are you sure?" +msgstr "{} რიგში ჩაყენებულ დანაყოფებს შეიცავს. ეს წაშლის მათ. დარწმუნებული ბრძანდებით?" + +msgid "" +"{}\n" +"\n" +"Select by index which partitions to delete" +msgstr "" +"{}\n" +"\n" +"წასაშლელი დანაყოფების ინდექსით არჩევა" + +msgid "" +"{}\n" +"\n" +"Select by index which partition to mount where" +msgstr "" +"{}\n" +"\n" +"ინდექსით არჩევა, რომელი დანაყოფი სად იქნება მიმაგრებული" + +msgid " * Partition mount-points are relative to inside the installation, the boot would be /boot as an example." +msgstr " * დანაყოფის მიმაგრების წერტილები შედარებითია დაყენების შიგნით. ჩატვირთვა, მაგალითად, /boot შეიძლება, იყოს." + +msgid "Select where to mount partition (leave blank to remove mountpoint): " +msgstr "აირჩიეთ, სად გნებავთ მიამაგროთ დანაყოფი (მიმაგრების წერტილის წასაშლელად დატოვეთ ის ცარიელი): " + +msgid "" +"{}\n" +"\n" +"Select which partition to mask for formatting" +msgstr "" +"{}\n" +"\n" +"აირჩიეთ, რომელი დანაყოფი იქნება მონიშნული ფორმატირებისთვის" + +msgid "" +"{}\n" +"\n" +"Select which partition to mark as encrypted" +msgstr "" +"{}\n" +"\n" +"აირჩიეთ, რომელი დანაყოფი მოინიშნება, როგორც დაშიფრული" + +msgid "" +"{}\n" +"\n" +"Select which partition to mark as bootable" +msgstr "" +"{}\n" +"\n" +"აირჩიეთ, რომელი დანაყოფი მოინიშნება, როგორც ჩატვირთვადი" + +msgid "" +"{}\n" +"\n" +"Select which partition to set a filesystem on" +msgstr "" +"{}\n" +"\n" +"აირჩიეთ, ფაილური სისტემა რომელ დანაყოფზე დავაყენო" + +msgid "Enter a desired filesystem type for the partition: " +msgstr "შეიყვანეთ დანაყოფის სასურველი ფაილური სისტემის ტიპი: " + +msgid "Archinstall language" +msgstr "Archinstall-ის ენა" + +msgid "Wipe all selected drives and use a best-effort default partition layout" +msgstr "მონიშნულ დისკებზე ყველაფრის წაშლა და დანაყოფების განლაგების საუკეთესო განლაგების გამოყენება" + +msgid "Select what to do with each individual drive (followed by partition usage)" +msgstr "აირჩიეთ, რა ვუყო ინდივიდუალურ დისკს (დანაყოფების გამოყენების შემდეგ)" + +msgid "Select what you wish to do with the selected block devices" +msgstr "აირჩიეთ, მონიშნულ ბლოკურ მოწყობილობებს რა გნებავთ, უქნათ" + +msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments" +msgstr "ეს წინასწარ მითითებული პროფილების სიაა. მათი დახმარებით ისეთი რამების, როგორიცაა სამუშაო მაგიდის გარემოები, დაყენება უფრო ადვილია" + +msgid "Select keyboard layout" +msgstr "აირჩიეთ კლავიატურის განლაგება" + +msgid "Select one of the regions to download packages from" +msgstr "აირჩიეთ რეგიონი პაკეტების გადმოსაწერად" + +msgid "Select one or more hard drives to use and configure" +msgstr "აირჩიეთ ერთი ან მეტი მყარი დისკი და მოირგეთ" + +msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options." +msgstr "თქვენს AMD-ის აპარატურასთან საუკეთესო თავსებადობისთვის შეგიძლიათ როგორც სრულად ღია კოდის მქონე, ისე 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 "Intel-ის აპარატურასთან საუკეთესო თავსებადობისთვის შეგიძლიათ მათი სრულად ღია კოდის მქონე ვარიანტი გამოიყენოთ.\n" + +msgid "For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n" +msgstr "Nvidia-ის თქვენს აპარატურასთან საუკეთესო თავსებადობისთვის შეიძლება Nvidia-ის დახურული კოდის მქონე დრაივერის დაყენება გნებავდეთ.\n" + +msgid "" +"\n" +"\n" +"Select a graphics driver or leave blank to install all open-source drivers" +msgstr "" +"\n" +"\n" +"აირჩიეთ გრაფიკის დრაივერი ან, ღია კოდის მქონე დრაივერის დასაყენებლად, ცარიელი დატოვეთ" + +msgid "All open-source (default)" +msgstr "ყველა ღია კოდით (ნაგულისხმები)" + +msgid "Choose which kernels to use or leave blank for default \"{}\"" +msgstr "აირჩიეთ, რომელი ბირთვი გნებავთ, გამოიყენოთ. ან ნაგულისხმებისთვის (\"{}\") ცარიელი დატოვეთ" + +msgid "Choose which locale language to use" +msgstr "აირჩიეთ, რომელი ლოკალის ენა გნებავთ, გამოიყენოთ" + +msgid "Choose which locale encoding to use" +msgstr "აირჩიეთ, რომელი ლოკალის კოდირება გნებავთ, გამოიყენოთ" + +msgid "Select one of the values shown below: " +msgstr "აირჩიეთ ერთ-ერთი ქვემოთ მოყვანილი მნიშვნელობებიდან: " + +msgid "Select one or more of the options below: " +msgstr "აირჩეთ ერთი ან მეტი პარამეტრი ქვემოდან: " + +msgid "Adding partition...." +msgstr "დანაყოფის დამატება..." + +msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's." +msgstr "გასაგრძელებლად აუცილებელია სწორი fs-type შეიყვანოთ. ხელმისაწვდომი სიის სანახავად იხილეთ 'man parted'." + +msgid "Error: Listing profiles on URL \"{}\" resulted in:" +msgstr "შეცდომა: URL-ზე \"{}\" პროფილების ჩამოთვლის შედეგია:" + +msgid "Error: Could not decode \"{}\" result as JSON:" +msgstr "შეცდომა: \"{}\" შედეგის JSON-ის სახით გაშიფვრა შეუძლებელია:" + +msgid "Keyboard layout" +msgstr "კლავიატურის განლაგება" + +msgid "Mirror region" +msgstr "სარკის რეგიონი" + +msgid "Locale language" +msgstr "ლოკალის ენა" + +msgid "Locale encoding" +msgstr "ლოკალის კოდირება" + +msgid "Drive(s)" +msgstr "დისკები" + +msgid "Disk layout" +msgstr "დისკის განლაგება" + +msgid "Encryption password" +msgstr "დაშიფვრის პაროლი" + +msgid "Swap" +msgstr "სვოპი" + +msgid "Bootloader" +msgstr "ჩამტვირთავი" + +msgid "Root password" +msgstr "Root-ის პაროლი" + +msgid "Superuser account" +msgstr "ზემომხმარებლის ანგარიში" + +msgid "User account" +msgstr "მომხმარებლის ანგარიში" + +msgid "Profile" +msgstr "პროფილი" + +msgid "Audio" +msgstr "აუდიო" + +msgid "Kernels" +msgstr "ბირთვები" + +msgid "Additional packages" +msgstr "დამატებითი პაკეტები" + +msgid "Network configuration" +msgstr "ქსელის მორგება" + +msgid "Automatic time sync (NTP)" +msgstr "დროის ავტომატური სინქრონიზაცია (NTP)" + +msgid "Install ({} config(s) missing)" +msgstr "დაყენება (აკლია {} კონფიგურაცია)" + +msgid "" +"You decided to skip harddrive selection\n" +"and will use whatever drive-setup is mounted at {} (experimental)\n" +"WARNING: Archinstall won't check the suitability of this setup\n" +"Do you wish to continue?" +msgstr "" +"გადაწყვიტეთ, გამოტოვოთ მყარი დისკის არჩევანი\n" +"და გამოიყენოთ ის, რაც {}-ზეა მიმაგრებული (ექსპერიმენტალური)\n" +"გაფრთხილება: Archinstall-ს ამ მორგების სტაბილურობის გადამოწმება არ შეუძლია.\n" +"გნებავთ, გააგრძელოთ?" + +msgid "Re-using partition instance: {}" +msgstr "დანაყოფის ასლის თავიდან გამოყენება: {}" + +msgid "Create a new partition" +msgstr "ახალი დანაყოფის შექმნა" + +msgid "Delete a partition" +msgstr "დანაყოფის წაშლა" + +msgid "Clear/Delete all partitions" +msgstr "დანაყოფების გასუფთავება/წაშლა" + +msgid "Assign mount-point for a partition" +msgstr "დანაყოფის მიმაგრების წერტილის მინიჭება" + +msgid "Mark/Unmark a partition to be formatted (wipes data)" +msgstr "დანაყოფის დასაფორმატებლობის ჭდის მოხსნა/დადება (მონაცემები წაიშლება)" + +msgid "Mark/Unmark a partition as encrypted" +msgstr "დანაყოფის დაშიფრულობის ჭდის დადება/მოხსნა" + +msgid "Mark/Unmark a partition as bootable (automatic for /boot)" +msgstr "დანაყოფის ჩატვირთვადობის ჭდის მოხსნა/დადება (ავტომატურია /boot-სთვის)" + +msgid "Set desired filesystem for a partition" +msgstr "აირჩიეთ დანაყოფის სასურველი ფაილური სისტემა" + +msgid "Abort" +msgstr "გაუქმება" + +msgid "Hostname" +msgstr "ჰოსტის სახელი" + +msgid "Not configured, unavailable unless setup manually" +msgstr "მორგებული არაა. მიუწვდომელია, სანამ ხელით არ მოირგებთ" + +msgid "Timezone" +msgstr "დროის სარტყელი" + +msgid "Set/Modify the below options" +msgstr "დააყენეთ/შეცვალეთ ქვედა პარამეტრები" + +msgid "Install" +msgstr "დაყენება" + +msgid "" +"Use ESC to skip\n" +"\n" +msgstr "" +"გამოსატოვებლად გამოიყენეთ ღილაკი Esc\n" +"\n" + +msgid "Suggest partition layout" +msgstr "დანაყოფების განლაგების მინიშნება" + +msgid "Enter a password: " +msgstr "შეიყვანეთ პაროლი: " + +msgid "Enter a encryption password for {}" +msgstr "შეიყვანეთ {}-ის დაშიფვრის პაროლი" + +msgid "Enter disk encryption password (leave blank for no encryption): " +msgstr "შეიყვანეთ დისკის დაშიფვრის პაროლი (დაშიფვრის გასათიშად დატოვეთ ცარიელი): " + +msgid "Create a required super-user with sudo privileges: " +msgstr "Sudo-ის პრივილეგიების სმქონე აუცილებელი ზემომხმარებლის: " + +msgid "Enter root password (leave blank to disable root): " +msgstr "შეიყვანეთ root-ის პაროლი (თუ გნებავთ, გათიშოთ root, ცარიელი დატოვეთ): " + +msgid "Password for user \"{}\": " +msgstr "პაროლი მომხმარებლისთვის \"{}\": " + +msgid "Verifying that additional packages exist (this might take a few seconds)" +msgstr "დამატებითი პაკეტების არსებობის შემოწმება (ამას რამდენიმე წამი შეიძლება დასჭირდეს)" + +msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n" +msgstr "გნებავთ დროის ავტომატური სინქრონიზაციის (NTP) ნაგულისხმები დროის სერვერებით გამოყენება?\n" + +msgid "" +"Hardware time and other post-configuration steps might be required in order for NTP to work.\n" +"For more information, please check the Arch wiki" +msgstr "" +"NTP-ის ასამუშავებლად აპარატურული დრო და სხვა დაყენების-შემდგომი ნაბიჯები დაგჭირდებათ.\n" +"მეტი ინფორმაციისთვის იხილეთ Arch-ის დოკუმენტაცია" + +msgid "Enter a username to create an additional user (leave blank to skip): " +msgstr "დამატებითი მომხმარებლის შესაქმნელად შეიყვანეთ მისი სახელი (გამოსატოვებლად ცარიელი დატოვეთ): " + +msgid "Use ESC to skip\n" +msgstr "გამოსატოვებლად გამოიყენეთ ღილაკი Esc\n" + +msgid "" +"\n" +" Choose an object from the list, and select one of the available actions for it to execute" +msgstr "" +"\n" +" შესასრულებლად აირჩიეთ ობიექტი სიიდან და აირჩიეთ მისთვის ხელმისაწვდომი ქმედება" + +msgid "Cancel" +msgstr "შეწყვეტა" + +msgid "Confirm and exit" +msgstr "დადასტურება და გასვლა" + +msgid "Add" +msgstr "დამატება" + +msgid "Copy" +msgstr "კოპირება" + +msgid "Edit" +msgstr "ჩასწორება" + +msgid "Delete" +msgstr "წაშლა" + +msgid "Select an action for '{}'" +msgstr "აირჩიეთ ქმედება '{}'-სთვის" + +msgid "Copy to new key:" +msgstr "ახალ გასაღებში კოპირება:" + +msgid "Unknown nic type: {}. Possible values are {}" +msgstr "NIC-ის უცნობი ტიპი: {}. შესაძლო მნიშვნელობებია {}" + +msgid "" +"\n" +"This is your chosen configuration:" +msgstr "" +"\n" +"ეს თქვენი არჩეული კონფიგურაციაა:" + +msgid "Pacman is already running, waiting maximum 10 minutes for it to terminate." +msgstr "Pacman- უკვე გაშვებულია. მოკვლამდე 10 წუთი დაველოდები." + +msgid "Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall." +msgstr "წინასწარ packman-ის ბლოკი არასდროს არსებობდა. Archinstall-ის დაყენებამდე აუცილებელია pacman-ს სესიების მოსუფთავება აუცილებელია." + +msgid "Choose which optional additional repositories to enable" +msgstr "აირჩიეთ, რომელი არასავალდებულო დამატებითი რეპოზიტორია გნებავთ, ჩართოთ" + +msgid "Add a user" +msgstr "მომხმარებლის დამატება" + +msgid "Change password" +msgstr "პაროლის შეცვლა" + +msgid "Promote/Demote user" +msgstr "მომხმარებლის დაწინაურება/ჩამოქვეითება" + +msgid "Delete User" +msgstr "მომხმარებლის წაშლა" + +msgid "" +"\n" +"Define a new user\n" +msgstr "" +"\n" +"აღწერეთ ახალი მომხმარებელი\n" + +msgid "User Name : " +msgstr "მომხმარებლის სახელი : " + +msgid "Should {} be a superuser (sudoer)?" +msgstr "იყოს {} ზემომხმარებელი (sudoer)?" + +msgid "Define users with sudo privilege: " +msgstr "აღწერეთ sudo პრივილეგიის მქონე მომხმარებლები: " + +msgid "No network configuration" +msgstr "ქსელის მორგების გარეშე" + +msgid "Set desired subvolumes on a btrfs partition" +msgstr "დააყენეთ Btrfs დანაყოფის სასურველი ქვეტომები" + +msgid "" +"{}\n" +"\n" +"Select which partition to set subvolumes on" +msgstr "" +"{}\n" +"\n" +"აირჩიეთ, რომელ დანაყოფზე აპირებთ ქვეტომების დაყენებას" + +msgid "Manage btrfs subvolumes for current partition" +msgstr "Btrfs-ის ქვეტომების მართვა მიმდინარე დანაყოფისთვის" + +msgid "No configuration" +msgstr "მორგების გარეშე" + +msgid "Save user configuration" +msgstr "მომხმარებლის კონფიგურაციის შენახვა" + +msgid "Save user credentials" +msgstr "მომხმარებლის ავტორიზაციის დეტალების შენახვა" + +msgid "Save disk layout" +msgstr "დისკის განლაგების შენახვა" + +msgid "Save all" +msgstr "ყველაფრის შენახვა" + +msgid "Choose which configuration to save" +msgstr "აირჩიეთ, რომელი კონფიგურაცია შევინახო" + +msgid "Enter a directory for the configuration(s) to be saved: " +msgstr "შეიყვანეთ საქაღალდე, სადაც კონფიგურაცი(ებ)-ი იქნება შენახული: " + +msgid "Not a valid directory: {}" +msgstr "არასწორი საქაღალდე: {}" + +msgid "The password you are using seems to be weak," +msgstr "პაროლი, რომელიც შეიყვანეთ, სუსტია," + +msgid "are you sure you want to use it?" +msgstr "დარწმუნებული ბრძანდებით, რომ გნებავთ, გამოიყენოთ ის?" + +msgid "Optional repositories" +msgstr "არასავალდებულო რეპოზიტორიები" + +msgid "Save configuration" +msgstr "კონფიგურაციი შენახვა" + +msgid "Missing configurations:\n" +msgstr "ნაკლული კონფიგურაციები:\n" + +msgid "Either root-password or at least 1 superuser must be specified" +msgstr "შეიყვანეთ root-ის პაროლი ან მიუთითეთ 1 ზემომხმარებელი მაინც" + +msgid "Manage superuser accounts: " +msgstr "ზემომხმარებლის ანგარიშების მართვა: " + +msgid "Manage ordinary user accounts: " +msgstr "ჩვეულებრივი მომხმარებლის ანგარიშების მართვა: " + +msgid " Subvolume :{:16}" +msgstr " ქვეტომი :{:16}" + +msgid " mounted at {:16}" +msgstr " მიმაგრების წერტილი {:16}" + +msgid " with option {}" +msgstr " პარამეტრით {}" + +msgid "" +"\n" +" Fill the desired values for a new subvolume \n" +msgstr "" +"\n" +"შეავსეთ სასურველი მნიშვნელობები ახალი ქვეტომისთვის \n" + +msgid "Subvolume name " +msgstr "ქვეტომის სახელი " + +msgid "Subvolume mountpoint" +msgstr "ქვეტომის მიმაგრების წერტილი" + +msgid "Subvolume options" +msgstr "ქვეტომის მორგება" + +msgid "Save" +msgstr "შენახვა" + +msgid "Subvolume name :" +msgstr "ქვეტომის სახელი :" + +msgid "Select a mount point :" +msgstr "აირჩიეთ მიმაგრების წერტილი :" + +msgid "Select the desired subvolume options " +msgstr "აირჩიეთ სასურველი ქვეტომის პარამეტრები " + +msgid "Define users with sudo privilege, by username: " +msgstr "აღწერეთ sudo-ის პრივილეგიების მქონე მომხმარებლები, მათი სახელით: " + +msgid "[!] A log file has been created here: {}" +msgstr "[!] ჟურნალის ფაილის მდებარეობა: {}" + +msgid "Would you like to use BTRFS subvolumes with a default structure?" +msgstr "გნებავთ BTRFS-ის ქვეტომები ნაგულისხმები სტრუქტურით გამოიყენოთ?" + +msgid "Would you like to use BTRFS compression?" +msgstr "გნებავთ BTRFS-ის შეკუმშვის გამოყენება?" + +msgid "Would you like to create a separate partition for /home?" +msgstr "გნებავთ /home-სთვის ცალკე დანაყოფი შექმნათ?" + +msgid "The selected drives do not have the minimum capacity required for an automatic suggestion\n" +msgstr "მონიშნულ დისკებზე ავტომატურად დასაყენებლად საკმარისი მინიმალური ადგილი აღმოჩენილი არაა\n" + +msgid "Minimum capacity for /home partition: {}GB\n" +msgstr "მინიმალური სივრცე დანაყოფისთვის /home: {}გბ\n" + +msgid "Minimum capacity for Arch Linux partition: {}GB" +msgstr "მინიმალური სივრცე ArchLinux-ის დანაყოფისთვის: {}გბ" + +msgid "Continue" +msgstr "გაგრძელება" + +msgid "yes" +msgstr "დიახ" + +msgid "no" +msgstr "არა" + +msgid "set: {}" +msgstr "დაყენება: {}" + +msgid "Manual configuration setting must be a list" +msgstr "მორგებული კონფიგურაციის პარამეტრი სია უნდა იყოს" + +msgid "No iface specified for manual configuration" +msgstr "მორგებული კონფიგურაციისთვის ინტერფეისი მითითებული არაა" + +msgid "Manual nic configuration with no auto DHCP requires an IP address" +msgstr "NIC-ის DHCP-ის გარეშე მოსარგებად IP მისამართის მითითება აუცილებელია" + +msgid "Add interface" +msgstr "ინტერფეისის დამატება" + +msgid "Edit interface" +msgstr "ინტერფეისის ჩასწორება" + +msgid "Delete interface" +msgstr "ინტერფეისის წაშლა" + +msgid "Select interface to add" +msgstr "აირჩიეთ დასამატებელი ინტერფეისი" + +msgid "Manual configuration" +msgstr "ხელით მორგება" + +msgid "Mark/Unmark a partition as compressed (btrfs only)" +msgstr "დანაყოფზე შეკუმშულობის ჭდის მოხსნა/დადება (მხოლოდ btrfs)" + +msgid "The password you are using seems to be weak, are you sure you want to use it?" +msgstr "როგორც ჩანს პაროლი, რომელსაც იყენებთ, სუსტია. დარწმუნებული ბრძანდებით, რომ გნებავთ, გამოიყენოთ ის?" + +msgid "Provides a selection of desktop environments and tiling window managers, e.g. gnome, kde, sway" +msgstr "მოგაწვდით სამუშაო გარემოებისა და ფანჯრების მმართველების არჩევანს. მაგ: gnome, kde, sway" + +msgid "Select your desired desktop environment" +msgstr "აირჩიეთ სასურველი სამუშაო მაგიდის გარემო" + +msgid "A very basic installation that allows you to customize Arch Linux as you see fit." +msgstr "მინიმალური დაყენება, რომელიც საშუალებას გაძლევთ, Arch Linux სურვილისამებრ მოირგოთ." + +msgid "Provides a selection of various server packages to install and enable, e.g. httpd, nginx, mariadb" +msgstr "სერვერის ისეთი პაკეტების დაყენება და ჩართვა, როგორიცაა httpd, nginx, mariadb" + +msgid "Choose which servers to install, if none then a minimal installation will be done" +msgstr "აირჩიეთ, რომელი სერვერების დაყენება გნებავთ. თუ არაფერს შეიყვანთ, მინიმალური დაყენება მოხდება" + +msgid "Installs a minimal system as well as xorg and graphics drivers." +msgstr "აყენებს მინიმალურ სისტემას, ასევე xorg-ს და გრაფიკის დრაივერებს." + +msgid "Press Enter to continue." +msgstr "გასაგრძელებლად დააჭირეთ Enter-ს." + +msgid "Would you like to chroot into the newly created installation and perform post-installation configuration?" +msgstr "გნებავთ chroot ახალ დაყენებულ სისტემაში და დაყენების შემდეგი კონფიგურაციის გაშვება?" + +msgid "Are you sure you want to reset this setting?" +msgstr "დარწმუნებული ბრძანდებით, რომ გნებავთ, დააბრუნოთ ეს პარამეტრი?" + +msgid "Select one or more hard drives to use and configure\n" +msgstr "მოსარგებად და გამოსაყენებლად აირჩიეთ ერთი ან მეტი მყარი დისკი\n" + +msgid "Any modifications to the existing setting will reset the disk layout!" +msgstr "არსებული პარამეტრის ნებისმიერი ცვლილება დისკის განლაგებას საწყის მნიშვნელობებზე დააბრუნებს!" + +msgid "If you reset the harddrive selection this will also reset the current disk layout. Are you sure?" +msgstr "ეს მყარი დისკის არჩევანს და მიმდინარე დისკის განლაგებას საწყის მნიშვნელობებზე დააბრუნებს. დარწმუნებული ბრძანდებით?" + +msgid "Save and exit" +msgstr "შენახვა და გასვლა" + +msgid "" +"{}\n" +"contains queued partitions, this will remove those, are you sure?" +msgstr "" +"{}\n" +"რიგში ჩაყენებულ დანაყოფებს შეიცავს. ეს წაშლის მათ. დარწმუნებული ბრძანდებით?" + +msgid "No audio server" +msgstr "აუდიოსერვერის გრეშე" + +msgid "(default)" +msgstr "(ნაგულისხმები)" + +msgid "Use ESC to skip" +msgstr "გამოსატოვებლად გამოიყენეთ ღილაკი Esc" + +msgid "" +"Use CTRL+C to reset current selection\n" +"\n" +msgstr "" +"მიმდინარე მონიშვნის დასაბრუნებლად დააწექით CTRL+C\n" +"\n" + +msgid "Copy to: " +msgstr "კოპირება: " + +msgid "Edit: " +msgstr "ჩასწორება: " + +msgid "Key: " +msgstr "გასაღები: " + +msgid "Edit {}: " +msgstr "ჩასწორება {}: " + +msgid "Add: " +msgstr "დამატება: " + +msgid "Value: " +msgstr "მნიშვნელობა: " + +msgid "You can skip selecting a drive and partitioning and use whatever drive-setup is mounted at /mnt (experimental)" +msgstr "შეგიძლიათ დისკის არჩევანი და დაყოფა გამოტოვოთ და გამოიყენოთ სასურველი დისკი, რომელიც /mnt-ზეა მიმაგრებული (ექსპერიმენტალური)" + +msgid "Select one of the disks or skip and use /mnt as default" +msgstr "აირჩიეთ ერტი ან მეტი დისკი ან გამოტოვება და ნაგულისხმები /mnt-ის გამოყენება" + +msgid "Select which partitions to mark for formatting:" +msgstr "აირჩიეთ, რომელი დანაყოფები მოვნიშნო დასაფორმატებლად:" + +msgid "Use HSM to unlock encrypted drive" +msgstr "დაშიფრული დისკის გასახსნელად HSM-ის გამოყენება" + +msgid "Device" +msgstr "მოწყობილობა" + +msgid "Size" +msgstr "ზომა" + +msgid "Free space" +msgstr "თავისუფალი ადგილი" + +msgid "Bus-type" +msgstr "მატარებლის-ტიპი" + +msgid "Either root-password or at least 1 user with sudo privileges must be specified" +msgstr "Root-ის პაროლის ან მინიმუმ 1 sudo-ის პრივილეგიების მქონე მომხმარებლის მითითება აუცილებელია" + +msgid "Enter username (leave blank to skip): " +msgstr "შეიყვანეთ მომხმარებლი სახელი (გამოსატოვებლად ცარიელი დატოვეთ): " + +msgid "The username you entered is invalid. Try again" +msgstr "შეყვანილი მომხმარებლის სახელი არასწორია. კიდევ სცადეთ" + +msgid "Should \"{}\" be a superuser (sudo)?" +msgstr "იყოს \"{}\" ზემომხმარებელი(sudo)?" + +msgid "Select which partitions to encrypt" +msgstr "არჩიეთ დასაშიფრი დანაყოფები" + +msgid "very weak" +msgstr "ძალიან სუსტი" + +msgid "weak" +msgstr "სუსტი" + +msgid "moderate" +msgstr "საშუალო" + +msgid "strong" +msgstr "ძლიერი" + +msgid "Add subvolume" +msgstr "ქვეტომის დამატება" + +msgid "Edit subvolume" +msgstr "ქვეტომის ჩასწორება" + +msgid "Delete subvolume" +msgstr "ქვეტომის წაშლა" + +msgid "Configured {} interfaces" +msgstr "მორგებულია {} ინტერფეისი" + +msgid "This option enables the number of parallel downloads that can occur during installation" +msgstr "ეს პარამეტრი დაყენებისას მითითებული რაოდენობის პარალელურ გადმოწერას დაუშვებს" + +#, python-brace-format +msgid "" +"Enter the number of parallel downloads to be enabled.\n" +" (Enter a value between 1 to {max_downloads})\n" +"Note:" +msgstr "" +"შეიყვანეთ დასაშვები პარალელური გადმოწერების რაოდენობა.\n" +" (შეიყვანეთ მნიშვნელობა 1-დან {max_downloads}-მდე)\n" +"დაიმახსოვრეთ:" + +msgid " - Maximum value : {max_downloads} ( Allows {max_downloads} parallel downloads, allows {max_downloads+1} downloads at a time )" +msgstr " - მინიმალური მნიშვნელობა : {max_downloads} ( დაუშვებს {max_downloads} პარალელურ გადმოწერას, დაუშვებს {max_downloads+1} ერთდროულ გადმოწერას )" + +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 )" +msgstr " - გამორთვა/ნაგულისხმები : 0 ( პარალელური გადმოწერების გათიშვა. დროის ერთ მომენტში მხოლოდ ერთი გადმოწერა მოხდება )" + +#, python-brace-format +msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]" +msgstr "შეყვანილი რიცხვი არასწორია! თავიდან სცადეთ [1-დან {max_downloads}-მდე, ან 0, გასათიშად]" + +msgid "Parallel Downloads" +msgstr "პარალელური გადმოწერები" + +msgid "ESC to skip" +msgstr "გამოსატოვებლად ღილაკი Esc" + +msgid "CTRL+C to reset" +msgstr "დასაბრუნებლად CTRL+C" + +msgid "TAB to select" +msgstr "ასარჩევად TAB" + +msgid "[Default value: 0] > " +msgstr "[ნაგულისხმები მნიშვნელობა: 0] > " + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "თარგმანის გამოსაყენებლად ფონტი, რომელსაც ენის მხარდაჭერა გააჩნია, ხელით უნდა დააყენოთ." + +msgid "The font should be stored as {}" +msgstr "ფონტი {}-ში უნდა იყოს შენახული" + +msgid "Encryption type" +msgstr "დაშიფვრის ტიპი" + +msgid "Partitions" +msgstr "დანაყოფები" + +msgid "No HSM devices available" +msgstr "HSM მოწყობილობები მიუწვდომელია" + +msgid "Partitions to be encrypted" +msgstr "დასაშიფრი დანაყოფები" + +msgid "Select disk encryption option" +msgstr "აირჩიეთ დისკის დაშიფვრის პარამეტრი" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "აირჩიეთ HSM-სთვის გამოსაყენებელი FIDO2 მოწყობილობა" + +msgid "All settings will be reset, are you sure?" +msgstr "ყველა პარამეტრი დაბრუნდება. დარწმუნებული ბრძანდებით?" + +msgid "Back" +msgstr "უკან" + +msgid "Disk encryption" +msgstr "დისკის დაშიფვრა" + +msgid "Password" +msgstr "პაროლი" + +msgid "Partition encryption" +msgstr "დანაყოფის დაშიფვრა" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "შეიყვანეთ საწყისი სექტორი (პროცენტებში ან ბლოკის ნომერი. ნაგულისხმები: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "შეიყვანეთ დანაყოფის ბოლო სექტორი (პროცენტულად ან ბლოკის ნომერი. მაგ: {}): " diff --git a/archinstall/locales/ko/LC_MESSAGES/base.mo b/archinstall/locales/ko/LC_MESSAGES/base.mo Binary files differindex 9f86dafd..4c89f1f8 100644 --- a/archinstall/locales/ko/LC_MESSAGES/base.mo +++ b/archinstall/locales/ko/LC_MESSAGES/base.mo diff --git a/archinstall/locales/ko/LC_MESSAGES/base.po b/archinstall/locales/ko/LC_MESSAGES/base.po index b0a85c64..4363031e 100644 --- a/archinstall/locales/ko/LC_MESSAGES/base.po +++ b/archinstall/locales/ko/LC_MESSAGES/base.po @@ -96,11 +96,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "파티션에 대해 원하는 파일 시스템 유형을 입력하세요" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "시작 섹터를 입력하세요 (백분율 또는 블록 번호, 기본값: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "파티션의 끝 섹터를 입력하세요 (백분율 또는 블록 번호, 예시: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} 에 대기 중인 파티션이 포함되어 있습니다. 그러면 이러한 파티션이 제거됩니다. 정말 진행하시겠습니까?" @@ -763,7 +763,8 @@ msgstr "입력한 사용자 이름이 잘못되었습니다. 다시 시도하세 msgid "Should \"{}\" be a superuser (sudo)?" msgstr "\"{}\"은(는) 슈퍼유저여야 합니까 (sudo)?" -msgid "Select which partitions to encrypt:" +#, fuzzy +msgid "Select which partitions to encrypt" msgstr "암호화할 파티션을 선택하세요:" msgid "very weak" @@ -836,3 +837,46 @@ msgstr "이 번역을 사용하려면 해당 언어를 지원하는 글꼴을 msgid "The font should be stored as {}" msgstr "글꼴은 {} (으)로 저장해야 합니다" + +#, fuzzy +msgid "Encryption type" +msgstr "비밀번호 암호화" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "암호화할 파티션을 선택하세요:" + +msgid "Select disk encryption option" +msgstr "" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} 에 대기 중인 파티션이 포함되어 있습니다. 그러면 이러한 파티션이 제거됩니다. 정말 진행하시겠습니까?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "루트 비밀번호" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "시작 섹터를 입력하세요 (백분율 또는 블록 번호, 기본값: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "파티션의 끝 섹터를 입력하세요 (백분율 또는 블록 번호, 예시: {}): " diff --git a/archinstall/locales/languages.json b/archinstall/locales/languages.json index 2c876041..1e33dcde 100644 --- a/archinstall/locales/languages.json +++ b/archinstall/locales/languages.json @@ -68,7 +68,7 @@ {"abbr": "iu", "lang": "Inuktitut"}, {"abbr": "ie", "lang": "Interlingue"}, {"abbr": "ia", "lang": "Interlingua (International Auxiliary Language Association)"}, - {"abbr": "id", "lang": "Indonesian", "translated_lang": "Indonesia"}, + {"abbr": "id", "lang": "Indonesian", "translated_lang": "Indonesian"}, {"abbr": "ik", "lang": "Inupiaq"}, {"abbr": "is", "lang": "Icelandic"}, {"abbr": "it", "lang": "Italian", "translated_lang": "Italiano"}, @@ -146,7 +146,7 @@ {"abbr": "sd", "lang": "Sindhi"}, {"abbr": "so", "lang": "Somali"}, {"abbr": "st", "lang": "Southern Sotho"}, - {"abbr": "es", "lang": "Spanish", "translated_lang": "Española"}, + {"abbr": "es", "lang": "Spanish", "translated_lang": "Español"}, {"abbr": "sq", "lang": "Albanian"}, {"abbr": "sc", "lang": "Sardinian"}, {"abbr": "sr", "lang": "Serbian"}, diff --git a/archinstall/locales/nl/LC_MESSAGES/base.mo b/archinstall/locales/nl/LC_MESSAGES/base.mo Binary files differindex 62b7af82..222f21e9 100644 --- a/archinstall/locales/nl/LC_MESSAGES/base.mo +++ b/archinstall/locales/nl/LC_MESSAGES/base.mo diff --git a/archinstall/locales/nl/LC_MESSAGES/base.po b/archinstall/locales/nl/LC_MESSAGES/base.po index b7323059..7f3de195 100644 --- a/archinstall/locales/nl/LC_MESSAGES/base.po +++ b/archinstall/locales/nl/LC_MESSAGES/base.po @@ -97,11 +97,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Kies het gewenste bestandssysteem voor de partitie" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Voer de beginsector in (percentage of bloknummer - standaard: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Voer de eindsector in (percentage of bloknummer - bijvoorbeeld: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "‘{}’ bevat in behandeling zijnde partities, welke hierdoor worden verwijderd. Weet u zeker dat u wilt doorgaan?" @@ -856,8 +856,58 @@ msgstr "" msgid "TAB to select" msgstr "" -#~ msgid "Select disk layout" -#~ msgstr "Kies een schijfindeling" +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +#, fuzzy +msgid "Encryption type" +msgstr "Versleutelwachtwoord instellen" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Kies welke partitie moet worden versleuteld" + +#, fuzzy +msgid "Select disk encryption option" +msgstr "Kies een schijfindeling" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "‘{}’ bevat in behandeling zijnde partities, welke hierdoor worden verwijderd. Weet u zeker dat u wilt doorgaan?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Rootwachtwoord" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Voer de beginsector in (percentage of bloknummer - standaard: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Voer de eindsector in (percentage of bloknummer - bijvoorbeeld: {}): " #~ msgid "Add :" #~ msgstr "Toevoegen:" diff --git a/archinstall/locales/pl/LC_MESSAGES/base.mo b/archinstall/locales/pl/LC_MESSAGES/base.mo Binary files differindex 0e8e7bef..7ca4f9b0 100644 --- a/archinstall/locales/pl/LC_MESSAGES/base.mo +++ b/archinstall/locales/pl/LC_MESSAGES/base.mo diff --git a/archinstall/locales/pl/LC_MESSAGES/base.po b/archinstall/locales/pl/LC_MESSAGES/base.po index 6655bbbd..ec4fcbd4 100644 --- a/archinstall/locales/pl/LC_MESSAGES/base.po +++ b/archinstall/locales/pl/LC_MESSAGES/base.po @@ -1,14 +1,14 @@ msgid "" msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" "Last-Translator: MedzikUser <medzik@duck.com>\n" "Language-Team: \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Project-Id-Version: \n" -"POT-Creation-Date: \n" -"PO-Revision-Date: \n" "X-Generator: Poedit 2.4.2\n" msgid "[!] A log file has been created here: {} {}" @@ -96,11 +96,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Wprowadź typ systemu plików dla partycji" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Wprowadź sektor początkowy (procent lub numer bloku, domyślnie: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Wprowadź sektor końcowy (procent lub numer bloku, domyślnie: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} zawiera partycje oczekujące w kolejce, to spowoduje ich usunięcie, czy jesteś pewien?" @@ -830,8 +830,58 @@ msgstr "Naciśnij Ctrl+C, aby zresetować" msgid "TAB to select" msgstr "Naciśnij Tab, aby wybrać" -#~ msgid "Select disk layout" -#~ msgstr "Wybierz układ dysku" +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +#, fuzzy +msgid "Encryption type" +msgstr "Hasło szyfrujące" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Wybierz partycja która ma zostać zaszyfrowana" + +#, fuzzy +msgid "Select disk encryption option" +msgstr "Wybierz układ dysku" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} zawiera partycje oczekujące w kolejce, to spowoduje ich usunięcie, czy jesteś pewien?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Hasło użytkownika root" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Wprowadź sektor początkowy (procent lub numer bloku, domyślnie: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Wprowadź sektor końcowy (procent lub numer bloku, domyślnie: {}): " #~ msgid "Add :" #~ msgstr "Dodaj :" diff --git a/archinstall/locales/pt/LC_MESSAGES/base.mo b/archinstall/locales/pt/LC_MESSAGES/base.mo Binary files differindex 113b26a6..99fd4b02 100644 --- a/archinstall/locales/pt/LC_MESSAGES/base.mo +++ b/archinstall/locales/pt/LC_MESSAGES/base.mo diff --git a/archinstall/locales/pt/LC_MESSAGES/base.po b/archinstall/locales/pt/LC_MESSAGES/base.po index 683de0ad..4f772aae 100644 --- a/archinstall/locales/pt/LC_MESSAGES/base.po +++ b/archinstall/locales/pt/LC_MESSAGES/base.po @@ -95,11 +95,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Escreve o tipo de sistema de ficheiros desejado para a partição" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Escreve o sector de início (percentagem ou número de bloco, padrão: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Escreve o sector final da partição (percentagem ou número de bloco, ex: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} contem partições em fila, isto irá remover essas, tens a certeza?" @@ -878,8 +878,58 @@ msgstr "" msgid "TAB to select" msgstr "" -#~ msgid "Select disk layout" -#~ msgstr "Seleciona o esquema de disco" +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +#, fuzzy +msgid "Encryption type" +msgstr "Define a palavra-passe de encriptação" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Seleciona a partição a marcar como encriptada" + +#, fuzzy +msgid "Select disk encryption option" +msgstr "Seleciona o esquema de disco" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} contem partições em fila, isto irá remover essas, tens a certeza?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Palavra-passe de root" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Escreve o sector de início (percentagem ou número de bloco, padrão: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Escreve o sector final da partição (percentagem ou número de bloco, ex: {}): " #~ msgid "Add :" #~ msgstr "Adicionar :" diff --git a/archinstall/locales/pt_BR/LC_MESSAGES/base.mo b/archinstall/locales/pt_BR/LC_MESSAGES/base.mo Binary files differindex 931e0ddf..bcffafbf 100644 --- a/archinstall/locales/pt_BR/LC_MESSAGES/base.mo +++ b/archinstall/locales/pt_BR/LC_MESSAGES/base.mo diff --git a/archinstall/locales/pt_BR/LC_MESSAGES/base.po b/archinstall/locales/pt_BR/LC_MESSAGES/base.po index 938f5068..33e78a20 100644 --- a/archinstall/locales/pt_BR/LC_MESSAGES/base.po +++ b/archinstall/locales/pt_BR/LC_MESSAGES/base.po @@ -94,11 +94,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Digite o tipo de sistema de arquivos desejado para a partição" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Digite o setor de início (porcentagem ou número do bloco, padrão: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Digite o setor final da partição (porcentagem ou número de bloco, ex.: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} contém partições em fila, isto irá removê-las, tem certeza?" @@ -835,3 +835,46 @@ msgstr "Para poder usar esta tradução, instale manualmente uma fonte que supor msgid "The font should be stored as {}" msgstr "A fonte deve ser armazenada como {}" + +#, fuzzy +msgid "Encryption type" +msgstr "Senha de encriptação" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Selecione quais partições encriptar" + +msgid "Select disk encryption option" +msgstr "" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} contém partições em fila, isto irá removê-las, tem certeza?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Senha de root" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Digite o setor de início (porcentagem ou número do bloco, padrão: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Digite o setor final da partição (porcentagem ou número de bloco, ex.: {}): " diff --git a/archinstall/locales/ru/LC_MESSAGES/base.mo b/archinstall/locales/ru/LC_MESSAGES/base.mo Binary files differindex 8b3f0ae4..0fe08128 100644 --- a/archinstall/locales/ru/LC_MESSAGES/base.mo +++ b/archinstall/locales/ru/LC_MESSAGES/base.mo diff --git a/archinstall/locales/ru/LC_MESSAGES/base.po b/archinstall/locales/ru/LC_MESSAGES/base.po index a62a8385..1a33881f 100644 --- a/archinstall/locales/ru/LC_MESSAGES/base.po +++ b/archinstall/locales/ru/LC_MESSAGES/base.po @@ -97,11 +97,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Введите желаемый тип файловой системы для раздела" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Введите начальный сектор (процент или номер блока, по умолчанию: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Введите конечный сектор раздела (процент или номер блока, например: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} содержит разделы в очереди, это удалит их, вы уверены?" @@ -832,6 +832,55 @@ msgstr "TAB, чтобы выбрать" msgid "[Default value: 0] > " msgstr "[Значение по умолчанию: 0] > " +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "Чтобы иметь возможность использовать этот перевод, пожалуйста, установите вручную шрифт, поддерживающий данный язык." + +msgid "The font should be stored as {}" +msgstr "Шрифт должен быть сохранен как {}" + +#, fuzzy +msgid "Encryption type" +msgstr "Пароль шифрования" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Выберите разделы для шифрования" + +msgid "Select disk encryption option" +msgstr "" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} содержит разделы в очереди, это удалит их, вы уверены?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Пароль root" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Введите начальный сектор (процент или номер блока, по умолчанию: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Введите конечный сектор раздела (процент или номер блока, например: {}): " + #, python-brace-format #~ msgid "Edit {origkey} :" #~ msgstr "Редактировать {origkey}:" diff --git a/archinstall/locales/sv/LC_MESSAGES/base.mo b/archinstall/locales/sv/LC_MESSAGES/base.mo Binary files differindex f2798bd4..243f1d9f 100644 --- a/archinstall/locales/sv/LC_MESSAGES/base.mo +++ b/archinstall/locales/sv/LC_MESSAGES/base.mo diff --git a/archinstall/locales/sv/LC_MESSAGES/base.po b/archinstall/locales/sv/LC_MESSAGES/base.po index fc311551..61755a2c 100644 --- a/archinstall/locales/sv/LC_MESSAGES/base.po +++ b/archinstall/locales/sv/LC_MESSAGES/base.po @@ -97,11 +97,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Mata in önskad filsystemtyp för partition" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Mata in startsektor (procent eller block-nummer, standard: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Mata in slutsektor för partitionen (procent eller block-nummer, ex: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} innehåller uppköade partitionen och detta kommer ta bort dessa. Är du säker?" @@ -837,5 +837,55 @@ msgstr "" msgid "TAB to select" msgstr "" -#~ msgid "Select disk layout" -#~ msgstr "Välj hårddisk-layout" +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +#, fuzzy +msgid "Encryption type" +msgstr "Välj ett krypterings-lösenord" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Välj vilken partition som skall markeras för kryptering" + +#, fuzzy +msgid "Select disk encryption option" +msgstr "Välj hårddisk-layout" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} innehåller uppköade partitionen och detta kommer ta bort dessa. Är du säker?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "root-lösenord" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Mata in startsektor (procent eller block-nummer, standard: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Mata in slutsektor för partitionen (procent eller block-nummer, ex: {}): " diff --git a/archinstall/locales/ta/LC_MESSAGES/base.mo b/archinstall/locales/ta/LC_MESSAGES/base.mo Binary files differindex 20b8a7f5..3f175509 100644 --- a/archinstall/locales/ta/LC_MESSAGES/base.mo +++ b/archinstall/locales/ta/LC_MESSAGES/base.mo diff --git a/archinstall/locales/ta/LC_MESSAGES/base.po b/archinstall/locales/ta/LC_MESSAGES/base.po index 4375f477..4f1d6762 100644 --- a/archinstall/locales/ta/LC_MESSAGES/base.po +++ b/archinstall/locales/ta/LC_MESSAGES/base.po @@ -96,11 +96,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "பகிர்வுக்கு தேவையான கோப்பு முறைமை வகையை உள்ளிடவும்" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "தொடக்கப் பிரிவை உள்ளிடவும் (சதவீதம் அல்லது தொகுதி எண், இயல்புநிலை: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "பகிர்வின் இறுதிப் பகுதியை உள்ளிடவும் (சதவீதம் அல்லது தொகுதி எண், எ.கா: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} வரிசைப்படுத்தப்பட்ட பகிர்வுகளைக் கொண்டுள்ளது, இது அவற்றை அகற்றும், நீங்கள் உறுதியாக இருக்கிறீர்களா?" @@ -827,3 +827,55 @@ msgstr "மீட்டமைக்க CTRL+C" msgid "TAB to select" msgstr "தேர்ந்தெடுக்க TAB" + +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +#, fuzzy +msgid "Encryption type" +msgstr "குறியாக்கம் கடவுச்சொல்" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "குறியாக்கம் செய்ய வேண்டிய பகிர்வுகளைத் தேர்ந்தெடுக்கவும்" + +msgid "Select disk encryption option" +msgstr "" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} வரிசைப்படுத்தப்பட்ட பகிர்வுகளைக் கொண்டுள்ளது, இது அவற்றை அகற்றும், நீங்கள் உறுதியாக இருக்கிறீர்களா?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "ரூட் கடவுச்சொல்" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "தொடக்கப் பிரிவை உள்ளிடவும் (சதவீதம் அல்லது தொகுதி எண், இயல்புநிலை: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "பகிர்வின் இறுதிப் பகுதியை உள்ளிடவும் (சதவீதம் அல்லது தொகுதி எண், எ.கா: {}): " diff --git a/archinstall/locales/tr/LC_MESSAGES/base.mo b/archinstall/locales/tr/LC_MESSAGES/base.mo Binary files differindex 6a205da9..2e9d1258 100644 --- a/archinstall/locales/tr/LC_MESSAGES/base.mo +++ b/archinstall/locales/tr/LC_MESSAGES/base.mo diff --git a/archinstall/locales/tr/LC_MESSAGES/base.po b/archinstall/locales/tr/LC_MESSAGES/base.po index fd1e2393..f17efd3f 100644 --- a/archinstall/locales/tr/LC_MESSAGES/base.po +++ b/archinstall/locales/tr/LC_MESSAGES/base.po @@ -97,11 +97,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Disk bölümü için arzu edilen bir dosya systemi tipi girin" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Başlangıç kesimini girin (yüzde ya da blok numarası, varsayılan: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Disk bölümünün bitiş kesimini girin (yüzde ya da blok numarası, ör: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} işlem sırasında bekleyen disk bölümleri bulunduruyor, bu onları kaldıracak, emin misiniz?" @@ -836,3 +836,55 @@ msgstr "" msgid "TAB to select" msgstr "" + +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +#, fuzzy +msgid "Encryption type" +msgstr "Şifreleme şifresi" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "Hangi disk bölümünün şifrelenmiş olarak işaretleneceğini seçin" + +msgid "Select disk encryption option" +msgstr "" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} işlem sırasında bekleyen disk bölümleri bulunduruyor, bu onları kaldıracak, emin misiniz?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Root (kök) şifresi" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Başlangıç kesimini girin (yüzde ya da blok numarası, varsayılan: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Disk bölümünün bitiş kesimini girin (yüzde ya da blok numarası, ör: {}): " diff --git a/archinstall/locales/uk/LC_MESSAGES/base.mo b/archinstall/locales/uk/LC_MESSAGES/base.mo Binary files differindex 1e0486a2..ae98dcfb 100644 --- a/archinstall/locales/uk/LC_MESSAGES/base.mo +++ b/archinstall/locales/uk/LC_MESSAGES/base.mo diff --git a/archinstall/locales/uk/LC_MESSAGES/base.po b/archinstall/locales/uk/LC_MESSAGES/base.po index 3589df98..ee9740fc 100644 --- a/archinstall/locales/uk/LC_MESSAGES/base.po +++ b/archinstall/locales/uk/LC_MESSAGES/base.po @@ -96,11 +96,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Введіть бажаний тип файлової системи для розділу" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "Введіть початковий сектор (відсоток або номер блоку, за замовчуванням: {}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "Введіть кінцевий сектор розділу (відсоток або номер блоку, наприклад: {}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} містить розділи в черзі, це видалить їх, ви впевнені?" @@ -855,9 +855,6 @@ msgstr "Оберіть параметр шифрування диска" msgid "Select a FIDO2 device to use for HSM" msgstr "Оберіть пристрій FIDO2 для використання для HSM" -msgid "Partition encryption" -msgstr "Шифрування розділу" - msgid "All settings will be reset, are you sure?" msgstr "Усі налаштування буде скинуто, ви впевнені?" @@ -869,3 +866,12 @@ msgstr "Disk encryption" msgid "Password" msgstr "Пароль" + +msgid "Partition encryption" +msgstr "Шифрування розділу" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "Введіть початковий сектор (відсоток або номер блоку, за замовчуванням: {}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "Введіть кінцевий сектор розділу (відсоток або номер блоку, наприклад: {}): " diff --git a/archinstall/locales/ur/LC_MESSAGES/base.mo b/archinstall/locales/ur/LC_MESSAGES/base.mo Binary files differindex 44e38ad4..e788d932 100644 --- a/archinstall/locales/ur/LC_MESSAGES/base.mo +++ b/archinstall/locales/ur/LC_MESSAGES/base.mo diff --git a/archinstall/locales/ur/LC_MESSAGES/base.po b/archinstall/locales/ur/LC_MESSAGES/base.po index 0b024031..4e3d7a10 100644 --- a/archinstall/locales/ur/LC_MESSAGES/base.po +++ b/archinstall/locales/ur/LC_MESSAGES/base.po @@ -96,11 +96,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "اس پارٹیشن کے لیے مطلوبہ فائل سسٹم درج کریں" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "اسٹارٹ سیکٹر درج کریں (فیصد یا بلاک نمبر، ڈیفالٹ: {}):" +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "پارٹیشن کا آخری سیکٹر درج کریں (فیصد یا بلاک نمبر، مثال کے طور پر: {}):" +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} پارٹیشنزکے گروپ پر مشتمل ہے، یہ ان کو مٹا دے گا، کیا آپ پر اعتماد ہیں؟" @@ -858,8 +858,58 @@ msgstr "" msgid "TAB to select" msgstr "" -#~ msgid "Select disk layout" -#~ msgstr "ڈسک لے آؤٹ کو منتخب کریں" +msgid "[Default value: 0] > " +msgstr "" + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "" + +msgid "The font should be stored as {}" +msgstr "" + +#, fuzzy +msgid "Encryption type" +msgstr "انکرپشن پاس ورڈ سیٹ کریں" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "منتخب کریں کہ کس پارٹیشن کو انکرپٹڈ یا خفیہ رکھنا ہے" + +#, fuzzy +msgid "Select disk encryption option" +msgstr "ڈسک لے آؤٹ کو منتخب کریں" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} پارٹیشنزکے گروپ پر مشتمل ہے، یہ ان کو مٹا دے گا، کیا آپ پر اعتماد ہیں؟" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "روٹ پاس ورڈ" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "اسٹارٹ سیکٹر درج کریں (فیصد یا بلاک نمبر، ڈیفالٹ: {}):" + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "پارٹیشن کا آخری سیکٹر درج کریں (فیصد یا بلاک نمبر، مثال کے طور پر: {}):" #~ msgid "Add :" #~ msgstr "شامل:" diff --git a/archinstall/locales/zh-CN/LC_MESSAGES/base.mo b/archinstall/locales/zh-CN/LC_MESSAGES/base.mo Binary files differindex 70cb4064..693308ab 100644 --- a/archinstall/locales/zh-CN/LC_MESSAGES/base.mo +++ b/archinstall/locales/zh-CN/LC_MESSAGES/base.mo diff --git a/archinstall/locales/zh-CN/LC_MESSAGES/base.po b/archinstall/locales/zh-CN/LC_MESSAGES/base.po index 60f88a01..d957204b 100644 --- a/archinstall/locales/zh-CN/LC_MESSAGES/base.po +++ b/archinstall/locales/zh-CN/LC_MESSAGES/base.po @@ -96,11 +96,11 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "为分区输入所需的文件系统类型" -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "输入起始扇区(百分比或块号,默认:{}): " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" -msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " -msgstr "输入分区的结束扇区(百分比或块号,例如:{}): " +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "" msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} 包含排队分区,这将删除这些分区,您确定吗?" @@ -761,7 +761,8 @@ msgstr "您输入的用户名无效。 再试一次" msgid "Should \"{}\" be a superuser (sudo)?" msgstr "将 \"{}\" 设置为超级用户(sudo)吗?" -msgid "Select which partitions to encrypt:" +#, fuzzy +msgid "Select which partitions to encrypt" msgstr "选择要加密的分区:" msgid "very weak" @@ -834,3 +835,46 @@ msgstr "为了能够使用此翻译,请手动安装支持该语言的字体。 msgid "The font should be stored as {}" msgstr "字体应存储为 {}" + +#, fuzzy +msgid "Encryption type" +msgstr "加密密码" + +msgid "Partitions" +msgstr "" + +msgid "No HSM devices available" +msgstr "" + +#, fuzzy +msgid "Partitions to be encrypted" +msgstr "选择要加密的分区:" + +msgid "Select disk encryption option" +msgstr "" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "" + +#, fuzzy +msgid "All settings will be reset, are you sure?" +msgstr "{} 包含排队分区,这将删除这些分区,您确定吗?" + +msgid "Back" +msgstr "" + +msgid "Disk encryption" +msgstr "" + +#, fuzzy +msgid "Password" +msgstr "Root 密码" + +msgid "Partition encryption" +msgstr "" + +#~ msgid "Enter the start sector (percentage or block number, default: {}): " +#~ msgstr "输入起始扇区(百分比或块号,默认:{}): " + +#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " +#~ msgstr "输入分区的结束扇区(百分比或块号,例如:{}): " diff --git a/docs/examples/python.rst b/docs/examples/python.rst index c3904863..dfc0abb3 100644 --- a/docs/examples/python.rst +++ b/docs/examples/python.rst @@ -35,10 +35,10 @@ To do this, we'll begin by importing `archinstall` in our `./archinstall/example import archinstall - all_drives = archinstall.list_drives() - print(all_drives) + all_drives = archinstall.all_blockdevices(partitions=False) + print(list(all_drives.keys())) -This should print out a list of drives and some meta-information about them. +This should print out a list of drives. As an example, this will do just fine. Now, go ahead and install the library either as a user-module or system-wide. diff --git a/docs/installing/guided.rst b/docs/installing/guided.rst index b7d4db4f..4cb07ae1 100644 --- a/docs/installing/guided.rst +++ b/docs/installing/guided.rst @@ -115,9 +115,9 @@ Options for ``--config`` +----------------------+--------------------------------------------------------+---------------------------------------------------------------------------------------------+-----------------------------------------------+ | hostname | any | Hostname of machine after installation. Default will be ``archinstall`` | No | +----------------------+--------------------------------------------------------+---------------------------------------------------------------------------------------------+-----------------------------------------------+ -| kernels | [ "kernel1", "kernel2"] | List of kernels to install eg: linux, linux-lts, linux-zen etc | At least 1 | +| kernels | [ "kernel1", "kernel2"] | List of kernels to install eg: linux, linux-lts, linux-zen etc | At least 1 | +----------------------+--------------------------------------------------------+---------------------------------------------------------------------------------------------+-----------------------------------------------+ -| keyboard-language | Any valid layout given by ``localectl list-keymaps`` | eg: ``us``, ``de`` or ``de-latin1`` etc. Defaults to ``us`` | No | +| keyboard-layout | Any valid layout given by ``localectl list-keymaps`` | eg: ``us``, ``de`` or ``de-latin1`` etc. Defaults to ``us`` | No | +----------------------+--------------------------------------------------------+---------------------------------------------------------------------------------------------+-----------------------------------------------+ | mirror-region | | {"<Region Name>": { "Mirror URL": True/False}, ..} | | Defaults to automatic selection. | No | | | | "Worldwide" or "Sweden" | | Either takes a dictionary structure of region and a given set of mirrors. | | diff --git a/examples/guided.py b/examples/guided.py index f0b52299..e9240c03 100644 --- a/examples/guided.py +++ b/examples/guided.py @@ -146,14 +146,6 @@ def perform_installation(mountpoint): if partition.size < 0.19: # ~200 MiB in GiB raise archinstall.DiskError(f"The selected /boot partition in use is not large enough to properly install a boot loader. Please resize it to at least 200MiB and re-run the installation.") - # if len(mirrors): - # Certain services might be running that affects the system during installation. - # Currently, only one such service is "reflector.service" which updates /etc/pacman.d/mirrorlist - # We need to wait for it before we continue since we opted in to use a custom mirror/region. - installation.log('Waiting for automatic mirror selection (reflector) to complete.', level=logging.INFO) - while archinstall.service_state('reflector') not in ('dead', 'failed'): - time.sleep(1) - # If we've activated NTP, make sure it's active in the ISO too and # make sure at least one time-sync finishes before we continue with the installation if archinstall.arguments.get('ntp', False): @@ -175,6 +167,22 @@ def perform_installation(mountpoint): installation.log(f"Waiting for timedatectl timesync-status to report a timesync against a server", level=logging.INFO) logged = True time.sleep(1) + + # if len(mirrors): + # Certain services might be running that affects the system during installation. + # Currently, only one such service is "reflector.service" which updates /etc/pacman.d/mirrorlist + # We need to wait for it before we continue since we opted in to use a custom mirror/region. + installation.log('Waiting for automatic mirror selection (reflector) to complete.', level=logging.INFO) + while archinstall.service_state('reflector') not in ('dead', 'failed', 'exited'): + time.sleep(1) + + installation.log('Waiting pacman-init.service to complete.', level=logging.INFO) + while archinstall.service_state('pacman-init') not in ('dead', 'failed', 'exited'): + time.sleep(1) + + installation.log('Waiting Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete.', level=logging.INFO) + while archinstall.service_state('archlinux-keyring-wkd-sync') not in ('dead', 'failed', 'exited'): + time.sleep(1) # Set mirrors used by pacstrap (outside of installation) if archinstall.arguments.get('mirror-region', None): @@ -279,28 +287,6 @@ if archinstall.arguments.get('skip-mirror-check', False) is False and archinstal archinstall.log(f"Arch Linux mirrors are not reachable. Please check your internet connection and the log file '{log_file}'.", level=logging.INFO, fg="red") exit(1) -if not archinstall.arguments.get('offline'): - latest_version_archlinux_keyring = max([k.pkg_version for k in archinstall.find_package('archlinux-keyring')]) - - # For now always update for now, we don't have the coresponding package search API - if archinstall.arguments.get('skip-keyring-update', False) is False: - # Then we update the keyring in the ISO environment - if not archinstall.update_keyring32(): - log_file = os.path.join(archinstall.storage.get('LOG_PATH', None), archinstall.storage.get('LOG_FILE', None)) - archinstall.log(f"Failed to update the Arch32 keyring. Please check your internet connection and the log file '{log_file}'.", level=logging.INFO, fg="red") - exit(1) - - # If we want to check for keyring updates - # and the installed package version is lower than the upstream version - if archinstall.arguments.get('skip-keyring-update', False) is False and \ - archinstall.installed_package('archlinux-keyring').version < latest_version_archlinux_keyring: - - # Then we update the keyring in the ISO environment - if not archinstall.update_keyring(): - log_file = os.path.join(archinstall.storage.get('LOG_PATH', None), archinstall.storage.get('LOG_FILE', None)) - archinstall.log(f"Failed to update the keyring. Please check your internet connection and the log file '{log_file}'.", level=logging.INFO, fg="red") - exit(1) - if not archinstall.arguments.get('silent'): ask_user_questions() diff --git a/profiles/budgie.py b/profiles/budgie.py index 3e4a85df..33484680 100644 --- a/profiles/budgie.py +++ b/profiles/budgie.py @@ -4,12 +4,14 @@ import archinstall is_top_level_profile = False -# "It is recommended also to install the gnome group, which contains applications required for the standard GNOME experience." - Arch Wiki __packages__ = [ - "budgie-desktop", - "gnome", + "arc-gtk-theme", + "budgie", "lightdm", "lightdm-gtk-greeter", + "mate-terminal", + "nemo", + "papirus-icon-theme", ] diff --git a/profiles/i3.py b/profiles/i3.py index 37029a02..d9b98b77 100644 --- a/profiles/i3.py +++ b/profiles/i3.py @@ -1,14 +1,13 @@ -# Common package for i3, lets user select which i3 configuration they want. +# Common package for i3. import archinstall -from archinstall import Menu -from archinstall.lib.menu.menu import MenuSelectionType is_top_level_profile = False # New way of defining packages for a profile, which is iterable and can be used out side # of the profile to get a list of "what packages will be installed". __packages__ = [ + 'i3-wm', 'i3lock', 'i3status', 'i3blocks', @@ -27,28 +26,13 @@ def _prep_function(*args, **kwargs): for more input before any other installer steps start. """ - supported_configurations = ['i3-wm', 'i3-gaps'] - - choice = Menu('Select your desired configuration', supported_configurations).run() - - if choice.type_ != MenuSelectionType.Selection: - return False - - if choice.value: - # Temporarily store the selected desktop profile - # in a session-safe location, since this module will get reloaded - # the next time it gets executed. - archinstall.storage['_i3_configuration'] = choice.value - - # i3 requires a functioning Xorg installation. - profile = archinstall.Profile(None, 'xorg') - with profile.load_instructions(namespace='xorg.py') as imported: - if hasattr(imported, '_prep_function'): - return imported._prep_function() - else: - print('Deprecated (??): xorg profile has no _prep_function() anymore') - - return False + # i3 requires a functioning Xorg installation. + profile = archinstall.Profile(None, 'xorg') + with profile.load_instructions(namespace='xorg.py') as imported: + if hasattr(imported, '_prep_function'): + return imported._prep_function() + else: + print('Deprecated (??): xorg profile has no _prep_function() anymore') if __name__ == 'i3': @@ -65,17 +49,11 @@ if __name__ == 'i3': this is therefore just a helper to get started """ - # Install common packages for all i3 configurations - archinstall.storage['installation_session'].add_additional_packages(__packages__[:4]) - # Install dependency profiles archinstall.storage['installation_session'].install_profile('xorg') - # gaps is installed by default so we are overriding it here with lightdm - archinstall.storage['installation_session'].add_additional_packages(__packages__[4:]) + # Install the i3 packages + archinstall.storage['installation_session'].add_additional_packages(__packages__) - # Auto start lightdm for all users + # Enable autostart of lightdm for all users archinstall.storage['installation_session'].enable_service('lightdm') - - # install the i3 group now - archinstall.storage['installation_session'].add_additional_packages(archinstall.storage['_i3_configuration']) diff --git a/profiles/sway.py b/profiles/sway.py index b7266da3..5fbd3365 100644 --- a/profiles/sway.py +++ b/profiles/sway.py @@ -1,6 +1,12 @@ # A desktop environment using "Sway" +from typing import Any, TYPE_CHECKING + import archinstall from archinstall import Menu +from archinstall.lib.menu.menu import MenuSelectionType + +if TYPE_CHECKING: + _: Any is_top_level_profile = False @@ -22,7 +28,7 @@ def _check_driver() -> bool: packages = archinstall.storage.get("gfx_driver_packages", []) if packages and "nvidia" in packages: - prompt = 'The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues, are you okay with that?' + prompt = _('The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues, are you okay with that?') choice = Menu(prompt, Menu.yes_no(), default_option=Menu.no(), skip=False).run() if choice.value == Menu.no(): @@ -30,6 +36,18 @@ def _check_driver() -> bool: return True +def _get_system_privelege_control_preference(): + # need to activate seat service and add to seat group + title = str(_('Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)')) + title += str(_('\n\nChoose an option to give Sway access to your hardware')) + choice = Menu(title, ["polkit", "seatd"]).run() + + if choice.type_ != MenuSelectionType.Selection: + return False + + archinstall.storage['sway_sys_priv_ctrl'] = [choice.value] + archinstall.arguments['sway_sys_priv_ctrl'] = [choice.value] + return True def _prep_function(*args, **kwargs): """ @@ -38,6 +56,9 @@ def _prep_function(*args, **kwargs): other code in this stage. So it's a safe way to ask the user for more input before any other installer steps start. """ + if not _get_system_privelege_control_preference(): + return False + driver = archinstall.select_driver() if driver: @@ -49,15 +70,29 @@ def _prep_function(*args, **kwargs): return False +""" +def _post_install(*args, **kwargs): + if "seatd" in sway_sys_priv_ctrl: + print(_('After booting, add user(s) to the `seat` user group and re-login to use Sway')) + return True +""" + # Ensures that this code only gets executed if executed # through importlib.util.spec_from_file_location("sway", "/somewhere/sway.py") # or through conventional import sway if __name__ == "sway": if not _check_driver(): - raise archinstall.lib.exceptions.HardwareIncompatibilityError("Sway does not support the proprietary nvidia drivers.") + raise archinstall.lib.exceptions.HardwareIncompatibilityError(_('Sway does not support the proprietary nvidia drivers.')) # Install the Sway packages archinstall.storage['installation_session'].add_additional_packages(__packages__) + if "seatd" in archinstall.storage['sway_sys_priv_ctrl']: + archinstall.storage['installation_session'].add_additional_packages(['seatd']) + archinstall.storage['installation_session'].enable_service('seatd') + elif "polkit" in archinstall.storage['sway_sys_priv_ctrl']: + archinstall.storage['installation_session'].add_additional_packages(['polkit']) + else: + raise archinstall.lib.exceptions.ProfileError(_('Sway requires either seatd or polkit to run')) # Install the graphics driver packages archinstall.storage['installation_session'].add_additional_packages(f"xorg-server xorg-xinit {' '.join(archinstall.storage.get('gfx_driver_packages', None))}") diff --git a/pyproject.toml b/pyproject.toml index 207dace5..6e0fcb99 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,24 +1,24 @@ [build-system] -requires = ["flit_core >=3.5.1,<4", "setuptools>=45", "wheel"] -build-backend = "flit_core.buildapi" +requires = ["setuptools>=67.5"] +build-backend = "setuptools.build_meta" [project] name = "archinstall" -dynamic = ["version"] +dynamic = ["version", "entry-points"] description = "Arch Linux installer - guided, templates etc." authors = [ {name = "Anton Hvornum", email = "anton@hvornum.se"}, ] +license = {text = "GPL-3.0-only"} readme = "README.md" requires-python = ">=3.10" keywords = ["linux", "arch", "archinstall", "installer"] classifiers = [ - "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", - "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Programming Language :: Python :: 3.10", "Operating System :: POSIX :: Linux", ] @@ -27,20 +27,29 @@ Home = "https://archlinux.org" Documentation = "https://archinstall.readthedocs.io/" Source = "https://github.com/archlinux/archinstall" +[project.optional-dependencies] +doc = ["sphinx"] + [project.scripts] archinstall = "archinstall:run_as_a_module" -[project.optional-dependencies] -doc = ["sphinx"] +[tool.setuptools] +packages = ["archinstall", "profiles", "examples"] + +[tool.setuptools.package-data] +archinstall = [ + "examples/*.py", + "profiles/*.py", + "profiles/applications/*.py" +] -[tool.flit.sdist] -include = ["docs/", "profiles", "examples", "archinstall/profiles", "archinstall/examples"] -exclude = ["docs/*.html", "docs/_static", "docs/*.png", "docs/*.psd"] +[tool.setuptools.dynamic] +version = {attr = "archinstall.__version__"} [tool.mypy] python_version = "3.10" exclude = "tests" [tool.bandit] -targets = ["ourkvm"] +targets = ["archinstall"] exclude = ["/tests"] diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 8c9c087e..00000000 --- a/setup.cfg +++ /dev/null @@ -1,39 +0,0 @@ -[metadata] -name = archinstall -version = attr: archinstall.__version__ -description = Arch Linux installer - guided, templates etc. -author = Anton Hvornum -author_email = anton@hvornum.se -long_description = file: README.md -long_description_content_type = text/markdown -license = GPL -license_files = - LICENSE -project_urls = - Source = https://github.com/archlinux/archinstall - Documentation = https://archinstall.readthedocs.io/ -classifiers = - Programming Language :: Python :: 3 - Programming Language :: Python :: 3.8 - Programming Language :: Python :: 3.9 - License :: OSI Approved :: GNU General Public License v3 (GPLv3) - Operating System :: POSIX :: Linux - -[options] -packages = find: -python_requires = >= 3.8 - -[options.packages.find] -include = - archinstall - archinstall.* - -[options.package_data] -archinstall = - examples/*.py - profiles/*.py - profiles/applications/*.py - -[options.entry_points] -console_scripts = - archinstall = archinstall:run_as_a_module diff --git a/setup.py b/setup.py deleted file mode 100644 index 639e4434..00000000 --- a/setup.py +++ /dev/null @@ -1,3 +0,0 @@ -import setuptools # type: ignore - -setuptools.setup(package_data={'archinstall': ['locales/*','locales/*/*','locales/*/*/*']}, include_package_data=True) |