From 9fb8d3164ce07e6cd08fe60f2e6f1203ccb8991a Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 6 Feb 2022 21:30:26 +1100 Subject: [PATCH 1/2] Update nationalization (#944) * Update nationalization * Update translations * Finish german translation * Fix errors #943 * Add remaining translations * Fix alignment in menu * Update README * Update translations: * Fix flake8 * Update tz function Co-authored-by: Daniel Girtler --- .gitignore | 2 +- archinstall/__init__.py | 6 +- archinstall/lib/disk/filesystem.py | 10 +- archinstall/lib/disk/user_guides.py | 1 + archinstall/lib/installer.py | 6 +- archinstall/lib/menu/menu.py | 2 +- archinstall/lib/menu/selection_menu.py | 58 ++- archinstall/lib/profiles.py | 4 +- archinstall/lib/translation.py | 13 +- archinstall/lib/user_interaction.py | 82 +-- archinstall/locales/README.md | 6 +- archinstall/locales/base.pot | 453 +++++++++++++---- archinstall/locales/de/LC_MESSAGES/base.mo | Bin 109 -> 14323 bytes archinstall/locales/de/LC_MESSAGES/base.po | 527 +++++++++++++------- archinstall/locales/en/LC_MESSAGES/base.mo | Bin 368 -> 148 bytes archinstall/locales/en/LC_MESSAGES/base.po | 361 +++++++++----- archinstall/locales/en/LC_MESSAGES/base.po~ | 359 ------------- archinstall/locales/it/LC_MESSAGES/base.mo | Bin 98 -> 0 bytes archinstall/locales/it/LC_MESSAGES/base.po | 354 ------------- archinstall/locales/it/LC_MESSAGES/base.po~ | 362 -------------- examples/guided.py | 9 +- examples/only_hd.py | 2 +- 22 files changed, 1058 insertions(+), 1559 deletions(-) delete mode 100644 archinstall/locales/en/LC_MESSAGES/base.po~ delete mode 100644 archinstall/locales/it/LC_MESSAGES/base.mo delete mode 100644 archinstall/locales/it/LC_MESSAGES/base.po delete mode 100644 archinstall/locales/it/LC_MESSAGES/base.po~ diff --git a/.gitignore b/.gitignore index ef051974..a67c3e09 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,4 @@ venv .idea/** **/install.log .DS_Store -**/cmd_history.txt +**/cmd_history.txt \ No newline at end of file diff --git a/archinstall/__init__.py b/archinstall/__init__.py index 58e8af37..4a7339a9 100644 --- a/archinstall/__init__.py +++ b/archinstall/__init__.py @@ -36,7 +36,7 @@ from .lib.systemd import * from .lib.user_interaction import * from .lib.menu import Menu from .lib.menu.selection_menu import GlobalMenu -from .lib.translation import Translation +from .lib.translation import Translation, DeferredTranslation from .lib.plugins import plugins, load_plugin # This initiates the plugin loading ceremony from .lib.configuration import * parser = ArgumentParser() @@ -44,6 +44,10 @@ parser = ArgumentParser() __version__ = "2.4.0-dev0" storage['__version__'] = __version__ +# add the custome _ as a builtin, it can now be used anywhere in the +# project to mark strings as translatable with _('translate me') +DeferredTranslation.install() + def define_arguments(): """ diff --git a/archinstall/lib/disk/filesystem.py b/archinstall/lib/disk/filesystem.py index c8a74e3f..4f1b4217 100644 --- a/archinstall/lib/disk/filesystem.py +++ b/archinstall/lib/disk/filesystem.py @@ -83,7 +83,7 @@ class Filesystem: for partition in layout.get('partitions', []): # We don't want to re-add an existing partition (those containing a UUID already) if partition.get('wipe', False) and not partition.get('PARTUUID', None): - print("Adding partition....") + print(_("Adding partition....")) start = partition.get('start') or ( prev_partition and f'{prev_partition["device_instance"].end_sectors}s' or DEFAULT_PARTITION_START) partition['device_instance'] = self.add_partition(partition.get('type', 'primary'), @@ -94,7 +94,7 @@ class Filesystem: # print('Device instance:', partition['device_instance']) elif (partition_uuid := partition.get('PARTUUID')) and (partition_instance := self.blockdevice.get_partition(uuid=partition_uuid)): - print("Re-using partition_instance:", partition_instance) + print(_("Re-using partition instance: {}").format(partition_instance)) partition['device_instance'] = partition_instance else: raise ValueError(f"{self}.load_layout() doesn't know how to continue without a new partition definition or a UUID ({partition.get('PARTUUID')}) on the device ({self.blockdevice.get_partition(uuid=partition.get('PARTUUID'))}).") @@ -113,7 +113,9 @@ class Filesystem: raise ValueError(f"Missing encryption password for {partition['device_instance']}") from ..user_interaction import get_password - storage['arguments']['!encryption-password'] = get_password(f"Enter a encryption password for {partition['device_instance']}") + + prompt = str(_('Enter a encryption password for {}').format(partition['device_instance'])) + storage['arguments']['!encryption-password'] = get_password(prompt) partition['!password'] = storage['arguments']['!encryption-password'] @@ -136,7 +138,7 @@ class Filesystem: while True: partition['filesystem']['format'] = input(f"Enter a valid fs-type for newly encrypted partition {partition['filesystem']['format']}: ").strip() if not partition['filesystem']['format'] or valid_fs_type(partition['filesystem']['format']) is False: - print("You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's.") + print(_("You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's.")) continue break diff --git a/archinstall/lib/disk/user_guides.py b/archinstall/lib/disk/user_guides.py index 8acb8cd2..90d323c7 100644 --- a/archinstall/lib/disk/user_guides.py +++ b/archinstall/lib/disk/user_guides.py @@ -11,6 +11,7 @@ from ..hardware import has_uefi from ..output import log from ..menu import Menu + def suggest_single_disk_layout(block_device :BlockDevice, default_filesystem :Optional[str] = None, advanced_options :bool = False) -> Dict[str, Any]: diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index cde1ec1d..daac340b 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -141,8 +141,8 @@ class Installer: # We avoid printing /mnt/ because that might confuse people if they note it down # and then reboot, and a identical log file will be found in the ISO medium anyway. - print(f"[!] A log file has been created here: {os.path.join(storage['LOG_PATH'], storage['LOG_FILE'])}") - print(" Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues") + print(_("[!] A log file has been created here: {} {}").format(os.path.join(storage['LOG_PATH'], storage['LOG_FILE']))) + print(_(" Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues")) raise args[1] self.genfstab() @@ -282,7 +282,7 @@ class Installer: partition.mount(f'{self.target}{mountpoint}') - def post_install_check(self, *args :str, **kwargs :str) -> List[bool]: + 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] def pacstrap(self, *packages :str, **kwargs :str) -> bool: diff --git a/archinstall/lib/menu/menu.py b/archinstall/lib/menu/menu.py index dfd47a7a..1811482d 100644 --- a/archinstall/lib/menu/menu.py +++ b/archinstall/lib/menu/menu.py @@ -65,7 +65,7 @@ class Menu(TerminalMenu): menu_title = f'\n{title}\n\n' if skip: - menu_title += "Use ESC to skip\n\n" + menu_title += str(_("Use ESC to skip\n\n")) if default_option: # if a default value was specified we move that one diff --git a/archinstall/lib/menu/selection_menu.py b/archinstall/lib/menu/selection_menu.py index f3fd3b4c..f094c6dc 100644 --- a/archinstall/lib/menu/selection_menu.py +++ b/archinstall/lib/menu/selection_menu.py @@ -1,4 +1,5 @@ import sys +from typing import Dict from .menu import Menu from ..general import SysCommand @@ -7,7 +8,7 @@ from ..output import log from ..profiles import is_desktop_profile from ..disk import encrypted_partitions from ..locale_helpers import set_keyboard_language -from ..user_interaction import get_password +from ..user_interaction import get_password, ask_for_a_timezone from ..user_interaction import ask_ntp from ..user_interaction import ask_for_swap from ..user_interaction import ask_for_bootloader @@ -15,7 +16,6 @@ from ..user_interaction import ask_hostname from ..user_interaction import ask_for_audio_selection from ..user_interaction import ask_additional_packages_to_install from ..user_interaction import ask_to_configure_network -from ..user_interaction import ask_for_a_timezone from ..user_interaction import ask_for_superuser_account from ..user_interaction import ask_for_additional_users from ..user_interaction import select_language @@ -30,6 +30,7 @@ from ..user_interaction import select_profile from ..user_interaction import select_archinstall_language from ..translation import Translation + class Selector: def __init__( self, @@ -76,7 +77,6 @@ class Selector: self._display_func = display_func self._current_selection = default self.enabled = enabled - self.text = self.menu_text() self._dependencies = dependencies self._dependencies_not = dependencies_not @@ -88,12 +88,15 @@ class Selector: def dependencies_not(self): return self._dependencies_not + @property + def current_selection(self): + return self._current_selection + def set_enabled(self): self.enabled = True def update_description(self, description): self._description = description - self.text = self.menu_text() def menu_text(self): current = '' @@ -105,14 +108,13 @@ class Selector: current = str(self._current_selection) if current: - padding = 35 - len(self._description) + padding = 35 - len(str(self._description)) current = ' ' * padding + f'SET: {current}' return f'{self._description} {current}' def set_current_selection(self, current): self._current_selection = current - self.text = self.menu_text() def has_selection(self): if self._current_selection is None: @@ -168,7 +170,7 @@ class GlobalMenu: self._menu_options['!encryption-password'] = \ Selector( _('Set encryption password'), - lambda: get_password(prompt='Enter disk encryption password (leave blank for no encryption): '), + lambda: get_password(prompt=str(_('Enter disk encryption password (leave blank for no encryption): '))), display_func=lambda x: self._secret(x) if x else 'None', dependencies=['harddrives']) self._menu_options['swap'] = \ @@ -181,7 +183,7 @@ class GlobalMenu: _('Select bootloader'), lambda: ask_for_bootloader(storage['arguments'].get('advanced', False)),) self._menu_options['hostname'] = \ - Selector('Specify hostname', lambda: ask_hostname()) + Selector(_('Specify hostname'), lambda: ask_hostname()) self._menu_options['!root-password'] = \ Selector( _('Set root password'), @@ -222,10 +224,10 @@ class GlobalMenu: Selector( _('Configure network'), lambda: ask_to_configure_network(), - display_func=lambda x: x if x else 'Not configured, unavailable unless setup manually', + display_func=lambda x: x if x else _('Not configured, unavailable unless setup manually'), default={}) self._menu_options['timezone'] = \ - Selector('Select timezone', lambda: ask_for_a_timezone()) + Selector(_('Select timezone'), lambda: ask_for_a_timezone()) self._menu_options['ntp'] = \ Selector( _('Set automatic time sync (NTP)'), @@ -235,7 +237,7 @@ class GlobalMenu: Selector( self._install_text(), enabled=True) - self._menu_options['abort'] = Selector('Abort', enabled=True) + self._menu_options['abort'] = Selector(_('Abort'), enabled=True) def enable(self, selector_name, omit_if_set=False): arg = storage['arguments'].get(selector_name, None) @@ -259,26 +261,29 @@ class GlobalMenu: self._set_kb_language() enabled_menus = self._menus_to_enable() - menu_text = [m.text for m in enabled_menus.values()] - selection = Menu('Set/Modify the below options', menu_text, sort=False).run() + menu_text = [m.menu_text() for m in enabled_menus.values()] + selection = Menu(_('Set/Modify the below options'), menu_text, sort=False).run() + if selection: selection = selection.strip() - if 'Abort' in selection: + if str(_('Abort')) in selection: exit(0) - elif 'Install' in selection: + elif str(_('Install')) in selection: if self._missing_configs() == 0: break else: self._process_selection(selection) + for key in self._menu_options: sel = self._menu_options[key] if key not in storage['arguments']: - storage['arguments'][key] = sel._current_selection + storage['arguments'][key] = sel.current_selection + self._post_processing() def _process_selection(self, selection): # find the selected option in our option list - option = [[k, v] for k, v in self._menu_options.items() if v.text.strip() == selection] + option = [[k, v] for k, v in self._menu_options.items() if v.menu_text().strip() == selection] if len(option) != 1: raise ValueError(f'Selection not found: {selection}') @@ -306,7 +311,7 @@ class GlobalMenu: def _install_text(self): missing = self._missing_configs() if missing > 0: - return f'Install ({missing} config(s) missing)' + return _('Install ({} config(s) missing)').format(missing) return 'Install' def _missing_configs(self): @@ -338,7 +343,7 @@ class GlobalMenu: return language def _set_root_password(self): - prompt = 'Enter root password (leave blank to disable root & create superuser): ' + prompt = str(_('Enter root password (leave blank to disable root): ')) password = get_password(prompt=prompt) # TODO: Do we really wanna wipe the !superusers and !users if root password is set? @@ -368,11 +373,12 @@ class GlobalMenu: storage['arguments']['disk_layouts'] = {} if not harddrives: - prompt = 'You decided to skip harddrive selection\n' - prompt += f"and will use whatever drive-setup is mounted at {storage['MOUNT_POINT']} (experimental)\n" - prompt += "WARNING: Archinstall won't check the suitability of this setup\n" + prompt = _( + "You decided to skip harddrive selection\nand 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?" + ).format(storage['MOUNT_POINT']) - prompt += 'Do you wish to continue?' choice = Menu(prompt, ['yes', 'no'], default_option='yes').run() if choice == 'no': @@ -397,11 +403,11 @@ class GlobalMenu: return profile def _create_superuser_account(self): - superuser = ask_for_superuser_account('Create a required super-user with sudo privileges: ', forced=True) + superuser = ask_for_superuser_account(str(_('Create a required super-user with sudo privileges: ')), forced=True) return superuser def _create_user_account(self): - users, superusers = ask_for_additional_users('Enter a username to create an additional user: ') + users, superusers = ask_for_additional_users(str(_('Enter a username to create an additional user (leave blank to skip): '))) storage['arguments']['!superusers'] = {**storage['arguments'].get('!superusers', {}), **superusers} return users @@ -431,7 +437,7 @@ class GlobalMenu: raise ValueError(f'No selection found: {selection_name}') - def _menus_to_enable(self): + def _menus_to_enable(self) -> Dict[str, Selector]: enabled_menus = {} for name, selection in self._menu_options.items(): diff --git a/archinstall/lib/profiles.py b/archinstall/lib/profiles.py index 9befd3d5..4295fa8f 100644 --- a/archinstall/lib/profiles.py +++ b/archinstall/lib/profiles.py @@ -86,10 +86,10 @@ def list_profiles( try: profile_list = json.loads(grab_url_data(profiles_url)) except urllib.error.HTTPError as err: - print(f'Error: Listing profiles on URL "{profiles_url}" resulted in:', err) + print(_('Error: Listing profiles on URL "{}" resulted in:').format(profiles_url), err) return cache except json.decoder.JSONDecodeError as err: - print(f'Error: Could not decode "{profiles_url}" result as JSON:', err) + print(_('Error: Could not decode "{}" result as JSON:').format(profiles_url), err) return cache for profile in profile_list: diff --git a/archinstall/lib/translation.py b/archinstall/lib/translation.py index 1ae6989d..16556fbe 100644 --- a/archinstall/lib/translation.py +++ b/archinstall/lib/translation.py @@ -28,7 +28,7 @@ class Languages: class DeferredTranslation: - def __init__(self, message): + def __init__(self, message: str): self.message = message def __len__(self) -> int: @@ -40,6 +40,15 @@ class DeferredTranslation: return self.message return translate(self.message) + def __lt__(self, other) -> bool: + return self.message < other + + def __gt__(self, other) -> bool: + return self.message > other + + def format(self, *args) -> str: + return self.message.format(*args) + @classmethod def install(cls): import builtins @@ -48,8 +57,6 @@ class DeferredTranslation: class Translation: def __init__(self, locales_dir): - DeferredTranslation.install() - self._languages = {} for name in self.get_all_names(): diff --git a/archinstall/lib/user_interaction.py b/archinstall/lib/user_interaction.py index 3db74e9b..badf4cb4 100644 --- a/archinstall/lib/user_interaction.py +++ b/archinstall/lib/user_interaction.py @@ -96,7 +96,10 @@ def do_countdown() -> bool: return True -def get_password(prompt :str = "Enter a password: ") -> Optional[str]: +def get_password(prompt :str = '') -> Optional[str]: + if not prompt: + prompt = _("Enter a password: ") + while passwd := getpass.getpass(prompt): passwd_verification = getpass.getpass(prompt=_('And one more time for verification: ')) if passwd != passwd_verification: @@ -275,8 +278,8 @@ def ask_for_swap(): def ask_ntp() -> bool: - prompt = _('Would you like to use automatic time synchronization (NTP) with the default time servers?') - prompt += _('Hardware time and other post-configuration steps might be required in order for NTP to work. For more information, please check the Arch wiki') + prompt = str(_('Would you like to use automatic time synchronization (NTP) with the default time servers?\n')) + prompt += str(_('Hardware time and other post-configuration steps might be required in order for NTP to work.\nFor more information, please check the Arch wiki')) choice = Menu(prompt, ['yes', 'no'], skip=False, default_option='yes').run() return False if choice == 'no' else True @@ -286,7 +289,7 @@ def ask_hostname(): return hostname -def ask_for_superuser_account(prompt :str = '', forced :bool = False) -> Dict[str, Dict[str, str]]: +def ask_for_superuser_account(prompt: str = '', forced :bool = False) -> Dict[str, Dict[str, str]]: prompt = prompt if prompt else _('Username for required superuser with sudo privileges: ') while 1: new_user = input(prompt).strip(' ') @@ -301,7 +304,7 @@ def ask_for_superuser_account(prompt :str = '', forced :bool = False) -> Dict[st elif not check_for_correct_username(new_user): continue - prompt = _('Password for user "{}"').format(new_user) + prompt = str(_('Password for user "{}": ').format(new_user)) password = get_password(prompt=prompt) return {new_user: {"!password": password}} @@ -318,11 +321,14 @@ def ask_for_additional_users(prompt :str = '') -> tuple[dict[str, dict[str, str if not check_for_correct_username(new_user): continue - prompt = _('Password for user "{}"').format(new_user) - password = get_password(prompt=prompt) + password = get_password(prompt=str(_('Password for user "{}": ').format(new_user))) - prompt = _('Should this user be a superuser (sudoer)?') - choice = Menu(prompt, ['yes', 'no'], skip=False, default_option='no').run() + choice = Menu( + str(_('Should this user be a superuser (sudoer)?')), + ['yes', 'no'], + skip=False, + default_option='no' + ).run() if choice == 'yes': superusers[new_user] = {"!password": password} @@ -399,7 +405,7 @@ def ask_additional_packages_to_install(packages :List[str] = None) -> List[str]: if len(packages): # Verify packages that were given try: - log("Verifying that additional packages exist (this might take a few seconds)") + print(_("Verifying that additional packages exist (this might take a few seconds)")) validate_package_list(packages) break except RequirementError as e: @@ -587,21 +593,28 @@ def manage_new_and_existing_partitions(block_device :BlockDevice) -> Dict[str, A # Test code: [part.__dump__() for part in block_device.partitions.values()] # TODO: Squeeze in BTRFS subvolumes here + new_partition = _('Create a new partition') + suggest_partition_layout = _('Suggest partition layout') + delete_partition = _('Delete a partition') + delete_all_partitions = _('Clear/Delete all partitions') + assign_mount_point = _('Assign mount-point for a partition') + mark_formatted = _('Mark/Unmark a partition to be formatted (wipes data)') + mark_encrypted = _('Mark/Unmark a partition as encrypted') + mark_bootable = _('Mark/Unmark a partition as bootable (automatic for /boot)') + set_filesystem_partition = _('Set desired filesystem for a partition') + while True: - modes = [ - "Create a new partition", - f"Suggest partition layout for {block_device}" - ] + modes = [new_partition, suggest_partition_layout] if len(block_device_struct['partitions']): modes += [ - "Delete a partition", - "Clear/Delete all partitions", - "Assign mount-point for a partition", - "Mark/Unmark a partition to be formatted (wipes data)", - "Mark/Unmark a partition as encrypted", - "Mark/Unmark a partition as bootable (automatic for /boot)", - "Set desired filesystem for a partition", + delete_partition, + delete_all_partitions, + assign_mount_point, + mark_formatted, + mark_encrypted, + mark_bootable, + set_filesystem_partition, ] title = _('Select what to do with\n{}').format(block_device) @@ -615,7 +628,7 @@ def manage_new_and_existing_partitions(block_device :BlockDevice) -> Dict[str, A if not task: break - if task == 'Create a new partition': + if task == new_partition: # if partition_type == 'gpt': # # https://www.gnu.org/software/parted/manual/html_node/mkpart.html # # https://www.gnu.org/software/parted/manual/html_node/mklabel.html @@ -632,7 +645,7 @@ def manage_new_and_existing_partitions(block_device :BlockDevice) -> Dict[str, A else: end_suggested = '100%' - prompt = _('Enter the end sector of the partition (percentage or block number, ex: {}): "').format(end_suggested) + prompt = _('Enter the end sector of the partition (percentage or block number, ex: {}): ').format(end_suggested) end = input(prompt).strip() if not end.strip(): @@ -656,7 +669,7 @@ def manage_new_and_existing_partitions(block_device :BlockDevice) -> Dict[str, A else: log(f"Invalid start ({valid_parted_position(start)}) or end ({valid_parted_position(end)}) for this partition. Ignoring this partition creation.", fg="red") continue - elif task[:len("Suggest partition layout")] == "Suggest partition layout": + elif task == suggest_partition_layout: if len(block_device_struct["partitions"]): prompt = _('{} contains queued partitions, this will remove those, are you sure?').format(block_device) choice = Menu(prompt, ['yes', 'no'], default_option='no').run() @@ -670,15 +683,15 @@ def manage_new_and_existing_partitions(block_device :BlockDevice) -> Dict[str, A else: current_layout = current_partition_layout(block_device_struct['partitions'], with_idx=True) - if task == "Delete a partition": + if task == delete_partition: title = _('{}\n\nSelect by index which partitions to delete').format(current_layout) to_delete = select_partition(title, block_device_struct["partitions"], multiple=True) if to_delete: block_device_struct['partitions'] = [p for idx, p in enumerate(block_device_struct['partitions']) if idx not in to_delete] - elif task == "Clear/Delete all partitions": + elif task == delete_all_partitions: block_device_struct["partitions"] = [] - elif task == "Assign mount-point for a partition": + elif task == assign_mount_point: title = _('{}\n\nSelect by index which partition to mount where').format(current_layout) partition = select_partition(title, block_device_struct["partitions"]) @@ -694,7 +707,7 @@ def manage_new_and_existing_partitions(block_device :BlockDevice) -> Dict[str, A else: del(block_device_struct["partitions"][partition]['mountpoint']) - elif task == "Mark/Unmark a partition to be formatted (wipes data)": + elif task == mark_formatted: title = _('{}\n\nSelect which partition to mask for formatting').format(current_layout) partition = select_partition(title, block_device_struct["partitions"]) @@ -713,7 +726,7 @@ def manage_new_and_existing_partitions(block_device :BlockDevice) -> Dict[str, A # Negate the current wipe marking block_device_struct["partitions"][partition]['wipe'] = not block_device_struct["partitions"][partition].get('wipe', False) - elif task == "Mark/Unmark a partition as encrypted": + elif task == mark_encrypted: title = _('{}\n\nSelect which partition to mark as encrypted').format(current_layout) partition = select_partition(title, block_device_struct["partitions"]) @@ -721,14 +734,14 @@ def manage_new_and_existing_partitions(block_device :BlockDevice) -> Dict[str, A # Negate the current encryption marking block_device_struct["partitions"][partition]['encrypted'] = not block_device_struct["partitions"][partition].get('encrypted', False) - elif task == "Mark/Unmark a partition as bootable (automatic for /boot)": + elif task == mark_bootable: title = _('{}\n\nSelect which partition to mark as bootable').format(current_layout) partition = select_partition(title, block_device_struct["partitions"]) if partition is not None: block_device_struct["partitions"][partition]['boot'] = not block_device_struct["partitions"][partition].get('boot', False) - elif task == "Set desired filesystem for a partition": + elif task == set_filesystem_partition: title = _('{}\n\nSelect which partition to set a filesystem on').format(current_layout) partition = select_partition(title, block_device_struct["partitions"]) @@ -762,10 +775,11 @@ def select_archinstall_language(default='English'): def select_disk_layout(block_devices :list, advanced_options=False) -> Dict[str, Any]: - wipe_mode = _('Wipe all selected drives and use a best-effort default partition layout') - custome_mode = _('Select what to do with each individual drive (followed by partition usage)') + wipe_mode = str(_('Wipe all selected drives and use a best-effort default partition layout')) + custome_mode = str(_('Select what to do with each individual drive (followed by partition usage)')) modes = [wipe_mode, custome_mode] + print(modes) mode = Menu(_('Select what you wish to do with the selected block devices'), modes, skip=False).run() if mode == wipe_mode: @@ -802,7 +816,7 @@ def select_disk(dict_o_disks :Dict[str, BlockDevice]) -> BlockDevice: raise DiskError('select_disk() requires a non-empty dictionary of disks to select from.') -def select_profile() -> Optional[str]: +def select_profile() -> Optional[Profile]: """ # Asks the user to select a profile from the available profiles. # diff --git a/archinstall/locales/README.md b/archinstall/locales/README.md index a2c65f79..70822c05 100644 --- a/archinstall/locales/README.md +++ b/archinstall/locales/README.md @@ -20,7 +20,8 @@ msgstr "" The `msgid` is the identifier of the string in the code as well as the default text to be displayed, meaning that if no translation is provided for a language then this is the text that is going to be shown. -To provide a translation for the language, simply write the translation in the `msgstr` part +To perform translations for a language this file can be edited manually or the neat `poedit` can be used (https://poedit.net/). +If editing the file manually, write the translation in the `msgstr` part ``` #: lib/user_interaction.py:82 @@ -28,6 +29,5 @@ msgid "Do you really want to abort?" msgstr "Wollen sie wirklich abbrechen?" ``` -After that run the script once more `./locales_generator.sh` and it will auto-generate the `base.mo` file with the included translations. +After the translations have been written, run the script once more `./locales_generator.sh` and it will auto-generate the `base.mo` file with the included translations. After that you're all ready to go and enjoy Archinstall in the new language :) - diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index d2c36ffd..da9fb274 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -1,354 +1,621 @@ -#: lib/user_interaction.py:82 lib/user_interaction.py:82 +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/installer.py:144 lib/installer.py:144 +msgid "[!] A log file has been created here: {} {}" +msgstr "" + +#: lib/installer.py:145 lib/installer.py:145 +msgid "" +" Please submit this issue (and file) to https://github.com/archlinux/" +"archinstall/issues" +msgstr "" + +#: lib/user_interaction.py:83 lib/user_interaction.py:83 msgid "Do you really want to abort?" msgstr "" -#: lib/user_interaction.py:100 lib/user_interaction.py:100 +#: lib/user_interaction.py:101 lib/user_interaction.py:104 +#: lib/user_interaction.py:104 msgid "And one more time for verification: " msgstr "" -#: lib/user_interaction.py:271 lib/user_interaction.py:271 +#: lib/user_interaction.py:272 lib/user_interaction.py:275 +#: lib/user_interaction.py:275 msgid "Would you like to use swap on zram?" msgstr "" -#: lib/user_interaction.py:277 lib/user_interaction.py:277 -msgid "" -"Would you like to use automatic time synchronization (NTP) with the default " -"time servers?" -msgstr "" - -#: lib/user_interaction.py:278 lib/user_interaction.py:278 -msgid "" -"Hardware time and other post-configuration steps might be required in order " -"for NTP to work. For more information, please check the Arch wiki" -msgstr "" - -#: lib/user_interaction.py:284 lib/user_interaction.py:284 +#: lib/user_interaction.py:285 lib/user_interaction.py:288 +#: lib/user_interaction.py:288 msgid "Desired hostname for the installation: " msgstr "" -#: lib/user_interaction.py:289 lib/user_interaction.py:289 +#: lib/user_interaction.py:290 lib/user_interaction.py:293 +#: lib/user_interaction.py:293 msgid "Username for required superuser with sudo privileges: " msgstr "" -#: lib/user_interaction.py:303 lib/user_interaction.py:320 -#: lib/user_interaction.py:303 lib/user_interaction.py:320 -msgid "Password for user \"{}\"" -msgstr "" - -#: lib/user_interaction.py:309 lib/user_interaction.py:309 +#: lib/user_interaction.py:310 lib/user_interaction.py:313 +#: lib/user_interaction.py:313 msgid "Any additional users to install (leave blank for no users): " msgstr "" -#: lib/user_interaction.py:323 lib/user_interaction.py:323 +#: lib/user_interaction.py:324 lib/user_interaction.py:327 +#: lib/user_interaction.py:327 msgid "Should this user be a superuser (sudoer)?" msgstr "" -#: lib/user_interaction.py:339 lib/user_interaction.py:339 +#: lib/user_interaction.py:340 lib/user_interaction.py:343 +#: lib/user_interaction.py:346 lib/user_interaction.py:346 msgid "Select a timezone" msgstr "" -#: lib/user_interaction.py:353 lib/user_interaction.py:353 +#: lib/user_interaction.py:354 lib/user_interaction.py:357 +#: lib/user_interaction.py:360 lib/user_interaction.py:360 msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?" msgstr "" -#: lib/user_interaction.py:363 lib/user_interaction.py:363 +#: lib/user_interaction.py:364 lib/user_interaction.py:367 +#: lib/user_interaction.py:370 lib/user_interaction.py:370 msgid "Choose a bootloader" msgstr "" -#: lib/user_interaction.py:379 lib/user_interaction.py:379 +#: lib/user_interaction.py:380 lib/user_interaction.py:383 +#: lib/user_interaction.py:386 lib/user_interaction.py:386 msgid "Choose an audio server" msgstr "" -#: lib/user_interaction.py:390 lib/user_interaction.py:390 +#: lib/user_interaction.py:391 lib/user_interaction.py:394 +#: lib/user_interaction.py:397 lib/user_interaction.py:397 msgid "" "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr " "and optional profile packages are installed." msgstr "" -#: lib/user_interaction.py:391 lib/user_interaction.py:391 +#: lib/user_interaction.py:392 lib/user_interaction.py:395 +#: lib/user_interaction.py:398 lib/user_interaction.py:398 msgid "" "If you desire a web browser, such as firefox or chromium, you may specify it " "in the following prompt." msgstr "" -#: lib/user_interaction.py:395 lib/user_interaction.py:395 +#: lib/user_interaction.py:396 lib/user_interaction.py:399 +#: lib/user_interaction.py:402 lib/user_interaction.py:402 msgid "" "Write additional packages to install (space separated, leave blank to skip): " msgstr "" -#: lib/user_interaction.py:418 lib/user_interaction.py:418 +#: lib/user_interaction.py:419 lib/user_interaction.py:422 +#: lib/user_interaction.py:425 lib/user_interaction.py:425 msgid "Copy ISO network configuration to installation" msgstr "" -#: lib/user_interaction.py:419 lib/user_interaction.py:419 +#: lib/user_interaction.py:420 lib/user_interaction.py:423 +#: lib/user_interaction.py:426 lib/user_interaction.py:426 msgid "" "Use NetworkManager (necessary to configure internet graphically in GNOME and " "KDE)" msgstr "" -#: lib/user_interaction.py:427 lib/user_interaction.py:427 +#: lib/user_interaction.py:428 lib/user_interaction.py:431 +#: lib/user_interaction.py:434 lib/user_interaction.py:434 msgid "Select one network interface to configure" msgstr "" -#: lib/user_interaction.py:440 lib/user_interaction.py:440 +#: lib/user_interaction.py:441 lib/user_interaction.py:444 +#: lib/user_interaction.py:447 lib/user_interaction.py:447 msgid "" "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" msgstr "" -#: lib/user_interaction.py:445 lib/user_interaction.py:445 +#: lib/user_interaction.py:446 lib/user_interaction.py:449 +#: lib/user_interaction.py:452 lib/user_interaction.py:452 msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " msgstr "" -#: lib/user_interaction.py:460 lib/user_interaction.py:460 +#: lib/user_interaction.py:461 lib/user_interaction.py:464 +#: lib/user_interaction.py:467 lib/user_interaction.py:467 msgid "Enter your gateway (router) IP address or leave blank for none: " msgstr "" -#: lib/user_interaction.py:475 lib/user_interaction.py:475 +#: lib/user_interaction.py:476 lib/user_interaction.py:479 +#: lib/user_interaction.py:482 lib/user_interaction.py:482 msgid "Enter your DNS servers (space separated, blank for none): " msgstr "" -#: lib/user_interaction.py:509 lib/user_interaction.py:509 +#: lib/user_interaction.py:510 lib/user_interaction.py:513 +#: lib/user_interaction.py:516 lib/user_interaction.py:516 msgid "Select which filesystem your main partition should use" msgstr "" -#: lib/user_interaction.py:555 lib/user_interaction.py:555 +#: lib/user_interaction.py:556 lib/user_interaction.py:559 +#: lib/user_interaction.py:562 lib/user_interaction.py:562 msgid "Current partition layout" msgstr "" -#: lib/user_interaction.py:606 lib/user_interaction.py:606 +#: lib/user_interaction.py:607 lib/user_interaction.py:614 +#: lib/user_interaction.py:617 lib/user_interaction.py:620 +#: lib/user_interaction.py:620 msgid "" "Select what to do with\n" "{}" msgstr "" -#: lib/user_interaction.py:623 lib/user_interaction.py:708 -#: lib/user_interaction.py:623 lib/user_interaction.py:708 +#: lib/user_interaction.py:624 lib/user_interaction.py:709 +#: lib/user_interaction.py:631 lib/user_interaction.py:716 +#: lib/user_interaction.py:634 lib/user_interaction.py:719 +#: lib/user_interaction.py:637 lib/user_interaction.py:722 +#: lib/user_interaction.py:637 lib/user_interaction.py:722 msgid "Enter a desired filesystem type for the partition" msgstr "" -#: lib/user_interaction.py:625 lib/user_interaction.py:625 +#: lib/user_interaction.py:626 lib/user_interaction.py:633 +#: lib/user_interaction.py:636 lib/user_interaction.py:639 +#: lib/user_interaction.py:639 msgid "Enter the start sector (percentage or block number, default: {}): " msgstr "" -#: lib/user_interaction.py:634 lib/user_interaction.py:634 +#: lib/user_interaction.py:635 lib/user_interaction.py:642 +#: lib/user_interaction.py:645 lib/user_interaction.py:648 +#: lib/user_interaction.py:648 msgid "" "Enter the end sector of the partition (percentage or block number, ex: {}): " -"\"" msgstr "" -#: lib/user_interaction.py:660 lib/user_interaction.py:660 +#: lib/user_interaction.py:661 lib/user_interaction.py:668 +#: lib/user_interaction.py:671 lib/user_interaction.py:674 +#: lib/user_interaction.py:674 msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "" -#: lib/user_interaction.py:673 lib/user_interaction.py:673 +#: lib/user_interaction.py:674 lib/user_interaction.py:681 +#: lib/user_interaction.py:684 lib/user_interaction.py:687 +#: lib/user_interaction.py:687 msgid "" "{}\n" "\n" "Select by index which partitions to delete" msgstr "" -#: lib/user_interaction.py:681 lib/user_interaction.py:681 +#: lib/user_interaction.py:682 lib/user_interaction.py:689 +#: lib/user_interaction.py:692 lib/user_interaction.py:695 +#: lib/user_interaction.py:695 msgid "" "{}\n" "\n" "Select by index which partition to mount where" msgstr "" -#: lib/user_interaction.py:685 lib/user_interaction.py:685 +#: lib/user_interaction.py:686 lib/user_interaction.py:693 +#: lib/user_interaction.py:696 lib/user_interaction.py:699 +#: lib/user_interaction.py:699 msgid "" " * Partition mount-points are relative to inside the installation, the boot " "would be /boot as an example." msgstr "" -#: lib/user_interaction.py:686 lib/user_interaction.py:686 +#: lib/user_interaction.py:687 lib/user_interaction.py:694 +#: lib/user_interaction.py:697 lib/user_interaction.py:700 +#: lib/user_interaction.py:700 msgid "Select where to mount partition (leave blank to remove mountpoint): " msgstr "" -#: lib/user_interaction.py:697 lib/user_interaction.py:697 +#: lib/user_interaction.py:698 lib/user_interaction.py:705 +#: lib/user_interaction.py:708 lib/user_interaction.py:711 +#: lib/user_interaction.py:711 msgid "" "{}\n" "\n" "Select which partition to mask for formatting" msgstr "" -#: lib/user_interaction.py:716 lib/user_interaction.py:716 +#: lib/user_interaction.py:717 lib/user_interaction.py:724 +#: lib/user_interaction.py:727 lib/user_interaction.py:730 +#: lib/user_interaction.py:730 msgid "" "{}\n" "\n" "Select which partition to mark as encrypted" msgstr "" -#: lib/user_interaction.py:724 lib/user_interaction.py:724 +#: lib/user_interaction.py:725 lib/user_interaction.py:732 +#: lib/user_interaction.py:735 lib/user_interaction.py:738 +#: lib/user_interaction.py:738 msgid "" "{}\n" "\n" "Select which partition to mark as bootable" msgstr "" -#: lib/user_interaction.py:731 lib/user_interaction.py:731 +#: lib/user_interaction.py:732 lib/user_interaction.py:739 +#: lib/user_interaction.py:742 lib/user_interaction.py:745 +#: lib/user_interaction.py:745 msgid "" "{}\n" "\n" "Select which partition to set a filesystem on" msgstr "" -#: lib/user_interaction.py:738 lib/user_interaction.py:738 +#: lib/user_interaction.py:739 lib/user_interaction.py:746 +#: lib/user_interaction.py:749 lib/user_interaction.py:752 +#: lib/user_interaction.py:752 msgid "Enter a desired filesystem type for the partition: " msgstr "" -#: lib/user_interaction.py:759 lib/menu/selection_menu.py:116 -#: lib/user_interaction.py:759 lib/menu/selection_menu.py:116 +#: lib/user_interaction.py:760 lib/menu/selection_menu.py:141 +#: lib/user_interaction.py:767 lib/menu/selection_menu.py:139 +#: lib/menu/selection_menu.py:143 lib/user_interaction.py:770 +#: lib/user_interaction.py:773 lib/user_interaction.py:773 +#: lib/menu/selection_menu.py:143 msgid "Select Archinstall language" msgstr "" -#: lib/user_interaction.py:764 lib/user_interaction.py:764 +#: lib/user_interaction.py:765 lib/user_interaction.py:772 +#: lib/user_interaction.py:775 lib/user_interaction.py:778 +#: lib/user_interaction.py:778 msgid "Wipe all selected drives and use a best-effort default partition layout" msgstr "" -#: lib/user_interaction.py:765 lib/user_interaction.py:765 +#: lib/user_interaction.py:766 lib/user_interaction.py:773 +#: lib/user_interaction.py:776 lib/user_interaction.py:779 +#: lib/user_interaction.py:779 msgid "" "Select what to do with each individual drive (followed by partition usage)" msgstr "" -#: lib/user_interaction.py:768 lib/user_interaction.py:768 +#: lib/user_interaction.py:769 lib/user_interaction.py:770 +#: lib/user_interaction.py:777 lib/user_interaction.py:780 +#: lib/user_interaction.py:783 lib/user_interaction.py:783 msgid "Select what you wish to do with the selected block devices" msgstr "" -#: lib/user_interaction.py:821 lib/user_interaction.py:821 +#: lib/user_interaction.py:822 lib/user_interaction.py:823 +#: lib/user_interaction.py:830 lib/user_interaction.py:833 +#: lib/user_interaction.py:836 lib/user_interaction.py:836 msgid "" "This is a list of pre-programmed profiles, they might make it easier to " "install things like desktop environments" msgstr "" -#: lib/user_interaction.py:846 lib/user_interaction.py:846 +#: lib/user_interaction.py:846 lib/user_interaction.py:847 +#: lib/user_interaction.py:854 lib/user_interaction.py:857 +#: lib/user_interaction.py:860 lib/user_interaction.py:860 msgid "Select Keyboard layout" msgstr "" -#: lib/user_interaction.py:861 lib/user_interaction.py:861 +#: lib/user_interaction.py:861 lib/user_interaction.py:862 +#: lib/user_interaction.py:869 lib/user_interaction.py:872 +#: lib/user_interaction.py:875 lib/user_interaction.py:875 msgid "Select one of the regions to download packages from" msgstr "" -#: lib/user_interaction.py:883 lib/user_interaction.py:883 +#: lib/user_interaction.py:883 lib/user_interaction.py:884 +#: lib/user_interaction.py:891 lib/user_interaction.py:894 +#: lib/user_interaction.py:897 lib/user_interaction.py:897 msgid "Select one or more hard drives to use and configure" msgstr "" -#: lib/user_interaction.py:910 lib/user_interaction.py:910 +#: lib/user_interaction.py:910 lib/user_interaction.py:911 +#: lib/user_interaction.py:918 lib/user_interaction.py:921 +#: lib/user_interaction.py:924 lib/user_interaction.py:924 msgid "" "For the best compatibility with your AMD hardware, you may want to use " "either the all open-source or AMD / ATI options." msgstr "" -#: lib/user_interaction.py:912 lib/user_interaction.py:912 +#: lib/user_interaction.py:912 lib/user_interaction.py:913 +#: lib/user_interaction.py:920 lib/user_interaction.py:923 +#: lib/user_interaction.py:926 lib/user_interaction.py:926 msgid "" "For the best compatibility with your Intel hardware, you may want to use " "either the all open-source or Intel options.\n" msgstr "" -#: lib/user_interaction.py:914 lib/user_interaction.py:914 +#: lib/user_interaction.py:914 lib/user_interaction.py:915 +#: lib/user_interaction.py:922 lib/user_interaction.py:925 +#: lib/user_interaction.py:928 lib/user_interaction.py:928 msgid "" "For the best compatibility with your Nvidia hardware, you may want to use " "the Nvidia proprietary driver.\n" msgstr "" -#: lib/user_interaction.py:917 lib/user_interaction.py:917 +#: lib/user_interaction.py:917 lib/user_interaction.py:918 +#: lib/user_interaction.py:925 lib/user_interaction.py:928 +#: lib/user_interaction.py:931 lib/user_interaction.py:931 msgid "" "\n" "\n" "Select a graphics driver or leave blank to install all open-source drivers" msgstr "" -#: lib/user_interaction.py:921 lib/user_interaction.py:921 +#: lib/user_interaction.py:921 lib/user_interaction.py:922 +#: lib/user_interaction.py:929 lib/user_interaction.py:932 +#: lib/user_interaction.py:935 lib/user_interaction.py:935 msgid "All open-source (default)" msgstr "" -#: lib/user_interaction.py:940 lib/user_interaction.py:940 +#: lib/user_interaction.py:940 lib/user_interaction.py:941 +#: lib/user_interaction.py:948 lib/user_interaction.py:951 +#: lib/user_interaction.py:954 lib/user_interaction.py:954 msgid "Choose which kernels to use or leave blank for default \"{}\"" msgstr "" -#: lib/user_interaction.py:954 lib/user_interaction.py:954 +#: lib/user_interaction.py:954 lib/user_interaction.py:955 +#: lib/user_interaction.py:962 lib/user_interaction.py:965 +#: lib/user_interaction.py:968 lib/user_interaction.py:968 msgid "Choose which locale language to use" msgstr "" -#: lib/user_interaction.py:968 lib/user_interaction.py:968 +#: lib/user_interaction.py:968 lib/user_interaction.py:969 +#: lib/user_interaction.py:976 lib/user_interaction.py:979 +#: lib/user_interaction.py:982 lib/user_interaction.py:982 msgid "Choose which locale encoding to use" msgstr "" -#: lib/user_interaction.py:1009 lib/user_interaction.py:1009 +#: lib/user_interaction.py:1009 lib/user_interaction.py:1010 +#: lib/user_interaction.py:1017 lib/user_interaction.py:1020 +#: lib/user_interaction.py:1023 lib/user_interaction.py:1023 msgid "Select one of the values shown below: " msgstr "" -#: lib/user_interaction.py:1050 lib/user_interaction.py:1050 +#: lib/user_interaction.py:1050 lib/user_interaction.py:1051 +#: lib/user_interaction.py:1058 lib/user_interaction.py:1061 +#: lib/user_interaction.py:1064 lib/user_interaction.py:1064 msgid "Select one or more of the options below: " msgstr "" -#: lib/menu/selection_menu.py:122 lib/menu/selection_menu.py:122 +#: lib/disk/filesystem.py:86 lib/disk/filesystem.py:86 +msgid "Adding partition...." +msgstr "" + +#: lib/disk/filesystem.py:139 lib/disk/filesystem.py:141 +#: lib/disk/filesystem.py:141 +msgid "" +"You need to enter a valid fs-type in order to continue. See `man parted` for " +"valid fs-type's." +msgstr "" + +#: lib/profiles.py:89 lib/profiles.py:89 +msgid "Error: Listing profiles on URL \"{}\" resulted in:" +msgstr "" + +#: lib/profiles.py:92 lib/profiles.py:92 +msgid "Error: Could not decode \"{}\" result as JSON:" +msgstr "" + +#: lib/menu/selection_menu.py:146 lib/menu/selection_menu.py:144 +#: lib/menu/selection_menu.py:148 lib/menu/selection_menu.py:148 msgid "Select keyboard layout" msgstr "" -#: lib/menu/selection_menu.py:125 lib/menu/selection_menu.py:125 +#: lib/menu/selection_menu.py:149 lib/menu/selection_menu.py:147 +#: lib/menu/selection_menu.py:151 lib/menu/selection_menu.py:151 msgid "Select mirror region" msgstr "" -#: lib/menu/selection_menu.py:130 lib/menu/selection_menu.py:130 +#: lib/menu/selection_menu.py:154 lib/menu/selection_menu.py:152 +#: lib/menu/selection_menu.py:156 lib/menu/selection_menu.py:156 msgid "Select locale language" msgstr "" -#: lib/menu/selection_menu.py:132 lib/menu/selection_menu.py:132 +#: lib/menu/selection_menu.py:156 lib/menu/selection_menu.py:154 +#: lib/menu/selection_menu.py:158 lib/menu/selection_menu.py:158 msgid "Select locale encoding" msgstr "" -#: lib/menu/selection_menu.py:135 lib/menu/selection_menu.py:135 +#: lib/menu/selection_menu.py:159 lib/menu/selection_menu.py:157 +#: lib/menu/selection_menu.py:161 lib/menu/selection_menu.py:161 msgid "Select harddrives" msgstr "" -#: lib/menu/selection_menu.py:139 lib/menu/selection_menu.py:139 +#: lib/menu/selection_menu.py:163 lib/menu/selection_menu.py:161 +#: lib/menu/selection_menu.py:165 lib/menu/selection_menu.py:165 msgid "Select disk layout" msgstr "" -#: lib/menu/selection_menu.py:147 lib/menu/selection_menu.py:147 +#: lib/menu/selection_menu.py:171 lib/menu/selection_menu.py:169 +#: lib/menu/selection_menu.py:173 lib/menu/selection_menu.py:173 msgid "Set encryption password" msgstr "" -#: lib/menu/selection_menu.py:153 lib/menu/selection_menu.py:153 +#: lib/menu/selection_menu.py:177 lib/menu/selection_menu.py:175 +#: lib/menu/selection_menu.py:179 lib/menu/selection_menu.py:179 msgid "Use swap" msgstr "" -#: lib/menu/selection_menu.py:158 lib/menu/selection_menu.py:158 +#: lib/menu/selection_menu.py:182 lib/menu/selection_menu.py:180 +#: lib/menu/selection_menu.py:184 lib/menu/selection_menu.py:184 msgid "Select bootloader" msgstr "" -#: lib/menu/selection_menu.py:164 lib/menu/selection_menu.py:164 +#: lib/menu/selection_menu.py:188 lib/menu/selection_menu.py:186 +#: lib/menu/selection_menu.py:190 lib/menu/selection_menu.py:190 msgid "Set root password" msgstr "" -#: lib/menu/selection_menu.py:169 lib/menu/selection_menu.py:169 +#: lib/menu/selection_menu.py:193 lib/menu/selection_menu.py:191 +#: lib/menu/selection_menu.py:195 lib/menu/selection_menu.py:195 msgid "Specify superuser account" msgstr "" -#: lib/menu/selection_menu.py:175 lib/menu/selection_menu.py:175 +#: lib/menu/selection_menu.py:199 lib/menu/selection_menu.py:197 +#: lib/menu/selection_menu.py:201 lib/menu/selection_menu.py:201 msgid "Specify user account" msgstr "" -#: lib/menu/selection_menu.py:181 lib/menu/selection_menu.py:181 +#: lib/menu/selection_menu.py:205 lib/menu/selection_menu.py:203 +#: lib/menu/selection_menu.py:207 lib/menu/selection_menu.py:207 msgid "Specify profile" msgstr "" -#: lib/menu/selection_menu.py:186 lib/menu/selection_menu.py:186 +#: lib/menu/selection_menu.py:210 lib/menu/selection_menu.py:208 +#: lib/menu/selection_menu.py:212 lib/menu/selection_menu.py:212 msgid "Select audio" msgstr "" -#: lib/menu/selection_menu.py:190 lib/menu/selection_menu.py:190 +#: lib/menu/selection_menu.py:214 lib/menu/selection_menu.py:212 +#: lib/menu/selection_menu.py:216 lib/menu/selection_menu.py:216 msgid "Select kernels" msgstr "" -#: lib/menu/selection_menu.py:195 lib/menu/selection_menu.py:195 +#: lib/menu/selection_menu.py:219 lib/menu/selection_menu.py:217 +#: lib/menu/selection_menu.py:221 lib/menu/selection_menu.py:221 msgid "Additional packages to install" msgstr "" -#: lib/menu/selection_menu.py:200 lib/menu/selection_menu.py:200 +#: lib/menu/selection_menu.py:224 lib/menu/selection_menu.py:222 +#: lib/menu/selection_menu.py:226 lib/menu/selection_menu.py:226 msgid "Configure network" msgstr "" -#: lib/menu/selection_menu.py:208 lib/menu/selection_menu.py:208 +#: lib/menu/selection_menu.py:232 lib/menu/selection_menu.py:230 +#: lib/menu/selection_menu.py:234 lib/menu/selection_menu.py:234 msgid "Set automatic time sync (NTP)" msgstr "" + +#: lib/menu/selection_menu.py:310 lib/menu/selection_menu.py:308 +#: lib/menu/selection_menu.py:315 lib/menu/selection_menu.py:315 +msgid "Install ({} config(s) missing)" +msgstr "" + +#: lib/menu/selection_menu.py:373 lib/menu/selection_menu.py:371 +#: lib/menu/selection_menu.py:378 lib/menu/selection_menu.py:378 +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 "" + +#: lib/disk/filesystem.py:97 lib/disk/filesystem.py:97 +msgid "Re-using partition instance: {}" +msgstr "" + +#: lib/user_interaction.py:590 lib/user_interaction.py:593 +#: lib/user_interaction.py:596 lib/user_interaction.py:596 +msgid "Create a new partition" +msgstr "" + +#: lib/user_interaction.py:592 lib/user_interaction.py:595 +#: lib/user_interaction.py:598 lib/user_interaction.py:598 +msgid "Delete a partition" +msgstr "" + +#: lib/user_interaction.py:593 lib/user_interaction.py:596 +#: lib/user_interaction.py:599 lib/user_interaction.py:599 +msgid "Clear/Delete all partitions" +msgstr "" + +#: lib/user_interaction.py:594 lib/user_interaction.py:597 +#: lib/user_interaction.py:600 lib/user_interaction.py:600 +msgid "Assign mount-point for a partition" +msgstr "" + +#: lib/user_interaction.py:595 lib/user_interaction.py:598 +#: lib/user_interaction.py:601 lib/user_interaction.py:601 +msgid "Mark/Unmark a partition to be formatted (wipes data)" +msgstr "" + +#: lib/user_interaction.py:596 lib/user_interaction.py:599 +#: lib/user_interaction.py:602 lib/user_interaction.py:602 +msgid "Mark/Unmark a partition as encrypted" +msgstr "" + +#: lib/user_interaction.py:597 lib/user_interaction.py:600 +#: lib/user_interaction.py:603 lib/user_interaction.py:603 +msgid "Mark/Unmark a partition as bootable (automatic for /boot)" +msgstr "" + +#: lib/user_interaction.py:598 lib/user_interaction.py:601 +#: lib/user_interaction.py:604 lib/user_interaction.py:604 +msgid "Set desired filesystem for a partition" +msgstr "" + +#: lib/menu/selection_menu.py:239 lib/menu/selection_menu.py:237 +#: lib/menu/selection_menu.py:241 lib/menu/selection_menu.py:270 +#: lib/menu/selection_menu.py:241 lib/menu/selection_menu.py:270 +msgid "Abort" +msgstr "" + +#: lib/menu/selection_menu.py:183 lib/menu/selection_menu.py:187 +#: lib/menu/selection_menu.py:187 +msgid "Specify hostname" +msgstr "" + +#: lib/menu/selection_menu.py:228 lib/menu/selection_menu.py:228 +msgid "Not configured, unavailable unless setup manually" +msgstr "" + +#: lib/menu/selection_menu.py:231 lib/menu/selection_menu.py:231 +msgid "Select timezone" +msgstr "" + +#: lib/menu/selection_menu.py:266 lib/menu/selection_menu.py:266 +msgid "Set/Modify the below options" +msgstr "" + +#: lib/menu/selection_menu.py:272 lib/menu/selection_menu.py:272 +msgid "Install" +msgstr "" + +#: lib/menu/menu.py:68 lib/menu/menu.py:68 +msgid "" +"Use ESC to skip\n" +"\n" +msgstr "" + +#: lib/user_interaction.py:591 lib/user_interaction.py:594 +#: lib/user_interaction.py:597 lib/user_interaction.py:597 +msgid "Suggest partition layout" +msgstr "" + +#: lib/user_interaction.py:101 lib/user_interaction.py:101 +msgid "Enter a password: " +msgstr "" + +#: lib/disk/filesystem.py:117 lib/disk/filesystem.py:117 +msgid "Enter a encryption password for {}" +msgstr "" + +#: lib/menu/selection_menu.py:174 lib/menu/selection_menu.py:174 +msgid "Enter disk encryption password (leave blank for no encryption): " +msgstr "" + +#: lib/menu/selection_menu.py:407 lib/menu/selection_menu.py:407 +msgid "Create a required super-user with sudo privileges: " +msgstr "" + +#: lib/menu/selection_menu.py:347 lib/menu/selection_menu.py:347 +msgid "Enter root password (leave blank to disable root): " +msgstr "" + +#: lib/user_interaction.py:307 lib/user_interaction.py:324 +#: lib/user_interaction.py:307 lib/user_interaction.py:324 +msgid "Password for user \"{}\": " +msgstr "" + +#: lib/user_interaction.py:405 lib/user_interaction.py:408 +#: lib/user_interaction.py:408 +msgid "" +"Verifying that additional packages exist (this might take a few seconds)" +msgstr "" + +#: lib/user_interaction.py:281 lib/user_interaction.py:281 +msgid "" +"Would you like to use automatic time synchronization (NTP) with the default " +"time servers?\n" +msgstr "" + +#: lib/user_interaction.py:282 lib/user_interaction.py:282 +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 "" + +#: lib/menu/selection_menu.py:411 lib/menu/selection_menu.py:411 +msgid "Enter a username to create an additional user (leave blank to skip): " +msgstr "" diff --git a/archinstall/locales/de/LC_MESSAGES/base.mo b/archinstall/locales/de/LC_MESSAGES/base.mo index 20c704926542e8d72e9c4dee5c611dbfbd6f1a13..da89e7b1f1a89330ba50c4d65a56135ddb196782 100644 GIT binary patch literal 14323 zcmb`NZEPi1dB=wWftdF|0;RM}0tIif_9i5xi34oBYiHx^+PhirVhFEe-*fGW@142K z%-y?ov{VRMQK?k42=xtBpr&fnR)r4;q;@6LnpQ&PLtlviiGJvZibAVOZD~b6w7>sz z&fJ-6d&5F|wX=WE+&Skw=XrmgbH8=db3PgI>2tk?>m$#OB0c!-4gAOF!5gFK3^)%y z2L2M5g5L(83$9K@(JR1rfJrgei8f$?!O7X4E#@U7QFF=e%yWF-Q1rAUj=>`yb1gi_(t%vp!V}Lco+EZpx%GO zi##2VfqMT6xCnk6d=UH^sP|s^;wYK}PlIQ`p9fEXe-obH@)H04qu^1V{|a~~_$6=z z{wsJ1+VWF`u_{me7D0q?e{a_ zYr#JP#iwt8;^+53rjA~OP}p+xT2S{#L8ge_7VaMf*-EqlYFrWU7Xp47ibvv zc~5}+i&Fj*-5&xa$4`J-=W`&ejJ^SCz3+fp@4rFOdo#=te{Sc$0eBMBJf8<21^*m; zKKLpIiH=)A(eV!O6!;nNB=~Jm`abh&ua_SMm%0A~@K3<+gYN;a!u&hHS3~5Rz=yzD za3|nX;4$u>2JZr&$7Y51gW|_F_!aPT;1;-xGNj-?fbRyE5%P`T?}4(P&j)-OgoNn( zU<}^Oe;If$$fM|YK*{OPz-jQi;5)#ZZ}s$Mp!oS4AX|;T42pl>0)GblHxO1ucd+O^ z-~uQ;+X1CVp9E*Xr$FiN*TA=e{{c$wcVo<&|AQbZ89fDd!K>g|@O7{E{4T+B-2XAC z=P&$eFQ<2d8{GdP_;&CnHuE+x1#MmM3in?NcmbpTS?>QD{7vvYo9=`E0?H2F4Kb2K z3LXc49lRg>I;izue!HK)0~Xx>Hi$@~TM#a3gP{2QtDyM!Rq#%5ip`3?2SDl9FM?X{OQ7ib zOYkA^``|n{kMecF4};R5e*!-Yo?`QeH2Mor^Z#?Wzk@|Y_cF+m(FQ2}{5UAO{}hzG z{}#l=qJISS{{Mh6cr!0w2JZ#6zt4i};8(yGgGV7+bUgr`2Csk*>w9nkya}hW3a){O zI{JO^L*QS5&w3W$!IY13fAP)UuYU`a9^8QOYQ9B~siI#7wa%A8?e7MZSo1D`kAc4i zGM(}CEucO(a*21c7kysHC7Hg6OS0Ezh3gELWF|dFE$s7r{y)d1HT4lKEMYeGc2H}+ zluNReT+egqBOQDR*UP!YpLcR0B8v&4`?*}&Px}KaO=tD&R<1QJ$rw|!&wB%I2iyfyJuZD-#w8u=aJ_;{pE<5mT+)e~ zxE|+1MeK7Q|6dG$3l_QF!1V|h>ScQP98h+&%ykPF?!!Je2NXz8->*OTJevzsYd%v` ztFGrZsyK-^i)65sZj^DSNH4h}&WpI`l1naL?ejwAG6zpIkMPYPWpqMn~mnz^P-C8JDoJ!j0g3avwZBK=1O{e zv9XeJ$eW9KX(vutHmoo# zUD2LCo^DG+@}%R6@v|&WhMhEzSre-2 z$0O8XE8ccR=6Xg7%k5VS5fb(p-}c0n+a|~M@{OeDVwY{?#!n>A9EZMxl5GxQsW@uy zu-)R=0@_(YG^`!VqKr=FSvTDr!pzK7qrBMW$zUg5T0L7oh&RG3#@&{b>^?eKxJ1+P z`ly+>d0e;;4Aa7O(BpwCX2j-rgsO7i$>RYAf+8b+IDc|j6fUcpS>j%@lMkz?CcXKF zN2SfWm6uhP1U1;Nsm!^M$4r4*v+tdFlrTM9Nu-&_qs6R(ngp)<$z)UIPFcBrTI!wn50=2)steCbfG~qj|I3 zP6twEzjh}rx1~7;mOso8n)jLs3K@G%+=0cIK3PXM^;R=Rj9WT~Ly+j#(XO!Bcse+U zx%jU8-!yyIz4y)DIs4{gZ@Oo4sM9#yDGbWH=5fYSh^Nt{4KzhM&iCus#&(TR%?ioi11Du=!4JzV=mDOO>WjtNtwQ$W2n$Z5v(csy=FUef9x((gr zol&wAPZwyjD~=dnI-SCmbKyw5-hA7P%=izB0ae{!DuerkG}P(L*p!B3gH4g^BkEnDcttODn8I=4ph_FE7Mf zNzoY*8jhMF_1Q*kMW|-%co!SeO#5RQ3uyeYc>cl?K~9Qa&R*ZTOBiPF|Fp87pHxo}P{OTKw_N>a1XmuBc%-(2v~m}sj^VPnf-2cmDD1OPE^r_oZ^ z#O6I5u5RSk9F5OyBxTUw7V0NgFu&N@8-Q; zJ_>5qA5^o^l22!9jHjQt62iuGd4vrTQnSq?(Q;C3AG?_K0Z3`=84?sp&52AW!z$Ot zHf;BnSUls%;ICZgn$yEQxa;|avBuM*bU?n*Nvh;Xw1Q#PQjsAKv*c2e_KcQcMm#7n z^J+MV`$;xb5Q)xaM3QmVQuA;f3E&3!f2QLux!%#(GOz$Mu(oQ?j5^9gsTe7K?RgKbeOZ*J0nR6(u2+{-=m9d3% z!;NJ>B3PIRtng^9Fp-HcW#RfcRfxT2<%vRSV5v{0TgjTms(yldYDh*Hs!cGI$zgqk z(6$bkn~^C=Ov;<|twLL!i`xiG$X7{X8uw(?N4b-2#MAg_aYrHgKqiUbX*)Z6t;w;V z*r$T_d?L@%lVi(d`#4{@T~n+&kVdP1e^wTnH^9XuKFPM*Y30}C8pos6;K1utdHf)F zobkP7=r%an*id0O{$}#waFcxfkTm^*FHs?*M;fBEZBV!wR-qp5_fd(kU}+WPP6&Mc zWE($Mp^#;&Orj}{*;}?*G8r$x*zGDGki}j~i#+R-{gu&0q_nttQez~zsVRH1;tQGO zBtvP7csg?^V5t~AA$Ic!N=rkvZUq7=bZX`7@}jxs(+i77Y{qhw4D^Rj#3j&isBU<6 zjiTo5DouCfo-5gAD{&u(5O-PZnl@4TWS|mHlDJDrMGl;2o$^SuM$obxYiwcOts1Ea zi1(Gt&A2WEN)xSOZdpX|%WGyAGGAkCQ1(;jFP=~;(5`7Mj5z!slJsR!XGT8%cy#z2 zhnNQ0M3(Man&Pd*Czn#^nm}(xRxOvur>-%zB%oY&7foXMB2~%R)IeiawzTJ9j^3{N zgUZOOyc1TCTGQ(2)S6@|ps^SJtEod&nUbp>rIgQNwtOIAo{C*9o*ADa(4jGh#YBjj z9EehfQiT{wthKY5KQiR--IT;asPH(=+g^KmcVw4M{JAzO1U3)N^RmP=Qnp&GlPpMQP8<~>fG6x^8{So z%`BjxJUWx$6D|}&CfsV*r zT)E5Du|W^oA3$f5g8jYq;)RE1?rYxDT3uQ_i=kCD7vHy@R#WeoIps1(xhx{i<&O4T zd^ht)Q&T6>3VR;yJ-O9GuLuK_l^K7XDw1xxT@@~+vM2IVEvqW(IsHf6$a1Px+Gj`y>ekhweDblttHo0S@^j}6ON`n?<5>izK)hXrBn)zxgBst zYo5}QDw44zevLGZz-`-?!VX+$c18?TdI(B0}+5m4QKQZ9R#%bJSCIw1UfO zogoB^;R~+~js3P-zA`WC_?`?9+1SmPz?NW4^IA@8(_y=r5g1&^ zGfspop;IoLGaEKWzJUnnFIrhZ@bIebX&}O$tG{5NEzRitd=IwR*p3>=Vz+rX%}C3A zLTe|@5O0L<-1`(>x1_-(jga+CEE8XwWGMR)<~uL9H{SMPbJ!aY)^W);XH=$)qRShT zmqTsyYO&5+ht<*2>6jy04Q*)Y3NhH0*quEwyT1>8U_v=o^`loEH3%U>`{N>X>=GG$ zP&%P zeoeL>*2=E=d_ZPncV3G^(>~;g@}vM(a^sMQZgB>M)?U;UYG{W93r236FRYc7zI7Nr zKkTZ?l#{$fVSp@@WN~iCuIr9BZ`Xc7rIEvh(dV|@niyuUrdtJmWU|k#$fWph{yy*T zePPr5hT>Q|%`i8=zr)Qis)7;Pfy%G57ixUrGzKPJ@F=u zVGxR;D8zZV(asY&AGCz>FdJI#V?Jrz9{15R#8kVnM)^cgp2pQGxRll2lVXBzefyU~ z?$HDxr8VnG!OsF{AJo-19QDDX)jB_XJQSm=P28!CEcU6H_0ta@Ij(>9<#SM>WK!XC zoRJc2EDPcAe#OkZ-Y-*E>bFBfmvmJdL3${Fy+s^U(vN)9Y*I!Zt&lg%20AWMAQW_t+=L)JdkZlK;v4G&_R|)M*>gZ7epkM+>9|{d(42GB#USeIJ4sPU3Z;DY zqgDM1i3YB@4LXta^SW(;Rkof&622kmUMNZ>2gS?;M-VMQpoL#3!^jE5&KwG%3&&jQ z#KR6h6zkYxouyJCSeoF9I=kdcW?~l3DD{Jig>c?+v5!6Ynw&3phsGfm*0IMSWg15y z`;I^Atci1wabm?l<&7AG&a=AV1Vq-1TT4k_*tS0gQMlw7M1+mk=A=vAcqZPvDuG5d z@BHtuEaTR83X~ETsN9*`Mr_h&YXzLAiv?HkUh@Qbv->8v2lFPl^2@$m@h_eh)9OS~ zB&GcRhYAWJS)h{)*%7}GR0dKzDK~B$jH^JzS1;D;IJhjt!f`Z@mP3ALF2bLW@Y}t1 zE6MAtm$-Kwc0Mw84cYN#67#I#rwztwdF%t`S=)MjII?Q#h4#vrM81WJJSs zG}2yq6~kBK)TgCL50ATR!l=WYSz#;NX}eU0X;K!J%Rj7&oK_s2bXKjJQjS*MZz~Z6 zmWtzq*@RN2j9)^Uz0`?_EOd7mY;j6T_c*=cNspisU@V;AojFMG%_CD|YIvuI@y?- z`eBEU>w`)4v$-bYlvuETeY3|<16}VBlmtZ#&9=$#tqokqqDV+TQIbQt5x~nlPBj?_OiA2B)|4+bDi;0&^4ly@-Y1%hBG4bkYRWyF$?yo50#b~ LM6E`yI3E2kl{ft{ literal 109 zcmca7#4?ou2pEA_28dOFm>Gz5fLI!cEr3`8h(mxF1VHLQAUHKAHMvB=u_!qsGq1QL gF(*eMCowO*G%-DuA-JF@F*zeuA+0pE2w4RK02#&>KmY&$ diff --git a/archinstall/locales/de/LC_MESSAGES/base.po b/archinstall/locales/de/LC_MESSAGES/base.po index baf62b98..7c4162d3 100644 --- a/archinstall/locales/de/LC_MESSAGES/base.po +++ b/archinstall/locales/de/LC_MESSAGES/base.po @@ -1,351 +1,506 @@ -#: lib/user_interaction.py:82 +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.0\n" + +#: lib/installer.py:144 +msgid "[!] A log file has been created here: {} {}" +msgstr "[!] Eine Logdatei wurde erstellt: {} {}" + +#: lib/installer.py:145 +msgid " Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues" +msgstr "Bitte melden sie das Problem mit der erstellten Datei auf https://github.com/archlinux/archinstall/issues" + +#: lib/user_interaction.py:83 msgid "Do you really want to abort?" -msgstr "" +msgstr "Wollen Sie wirklich abbrechen?" -#: lib/user_interaction.py:100 +#: lib/user_interaction.py:101 lib/user_interaction.py:104 msgid "And one more time for verification: " -msgstr "" +msgstr "Und nocheinmal zur Besätigung: " -#: lib/user_interaction.py:271 +#: lib/user_interaction.py:272 lib/user_interaction.py:275 msgid "Would you like to use swap on zram?" -msgstr "" +msgstr "Möchten Sie swap mit zram verwenden?" -#: lib/user_interaction.py:277 -msgid "" -"Would you like to use automatic time synchronization (NTP) with the default " -"time servers?" -msgstr "" - -#: lib/user_interaction.py:278 -msgid "" -"Hardware time and other post-configuration steps might be required in order " -"for NTP to work. For more information, please check the Arch wiki" -msgstr "" - -#: lib/user_interaction.py:284 +#: lib/user_interaction.py:285 lib/user_interaction.py:288 msgid "Desired hostname for the installation: " -msgstr "" +msgstr "Gewnüschter Hostname für die Installation: " -#: lib/user_interaction.py:289 +#: lib/user_interaction.py:290 lib/user_interaction.py:293 msgid "Username for required superuser with sudo privileges: " -msgstr "" +msgstr "Benutzername für den erforderlichen superuser mit sudo Rechten: " -#: lib/user_interaction.py:303 lib/user_interaction.py:320 -msgid "Password for user \"{}\"" -msgstr "" - -#: lib/user_interaction.py:309 +#: lib/user_interaction.py:310 lib/user_interaction.py:313 msgid "Any additional users to install (leave blank for no users): " -msgstr "" +msgstr "Geben Sie weitere Benutzernamen ein die installiert werden sollen (leer lassen für keine weiteren Benutzer): " -#: lib/user_interaction.py:323 +#: lib/user_interaction.py:324 lib/user_interaction.py:327 msgid "Should this user be a superuser (sudoer)?" -msgstr "" +msgstr "Soll dieser Benutzer ein superuser sein (sudoer)?" -#: lib/user_interaction.py:339 +#: lib/user_interaction.py:340 lib/user_interaction.py:343 lib/user_interaction.py:346 msgid "Select a timezone" -msgstr "" +msgstr "Bitte wählen Sie eine Zeitzone aus" -#: lib/user_interaction.py:353 +#: lib/user_interaction.py:354 lib/user_interaction.py:357 lib/user_interaction.py:360 msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?" -msgstr "" +msgstr "Möchten Sie GRUB als bootloader anstelle von system-boot verwenden?" -#: lib/user_interaction.py:363 +#: lib/user_interaction.py:364 lib/user_interaction.py:367 lib/user_interaction.py:370 msgid "Choose a bootloader" -msgstr "" +msgstr "Bitte wählen Sie einen bootloader aus" -#: lib/user_interaction.py:379 +#: lib/user_interaction.py:380 lib/user_interaction.py:383 lib/user_interaction.py:386 msgid "Choose an audio server" -msgstr "" +msgstr "Bitte wählen Sie einen Audio server aus" -#: lib/user_interaction.py:390 -msgid "" -"Only packages such as base, base-devel, linux, linux-firmware, efibootmgr " -"and optional profile packages are installed." -msgstr "" +#: lib/user_interaction.py:391 lib/user_interaction.py:394 lib/user_interaction.py:397 +msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr and optional profile packages are installed." +msgstr "Nur die Packete base, base-devel, linux, linux-firmware, efibootmgr und optionale Profilpackete werden installiert" -#: lib/user_interaction.py:391 -msgid "" -"If you desire a web browser, such as firefox or chromium, you may specify it " -"in the following prompt." -msgstr "" +#: lib/user_interaction.py:392 lib/user_interaction.py:395 lib/user_interaction.py:398 +msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt." +msgstr "Wenn Sie einen Webbrowser, z.B. Firefox oder Chromium, installieren möchten, können Sie diese nun eingeben." -#: lib/user_interaction.py:395 -msgid "" -"Write additional packages to install (space separated, leave blank to skip): " -msgstr "" +#: lib/user_interaction.py:396 lib/user_interaction.py:399 lib/user_interaction.py:402 +msgid "Write additional packages to install (space separated, leave blank to skip): " +msgstr "Schreiben Sie zusätzliche Packete die installiert werden sollen mit einem Leerzeichen getrennt (zum Überspringen leer lassen): " -#: lib/user_interaction.py:418 +#: lib/user_interaction.py:419 lib/user_interaction.py:422 lib/user_interaction.py:425 msgid "Copy ISO network configuration to installation" -msgstr "" +msgstr "ISO netzwerk Einstellungen in die Installation kopieren" -#: lib/user_interaction.py:419 -msgid "" -"Use NetworkManager (necessary to configure internet graphically in GNOME and " -"KDE)" -msgstr "" +#: lib/user_interaction.py:420 lib/user_interaction.py:423 lib/user_interaction.py:426 +msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)" +msgstr "NetworkManager benutzen (notwendig um Internet auf graphische Weise in GNOME und KDE einzustellen)" -#: lib/user_interaction.py:427 +#: lib/user_interaction.py:428 lib/user_interaction.py:431 lib/user_interaction.py:434 msgid "Select one network interface to configure" -msgstr "" +msgstr "Bitte wählen Sie ein netzwerk zur Konfiguration aus" -#: lib/user_interaction.py:440 -msgid "" -"Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" -msgstr "" +#: lib/user_interaction.py:441 lib/user_interaction.py:444 lib/user_interaction.py:447 +msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" +msgstr "Bitte wählen Sie einen Modus zur Konfiguration von \"{}\" aus oder Überspringen um mit dem voreingestellten Modus \"{}\" fortzufahren" -#: lib/user_interaction.py:445 +#: lib/user_interaction.py:446 lib/user_interaction.py:449 lib/user_interaction.py:452 msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " -msgstr "" +msgstr "Bitte geben Sie eine IP Adresse und ein Subnet für {} ein (z.B. 192.168.0.5/24)" -#: lib/user_interaction.py:460 +#: lib/user_interaction.py:461 lib/user_interaction.py:464 lib/user_interaction.py:467 msgid "Enter your gateway (router) IP address or leave blank for none: " -msgstr "" +msgstr "Bitte geben Sie eine gateway (router) IP Adresse ein (leer lassen für kein Adresse): " -#: lib/user_interaction.py:475 +#: lib/user_interaction.py:476 lib/user_interaction.py:479 lib/user_interaction.py:482 msgid "Enter your DNS servers (space separated, blank for none): " -msgstr "" +msgstr "Bitte geben Sie die DNS server ein (mit Leerzeichen getrennt oder leer lassen für keinen server): " -#: lib/user_interaction.py:509 +#: lib/user_interaction.py:510 lib/user_interaction.py:513 lib/user_interaction.py:516 msgid "Select which filesystem your main partition should use" -msgstr "" +msgstr "Bitte wählen Sie ein Dateisystem aus, welches für die Hauptpartition verwendet werden soll" -#: lib/user_interaction.py:555 +#: lib/user_interaction.py:556 lib/user_interaction.py:559 lib/user_interaction.py:562 msgid "Current partition layout" -msgstr "" +msgstr "Momentanes Partitionslayout" -#: lib/user_interaction.py:606 +#: lib/user_interaction.py:607 lib/user_interaction.py:614 lib/user_interaction.py:617 lib/user_interaction.py:620 msgid "" "Select what to do with\n" "{}" msgstr "" +"Bitte wählen Sie eine Aktion aus für\n" +"{}" -#: lib/user_interaction.py:623 lib/user_interaction.py:708 +#: lib/user_interaction.py:624 lib/user_interaction.py:709 lib/user_interaction.py:631 lib/user_interaction.py:716 lib/user_interaction.py:634 lib/user_interaction.py:719 lib/user_interaction.py:637 lib/user_interaction.py:722 msgid "Enter a desired filesystem type for the partition" -msgstr "" +msgstr "Bitte wählen Sie einen Dateisystemtyp für die Partition aus" -#: lib/user_interaction.py:625 +#: lib/user_interaction.py:626 lib/user_interaction.py:633 lib/user_interaction.py:636 lib/user_interaction.py:639 msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "" +msgstr "Bitte geben Sie den start Sektor ein (in Prozent oder Blocknummer, default: {}): " -#: lib/user_interaction.py:634 -msgid "" -"Enter the end sector of the partition (percentage or block number, ex: {}): " -"\"" -msgstr "" +#: lib/user_interaction.py:635 lib/user_interaction.py:642 lib/user_interaction.py:645 lib/user_interaction.py:648 +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: {}): " -#: lib/user_interaction.py:660 +#: lib/user_interaction.py:661 lib/user_interaction.py:668 lib/user_interaction.py:671 lib/user_interaction.py:674 msgid "{} contains queued partitions, this will remove those, are you sure?" -msgstr "" +msgstr "{} enthält Partitionen in der Warteschlange, dies werden damit entfernt, sind sie sicher?" -#: lib/user_interaction.py:673 +#: lib/user_interaction.py:674 lib/user_interaction.py:681 lib/user_interaction.py:684 lib/user_interaction.py:687 msgid "" "{}\n" "\n" "Select by index which partitions to delete" msgstr "" +"{}\n" +"\n" +"Wählen sie anhand vom index welche Partitionen gelöscht werden sollen" -#: lib/user_interaction.py:681 +#: lib/user_interaction.py:682 lib/user_interaction.py:689 lib/user_interaction.py:692 lib/user_interaction.py:695 msgid "" "{}\n" "\n" "Select by index which partition to mount where" msgstr "" +"{}\n" +"\n" +"Wählen sie anhand vom index welche Partitionen zu mounten" -#: lib/user_interaction.py:685 -msgid "" -" * Partition mount-points are relative to inside the installation, the boot " -"would be /boot as an example." -msgstr "" +#: lib/user_interaction.py:686 lib/user_interaction.py:693 lib/user_interaction.py:696 lib/user_interaction.py:699 +msgid " * Partition mount-points are relative to inside the installation, the boot would be /boot as an example." +msgstr " * Die Mountorte sind relativ zur Installation, zum Beispiel boot würde gemountet auf /boot" -#: lib/user_interaction.py:686 +#: lib/user_interaction.py:687 lib/user_interaction.py:694 lib/user_interaction.py:697 lib/user_interaction.py:700 msgid "Select where to mount partition (leave blank to remove mountpoint): " -msgstr "" +msgstr "Bitte geben sie an wo die Partition gemounted werden soll (leer lassen um den Mountort zu entfernen): " -#: lib/user_interaction.py:697 +#: lib/user_interaction.py:698 lib/user_interaction.py:705 lib/user_interaction.py:708 lib/user_interaction.py:711 msgid "" "{}\n" "\n" "Select which partition to mask for formatting" msgstr "" +"{}\n" +"\n" +"Bitte wählen sie welche Partition formatiert werden soll" -#: lib/user_interaction.py:716 +#: lib/user_interaction.py:717 lib/user_interaction.py:724 lib/user_interaction.py:727 lib/user_interaction.py:730 msgid "" "{}\n" "\n" "Select which partition to mark as encrypted" msgstr "" +"{}\n" +"\n" +"Bitte wählen sie welche Partition verschlüsselt werden soll" -#: lib/user_interaction.py:724 +#: lib/user_interaction.py:725 lib/user_interaction.py:732 lib/user_interaction.py:735 lib/user_interaction.py:738 msgid "" "{}\n" "\n" "Select which partition to mark as bootable" msgstr "" +"{}\n" +"\n" +"Bitte wählen sie welche Partition bootbar ist" -#: lib/user_interaction.py:731 +#: lib/user_interaction.py:732 lib/user_interaction.py:739 lib/user_interaction.py:742 lib/user_interaction.py:745 msgid "" "{}\n" "\n" "Select which partition to set a filesystem on" msgstr "" +"{}\n" +"\n" +"Bitte wählen sie auf welche Partition ein Dateisystem eingerichtet werden soll" -#: lib/user_interaction.py:738 +#: lib/user_interaction.py:739 lib/user_interaction.py:746 lib/user_interaction.py:749 lib/user_interaction.py:752 msgid "Enter a desired filesystem type for the partition: " -msgstr "" +msgstr "Bitte geben sie einen gewünschten Dateisystemtyp für die Partition ein: " -#: lib/user_interaction.py:759 lib/menu/selection_menu.py:116 +#: lib/user_interaction.py:760 lib/menu/selection_menu.py:141 lib/user_interaction.py:767 lib/menu/selection_menu.py:139 lib/menu/selection_menu.py:143 lib/user_interaction.py:770 lib/user_interaction.py:773 msgid "Select Archinstall language" -msgstr "Sprache fuer Archinstall" +msgstr "Sprache für Archinstall" -#: lib/user_interaction.py:764 +#: lib/user_interaction.py:765 lib/user_interaction.py:772 lib/user_interaction.py:775 lib/user_interaction.py:778 msgid "Wipe all selected drives and use a best-effort default partition layout" -msgstr "" +msgstr "Alle Laufwerke löschen und ein vorgegebenes Partitionenlayout verwenden" -#: lib/user_interaction.py:765 -msgid "" -"Select what to do with each individual drive (followed by partition usage)" -msgstr "" +#: lib/user_interaction.py:766 lib/user_interaction.py:773 lib/user_interaction.py:776 lib/user_interaction.py:779 +msgid "Select what to do with each individual drive (followed by partition usage)" +msgstr "Bitte geben sie an was mit jedem individuellem Laufwerk geschehen soll" -#: lib/user_interaction.py:768 +#: lib/user_interaction.py:769 lib/user_interaction.py:770 lib/user_interaction.py:777 lib/user_interaction.py:780 lib/user_interaction.py:783 msgid "Select what you wish to do with the selected block devices" -msgstr "" +msgstr "Bitte wählen sie was mit dem ausgewählten Gerät geschehen soll" -#: lib/user_interaction.py:821 -msgid "" -"This is a list of pre-programmed profiles, they might make it easier to " -"install things like desktop environments" -msgstr "" +#: lib/user_interaction.py:822 lib/user_interaction.py:823 lib/user_interaction.py:830 lib/user_interaction.py:833 lib/user_interaction.py:836 +msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments" +msgstr "Dies ist eine Liste von bereits programmierten Profilen, diese ermöglichen es einfacher Desktop Umgebungen einzustellen" -#: lib/user_interaction.py:846 +#: lib/user_interaction.py:846 lib/user_interaction.py:847 lib/user_interaction.py:854 lib/user_interaction.py:857 lib/user_interaction.py:860 msgid "Select Keyboard layout" -msgstr "" +msgstr "Bitte wählen sie ein Tastaturlayout aus" -#: lib/user_interaction.py:861 +#: lib/user_interaction.py:861 lib/user_interaction.py:862 lib/user_interaction.py:869 lib/user_interaction.py:872 lib/user_interaction.py:875 msgid "Select one of the regions to download packages from" -msgstr "" +msgstr "Bitte wählen sie eine Region zum downloaden von Packeten aus" -#: lib/user_interaction.py:883 +#: lib/user_interaction.py:883 lib/user_interaction.py:884 lib/user_interaction.py:891 lib/user_interaction.py:894 lib/user_interaction.py:897 msgid "Select one or more hard drives to use and configure" -msgstr "" +msgstr "Bitte wählen sie eine oder mehrere Laufwerke aus die konfiguriert werden sollen" -#: lib/user_interaction.py:910 -msgid "" -"For the best compatibility with your AMD hardware, you may want to use " -"either the all open-source or AMD / ATI options." -msgstr "" +#: lib/user_interaction.py:910 lib/user_interaction.py:911 lib/user_interaction.py:918 lib/user_interaction.py:921 lib/user_interaction.py:924 +msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options." +msgstr "Für die beste kompabilität mit ihrer AMD hardware, sollten sie womöglich die open-source oder AMD / ATI optionen verwenden" -#: lib/user_interaction.py:912 -msgid "" -"For the best compatibility with your Intel hardware, you may want to use " -"either the all open-source or Intel options.\n" -msgstr "" +#: lib/user_interaction.py:912 lib/user_interaction.py:913 lib/user_interaction.py:920 lib/user_interaction.py:923 lib/user_interaction.py:926 +msgid "For the best compatibility with your Intel hardware, you may want to use either the all open-source or Intel options.\n" +msgstr "Für die beste kompabilität mit ihrer Intel hardware, sollten sie womöglich die open-source oder Intel optionen verwenden.\n" -#: lib/user_interaction.py:914 -msgid "" -"For the best compatibility with your Nvidia hardware, you may want to use " -"the Nvidia proprietary driver.\n" -msgstr "" +#: lib/user_interaction.py:914 lib/user_interaction.py:915 lib/user_interaction.py:922 lib/user_interaction.py:925 lib/user_interaction.py:928 +msgid "For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n" +msgstr "Für die beste kompabilität mit ihrer Nvidia hardware, sollten sie womöglich die Nvidia proprietary driver option verwenden.\n" -#: lib/user_interaction.py:917 +#: lib/user_interaction.py:917 lib/user_interaction.py:918 lib/user_interaction.py:925 lib/user_interaction.py:928 lib/user_interaction.py:931 msgid "" "\n" "\n" "Select a graphics driver or leave blank to install all open-source drivers" msgstr "" +"\n" +"\n" +"Bitte wählen sie einen Grafiktreiber aus oder leer lassen um alle open-source Treiber zu installieren" -#: lib/user_interaction.py:921 +#: lib/user_interaction.py:921 lib/user_interaction.py:922 lib/user_interaction.py:929 lib/user_interaction.py:932 lib/user_interaction.py:935 msgid "All open-source (default)" -msgstr "" +msgstr "Alle open-source (default)" -#: lib/user_interaction.py:940 +#: lib/user_interaction.py:940 lib/user_interaction.py:941 lib/user_interaction.py:948 lib/user_interaction.py:951 lib/user_interaction.py:954 msgid "Choose which kernels to use or leave blank for default \"{}\"" -msgstr "" +msgstr "Bitte wählen sie welche Kernel benutzt werden sollen oder leer lassen für default \"{}\"" -#: lib/user_interaction.py:954 +#: lib/user_interaction.py:954 lib/user_interaction.py:955 lib/user_interaction.py:962 lib/user_interaction.py:965 lib/user_interaction.py:968 msgid "Choose which locale language to use" -msgstr "" +msgstr "Bitte wählen sie eine lokale Sprache aus" -#: lib/user_interaction.py:968 +#: lib/user_interaction.py:968 lib/user_interaction.py:969 lib/user_interaction.py:976 lib/user_interaction.py:979 lib/user_interaction.py:982 msgid "Choose which locale encoding to use" -msgstr "" +msgstr "Bitte wählen sie eine lokale Kodierung aus" -#: lib/user_interaction.py:1009 +#: lib/user_interaction.py:1009 lib/user_interaction.py:1010 lib/user_interaction.py:1017 lib/user_interaction.py:1020 lib/user_interaction.py:1023 msgid "Select one of the values shown below: " -msgstr "" +msgstr "Bitte wählen sie einen der folgenden Werte aus:" -#: lib/user_interaction.py:1050 +#: lib/user_interaction.py:1050 lib/user_interaction.py:1051 lib/user_interaction.py:1058 lib/user_interaction.py:1061 lib/user_interaction.py:1064 msgid "Select one or more of the options below: " -msgstr "" +msgstr "Bitte wählen sie eine oder mehrere Optionen aus: " -#: lib/menu/selection_menu.py:122 +#: lib/disk/filesystem.py:86 +msgid "Adding partition...." +msgstr "Partitionen werden hinzugefügt..." + +#: lib/disk/filesystem.py:139 lib/disk/filesystem.py:141 +msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's." +msgstr "Bitte geben sie einen gültigen Dateisystemtyp ein um fortzufahren. Wenden sie sich an \"man parted\" für eine Liste von gültigen Typen." + +#: lib/profiles.py:89 +msgid "Error: Listing profiles on URL \"{}\" resulted in:" +msgstr "Fehler: Auflistung von Profilen mit URL \"{}\":" + +#: lib/profiles.py:92 +msgid "Error: Could not decode \"{}\" result as JSON:" +msgstr "Fehler: \"{}\" konnte nicht in ein JSON format dekodiert werden:" + +#: lib/menu/selection_menu.py:146 lib/menu/selection_menu.py:144 lib/menu/selection_menu.py:148 msgid "Select keyboard layout" -msgstr "" +msgstr "Tastaturlayout auswählen" -#: lib/menu/selection_menu.py:125 +#: lib/menu/selection_menu.py:149 lib/menu/selection_menu.py:147 lib/menu/selection_menu.py:151 msgid "Select mirror region" -msgstr "" +msgstr "Mirror-region auswählen" -#: lib/menu/selection_menu.py:130 +#: lib/menu/selection_menu.py:154 lib/menu/selection_menu.py:152 lib/menu/selection_menu.py:156 msgid "Select locale language" -msgstr "" +msgstr "Lokale Sprache auswählen" -#: lib/menu/selection_menu.py:132 +#: lib/menu/selection_menu.py:156 lib/menu/selection_menu.py:154 lib/menu/selection_menu.py:158 msgid "Select locale encoding" -msgstr "" +msgstr "Lokale Kodierung auswählen" -#: lib/menu/selection_menu.py:135 +#: lib/menu/selection_menu.py:159 lib/menu/selection_menu.py:157 lib/menu/selection_menu.py:161 msgid "Select harddrives" -msgstr "" +msgstr "Laufwerke auswählen" -#: lib/menu/selection_menu.py:139 +#: lib/menu/selection_menu.py:163 lib/menu/selection_menu.py:161 lib/menu/selection_menu.py:165 msgid "Select disk layout" -msgstr "" +msgstr "Laufwerke-layout auswählen" -#: lib/menu/selection_menu.py:147 +#: lib/menu/selection_menu.py:171 lib/menu/selection_menu.py:169 lib/menu/selection_menu.py:173 msgid "Set encryption password" -msgstr "" +msgstr "Verschlüsselungspasswort angeben" -#: lib/menu/selection_menu.py:153 +#: lib/menu/selection_menu.py:177 lib/menu/selection_menu.py:175 lib/menu/selection_menu.py:179 msgid "Use swap" -msgstr "" +msgstr "Swap benützen" -#: lib/menu/selection_menu.py:158 +#: lib/menu/selection_menu.py:182 lib/menu/selection_menu.py:180 lib/menu/selection_menu.py:184 msgid "Select bootloader" -msgstr "" +msgstr "Bootloader auswählen" -#: lib/menu/selection_menu.py:164 +#: lib/menu/selection_menu.py:188 lib/menu/selection_menu.py:186 lib/menu/selection_menu.py:190 msgid "Set root password" -msgstr "" +msgstr "Root Passwort wählen" -#: lib/menu/selection_menu.py:169 +#: lib/menu/selection_menu.py:193 lib/menu/selection_menu.py:191 lib/menu/selection_menu.py:195 msgid "Specify superuser account" -msgstr "" +msgstr "Superuser Konto wählen" -#: lib/menu/selection_menu.py:175 +#: lib/menu/selection_menu.py:199 lib/menu/selection_menu.py:197 lib/menu/selection_menu.py:201 msgid "Specify user account" -msgstr "" +msgstr "Benutzerkonto wählen" -#: lib/menu/selection_menu.py:181 +#: lib/menu/selection_menu.py:205 lib/menu/selection_menu.py:203 lib/menu/selection_menu.py:207 msgid "Specify profile" -msgstr "" +msgstr "Profile auswählen" -#: lib/menu/selection_menu.py:186 +#: lib/menu/selection_menu.py:210 lib/menu/selection_menu.py:208 lib/menu/selection_menu.py:212 msgid "Select audio" -msgstr "" +msgstr "Audio auswählen" -#: lib/menu/selection_menu.py:190 +#: lib/menu/selection_menu.py:214 lib/menu/selection_menu.py:212 lib/menu/selection_menu.py:216 msgid "Select kernels" -msgstr "" +msgstr "Kernel auswählen" -#: lib/menu/selection_menu.py:195 +#: lib/menu/selection_menu.py:219 lib/menu/selection_menu.py:217 lib/menu/selection_menu.py:221 msgid "Additional packages to install" -msgstr "" +msgstr "Zus. Packete für die Installation" -#: lib/menu/selection_menu.py:200 +#: lib/menu/selection_menu.py:224 lib/menu/selection_menu.py:222 lib/menu/selection_menu.py:226 msgid "Configure network" -msgstr "" +msgstr "Netzwerkonfiguration" -#: lib/menu/selection_menu.py:208 +#: lib/menu/selection_menu.py:232 lib/menu/selection_menu.py:230 lib/menu/selection_menu.py:234 msgid "Set automatic time sync (NTP)" +msgstr "Autom. Zeitsynchronisierung (NTP)" + +#: lib/menu/selection_menu.py:310 lib/menu/selection_menu.py:308 lib/menu/selection_menu.py:315 +msgid "Install ({} config(s) missing)" +msgstr "Installieren ({} konfiguration(en) ausständig)" + +#: lib/menu/selection_menu.py:373 lib/menu/selection_menu.py:371 lib/menu/selection_menu.py:378 +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 "" +"Sie haben sich entschieden keine Laufwerke auszuwählen\n" +"und jene Einstellungen zu verwenden welche momentan auf {} verfügbar sind (experimentell)\n" +"WARNUNG: Archinstall wird die Kompabilität der Einstellung nicht überprüfen\n" +"Wollen sie trotzdem fortfahren?" + +#: lib/disk/filesystem.py:97 +msgid "Re-using partition instance: {}" +msgstr "Wiederverwenden der Partitionsinstanz: {}" + +#: lib/user_interaction.py:590 lib/user_interaction.py:593 lib/user_interaction.py:596 +msgid "Create a new partition" +msgstr "Neue Partition erstellen" + +#: lib/user_interaction.py:592 lib/user_interaction.py:595 lib/user_interaction.py:598 +msgid "Delete a partition" +msgstr "Partition löschen" + +#: lib/user_interaction.py:593 lib/user_interaction.py:596 lib/user_interaction.py:599 +msgid "Clear/Delete all partitions" +msgstr "Alle partitionen löschen" + +#: lib/user_interaction.py:594 lib/user_interaction.py:597 lib/user_interaction.py:600 +msgid "Assign mount-point for a partition" +msgstr "Mountort für Partition angeben" + +#: lib/user_interaction.py:595 lib/user_interaction.py:598 lib/user_interaction.py:601 +msgid "Mark/Unmark a partition to be formatted (wipes data)" +msgstr "Markieren welche Partition formattiert werden soll (alle Daten werden gelöscht)" + +#: lib/user_interaction.py:596 lib/user_interaction.py:599 lib/user_interaction.py:602 +msgid "Mark/Unmark a partition as encrypted" +msgstr "Markieren welche Partitionen verschlüsselt werden sollen" + +#: lib/user_interaction.py:597 lib/user_interaction.py:600 lib/user_interaction.py:603 +msgid "Mark/Unmark a partition as bootable (automatic for /boot)" +msgstr "Markieren welche Partition bootbar ist (automatisch für /boot)" + +#: lib/user_interaction.py:598 lib/user_interaction.py:601 lib/user_interaction.py:604 +msgid "Set desired filesystem for a partition" +msgstr "Bitte wählen Sie einen Dateisystemtyp für die Partition aus" + +#: lib/menu/selection_menu.py:239 lib/menu/selection_menu.py:237 lib/menu/selection_menu.py:241 lib/menu/selection_menu.py:270 +msgid "Abort" +msgstr "Abbrechen" + +#: lib/menu/selection_menu.py:183 lib/menu/selection_menu.py:187 +msgid "Specify hostname" +msgstr "Hostnamen wählen" + +#: lib/menu/selection_menu.py:228 +msgid "Not configured, unavailable unless setup manually" +msgstr "Nicht konfiguriert, unverfügbar wenn nicht selber eingestellt" + +#: lib/menu/selection_menu.py:231 +msgid "Select timezone" +msgstr "Zeitzone wählen" + +#: lib/menu/selection_menu.py:266 +msgid "Set/Modify the below options" +msgstr "Setzen sie die unten stehenden Einstellungen" + +#: lib/menu/selection_menu.py:272 +msgid "Install" +msgstr "Installieren" + +#: lib/menu/menu.py:68 +msgid "" +"Use ESC to skip\n" +"\n" +msgstr "" +"ESC um zu Überspringen\n" +"\n" + +#: lib/user_interaction.py:591 lib/user_interaction.py:594 lib/user_interaction.py:597 +msgid "Suggest partition layout" +msgstr "Ein Partitionslayout vorschlagen" + +#: lib/user_interaction.py:101 +msgid "Enter a password: " +msgstr "Passwort eingeben: " + +#: lib/disk/filesystem.py:117 +msgid "Enter a encryption password for {}" +msgstr "Verschlüsselungspasswort angeben für {}" + +#: lib/menu/selection_menu.py:174 +msgid "Enter disk encryption password (leave blank for no encryption): " +msgstr "Geben sie ein Verschlüsselungspasswort ein (leer lassen um zu Überspringen): " + +#: lib/menu/selection_menu.py:407 +msgid "Create a required super-user with sudo privileges: " +msgstr "Geben sie einen super-user mit sudo Privilegien an: " + +#: lib/menu/selection_menu.py:347 +msgid "Enter root password (leave blank to disable root): " +msgstr "Geben sie ein Root passwort ein (leer lassen um Root zu deaktivieren): " + +#: lib/user_interaction.py:307 lib/user_interaction.py:324 +msgid "Password for user \"{}\": " +msgstr "Passwort für Benutzer \"{}\": " + +#: lib/user_interaction.py:405 lib/user_interaction.py:408 +msgid "Verifying that additional packages exist (this might take a few seconds)" +msgstr "Angegebene Packete werden verifiziert (dies könnte einige Sekunden dauern)" + +#: lib/user_interaction.py:281 +msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n" +msgstr "Möchten sie automatische Zeitsynchronisierung mit dem default Server einschalten?\n" + +#: lib/user_interaction.py:282 +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 "" +"Hardware Zeit und andere Einstellungsschritte könnten notwendig sein um NTP zu benutzen.\n" +"Für weitere Informationen wenden sie sich bitte an das Arch wiki" + +#: lib/menu/selection_menu.py:411 +msgid "Enter a username to create an additional user (leave blank to skip): " +msgstr "Geben sie einen weiteren Benutzernamen an der angelegt werden soll (leer lassen um zu Überspringen): " diff --git a/archinstall/locales/en/LC_MESSAGES/base.mo b/archinstall/locales/en/LC_MESSAGES/base.mo index bbd3b9e8c0cc4e2ddc47747130c57a374a5e1bf3..c89651e7dc1098620ad5ac069c1cf79c718a55df 100644 GIT binary patch delta 33 ecmeysG=*`3if9xA1A`?HGXgOjO#Bwb$N&Ics|3dY delta 254 zcmYL@y-ve06op;JJjET@(2c|ZQmqQr5ECMtA0=rex>@wf3Mz4AyNFD@0!Tb4kAOS% zENA(S&iA|cyZFBRx?M1~WQ@f+r*Za;UIP|;+>-Ny9XT}O;aTJowzBPtx=LD_tP5Cr zGwkvHXgv0oL(QQ8OWU8hHX(7`$mj~k_+ z5~YNdEJdN#BFkFYb$5{+%~2b|p7c8hC8~ULQdudrJ`AaK=FCKepXCm68p*}`s5Wz$ RWN%Q~! diff --git a/archinstall/locales/en/LC_MESSAGES/base.po b/archinstall/locales/en/LC_MESSAGES/base.po index ce61097b..34e2e62f 100644 --- a/archinstall/locales/en/LC_MESSAGES/base.po +++ b/archinstall/locales/en/LC_MESSAGES/base.po @@ -1,351 +1,468 @@ -#: lib/user_interaction.py:82 +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/installer.py:144 +msgid "[!] A log file has been created here: {} {}" +msgstr "" + +#: lib/installer.py:145 +msgid " Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues" +msgstr "" + +#: lib/user_interaction.py:83 msgid "Do you really want to abort?" msgstr "" -#: lib/user_interaction.py:100 +#: lib/user_interaction.py:101 lib/user_interaction.py:104 msgid "And one more time for verification: " msgstr "" -#: lib/user_interaction.py:271 +#: lib/user_interaction.py:272 lib/user_interaction.py:275 msgid "Would you like to use swap on zram?" msgstr "" -#: lib/user_interaction.py:277 -msgid "" -"Would you like to use automatic time synchronization (NTP) with the default " -"time servers?" -msgstr "" - -#: lib/user_interaction.py:278 -msgid "" -"Hardware time and other post-configuration steps might be required in order " -"for NTP to work. For more information, please check the Arch wiki" -msgstr "" - -#: lib/user_interaction.py:284 +#: lib/user_interaction.py:285 lib/user_interaction.py:288 msgid "Desired hostname for the installation: " msgstr "" -#: lib/user_interaction.py:289 +#: lib/user_interaction.py:290 lib/user_interaction.py:293 msgid "Username for required superuser with sudo privileges: " msgstr "" -#: lib/user_interaction.py:303 lib/user_interaction.py:320 -msgid "Password for user \"{}\"" -msgstr "" - -#: lib/user_interaction.py:309 +#: lib/user_interaction.py:310 lib/user_interaction.py:313 msgid "Any additional users to install (leave blank for no users): " msgstr "" -#: lib/user_interaction.py:323 +#: lib/user_interaction.py:324 lib/user_interaction.py:327 msgid "Should this user be a superuser (sudoer)?" msgstr "" -#: lib/user_interaction.py:339 +#: lib/user_interaction.py:340 lib/user_interaction.py:343 lib/user_interaction.py:346 msgid "Select a timezone" msgstr "" -#: lib/user_interaction.py:353 +#: lib/user_interaction.py:354 lib/user_interaction.py:357 lib/user_interaction.py:360 msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?" msgstr "" -#: lib/user_interaction.py:363 +#: lib/user_interaction.py:364 lib/user_interaction.py:367 lib/user_interaction.py:370 msgid "Choose a bootloader" msgstr "" -#: lib/user_interaction.py:379 +#: lib/user_interaction.py:380 lib/user_interaction.py:383 lib/user_interaction.py:386 msgid "Choose an audio server" msgstr "" -#: lib/user_interaction.py:390 -msgid "" -"Only packages such as base, base-devel, linux, linux-firmware, efibootmgr " -"and optional profile packages are installed." +#: lib/user_interaction.py:391 lib/user_interaction.py:394 lib/user_interaction.py:397 +msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr and optional profile packages are installed." msgstr "" -#: lib/user_interaction.py:391 -msgid "" -"If you desire a web browser, such as firefox or chromium, you may specify it " -"in the following prompt." +#: lib/user_interaction.py:392 lib/user_interaction.py:395 lib/user_interaction.py:398 +msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt." msgstr "" -#: lib/user_interaction.py:395 -msgid "" -"Write additional packages to install (space separated, leave blank to skip): " +#: lib/user_interaction.py:396 lib/user_interaction.py:399 lib/user_interaction.py:402 +msgid "Write additional packages to install (space separated, leave blank to skip): " msgstr "" -#: lib/user_interaction.py:418 +#: lib/user_interaction.py:419 lib/user_interaction.py:422 lib/user_interaction.py:425 msgid "Copy ISO network configuration to installation" msgstr "" -#: lib/user_interaction.py:419 -msgid "" -"Use NetworkManager (necessary to configure internet graphically in GNOME and " -"KDE)" +#: lib/user_interaction.py:420 lib/user_interaction.py:423 lib/user_interaction.py:426 +msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)" msgstr "" -#: lib/user_interaction.py:427 +#: lib/user_interaction.py:428 lib/user_interaction.py:431 lib/user_interaction.py:434 msgid "Select one network interface to configure" msgstr "" -#: lib/user_interaction.py:440 -msgid "" -"Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" +#: lib/user_interaction.py:441 lib/user_interaction.py:444 lib/user_interaction.py:447 +msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" msgstr "" -#: lib/user_interaction.py:445 +#: lib/user_interaction.py:446 lib/user_interaction.py:449 lib/user_interaction.py:452 msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " msgstr "" -#: lib/user_interaction.py:460 +#: lib/user_interaction.py:461 lib/user_interaction.py:464 lib/user_interaction.py:467 msgid "Enter your gateway (router) IP address or leave blank for none: " msgstr "" -#: lib/user_interaction.py:475 +#: lib/user_interaction.py:476 lib/user_interaction.py:479 lib/user_interaction.py:482 msgid "Enter your DNS servers (space separated, blank for none): " msgstr "" -#: lib/user_interaction.py:509 +#: lib/user_interaction.py:510 lib/user_interaction.py:513 lib/user_interaction.py:516 msgid "Select which filesystem your main partition should use" msgstr "" -#: lib/user_interaction.py:555 +#: lib/user_interaction.py:556 lib/user_interaction.py:559 lib/user_interaction.py:562 msgid "Current partition layout" msgstr "" -#: lib/user_interaction.py:606 +#: lib/user_interaction.py:607 lib/user_interaction.py:614 lib/user_interaction.py:617 lib/user_interaction.py:620 msgid "" "Select what to do with\n" "{}" msgstr "" -#: lib/user_interaction.py:623 lib/user_interaction.py:708 +#: lib/user_interaction.py:624 lib/user_interaction.py:709 lib/user_interaction.py:631 lib/user_interaction.py:716 lib/user_interaction.py:634 lib/user_interaction.py:719 lib/user_interaction.py:637 lib/user_interaction.py:722 msgid "Enter a desired filesystem type for the partition" msgstr "" -#: lib/user_interaction.py:625 +#: lib/user_interaction.py:626 lib/user_interaction.py:633 lib/user_interaction.py:636 lib/user_interaction.py:639 msgid "Enter the start sector (percentage or block number, default: {}): " msgstr "" -#: lib/user_interaction.py:634 -msgid "" -"Enter the end sector of the partition (percentage or block number, ex: {}): " -"\"" +#: lib/user_interaction.py:635 lib/user_interaction.py:642 lib/user_interaction.py:645 lib/user_interaction.py:648 +msgid "Enter the end sector of the partition (percentage or block number, ex: {}): " msgstr "" -#: lib/user_interaction.py:660 +#: lib/user_interaction.py:661 lib/user_interaction.py:668 lib/user_interaction.py:671 lib/user_interaction.py:674 msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "" -#: lib/user_interaction.py:673 +#: lib/user_interaction.py:674 lib/user_interaction.py:681 lib/user_interaction.py:684 lib/user_interaction.py:687 msgid "" "{}\n" "\n" "Select by index which partitions to delete" msgstr "" -#: lib/user_interaction.py:681 +#: lib/user_interaction.py:682 lib/user_interaction.py:689 lib/user_interaction.py:692 lib/user_interaction.py:695 msgid "" "{}\n" "\n" "Select by index which partition to mount where" msgstr "" -#: lib/user_interaction.py:685 -msgid "" -" * Partition mount-points are relative to inside the installation, the boot " -"would be /boot as an example." +#: lib/user_interaction.py:686 lib/user_interaction.py:693 lib/user_interaction.py:696 lib/user_interaction.py:699 +msgid " * Partition mount-points are relative to inside the installation, the boot would be /boot as an example." msgstr "" -#: lib/user_interaction.py:686 +#: lib/user_interaction.py:687 lib/user_interaction.py:694 lib/user_interaction.py:697 lib/user_interaction.py:700 msgid "Select where to mount partition (leave blank to remove mountpoint): " msgstr "" -#: lib/user_interaction.py:697 +#: lib/user_interaction.py:698 lib/user_interaction.py:705 lib/user_interaction.py:708 lib/user_interaction.py:711 msgid "" "{}\n" "\n" "Select which partition to mask for formatting" msgstr "" -#: lib/user_interaction.py:716 +#: lib/user_interaction.py:717 lib/user_interaction.py:724 lib/user_interaction.py:727 lib/user_interaction.py:730 msgid "" "{}\n" "\n" "Select which partition to mark as encrypted" msgstr "" -#: lib/user_interaction.py:724 +#: lib/user_interaction.py:725 lib/user_interaction.py:732 lib/user_interaction.py:735 lib/user_interaction.py:738 msgid "" "{}\n" "\n" "Select which partition to mark as bootable" msgstr "" -#: lib/user_interaction.py:731 +#: lib/user_interaction.py:732 lib/user_interaction.py:739 lib/user_interaction.py:742 lib/user_interaction.py:745 msgid "" "{}\n" "\n" "Select which partition to set a filesystem on" msgstr "" -#: lib/user_interaction.py:738 +#: lib/user_interaction.py:739 lib/user_interaction.py:746 lib/user_interaction.py:749 lib/user_interaction.py:752 msgid "Enter a desired filesystem type for the partition: " msgstr "" -#: lib/user_interaction.py:759 lib/menu/selection_menu.py:116 +#: lib/user_interaction.py:760 lib/menu/selection_menu.py:141 lib/user_interaction.py:767 lib/menu/selection_menu.py:139 lib/menu/selection_menu.py:143 lib/user_interaction.py:770 lib/user_interaction.py:773 msgid "Select Archinstall language" msgstr "" -#: lib/user_interaction.py:764 +#: lib/user_interaction.py:765 lib/user_interaction.py:772 lib/user_interaction.py:775 lib/user_interaction.py:778 msgid "Wipe all selected drives and use a best-effort default partition layout" msgstr "" -#: lib/user_interaction.py:765 -msgid "" -"Select what to do with each individual drive (followed by partition usage)" +#: lib/user_interaction.py:766 lib/user_interaction.py:773 lib/user_interaction.py:776 lib/user_interaction.py:779 +msgid "Select what to do with each individual drive (followed by partition usage)" msgstr "" -#: lib/user_interaction.py:768 +#: lib/user_interaction.py:769 lib/user_interaction.py:770 lib/user_interaction.py:777 lib/user_interaction.py:780 lib/user_interaction.py:783 msgid "Select what you wish to do with the selected block devices" msgstr "" -#: lib/user_interaction.py:821 -msgid "" -"This is a list of pre-programmed profiles, they might make it easier to " -"install things like desktop environments" +#: lib/user_interaction.py:822 lib/user_interaction.py:823 lib/user_interaction.py:830 lib/user_interaction.py:833 lib/user_interaction.py:836 +msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments" msgstr "" -#: lib/user_interaction.py:846 +#: lib/user_interaction.py:846 lib/user_interaction.py:847 lib/user_interaction.py:854 lib/user_interaction.py:857 lib/user_interaction.py:860 msgid "Select Keyboard layout" msgstr "" -#: lib/user_interaction.py:861 +#: lib/user_interaction.py:861 lib/user_interaction.py:862 lib/user_interaction.py:869 lib/user_interaction.py:872 lib/user_interaction.py:875 msgid "Select one of the regions to download packages from" msgstr "" -#: lib/user_interaction.py:883 +#: lib/user_interaction.py:883 lib/user_interaction.py:884 lib/user_interaction.py:891 lib/user_interaction.py:894 lib/user_interaction.py:897 msgid "Select one or more hard drives to use and configure" msgstr "" -#: lib/user_interaction.py:910 -msgid "" -"For the best compatibility with your AMD hardware, you may want to use " -"either the all open-source or AMD / ATI options." +#: lib/user_interaction.py:910 lib/user_interaction.py:911 lib/user_interaction.py:918 lib/user_interaction.py:921 lib/user_interaction.py:924 +msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options." msgstr "" -#: lib/user_interaction.py:912 -msgid "" -"For the best compatibility with your Intel hardware, you may want to use " -"either the all open-source or Intel options.\n" +#: lib/user_interaction.py:912 lib/user_interaction.py:913 lib/user_interaction.py:920 lib/user_interaction.py:923 lib/user_interaction.py:926 +msgid "For the best compatibility with your Intel hardware, you may want to use either the all open-source or Intel options.\n" msgstr "" -#: lib/user_interaction.py:914 -msgid "" -"For the best compatibility with your Nvidia hardware, you may want to use " -"the Nvidia proprietary driver.\n" +#: lib/user_interaction.py:914 lib/user_interaction.py:915 lib/user_interaction.py:922 lib/user_interaction.py:925 lib/user_interaction.py:928 +msgid "For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n" msgstr "" -#: lib/user_interaction.py:917 +#: lib/user_interaction.py:917 lib/user_interaction.py:918 lib/user_interaction.py:925 lib/user_interaction.py:928 lib/user_interaction.py:931 msgid "" "\n" "\n" "Select a graphics driver or leave blank to install all open-source drivers" msgstr "" -#: lib/user_interaction.py:921 +#: lib/user_interaction.py:921 lib/user_interaction.py:922 lib/user_interaction.py:929 lib/user_interaction.py:932 lib/user_interaction.py:935 msgid "All open-source (default)" msgstr "" -#: lib/user_interaction.py:940 +#: lib/user_interaction.py:940 lib/user_interaction.py:941 lib/user_interaction.py:948 lib/user_interaction.py:951 lib/user_interaction.py:954 msgid "Choose which kernels to use or leave blank for default \"{}\"" msgstr "" -#: lib/user_interaction.py:954 +#: lib/user_interaction.py:954 lib/user_interaction.py:955 lib/user_interaction.py:962 lib/user_interaction.py:965 lib/user_interaction.py:968 msgid "Choose which locale language to use" msgstr "" -#: lib/user_interaction.py:968 +#: lib/user_interaction.py:968 lib/user_interaction.py:969 lib/user_interaction.py:976 lib/user_interaction.py:979 lib/user_interaction.py:982 msgid "Choose which locale encoding to use" msgstr "" -#: lib/user_interaction.py:1009 +#: lib/user_interaction.py:1009 lib/user_interaction.py:1010 lib/user_interaction.py:1017 lib/user_interaction.py:1020 lib/user_interaction.py:1023 msgid "Select one of the values shown below: " msgstr "" -#: lib/user_interaction.py:1050 +#: lib/user_interaction.py:1050 lib/user_interaction.py:1051 lib/user_interaction.py:1058 lib/user_interaction.py:1061 lib/user_interaction.py:1064 msgid "Select one or more of the options below: " msgstr "" -#: lib/menu/selection_menu.py:122 +#: lib/disk/filesystem.py:86 +msgid "Adding partition...." +msgstr "" + +#: lib/disk/filesystem.py:139 lib/disk/filesystem.py:141 +msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's." +msgstr "" + +#: lib/profiles.py:89 +msgid "Error: Listing profiles on URL \"{}\" resulted in:" +msgstr "" + +#: lib/profiles.py:92 +msgid "Error: Could not decode \"{}\" result as JSON:" +msgstr "" + +#: lib/menu/selection_menu.py:146 lib/menu/selection_menu.py:144 lib/menu/selection_menu.py:148 msgid "Select keyboard layout" msgstr "" -#: lib/menu/selection_menu.py:125 +#: lib/menu/selection_menu.py:149 lib/menu/selection_menu.py:147 lib/menu/selection_menu.py:151 msgid "Select mirror region" msgstr "" -#: lib/menu/selection_menu.py:130 +#: lib/menu/selection_menu.py:154 lib/menu/selection_menu.py:152 lib/menu/selection_menu.py:156 msgid "Select locale language" msgstr "" -#: lib/menu/selection_menu.py:132 +#: lib/menu/selection_menu.py:156 lib/menu/selection_menu.py:154 lib/menu/selection_menu.py:158 msgid "Select locale encoding" msgstr "" -#: lib/menu/selection_menu.py:135 +#: lib/menu/selection_menu.py:159 lib/menu/selection_menu.py:157 lib/menu/selection_menu.py:161 msgid "Select harddrives" msgstr "" -#: lib/menu/selection_menu.py:139 +#: lib/menu/selection_menu.py:163 lib/menu/selection_menu.py:161 lib/menu/selection_menu.py:165 msgid "Select disk layout" msgstr "" -#: lib/menu/selection_menu.py:147 +#: lib/menu/selection_menu.py:171 lib/menu/selection_menu.py:169 lib/menu/selection_menu.py:173 msgid "Set encryption password" msgstr "" -#: lib/menu/selection_menu.py:153 +#: lib/menu/selection_menu.py:177 lib/menu/selection_menu.py:175 lib/menu/selection_menu.py:179 msgid "Use swap" msgstr "" -#: lib/menu/selection_menu.py:158 +#: lib/menu/selection_menu.py:182 lib/menu/selection_menu.py:180 lib/menu/selection_menu.py:184 msgid "Select bootloader" msgstr "" -#: lib/menu/selection_menu.py:164 +#: lib/menu/selection_menu.py:188 lib/menu/selection_menu.py:186 lib/menu/selection_menu.py:190 msgid "Set root password" msgstr "" -#: lib/menu/selection_menu.py:169 +#: lib/menu/selection_menu.py:193 lib/menu/selection_menu.py:191 lib/menu/selection_menu.py:195 msgid "Specify superuser account" msgstr "" -#: lib/menu/selection_menu.py:175 +#: lib/menu/selection_menu.py:199 lib/menu/selection_menu.py:197 lib/menu/selection_menu.py:201 msgid "Specify user account" msgstr "" -#: lib/menu/selection_menu.py:181 +#: lib/menu/selection_menu.py:205 lib/menu/selection_menu.py:203 lib/menu/selection_menu.py:207 msgid "Specify profile" msgstr "" -#: lib/menu/selection_menu.py:186 +#: lib/menu/selection_menu.py:210 lib/menu/selection_menu.py:208 lib/menu/selection_menu.py:212 msgid "Select audio" msgstr "" -#: lib/menu/selection_menu.py:190 +#: lib/menu/selection_menu.py:214 lib/menu/selection_menu.py:212 lib/menu/selection_menu.py:216 msgid "Select kernels" msgstr "" -#: lib/menu/selection_menu.py:195 +#: lib/menu/selection_menu.py:219 lib/menu/selection_menu.py:217 lib/menu/selection_menu.py:221 msgid "Additional packages to install" msgstr "" -#: lib/menu/selection_menu.py:200 +#: lib/menu/selection_menu.py:224 lib/menu/selection_menu.py:222 lib/menu/selection_menu.py:226 msgid "Configure network" msgstr "" -#: lib/menu/selection_menu.py:208 +#: lib/menu/selection_menu.py:232 lib/menu/selection_menu.py:230 lib/menu/selection_menu.py:234 msgid "Set automatic time sync (NTP)" msgstr "" + +#: lib/menu/selection_menu.py:310 lib/menu/selection_menu.py:308 lib/menu/selection_menu.py:315 +msgid "Install ({} config(s) missing)" +msgstr "" + +#: lib/menu/selection_menu.py:373 lib/menu/selection_menu.py:371 lib/menu/selection_menu.py:378 +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 "" + +#: lib/disk/filesystem.py:97 +msgid "Re-using partition instance: {}" +msgstr "" + +#: lib/user_interaction.py:590 lib/user_interaction.py:593 lib/user_interaction.py:596 +msgid "Create a new partition" +msgstr "" + +#: lib/user_interaction.py:592 lib/user_interaction.py:595 lib/user_interaction.py:598 +msgid "Delete a partition" +msgstr "" + +#: lib/user_interaction.py:593 lib/user_interaction.py:596 lib/user_interaction.py:599 +msgid "Clear/Delete all partitions" +msgstr "" + +#: lib/user_interaction.py:594 lib/user_interaction.py:597 lib/user_interaction.py:600 +msgid "Assign mount-point for a partition" +msgstr "" + +#: lib/user_interaction.py:595 lib/user_interaction.py:598 lib/user_interaction.py:601 +msgid "Mark/Unmark a partition to be formatted (wipes data)" +msgstr "" + +#: lib/user_interaction.py:596 lib/user_interaction.py:599 lib/user_interaction.py:602 +msgid "Mark/Unmark a partition as encrypted" +msgstr "" + +#: lib/user_interaction.py:597 lib/user_interaction.py:600 lib/user_interaction.py:603 +msgid "Mark/Unmark a partition as bootable (automatic for /boot)" +msgstr "" + +#: lib/user_interaction.py:598 lib/user_interaction.py:601 lib/user_interaction.py:604 +msgid "Set desired filesystem for a partition" +msgstr "" + +#: lib/menu/selection_menu.py:239 lib/menu/selection_menu.py:237 lib/menu/selection_menu.py:241 lib/menu/selection_menu.py:270 +msgid "Abort" +msgstr "" + +#: lib/menu/selection_menu.py:183 lib/menu/selection_menu.py:187 +msgid "Specify hostname" +msgstr "" + +#: lib/menu/selection_menu.py:228 +msgid "Not configured, unavailable unless setup manually" +msgstr "" + +#: lib/menu/selection_menu.py:231 +msgid "Select timezone" +msgstr "" + +#: lib/menu/selection_menu.py:266 +msgid "Set/Modify the below options" +msgstr "" + +#: lib/menu/selection_menu.py:272 +msgid "Install" +msgstr "" + +#: lib/menu/menu.py:68 +msgid "" +"Use ESC to skip\n" +"\n" +msgstr "" + +#: lib/user_interaction.py:591 lib/user_interaction.py:594 lib/user_interaction.py:597 +msgid "Suggest partition layout" +msgstr "" + +#: lib/user_interaction.py:101 +msgid "Enter a password: " +msgstr "" + +#: lib/disk/filesystem.py:117 +msgid "Enter a encryption password for {}" +msgstr "" + +#: lib/menu/selection_menu.py:174 +msgid "Enter disk encryption password (leave blank for no encryption): " +msgstr "" + +#: lib/menu/selection_menu.py:407 +msgid "Create a required super-user with sudo privileges: " +msgstr "" + +#: lib/menu/selection_menu.py:347 +msgid "Enter root password (leave blank to disable root): " +msgstr "" + +#: lib/user_interaction.py:307 lib/user_interaction.py:324 +msgid "Password for user \"{}\": " +msgstr "" + +#: lib/user_interaction.py:405 lib/user_interaction.py:408 +msgid "Verifying that additional packages exist (this might take a few seconds)" +msgstr "" + +#: lib/user_interaction.py:281 +msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n" +msgstr "" + +#: lib/user_interaction.py:282 +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 "" + +#: lib/menu/selection_menu.py:411 +msgid "Enter a username to create an additional user (leave blank to skip): " +msgstr "" diff --git a/archinstall/locales/en/LC_MESSAGES/base.po~ b/archinstall/locales/en/LC_MESSAGES/base.po~ deleted file mode 100644 index bf321c2a..00000000 --- a/archinstall/locales/en/LC_MESSAGES/base.po~ +++ /dev/null @@ -1,359 +0,0 @@ -#: lib/user_interaction.py:82 -msgid "Do you really want to abort?" -msgstr "" - -#: lib/user_interaction.py:100 -msgid "And one more time for verification: " -msgstr "" - -#: lib/user_interaction.py:271 -msgid "Would you like to use swap on zram?" -msgstr "" - -#: lib/user_interaction.py:277 -msgid "" -"Would you like to use automatic time synchronization (NTP) with the default " -"time servers?" -msgstr "" - -#: lib/user_interaction.py:278 -msgid "" -"Hardware time and other post-configuration steps might be required in order " -"for NTP to work. For more information, please check the Arch wiki" -msgstr "" - -#: lib/user_interaction.py:284 -msgid "Desired hostname for the installation: " -msgstr "" - -#: lib/user_interaction.py:289 -msgid "Username for required superuser with sudo privileges: " -msgstr "" - -#: lib/user_interaction.py:303 lib/user_interaction.py:320 -msgid "Password for user \"{}\"" -msgstr "" - -#: lib/user_interaction.py:309 -msgid "Any additional users to install (leave blank for no users): " -msgstr "" - -#: lib/user_interaction.py:323 -msgid "Should this user be a superuser (sudoer)?" -msgstr "" - -#: lib/user_interaction.py:339 -msgid "Select a timezone" -msgstr "" - -#: lib/user_interaction.py:353 -msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?" -msgstr "" - -#: lib/user_interaction.py:363 -msgid "Choose a bootloader" -msgstr "" - -#: lib/user_interaction.py:379 -msgid "Choose an audio server" -msgstr "" - -#: lib/user_interaction.py:390 -msgid "" -"Only packages such as base, base-devel, linux, linux-firmware, efibootmgr " -"and optional profile packages are installed." -msgstr "" - -#: lib/user_interaction.py:391 -msgid "" -"If you desire a web browser, such as firefox or chromium, you may specify it " -"in the following prompt." -msgstr "" - -#: lib/user_interaction.py:395 -msgid "" -"Write additional packages to install (space separated, leave blank to skip): " -msgstr "" - -#: lib/user_interaction.py:418 -msgid "Copy ISO network configuration to installation" -msgstr "" - -#: lib/user_interaction.py:419 -msgid "" -"Use NetworkManager (necessary to configure internet graphically in GNOME and " -"KDE)" -msgstr "" - -#: lib/user_interaction.py:427 -msgid "Select one network interface to configure" -msgstr "" - -#: lib/user_interaction.py:440 -msgid "" -"Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" -msgstr "" - -#: lib/user_interaction.py:445 -msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " -msgstr "" - -#: lib/user_interaction.py:460 -msgid "Enter your gateway (router) IP address or leave blank for none: " -msgstr "" - -#: lib/user_interaction.py:475 -msgid "Enter your DNS servers (space separated, blank for none): " -msgstr "" - -#: lib/user_interaction.py:509 -msgid "Select which filesystem your main partition should use" -msgstr "" - -#: lib/user_interaction.py:555 -msgid "Current partition layout" -msgstr "" - -#: lib/user_interaction.py:606 -msgid "" -"Select what to do with\n" -"{}" -msgstr "" - -#: lib/user_interaction.py:623 lib/user_interaction.py:708 -msgid "Enter a desired filesystem type for the partition" -msgstr "" - -#: lib/user_interaction.py:625 -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "" - -#: lib/user_interaction.py:634 -msgid "" -"Enter the end sector of the partition (percentage or block number, ex: {}): " -"\"" -msgstr "" - -#: lib/user_interaction.py:660 -msgid "{} contains queued partitions, this will remove those, are you sure?" -msgstr "" - -#: lib/user_interaction.py:673 -msgid "" -"{}\n" -"\n" -"Select by index which partitions to delete" -msgstr "" - -#: lib/user_interaction.py:681 -msgid "" -"{}\n" -"\n" -"Select by index which partition to mount where" -msgstr "" - -#: lib/user_interaction.py:685 -msgid "" -" * Partition mount-points are relative to inside the installation, the boot " -"would be /boot as an example." -msgstr "" - -#: lib/user_interaction.py:686 -msgid "Select where to mount partition (leave blank to remove mountpoint): " -msgstr "" - -#: lib/user_interaction.py:697 -msgid "" -"{}\n" -"\n" -"Select which partition to mask for formatting" -msgstr "" - -#: lib/user_interaction.py:716 -msgid "" -"{}\n" -"\n" -"Select which partition to mark as encrypted" -msgstr "" - -#: lib/user_interaction.py:724 -msgid "" -"{}\n" -"\n" -"Select which partition to mark as bootable" -msgstr "" - -#: lib/user_interaction.py:731 -msgid "" -"{}\n" -"\n" -"Select which partition to set a filesystem on" -msgstr "" - -#: lib/user_interaction.py:738 -msgid "Enter a desired filesystem type for the partition: " -msgstr "" - -#: lib/user_interaction.py:759 -msgid "Select archinstall language" -msgstr "" - -#: lib/user_interaction.py:764 -msgid "Wipe all selected drives and use a best-effort default partition layout" -msgstr "" - -#: lib/user_interaction.py:765 -msgid "" -"Select what to do with each individual drive (followed by partition usage)" -msgstr "" - -#: lib/user_interaction.py:768 -msgid "Select what you wish to do with the selected block devices" -msgstr "" - -#: lib/user_interaction.py:821 -msgid "" -"This is a list of pre-programmed profiles, they might make it easier to " -"install things like desktop environments" -msgstr "" - -#: lib/user_interaction.py:846 -msgid "Select Keyboard layout" -msgstr "" - -#: lib/user_interaction.py:861 -msgid "Select one of the regions to download packages from" -msgstr "" - -#: lib/user_interaction.py:883 -msgid "Select one or more hard drives to use and configure" -msgstr "" - -#: lib/user_interaction.py:910 -msgid "" -"For the best compatibility with your AMD hardware, you may want to use " -"either the all open-source or AMD / ATI options." -msgstr "" - -#: lib/user_interaction.py:912 -msgid "" -"For the best compatibility with your Intel hardware, you may want to use " -"either the all open-source or Intel options.\n" -msgstr "" - -#: lib/user_interaction.py:914 -msgid "" -"For the best compatibility with your Nvidia hardware, you may want to use " -"the Nvidia proprietary driver.\n" -msgstr "" - -#: lib/user_interaction.py:917 -msgid "" -"\n" -"\n" -"Select a graphics driver or leave blank to install all open-source drivers" -msgstr "" - -#: lib/user_interaction.py:921 -msgid "All open-source (default)" -msgstr "" - -#: lib/user_interaction.py:940 -msgid "Choose which kernels to use or leave blank for default \"{}\"" -msgstr "" - -#: lib/user_interaction.py:954 -msgid "Choose which locale language to use" -msgstr "" - -#: lib/user_interaction.py:968 -msgid "Choose which locale encoding to use" -msgstr "" - -#: lib/user_interaction.py:1009 -msgid "Select one of the values shown below: " -msgstr "" - -#: lib/user_interaction.py:1050 -msgid "Select one or more of the options below: " -msgstr "" - -#: lib/menu/selection_menu.py:116 -msgid "Archinstall language" -msgstr "" - -#: lib/menu/selection_menu.py:122 -msgid "Select keyboard layout" -msgstr "" - -#: lib/menu/selection_menu.py:125 -msgid "Select mirror region" -msgstr "" - -#: lib/menu/selection_menu.py:130 -msgid "Select locale language" -msgstr "" - -#: lib/menu/selection_menu.py:132 -msgid "Select locale encoding" -msgstr "" - -#: lib/menu/selection_menu.py:135 -msgid "Select harddrives" -msgstr "" - -#: lib/menu/selection_menu.py:139 -msgid "Select disk layout" -msgstr "" - -#: lib/menu/selection_menu.py:147 -msgid "Set encryption password" -msgstr "" - -#: lib/menu/selection_menu.py:153 -msgid "Use swap" -msgstr "" - -#: lib/menu/selection_menu.py:158 -msgid "Select bootloader" -msgstr "" - -#: lib/menu/selection_menu.py:164 -msgid "Set root password" -msgstr "" - -#: lib/menu/selection_menu.py:169 -msgid "Specify superuser account" -msgstr "" - -#: lib/menu/selection_menu.py:175 -msgid "Specify user account" -msgstr "" - -#: lib/menu/selection_menu.py:181 -msgid "Specify profile" -msgstr "" - -#: lib/menu/selection_menu.py:186 -msgid "Select audio" -msgstr "" - -#: lib/menu/selection_menu.py:190 -msgid "Select kernels" -msgstr "" - -#: lib/menu/selection_menu.py:195 -msgid "Additional packages to install" -msgstr "" - -#: lib/menu/selection_menu.py:200 -msgid "Configure network" -msgstr "" - -#: lib/menu/selection_menu.py:208 -msgid "Set automatic time sync (NTP)" -msgstr "" - -#: lib/user_interaction.py:759 lib/menu/selection_menu.py:116 -msgid "Select Archinstall language" -msgstr "" diff --git a/archinstall/locales/it/LC_MESSAGES/base.mo b/archinstall/locales/it/LC_MESSAGES/base.mo deleted file mode 100644 index f879d8138e36b605121d607401c42e8484ebb495..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98 zcmca7#4?ou2pEA_28dOFm>Gz5fLIiWEr3`Ui2Z;V20&^{GBS%5fGAO+B(=Cip}3?d bGcTPXuoTG2S4dST%~MD%PR%XI%x3@qCovI_ diff --git a/archinstall/locales/it/LC_MESSAGES/base.po b/archinstall/locales/it/LC_MESSAGES/base.po deleted file mode 100644 index a399e547..00000000 --- a/archinstall/locales/it/LC_MESSAGES/base.po +++ /dev/null @@ -1,354 +0,0 @@ -#: lib/user_interaction.py:82 -msgid "Do you really want to abort?" -msgstr "" - -#: lib/user_interaction.py:100 -msgid "And one more time for verification: " -msgstr "" - -#: lib/user_interaction.py:271 -msgid "Would you like to use swap on zram?" -msgstr "" - -#: lib/user_interaction.py:277 -msgid "" -"Would you like to use automatic time synchronization (NTP) with the default " -"time servers?" -msgstr "" - -#: lib/user_interaction.py:278 -msgid "" -"Hardware time and other post-configuration steps might be required in order " -"for NTP to work. For more information, please check the Arch wiki" -msgstr "" - -#: lib/user_interaction.py:284 -msgid "Desired hostname for the installation: " -msgstr "" - -#: lib/user_interaction.py:289 -msgid "Username for required superuser with sudo privileges: " -msgstr "" - -#: lib/user_interaction.py:303 lib/user_interaction.py:320 -msgid "Password for user \"{}\"" -msgstr "" - -#: lib/user_interaction.py:309 -msgid "Any additional users to install (leave blank for no users): " -msgstr "" - -#: lib/user_interaction.py:323 -msgid "Should this user be a superuser (sudoer)?" -msgstr "" - -#: lib/user_interaction.py:339 -msgid "Select a timezone" -msgstr "" - -#: lib/user_interaction.py:353 -msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?" -msgstr "" - -#: lib/user_interaction.py:363 -msgid "Choose a bootloader" -msgstr "" - -#: lib/user_interaction.py:379 -msgid "Choose an audio server" -msgstr "" - -#: lib/user_interaction.py:390 -msgid "" -"Only packages such as base, base-devel, linux, linux-firmware, efibootmgr " -"and optional profile packages are installed." -msgstr "" - -#: lib/user_interaction.py:391 -msgid "" -"If you desire a web browser, such as firefox or chromium, you may specify it " -"in the following prompt." -msgstr "" - -#: lib/user_interaction.py:395 -msgid "" -"Write additional packages to install (space separated, leave blank to skip): " -msgstr "" - -#: lib/user_interaction.py:418 -msgid "Copy ISO network configuration to installation" -msgstr "" - -#: lib/user_interaction.py:419 -msgid "" -"Use NetworkManager (necessary to configure internet graphically in GNOME and " -"KDE)" -msgstr "" - -#: lib/user_interaction.py:427 -msgid "Select one network interface to configure" -msgstr "" - -#: lib/user_interaction.py:440 -msgid "" -"Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" -msgstr "" - -#: lib/user_interaction.py:445 -msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " -msgstr "" - -#: lib/user_interaction.py:460 -msgid "Enter your gateway (router) IP address or leave blank for none: " -msgstr "" - -#: lib/user_interaction.py:475 -msgid "Enter your DNS servers (space separated, blank for none): " -msgstr "" - -#: lib/user_interaction.py:509 -msgid "Select which filesystem your main partition should use" -msgstr "" - -#: lib/user_interaction.py:555 -msgid "Current partition layout" -msgstr "" - -#: lib/user_interaction.py:606 -msgid "" -"Select what to do with\n" -"{}" -msgstr "" - -#: lib/user_interaction.py:623 lib/user_interaction.py:708 -msgid "Enter a desired filesystem type for the partition" -msgstr "" - -#: lib/user_interaction.py:625 -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "" - -#: lib/user_interaction.py:634 -msgid "" -"Enter the end sector of the partition (percentage or block number, ex: {}): " -"\"" -msgstr "" - -#: lib/user_interaction.py:660 -msgid "{} contains queued partitions, this will remove those, are you sure?" -msgstr "" - -#: lib/user_interaction.py:673 -msgid "" -"{}\n" -"\n" -"Select by index which partitions to delete" -msgstr "" - -#: lib/user_interaction.py:681 -msgid "" -"{}\n" -"\n" -"Select by index which partition to mount where" -msgstr "" - -#: lib/user_interaction.py:685 -msgid "" -" * Partition mount-points are relative to inside the installation, the boot " -"would be /boot as an example." -msgstr "" - -#: lib/user_interaction.py:686 -msgid "Select where to mount partition (leave blank to remove mountpoint): " -msgstr "" - -#: lib/user_interaction.py:697 -msgid "" -"{}\n" -"\n" -"Select which partition to mask for formatting" -msgstr "" - -#: lib/user_interaction.py:716 -msgid "" -"{}\n" -"\n" -"Select which partition to mark as encrypted" -msgstr "" - -#: lib/user_interaction.py:724 -msgid "" -"{}\n" -"\n" -"Select which partition to mark as bootable" -msgstr "" - -#: lib/user_interaction.py:731 -msgid "" -"{}\n" -"\n" -"Select which partition to set a filesystem on" -msgstr "" - -#: lib/user_interaction.py:738 -msgid "Enter a desired filesystem type for the partition: " -msgstr "" - -#: lib/user_interaction.py:759 lib/menu/selection_menu.py:116 -msgid "Select Archinstall language" -msgstr "" - -#: lib/user_interaction.py:764 -msgid "Wipe all selected drives and use a best-effort default partition layout" -msgstr "" - -#: lib/user_interaction.py:765 -msgid "" -"Select what to do with each individual drive (followed by partition usage)" -msgstr "" - -#: lib/user_interaction.py:768 -msgid "Select what you wish to do with the selected block devices" -msgstr "" - -#: lib/user_interaction.py:821 -msgid "" -"This is a list of pre-programmed profiles, they might make it easier to " -"install things like desktop environments" -msgstr "" - -#: lib/user_interaction.py:846 -msgid "Select Keyboard layout" -msgstr "" - -#: lib/user_interaction.py:861 -msgid "Select one of the regions to download packages from" -msgstr "" - -#: lib/user_interaction.py:883 -msgid "Select one or more hard drives to use and configure" -msgstr "" - -#: lib/user_interaction.py:910 -msgid "" -"For the best compatibility with your AMD hardware, you may want to use " -"either the all open-source or AMD / ATI options." -msgstr "" - -#: lib/user_interaction.py:912 -msgid "" -"For the best compatibility with your Intel hardware, you may want to use " -"either the all open-source or Intel options.\n" -msgstr "" - -#: lib/user_interaction.py:914 -msgid "" -"For the best compatibility with your Nvidia hardware, you may want to use " -"the Nvidia proprietary driver.\n" -msgstr "" - -#: lib/user_interaction.py:917 -msgid "" -"\n" -"\n" -"Select a graphics driver or leave blank to install all open-source drivers" -msgstr "" - -#: lib/user_interaction.py:921 -msgid "All open-source (default)" -msgstr "" - -#: lib/user_interaction.py:940 -msgid "Choose which kernels to use or leave blank for default \"{}\"" -msgstr "" - -#: lib/user_interaction.py:954 -msgid "Choose which locale language to use" -msgstr "" - -#: lib/user_interaction.py:968 -msgid "Choose which locale encoding to use" -msgstr "" - -#: lib/user_interaction.py:1009 -msgid "Select one of the values shown below: " -msgstr "" - -#: lib/user_interaction.py:1050 -msgid "Select one or more of the options below: " -msgstr "" - -#: lib/menu/selection_menu.py:122 -msgid "Select keyboard layout" -msgstr "" - -#: lib/menu/selection_menu.py:125 -msgid "Select mirror region" -msgstr "" - -#: lib/menu/selection_menu.py:130 -msgid "Select locale language" -msgstr "" - -#: lib/menu/selection_menu.py:132 -msgid "Select locale encoding" -msgstr "" - -#: lib/menu/selection_menu.py:135 -msgid "Select harddrives" -msgstr "" - -#: lib/menu/selection_menu.py:139 -msgid "Select disk layout" -msgstr "" - -#: lib/menu/selection_menu.py:147 -msgid "Set encryption password" -msgstr "" - -#: lib/menu/selection_menu.py:153 -msgid "Use swap" -msgstr "" - -#: lib/menu/selection_menu.py:158 -msgid "Select bootloader" -msgstr "" - -#: lib/menu/selection_menu.py:164 -msgid "Set root password" -msgstr "" - -#: lib/menu/selection_menu.py:169 -msgid "Specify superuser account" -msgstr "" - -#: lib/menu/selection_menu.py:175 -msgid "Specify user account" -msgstr "" - -#: lib/menu/selection_menu.py:181 -msgid "Specify profile" -msgstr "" - -#: lib/menu/selection_menu.py:186 -msgid "Select audio" -msgstr "" - -#: lib/menu/selection_menu.py:190 -msgid "Select kernels" -msgstr "" - -#: lib/menu/selection_menu.py:195 -msgid "Additional packages to install" -msgstr "" - -#: lib/menu/selection_menu.py:200 -msgid "Configure network" -msgstr "" - -#: lib/menu/selection_menu.py:208 -msgid "Set automatic time sync (NTP)" -msgstr "" - -#~ msgid "this is a test string" -#~ msgstr "Questo e un esempio" diff --git a/archinstall/locales/it/LC_MESSAGES/base.po~ b/archinstall/locales/it/LC_MESSAGES/base.po~ deleted file mode 100644 index 2f364d69..00000000 --- a/archinstall/locales/it/LC_MESSAGES/base.po~ +++ /dev/null @@ -1,362 +0,0 @@ -#: lib/user_interaction.py:82 -msgid "Do you really want to abort?" -msgstr "" - -#: lib/user_interaction.py:100 -msgid "And one more time for verification: " -msgstr "" - -#: lib/user_interaction.py:271 -msgid "Would you like to use swap on zram?" -msgstr "" - -#: lib/user_interaction.py:277 -msgid "" -"Would you like to use automatic time synchronization (NTP) with the default " -"time servers?" -msgstr "" - -#: lib/user_interaction.py:278 -msgid "" -"Hardware time and other post-configuration steps might be required in order " -"for NTP to work. For more information, please check the Arch wiki" -msgstr "" - -#: lib/user_interaction.py:284 -msgid "Desired hostname for the installation: " -msgstr "" - -#: lib/user_interaction.py:289 -msgid "Username for required superuser with sudo privileges: " -msgstr "" - -#: lib/user_interaction.py:303 lib/user_interaction.py:320 -msgid "Password for user \"{}\"" -msgstr "" - -#: lib/user_interaction.py:309 -msgid "Any additional users to install (leave blank for no users): " -msgstr "" - -#: lib/user_interaction.py:323 -msgid "Should this user be a superuser (sudoer)?" -msgstr "" - -#: lib/user_interaction.py:339 -msgid "Select a timezone" -msgstr "" - -#: lib/user_interaction.py:353 -msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?" -msgstr "" - -#: lib/user_interaction.py:363 -msgid "Choose a bootloader" -msgstr "" - -#: lib/user_interaction.py:379 -msgid "Choose an audio server" -msgstr "" - -#: lib/user_interaction.py:390 -msgid "" -"Only packages such as base, base-devel, linux, linux-firmware, efibootmgr " -"and optional profile packages are installed." -msgstr "" - -#: lib/user_interaction.py:391 -msgid "" -"If you desire a web browser, such as firefox or chromium, you may specify it " -"in the following prompt." -msgstr "" - -#: lib/user_interaction.py:395 -msgid "" -"Write additional packages to install (space separated, leave blank to skip): " -msgstr "" - -#: lib/user_interaction.py:418 -msgid "Copy ISO network configuration to installation" -msgstr "" - -#: lib/user_interaction.py:419 -msgid "" -"Use NetworkManager (necessary to configure internet graphically in GNOME and " -"KDE)" -msgstr "" - -#: lib/user_interaction.py:427 -msgid "Select one network interface to configure" -msgstr "" - -#: lib/user_interaction.py:440 -msgid "" -"Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" -msgstr "" - -#: lib/user_interaction.py:445 -msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " -msgstr "" - -#: lib/user_interaction.py:460 -msgid "Enter your gateway (router) IP address or leave blank for none: " -msgstr "" - -#: lib/user_interaction.py:475 -msgid "Enter your DNS servers (space separated, blank for none): " -msgstr "" - -#: lib/user_interaction.py:509 -msgid "Select which filesystem your main partition should use" -msgstr "" - -#: lib/user_interaction.py:555 -msgid "Current partition layout" -msgstr "" - -#: lib/user_interaction.py:606 -msgid "" -"Select what to do with\n" -"{}" -msgstr "" - -#: lib/user_interaction.py:623 lib/user_interaction.py:708 -msgid "Enter a desired filesystem type for the partition" -msgstr "" - -#: lib/user_interaction.py:625 -msgid "Enter the start sector (percentage or block number, default: {}): " -msgstr "" - -#: lib/user_interaction.py:634 -msgid "" -"Enter the end sector of the partition (percentage or block number, ex: {}): " -"\"" -msgstr "" - -#: lib/user_interaction.py:660 -msgid "{} contains queued partitions, this will remove those, are you sure?" -msgstr "" - -#: lib/user_interaction.py:673 -msgid "" -"{}\n" -"\n" -"Select by index which partitions to delete" -msgstr "" - -#: lib/user_interaction.py:681 -msgid "" -"{}\n" -"\n" -"Select by index which partition to mount where" -msgstr "" - -#: lib/user_interaction.py:685 -msgid "" -" * Partition mount-points are relative to inside the installation, the boot " -"would be /boot as an example." -msgstr "" - -#: lib/user_interaction.py:686 -msgid "Select where to mount partition (leave blank to remove mountpoint): " -msgstr "" - -#: lib/user_interaction.py:697 -msgid "" -"{}\n" -"\n" -"Select which partition to mask for formatting" -msgstr "" - -#: lib/user_interaction.py:716 -msgid "" -"{}\n" -"\n" -"Select which partition to mark as encrypted" -msgstr "" - -#: lib/user_interaction.py:724 -msgid "" -"{}\n" -"\n" -"Select which partition to mark as bootable" -msgstr "" - -#: lib/user_interaction.py:731 -msgid "" -"{}\n" -"\n" -"Select which partition to set a filesystem on" -msgstr "" - -#: lib/user_interaction.py:738 -msgid "Enter a desired filesystem type for the partition: " -msgstr "" - -#: lib/user_interaction.py:759 -msgid "Select archinstall language" -msgstr "" - -#: lib/user_interaction.py:764 -msgid "Wipe all selected drives and use a best-effort default partition layout" -msgstr "" - -#: lib/user_interaction.py:765 -msgid "" -"Select what to do with each individual drive (followed by partition usage)" -msgstr "" - -#: lib/user_interaction.py:768 -msgid "Select what you wish to do with the selected block devices" -msgstr "" - -#: lib/user_interaction.py:821 -msgid "" -"This is a list of pre-programmed profiles, they might make it easier to " -"install things like desktop environments" -msgstr "" - -#: lib/user_interaction.py:846 -msgid "Select Keyboard layout" -msgstr "" - -#: lib/user_interaction.py:861 -msgid "Select one of the regions to download packages from" -msgstr "" - -#: lib/user_interaction.py:883 -msgid "Select one or more hard drives to use and configure" -msgstr "" - -#: lib/user_interaction.py:910 -msgid "" -"For the best compatibility with your AMD hardware, you may want to use " -"either the all open-source or AMD / ATI options." -msgstr "" - -#: lib/user_interaction.py:912 -msgid "" -"For the best compatibility with your Intel hardware, you may want to use " -"either the all open-source or Intel options.\n" -msgstr "" - -#: lib/user_interaction.py:914 -msgid "" -"For the best compatibility with your Nvidia hardware, you may want to use " -"the Nvidia proprietary driver.\n" -msgstr "" - -#: lib/user_interaction.py:917 -msgid "" -"\n" -"\n" -"Select a graphics driver or leave blank to install all open-source drivers" -msgstr "" - -#: lib/user_interaction.py:921 -msgid "All open-source (default)" -msgstr "" - -#: lib/user_interaction.py:940 -msgid "Choose which kernels to use or leave blank for default \"{}\"" -msgstr "" - -#: lib/user_interaction.py:954 -msgid "Choose which locale language to use" -msgstr "" - -#: lib/user_interaction.py:968 -msgid "Choose which locale encoding to use" -msgstr "" - -#: lib/user_interaction.py:1009 -msgid "Select one of the values shown below: " -msgstr "" - -#: lib/user_interaction.py:1050 -msgid "Select one or more of the options below: " -msgstr "" - -#: lib/menu/selection_menu.py:116 -msgid "Archinstall language" -msgstr "" - -#: lib/menu/selection_menu.py:122 -msgid "Select keyboard layout" -msgstr "" - -#: lib/menu/selection_menu.py:125 -msgid "Select mirror region" -msgstr "" - -#: lib/menu/selection_menu.py:130 -msgid "Select locale language" -msgstr "" - -#: lib/menu/selection_menu.py:132 -msgid "Select locale encoding" -msgstr "" - -#: lib/menu/selection_menu.py:135 -msgid "Select harddrives" -msgstr "" - -#: lib/menu/selection_menu.py:139 -msgid "Select disk layout" -msgstr "" - -#: lib/menu/selection_menu.py:147 -msgid "Set encryption password" -msgstr "" - -#: lib/menu/selection_menu.py:153 -msgid "Use swap" -msgstr "" - -#: lib/menu/selection_menu.py:158 -msgid "Select bootloader" -msgstr "" - -#: lib/menu/selection_menu.py:164 -msgid "Set root password" -msgstr "" - -#: lib/menu/selection_menu.py:169 -msgid "Specify superuser account" -msgstr "" - -#: lib/menu/selection_menu.py:175 -msgid "Specify user account" -msgstr "" - -#: lib/menu/selection_menu.py:181 -msgid "Specify profile" -msgstr "" - -#: lib/menu/selection_menu.py:186 -msgid "Select audio" -msgstr "" - -#: lib/menu/selection_menu.py:190 -msgid "Select kernels" -msgstr "" - -#: lib/menu/selection_menu.py:195 -msgid "Additional packages to install" -msgstr "" - -#: lib/menu/selection_menu.py:200 -msgid "Configure network" -msgstr "" - -#: lib/menu/selection_menu.py:208 -msgid "Set automatic time sync (NTP)" -msgstr "" - -#: lib/user_interaction.py:759 lib/menu/selection_menu.py:116 -msgid "Select Archinstall language" -msgstr "" - -#~ msgid "this is a test string" -#~ msgstr "Questo e un esempio" diff --git a/examples/guided.py b/examples/guided.py index a775da84..1a00a295 100644 --- a/examples/guided.py +++ b/examples/guided.py @@ -8,7 +8,7 @@ if archinstall.arguments.get('help'): print("See `man archinstall` for help.") exit(0) if os.getuid() != 0: - print("Archinstall requires root privileges to run. See --help for more.") + print(_("Archinstall requires root privileges to run. See --help for more.")) exit(1) # Log various information about hardware before starting the installation. This might assist in troubleshooting @@ -97,7 +97,7 @@ def perform_filesystem_operations(): """ if archinstall.arguments.get('harddrives', None): - print(f" ! Formatting {archinstall.arguments['harddrives']} in ", end='') + print(_(f" ! Formatting {archinstall.arguments['harddrives']} in "), end='') archinstall.do_countdown() """ @@ -113,6 +113,7 @@ def perform_filesystem_operations(): with archinstall.Filesystem(drive, mode) as fs: fs.load_layout(archinstall.arguments['disk_layouts'][drive.path]) + def perform_installation(mountpoint): """ Performs the installation steps on a block device. @@ -138,11 +139,11 @@ def perform_installation(mountpoint): 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) - + # Set mirrors used by pacstrap (outside of installation) if archinstall.arguments.get('mirror-region', None): archinstall.use_mirrors(archinstall.arguments['mirror-region']) # Set the mirrors for the live medium - + if installation.minimal_installation(): installation.set_locale(archinstall.arguments['sys-language'], archinstall.arguments['sys-encoding'].upper()) installation.set_hostname(archinstall.arguments['hostname']) diff --git a/examples/only_hd.py b/examples/only_hd.py index 7195d810..835c4292 100644 --- a/examples/only_hd.py +++ b/examples/only_hd.py @@ -24,7 +24,7 @@ def ask_harddrives(): # Get disk encryption password (or skip if blank) if archinstall.arguments.get('!encryption-password', None) is None: - if passwd := archinstall.get_password(prompt='Enter disk encryption password (leave blank for no encryption): '): + if passwd := archinstall.get_password(prompt=str(_('Enter disk encryption password (leave blank for no encryption): '))): archinstall.arguments['!encryption-password'] = passwd if archinstall.arguments.get('!encryption-password', None): From 1ea6fea1d838f3b4646c9e4eebc9ffbdf45f3149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Werner=20Ll=C3=A1cer?= Date: Sun, 6 Feb 2022 11:54:13 +0100 Subject: [PATCH 2/2] Flexible menu 2 (#916) * Correct definition of btrfs standard layout * New version of the FlexibleMenu * Added new functionality to Selector * Created a GeneralMenu class * GlobalMenu is made a child of GeneralMenu * Some refining in GeneralMenu secret is now a general function * log is invoked in GeneralMenu directly * Correction at GeneralMenu * Materialize again _setup_selection_menu_options. Gives more room to play * Callbacks converted as methods Synch() (data area and menu) decoupled from enable() and made general before any run * script swiss added to the patch set * Only_hd gets a new implementation of the menu flake8 corrections * swiss.py description added * New version of the FlexibleMenu * Added new functionality to Selector * Created a GeneralMenu class * GlobalMenu is made a child of GeneralMenu * changes from the rebase left dangling * Modify order of execution between exec_menu and post_processing. Added selector_name as parameter for exec_menu * minor corrections to the scripts * Adapt to PR #874 * Solve issue #936 * make ask_for_a_timezone as synonym to ask_timezone * Adapted to nationalization framework (PR 893). String still NOT adapted * flake8 complains * Use of archinstall.output_config instead of local copy at swiss.py * Problems with the last merge * more flake8 complains. caused by reverted changes re. ask*timezone * git complains Co-authored-by: Anton Hvornum --- archinstall/__init__.py | 6 +- archinstall/lib/general.py | 4 + archinstall/lib/menu/selection_menu.py | 327 ++++++++++++++-- archinstall/lib/user_interaction.py | 1 - examples/guided.py | 2 +- examples/only_hd.py | 67 ++-- examples/swiss.py | 512 +++++++++++++++++++++++++ profiles/xorg.py | 1 + 8 files changed, 850 insertions(+), 70 deletions(-) create mode 100644 examples/swiss.py diff --git a/archinstall/__init__.py b/archinstall/__init__.py index 4a7339a9..bf09b188 100644 --- a/archinstall/__init__.py +++ b/archinstall/__init__.py @@ -35,7 +35,11 @@ from .lib.storage import * from .lib.systemd import * from .lib.user_interaction import * from .lib.menu import Menu -from .lib.menu.selection_menu import GlobalMenu +from .lib.menu.selection_menu import ( + GlobalMenu, + Selector, + GeneralMenu +) from .lib.translation import Translation, DeferredTranslation from .lib.plugins import plugins, load_plugin # This initiates the plugin loading ceremony from .lib.configuration import * diff --git a/archinstall/lib/general.py b/archinstall/lib/general.py index c9ebb921..ad7b8ad4 100644 --- a/archinstall/lib/general.py +++ b/archinstall/lib/general.py @@ -550,3 +550,7 @@ def json_stream_to_structure(id : str, stream :str, target :dict) -> bool : log(f" {id} is neither a file nor is a JSON string:",level=logging.ERROR) return False return True + +def secret(x :str): + """ return * with len equal to to the input string """ + return '*' * len(x) diff --git a/archinstall/lib/menu/selection_menu.py b/archinstall/lib/menu/selection_menu.py index f094c6dc..93299502 100644 --- a/archinstall/lib/menu/selection_menu.py +++ b/archinstall/lib/menu/selection_menu.py @@ -1,8 +1,10 @@ +from __future__ import annotations import sys -from typing import Dict +import logging +from typing import Callable, Any, List, Iterator, Dict from .menu import Menu -from ..general import SysCommand +from ..general import SysCommand, secret from ..storage import storage from ..output import log from ..profiles import is_desktop_profile @@ -34,13 +36,16 @@ from ..translation import Translation class Selector: def __init__( self, - description, - func=None, - display_func=None, - default=None, - enabled=False, - dependencies=[], - dependencies_not=[] + description :str, + func :Callable = None, + display_func :Callable = None, + default :Any = None, + enabled :bool = False, + dependencies :List = [], + dependencies_not :List = [], + exec_func :Callable = None, + preview_func :Callable = None, + mandatory :bool = False ): """ Create a new menu selection entry @@ -70,6 +75,17 @@ class Selector: :param dependencies_not: These are the exclusive options; the menu item will only be displayed if non of the entries in the list have been specified :type dependencies_not: list + + :param exec_func: A function with the name and the result of the selection as input parameter and which returns boolean. + Can be used for any action deemed necessary after selection. If it returns True, exits the menu loop, if False, + menu returns to the selection screen. If not specified it is assumed the return is False + :type exec_func: Callable + + :param preview_func: A callable which invokws a preview screen (not implemented) + :type preview_func: Callable + + :param mandatory: A boolean which determines that the field is mandatory, i.e. menu can not be exited if it is not set + :type mandatory: bool """ self._description = description @@ -79,26 +95,29 @@ class Selector: self.enabled = enabled self._dependencies = dependencies self._dependencies_not = dependencies_not + self.exec_func = exec_func + self.preview_func = preview_func + self.mandatory = mandatory @property - def dependencies(self): + def dependencies(self) -> dict: return self._dependencies @property - def dependencies_not(self): + def dependencies_not(self) -> dict: return self._dependencies_not @property def current_selection(self): return self._current_selection - def set_enabled(self): - self.enabled = True + def set_enabled(self, status :bool = True): + self.enabled = status - def update_description(self, description): + def update_description(self, description :str): self._description = description - def menu_text(self): + def menu_text(self) -> str: current = '' if self._display_func: @@ -113,29 +132,271 @@ class Selector: return f'{self._description} {current}' - def set_current_selection(self, current): + def set_current_selection(self, current :str): self._current_selection = current - def has_selection(self): + def has_selection(self) -> bool: if self._current_selection is None: return False return True - def is_empty(self): + def get_selection(self) -> Any: + return self._current_selection + + def is_empty(self) -> bool: if self._current_selection is None: return True elif isinstance(self._current_selection, (str, list, dict)) and len(self._current_selection) == 0: return True - return False + def is_enabled(self) -> bool: + return self.enabled -class GlobalMenu: - def __init__(self): + def is_mandatory(self) -> bool: + return self.mandatory + + def set_mandatory(self, status :bool = True): + self.mandatory = status + if status and not self.is_enabled(): + self.set_enabled(True) + + +class GeneralMenu: + def __init__(self, data_store :dict = None): + """ + Create a new selection menu. + + :param data_store: Area (Dict) where the resulting data will be held. At least an entry for each option. Default area is self._data_store (not preset in the call, due to circular references + :type data_store: Dict + + """ self._translation = Translation.load_nationalization() + self.is_context_mgr = False + self._data_store = data_store if data_store is not None else {} self._menu_options = {} self._setup_selection_menu_options() + def __enter__(self, *args :Any, **kwargs :Any) -> GeneralMenu: + self.is_context_mgr = True + return self + + def __exit__(self, *args :Any, **kwargs :Any) -> None: + # TODO: https://stackoverflow.com/questions/28157929/how-to-safely-handle-an-exception-inside-a-context-manager + # TODO: skip processing when it comes from a planified exit + if len(args) >= 2 and args[1]: + log(args[1], level=logging.ERROR, fg='red') + print(" Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues") + raise args[1] + + for key in self._menu_options: + sel = self._menu_options[key] + if key and key not in self._data_store: + self._data_store[key] = sel._current_selection + + self.exit_callback() + + def _setup_selection_menu_options(self): + """ Define the menu options. + Menu options can be defined here in a subclass or done per progam calling self.set_option() + """ + return + + def pre_callback(self, selector_name): + """ will be called before each action in the menu """ + return + + def post_callback(self, selector_name :str, value :Any): + """ will be called after each action in the menu """ + return True + + def exit_callback(self): + """ will be called at the end of the processing of the menu """ + return + + def synch(self, selector_name :str, omit_if_set :bool = False,omit_if_disabled :bool = False): + """ loads menu options with data_store value """ + arg = self._data_store.get(selector_name, None) + # don't display the menu option if it was defined already + if arg is not None and omit_if_set: + return + + if not self.option(selector_name).is_enabled() and omit_if_disabled: + return + + if arg is not None: + self._menu_options[selector_name].set_current_selection(arg) + + def enable(self, selector_name :str, omit_if_set :bool = False , mandatory :bool = False): + """ activates menu options """ + if self._menu_options.get(selector_name, None): + self._menu_options[selector_name].set_enabled(True) + if mandatory: + self._menu_options[selector_name].set_mandatory(True) + self.synch(selector_name,omit_if_set) + else: + print(f'No selector found: {selector_name}') + sys.exit(1) + + def run(self): + """ Calls the Menu framework""" + # we synch all the options just in case + for item in self.list_options(): + self.synch(item) + while True: + # Before continuing, set the preferred keyboard layout/language in the current terminal. + # This will just help the user with the next following questions. + self._set_kb_language() + enabled_menus = self._menus_to_enable() + menu_text = [m.text for m in enabled_menus.values()] + selection = Menu('Set/Modify the below options', menu_text, sort=False).run() + if selection: + selection = selection.strip() + if selection: + # if this calls returns false, we exit the menu. We allow for an callback for special processing on realeasing control + if not self._process_selection(selection): + break + if not self.is_context_mgr: + self.__exit__() + + def _process_selection(self, selection :str) -> bool: + """ determines and executes the selection y + Can / Should be extended to handle specific selection issues + Returns true if the menu shall continue, False if it has ended + """ + # find the selected option in our option list + option = [[k, v] for k, v in self._menu_options.items() if v.text.strip() == selection] + if len(option) != 1: + raise ValueError(f'Selection not found: {selection}') + selector_name = option[0][0] + selector = option[0][1] + + return self.exec_option(selector_name,selector) + + def exec_option(self,selector_name :str, p_selector :Selector = None) -> bool: + """ processes the exection of a given menu entry + - pre process callback + - selection function + - post process callback + - exec action + returns True if the loop has to continue, false if the loop can be closed + """ + if not p_selector: + selector = self.option(selector_name) + else: + selector = p_selector + + self.pre_callback(selector_name) + + result = None + if selector.func: + result = selector.func() + self._menu_options[selector_name].set_current_selection(result) + self._data_store[selector_name] = result + exec_ret_val = selector.exec_func(selector_name,result) if selector.exec_func else False + self.post_callback(selector_name,result) + if exec_ret_val and self._check_mandatory_status(): + return False + return True + """ old behaviour + # we allow for a callback after we get the result + self.post_callback(selector_name,result) + # we have a callback, by option, to determine if we can exit the menu. Only if ALL mandatory fields are written + if selector.exec_func: + if selector.exec_func(result) and self._check_mandatory_status(): + return False + """ + return True + + def _set_kb_language(self): + """ general for ArchInstall""" + # Before continuing, set the preferred keyboard layout/language in the current terminal. + # This will just help the user with the next following questions. + if self._data_store.get('keyboard-layout', None) and len(self._data_store['keyboard-layout']): + set_keyboard_language(self._data_store['keyboard-layout']) + + def _verify_selection_enabled(self, selection_name :str) -> bool: + """ general """ + if selection := self._menu_options.get(selection_name, None): + if not selection.enabled: + return False + + if len(selection.dependencies) > 0: + for d in selection.dependencies: + if not self._verify_selection_enabled(d) or self._menu_options.get(d).is_empty(): + return False + + if len(selection.dependencies_not) > 0: + for d in selection.dependencies_not: + if not self._menu_options.get(d).is_empty(): + return False + return True + + raise ValueError(f'No selection found: {selection_name}') + + def _menus_to_enable(self) -> dict: + """ general """ + enabled_menus = {} + + for name, selection in self._menu_options.items(): + if self._verify_selection_enabled(name): + enabled_menus[name] = selection + + return enabled_menus + + def option(self,name :str) -> Selector: + # TODO check inexistent name + return self._menu_options[name] + + def list_options(self) -> Iterator: + """ Iterator to retrieve the enabled menu option names + """ + for item in self._menu_options: + yield item + + def list_enabled_options(self) -> Iterator: + """ Iterator to retrieve the enabled menu options at a given time. + The results are dynamic (if between calls to the iterator some elements -still not retrieved- are (de)activated + """ + for item in self._menu_options: + if item in self._menus_to_enable(): + yield item + + def set_option(self, name :str, selector :Selector): + self._menu_options[name] = selector + self.synch(name) + + def _check_mandatory_status(self) -> bool: + for field in self._menu_options: + option = self._menu_options[field] + if option.is_mandatory() and not option.has_selection(): + return False + return True + + def set_mandatory(self, field :str, status :bool): + self.option(field).set_mandatory(status) + + def mandatory_overview(self) -> [int, int]: + mandatory_fields = 0 + mandatory_waiting = 0 + for field in self._menu_options: + option = self._menu_options[field] + if option.is_mandatory(): + mandatory_fields += 1 + if not option.has_selection(): + mandatory_waiting += 1 + return mandatory_fields, mandatory_waiting + + def _select_archinstall_language(self, default_lang): + language = select_archinstall_language(default_lang) + self._translation.activate(language) + return language + + +class GlobalMenu(GeneralMenu): + def __init__(self,data_store): + super().__init__(data_store=data_store) + def _setup_selection_menu_options(self): self._menu_options['archinstall-language'] = \ Selector( @@ -170,8 +431,7 @@ class GlobalMenu: self._menu_options['!encryption-password'] = \ Selector( _('Set encryption password'), - lambda: get_password(prompt=str(_('Enter disk encryption password (leave blank for no encryption): '))), - display_func=lambda x: self._secret(x) if x else 'None', + display_func=lambda x: secret(x) if x else 'None', dependencies=['harddrives']) self._menu_options['swap'] = \ Selector( @@ -188,7 +448,7 @@ class GlobalMenu: Selector( _('Set root password'), lambda: self._set_root_password(), - display_func=lambda x: self._secret(x) if x else 'None') + display_func=lambda x: secret(x) if x else 'None') self._menu_options['!superusers'] = \ Selector( _('Specify superuser account'), @@ -236,7 +496,9 @@ class GlobalMenu: self._menu_options['install'] = \ Selector( self._install_text(), + exec_func=lambda n,v: True if self._missing_configs() == 0 else False, enabled=True) + self._menu_options['abort'] = Selector(_('Abort'), enabled=True) def enable(self, selector_name, omit_if_set=False): @@ -300,8 +562,11 @@ class GlobalMenu: text = self._install_text() self._menu_options.get('install').update_description(text) - def _post_processing(self): - if storage['arguments'].get('harddrives', None) and storage['arguments'].get('!encryption-password', None): + def post_callback(self,name :str = None ,result :Any = None): + self._update_install(name,result) + + def exit_callback(self): + if self._data_store.get('harddrives', None) and self._data_store.get('!encryption-password', None): # 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). if len(list(encrypted_partitions(storage['arguments'].get('disk_layouts', [])))) == 0: @@ -337,11 +602,6 @@ class GlobalMenu: return missing - def _select_archinstall_language(self, default_lang): - language = select_archinstall_language(default_lang) - self._translation.activate(language) - return language - def _set_root_password(self): prompt = str(_('Enter root password (leave blank to disable root): ')) password = get_password(prompt=prompt) @@ -386,9 +646,6 @@ class GlobalMenu: return harddrives - def _secret(self, x): - return '*' * len(x) - def _select_profile(self): profile = select_profile() @@ -444,4 +701,4 @@ class GlobalMenu: if self._verify_selection_enabled(name): enabled_menus[name] = selection - return enabled_menus + return enabled_menus \ No newline at end of file diff --git a/archinstall/lib/user_interaction.py b/archinstall/lib/user_interaction.py index badf4cb4..7ed143f1 100644 --- a/archinstall/lib/user_interaction.py +++ b/archinstall/lib/user_interaction.py @@ -351,7 +351,6 @@ def ask_for_a_timezone() -> str: return selected_tz - def ask_for_bootloader(advanced_options :bool = False) -> str: bootloader = "systemd-bootctl" if has_uefi() else "grub-install" if has_uefi(): diff --git a/examples/guided.py b/examples/guided.py index 1a00a295..16fda4c3 100644 --- a/examples/guided.py +++ b/examples/guided.py @@ -36,7 +36,7 @@ def ask_user_questions(): # the system immediately archinstall.SysCommand('timedatectl set-ntp true') - global_menu = archinstall.GlobalMenu() + global_menu = archinstall.GlobalMenu(data_store=archinstall.arguments) global_menu.enable('keyboard-layout') # Set which region to download packages from during the installation diff --git a/examples/only_hd.py b/examples/only_hd.py index 835c4292..cc60a3b9 100644 --- a/examples/only_hd.py +++ b/examples/only_hd.py @@ -4,41 +4,41 @@ import pathlib import archinstall -def ask_harddrives(): - # Ask which harddrives/block-devices we will install to - # and convert them into archinstall.BlockDevice() objects. - if archinstall.arguments.get('harddrives', None) is None: - archinstall.arguments['harddrives'] = archinstall.generic_multi_select(archinstall.all_disks(), - text="Select one or more harddrives to use and configure (leave blank to skip this step): ", - allow_empty=True) +class OnlyHDMenu(archinstall.GlobalMenu): + def _setup_selection_menu_options(self): + super()._setup_selection_menu_options() + options_list = [] + mandatory_list = [] + options_list = ['harddrives', 'disk_layouts', '!encryption-password','swap'] + mandatory_list = ['harddrives'] + options_list.extend(['install','abort']) - if not archinstall.arguments['harddrives']: - archinstall.log("You decided to skip harddrive selection",fg="red",level=logging.INFO) - archinstall.log(f"and will use whatever drive-setup is mounted at {archinstall.storage['MOUNT_POINT']} (experimental)",fg="red",level=logging.INFO) - archinstall.log("WARNING: Archinstall won't check the suitability of this setup",fg="red",level=logging.INFO) - if input("Do you wish to continue ? [Y/n]").strip().lower() == 'n': - exit(1) - else: - if archinstall.arguments.get('disk_layouts', None) is None: - archinstall.arguments['disk_layouts'] = archinstall.select_disk_layout(archinstall.arguments['harddrives'], archinstall.arguments.get('advanced', False)) + for entry in self._menu_options: + if entry in options_list: + # for not lineal executions, only self.option(entry).set_enabled and set_mandatory are necessary + if entry in mandatory_list: + self.enable(entry,mandatory=True) + else: + self.enable(entry) + else: + self.option(entry).set_enabled(False) + self._update_install() + def _missing_configs(self): + """ overloaded method """ + def check(s): + return self.option(s).has_selection() + # Get disk encryption password (or skip if blank) if archinstall.arguments.get('!encryption-password', None) is None: if passwd := archinstall.get_password(prompt=str(_('Enter disk encryption password (leave blank for no encryption): '))): archinstall.arguments['!encryption-password'] = passwd - if archinstall.arguments.get('!encryption-password', None): - # 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). - if len(list(archinstall.encrypted_partitions(archinstall.arguments['disk_layouts']))) == 0: - archinstall.arguments['disk_layouts'] = archinstall.select_encrypted_partitions(archinstall.arguments['disk_layouts'], archinstall.arguments['!encryption-password']) - - # Ask which boot-loader to use (will only ask if we're in BIOS (non-efi) mode) - if not archinstall.arguments.get("bootloader", None): - archinstall.arguments["bootloader"] = archinstall.ask_for_bootloader(archinstall.arguments.get('advanced', False)) - - if not archinstall.arguments.get('swap', None): - archinstall.arguments['swap'] = archinstall.ask_for_swap() + _, missing = self.mandatory_overview() + if check('harddrives'): + if not self.option('harddrives').is_empty() and not check('disk_layouts'): + missing += 1 + return missing def ask_user_questions(): """ @@ -46,7 +46,11 @@ def ask_user_questions(): Not until we're satisfied with what we want to install will we continue with the actual installation steps. """ - ask_harddrives() + with OnlyHDMenu(data_store=archinstall.arguments) as menu: + # We select the execution language separated + menu.exec_option('archinstall-language') + menu.option('archinstall-language').set_enabled(False) + menu.run() def perform_disk_operations(): """ @@ -56,7 +60,6 @@ def perform_disk_operations(): if archinstall.arguments.get('harddrives', None): print(f" ! Formatting {archinstall.arguments['harddrives']} in ", end='') archinstall.do_countdown() - """ Setup the blockdevice, filesystem (and optionally encryption). Once that's done, we'll hand over to perform_installation() @@ -66,9 +69,9 @@ def perform_disk_operations(): mode = archinstall.MBR for drive in archinstall.arguments.get('harddrives', []): - if dl_disk := archinstall.arguments.get('disk_layouts', {}).get(drive.path): + if archinstall.arguments.get('disk_layouts', {}).get(drive.path): with archinstall.Filesystem(drive, mode) as fs: - fs.load_layout(dl_disk) + fs.load_layout(archinstall.arguments['disk_layouts'][drive.path]) def perform_installation(mountpoint): """ diff --git a/examples/swiss.py b/examples/swiss.py new file mode 100644 index 00000000..fa2d1fb6 --- /dev/null +++ b/examples/swiss.py @@ -0,0 +1,512 @@ +""" + +Script swiss (army knife) +Designed to make different workflows for the installation process. Which is controled by the argument --mode +mode full guides the full process of installation +mode only_hd only proceeds to the creation of the disk infraestructure (partition, mount points, encryption) +mode only_os processes only the installation of Archlinux and software at --mountpoint (or /mnt/archinstall) +mode minimal (still not implemented) +mode lineal. Instead of a menu, shows a sequence of selection screens (eq. to the old mode for guided.py) + +When using the argument --advanced. an aditional menu for several special parameters needed during installation appears + +This script respects the --dry_run argument + +""" +import logging +import os +import time +import pathlib + +import archinstall + +if archinstall.arguments.get('help'): + print("See `man archinstall` for help.") + exit(0) +if os.getuid() != 0: + print("Archinstall requires root privileges to run. See --help for more.") + exit(1) + +""" +particular routines to SetupMenu +TODO exec con return parameter +""" +def select_activate_NTP(): + prompt = "Would you like to use automatic time synchronization (NTP) with the default time servers? [Y/n]: " + choice = archinstall.Menu(prompt, ['yes', 'no'], default_option='yes').run() + if choice == 'yes': + return True + else: + return False + + +def select_mode(): + return archinstall.generic_select(['full','only_hd','only_os','minimal','lineal'], + 'Select one execution mode', + default=archinstall.arguments.get('mode','full')) + + +""" +following functions will be at locale_helpers, so they will have to be called prefixed by archinstall +""" +def get_locale_mode_text(mode): + if mode == 'LC_ALL': + mode_text = "general (LC_ALL)" + elif mode == "LC_CTYPE": + mode_text = "Character set" + elif mode == "LC_NUMERIC": + mode_text = "Numeric values" + elif mode == "LC_TIME": + mode_text = "Time Values" + elif mode == "LC_COLLATE": + mode_text = "sort order" + elif mode == "LC_MESSAGES": + mode_text = "text messages" + else: + mode_text = "Unassigned" + return mode_text + +def reset_cmd_locale(): + """ sets the cmd_locale to its saved default """ + archinstall.storage['CMD_LOCALE'] = archinstall.storage.get('CMD_LOCALE_DEFAULT',{}) + +def unset_cmd_locale(): + """ archinstall will use the execution environment default """ + archinstall.storage['CMD_LOCALE'] = {} + +def set_cmd_locale(general :str = None, + charset :str = 'C', + numbers :str = 'C', + time :str = 'C', + collate :str = 'C', + messages :str = 'C'): + """ + Set the cmd locale. + If the parameter general is specified, it takes precedence over the rest (might as well not exist) + The rest define some specific settings above the installed default language. If anyone of this parameters is none means the installation default + """ + installed_locales = list_installed_locales() + result = {} + if general: + if general in installed_locales: + archinstall.storage['CMD_LOCALE'] = {'LC_ALL':general} + else: + archinstall.log(f"{get_locale_mode_text('LC_ALL')} {general} is not installed. Defaulting to C",fg="yellow",level=logging.WARNING) + return + + if numbers: + if numbers in installed_locales: + result["LC_NUMERIC"] = numbers + else: + archinstall.log(f"{get_locale_mode_text('LC_NUMERIC')} {numbers} is not installed. Defaulting to installation language",fg="yellow",level=logging.WARNING) + if charset: + if charset in installed_locales: + result["LC_CTYPE"] = charset + else: + archinstall.log(f"{get_locale_mode_text('LC_CTYPE')} {charset} is not installed. Defaulting to installation language",fg="yellow",level=logging.WARNING) + if time: + if time in installed_locales: + result["LC_TIME"] = time + else: + archinstall.log(f"{get_locale_mode_text('LC_TIME')} {time} is not installed. Defaulting to installation language",fg="yellow",level=logging.WARNING) + if collate: + if collate in installed_locales: + result["LC_COLLATE"] = collate + else: + archinstall.log(f"{get_locale_mode_text('LC_COLLATE')} {collate} is not installed. Defaulting to installation language",fg="yellow",level=logging.WARNING) + if messages: + if messages in installed_locales: + result["LC_MESSAGES"] = messages + else: + archinstall.log(f"{get_locale_mode_text('LC_MESSAGES')} {messages} is not installed. Defaulting to installation language",fg="yellow",level=logging.WARNING) + archinstall.storage['CMD_LOCALE'] = result + +def list_installed_locales() -> list[str]: + lista = [] + for line in archinstall.SysCommand('locale -a'): + lista.append(line.decode('UTF-8').strip()) + return lista + + +""" +end of locale helpers +""" + +def select_installed_locale(mode): + mode_text = get_locale_mode_text(mode) + if mode == 'LC_ALL': + texto = "Select the default execution locale \nIf none, you will be prompted for specific settings" + else: + texto = f"Select the {mode_text} ({mode}) execution locale \nIf none, you will get the installation default" + return archinstall.generic_select([None] + list_installed_locales(), + texto, + allow_empty_input=True, + default=archinstall.storage.get('CMD_LOCALE',{}).get(mode,'C')) + + +""" + _menus +""" + +class SetupMenu(archinstall.GeneralMenu): + def __init__(self,storage_area): + super().__init__(data_store=storage_area) + + def _setup_selection_menu_options(self): + self.set_option('archinstall-language', + archinstall.Selector( + _('Select Archinstall language'), + lambda: self._select_archinstall_language('English'), + default='English', + enabled=True)) + self.set_option('ntp', + archinstall.Selector( + 'Activate NTP', + lambda: select_activate_NTP(), + default='Y', + enabled=True)) + self.set_option('mode', + archinstall.Selector( + 'Excution mode', + lambda: select_mode(), + default='full', + enabled=True)) + for item in ['LC_ALL','LC_CTYPE','LC_NUMERIC','LC_TIME','LC_MESSAGES','LC_COLLATE']: + self.set_option(item, + archinstall.Selector( + f'{get_locale_mode_text(item)} locale', + lambda item=item: select_installed_locale(item), # the parmeter is needed for the lambda in the loop + enabled=True, + dependencies_not=['LC_ALL'] if item != 'LC_ALL' else [])) + self.option('LC_ALL').set_enabled(True) + self.set_option('continue', + archinstall.Selector( + 'Continue', + exec_func=lambda n,v: True, + enabled=True)) + + def exit_callback(self): + if self._data_store.get('ntp',False): + archinstall.log("Hardware time and other post-configuration steps might be required in order for NTP to work. For more information, please check the Arch wiki.", fg="yellow") + archinstall.SysCommand('timedatectl set-ntp true') + if self._data_store.get('mode',None): + archinstall.arguments['mode'] = self._data_store['mode'] + archinstall.log(f"Archinstall will execute under {archinstall.arguments['mode']} mode") + if self._data_store.get('LC_ALL',None): + archinstall.storage['CMD_LOCALE'] = {'LC_ALL':self._data_store['LC_ALL']} + else: + exec_locale = {} + for item in ['LC_COLLATE','LC_CTYPE','LC_MESSAGES','LC_NUMERIC','LC_TIME']: + if self._data_store.get(item,None): + exec_locale[item] = self._data_store[item] + archinstall.storage['CMD_LOCALE'] = exec_locale + archinstall.log(f"Archinstall will execute with {archinstall.storage.get('CMD_LOCALE',None)} locale") + +class MyMenu(archinstall.GlobalMenu): + def __init__(self,data_store=archinstall.arguments,mode='full'): + self._execution_mode = mode + super().__init__(data_store) + + def _setup_selection_menu_options(self): + super()._setup_selection_menu_options() + options_list = [] + mandatory_list = [] + if self._execution_mode in ('full','lineal'): + options_list = ['keyboard-layout', 'mirror-region', 'harddrives', 'disk_layouts', + '!encryption-password','swap', 'bootloader', 'hostname', '!root-password', + '!superusers', '!users', 'profile', 'audio', 'kernels', 'packages','nic', + 'timezone', 'ntp'] + if archinstall.arguments.get('advanced',False): + options_list.extend(['sys-language','sys-encoding']) + mandatory_list = ['harddrives','bootloader','hostname'] + elif self._execution_mode == 'only_hd': + options_list = ['harddrives', 'disk_layouts', '!encryption-password','swap'] + mandatory_list = ['harddrives'] + elif self._execution_mode == 'only_os': + options_list = ['keyboard-layout', 'mirror-region','bootloader', 'hostname', + '!root-password', '!superusers', '!users', 'profile', 'audio', 'kernels', + 'packages', 'nic', 'timezone', 'ntp'] + mandatory_list = ['hostname'] + if archinstall.arguments.get('advanced',False): + options_list.expand(['sys-language','sys-encoding']) + elif self._execution_mode == 'minimal': + pass + else: + archinstall.log(f"self._execution_mode {self._execution_mode} not supported") + exit(1) + if self._execution_mode != 'lineal': + options_list.extend(['install','abort']) + if not archinstall.arguments.get('advanced'): + options_list.append('archinstall-language') + + for entry in self._menu_options: + if entry in options_list: + # for not lineal executions, only self.option(entry).set_enabled and set_mandatory are necessary + if entry in mandatory_list: + self.enable(entry,mandatory=True) + else: + self.enable(entry) + else: + self.option(entry).set_enabled(False) + self._update_install() + + def post_callback(self,option,value=None): + self._update_install(self._execution_mode) + + def _missing_configs(self,mode='full'): + def check(s): + return self.option(s).has_selection() + + _, missing = self.mandatory_overview() + if mode in ('full','only_os') and (not check('!root-password') and not check('!superusers')): + missing += 1 + if mode in ('full', 'only_hd') and check('harddrives'): + if not self.option('harddrives').is_empty() and not check('disk_layouts'): + missing += 1 + return missing + + def _install_text(self,mode='full'): + missing = self._missing_configs(mode) + if missing > 0: + return f'Instalation ({missing} config(s) missing)' + return 'Install' + + def _update_install(self,mode='full'): + text = self._install_text(mode) + self.option('install').update_description(text) + + +""" +Instalation general subroutines +""" + +def get_current_status(): + # Log various information about hardware before starting the installation. This might assist in troubleshooting + archinstall.log(f"Hardware model detected: {archinstall.sys_vendor()} {archinstall.product_name()}; UEFI mode: {archinstall.has_uefi()}", level=logging.DEBUG) + archinstall.log(f"Processor model detected: {archinstall.cpu_model()}", level=logging.DEBUG) + archinstall.log(f"Memory statistics: {archinstall.mem_available()} available out of {archinstall.mem_total()} total installed", level=logging.DEBUG) + archinstall.log(f"Virtualization detected: {archinstall.virtualization()}; is VM: {archinstall.is_vm()}", level=logging.DEBUG) + archinstall.log(f"Graphics devices detected: {archinstall.graphics_devices().keys()}", level=logging.DEBUG) + + # For support reasons, we'll log the disk layout pre installation to match against post-installation layout + archinstall.log(f"Disk states before installing: {archinstall.disk_layouts()}", level=logging.DEBUG) + +def ask_user_questions(mode): + """ + First, we'll ask the user for a bunch of user input. + Not until we're satisfied with what we want to install + will we continue with the actual installation steps. + """ + if archinstall.arguments.get('advanced',None): + # 3.9 syntax. former x = {**y,**z} or x.update(y) + set_cmd_locale(charset='es_ES.utf8',collate='es_ES.utf8') + setup_area = archinstall.storage.get('CMD_LOCALE',{}) | {} + with SetupMenu(setup_area) as setup: + if mode == 'lineal': + for entry in setup.list_enabled_options(): + if entry in ('continue','abort'): + continue + if not setup.option(entry).enabled: + continue + setup.exec_option(entry) + else: + setup.run() + archinstall.arguments['archinstall-language'] = setup_area.get('archinstall-language') + else: + archinstall.log("Hardware time and other post-configuration steps might be required in order for NTP to work. For more information, please check the Arch wiki.", fg="yellow") + archinstall.SysCommand('timedatectl set-ntp true') + + with MyMenu(data_store=archinstall.arguments,mode=mode) as global_menu: + + if mode == 'lineal': + for entry in global_menu.list_enabled_options(): + if entry in ('install','abort'): + continue + global_menu.exec_option(entry) + archinstall.arguments[entry] = global_menu.option(entry).get_selection() + else: + global_menu.set_option('install', + archinstall.Selector( + global_menu._install_text(mode), + exec_func=lambda n,v: True if global_menu._missing_configs(mode) == 0 else False, + enabled=True)) + + global_menu.run() + +def perform_filesystem_operations(): + """ + Issue a final warning before we continue with something un-revertable. + We mention the drive one last time, and count from 5 to 0. + """ + + if archinstall.arguments.get('harddrives', None): + print(f" ! Formatting {archinstall.arguments['harddrives']} in ", end='') + archinstall.do_countdown() + + """ + Setup the blockdevice, filesystem (and optionally encryption). + Once that's done, we'll hand over to perform_installation() + """ + + mode = archinstall.GPT + if archinstall.has_uefi() is False: + mode = archinstall.MBR + + for drive in archinstall.arguments.get('harddrives', []): + if archinstall.arguments.get('disk_layouts', {}).get(drive.path): + with archinstall.Filesystem(drive, mode) as fs: + fs.load_layout(archinstall.arguments['disk_layouts'][drive.path]) + +def disk_setup(installation): + # Mount all the drives to the desired mountpoint + # This *can* be done outside of the installation, but the installer can deal with it. + if archinstall.arguments.get('disk_layouts'): + installation.mount_ordered_layout(archinstall.arguments['disk_layouts']) + + # Placing /boot check during installation because this will catch both re-use and wipe scenarios. + for partition in installation.partitions: + if partition.mountpoint == installation.target + '/boot': + 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.") + +def os_setup(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) + # Set mirrors used by pacstrap (outside of installation) + if archinstall.arguments.get('mirror-region', None): + archinstall.use_mirrors(archinstall.arguments['mirror-region']) # Set the mirrors for the live medium + if installation.minimal_installation(): + installation.set_locale(archinstall.arguments['sys-language'], archinstall.arguments['sys-encoding'].upper()) + installation.set_hostname(archinstall.arguments['hostname']) + if archinstall.arguments['mirror-region'].get("mirrors", None) is not None: + installation.set_mirrors( + archinstall.arguments['mirror-region']) # Set the mirrors in the installation medium + if archinstall.arguments["bootloader"] == "grub-install" and archinstall.has_uefi(): + installation.add_additional_packages("grub") + installation.add_bootloader(archinstall.arguments["bootloader"]) + if archinstall.arguments['swap']: + installation.setup_swap('zram') + + # If user selected to copy the current ISO network configuration + # Perform a copy of the config + if archinstall.arguments.get('nic', {}) == 'Copy ISO network configuration to installation': + installation.copy_iso_network_config( + enable_services=True) # Sources the ISO network configuration to the install medium. + elif archinstall.arguments.get('nic', {}).get('NetworkManager', False): + installation.add_additional_packages("networkmanager") + installation.enable_service('NetworkManager.service') + # Otherwise, if a interface was selected, configure that interface + elif archinstall.arguments.get('nic', {}): + installation.configure_nic(**archinstall.arguments.get('nic', {})) + installation.enable_service('systemd-networkd') + installation.enable_service('systemd-resolved') + + if archinstall.arguments.get('audio', None) is not None: + installation.log(f"This audio server will be used: {archinstall.arguments.get('audio', None)}",level=logging.INFO) + if archinstall.arguments.get('audio', None) == 'pipewire': + archinstall.Application(installation, 'pipewire').install() + elif archinstall.arguments.get('audio', None) == 'pulseaudio': + print('Installing pulseaudio ...') + installation.add_additional_packages("pulseaudio") + else: + installation.log("No audio server will be installed.", level=logging.INFO) + + if archinstall.arguments.get('packages', None) and archinstall.arguments.get('packages', None)[0] != '': + installation.add_additional_packages(archinstall.arguments.get('packages', None)) + + if archinstall.arguments.get('profile', None): + installation.install_profile(archinstall.arguments.get('profile', None)) + + for user, user_info in archinstall.arguments.get('!users', {}).items(): + installation.user_create(user, user_info["!password"], sudo=False) + + for superuser, user_info in archinstall.arguments.get('!superusers', {}).items(): + installation.user_create(superuser, user_info["!password"], sudo=True) + + if timezone := archinstall.arguments.get('timezone', None): + installation.set_timezone(timezone) + + if archinstall.arguments.get('ntp', False): + installation.activate_time_syncronization() + + if archinstall.accessibility_tools_in_use(): + installation.enable_espeakup() + + if (root_pw := archinstall.arguments.get('!root-password', None)) and len(root_pw): + installation.user_set_pw('root', root_pw) + + # This step must be after profile installs to allow profiles to install language pre-requisits. + # After which, this step will set the language both for console and x11 if x11 was installed for instance. + installation.set_keyboard_language(archinstall.arguments['keyboard-layout']) + + if archinstall.arguments['profile'] and archinstall.arguments['profile'].has_post_install(): + with archinstall.arguments['profile'].load_instructions( + namespace=f"{archinstall.arguments['profile'].namespace}.py") as imported: + if not imported._post_install(): + archinstall.log(' * Profile\'s post configuration requirements was not fulfilled.', fg='red') + exit(1) + + # If the user provided a list of services to be enabled, pass the list to the enable_service function. + # Note that while it's called enable_service, it can actually take a list of services and iterate it. + if archinstall.arguments.get('services', None): + installation.enable_service(*archinstall.arguments['services']) + + # If the user provided custom commands to be run post-installation, execute them now. + if archinstall.arguments.get('custom-commands', None): + archinstall.run_custom_user_commands(archinstall.arguments['custom-commands'], installation) + + +def perform_installation(mountpoint, mode): + """ + Performs the installation steps on a block device. + Only requirement is that the block devices are + formatted and setup prior to entering this function. + """ + with archinstall.Installer(mountpoint, kernels=archinstall.arguments.get('kernels', ['linux'])) as installation: + if mode in ('full','only_hd'): + disk_setup(installation) + if mode == 'only_hd': + target = pathlib.Path(f"{mountpoint}/etc/fstab") + if not target.parent.exists(): + target.parent.mkdir(parents=True) + + if mode in ('full','only_os'): + os_setup(installation) + installation.log("For post-installation tips, see https://wiki.archlinux.org/index.php/Installation_guide#Post-installation", fg="yellow") + if not archinstall.arguments.get('silent'): + prompt = 'Would you like to chroot into the newly created installation and perform post-installation configuration?' + choice = archinstall.Menu(prompt, ['yes', 'no'], default_option='yes').run() + if choice == 'yes': + try: + installation.drop_to_shell() + except: + pass + + # For support reasons, we'll log the disk layout post installation (crash or no crash) + archinstall.log(f"Disk states after installing: {archinstall.disk_layouts()}", level=logging.DEBUG) + + +if not archinstall.check_mirror_reachable(): + log_file = os.path.join(archinstall.storage.get('LOG_PATH', None), archinstall.storage.get('LOG_FILE', None)) + 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) + +mode = archinstall.arguments.get('mode', 'full').lower() +if not archinstall.arguments.get('silent'): + ask_user_questions(mode) + +archinstall.output_configs(archinstall.arguments,show=False if archinstall.arguments.get('silent') else True) +if archinstall.arguments.get('dry_run'): + exit(0) +if not archinstall.arguments.get('silent'): + input('Press Enter to continue.') + +if mode in ('full','only_hd'): + perform_filesystem_operations() +perform_installation(archinstall.storage.get('MOUNT_POINT', '/mnt'), mode) diff --git a/profiles/xorg.py b/profiles/xorg.py index e13b15d7..33d2aa4c 100644 --- a/profiles/xorg.py +++ b/profiles/xorg.py @@ -3,6 +3,7 @@ import archinstall import logging from archinstall.lib.hardware import __packages__ as __hwd__packages__ + is_top_level_profile = True __description__ = 'Installs a minimal system as well as xorg and graphics drivers.'