diff --git a/.flake8 b/.flake8 index 583b58cf75..becf15f697 100644 --- a/.flake8 +++ b/.flake8 @@ -1,10 +1,11 @@ [flake8] count = True # Several of the following could be autofixed or improved by running the code through psf/black -ignore = E123,E126,E128,E203,E231,E261,E302,E402,E722,F541,W191,W292,W293,W503,W504 +ignore = E123,E128,E722,W191,W503,W504 max-complexity = 40 -max-line-length = 236 +max-line-length = 220 show-source = True statistics = True builtins = _ -per-file-ignores = __init__.py:F401,F403,F405 simple_menu.py:C901,W503 guided.py:C901 network_configuration.py:F821 +per-file-ignores = __init__.py:F401 +exclude = .git,__pycache__,build,docs,actions-runner diff --git a/.github/workflows/flake8.yaml b/.github/workflows/flake8.yaml index 9ba537fa67..ffb9e2f2d3 100644 --- a/.github/workflows/flake8.yaml +++ b/.github/workflows/flake8.yaml @@ -1,5 +1,5 @@ on: [ push, pull_request ] -name: flake8 linting (15 ignores) +name: flake8 linting (6 ignores) jobs: flake8: runs-on: ubuntu-latest diff --git a/.github/workflows/mypy.yaml b/.github/workflows/mypy.yaml index 25db92ff4c..d3ba0f46c5 100644 --- a/.github/workflows/mypy.yaml +++ b/.github/workflows/mypy.yaml @@ -20,6 +20,4 @@ jobs: - run: python --version - run: mypy --version - name: run mypy - run: mypy --config-file pyproject.toml - - name: run mypy strict - run: mypy --config-file mypy.ini + run: mypy diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml index 483e451bd9..5909961458 100644 --- a/.github/workflows/python-build.yml +++ b/.github/workflows/python-build.yml @@ -17,7 +17,7 @@ jobs: pacman-key --init pacman --noconfirm -Sy archlinux-keyring pacman --noconfirm -Syyu - pacman --noconfirm -Sy python-pip python-pyparted python-simple-term-menu pkgconfig gcc + pacman --noconfirm -Sy python-pip python-pydantic python-pyparted python-simple-term-menu pkgconfig gcc - name: Install build dependencies run: | python -m pip install --break-system-packages --upgrade pip diff --git a/.github/workflows/ruff.yaml b/.github/workflows/ruff.yaml new file mode 100644 index 0000000000..257404a1c2 --- /dev/null +++ b/.github/workflows/ruff.yaml @@ -0,0 +1,12 @@ +on: [ push, pull_request ] +name: ruff linting +jobs: + ruff: + runs-on: ubuntu-latest + container: + image: archlinux/archlinux:latest + steps: + - uses: actions/checkout@v4 + - run: pacman --noconfirm -Syu ruff + - name: Lint with ruff + run: ruff check diff --git a/.gitignore b/.gitignore index a6075cc4d9..b03bd3a522 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,6 @@ venv /*.sig /*.json requirements.txt +/.gitconfig +/actions-runner +/cmd_output.txt \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 50000e1012..05ea67a927 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,14 +29,17 @@ repos: - id: check-ast # Simply check whether files parse as valid python - id: check-docstring-first # Checks for a common error of placing code before the docstring - repo: https://github.com/pycqa/flake8 - rev: 7.0.0 + rev: 7.1.1 hooks: - id: flake8 args: [--config=.flake8] fail_fast: true - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.10.0 + rev: v1.11.2 hooks: - id: mypy - args: [--config=pyproject.toml] fail_fast: true + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.6.3 + hooks: + - id: ruff diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3faa8ae8db..7f4727cc91 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,7 +27,7 @@ The exceptions to PEP8 are: * Archinstall uses [tabs instead of spaces](https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces) simply to make it easier for non-IDE developers to navigate the code *(Tab display-width should be equal to 4 spaces)*. Exception to the rule are comments that need fine-tuned indentation for documentation purposes. -* [Line length](https://www.python.org/dev/peps/pep-0008/#maximum-line-length) a maximum line length is enforced via flake8 with 236 characters +* [Line length](https://www.python.org/dev/peps/pep-0008/#maximum-line-length) a maximum line length is enforced via flake8 with 220 characters * [Line breaks before/after binary operator](https://www.python.org/dev/peps/pep-0008/#should-a-line-break-before-or-after-a-binary-operator) is not enforced, as long as the style of line breaks is consistent within the same code block. * Archinstall should always be saved with **Unix-formatted line endings** and no other platform-specific formats. @@ -40,7 +40,7 @@ There might therefore be older code which does not follow the coding convention ## Git hooks -`archinstall` ships pre-commit hooks that make it easier to run check such as `mypy` and `flake8` locally. +`archinstall` ships pre-commit hooks that make it easier to run checks such as `mypy`, `ruff check`, and `flake8` locally. The checks are listed in `.pre-commit-config.yaml` and can be installed via ``` pre-commit install diff --git a/PKGBUILD b/PKGBUILD index 3c6043c613..7a8affeab3 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -22,6 +22,7 @@ depends=( 'pciutils' 'procps-ng' 'python' + 'python-pydantic' 'python-pyparted' 'python-simple-term-menu' 'systemd' diff --git a/archinstall/__init__.py b/archinstall/__init__.py index aed249eaf3..def507c9e9 100644 --- a/archinstall/__init__.py +++ b/archinstall/__init__.py @@ -42,7 +42,7 @@ _: Any -__version__ = "2.8.1" +__version__ = "2.8.6" storage['__version__'] = __version__ # add the custom _ as a builtin, it can now be used anywhere in the @@ -62,7 +62,7 @@ parser = ArgumentParser() -def define_arguments(): +def define_arguments() -> None: """ Define which explicit arguments do we allow. Refer to https://docs.python.org/3/library/argparse.html for documentation and @@ -117,12 +117,13 @@ def parse_unspecified_argument_list(unknowns: list, multiple: bool = False, err: argument value value ... which isn't am error if multiple is specified """ - tmp_list = unknowns[:] # wastes a few bytes, but avoids any collateral effect of the destructive nature of the pop method() + tmp_list = [arg for arg in unknowns if arg != "="] # wastes a few bytes, but avoids any collateral effect of the destructive nature of the pop method() config = {} key = None last_key = None while tmp_list: element = tmp_list.pop(0) # retrieve an element of the list + if element.startswith('--'): # is an argument ? if '=' in element: # uses the arg=value syntax ? key, value = [x.strip() for x in element[2:].split('=', 1)] @@ -132,23 +133,19 @@ def parse_unspecified_argument_list(unknowns: list, multiple: bool = False, err: else: key = element[2:] config[key] = True # every argument starts its lifecycle as boolean - else: - if element == '=': - continue - if key: - config[key] = element - last_key = key # multiple - key = None + elif key: + config[key] = element + last_key = key # multiple + key = None + elif multiple and last_key: + if isinstance(config[last_key], str): + config[last_key] = [config[last_key], element] else: - if multiple and last_key: - if isinstance(config[last_key], str): - config[last_key] = [config[last_key], element] - else: - config[last_key].append(element) - elif err: - raise ValueError(f"Entry {element} is not related to any argument") - else: - print(f" We ignore the entry {element} as it isn't related to any argument") + config[last_key].append(element) + elif err: + raise ValueError(f"Entry {element} is not related to any argument") + else: + print(f" We ignore the entry {element} as it isn't related to any argument") return config @@ -215,7 +212,7 @@ def get_arguments() -> Dict[str, Any]: return config -def load_config(): +def load_config() -> None: """ refine and set some arguments. Formerly at the scripts """ @@ -265,7 +262,7 @@ def load_config(): ) -def post_process_arguments(arguments): +def post_process_arguments(arguments: dict[str, Any]) -> None: storage['arguments'] = arguments if mountpoint := arguments.get('mount_point', None): storage['MOUNT_POINT'] = Path(mountpoint) @@ -287,18 +284,18 @@ def post_process_arguments(arguments): # @archinstall.plugin decorator hook to programmatically add # plugins in runtime. Useful in profiles_bck and other things. -def plugin(f, *args, **kwargs): +def plugin(f, *args, **kwargs) -> None: plugins[f.__name__] = f -def _check_new_version(): +def _check_new_version() -> None: info("Checking version...") try: Pacman.run("-Sy") except Exception as e: debug(f'Failed to perform version check: {e}') - info(f'Arch Linux mirrors are not reachable. Please check your internet connection') + info('Arch Linux mirrors are not reachable. Please check your internet connection') exit(1) upgrade = None @@ -314,7 +311,7 @@ def _check_new_version(): time.sleep(3) -def main(): +def main() -> None: """ This can either be run as the compiled and installed application: python setup.py install OR straight as a module: python -m archinstall @@ -333,7 +330,7 @@ def main(): importlib.import_module(mod_name) -def _shutdown_curses(): +def _shutdown_curses() -> None: try: curses.nocbreak() @@ -351,7 +348,7 @@ def _shutdown_curses(): pass -def run_as_a_module(): +def run_as_a_module() -> None: exc = None try: diff --git a/archinstall/default_profiles/applications/pipewire.py b/archinstall/default_profiles/applications/pipewire.py index 4cb7596841..cc35edc6ef 100644 --- a/archinstall/default_profiles/applications/pipewire.py +++ b/archinstall/default_profiles/applications/pipewire.py @@ -11,7 +11,7 @@ class PipewireProfile(Profile): - def __init__(self): + def __init__(self) -> None: super().__init__('Pipewire', ProfileType.Application) @property @@ -26,7 +26,7 @@ def packages(self) -> List[str]: 'wireplumber' ] - def _enable_pipewire_for_all(self, install_session: 'Installer'): + def _enable_pipewire_for_all(self, install_session: 'Installer') -> None: users: Union[User, List[User]] = archinstall.arguments.get('!users', []) if not isinstance(users, list): users = [users] @@ -34,7 +34,7 @@ def _enable_pipewire_for_all(self, install_session: 'Installer'): for user in users: install_session.arch_chroot('systemctl enable --user pipewire-pulse.service', run_as=user.username) - def install(self, install_session: 'Installer'): + def install(self, install_session: 'Installer') -> None: super().install(install_session) install_session.add_additional_packages(self.packages) self._enable_pipewire_for_all(install_session) diff --git a/archinstall/default_profiles/desktop.py b/archinstall/default_profiles/desktop.py index 04c688ae00..c574473329 100644 --- a/archinstall/default_profiles/desktop.py +++ b/archinstall/default_profiles/desktop.py @@ -6,8 +6,7 @@ from archinstall.tui import ( MenuItemGroup, MenuItem, SelectMenu, - FrameProperties, FrameStyle, Alignment, - ResultType, EditMenu, PreviewStyle + FrameProperties, ResultType, PreviewStyle ) if TYPE_CHECKING: @@ -16,7 +15,7 @@ class DesktopProfile(Profile): - def __init__(self, current_selection: List[Profile] = []): + def __init__(self, current_selection: List[Profile] = []) -> None: super().__init__( 'Desktop', ProfileType.Desktop, @@ -53,7 +52,7 @@ def default_greeter_type(self) -> Optional[GreeterType]: return None - def _do_on_select_profiles(self): + def _do_on_select_profiles(self) -> None: for profile in self.current_selection: profile.do_on_select() @@ -94,15 +93,15 @@ def do_on_select(self) -> Optional[SelectResult]: return None - def post_install(self, install_session: 'Installer'): + def post_install(self, install_session: 'Installer') -> None: for profile in self._current_selection: profile.post_install(install_session) - def install(self, install_session: 'Installer'): + def install(self, install_session: 'Installer') -> None: # Install common packages for all desktop environments install_session.add_additional_packages(self.packages) - for profile in self._current_selection: + for profile in self.current_selection: info(f'Installing profile {profile.name}...') install_session.add_additional_packages(profile.packages) diff --git a/archinstall/default_profiles/desktops/awesome.py b/archinstall/default_profiles/desktops/awesome.py index 3833ce71bf..ee29e63fd3 100644 --- a/archinstall/default_profiles/desktops/awesome.py +++ b/archinstall/default_profiles/desktops/awesome.py @@ -9,7 +9,7 @@ class AwesomeProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Awesome', ProfileType.WindowMgr, description='') @property @@ -28,7 +28,7 @@ def packages(self) -> List[str]: 'xsel', ] - def install(self, install_session: 'Installer'): + def install(self, install_session: 'Installer') -> None: super().install(install_session) # TODO: Copy a full configuration to ~/.config/awesome/rc.lua instead. @@ -60,4 +60,4 @@ def install(self, install_session: 'Installer'): xinitrc_data += 'exec awesome\n' with open(f"{install_session.target}/etc/X11/xinit/xinitrc", 'w') as xinitrc: - xinitrc.write(xinitrc_data) \ No newline at end of file + xinitrc.write(xinitrc_data) diff --git a/archinstall/default_profiles/desktops/bspwm.py b/archinstall/default_profiles/desktops/bspwm.py index 61eeba4343..eda0dc4caa 100644 --- a/archinstall/default_profiles/desktops/bspwm.py +++ b/archinstall/default_profiles/desktops/bspwm.py @@ -8,7 +8,7 @@ class BspwmProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Bspwm', ProfileType.WindowMgr, description='') @property diff --git a/archinstall/default_profiles/desktops/budgie.py b/archinstall/default_profiles/desktops/budgie.py index 28c05f45f2..9c984de0fc 100644 --- a/archinstall/default_profiles/desktops/budgie.py +++ b/archinstall/default_profiles/desktops/budgie.py @@ -8,7 +8,7 @@ class BudgieProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Budgie', ProfileType.DesktopEnv, description='') @property diff --git a/archinstall/default_profiles/desktops/cinnamon.py b/archinstall/default_profiles/desktops/cinnamon.py index a819b4d1cf..b50b0b5321 100644 --- a/archinstall/default_profiles/desktops/cinnamon.py +++ b/archinstall/default_profiles/desktops/cinnamon.py @@ -8,7 +8,7 @@ class CinnamonProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Cinnamon', ProfileType.DesktopEnv, description='') @property @@ -18,8 +18,13 @@ def packages(self) -> List[str]: "system-config-printer", "gnome-keyring", "gnome-terminal", - "blueberry", - "metacity" + "blueman", + "bluez-utils", + "engrampa", + "gnome-screenshot", + "gvfs-smb", + "xed", + "xdg-user-dirs-gtk" ] @property diff --git a/archinstall/default_profiles/desktops/cosmic.py b/archinstall/default_profiles/desktops/cosmic.py new file mode 100644 index 0000000000..8b47cc6fb5 --- /dev/null +++ b/archinstall/default_profiles/desktops/cosmic.py @@ -0,0 +1,22 @@ +from typing import List, Optional, Any, TYPE_CHECKING + +from archinstall.default_profiles.profile import ProfileType, GreeterType +from archinstall.default_profiles.xorg import XorgProfile + +if TYPE_CHECKING: + _: Any + + +class CosmicProfile(XorgProfile): + def __init__(self) -> None: + super().__init__('cosmic-epoch', ProfileType.DesktopEnv, description='', advanced=True) + + @property + def packages(self) -> List[str]: + return [ + "cosmic", + ] + + @property + def default_greeter_type(self) -> Optional[GreeterType]: + return GreeterType.CosmicSession diff --git a/archinstall/default_profiles/desktops/cutefish.py b/archinstall/default_profiles/desktops/cutefish.py index c42029205b..52dfc371ef 100644 --- a/archinstall/default_profiles/desktops/cutefish.py +++ b/archinstall/default_profiles/desktops/cutefish.py @@ -9,7 +9,7 @@ class CutefishProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Cutefish', ProfileType.DesktopEnv, description='') @property @@ -23,5 +23,5 @@ def packages(self) -> List[str]: def default_greeter_type(self) -> Optional[GreeterType]: return GreeterType.Sddm - def install(self, install_session: 'Installer'): + def install(self, install_session: 'Installer') -> None: super().install(install_session) diff --git a/archinstall/default_profiles/desktops/deepin.py b/archinstall/default_profiles/desktops/deepin.py index e6a9f6b5a3..79ad45d964 100644 --- a/archinstall/default_profiles/desktops/deepin.py +++ b/archinstall/default_profiles/desktops/deepin.py @@ -8,7 +8,7 @@ class DeepinProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Deepin', ProfileType.DesktopEnv, description='') @property diff --git a/archinstall/default_profiles/desktops/enlightenment.py b/archinstall/default_profiles/desktops/enlightenment.py index 7dd7822ad8..ff1df81bb6 100644 --- a/archinstall/default_profiles/desktops/enlightenment.py +++ b/archinstall/default_profiles/desktops/enlightenment.py @@ -8,7 +8,7 @@ class EnlighenmentProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Enlightenment', ProfileType.WindowMgr, description='') @property diff --git a/archinstall/default_profiles/desktops/gnome.py b/archinstall/default_profiles/desktops/gnome.py index 24ade4375c..393a466cb2 100644 --- a/archinstall/default_profiles/desktops/gnome.py +++ b/archinstall/default_profiles/desktops/gnome.py @@ -8,7 +8,7 @@ class GnomeProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Gnome', ProfileType.DesktopEnv, description='') @property diff --git a/archinstall/default_profiles/desktops/hyprland.py b/archinstall/default_profiles/desktops/hyprland.py index 311f1e5f55..c884a5ae5c 100644 --- a/archinstall/default_profiles/desktops/hyprland.py +++ b/archinstall/default_profiles/desktops/hyprland.py @@ -15,7 +15,7 @@ class SeatAccess(Enum): class HyprlandProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Hyprland', ProfileType.DesktopEnv, description='') self.custom_settings = {'seat_access': None} @@ -46,7 +46,7 @@ def services(self) -> List[str]: return [pref] return [] - def _ask_seat_access(self): + def _ask_seat_access(self) -> None: # need to activate seat service and add to seat group header = str(_('Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)')) header += '\n' + str(_('Choose an option to give Sway access to your hardware')) + '\n' @@ -73,5 +73,5 @@ def do_on_select(self) -> Optional[SelectResult]: self._ask_seat_access() return None - def install(self, install_session: 'Installer'): + def install(self, install_session: 'Installer') -> None: super().install(install_session) diff --git a/archinstall/default_profiles/desktops/i3.py b/archinstall/default_profiles/desktops/i3.py index 9c2994de74..a5122e3edf 100644 --- a/archinstall/default_profiles/desktops/i3.py +++ b/archinstall/default_profiles/desktops/i3.py @@ -8,7 +8,7 @@ class I3wmProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('i3-wm', ProfileType.WindowMgr, description='') @property diff --git a/archinstall/default_profiles/desktops/lxqt.py b/archinstall/default_profiles/desktops/lxqt.py index 5d75e08d14..c73588a850 100644 --- a/archinstall/default_profiles/desktops/lxqt.py +++ b/archinstall/default_profiles/desktops/lxqt.py @@ -8,7 +8,7 @@ class LxqtProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Lxqt', ProfileType.DesktopEnv, description='') # NOTE: SDDM is the only officially supported greeter for LXQt, so unlike other DEs, lightdm is not used here. diff --git a/archinstall/default_profiles/desktops/mate.py b/archinstall/default_profiles/desktops/mate.py index d3c4a6e158..3f4b6ce40b 100644 --- a/archinstall/default_profiles/desktops/mate.py +++ b/archinstall/default_profiles/desktops/mate.py @@ -8,7 +8,7 @@ class MateProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Mate', ProfileType.DesktopEnv, description='') @property diff --git a/archinstall/default_profiles/desktops/plasma.py b/archinstall/default_profiles/desktops/plasma.py index bcc1ea1b2b..042d90c2d7 100644 --- a/archinstall/default_profiles/desktops/plasma.py +++ b/archinstall/default_profiles/desktops/plasma.py @@ -6,8 +6,9 @@ if TYPE_CHECKING: _: Any + class PlasmaProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('KDE Plasma', ProfileType.DesktopEnv, description='') @property diff --git a/archinstall/default_profiles/desktops/qtile.py b/archinstall/default_profiles/desktops/qtile.py index 96e93b1dae..e556336e99 100644 --- a/archinstall/default_profiles/desktops/qtile.py +++ b/archinstall/default_profiles/desktops/qtile.py @@ -8,7 +8,7 @@ class QtileProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Qtile', ProfileType.WindowMgr, description='') @property diff --git a/archinstall/default_profiles/desktops/sway.py b/archinstall/default_profiles/desktops/sway.py index d4cd913d82..c0ad5abb0d 100644 --- a/archinstall/default_profiles/desktops/sway.py +++ b/archinstall/default_profiles/desktops/sway.py @@ -6,8 +6,7 @@ from archinstall.tui import ( MenuItemGroup, MenuItem, SelectMenu, - FrameProperties, FrameStyle, Alignment, - ResultType, EditMenu + FrameProperties, Alignment, ResultType ) if TYPE_CHECKING: @@ -21,7 +20,7 @@ class SeatAccess(Enum): class SwayProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__( 'Sway', ProfileType.WindowMgr, @@ -61,7 +60,7 @@ def services(self) -> List[str]: return [pref] return [] - def _ask_seat_access(self): + def _ask_seat_access(self) -> None: # need to activate seat service and add to seat group header = str(_('Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)')) header += '\n' + str(_('Choose an option to give Sway access to your hardware')) + '\n' @@ -88,5 +87,5 @@ def do_on_select(self) -> Optional[SelectResult]: self._ask_seat_access() return None - def install(self, install_session: 'Installer'): + def install(self, install_session: 'Installer') -> None: super().install(install_session) diff --git a/archinstall/default_profiles/desktops/xfce4.py b/archinstall/default_profiles/desktops/xfce4.py index a7f0a7e686..ce4bb725f4 100644 --- a/archinstall/default_profiles/desktops/xfce4.py +++ b/archinstall/default_profiles/desktops/xfce4.py @@ -8,7 +8,7 @@ class Xfce4Profile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('Xfce4', ProfileType.DesktopEnv, description='') @property diff --git a/archinstall/default_profiles/profile.py b/archinstall/default_profiles/profile.py index 1dffc281bb..ce492639d0 100644 --- a/archinstall/default_profiles/profile.py +++ b/archinstall/default_profiles/profile.py @@ -1,18 +1,17 @@ from __future__ import annotations +import sys from enum import Enum, auto -from typing import List, Optional, Any, Dict, TYPE_CHECKING, TypeVar +from typing import List, Optional, Any, Dict, TYPE_CHECKING -from archinstall.lib.utils.util import format_cols +from ..lib.utils.util import format_cols +from ..lib.storage import storage if TYPE_CHECKING: - from archinstall.lib.installer import Installer + from ..lib.installer import Installer _: Any -TProfile = TypeVar('TProfile', bound='Profile') - - class ProfileType(Enum): # top level default_profiles Server = 'Server' @@ -37,6 +36,10 @@ class GreeterType(Enum): Gdm = 'gdm' Ly = 'ly' + # .. todo:: Remove when we un-hide cosmic behind --advanced + if '--advanced' in sys.argv: + CosmicSession = "cosmic-greeter" + class SelectResult(Enum): NewSelection = auto() @@ -50,33 +53,31 @@ def __init__( name: str, profile_type: ProfileType, description: str = '', - current_selection: List[TProfile] = [], + current_selection: List[Profile] = [], packages: List[str] = [], services: List[str] = [], support_gfx_driver: bool = False, - support_greeter: bool = False - ): + support_greeter: bool = False, + advanced: bool = False + ) -> None: self.name = name self.description = description self.profile_type = profile_type self.custom_settings: Dict[str, Any] = {} + self.advanced = advanced self._support_gfx_driver = support_gfx_driver self._support_greeter = support_greeter # self.gfx_driver: Optional[str] = None - self._current_selection = current_selection + self.current_selection = current_selection self._packages = packages self._services = services # Only used for custom default_profiles self.custom_enabled = False - @property - def current_selection(self) -> List[TProfile]: - return self._current_selection - @property def packages(self) -> List[str]: """ @@ -100,12 +101,19 @@ def default_greeter_type(self) -> Optional[GreeterType]: """ return None - def install(self, install_session: 'Installer'): + def _advanced_check(self) -> bool: + """ + Used to control if the Profile() should be visible or not in different contexts. + Returns True if --advanced is given on a Profile(advanced=True) instance. + """ + return self.advanced is False or storage['arguments'].get('advanced', False) is True + + def install(self, install_session: 'Installer') -> None: """ Performs installation steps when this profile was selected """ - def post_install(self, install_session: 'Installer'): + def post_install(self, install_session: 'Installer') -> None: """ Hook that will be called when the installation process is finished and custom installation steps for specific default_profiles @@ -124,7 +132,7 @@ def do_on_select(self) -> Optional[SelectResult]: """ return SelectResult.NewSelection - def set_custom_settings(self, settings: Dict[str, Any]): + def set_custom_settings(self, settings: Dict[str, Any]) -> None: """ Set the custom settings for the profile. This is also called when the settings are parsed from the config @@ -133,31 +141,28 @@ def set_custom_settings(self, settings: Dict[str, Any]): self.custom_settings = settings def current_selection_names(self) -> List[str]: - if self._current_selection: - return [s.name for s in self._current_selection] + if self.current_selection: + return [s.name for s in self.current_selection] return [] - def reset(self): - self.set_current_selection([]) - - def set_current_selection(self, current_selection: List[TProfile]): - self._current_selection = current_selection + def reset(self) -> None: + self.current_selection = [] def is_top_level_profile(self) -> bool: top_levels = [ProfileType.Desktop, ProfileType.Server, ProfileType.Xorg, ProfileType.Minimal, ProfileType.Custom] return self.profile_type in top_levels def is_desktop_profile(self) -> bool: - return self.profile_type == ProfileType.Desktop + return self.profile_type == ProfileType.Desktop if self._advanced_check() else False def is_server_type_profile(self) -> bool: return self.profile_type == ProfileType.ServerType def is_desktop_type_profile(self) -> bool: - return self.profile_type == ProfileType.DesktopEnv or self.profile_type == ProfileType.WindowMgr + return (self.profile_type == ProfileType.DesktopEnv or self.profile_type == ProfileType.WindowMgr) if self._advanced_check() else False def is_xorg_type_profile(self) -> bool: - return self.profile_type == ProfileType.Xorg + return self.profile_type == ProfileType.Xorg if self._advanced_check() else False def is_tailored(self) -> bool: return self.profile_type == ProfileType.Tailored @@ -166,10 +171,10 @@ def is_custom_type_profile(self) -> bool: return self.profile_type == ProfileType.CustomType def is_graphic_driver_supported(self) -> bool: - if not self._current_selection: + if not self.current_selection: return self._support_gfx_driver else: - if any([p._support_gfx_driver for p in self._current_selection]): + if any([p._support_gfx_driver for p in self.current_selection]): return True return False diff --git a/archinstall/default_profiles/server.py b/archinstall/default_profiles/server.py index d57d3c0f79..2a86011bc2 100644 --- a/archinstall/default_profiles/server.py +++ b/archinstall/default_profiles/server.py @@ -2,12 +2,11 @@ from archinstall.lib.output import info from archinstall.lib.profile.profiles_handler import profile_handler -from archinstall.default_profiles.profile import ProfileType, Profile, SelectResult, TProfile +from archinstall.default_profiles.profile import ProfileType, Profile, SelectResult from archinstall.tui import ( MenuItemGroup, MenuItem, SelectMenu, - FrameProperties, FrameStyle, Alignment, - ResultType, EditMenu, PreviewStyle + FrameProperties, ResultType, PreviewStyle ) if TYPE_CHECKING: @@ -16,7 +15,7 @@ class ServerProfile(Profile): - def __init__(self, current_value: List[TProfile] = []): + def __init__(self, current_value: List[Profile] = []): super().__init__( 'Server', ProfileType.Server, @@ -60,16 +59,16 @@ def do_on_select(self) -> Optional[SelectResult]: return None - def post_install(self, install_session: 'Installer'): + def post_install(self, install_session: 'Installer') -> None: for profile in self._current_selection: profile.post_install(install_session) - def install(self, install_session: 'Installer'): + def install(self, install_session: 'Installer') -> None: server_info = self.current_selection_names() details = ', '.join(server_info) info(f'Now installing the selected servers: {details}') - for server in self._current_selection: + for server in self.current_selection: info(f'Installing {server.name}...') install_session.add_additional_packages(server.packages) install_session.enable_service(server.services) diff --git a/archinstall/default_profiles/servers/cockpit.py b/archinstall/default_profiles/servers/cockpit.py index 8cac097687..455b2f3392 100644 --- a/archinstall/default_profiles/servers/cockpit.py +++ b/archinstall/default_profiles/servers/cockpit.py @@ -4,7 +4,7 @@ class CockpitProfile(Profile): - def __init__(self): + def __init__(self) -> None: super().__init__( 'Cockpit', ProfileType.ServerType diff --git a/archinstall/default_profiles/servers/docker.py b/archinstall/default_profiles/servers/docker.py index f480091619..53ee7ba0a6 100644 --- a/archinstall/default_profiles/servers/docker.py +++ b/archinstall/default_profiles/servers/docker.py @@ -10,7 +10,7 @@ class DockerProfile(Profile): - def __init__(self): + def __init__(self) -> None: super().__init__( 'Docker', ProfileType.ServerType @@ -24,7 +24,7 @@ def packages(self) -> List[str]: def services(self) -> List[str]: return ['docker'] - def post_install(self, install_session: 'Installer'): + def post_install(self, install_session: 'Installer') -> None: users: Union[User, List[User]] = archinstall.arguments.get('!users', []) if not isinstance(users, list): users = [users] diff --git a/archinstall/default_profiles/servers/httpd.py b/archinstall/default_profiles/servers/httpd.py index 595ce84fb1..8252e01c13 100644 --- a/archinstall/default_profiles/servers/httpd.py +++ b/archinstall/default_profiles/servers/httpd.py @@ -4,7 +4,7 @@ class HttpdProfile(Profile): - def __init__(self): + def __init__(self) -> None: super().__init__( 'httpd', ProfileType.ServerType diff --git a/archinstall/default_profiles/servers/lighttpd.py b/archinstall/default_profiles/servers/lighttpd.py index 00aa556408..01b406b7ec 100644 --- a/archinstall/default_profiles/servers/lighttpd.py +++ b/archinstall/default_profiles/servers/lighttpd.py @@ -4,7 +4,7 @@ class LighttpdProfile(Profile): - def __init__(self): + def __init__(self) -> None: super().__init__( 'Lighttpd', ProfileType.ServerType diff --git a/archinstall/default_profiles/servers/mariadb.py b/archinstall/default_profiles/servers/mariadb.py index 4506f1bc4f..249b26568e 100644 --- a/archinstall/default_profiles/servers/mariadb.py +++ b/archinstall/default_profiles/servers/mariadb.py @@ -7,7 +7,7 @@ class MariadbProfile(Profile): - def __init__(self): + def __init__(self) -> None: super().__init__( 'Mariadb', ProfileType.ServerType @@ -21,5 +21,5 @@ def packages(self) -> List[str]: def services(self) -> List[str]: return ['mariadb'] - def post_install(self, install_session: 'Installer'): + def post_install(self, install_session: 'Installer') -> None: install_session.arch_chroot('mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql') diff --git a/archinstall/default_profiles/servers/nginx.py b/archinstall/default_profiles/servers/nginx.py index 6038616cb8..bc8ffed413 100644 --- a/archinstall/default_profiles/servers/nginx.py +++ b/archinstall/default_profiles/servers/nginx.py @@ -4,7 +4,7 @@ class NginxProfile(Profile): - def __init__(self): + def __init__(self) -> None: super().__init__( 'Nginx', ProfileType.ServerType diff --git a/archinstall/default_profiles/servers/postgresql.py b/archinstall/default_profiles/servers/postgresql.py index dba722cef6..09a2897873 100644 --- a/archinstall/default_profiles/servers/postgresql.py +++ b/archinstall/default_profiles/servers/postgresql.py @@ -7,7 +7,7 @@ class PostgresqlProfile(Profile): - def __init__(self): + def __init__(self) -> None: super().__init__( 'Postgresql', ProfileType.ServerType, @@ -22,5 +22,5 @@ def packages(self) -> List[str]: def services(self) -> List[str]: return ['postgresql'] - def post_install(self, install_session: 'Installer'): + def post_install(self, install_session: 'Installer') -> None: install_session.arch_chroot("initdb -D /var/lib/postgres/data", run_as='postgres') diff --git a/archinstall/default_profiles/servers/sshd.py b/archinstall/default_profiles/servers/sshd.py index 7f855b1abb..5a1020912c 100644 --- a/archinstall/default_profiles/servers/sshd.py +++ b/archinstall/default_profiles/servers/sshd.py @@ -4,7 +4,7 @@ class SshdProfile(Profile): - def __init__(self): + def __init__(self) -> None: super().__init__( 'sshd', ProfileType.ServerType diff --git a/archinstall/default_profiles/servers/tomcat.py b/archinstall/default_profiles/servers/tomcat.py index 9bd8837bab..ba7097edfb 100644 --- a/archinstall/default_profiles/servers/tomcat.py +++ b/archinstall/default_profiles/servers/tomcat.py @@ -4,7 +4,7 @@ class TomcatProfile(Profile): - def __init__(self): + def __init__(self) -> None: super().__init__( 'Tomcat', ProfileType.ServerType diff --git a/archinstall/default_profiles/tailored.py b/archinstall/default_profiles/tailored.py index 62666249a8..cc8426abc4 100644 --- a/archinstall/default_profiles/tailored.py +++ b/archinstall/default_profiles/tailored.py @@ -9,13 +9,13 @@ class TailoredProfile(XorgProfile): - def __init__(self): + def __init__(self) -> None: super().__init__('52-54-00-12-34-56', ProfileType.Tailored, description='') @property def packages(self) -> List[str]: return ['nano', 'wget', 'git'] - def install(self, install_session: 'Installer'): + def install(self, install_session: 'Installer') -> None: super().install(install_session) # do whatever you like here :) diff --git a/archinstall/default_profiles/xorg.py b/archinstall/default_profiles/xorg.py index 88ba55a680..176b4ae5d8 100644 --- a/archinstall/default_profiles/xorg.py +++ b/archinstall/default_profiles/xorg.py @@ -12,12 +12,14 @@ def __init__( name: str = 'Xorg', profile_type: ProfileType = ProfileType.Xorg, description: str = str(_('Installs a minimal system as well as xorg and graphics drivers.')), + advanced: bool = False ): super().__init__( name, profile_type, description=description, - support_gfx_driver=True + support_gfx_driver=True, + advanced=advanced ) def preview_text(self) -> Optional[str]: diff --git a/archinstall/lib/boot.py b/archinstall/lib/boot.py index 62c50df30e..498a987e85 100644 --- a/archinstall/lib/boot.py +++ b/archinstall/lib/boot.py @@ -42,7 +42,7 @@ def __enter__(self) -> 'Boot': storage['active_boot'] = self return self - def __exit__(self, *args :str, **kwargs :str) -> None: + def __exit__(self, *args: str, **kwargs: str) -> None: # b''.join(sys_command('sync')) # No need to, since the underlying fs() object will call sync. # TODO: https://stackoverflow.com/questions/28157929/how-to-safely-handle-an-exception-inside-a-context-manager @@ -94,7 +94,7 @@ def is_alive(self) -> bool: return self.session.is_alive() - def SysCommand(self, cmd: list, *args, **kwargs) -> SysCommand: + def SysCommand(self, cmd: list[str], *args, **kwargs) -> SysCommand: if cmd[0][0] != '/' and cmd[0][:2] != './': # This check is also done in SysCommand & SysCommandWorker. # However, that check is done for `machinectl` and not for our chroot command. @@ -104,7 +104,7 @@ def SysCommand(self, cmd: list, *args, **kwargs) -> SysCommand: return SysCommand(["systemd-run", f"--machine={self.container_name}", "--pty", *cmd], *args, **kwargs) - def SysCommandWorker(self, cmd: list, *args, **kwargs) -> SysCommandWorker: + def SysCommandWorker(self, cmd: list[str], *args, **kwargs) -> SysCommandWorker: if cmd[0][0] != '/' and cmd[0][:2] != './': cmd[0] = locate_binary(cmd[0]) diff --git a/archinstall/lib/configuration.py b/archinstall/lib/configuration.py index 988459cfea..0518f62734 100644 --- a/archinstall/lib/configuration.py +++ b/archinstall/lib/configuration.py @@ -42,14 +42,14 @@ def __init__(self, config: Dict): self._process_config() @property - def user_credentials_file(self): + def user_credentials_file(self) -> str: return self._user_creds_file @property - def user_configuration_file(self): + def user_configuration_file(self) -> str: return self._user_config_file - def _process_config(self): + def _process_config(self) -> None: for key, value in self._config.items(): if key in self._sensitive: self._user_credentials[key] = value @@ -112,20 +112,20 @@ def _is_valid_path(self, dest_path: Path) -> bool: ) return dest_path_ok - def save_user_config(self, dest_path: Path): + def save_user_config(self, dest_path: Path) -> None: if self._is_valid_path(dest_path): target = dest_path / self._user_config_file target.write_text(self.user_config_to_json()) os.chmod(target, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP) - def save_user_creds(self, dest_path: Path): + def save_user_creds(self, dest_path: Path) -> None: if self._is_valid_path(dest_path): if user_creds := self.user_credentials_to_json(): target = dest_path / self._user_creds_file target.write_text(user_creds) os.chmod(target, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP) - def save(self, dest_path: Optional[Path] = None): + def save(self, dest_path: Optional[Path] = None) -> None: dest_path = dest_path or self._default_save_path if self._is_valid_path(dest_path): @@ -197,7 +197,7 @@ def preview(item: MenuItem) -> Optional[str]: if not dest_path: return - header = str( _("Do you want to save the configuration file(s) to {}?")).format(dest_path) + header = str(_("Do you want to save the configuration file(s) to {}?")).format(dest_path) group = MenuItemGroup.yes_no() group.set_focus_by_value(MenuItem.yes().value) diff --git a/archinstall/lib/disk/device_handler.py b/archinstall/lib/disk/device_handler.py index bd49918ac3..e85441538b 100644 --- a/archinstall/lib/disk/device_handler.py +++ b/archinstall/lib/disk/device_handler.py @@ -8,7 +8,7 @@ from pathlib import Path from typing import List, Dict, Any, Optional, TYPE_CHECKING, Literal, Iterable -from parted import ( # type: ignore +from parted import ( Disk, Geometry, FileSystem, PartitionException, DiskException, getDevice, getAllDevices, newDisk, freshDisk, Partition, Device @@ -18,7 +18,7 @@ DeviceModification, PartitionModification, BDevice, _DeviceInfo, _PartitionInfo, FilesystemType, Unit, PartitionTable, - ModificationStatus, get_lsblk_info, LsblkInfo, + ModificationStatus, get_lsblk_info, find_lsblk_info, LsblkInfo, _BtrfsSubvolumeInfo, get_all_lsblk_info, DiskEncryption, LvmVolumeGroup, LvmVolume, Size, LvmGroupInfo, SectorSize, LvmVolumeInfo, LvmPVInfo, SubvolumeModification, BtrfsMountOption ) @@ -36,7 +36,7 @@ class DeviceHandler(object): _TMP_BTRFS_MOUNT = Path('/mnt/arch_btrfs') - def __init__(self): + def __init__(self) -> None: self._devices: Dict[Path, BDevice] = {} self.load_devices() @@ -44,9 +44,11 @@ def __init__(self): def devices(self) -> List[BDevice]: return list(self._devices.values()) - def load_devices(self): + def load_devices(self) -> None: block_devices = {} + SysCommand('udevadm settle') + all_lsblk_info = get_all_lsblk_info() devices = getAllDevices() try: @@ -58,7 +60,11 @@ def load_devices(self): debug(f'Failed to get loop devices: {err}') for device in devices: - dev_lsblk_info = get_lsblk_info(device.path) + dev_lsblk_info = find_lsblk_info(device.path, all_lsblk_info) + + if not dev_lsblk_info: + debug(f'Device lsblk info not found: {device.path}') + continue if dev_lsblk_info.type == 'rom': continue @@ -76,12 +82,17 @@ def load_devices(self): partition_infos = [] for partition in disk.partitions: - lsblk_info = get_lsblk_info(partition.path) + lsblk_info = find_lsblk_info(partition.path, dev_lsblk_info.children) + + if not lsblk_info: + debug(f'Partition lsblk info not found: {partition.path}') + continue + fs_type = self._determine_fs_type(partition, lsblk_info) subvol_infos = [] if fs_type == FilesystemType.Btrfs: - subvol_infos = self.get_btrfs_info(partition.path) + subvol_infos = self.get_btrfs_info(partition.path, lsblk_info) partition_infos.append( _PartitionInfo.from_partition( @@ -155,8 +166,14 @@ def get_uuid_for_path(self, path: Path) -> Optional[str]: partition = self.find_partition(path) return partition.partuuid if partition else None - def get_btrfs_info(self, dev_path: Path) -> List[_BtrfsSubvolumeInfo]: - lsblk_info = get_lsblk_info(dev_path) + def get_btrfs_info( + self, + dev_path: Path, + lsblk_info: Optional[LsblkInfo] = None + ) -> List[_BtrfsSubvolumeInfo]: + if not lsblk_info: + lsblk_info = get_lsblk_info(dev_path) + subvol_infos: List[_BtrfsSubvolumeInfo] = [] if not lsblk_info.mountpoint: @@ -199,7 +216,7 @@ def format( fs_type: FilesystemType, path: Path, additional_parted_options: List[str] = [] - ): + ) -> None: mkfs_type = fs_type.value options = [] @@ -265,7 +282,7 @@ def format_encrypted( mapper_name: Optional[str], fs_type: FilesystemType, enc_conf: DiskEncryption - ): + ) -> None: luks_handler = Luks2( dev_path, mapper_name=mapper_name, @@ -302,7 +319,7 @@ def _lvm_info( for report in reports['report']: if len(report[info_type]) != 1: - raise ValueError(f'Report does not contain any entry') + raise ValueError('Report does not contain any entry') entry = report[info_type][0] @@ -317,12 +334,12 @@ def _lvm_info( return LvmVolumeInfo( lv_name=entry['lv_name'], vg_name=entry['vg_name'], - lv_size=Size(int(entry[f'lv_size'][:-1]), Unit.B, SectorSize.default()) + lv_size=Size(int(entry['lv_size'][:-1]), Unit.B, SectorSize.default()) ) case 'vg': return LvmGroupInfo( vg_uuid=entry['vg_uuid'], - vg_size=Size(int(entry[f'vg_size'][:-1]), Unit.B, SectorSize.default()) + vg_size=Size(int(entry['vg_size'][:-1]), Unit.B, SectorSize.default()) ) return None @@ -367,33 +384,33 @@ def lvm_pvseg_info(self, vg_name: str, lv_name: str) -> Optional[LvmPVInfo]: return self._lvm_info_with_retry(cmd, 'pvseg') - def lvm_vol_change(self, vol: LvmVolume, activate: bool): + def lvm_vol_change(self, vol: LvmVolume, activate: bool) -> None: active_flag = 'y' if activate else 'n' cmd = f'lvchange -a {active_flag} {vol.safe_dev_path}' debug(f'lvchange volume: {cmd}') SysCommand(cmd) - def lvm_export_vg(self, vg: LvmVolumeGroup): + def lvm_export_vg(self, vg: LvmVolumeGroup) -> None: cmd = f'vgexport {vg.name}' debug(f'vgexport: {cmd}') SysCommand(cmd) - def lvm_import_vg(self, vg: LvmVolumeGroup): + def lvm_import_vg(self, vg: LvmVolumeGroup) -> None: cmd = f'vgimport {vg.name}' debug(f'vgimport: {cmd}') SysCommand(cmd) - def lvm_vol_reduce(self, vol_path: Path, amount: Size): + def lvm_vol_reduce(self, vol_path: Path, amount: Size) -> None: val = amount.format_size(Unit.B, include_unit=False) cmd = f'lvreduce -L -{val}B {vol_path}' debug(f'Reducing LVM volume size: {cmd}') SysCommand(cmd) - def lvm_pv_create(self, pvs: Iterable[Path]): + def lvm_pv_create(self, pvs: Iterable[Path]) -> None: cmd = 'pvcreate ' + ' '.join([str(pv) for pv in pvs]) debug(f'Creating LVM PVS: {cmd}') @@ -401,7 +418,7 @@ def lvm_pv_create(self, pvs: Iterable[Path]): worker.poll() worker.write(b'y\n', line_ending=False) - def lvm_vg_create(self, pvs: Iterable[Path], vg_name: str): + def lvm_vg_create(self, pvs: Iterable[Path], vg_name: str) -> None: pvs_str = ' '.join([str(pv) for pv in pvs]) cmd = f'vgcreate --yes {vg_name} {pvs_str}' @@ -411,7 +428,7 @@ def lvm_vg_create(self, pvs: Iterable[Path], vg_name: str): worker.poll() worker.write(b'y\n', line_ending=False) - def lvm_vol_create(self, vg_name: str, volume: LvmVolume, offset: Optional[Size] = None): + def lvm_vol_create(self, vg_name: str, volume: LvmVolume, offset: Optional[Size] = None) -> None: if offset is not None: length = volume.length - offset else: @@ -435,7 +452,7 @@ def _setup_partition( block_device: BDevice, disk: Disk, requires_delete: bool - ): + ) -> None: # when we require a delete and the partition to be (re)created # already exists then we have to delete it first if requires_delete and part_mod.status in [ModificationStatus.Modify, ModificationStatus.Delete]: @@ -518,7 +535,7 @@ def create_lvm_btrfs_subvolumes( path: Path, btrfs_subvols: List[SubvolumeModification], mount_options: List[str] - ): + ) -> None: info(f'Creating subvolumes: {path}') self.mount(path, self._TMP_BTRFS_MOUNT, create_target_mountpoint=True) @@ -548,11 +565,9 @@ def create_btrfs_volumes( self, part_mod: PartitionModification, enc_conf: Optional['DiskEncryption'] = None - ): + ) -> None: info(f'Creating subvolumes: {part_mod.safe_dev_path}') - luks_handler = None - # unlock the partition first if it's encrypted if enc_conf is not None and part_mod in enc_conf.partitions: if not part_mod.mapper_name: @@ -567,35 +582,29 @@ def create_btrfs_volumes( if not luks_handler.mapper_dev: raise DiskError('Failed to unlock luks device') - self.mount( - luks_handler.mapper_dev, - self._TMP_BTRFS_MOUNT, - create_target_mountpoint=True, - options=part_mod.mount_options - ) + dev_path = luks_handler.mapper_dev else: - self.mount( - part_mod.safe_dev_path, - self._TMP_BTRFS_MOUNT, - create_target_mountpoint=True, - options=part_mod.mount_options - ) + luks_handler = None + dev_path = part_mod.safe_dev_path + + self.mount( + dev_path, + self._TMP_BTRFS_MOUNT, + create_target_mountpoint=True, + options=part_mod.mount_options + ) for sub_vol in part_mod.btrfs_subvols: debug(f'Creating subvolume: {sub_vol.name}') - if luks_handler is not None: - subvol_path = self._TMP_BTRFS_MOUNT / sub_vol.name - else: - subvol_path = self._TMP_BTRFS_MOUNT / sub_vol.name + subvol_path = self._TMP_BTRFS_MOUNT / sub_vol.name SysCommand(f"btrfs subvolume create {subvol_path}") + self.umount(dev_path) + if luks_handler is not None and luks_handler.mapper_dev is not None: - self.umount(luks_handler.mapper_dev) luks_handler.lock() - else: - self.umount(part_mod.safe_dev_path) def unlock_luks2_dev(self, dev_path: Path, mapper_name: str, enc_password: str) -> Luks2: luks_handler = Luks2(dev_path, mapper_name=mapper_name, password=enc_password) @@ -608,7 +617,7 @@ def unlock_luks2_dev(self, dev_path: Path, mapper_name: str, enc_password: str) return luks_handler - def umount_all_existing(self, device_path: Path): + def umount_all_existing(self, device_path: Path) -> None: debug(f'Unmounting all existing partitions: {device_path}') existing_partitions = self._devices[device_path].partition_infos @@ -626,7 +635,7 @@ def partition( self, modification: DeviceModification, partition_table: Optional[PartitionTable] = None - ): + ) -> None: """ Create a partition table on the block device and create all partitions. """ @@ -666,7 +675,7 @@ def mount( mount_fs: Optional[str] = None, create_target_mountpoint: bool = True, options: List[str] = [] - ): + ) -> None: if create_target_mountpoint and not target_mountpoint.exists(): target_mountpoint.mkdir(parents=True, exist_ok=True) @@ -696,7 +705,7 @@ def mount( except SysCallError as err: raise DiskError(f'Could not mount {dev_path}: {command}\n{err.message}') - def umount(self, mountpoint: Path, recursive: bool = False): + def umount(self, mountpoint: Path, recursive: bool = False) -> None: lsblk_info = get_lsblk_info(mountpoint) if not lsblk_info.mountpoints: @@ -739,7 +748,7 @@ def detect_pre_mounted_mods(self, base_mountpoint: Path) -> List[DeviceModificat return device_mods - def partprobe(self, path: Optional[Path] = None): + def partprobe(self, path: Optional[Path] = None) -> None: if path is not None: command = f'partprobe {path}' else: @@ -754,7 +763,7 @@ def partprobe(self, path: Optional[Path] = None): else: error(f'"{command}" failed to run (continuing anyway): {err}') - def _wipe(self, dev_path: Path): + def _wipe(self, dev_path: Path) -> None: """ Wipe a device (partition or otherwise) of meta-data, be it file system, LVM, etc. @param dev_path: Device path of the partition to be wiped. @@ -763,7 +772,7 @@ def _wipe(self, dev_path: Path): with open(dev_path, 'wb') as p: p.write(bytearray(1024)) - def wipe_dev(self, block_device: BDevice): + def wipe_dev(self, block_device: BDevice) -> None: """ Wipe the block device of meta-data, be it file system, LVM, etc. This is not intended to be secure, but rather to ensure that diff --git a/archinstall/lib/disk/device_model.py b/archinstall/lib/disk/device_model.py index 224a9833f4..9992c86790 100644 --- a/archinstall/lib/disk/device_model.py +++ b/archinstall/lib/disk/device_model.py @@ -11,7 +11,7 @@ from typing import Optional, List, Dict, TYPE_CHECKING, Any from typing import Union -import parted # type: ignore +import parted import _ped # type: ignore from parted import Disk, Geometry, Partition @@ -178,7 +178,7 @@ class SectorSize: value: int unit: Unit - def __post_init__(self): + def __post_init__(self) -> None: match self.unit: case Unit.sectors: raise ValueError('Unit type sector not allowed for SectorSize') @@ -204,7 +204,7 @@ def normalize(self) -> int: """ will normalize the value of the unit to Byte """ - return int(self.value * self.unit.value) # type: ignore + return int(self.value * self.unit.value) @dataclass @@ -213,7 +213,7 @@ class Size: unit: Unit sector_size: SectorSize - def __post_init__(self): + def __post_init__(self) -> None: if not isinstance(self.sector_size, SectorSize): raise ValueError('sector size must be of type SectorSize') @@ -253,7 +253,7 @@ def convert( sectors = math.ceil(norm / sector_size.value) return Size(sectors, Unit.sectors, sector_size) else: - value = int(self._normalize() / target_unit.value) # type: ignore + value = int(self._normalize() / target_unit.value) return Size(value, target_unit, self.sector_size) def as_text(self) -> str: @@ -293,7 +293,7 @@ def _normalize(self) -> int: """ if self.unit == Unit.sectors and self.sector_size is not None: return self.value * self.sector_size.normalize() - return int(self.value * self.unit.value) # type: ignore + return int(self.value * self.unit.value) def __sub__(self, other: Size) -> Size: src_norm = self._normalize() @@ -305,22 +305,22 @@ def __add__(self, other: Size) -> Size: dest_norm = other._normalize() return Size(abs(src_norm + dest_norm), Unit.B, self.sector_size) - def __lt__(self, other): + def __lt__(self, other: Size) -> bool: return self._normalize() < other._normalize() - def __le__(self, other): + def __le__(self, other: Size) -> bool: return self._normalize() <= other._normalize() - def __eq__(self, other): + def __eq__(self, other) -> bool: return self._normalize() == other._normalize() - def __ne__(self, other): + def __ne__(self, other) -> bool: return self._normalize() != other._normalize() - def __gt__(self, other): + def __gt__(self, other: Size) -> bool: return self._normalize() > other._normalize() - def __ge__(self, other): + def __ge__(self, other: Size) -> bool: return self._normalize() >= other._normalize() @@ -556,7 +556,7 @@ class BDevice: device_info: _DeviceInfo partition_infos: List[_PartitionInfo] - def __hash__(self): + def __hash__(self) -> int: return hash(self.disk.device.path) @@ -623,7 +623,7 @@ def fs_type_mount(self) -> str: match self: case FilesystemType.Ntfs: return 'ntfs3' case FilesystemType.Fat32: return 'vfat' - case _: return self.value # type: ignore + case _: return self.value @property def installation_pkg(self) -> Optional[str]: @@ -680,7 +680,7 @@ class PartitionModification: _efi_indicator_flags = (PartitionFlag.Boot, PartitionFlag.ESP) _boot_indicator_flags = (PartitionFlag.Boot, PartitionFlag.XBOOTLDR) - def __post_init__(self): + def __post_init__(self) -> None: # needed to use the object as a dictionary key due to hash func if not hasattr(self, '_obj_id'): self._obj_id = uuid.uuid4() @@ -691,7 +691,7 @@ def __post_init__(self): if self.fs_type is None and self.status == ModificationStatus.Modify: raise ValueError('FS type must not be empty on modifications with status type modify') - def __hash__(self): + def __hash__(self) -> int: return hash(self._obj_id) @property @@ -796,11 +796,11 @@ def mapper_name(self) -> Optional[str]: return f'{storage.get("ENC_IDENTIFIER", "ai")}{self.dev_path.name}' return None - def set_flag(self, flag: PartitionFlag): + def set_flag(self, flag: PartitionFlag) -> None: if flag not in self.flags: self.flags.append(flag) - def invert_flag(self, flag: PartitionFlag): + def invert_flag(self, flag: PartitionFlag) -> None: if flag in self.flags: self.flags = [f for f in self.flags if f != flag] else: @@ -915,12 +915,12 @@ class LvmVolume: # mapper device path /dev// dev_path: Optional[Path] = None - def __post_init__(self): + def __post_init__(self) -> None: # needed to use the object as a dictionary key due to hash func if not hasattr(self, '_obj_id'): self._obj_id = uuid.uuid4() - def __hash__(self): + def __hash__(self) -> int: return hash(self._obj_id) @property @@ -1050,7 +1050,7 @@ class LvmConfiguration: config_type: LvmLayoutType vol_groups: List[LvmVolumeGroup] - def __post_init__(self): + def __post_init__(self) -> None: # make sure all volume groups have unique PVs pvs = [] for group in self.vol_groups: @@ -1121,7 +1121,7 @@ class DeviceModification: def device_path(self) -> Path: return self.device.device_info.path - def add_partition(self, partition: PartitionModification): + def add_partition(self, partition: PartitionModification) -> None: self.partitions.append(partition) def get_efi_partition(self) -> Optional[PartitionModification]: @@ -1196,7 +1196,7 @@ class DiskEncryption: lvm_volumes: List[LvmVolume] = field(default_factory=list) hsm_device: Optional[Fido2Device] = None - def __post_init__(self): + def __post_init__(self) -> None: if self.encryption_type in [EncryptionType.Luks, EncryptionType.LvmOnLuks] and not self.partitions: raise ValueError('Luks or LvmOnLuks encryption require partitions to be defined') @@ -1478,6 +1478,20 @@ def get_all_lsblk_info() -> List[LsblkInfo]: return _fetch_lsblk_info() +def find_lsblk_info( + dev_path: Union[Path, str], + info: List[LsblkInfo] +) -> Optional[LsblkInfo]: + if isinstance(dev_path, str): + dev_path = Path(dev_path) + + for lsblk_info in info: + if lsblk_info.path == dev_path: + return lsblk_info + + return None + + def get_lsblk_by_mountpoint(mountpoint: Path, as_prefix: bool = False) -> List[LsblkInfo]: def _check(infos: List[LsblkInfo]) -> List[LsblkInfo]: devices = [] diff --git a/archinstall/lib/disk/fido.py b/archinstall/lib/disk/fido.py index 5a1395347f..ccfe29c923 100644 --- a/archinstall/lib/disk/fido.py +++ b/archinstall/lib/disk/fido.py @@ -74,7 +74,7 @@ def fido2_enroll( hsm_device: Fido2Device, dev_path: Path, password: str - ): + ) -> None: worker = SysCommandWorker(f"systemd-cryptenroll --fido2-device={hsm_device.path} {dev_path}", peek_output=True) pw_inputted = False pin_inputted = False @@ -85,7 +85,7 @@ def fido2_enroll( worker.write(bytes(password, 'UTF-8')) pw_inputted = True elif pin_inputted is False: - if bytes(f"please enter security token pin", 'UTF-8') in worker._trace_log.lower(): + if bytes("please enter security token pin", 'UTF-8') in worker._trace_log.lower(): worker.write(bytes(getpass.getpass(" "), 'UTF-8')) pin_inputted = True diff --git a/archinstall/lib/disk/filesystem.py b/archinstall/lib/disk/filesystem.py index ddf2950d92..57f487d85c 100644 --- a/archinstall/lib/disk/filesystem.py +++ b/archinstall/lib/disk/filesystem.py @@ -34,7 +34,7 @@ def __init__( self._disk_config = disk_config self._enc_config = enc_conf - def perform_filesystem_operations(self, show_countdown: bool = True): + def perform_filesystem_operations(self, show_countdown: bool = True) -> None: if self._disk_config.config_type == DiskLayoutType.Pre_mount: debug('Disk layout configuration is set to pre-mount, not performing any operations') return @@ -88,7 +88,7 @@ def _format_partitions( self, partitions: List[PartitionModification], device_path: Path - ): + ) -> None: """ Format can be given an overriding path, for instance /dev/null to test the formatting functionality and in essence the support for the given filesystem. @@ -120,7 +120,7 @@ def _format_partitions( part_mod.partuuid = lsblk_info.partuuid part_mod.uuid = lsblk_info.uuid - def _validate_partitions(self, partitions: List[PartitionModification]): + def _validate_partitions(self, partitions: List[PartitionModification]) -> None: checks = { # verify that all partitions have a path set (which implies that they have been created) lambda x: x.dev_path is None: ValueError('When formatting, all partitions must have a path set'), @@ -136,7 +136,7 @@ def _validate_partitions(self, partitions: List[PartitionModification]): if found is not None: raise exc - def perform_lvm_operations(self): + def perform_lvm_operations(self) -> None: info('Setting up LVM config...') if not self._disk_config.lvm_config: @@ -151,7 +151,7 @@ def perform_lvm_operations(self): self._setup_lvm(self._disk_config.lvm_config) self._format_lvm_vols(self._disk_config.lvm_config) - def _setup_lvm_encrypted(self, lvm_config: LvmConfiguration, enc_config: DiskEncryption): + def _setup_lvm_encrypted(self, lvm_config: LvmConfiguration, enc_config: DiskEncryption) -> None: if enc_config.encryption_type == EncryptionType.LvmOnLuks: enc_mods = self._encrypt_partitions(enc_config, lock_after_create=False) @@ -173,7 +173,7 @@ def _setup_lvm_encrypted(self, lvm_config: LvmConfiguration, enc_config: DiskEnc self._safely_close_lvm(lvm_config) - def _safely_close_lvm(self, lvm_config: LvmConfiguration): + def _safely_close_lvm(self, lvm_config: LvmConfiguration) -> None: for vg in lvm_config.vol_groups: for vol in vg.volumes: device_handler.lvm_vol_change(vol, False) @@ -184,7 +184,7 @@ def _setup_lvm( self, lvm_config: LvmConfiguration, enc_mods: Dict[PartitionModification, Luks2] = {} - ): + ) -> None: self._lvm_create_pvs(lvm_config, enc_mods) for vg in lvm_config.vol_groups: @@ -231,7 +231,7 @@ def _format_lvm_vols( self, lvm_config: LvmConfiguration, enc_vols: Dict[LvmVolume, Luks2] = {} - ): + ) -> None: for vol in lvm_config.get_all_volumes(): if enc_vol := enc_vols.get(vol, None): if not enc_vol.mapper_dev: @@ -251,7 +251,7 @@ def _lvm_create_pvs( self, lvm_config: LvmConfiguration, enc_mods: Dict[PartitionModification, Luks2] = {} - ): + ) -> None: pv_paths: Set[Path] = set() for vg in lvm_config.vol_groups: @@ -326,7 +326,7 @@ def _encrypt_partitions( return enc_mods - def _lvm_vol_handle_e2scrub(self, vol_gp: LvmVolumeGroup): + def _lvm_vol_handle_e2scrub(self, vol_gp: LvmVolumeGroup) -> None: # from arch wiki: # If a logical volume will be formatted with ext4, leave at least 256 MiB # free space in the volume group to allow using e2scrub diff --git a/archinstall/lib/exceptions.py b/archinstall/lib/exceptions.py index 80926e0b20..f11308deca 100644 --- a/archinstall/lib/exceptions.py +++ b/archinstall/lib/exceptions.py @@ -17,7 +17,7 @@ class UnknownFilesystemFormat(Exception): class SysCallError(Exception): - def __init__(self, message :str, exit_code :Optional[int] = None, worker :Optional['SysCommandWorker'] = None) -> None: + def __init__(self, message: str, exit_code: Optional[int] = None, worker: Optional['SysCommandWorker'] = None) -> None: super(SysCallError, self).__init__(message) self.message = message self.exit_code = exit_code @@ -38,3 +38,9 @@ class PackageError(Exception): class Deprecated(Exception): pass + + +class DownloadTimeout(Exception): + ''' + Download timeout exception raised by DownloadTimer. + ''' diff --git a/archinstall/lib/general.py b/archinstall/lib/general.py index b9e3c17cca..9ef6926cdb 100644 --- a/archinstall/lib/general.py +++ b/archinstall/lib/general.py @@ -29,18 +29,18 @@ from .installer import Installer -def generate_password(length :int = 64) -> str: - haystack = string.printable # digits, ascii_letters, punctuation (!"#$[] etc) and whitespace +def generate_password(length: int = 64) -> str: + haystack = string.printable # digits, ascii_letters, punctuation (!"#$[] etc) and whitespace return ''.join(secrets.choice(haystack) for i in range(length)) -def locate_binary(name :str) -> str: +def locate_binary(name: str) -> str: if path := which(name): return path raise RequirementError(f"Binary {name} does not exist.") -def clear_vt100_escape_codes(data :Union[bytes, str]) -> Union[bytes, str]: +def clear_vt100_escape_codes(data: Union[bytes, str]) -> Union[bytes, str]: # https://stackoverflow.com/a/43627833/929999 vt100_escape_regex = r'\x1B\[[?0-9;]*[a-zA-Z]' if isinstance(data, bytes): @@ -80,6 +80,7 @@ def jsonify(obj: Any, safe: bool = True) -> Any: return obj + class JSON(json.JSONEncoder, json.JSONDecoder): """ A safe JSON encoder that will omit private information in dicts (starting with !) @@ -101,13 +102,13 @@ def encode(self, obj: Any) -> str: class SysCommandWorker: def __init__( self, - cmd :Union[str, List[str]], - callbacks :Optional[Dict[str, Any]] = None, - peek_output :Optional[bool] = False, - environment_vars :Optional[Dict[str, Any]] = None, - logfile :Optional[None] = None, - working_directory :Optional[str] = './', - remove_vt100_escape_codes_from_lines :bool = True + cmd: Union[str, List[str]], + callbacks: Optional[Dict[str, Any]] = None, + peek_output: Optional[bool] = False, + environment_vars: Optional[Dict[str, Any]] = None, + logfile: Optional[None] = None, + working_directory: Optional[str] = './', + remove_vt100_escape_codes_from_lines: bool = True ): callbacks = callbacks or {} environment_vars = environment_vars or {} @@ -116,25 +117,25 @@ def __init__( cmd = shlex.split(cmd) if cmd: - if cmd[0][0] != '/' and cmd[0][:2] != './': # pathlib.Path does not work well + if cmd[0][0] != '/' and cmd[0][:2] != './': # pathlib.Path does not work well cmd[0] = locate_binary(cmd[0]) self.cmd = cmd self.callbacks = callbacks self.peek_output = peek_output # define the standard locale for command outputs. For now the C ascii one. Can be overridden - self.environment_vars = {**storage.get('CMD_LOCALE',{}),**environment_vars} + self.environment_vars = {**storage.get('CMD_LOCALE', {}), **environment_vars} self.logfile = logfile self.working_directory = working_directory - self.exit_code :Optional[int] = None + self.exit_code: Optional[int] = None self._trace_log = b'' self._trace_log_pos = 0 self.poll_object = epoll() - self.child_fd :Optional[int] = None - self.started :Optional[float] = None - self.ended :Optional[float] = None - self.remove_vt100_escape_codes_from_lines :bool = remove_vt100_escape_codes_from_lines + self.child_fd: Optional[int] = None + self.started: Optional[float] = None + self.ended: Optional[float] = None + self.remove_vt100_escape_codes_from_lines: bool = remove_vt100_escape_codes_from_lines def __contains__(self, key: bytes) -> bool: """ @@ -150,7 +151,7 @@ def __contains__(self, key: bytes) -> bool: return False - def __iter__(self, *args :str, **kwargs :Dict[str, Any]) -> Iterator[bytes]: + def __iter__(self, *args: str, **kwargs: Dict[str, Any]) -> Iterator[bytes]: last_line = self._trace_log.rfind(b'\n') lines = filter(None, self._trace_log[self._trace_log_pos:last_line].splitlines()) for line in lines: @@ -174,7 +175,7 @@ def __str__(self) -> str: def __enter__(self) -> 'SysCommandWorker': return self - def __exit__(self, *args :str) -> None: + def __exit__(self, *args: str) -> None: # b''.join(sys_command('sync')) # No need to, since the underlying fs() object will call sync. # TODO: https://stackoverflow.com/questions/28157929/how-to-safely-handle-an-exception-inside-a-context-manager @@ -208,7 +209,7 @@ def is_alive(self) -> bool: return False - def write(self, data: bytes, line_ending :bool = True) -> int: + def write(self, data: bytes, line_ending: bool = True) -> int: assert isinstance(data, bytes) # TODO: Maybe we can support str as well and encode it self.make_sure_we_are_executing() @@ -228,7 +229,7 @@ def tell(self) -> int: self.make_sure_we_are_executing() return self._trace_log_pos - def seek(self, pos :int) -> None: + def seek(self, pos: int) -> None: self.make_sure_we_are_executing() # Safety check to ensure 0 < pos < len(tracelog) self._trace_log_pos = min(max(0, pos), len(self._trace_log)) @@ -320,10 +321,10 @@ def execute(self) -> bool: error(f"Unexpected {exception_type} occurred in {self.cmd}: {e}") raise e - os.execve(self.cmd[0], list(self.cmd), {**os.environ, **self.environment_vars}) - if storage['arguments'].get('debug'): + if storage.get('arguments', {}).get('debug'): debug(f"Executing: {self.cmd}") + os.execve(self.cmd[0], list(self.cmd), {**os.environ, **self.environment_vars}) except FileNotFoundError: error(f"{self.cmd[0]} does not exist.") self.exit_code = 1 @@ -337,19 +338,19 @@ def execute(self) -> bool: return True - def decode(self, encoding :str = 'UTF-8') -> str: + def decode(self, encoding: str = 'UTF-8') -> str: return self._trace_log.decode(encoding) class SysCommand: def __init__(self, - cmd :Union[str, List[str]], - callbacks :Dict[str, Callable[[Any], Any]] = {}, - start_callback :Optional[Callable[[Any], Any]] = None, - peek_output :Optional[bool] = False, - environment_vars :Optional[Dict[str, Any]] = None, - working_directory :Optional[str] = './', - remove_vt100_escape_codes_from_lines :bool = True): + cmd: Union[str, List[str]], + callbacks: Dict[str, Callable[[Any], Any]] = {}, + start_callback: Optional[Callable[[Any], Any]] = None, + peek_output: Optional[bool] = False, + environment_vars: Optional[Dict[str, Any]] = None, + working_directory: Optional[str] = './', + remove_vt100_escape_codes_from_lines: bool = True): self._callbacks = callbacks.copy() if start_callback: @@ -361,27 +362,27 @@ def __init__(self, self.working_directory = working_directory self.remove_vt100_escape_codes_from_lines = remove_vt100_escape_codes_from_lines - self.session :Optional[SysCommandWorker] = None + self.session: Optional[SysCommandWorker] = None self.create_session() def __enter__(self) -> Optional[SysCommandWorker]: return self.session - def __exit__(self, *args :str, **kwargs :Dict[str, Any]) -> None: + def __exit__(self, *args: str, **kwargs: Dict[str, Any]) -> None: # b''.join(sys_command('sync')) # No need to, since the underlying fs() object will call sync. # TODO: https://stackoverflow.com/questions/28157929/how-to-safely-handle-an-exception-inside-a-context-manager if len(args) >= 2 and args[1]: error(args[1]) - def __iter__(self, *args :List[Any], **kwargs :Dict[str, Any]) -> Iterator[bytes]: + def __iter__(self, *args: List[Any], **kwargs: Dict[str, Any]) -> Iterator[bytes]: if self.session: for line in self.session: yield line - def __getitem__(self, key :slice) -> Optional[bytes]: + def __getitem__(self, key: slice) -> Optional[bytes]: if not self.session: - raise KeyError(f"SysCommand() does not have an active session.") + raise KeyError("SysCommand() does not have an active session.") elif type(key) is slice: start = key.start or 0 end = key.stop or len(self.session._trace_log) @@ -390,7 +391,7 @@ def __getitem__(self, key :slice) -> Optional[bytes]: else: raise ValueError("SysCommand() doesn't have key & value pairs, only slices, SysCommand('ls')[:10] as an example.") - def __repr__(self, *args :List[Any], **kwargs :Dict[str, Any]) -> str: + def __repr__(self, *args: List[Any], **kwargs: Dict[str, Any]) -> str: return self.decode('UTF-8', errors='backslashreplace') or '' def __json__(self) -> Dict[str, Union[str, bool, List[str], Dict[str, Any], Optional[bool], Optional[Dict[str, Any]]]]: @@ -430,7 +431,7 @@ def create_session(self) -> bool: return True - def decode(self, encoding: str = 'utf-8', errors='backslashreplace', strip: bool = True) -> str: + def decode(self, encoding: str = 'utf-8', errors: str = 'backslashreplace', strip: bool = True) -> str: if not self.session: raise ValueError('No session available to decode') @@ -467,7 +468,7 @@ def _pid_exists(pid: int) -> bool: return False -def run_custom_user_commands(commands :List[str], installation :Installer) -> None: +def run_custom_user_commands(commands: List[str], installation: Installer) -> None: for index, command in enumerate(commands): script_path = f"/var/tmp/user-command.{index}.sh" chroot_path = f"{installation.target}/{script_path}" @@ -481,7 +482,7 @@ def run_custom_user_commands(commands :List[str], installation :Installer) -> No os.unlink(chroot_path) -def json_stream_to_structure(configuration_identifier : str, stream :str, target :dict) -> bool : +def json_stream_to_structure(configuration_identifier: str, stream: str, target: dict) -> bool: """ Load a JSON encoded dictionary from a stream and merge it into an existing dictionary. A stream can be a filepath, a URL or a raw JSON string. @@ -520,6 +521,6 @@ def json_stream_to_structure(configuration_identifier : str, stream :str, target return True -def secret(x :str) -> str: +def secret(x: str) -> str: """ return * with len equal to to the input string """ return '*' * len(x) diff --git a/archinstall/lib/hardware.py b/archinstall/lib/hardware.py index c8001c19f0..963083ab81 100644 --- a/archinstall/lib/hardware.py +++ b/archinstall/lib/hardware.py @@ -140,8 +140,9 @@ def gfx_packages(self) -> List[GfxPackage]: return packages + class _SysInfo: - def __init__(self): + def __init__(self) -> None: pass @cached_property @@ -241,12 +242,12 @@ def cpu_model() -> Optional[str]: @staticmethod def sys_vendor() -> str: - with open(f"/sys/devices/virtual/dmi/id/sys_vendor") as vendor: + with open("/sys/devices/virtual/dmi/id/sys_vendor") as vendor: return vendor.read().strip() @staticmethod def product_name() -> str: - with open(f"/sys/devices/virtual/dmi/id/product_name") as product: + with open("/sys/devices/virtual/dmi/id/product_name") as product: return product.read().strip() @staticmethod diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 74a3340a71..ccd59de043 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -97,7 +97,7 @@ def __init__( def __enter__(self) -> 'Installer': return self - def __exit__(self, exc_type, exc_val, exc_tb): + def __exit__(self, exc_type, exc_val, exc_tb) -> bool: if exc_type is not None: error(exc_val) @@ -126,15 +126,15 @@ def __exit__(self, exc_type, exc_val, exc_tb): self.sync_log_to_install_medium() return False - def remove_mod(self, mod: str): + def remove_mod(self, mod: str) -> None: if mod in self._modules: self._modules.remove(mod) - def append_mod(self, mod: str): + def append_mod(self, mod: str) -> None: if mod not in self._modules: self._modules.append(mod) - def _verify_service_stop(self): + def _verify_service_stop(self) -> None: """ Certain services might be running that affects the system during installation. One such service is "reflector.service" which updates /etc/pacman.d/mirrorlist @@ -177,7 +177,7 @@ def _verify_service_stop(self): while self._service_state('archlinux-keyring-wkd-sync.service') not in ('dead', 'failed', 'exited'): time.sleep(1) - def _verify_boot_part(self): + def _verify_boot_part(self) -> None: """ Check that mounted /boot device has at minimum size for installation The reason this check is here is to catch pre-mounted device configuration and potentially @@ -221,7 +221,7 @@ def mount_ordered_layout(self) -> None: # mount all regular partitions self._mount_partition_layout(luks_handlers) - def _mount_partition_layout(self, luks_handlers: Dict[Any, Luks2]): + def _mount_partition_layout(self, luks_handlers: Dict[Any, Luks2]) -> None: debug('Mounting partition layout') # do not mount any PVs part of the LVM configuration @@ -229,7 +229,16 @@ def _mount_partition_layout(self, luks_handlers: Dict[Any, Luks2]): if self._disk_config.lvm_config: pvs = self._disk_config.lvm_config.get_all_pvs() + sorted_device_mods = self._disk_config.device_modifications.copy() + + # move the device with the root partition to the beginning of the list for mod in self._disk_config.device_modifications: + if any(partition.is_root() for partition in mod.partitions): + sorted_device_mods.remove(mod) + sorted_device_mods.insert(0, mod) + break + + for mod in sorted_device_mods: not_pv_part_mods = list(filter(lambda x: x not in pvs, mod.partitions)) # partitions have to mounted in the right order on btrfs the mountpoint will @@ -243,7 +252,7 @@ def _mount_partition_layout(self, luks_handlers: Dict[Any, Luks2]): else: self._mount_partition(part_mod) - def _mount_lvm_layout(self, luks_handlers: Dict[Any, Luks2] = {}): + def _mount_lvm_layout(self, luks_handlers: Dict[Any, Luks2] = {}) -> None: lvm_config = self._disk_config.lvm_config if not lvm_config: @@ -275,7 +284,7 @@ def _prepare_luks_partitions( if part_mod.mapper_name and part_mod.dev_path } - def _import_lvm(self): + def _import_lvm(self) -> None: lvm_config = self._disk_config.lvm_config if not lvm_config: @@ -302,7 +311,7 @@ def _prepare_luks_lvm( if vol.mapper_name and vol.dev_path } - def _mount_partition(self, part_mod: disk.PartitionModification): + def _mount_partition(self, part_mod: disk.PartitionModification) -> None: # it would be none if it's btrfs as the subvolumes will have the mountpoints defined if part_mod.mountpoint and part_mod.dev_path: target = self.target / part_mod.relative_mountpoint @@ -315,7 +324,7 @@ def _mount_partition(self, part_mod: disk.PartitionModification): part_mod.mount_options ) - def _mount_lvm_vol(self, volume: disk.LvmVolume): + def _mount_lvm_vol(self, volume: disk.LvmVolume) -> None: if volume.fs_type != disk.FilesystemType.Btrfs: if volume.mountpoint and volume.dev_path: target = self.target / volume.relative_mountpoint @@ -324,7 +333,7 @@ def _mount_lvm_vol(self, volume: disk.LvmVolume): if volume.fs_type == disk.FilesystemType.Btrfs and volume.dev_path: self._mount_btrfs_subvol(volume.dev_path, volume.btrfs_subvols, volume.mount_options) - def _mount_luks_partition(self, part_mod: disk.PartitionModification, luks_handler: Luks2): + def _mount_luks_partition(self, part_mod: disk.PartitionModification, luks_handler: Luks2) -> None: if part_mod.fs_type != disk.FilesystemType.Btrfs: if part_mod.mountpoint and luks_handler.mapper_dev: target = self.target / part_mod.relative_mountpoint @@ -333,7 +342,7 @@ def _mount_luks_partition(self, part_mod: disk.PartitionModification, luks_handl if part_mod.fs_type == disk.FilesystemType.Btrfs and luks_handler.mapper_dev: self._mount_btrfs_subvol(luks_handler.mapper_dev, part_mod.btrfs_subvols, part_mod.mount_options) - def _mount_luks_volume(self, volume: disk.LvmVolume, luks_handler: Luks2): + def _mount_luks_volume(self, volume: disk.LvmVolume, luks_handler: Luks2) -> None: if volume.fs_type != disk.FilesystemType.Btrfs: if volume.mountpoint and luks_handler.mapper_dev: target = self.target / volume.relative_mountpoint @@ -347,7 +356,7 @@ def _mount_btrfs_subvol( dev_path: Path, subvolumes: List[disk.SubvolumeModification], mount_options: List[str] = [] - ): + ) -> None: for subvol in subvolumes: mountpoint = self.target / subvol.relative_mountpoint mount_options = mount_options + [f'subvol={subvol.name}'] @@ -365,7 +374,7 @@ def generate_key_files(self) -> None: # so we won't need any keyfile generation atm pass - def _generate_key_files_partitions(self): + def _generate_key_files_partitions(self) -> None: for part_mod in self._disk_encryption.partitions: gen_enc_file = self._disk_encryption.should_generate_encryption_file(part_mod) @@ -387,7 +396,7 @@ def _generate_key_files_partitions(self): self._disk_encryption.encryption_password ) - def _generate_key_file_lvm_volumes(self): + def _generate_key_file_lvm_volumes(self) -> None: for vol in self._disk_encryption.lvm_volumes: gen_enc_file = self._disk_encryption.should_generate_encryption_file(vol) @@ -423,7 +432,7 @@ def sync_log_to_install_medium(self) -> bool: return True - def add_swapfile(self, size='4G', enable_resume=True, file='/swapfile'): + def add_swapfile(self, size: str = '4G', enable_resume: bool = True, file: str = '/swapfile') -> None: if file[:1] != '/': file = f"/{file}" if len(file.strip()) <= 0 or file == '/': @@ -448,7 +457,7 @@ def add_swapfile(self, size='4G', enable_resume=True, file='/swapfile'): 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 set_mirrors(self, mirror_config: MirrorConfiguration, on_target: bool = False): + def set_mirrors(self, mirror_config: MirrorConfiguration, on_target: bool = False) -> None: """ Set the mirror configuration for the installation. @@ -484,10 +493,10 @@ def set_mirrors(self, mirror_config: MirrorConfiguration, on_target: bool = Fals if mirrorlist_config: debug(f'Mirrorlist: {mirrorlist_config}') - with local_mirrorlist_conf.open('a') as fp: + with local_mirrorlist_conf.open('w') as fp: fp.write(mirrorlist_config) - def genfstab(self, flags: str = '-pU'): + def genfstab(self, flags: str = '-pU') -> None: fstab_path = self.target / "etc" / "fstab" info(f"Updating {fstab_path}") @@ -501,7 +510,7 @@ def genfstab(self, flags: str = '-pU'): fp.write(gen_fstab) if not fstab_path.is_file(): - raise RequirementError(f'Could not create fstab file') + raise RequirementError('Could not create fstab file') for plugin in plugins.values(): if hasattr(plugin, 'on_genfstab'): @@ -512,7 +521,7 @@ def genfstab(self, flags: str = '-pU'): for entry in self._fstab_entries: fp.write(f'{entry}\n') - def set_hostname(self, hostname: str): + def set_hostname(self, hostname: str) -> None: with open(f'{self.target}/etc/hostname', 'w') as fh: fh.write(hostname + '\n') @@ -625,7 +634,7 @@ def arch_chroot(self, cmd: str, run_as: Optional[str] = None) -> SysCommand: def drop_to_shell(self) -> None: subprocess.check_call(f"/usr/bin/arch-chroot {self.target}", shell=True) - def configure_nic(self, nic: Nic): + def configure_nic(self, nic: Nic) -> None: conf = nic.as_systemd_config() for plugin in plugins.values(): @@ -656,7 +665,7 @@ def copy_iso_network_config(self, enable_services: bool = False) -> bool: # This function will be called after minimal_installation() # as a hook for post-installs. This hook is only needed if # base is not installed yet. - def post_install_enable_iwd_service(*args: str, **kwargs: str): + def post_install_enable_iwd_service(*args: str, **kwargs: str) -> None: self.enable_service('iwd') self.post_base_install.append(post_install_enable_iwd_service) @@ -698,10 +707,11 @@ def mkinitcpio(self, flags: List[str]) -> bool: if plugin.on_mkinitcpio(self): return True - with open(f'{self.target}/etc/mkinitcpio.conf', 'w') as mkinit: - mkinit.write(f"MODULES=({' '.join(self._modules)})\n") - mkinit.write(f"BINARIES=({' '.join(self._binaries)})\n") - mkinit.write(f"FILES=({' '.join(self._files)})\n") + with open(f'{self.target}/etc/mkinitcpio.conf', 'r+') as mkinit: + content = mkinit.read() + content = re.sub("\nMODULES=(.*)", f"\nMODULES=({' '.join(self._modules)})", content) + content = re.sub("\nBINARIES=(.*)", f"\nBINARIES=({' '.join(self._binaries)})", content) + content = re.sub("\nFILES=(.*)", f"\nFILES=({' '.join(self._files)})", content) if not self._disk_encryption.hsm_device: # For now, if we don't use HSM we revert to the old @@ -711,7 +721,9 @@ def mkinitcpio(self, flags: List[str]) -> bool: # * sd-vconsole -> keymap self._hooks = [hook.replace('systemd', 'udev').replace('sd-vconsole', 'keymap consolefont') for hook in self._hooks] - mkinit.write(f"HOOKS=({' '.join(self._hooks)})\n") + content = re.sub("\nHOOKS=(.*)", f"\nHOOKS=({' '.join(self._hooks)})", content) + mkinit.seek(0) + mkinit.write(content) try: SysCommand(f'/usr/bin/arch-chroot {self.target} mkinitcpio {" ".join(flags)}', peek_output=True) @@ -727,7 +739,7 @@ def _get_microcode(self) -> Optional[Path]: return vendor.get_ucode() return None - def _handle_partition_installation(self): + def _handle_partition_installation(self) -> None: pvs = [] if self._disk_config.lvm_config: pvs = self._disk_config.lvm_config.get_all_pvs() @@ -764,7 +776,7 @@ def _handle_partition_installation(self): if 'encrypt' not in self._hooks: self._hooks.insert(self._hooks.index('filesystems'), 'encrypt') - def _handle_lvm_installation(self): + def _handle_lvm_installation(self) -> None: if not self._disk_config.lvm_config: return @@ -795,10 +807,10 @@ def _handle_lvm_installation(self): self.pacman.strap('libfido2') if 'sd-encrypt' not in self._hooks: - self._hooks.insert(self._hooks.index('lvm2') - 1, 'sd-encrypt') + self._hooks.insert(self._hooks.index('lvm2'), 'sd-encrypt') else: if 'encrypt' not in self._hooks: - self._hooks.insert(self._hooks.index('lvm2') - 1, 'encrypt') + self._hooks.insert(self._hooks.index('lvm2'), 'encrypt') def minimal_installation( self, @@ -879,9 +891,9 @@ def minimal_installation( if hasattr(plugin, 'on_install'): plugin.on_install(self) - def setup_swap(self, kind: str = 'zram'): + def setup_swap(self, kind: str = 'zram') -> None: if kind == 'zram': - info(f"Setting up swap on zram") + info("Setting up swap on zram") self.pacman.strap('zram-generator') # We could use the default example below, but maybe not the best idea: https://github.com/archlinux/archinstall/pull/678#issuecomment-962124813 @@ -894,7 +906,7 @@ def setup_swap(self, kind: str = 'zram'): self._zram_enabled = True else: - raise ValueError(f"Archinstall currently only supports setting up swap on zram") + raise ValueError("Archinstall currently only supports setting up swap on zram") def _get_efi_partition(self) -> Optional[disk.PartitionModification]: for layout in self._disk_config.device_modifications: @@ -1041,7 +1053,7 @@ def _add_systemd_bootloader( root: disk.PartitionModification | disk.LvmVolume, efi_partition: Optional[disk.PartitionModification], uki_enabled: bool = False - ): + ) -> None: debug('Installing systemd bootloader') self.pacman.strap('efibootmgr') @@ -1139,7 +1151,7 @@ def _add_grub_bootloader( boot_partition: disk.PartitionModification, root: disk.PartitionModification | disk.LvmVolume, efi_partition: Optional[disk.PartitionModification] - ): + ) -> None: debug('Installing grub bootloader') self.pacman.strap('grub') # no need? @@ -1224,7 +1236,7 @@ def _add_limine_bootloader( boot_partition: disk.PartitionModification, efi_partition: Optional[disk.PartitionModification], root: disk.PartitionModification | disk.LvmVolume - ): + ) -> None: debug('Installing limine bootloader') self.pacman.strap('limine') @@ -1290,21 +1302,21 @@ def _add_limine_bootloader( hook_path.write_text(hook_contents) kernel_params = ' '.join(self._get_kernel_params(root)) - config_contents = 'TIMEOUT=5\n' + config_contents = 'timeout: 5\n' for kernel in self.kernels: for variant in ('', '-fallback'): entry = [ - f'PROTOCOL=linux', - f'KERNEL_PATH=boot:///vmlinuz-{kernel}', - f'MODULE_PATH=boot:///initramfs-{kernel}{variant}.img', - f'CMDLINE={kernel_params}', + 'protocol: linux', + f'kernel_path: boot():/vmlinuz-{kernel}', + f'kernel_cmdline: {kernel_params}', + f'module_path: boot():/initramfs-{kernel}{variant}.img', ] - config_contents += f'\n:Arch Linux ({kernel}{variant})\n' + config_contents += f'\n/Arch Linux ({kernel}{variant})\n' config_contents += '\n'.join([f' {it}' for it in entry]) + '\n' - config_path = self.target / 'boot' / 'limine.cfg' + config_path = self.target / 'boot' / 'limine.conf' config_path.write_text(config_contents) self.helper_flags['bootloader'] = "limine" @@ -1314,7 +1326,7 @@ def _add_efistub_bootloader( boot_partition: disk.PartitionModification, root: disk.PartitionModification | disk.LvmVolume, uki_enabled: bool = False - ): + ) -> None: debug('Installing efistub bootloader') self.pacman.strap('efibootmgr') @@ -1363,7 +1375,7 @@ def _config_uki( self, root: disk.PartitionModification | disk.LvmVolume, efi_partition: Optional[disk.PartitionModification] - ): + ) -> None: if not efi_partition or not efi_partition.mountpoint: raise ValueError(f'Could not detect ESP at mountpoint {self.target}') @@ -1453,7 +1465,7 @@ def add_bootloader(self, bootloader: Bootloader, uki_enabled: bool = False): case Bootloader.Limine: self._add_limine_bootloader(boot_partition, efi_partition, root) - def add_additional_packages(self, packages: Union[str, List[str]]) -> bool: + def add_additional_packages(self, packages: Union[str, List[str]]) -> None: return self.pacman.strap(packages) def enable_sudo(self, entity: str, group: bool = False): @@ -1486,7 +1498,7 @@ def enable_sudo(self, entity: str, group: bool = False): # Guarantees sudoer conf file recommended perms os.chmod(Path(rule_file_name), 0o440) - def create_users(self, users: Union[User, List[User]]): + def create_users(self, users: Union[User, List[User]]) -> None: if not isinstance(users, list): users = [users] @@ -1608,7 +1620,7 @@ def set_x11_keyboard_language(self, language: str) -> bool: except SysCallError as err: raise ServiceException(f"Unable to set locale '{language}' for X11: {err}") else: - info(f'X11-Keyboard language was not changed from default (no language specified)') + info('X11-Keyboard language was not changed from default (no language specified)') return True diff --git a/archinstall/lib/interactions/disk_conf.py b/archinstall/lib/interactions/disk_conf.py index 2d0583939f..7855d9cdf0 100644 --- a/archinstall/lib/interactions/disk_conf.py +++ b/archinstall/lib/interactions/disk_conf.py @@ -202,13 +202,12 @@ def select_lvm_config( def _boot_partition(sector_size: disk.SectorSize, using_gpt: bool) -> disk.PartitionModification: flags = [disk.PartitionFlag.Boot] + size = disk.Size(1, disk.Unit.GiB, sector_size) if using_gpt: start = disk.Size(1, disk.Unit.MiB, sector_size) - size = disk.Size(1, disk.Unit.GiB, sector_size) flags.append(disk.PartitionFlag.ESP) else: start = disk.Size(3, disk.Unit.MiB, sector_size) - size = disk.Size(203, disk.Unit.MiB, sector_size) # boot partition return disk.PartitionModification( diff --git a/archinstall/lib/interactions/general_conf.py b/archinstall/lib/interactions/general_conf.py index a0ebf64b3d..60549477ef 100644 --- a/archinstall/lib/interactions/general_conf.py +++ b/archinstall/lib/interactions/general_conf.py @@ -171,6 +171,11 @@ def ask_additional_packages_to_install(preset: List[str] = []) -> List[str]: def validator(value: str) -> Optional[str]: packages = value.split() if value else [] + def read_packages(p: list[str] = []) -> list[str]: + display = ' '.join(p) + input_packages = TextInput(_('Write additional packages to install (space separated, leave blank to skip): '), display).run().strip() + return input_packages.split() if input_packages else [] + if len(packages) == 0: return None diff --git a/archinstall/lib/interactions/network_menu.py b/archinstall/lib/interactions/network_menu.py index ad790c6af8..783cb9b971 100644 --- a/archinstall/lib/interactions/network_menu.py +++ b/archinstall/lib/interactions/network_menu.py @@ -1,17 +1,16 @@ from __future__ import annotations import ipaddress -from typing import Any, Optional, TYPE_CHECKING, List, Dict +from typing import Any, Optional, TYPE_CHECKING, List from ..models.network_configuration import NetworkConfiguration, NicType, Nic from ..networking import list_interfaces -from ..output import FormattedOutput, warn from ..menu import ListManager from archinstall.tui import ( MenuItemGroup, MenuItem, SelectMenu, - FrameProperties, FrameStyle, Alignment, - ResultType, EditMenu + FrameProperties, Alignment, ResultType, + EditMenu ) if TYPE_CHECKING: @@ -30,7 +29,7 @@ def __init__(self, prompt: str, preset: List[Nic]): def selected_action_display(self, nic: Nic) -> str: return nic.iface if nic.iface else '' - def handle_action(self, action: str, entry: Optional[Nic], data: List[Nic]): + def handle_action(self, action: str, entry: Optional[Nic], data: List[Nic]) -> list[Nic]: if action == self._actions[0]: # add iface = self._select_iface(data) if iface: diff --git a/archinstall/lib/locale/locale_menu.py b/archinstall/lib/locale/locale_menu.py index d01cf3030c..df8df9ff9d 100644 --- a/archinstall/lib/locale/locale_menu.py +++ b/archinstall/lib/locale/locale_menu.py @@ -182,7 +182,7 @@ def select_kb_layout(preset: Optional[str] = None) -> Optional[str]: # sort alphabetically and then by length sorted_kb_lang = sorted(kb_lang, key=lambda x: (len(x), x)) - items = [MenuItem(l, value=l) for l in sorted_kb_lang] + items = [MenuItem(lang, value=lang) for lang in sorted_kb_lang] group = MenuItemGroup(items, sort_items=False) group.set_focus_by_value(preset) diff --git a/archinstall/lib/locale/utils.py b/archinstall/lib/locale/utils.py index dbbcdf5414..14cbcc752d 100644 --- a/archinstall/lib/locale/utils.py +++ b/archinstall/lib/locale/utils.py @@ -30,14 +30,14 @@ def list_x11_keyboard_languages() -> List[str]: ).decode().splitlines() -def verify_keyboard_layout(layout :str) -> bool: +def verify_keyboard_layout(layout: str) -> bool: for language in list_keyboard_languages(): if layout.lower() == language.lower(): return True return False -def verify_x11_keyboard_layout(layout :str) -> bool: +def verify_x11_keyboard_layout(layout: str) -> bool: for language in list_x11_keyboard_languages(): if layout.lower() == language.lower(): return True @@ -57,7 +57,7 @@ def get_kb_layout() -> str: for line in lines: if "VC Keymap: " in line: vcline = line - + if vcline == "": return "" @@ -68,7 +68,7 @@ def get_kb_layout() -> str: return layout -def set_kb_layout(locale :str) -> bool: +def set_kb_layout(locale: str) -> bool: if len(locale.strip()): if not verify_keyboard_layout(locale): error(f"Invalid keyboard locale specified: {locale}") diff --git a/archinstall/lib/luks.py b/archinstall/lib/luks.py index 50e15ceec0..723271f2a5 100644 --- a/archinstall/lib/luks.py +++ b/archinstall/lib/luks.py @@ -30,14 +30,14 @@ def mapper_dev(self) -> Optional[Path]: return Path(f'/dev/mapper/{self.mapper_name}') return None - def __post_init__(self): + def __post_init__(self) -> None: if self.luks_dev_path is None: raise ValueError('Partition must have a path set') - def __enter__(self): + def __enter__(self) -> None: self.unlock(self.key_file) - def __exit__(self, *args: str, **kwargs: str): + def __exit__(self, *args: str, **kwargs: str) -> None: if self.auto_unmount: self.lock() @@ -130,7 +130,7 @@ def _get_luks_uuid(self) -> str: def is_unlocked(self) -> bool: return self.mapper_name is not None and Path(f'/dev/mapper/{self.mapper_name}').exists() - def unlock(self, key_file: Optional[Path] = None): + def unlock(self, key_file: Optional[Path] = None) -> None: """ Unlocks the luks device, an optional key file location for unlocking can be specified, otherwise a default location for the key file will be used. @@ -171,7 +171,7 @@ def unlock(self, key_file: Optional[Path] = None): if not self.mapper_dev or not self.mapper_dev.is_symlink(): raise DiskError(f'Failed to open luks2 device: {self.luks_dev_path}') - def lock(self): + def lock(self) -> None: disk.device_handler.umount(self.luks_dev_path) # Get crypt-information about the device by doing a reverse lookup starting with the partition path @@ -191,7 +191,7 @@ def lock(self): self._mapper_dev = None - def create_keyfile(self, target_path: Path, override: bool = False): + def create_keyfile(self, target_path: Path, override: bool = False) -> None: """ Routine to create keyfiles, so it can be moved elsewhere """ @@ -221,7 +221,7 @@ def create_keyfile(self, target_path: Path, override: bool = False): self._add_key(key_file) self._crypttab(crypttab_path, kf_path, options=["luks", "key-slot=1"]) - def _add_key(self, key_file: Path): + def _add_key(self, key_file: Path) -> None: debug(f'Adding additional key-file {key_file}') command = f'/usr/bin/cryptsetup -q -v luksAddKey {self.luks_dev_path} {key_file}' diff --git a/archinstall/lib/menu/abstract_menu.py b/archinstall/lib/menu/abstract_menu.py index 94515a08d7..d086adb26c 100644 --- a/archinstall/lib/menu/abstract_menu.py +++ b/archinstall/lib/menu/abstract_menu.py @@ -89,10 +89,10 @@ def __init__( def do_store(self) -> bool: return self._no_store is False - def set_enabled(self, status: bool = True): + def set_enabled(self, status: bool = True) -> None: self.enabled = status - def update_description(self, description: str): + def update_description(self, description: str) -> None: self.description = description def menu_text(self, padding: int = 0) -> str: @@ -117,7 +117,7 @@ def menu_text(self, padding: int = 0) -> str: return f'{description} {current}' - def set_current_selection(self, current: Optional[Any]): + def set_current_selection(self, current: Optional[Any]) -> None: self.current_selection = current def has_selection(self) -> bool: @@ -141,7 +141,7 @@ def is_enabled(self) -> bool: def is_mandatory(self) -> bool: return self.mandatory - def set_mandatory(self, value: bool): + def set_mandatory(self, value: bool) -> None: self.mandatory = value diff --git a/archinstall/lib/menu/menu.py b/archinstall/lib/menu/menu.py deleted file mode 100644 index 7768278033..0000000000 --- a/archinstall/lib/menu/menu.py +++ /dev/null @@ -1,330 +0,0 @@ -# from dataclasses import dataclass -# from enum import Enum, auto -# from os import system -# from typing import Dict, List, Union, Any, TYPE_CHECKING, Optional, Callable -# -# from simple_term_menu import TerminalMenu # type: ignore -# -# from ..exceptions import RequirementError -# from ..output import debug -# -# -# if TYPE_CHECKING: -# _: Any -# -# -# class Menu(TerminalMenu): -# _menu_is_active: bool = False -# -# @staticmethod -# def is_menu_active() -> bool: -# return Menu._menu_is_active -# -# @classmethod -# def back(cls) -> str: -# return str(_('← Back')) -# -# @classmethod -# def yes(cls) -> str: -# return str(_('yes')) -# -# @classmethod -# def no(cls) -> str: -# return str(_('no')) -# -# @classmethod -# def yes_no(cls) -> List[str]: -# return [cls.yes(), cls.no()] -# -# def __init__( -# self, -# title: str, -# p_options: Union[List[str], Dict[str, Any]], -# skip: bool = True, -# multi: bool = False, -# default_option: Optional[str] = None, -# sort: bool = True, -# preset_values: Optional[Union[str, List[str]]] = None, -# cursor_index: Optional[int] = None, -# preview_command: Optional[Callable[[Any], str | None]] = None, -# preview_size: float = 0.0, -# preview_title: str = 'Info', -# header: Union[List[str], str] = [], -# allow_reset: bool = False, -# allow_reset_warning_msg: Optional[str] = None, -# clear_screen: bool = True, -# show_search_hint: bool = True, -# cycle_cursor: bool = True, -# clear_menu_on_exit: bool = True, -# skip_empty_entries: bool = False, -# display_back_option: bool = False, -# extra_bottom_space: bool = False -# ): -# """ -# Creates a new menu -# -# :param title: Text that will be displayed above the menu -# :type title: str -# -# :param p_options: Options to be displayed in the menu to chose from; -# if dict is specified then the keys of such will be used as options -# :type p_options: list, dict -# -# :param skip: Indicate if the selection is not mandatory and can be skipped -# :type skip: bool -# -# :param multi: Indicate if multiple options can be selected -# :type multi: bool -# -# :param default_option: The default option to be used in case the selection processes is skipped -# :type default_option: str -# -# :param sort: Indicate if the options should be sorted alphabetically before displaying -# :type sort: bool -# -# :param preset_values: Predefined value(s) of the menu. In a multi menu, it selects the options included therein. If the selection is simple, moves the cursor to the position of the value -# :type preset_values: str or list -# -# :param cursor_index: The position where the cursor will be located. If it is not in range (number of elements of the menu) it goes to the first position -# :type cursor_index: int -# -# :param preview_command: A function that should return a string that will be displayed in a preview window when a menu selection item is in focus -# :type preview_command: Callable -# -# :param preview_size: Size of the preview window in ratio to the full window -# :type preview_size: float -# -# :param preview_title: Title of the preview window -# :type preview_title: str -# -# :param header: one or more header lines for the menu -# :type header: string or list -# -# :param allow_reset: This will explicitly handle a ctrl+c instead and return that specific state -# :type allow_reset: bool -# -# param allow_reset_warning_msg: If raise_error_on_interrupt is True the warning is set, a user confirmation is displayed -# type allow_reset_warning_msg: str -# -# :param extra_bottom_space: Add an extra empty line at the end of the menu -# :type extra_bottom_space: bool -# """ -# if isinstance(p_options, Dict): -# options = list(p_options.keys()) -# else: -# options = list(p_options) -# -# if not options: -# raise RequirementError('Menu.__init__() requires at least one option to proceed.') -# -# if any([o for o in options if not isinstance(o, str)]): -# raise RequirementError('Menu.__init__() requires the options to be of type string') -# -# if sort: -# options = sorted(options) -# -# self._menu_options = options -# self._skip = skip -# self._default_option = default_option -# self._multi = multi -# self._raise_error_on_interrupt = allow_reset -# self._raise_error_warning_msg = allow_reset_warning_msg -# -# action_info = '' -# if skip: -# action_info += str(_('ESC to skip')) -# -# if self._raise_error_on_interrupt: -# action_info += ', ' if len(action_info) > 0 else '' -# action_info += str(_('CTRL+C to reset')) -# -# if multi: -# action_info += ', ' if len(action_info) > 0 else '' -# action_info += str(_('TAB to select')) -# -# if action_info: -# action_info += '\n\n' -# -# menu_title = f'\n{action_info}{title}\n' -# -# if header: -# if not isinstance(header,(list,tuple)): -# header = [header] -# menu_title += '\n' + '\n'.join(header) -# -# if default_option: -# # if a default value was specified we move that one -# # to the top of the list and mark it as default as well -# self._menu_options = [self._default_menu_value] + [o for o in self._menu_options if default_option != o] -# -# if display_back_option and not multi and skip: -# skip_empty_entries = True -# self._menu_options += ['', self.back()] -# -# if extra_bottom_space: -# skip_empty_entries = True -# self._menu_options += [''] -# -# preset_list: Optional[List[str]] = None -# -# if preset_values and isinstance(preset_values, str): -# preset_list = [preset_values] -# -# calc_cursor_idx = self._determine_cursor_pos(preset_list, cursor_index) -# -# # when we're not in multi selection mode we don't care about -# # passing the pre-selection list to the menu as the position -# # of the cursor is the one determining the pre-selection -# if not self._multi: -# preset_values = None -# -# cursor = "> " -# main_menu_cursor_style = ("fg_cyan", "bold") -# main_menu_style = ("bg_blue", "fg_gray") -# -# super().__init__( -# menu_entries=self._menu_options, -# title=menu_title, -# menu_cursor=cursor, -# menu_cursor_style=main_menu_cursor_style, -# menu_highlight_style=main_menu_style, -# multi_select=multi, -# preselected_entries=preset_values, -# cursor_index=calc_cursor_idx, -# preview_command=lambda x: self._show_preview(preview_command, x), -# preview_size=preview_size, -# preview_title=preview_title, -# raise_error_on_interrupt=self._raise_error_on_interrupt, -# multi_select_select_on_accept=False, -# clear_screen=clear_screen, -# show_search_hint=show_search_hint, -# cycle_cursor=cycle_cursor, -# clear_menu_on_exit=clear_menu_on_exit, -# skip_empty_entries=skip_empty_entries -# ) -# -# @property -# def _default_menu_value(self) -> str: -# default_str = str(_('(default)')) -# return f'{self._default_option} {default_str}' -# -# def _show_preview( -# self, -# preview_command: Optional[Callable[[Any], str | None]], -# selection: str -# ) -> Optional[str]: -# if selection == self.back(): -# return None -# -# if preview_command: -# if self._default_option is not None and self._default_menu_value == selection: -# selection = self._default_option -# -# if res := preview_command(selection): -# return res.rstrip('\n') -# -# return None -# -# def _show(self) -> MenuSelection: -# try: -# idx = self.show() -# except KeyboardInterrupt: -# return MenuSelection(type_=MenuSelectionType.Reset) -# -# def check_default(elem): -# if self._default_option is not None and self._default_menu_value in elem: -# return self._default_option -# else: -# return elem -# -# if idx is not None: -# if isinstance(idx, (list, tuple)): # on multi selection -# results = [] -# for i in idx: -# option = check_default(self._menu_options[i]) -# results.append(option) -# return MenuSelection(type_=MenuSelectionType.Selection, value=results) -# else: # on single selection -# result = check_default(self._menu_options[idx]) -# return MenuSelection(type_=MenuSelectionType.Selection, value=result) -# else: -# return MenuSelection(type_=MenuSelectionType.Skip) -# -# def run(self) -> MenuSelection: -# Menu._menu_is_active = True -# -# selection = self._show() -# -# if selection.type_ == MenuSelectionType.Reset: -# if self._raise_error_on_interrupt and self._raise_error_warning_msg is not None: -# response = Menu(self._raise_error_warning_msg, Menu.yes_no(), skip=False).run() -# if response.value == Menu.no(): -# return self.run() -# elif selection.type_ is MenuSelectionType.Skip: -# if not self._skip: -# system('clear') -# return self.run() -# -# if selection.type_ == MenuSelectionType.Selection: -# if selection.value == self.back(): -# selection.type_ = MenuSelectionType.Skip -# selection.value = None -# -# Menu._menu_is_active = False -# -# return selection -# -# def set_cursor_pos(self,pos :int): -# if pos and 0 < pos < len(self._menu_entries): -# self._view.active_menu_index = pos -# else: -# self._view.active_menu_index = 0 # we define a default -# -# def set_cursor_pos_entry(self,value :str): -# pos = self._menu_entries.index(value) -# self.set_cursor_pos(pos) -# -# def _determine_cursor_pos( -# self, -# preset: Optional[List[str]] = None, -# cursor_index: Optional[int] = None -# ) -> Optional[int]: -# """ -# The priority order to determine the cursor position is: -# 1. A static cursor position was provided -# 2. Preset values have been provided so the cursor will be -# positioned on those -# 3. A default value for a selection is given so the cursor -# will be placed on such -# """ -# if cursor_index: -# return cursor_index -# -# if preset: -# indexes = [] -# -# for p in preset: -# try: -# # the options of the table selection menu -# # are already escaped so we have to escape -# # the preset values as well for the comparison -# if '|' in p: -# p = p.replace('|', '\\|') -# -# if p in self._menu_options: -# idx = self._menu_options.index(p) -# else: -# idx = self._menu_options.index(self._default_menu_value) -# indexes.append(idx) -# except (IndexError, ValueError): -# debug(f'Error finding index of {p}: {self._menu_options}') -# -# if len(indexes) == 0: -# indexes.append(0) -# -# return indexes[0] -# -# if self._default_option: -# return self._menu_options.index(self._default_menu_value) -# -# return None diff --git a/archinstall/lib/mirrors.py b/archinstall/lib/mirrors.py index f517a34412..3628448d49 100644 --- a/archinstall/lib/mirrors.py +++ b/archinstall/lib/mirrors.py @@ -1,3 +1,4 @@ +import json import pathlib from dataclasses import dataclass, field from enum import Enum @@ -7,6 +8,7 @@ from .networking import fetch_data_from_url from .output import warn, FormattedOutput from .storage import storage +from .models.mirrors import MirrorStatusListV3, MirrorStatusEntryV3 from archinstall.tui import ( MenuItemGroup, MenuItem, SelectMenu, @@ -178,7 +180,7 @@ def _add_custom_mirror(self, mirror: Optional[CustomMirror] = None) -> Optional[ ).input() if not result.item: - return mirror + return mirror url = result.item @@ -255,16 +257,15 @@ def _define_menu_options(self) -> List[MenuItem]: ] def _prev_regions(self, item: MenuItem) -> Optional[str]: - regions = item.value + mirrors: Dict[str, MirrorStatusEntryV3] = item.value output = '' - for region, urls in regions.items(): - max_len = max([len(url) for url in urls]) - output += f'{region}\n' - output += '-' * max_len + '\n' + for name, status_list in mirrors.items(): + output += f'{name}\n' + output += '-' * len(name) + '\n' - for url in urls: - output += f'{url}\n' + for entry in status_list: + output += f'{entry.url}\n' output += '\n' @@ -295,7 +296,7 @@ def select_mirror_regions(preset: Dict[str, List[str]]) -> Dict[str, List[str]]: items = [MenuItem(mirror, value=mirror) for mirror in mirrors.keys()] group = MenuItemGroup(items, sort_items=True) - group.set_focus_by_value(preset) + group.set_selected_by_value(preset.values()) result = SelectMenu( group, @@ -319,39 +320,55 @@ def select_custom_mirror(preset: List[CustomMirror] = []): return custom_mirrors -def _parse_mirror_list(mirrorlist: str) -> Dict[str, List[str]]: - file_content = mirrorlist.split('\n') - file_content = list(filter(lambda x: x, file_content)) # filter out empty lines - first_srv_idx = [idx for idx, line in enumerate(file_content) if 'server' in line.lower()][0] - mirrors = file_content[first_srv_idx - 1:] +def sort_mirrors_by_performance(mirror_list: List[MirrorStatusEntryV3]) -> List[MirrorStatusEntryV3]: + return sorted(mirror_list, key=lambda mirror: (mirror.score, mirror.speed)) + + +def _parse_mirror_list(mirrorlist: str) -> Dict[str, List[MirrorStatusEntryV3]]: + mirror_status = MirrorStatusListV3(**json.loads(mirrorlist)) + + sorting_placeholder: Dict[str, List[MirrorStatusEntryV3]] = {} - mirror_list: Dict[str, List[str]] = {} + for mirror in mirror_status.urls: + # We filter out mirrors that have bad criteria values + if any([ + mirror.active is False, # Disabled by mirror-list admins + mirror.last_sync is None, # Has not synced recently + # mirror.score (error rate) over time reported from backend: https://github.com/archlinux/archweb/blob/31333d3516c91db9a2f2d12260bd61656c011fd1/mirrors/utils.py#L111C22-L111C66 + (mirror.score is None or mirror.score >= 100), + ]): + continue - for idx in range(0, len(mirrors), 2): - region = mirrors[idx].removeprefix('## ') - url = mirrors[idx + 1].removeprefix('#').removeprefix('Server = ') - mirror_list.setdefault(region, []).append(url) + if mirror.country == "": + # TODO: This should be removed once RFC!29 is merged and completed + # Until then, there are mirrors which lacks data in the backend + # and there is no way of knowing where they're located. + # So we have to assume world-wide + mirror.country = "Worldwide" - return mirror_list + if mirror.url.startswith('http'): + sorting_placeholder.setdefault(mirror.country, []).append(mirror) + sorted_by_regions: Dict[str, List[MirrorStatusEntryV3]] = dict({ + region: unsorted_mirrors + for region, unsorted_mirrors in sorted(sorting_placeholder.items(), key=lambda item: item[0]) + }) -def list_mirrors() -> Dict[str, List[str]]: - regions: Dict[str, List[str]] = {} + return sorted_by_regions + + +def list_mirrors() -> Dict[str, List[MirrorStatusEntryV3]]: + regions: Dict[str, List[MirrorStatusEntryV3]] = {} if storage['arguments']['offline']: with pathlib.Path('/etc/pacman.d/mirrorlist').open('r') as fp: mirrorlist = fp.read() else: - url = "https://archlinux.org/mirrorlist/?protocol=https&protocol=http&ip_version=4&ip_version=6&use_mirror_status=on" + url = "https://archlinux.org/mirrors/status/json/" try: mirrorlist = fetch_data_from_url(url) except ValueError as err: warn(f'Could not fetch an active mirror-list: {err}') return regions - regions = _parse_mirror_list(mirrorlist) - sorted_regions = {} - for region, urls in regions.items(): - sorted_regions[region] = sorted(urls, reverse=True) - - return sorted_regions + return _parse_mirror_list(mirrorlist) diff --git a/archinstall/lib/models/audio_configuration.py b/archinstall/lib/models/audio_configuration.py index 5659ef8357..e25f93291a 100644 --- a/archinstall/lib/models/audio_configuration.py +++ b/archinstall/lib/models/audio_configuration.py @@ -35,7 +35,7 @@ def parse_arg(arg: Dict[str, Any]) -> 'AudioConfiguration': def install_audio_config( self, installation: Any - ): + ) -> None: info(f'Installing audio server: {self.audio.name}') match self.audio: diff --git a/archinstall/lib/models/gen.py b/archinstall/lib/models/gen.py index fb7e575182..c29b1fe9e2 100644 --- a/archinstall/lib/models/gen.py +++ b/archinstall/lib/models/gen.py @@ -98,7 +98,7 @@ def pkg_version(self) -> str: def __eq__(self, other) -> bool: return self.pkg_version == other.pkg_version - def __lt__(self, other) -> bool: + def __lt__(self, other: 'PackageSearchResult') -> bool: return self.pkg_version < other.pkg_version @@ -129,7 +129,7 @@ def from_json(data: Dict[str, Any]) -> 'PackageSearch': class LocalPackage: name: str version: str - description:str + description: str architecture: str url: str licenses: str diff --git a/archinstall/lib/models/mirrors.py b/archinstall/lib/models/mirrors.py new file mode 100644 index 0000000000..d5aa8842e1 --- /dev/null +++ b/archinstall/lib/models/mirrors.py @@ -0,0 +1,104 @@ +import datetime +import pydantic +import http.client +import urllib.parse +import urllib.request +from typing import ( + Dict, + List +) + +from ..networking import ping, DownloadTimer +from ..output import info, debug + + +class MirrorStatusEntryV3(pydantic.BaseModel): + url: str + protocol: str + active: bool + country: str + country_code: str + isos: bool + ipv4: bool + ipv6: bool + details: str + delay: int | None = None + last_sync: datetime.datetime | None = None + duration_avg: float | None = None + duration_stddev: float | None = None + completion_pct: float | None = None + score: int | None = None + _latency: float | None = None + _speed: float | None = None + _hostname: str | None = None + _port: int | None = None + + @property + def speed(self) -> float | None: + if self._speed is None: + info(f"Checking download speed of {self._hostname}[{self.score}] by fetching: {self.url}core/os/x86_64/core.db") + req = urllib.request.Request(url=f"{self.url}core/os/x86_64/core.db") + + try: + with urllib.request.urlopen(req, None, 5) as handle, DownloadTimer(timeout=5) as timer: + size = len(handle.read()) + + self._speed = size / timer.time + debug(f" speed: {self._speed} ({int(self._speed / 1024 / 1024 * 100) / 100}MiB/s)") + except http.client.IncompleteRead: + debug(" speed: ") + self._speed = 0 + except urllib.error.URLError as error: + debug(f" speed: ({error})") + self._speed = 0 + except Exception as error: + debug(f" speed: ({error})") + self._speed = 0 + + return self._speed + + @property + def latency(self) -> float | None: + """ + Latency measures the miliseconds between one ICMP request & response. + It only does so once because we check if self._latency is None, and a ICMP timeout result in -1 + We do this because some hosts blocks ICMP so we'll have to rely on .speed() instead which is slower. + """ + if self._latency is None: + info(f"Checking latency for {self.url}") + self._latency = ping(self._hostname, timeout=2) + debug(f" latency: {self._latency}") + + return self._latency + + @pydantic.field_validator('score', mode='before') + def validate_score(cls, value) -> int | None: + if value is not None: + value = round(value) + debug(f" score: {value}") + + return value + + @pydantic.model_validator(mode='after') + def debug_output(self, validation_info) -> 'MirrorStatusEntryV3': + self._hostname, *_port = urllib.parse.urlparse(self.url).netloc.split(':', 1) + self._port = int(_port[0]) if _port and len(_port) >= 1 else None + + debug(f"Loaded mirror {self._hostname}" + (f" with current score of {round(self.score)}" if self.score else '')) + return self + + +class MirrorStatusListV3(pydantic.BaseModel): + cutoff: int + last_check: datetime.datetime + num_checks: int + urls: List[MirrorStatusEntryV3] + version: int + + @pydantic.model_validator(mode='before') + @classmethod + def check_model(cls, data: Dict[str, int | datetime.datetime | List[MirrorStatusEntryV3]]) -> Dict[str, int | datetime.datetime | List[MirrorStatusEntryV3]]: + if data.get('version') == 3: + return data + + raise ValueError("MirrorStatusListV3 only accepts version 3 data from https://archlinux.org/mirrors/status/json/") diff --git a/archinstall/lib/models/network_configuration.py b/archinstall/lib/models/network_configuration.py index dfd8b8cbbf..cb1c32571c 100644 --- a/archinstall/lib/models/network_configuration.py +++ b/archinstall/lib/models/network_configuration.py @@ -124,7 +124,7 @@ def install_network_config( self, installation: Any, profile_config: Optional[ProfileConfiguration] = None - ): + ) -> None: match self.type: case NicType.ISO: installation.copy_iso_network_config( diff --git a/archinstall/lib/models/users.py b/archinstall/lib/models/users.py index 9ed70eef87..045d9d61e9 100644 --- a/archinstall/lib/models/users.py +++ b/archinstall/lib/models/users.py @@ -13,14 +13,14 @@ class PasswordStrength(Enum): STRONG = 'strong' @property - def value(self): + def value(self) -> str: match self: case PasswordStrength.VERY_WEAK: return str(_('very weak')) case PasswordStrength.WEAK: return str(_('weak')) case PasswordStrength.MODERATE: return str(_('moderate')) case PasswordStrength.STRONG: return str(_('strong')) - def color(self): + def color(self) -> str: match self: case PasswordStrength.VERY_WEAK: return 'red' case PasswordStrength.WEAK: return 'red' diff --git a/archinstall/lib/networking.py b/archinstall/lib/networking.py index fb26bd3d73..a85c9d985c 100644 --- a/archinstall/lib/networking.py +++ b/archinstall/lib/networking.py @@ -2,24 +2,78 @@ import socket import ssl import struct +import time +import select +import signal +import random from typing import Union, Dict, Any, List, Optional from urllib.error import URLError from urllib.parse import urlencode from urllib.request import urlopen -from .exceptions import SysCallError +from .exceptions import SysCallError, DownloadTimeout from .output import error, info from .pacman import Pacman -def get_hw_addr(ifname :str) -> str: +class DownloadTimer(): + ''' + Context manager for timing downloads with timeouts. + ''' + def __init__(self, timeout: int = 5): + ''' + Args: + timeout: + The download timeout in seconds. The DownloadTimeout exception + will be raised in the context after this many seconds. + ''' + self.time: Optional[float] = None + self.start_time: Optional[float] = None + self.timeout = timeout + self.previous_handler = None + self.previous_timer: Optional[int] = None + + def raise_timeout(self, signl, frame) -> None: + ''' + Raise the DownloadTimeout exception. + ''' + raise DownloadTimeout(f'Download timed out after {self.timeout} second(s).') + + def __enter__(self): + if self.timeout > 0: + self.previous_handler = signal.signal(signal.SIGALRM, self.raise_timeout) # type: ignore[assignment] + self.previous_timer = signal.alarm(self.timeout) + + self.start_time = time.time() + return self + + def __exit__(self, typ, value, traceback) -> None: + if self.start_time: + time_delta = time.time() - self.start_time + signal.alarm(0) + self.time = time_delta + if self.timeout > 0: + signal.signal(signal.SIGALRM, self.previous_handler) + + previous_timer = self.previous_timer + if previous_timer and previous_timer > 0: + remaining_time = int(previous_timer - time_delta) + # The alarm should have been raised during the download. + if remaining_time <= 0: + signal.raise_signal(signal.SIGALRM) + else: + signal.alarm(remaining_time) + self.start_time = None + + +def get_hw_addr(ifname: str) -> str: import fcntl s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ret = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', bytes(ifname, 'utf-8')[:15])) return ':'.join('%02x' % b for b in ret[18:24]) -def list_interfaces(skip_loopback :bool = True) -> Dict[str, str]: +def list_interfaces(skip_loopback: bool = True) -> Dict[str, str]: interfaces = {} for index, iface in socket.if_nameindex(): @@ -81,3 +135,62 @@ def fetch_data_from_url(url: str, params: Optional[Dict] = None) -> str: return data except URLError: raise ValueError(f'Unable to fetch data from url: {url}') + + +def calc_checksum(icmp_packet) -> int: + # Calculate the ICMP checksum + checksum = 0 + for i in range(0, len(icmp_packet), 2): + checksum += (icmp_packet[i] << 8) + ( + struct.unpack('B', icmp_packet[i + 1:i + 2])[0] + if len(icmp_packet[i + 1:i + 2]) else 0 + ) + + checksum = (checksum >> 16) + (checksum & 0xFFFF) + checksum = ~checksum & 0xFFFF + + return checksum + + +def build_icmp(payload: bytes) -> bytes: + # Define the ICMP Echo Request packet + icmp_packet = struct.pack('!BBHHH', 8, 0, 0, 0, 1) + payload + + checksum = calc_checksum(icmp_packet) + + return struct.pack('!BBHHH', 8, 0, checksum, 0, 1) + payload + + +def ping(hostname, timeout=5) -> int: + watchdog = select.epoll() + started = time.time() + random_identifier = f'archinstall-{random.randint(1000, 9999)}'.encode() + + # Create a raw socket (requires root, which should be fine on archiso) + icmp_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) + watchdog.register(icmp_socket, select.EPOLLIN | select.EPOLLHUP) + + icmp_packet = build_icmp(random_identifier) + + # Send the ICMP packet + icmp_socket.sendto(icmp_packet, (hostname, 0)) + latency = -1 + + # Gracefully wait for X amount of time + # for a ICMP response or exit with no latency + while latency == -1 and time.time() - started < timeout: + try: + for fileno, event in watchdog.poll(0.1): + response, _ = icmp_socket.recvfrom(1024) + icmp_type = struct.unpack('!B', response[20:21])[0] + + # Check if it's an Echo Reply (ICMP type 0) + if icmp_type == 0 and response[-len(random_identifier):] == random_identifier: + latency = round((time.time() - started) * 1000) + break + except socket.error as error: + print(f"Error: {error}") + break + + icmp_socket.close() + return latency diff --git a/archinstall/lib/output.py b/archinstall/lib/output.py index 183c2e7507..8f486d7367 100644 --- a/archinstall/lib/output.py +++ b/archinstall/lib/output.py @@ -5,18 +5,21 @@ from enum import Enum from pathlib import Path -from typing import Dict, Union, List, Any, Callable, Optional +from typing import Dict, Union, List, Any, Callable, Optional, TYPE_CHECKING from dataclasses import asdict, is_dataclass from .storage import storage +if TYPE_CHECKING: + from _typeshed import DataclassInstance + class FormattedOutput: @classmethod def _get_values( cls, - o: Any, + o: 'DataclassInstance', class_formatter: Optional[Union[str, Callable]] = None, filter_list: List[str] = [] ) -> Dict[str, Any]: @@ -144,7 +147,7 @@ def log(message: str, level: int = logging.DEBUG) -> None: log_adapter.log(level, message) -def _check_log_permissions(): +def _check_log_permissions() -> None: filename = storage.get('LOG_FILE', None) log_dir = storage.get('LOG_PATH', Path('./')) @@ -212,21 +215,21 @@ def _stylize_output( Adds styling to a text given a set of color arguments. """ colors = { - 'black' : '0', - 'red' : '1', - 'green' : '2', - 'yellow' : '3', - 'blue' : '4', - 'magenta' : '5', - 'cyan' : '6', - 'white' : '7', - 'teal' : '8;5;109', # Extended 256-bit colors (not always supported) - 'orange' : '8;5;208', # https://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html#256-colors - 'darkorange' : '8;5;202', - 'gray' : '8;5;246', - 'grey' : '8;5;246', - 'darkgray' : '8;5;240', - 'lightgray' : '8;5;256' + 'black': '0', + 'red': '1', + 'green': '2', + 'yellow': '3', + 'blue': '4', + 'magenta': '5', + 'cyan': '6', + 'white': '7', + 'teal': '8;5;109', # Extended 256-bit colors (not always supported) + 'orange': '8;5;208', # https://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html#256-colors + 'darkorange': '8;5;202', + 'gray': '8;5;246', + 'grey': '8;5;246', + 'darkgray': '8;5;240', + 'lightgray': '8;5;256' } foreground = {key: f'3{colors[key]}' for key in colors} @@ -256,7 +259,7 @@ def info( bg: Optional[str] = None, reset: bool = False, font: List[Font] = [] -): +) -> None: log(*msgs, level=level, fg=fg, bg=bg, reset=reset, font=font) @@ -267,7 +270,7 @@ def debug( bg: Optional[str] = None, reset: bool = False, font: List[Font] = [] -): +) -> None: log(*msgs, level=level, fg=fg, bg=bg, reset=reset, font=font) @@ -278,18 +281,18 @@ def error( bg: Optional[str] = None, reset: bool = False, font: List[Font] = [] -): +) -> None: log(*msgs, level=level, fg=fg, bg=bg, reset=reset, font=font) def warn( *msgs: str, - level: int = logging.WARN, + level: int = logging.WARNING, fg: str = 'yellow', bg: Optional[str] = None, reset: bool = False, font: List[Font] = [] -): +) -> None: log(*msgs, level=level, fg=fg, bg=bg, reset=reset, font=font) @@ -300,7 +303,7 @@ def log( bg: Optional[str] = None, reset: bool = False, font: List[Font] = [] -): +) -> None: # leave this check here as we need to setup the logging # right from the beginning when the modules are loaded _check_log_permissions() @@ -323,10 +326,12 @@ def log( sys.stdout.write(f"{text}\n") sys.stdout.flush() + def _count_wchars(string: str) -> int: "Count the total number of wide characters contained in a string" return sum(unicodedata.east_asian_width(c) in 'FW' for c in string) + def unicode_ljust(string: str, width: int, fillbyte: str = ' ') -> str: """Return a left-justified unicode string of length width. >>> unicode_ljust('Hello', 15, '*') @@ -340,6 +345,7 @@ def unicode_ljust(string: str, width: int, fillbyte: str = ' ') -> str: """ return string.ljust(width - _count_wchars(string), fillbyte) + def unicode_rjust(string: str, width: int, fillbyte: str = ' ') -> str: """Return a right-justified unicode string of length width. >>> unicode_rjust('Hello', 15, '*') diff --git a/archinstall/lib/packages/packages.py b/archinstall/lib/packages/packages.py index e495b03f05..f7f1e8179e 100644 --- a/archinstall/lib/packages/packages.py +++ b/archinstall/lib/packages/packages.py @@ -26,7 +26,7 @@ def _make_request(url: str, params: Dict) -> Any: return urlopen(full_url, context=ssl_context) -def group_search(name :str) -> List[PackageSearchResult]: +def group_search(name: str) -> List[PackageSearchResult]: # TODO UPSTREAM: Implement /json/ for the groups search try: response = _make_request(BASE_GROUP_URL, {'name': name}) @@ -42,7 +42,7 @@ def group_search(name :str) -> List[PackageSearchResult]: return [PackageSearchResult(**package) for package in json.loads(data)['results']] -def package_search(package :str) -> PackageSearch: +def package_search(package: str) -> PackageSearch: """ Finds a specific package via the package database. It makes a simple web-request, which might be a bit slow. @@ -59,7 +59,7 @@ def package_search(package :str) -> PackageSearch: return PackageSearch.from_json(json_data) -def find_package(package :str) -> List[PackageSearchResult]: +def find_package(package: str) -> List[PackageSearchResult]: data = package_search(package) results = [] @@ -77,7 +77,7 @@ def find_package(package :str) -> List[PackageSearchResult]: return results -def find_packages(*names :str) -> Dict[str, Any]: +def find_packages(*names: str) -> Dict[str, Any]: """ This function returns the search results for many packages. The function itself is rather slow, so consider not sending to @@ -91,7 +91,7 @@ def find_packages(*names :str) -> Dict[str, Any]: return result -def validate_package_list(packages :list) -> Tuple[list, list]: +def validate_package_list(packages: list) -> Tuple[list, list]: """ Validates a list of given packages. return: Tuple of lists containing valid packavges in the first and invalid @@ -103,7 +103,7 @@ def validate_package_list(packages :list) -> Tuple[list, list]: return list(valid_packages), list(invalid_packages) -def installed_package(package :str) -> LocalPackage: +def installed_package(package: str) -> LocalPackage: package_info = {} try: for line in Pacman.run(f"-Q --info {package}"): diff --git a/archinstall/lib/pacman/__init__.py b/archinstall/lib/pacman/__init__.py index 6478f0cc6f..1e916553e6 100644 --- a/archinstall/lib/pacman/__init__.py +++ b/archinstall/lib/pacman/__init__.py @@ -23,7 +23,7 @@ def __init__(self, target: Path, silent: bool = False): self.target = target @staticmethod - def run(args :str, default_cmd :str = 'pacman') -> SysCommand: + def run(args: str, default_cmd: str = 'pacman') -> SysCommand: """ A centralized function to call `pacman` from. It also protects us from colliding with other running pacman sessions (if used locally). @@ -44,7 +44,7 @@ def run(args :str, default_cmd :str = 'pacman') -> SysCommand: return SysCommand(f'{default_cmd} {args}') - def ask(self, error_message: str, bail_message: str, func: Callable, *args, **kwargs): + def ask(self, error_message: str, bail_message: str, func: Callable, *args, **kwargs) -> None: while True: try: func(*args, **kwargs) @@ -55,7 +55,7 @@ def ask(self, error_message: str, bail_message: str, func: Callable, *args, **kw continue raise RequirementError(f'{bail_message}: {err}') - def sync(self): + def sync(self) -> None: if self.synced: return self.ask( @@ -67,7 +67,7 @@ def sync(self): ) self.synced = True - def strap(self, packages: Union[str, List[str]]): + def strap(self, packages: Union[str, List[str]]) -> None: self.sync() if isinstance(packages, str): packages = [packages] diff --git a/archinstall/lib/pacman/config.py b/archinstall/lib/pacman/config.py index 6686f4a9bd..2c9df447b6 100644 --- a/archinstall/lib/pacman/config.py +++ b/archinstall/lib/pacman/config.py @@ -12,10 +12,10 @@ def __init__(self, target: Path): self.chroot_path = target / "etc" / "pacman.conf" self.repos: List[Repo] = [] - def enable(self, repo: Repo): + def enable(self, repo: Repo) -> None: self.repos.append(repo) - def apply(self): + def apply(self) -> None: if not self.repos: return @@ -39,6 +39,6 @@ def apply(self): else: f.write(line) - def persist(self): + def persist(self) -> None: if self.repos: copy2(self.path, self.chroot_path) diff --git a/archinstall/lib/pacman/repo.py b/archinstall/lib/pacman/repo.py index 7a461431d3..4ccfe0113a 100644 --- a/archinstall/lib/pacman/repo.py +++ b/archinstall/lib/pacman/repo.py @@ -1,5 +1,6 @@ from enum import Enum + class Repo(Enum): Multilib = "multilib" Testing = "testing" diff --git a/archinstall/lib/profile/profiles_handler.py b/archinstall/lib/profile/profiles_handler.py index 3fb5419fc8..a5e70675b9 100644 --- a/archinstall/lib/profile/profiles_handler.py +++ b/archinstall/lib/profile/profiles_handler.py @@ -10,18 +10,13 @@ from types import ModuleType from typing import List, TYPE_CHECKING, Any, Optional, Dict, Union -from archinstall.default_profiles.profile import Profile, TProfile, GreeterType +from ...default_profiles.profile import Profile, GreeterType from .profile_model import ProfileConfiguration from ..hardware import GfxDriver from ..networking import list_interfaces, fetch_data_from_url from ..output import error, debug, info from ..storage import storage -from archinstall.tui import ( - MenuItemGroup, MenuItem, SelectMenu, - FrameProperties, FrameStyle, Alignment, - ResultType, EditMenu -) if TYPE_CHECKING: @@ -30,9 +25,9 @@ class ProfileHandler: - def __init__(self): + def __init__(self) -> None: self._profiles_path: Path = storage['PROFILE'] - self._profiles = None + self._profiles: Optional[list[Profile]] = None # special variable to keep track of a profile url configuration # it is merely used to be able to export the path again when a user @@ -128,7 +123,7 @@ def parse_profile_config(self, profile_config: Dict[str, Any]) -> Optional[Profi custom_settings = profile_config.get('custom_settings', {}) profile.set_custom_settings(custom_settings) - profile.set_current_selection(valid_sub_profiles) + profile.current_selection = valid_sub_profiles return profile @@ -144,7 +139,7 @@ def profiles(self) -> List[Profile]: def _local_mac_addresses(self) -> List[str]: return list(list_interfaces()) - def add_custom_profiles(self, profiles: Union[TProfile, List[TProfile]]): + def add_custom_profiles(self, profiles: Union[Profile, List[Profile]]) -> None: if not isinstance(profiles, list): profiles = [profiles] @@ -153,7 +148,7 @@ def add_custom_profiles(self, profiles: Union[TProfile, List[TProfile]]): self._verify_unique_profile_names(self.profiles) - def remove_custom_profiles(self, profiles: Union[TProfile, List[TProfile]]): + def remove_custom_profiles(self, profiles: Union[Profile, List[Profile]]) -> None: if not isinstance(profiles, list): profiles = [profiles] @@ -180,7 +175,7 @@ def get_mac_addr_profiles(self) -> List[Profile]: match_mac_addr_profiles = list(filter(lambda x: x.name in self._local_mac_addresses, tailored)) return match_mac_addr_profiles - def install_greeter(self, install_session: 'Installer', greeter: GreeterType): + def install_greeter(self, install_session: 'Installer', greeter: GreeterType) -> None: packages = [] service = None @@ -200,6 +195,8 @@ def install_greeter(self, install_session: 'Installer', greeter: GreeterType): case GreeterType.Ly: packages = ['ly'] service = ['ly'] + case GreeterType.CosmicSession: + packages = ['cosmic-greeter'] if packages: install_session.add_additional_packages(packages) @@ -217,7 +214,7 @@ def install_greeter(self, install_session: 'Installer', greeter: GreeterType): with open(path, 'w') as file: file.write(filedata) - def install_gfx_driver(self, install_session: 'Installer', driver: GfxDriver): + def install_gfx_driver(self, install_session: 'Installer', driver: GfxDriver) -> None: debug(f'Installing GFX driver: {driver.value}') if driver in [GfxDriver.NvidiaOpenKernel, GfxDriver.NvidiaProprietary]: @@ -236,7 +233,7 @@ def install_gfx_driver(self, install_session: 'Installer', driver: GfxDriver): pkg_names = [p.value for p in driver_pkgs] install_session.add_additional_packages(pkg_names) - def install_profile_config(self, install_session: 'Installer', profile_config: ProfileConfiguration): + def install_profile_config(self, install_session: 'Installer', profile_config: ProfileConfiguration) -> None: profile = profile_config.profile if not profile: @@ -250,7 +247,7 @@ def install_profile_config(self, install_session: 'Installer', profile_config: P if profile_config.greeter: self.install_greeter(install_session, profile_config.greeter) - def _import_profile_from_url(self, url: str): + def _import_profile_from_url(self, url: str) -> None: """ Import default_profiles from a url path """ diff --git a/archinstall/lib/storage.py b/archinstall/lib/storage.py index 2f256e5d12..36228cf9d6 100644 --- a/archinstall/lib/storage.py +++ b/archinstall/lib/storage.py @@ -15,8 +15,8 @@ 'LOG_FILE': Path('install.log'), 'MOUNT_POINT': Path('/mnt/archinstall'), 'ENC_IDENTIFIER': 'ainst', - 'DISK_TIMEOUTS' : 1, # seconds - 'DISK_RETRY_ATTEMPTS' : 5, # RETRY_ATTEMPTS * DISK_TIMEOUTS is used in disk operations - 'CMD_LOCALE':{'LC_ALL':'C'}, # default locale for execution commands. Can be overridden with set_cmd_locale() - 'CMD_LOCALE_DEFAULT':{'LC_ALL':'C'}, # should be the same as the former. Not be used except in reset_cmd_locale() + 'DISK_TIMEOUTS': 1, # seconds + 'DISK_RETRY_ATTEMPTS': 5, # RETRY_ATTEMPTS * DISK_TIMEOUTS is used in disk operations + 'CMD_LOCALE': {'LC_ALL': 'C'}, # default locale for execution commands. Can be overridden with set_cmd_locale() + 'CMD_LOCALE_DEFAULT': {'LC_ALL': 'C'}, # should be the same as the former. Not be used except in reset_cmd_locale() } diff --git a/archinstall/lib/translationhandler.py b/archinstall/lib/translationhandler.py index 45a88f9c2b..1931745f9f 100644 --- a/archinstall/lib/translationhandler.py +++ b/archinstall/lib/translationhandler.py @@ -39,7 +39,7 @@ def json(self) -> str: class TranslationHandler: - def __init__(self): + def __init__(self) -> None: self._base_pot = 'base.pot' self._languages = 'languages.json' @@ -145,7 +145,7 @@ def get_language_by_abbr(self, abbr: str) -> Language: except Exception: raise ValueError(f'No language with abbreviation "{abbr}" found') - def activate(self, language: Language): + def activate(self, language: Language) -> None: """ Set the provided language as the current translation """ @@ -204,7 +204,7 @@ def format(self, *args) -> str: return self.message.format(*args) @classmethod - def install(cls): + def install(cls) -> None: import builtins builtins._ = cls # type: ignore diff --git a/archinstall/lib/utils/util.py b/archinstall/lib/utils/util.py index dc220599b5..d99646e937 100644 --- a/archinstall/lib/utils/util.py +++ b/archinstall/lib/utils/util.py @@ -85,7 +85,7 @@ def validate_path(path: str) -> Optional[str]: return Path(result.item) -def is_subpath(first: Path, second: Path): +def is_subpath(first: Path, second: Path) -> bool: """ Check if _first_ a subpath of _second_ """ diff --git a/archinstall/locales/ar/LC_MESSAGES/base.po b/archinstall/locales/ar/LC_MESSAGES/base.po index 986895ecd3..4d45b6b7c5 100644 --- a/archinstall/locales/ar/LC_MESSAGES/base.po +++ b/archinstall/locales/ar/LC_MESSAGES/base.po @@ -1328,3 +1328,6 @@ msgstr "لغات التثبيت" #, fuzzy msgid " (default)" msgstr "(افتراضي)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index 1c6689d3dc..5edf75e0de 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -1347,3 +1347,6 @@ msgstr "" msgid " (default)" msgstr "" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/ca/LC_MESSAGES/base.mo b/archinstall/locales/ca/LC_MESSAGES/base.mo new file mode 100644 index 0000000000..f48921159a Binary files /dev/null and b/archinstall/locales/ca/LC_MESSAGES/base.mo differ diff --git a/archinstall/locales/ca/LC_MESSAGES/base.po b/archinstall/locales/ca/LC_MESSAGES/base.po new file mode 100644 index 0000000000..bf1fc3cf36 --- /dev/null +++ b/archinstall/locales/ca/LC_MESSAGES/base.po @@ -0,0 +1,1314 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.4.2\n" + +msgid "[!] A log file has been created here: {} {}" +msgstr "[!] S'ha creat un fitxer de registre aquí: {} {}" + +msgid " Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues" +msgstr " Si us plau envieu aquest problema (i fitxer) a https://github.com/archlinux/archinstall/issues" + +msgid "Do you really want to abort?" +msgstr "Segur que voleu avortar?" + +msgid "And one more time for verification: " +msgstr "Una vegada més per a verificar: " + +msgid "Would you like to use swap on zram?" +msgstr "Us agradaria utilitzar swap a zram?" + +msgid "Desired hostname for the installation: " +msgstr "Nom de host desitjat per a la instal·lació: " + +msgid "Username for required superuser with sudo privileges: " +msgstr "Nom d'usuari pel superusuari amb privilegis sudo: " + +msgid "Any additional users to install (leave blank for no users): " +msgstr "Algun usuari addicional a instal·lar (deixeu-ho en blanc per no afegir-ne cap): " + +msgid "Should this user be a superuser (sudoer)?" +msgstr "Cal que aquest usuari sigui un superusuari (sudoer)?" + +msgid "Select a timezone" +msgstr "Seleccioneu una franja horària" + +msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?" +msgstr "Voleu utilitzar GRUB com a gestor d'arranc en comptes de systemd-boot?" + +msgid "Choose a bootloader" +msgstr "Trieu un gestor d'arranc" + +msgid "Choose an audio server" +msgstr "Trieu un servidor d'àudio" + +msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr and optional profile packages are installed." +msgstr "Només s'instal·laran paquets com base, base-devel, linux, linux-firmware, efibootmgr i altres paquets de perfil opcionals." + +msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt." +msgstr "Si desitgeu un navegador web, com ara firefox o chromium, ho podeu especificar al proper missatge." + +msgid "Write additional packages to install (space separated, leave blank to skip): " +msgstr "Escriviu paquets addicionals a instal·lar (separats per espais, deixeu-ho en blanc per saltar aquest pas): " + +msgid "Copy ISO network configuration to installation" +msgstr "Copiar la configuració de xarxa ISO a la instal·lació" + +msgid "Use NetworkManager (necessary for configuring internet graphically in GNOME and KDE)" +msgstr "Utilitzar NetworkManager (necessari per a configurar internet gràficament a GNOME i KDE)" + +msgid "Select one network interface to configure" +msgstr "Seleccioneu una interfície de xarxa a configurar" + +msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" +msgstr "Seleccioneu quin mode configurar per a \"{}\" o ometeu per a usar el mode predeterminat \"{}\"" + +msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " +msgstr "Introduïu la IP i la subxarxa per a {} (exemple: 192.168.0.5/24): " + +msgid "Enter your gateway (router) IP address or leave blank for none: " +msgstr "Introduïu la IP de la porta d'enllaç (router) o deixeu-ho en blanc per a no utilitzar-ne cap: " + +msgid "Enter your DNS servers (space separated, blank for none): " +msgstr "Introduïu els vostres servidors DNS (separats per espais o deixeu-ho en blanc per a cap): " + +msgid "Select which filesystem your main partition should use" +msgstr "Seleccioneu quin sistema de fitxers cal utilitzar a la vostra partició principal" + +msgid "Current partition layout" +msgstr "Distribució actual de les particions" + +msgid "" +"Select what to do with\n" +"{}" +msgstr "" +"Seleccioneu què fer amb\n" +"{}" + +msgid "Enter a desired filesystem type for the partition" +msgstr "Introduïu el tipus de sistema de fitxers desitjat per a la partició" + +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "Introduïu la ubicació d'inici (en unitats dividides: s, GB, %, etc. ; per defecte: {}): " + +msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " +msgstr "Introduïu la ubicació final (en unitats dividides: s, GB, %, etc. ; ex.: {}): " + +msgid "{} contains queued partitions, this will remove those, are you sure?" +msgstr "{} conté particions en cua. Això eliminarà aquestes particions. N'esteu segurs?" + +msgid "" +"{}\n" +"\n" +"Select by index which partitions to delete" +msgstr "" +"{}\n" +"\n" +"Seleccioneu per índex la ubicació de les particions a eliminar" + +msgid "" +"{}\n" +"\n" +"Select by index which partition to mount where" +msgstr "" +"{}\n" +"\n" +"Seleccioneu per índex la ubicació de la partició a muntar" + +msgid " * Partition mount-points are relative to inside the installation, the boot would be /boot as an example." +msgstr " * Els punts de muntatge de la partició són relatius a l'interior de la instal·lació. Per exemple, /boot seria l'arranc." + +msgid "Select where to mount partition (leave blank to remove mountpoint): " +msgstr "Seleccioneu a on muntar la partició (deixeu-ho en blanc per a eliminar el punt de muntatge): " + +msgid "" +"{}\n" +"\n" +"Select which partition to mask for formatting" +msgstr "" +"{}\n" +"\n" +"Seleccioneu quina partició emmascarar per a formatejar" + +msgid "" +"{}\n" +"\n" +"Select which partition to mark as encrypted" +msgstr "" +"{}\n" +"\n" +"Seleccioneu quina partició marcar com a encriptada" + +msgid "" +"{}\n" +"\n" +"Select which partition to mark as bootable" +msgstr "" +"{}\n" +"\n" +"Seleccioneu quina partició marcar com a arranc" + +msgid "" +"{}\n" +"\n" +"Select which partition to set a filesystem on" +msgstr "" +"{}\n" +"\n" +"Seleccioneu en quina partició establir un sistema de fitxers" + +msgid "Enter a desired filesystem type for the partition: " +msgstr "Introduïu un sistema de fitxers desitjat per a la partició: " + +msgid "Archinstall language" +msgstr "Idioma d'Archinstall" + +msgid "Wipe all selected drives and use a best-effort default partition layout" +msgstr "Esborrar totes les unitats seleccionades i utilitzar una taula de particions òptima predeterminada" + +msgid "Select what to do with each individual drive (followed by partition usage)" +msgstr "Seleccioneu què fer amb cada volum individual (seguit de l'ús de la partició)" + +msgid "Select what you wish to do with the selected block devices" +msgstr "Seleccioneu que desitgeu fer amb els dispositius de blocs seleccionats" + +msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments" +msgstr "Aquesta és una llista de perfils preprogramats que podrien facilitar la instal·lació de coses com entorns d'escriptori" + +msgid "Select keyboard layout" +msgstr "Seleccioneu la distribució del teclat" + +msgid "Select one of the regions to download packages from" +msgstr "Seleccioneu una de les regions des de la qual descarregar paquets" + +msgid "Select one or more hard drives to use and configure" +msgstr "Seleccioneu un o més discos durs per a utilitzar i configurar" + +msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options." +msgstr "Per a obtenir la millor compatibilitat amb el vostre hardware AMD, és possible que us interessi utilitzar les opcions de codi obert o d'AMD / ATI." + +msgid "For the best compatibility with your Intel hardware, you may want to use either the all open-source or Intel options.\n" +msgstr "Per a obtenir la millor compatibilitat amb el vostre hardware Intel, és possible que us interessi utilitzar les opcions de codi obert o d'Intel.\n" + +msgid "For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n" +msgstr "Per a obtenir la millor compatibilitat amb el vostre hardware Nvidia, és possible que us interessi utilitzar les opcions de controlador propietari d'Nvidia.\n" + +msgid "" +"\n" +"\n" +"Select a graphics driver or leave blank to install all open-source drivers" +msgstr "" +"\n" +"\n" +"Seleccioneu un controlador gràfic o deixeu-ho en blanc per a instal·lar tots els controladors de codi obert" + +msgid "All open-source (default)" +msgstr "Tots els de codi obert (per defecte)" + +msgid "Choose which kernels to use or leave blank for default \"{}\"" +msgstr "Escolliu quin kernel utilitzar o deixeu-ho en blanc per utilitzar el kernel per defecte \"{}\"" + +msgid "Choose which locale language to use" +msgstr "Escolliu quin idioma de localització utilitzar" + +msgid "Choose which locale encoding to use" +msgstr "Escolliu quin idioma de codificació utilitzar" + +msgid "Select one of the values shown below: " +msgstr "Seleccioneu un dels valors mostrats a sota: " + +msgid "Select one or more of the options below: " +msgstr "Seleccioneu una o més de les opcions de sota: " + +msgid "Adding partition...." +msgstr "Afegint partició...." + +msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's." +msgstr "Necessiteu introduir un fs-type vàlid per a continuar. Veieu `man parted` per a tipus de sistemes de fitxers vàlids." + +msgid "Error: Listing profiles on URL \"{}\" resulted in:" +msgstr "Error: L'enllistament de perfils de la URL \"{}\" ha resultat en:" + +msgid "Error: Could not decode \"{}\" result as JSON:" +msgstr "Error: No s'ha pogut de-codificar el resultat \"{}\" com a JSON:" + +msgid "Keyboard layout" +msgstr "Distribució del teclat" + +msgid "Mirror region" +msgstr "Regió del servidor" + +msgid "Locale language" +msgstr "Idioma local" + +msgid "Locale encoding" +msgstr "Codificació local" + +msgid "Drive(s)" +msgstr "Disc(s)" + +msgid "Disk layout" +msgstr "Disseny del disc" + +msgid "Encryption password" +msgstr "Contrasenya de xifrat" + +msgid "Swap" +msgstr "Swap" + +msgid "Bootloader" +msgstr "Gestor d'arranc" + +msgid "Root password" +msgstr "Contrasenya de root" + +msgid "Superuser account" +msgstr "Compte de superusuari" + +msgid "User account" +msgstr "Compte d'usuari" + +msgid "Profile" +msgstr "Perfil" + +msgid "Audio" +msgstr "Àudio" + +msgid "Kernels" +msgstr "Kernels" + +msgid "Additional packages" +msgstr "Paquets addicionals" + +msgid "Network configuration" +msgstr "Configuració de la xarxa" + +msgid "Automatic time sync (NTP)" +msgstr "Sincronització automàtica de l'hora (NTP)" + +msgid "Install ({} config(s) missing)" +msgstr "Instal·lar ({} ajust(s) faltant(s))" + +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 "" +"Heu decidit saltar-vos la selecció de disc dur\n" +"i utilitzar la configuració muntada a {} (experimental)\n" +"AVÍS: Archinstall no verificarà la idoneïtat d'aquesta configuració\n" +"Voleu continuar?" + +msgid "Re-using partition instance: {}" +msgstr "Re-utilitzant instància de partició: {}" + +msgid "Create a new partition" +msgstr "Crear una nova partició" + +msgid "Delete a partition" +msgstr "Eliminar una partició" + +msgid "Clear/Delete all partitions" +msgstr "Netejar/Eliminar totes les particions" + +msgid "Assign mount-point for a partition" +msgstr "Assignar punt de muntatge per a una partició" + +msgid "Mark/Unmark a partition to be formatted (wipes data)" +msgstr "Marcar/Desmarcar una partició per a ser formatada (esborra les dades)" + +msgid "Mark/Unmark a partition as encrypted" +msgstr "Marcar/Desmarcar una partició com a encriptada" + +msgid "Mark/Unmark a partition as bootable (automatic for /boot)" +msgstr "Marcar/Desmarcar una partició com a arranc (automàtic per a /boot)" + +msgid "Set desired filesystem for a partition" +msgstr "Establir el sistema de fitxers desitjat per a una partició" + +msgid "Abort" +msgstr "Avortar" + +msgid "Hostname" +msgstr "Nom del host" + +msgid "Not configured, unavailable unless setup manually" +msgstr "No configurat. No disponible a no ser que es configuri manualment" + +msgid "Timezone" +msgstr "Franja horària" + +msgid "Set/Modify the below options" +msgstr "Establir/Modificar les opcions següents" + +msgid "Install" +msgstr "Instal·lar" + +msgid "" +"Use ESC to skip\n" +"\n" +msgstr "" +"Utilitzar ESC per a saltar\n" +"\n" + +msgid "Suggest partition layout" +msgstr "Recomanar el disseny de partició" + +msgid "Enter a password: " +msgstr "Introduïu una contrasenya: " + +msgid "Enter a encryption password for {}" +msgstr "Introduïu una contrasenya de xifrat per {}" + +msgid "Enter disk encryption password (leave blank for no encryption): " +msgstr "Introduïu la contrasenya de xifrat de disc (deixeu-ho en blanc per a no xifrar): " + +msgid "Create a required super-user with sudo privileges: " +msgstr "Crear un superusuari requerit amb privilegis sudo: " + +msgid "Enter root password (leave blank to disable root): " +msgstr "Introduïu la contrasenya de root (deixeu-ho en blanc per a deshabilitar root): " + +msgid "Password for user \"{}\": " +msgstr "Contrasenya per a l'usuari \"{}\": " + +msgid "Verifying that additional packages exist (this might take a few seconds)" +msgstr "Verificant que els paquets addicionals existeixen (això pot tardar uns segons)" + +msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n" +msgstr "Voleu utilitzar la sincronització automàtica d'hora (NTP) amb els servidors d'hora predeterminats?\n" + +msgid "" +"Hardware time and other post-configuration steps might be required in order for NTP to work.\n" +"For more information, please check the Arch wiki" +msgstr "" +"L'hora del hardware i altres passos post-configuració poden ser necessaris per tal que NTP funcioni.\n" +"Per a més informació, consulteu la wiki d'Arch" + +msgid "Enter a username to create an additional user (leave blank to skip): " +msgstr "Introduïu un nom d'usuari per a crear un usuari addicional (deixeu-ho en blanc per a saltar): " + +msgid "Use ESC to skip\n" +msgstr "Utilitzeu ESC per a ometre\n" + +msgid "" +"\n" +" Choose an object from the list, and select one of the available actions for it to execute" +msgstr "" +"\n" +" Trieu un objecte de la llista i seleccioneu una de les accions disponibles per a executar" + +msgid "Cancel" +msgstr "Cancel·lar" + +msgid "Confirm and exit" +msgstr "Confirmar i sortir" + +msgid "Add" +msgstr "Afegir" + +msgid "Copy" +msgstr "Copiar" + +msgid "Edit" +msgstr "Editar" + +msgid "Delete" +msgstr "Eliminar" + +msgid "Select an action for '{}'" +msgstr "Seleccioneu una acció per a '{}'" + +msgid "Copy to new key:" +msgstr "Copiar a clau nova:" + +msgid "Unknown nic type: {}. Possible values are {}" +msgstr "Tipus de nic desconegut: {}. Els valors possibles són {}" + +msgid "" +"\n" +"This is your chosen configuration:" +msgstr "" +"\n" +"Aquesta és la vostra configuració escollida:" + +msgid "Pacman is already running, waiting maximum 10 minutes for it to terminate." +msgstr "Pacman ja està en execució; s'esperarà un màxim de 10 minuts perquè acabi." + +msgid "Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall." +msgstr "El bloqueig pre-existent de pacman mai s'ha tancat. Si us plau, netegeu qualsevol sessió de pacman existent abans d'utilitzar archinstall." + +msgid "Choose which optional additional repositories to enable" +msgstr "Trieu quins repositoris addicionals opcionals cal activar" + +msgid "Add a user" +msgstr "Afegir un usuari" + +msgid "Change password" +msgstr "Canviar contrasenya" + +msgid "Promote/Demote user" +msgstr "Promocionar/Degradar usuari" + +msgid "Delete User" +msgstr "Eliminar usuari" + +msgid "" +"\n" +"Define a new user\n" +msgstr "" +"\n" +"Definir un usuari nou\n" + +msgid "User Name : " +msgstr "Nom d'usuari: " + +msgid "Should {} be a superuser (sudoer)?" +msgstr "Cal que {} sigui un superusuari (sudoer)?" + +msgid "Define users with sudo privilege: " +msgstr "Definiu usuaris amb privilegis sudo: " + +msgid "No network configuration" +msgstr "Sense configuració de xarxa" + +msgid "Set desired subvolumes on a btrfs partition" +msgstr "Establir els subvolums desitjats a una partició btrfs" + +msgid "" +"{}\n" +"\n" +"Select which partition to set subvolumes on" +msgstr "" +"{}\n" +"\n" +"Seleccioneu en quina partició configurar els subvolums" + +msgid "Manage btrfs subvolumes for current partition" +msgstr "Administrar subvolums btrfs per a la partició actual" + +msgid "No configuration" +msgstr "Sense configuració" + +msgid "Save user configuration" +msgstr "Guardar configuració d'usuari" + +msgid "Save user credentials" +msgstr "Guardar credencials d'usuari" + +msgid "Save disk layout" +msgstr "Guardar disseny del disc" + +msgid "Save all" +msgstr "Guardar tot" + +msgid "Choose which configuration to save" +msgstr "Escolliu quina configuració guardar" + +msgid "Enter a directory for the configuration(s) to be saved: " +msgstr "Introduïu un directori on guardar les configuracions: " + +msgid "Not a valid directory: {}" +msgstr "Directori invàlid: {}" + +msgid "The password you are using seems to be weak," +msgstr "La contrasenya que esteu utilitzant sembla dèbil," + +msgid "are you sure you want to use it?" +msgstr "segur que voleu utilitzar-la?" + +msgid "Optional repositories" +msgstr "Repositoris opcionals" + +msgid "Save configuration" +msgstr "Guardar configuració" + +msgid "Missing configurations:\n" +msgstr "Configuracions que falten:\n" + +msgid "Either root-password or at least 1 superuser must be specified" +msgstr "Cal especificar una contrasenya de root o un mínim d'un superusuari" + +msgid "Manage superuser accounts: " +msgstr "Gestionar comptes de superusuari: " + +msgid "Manage ordinary user accounts: " +msgstr "Gestionar comptes d'usuaris ordinaris: " + +msgid " Subvolume :{:16}" +msgstr " Subvolum :{:16}" + +msgid " mounted at {:16}" +msgstr " muntat a {:16}" + +msgid " with option {}" +msgstr " amb opció {}" + +msgid "" +"\n" +" Fill the desired values for a new subvolume \n" +msgstr "" +"\n" +" Completeu els valors desitjats per a un nou subvolum\n" + +msgid "Subvolume name " +msgstr "Nom del subvolum " + +msgid "Subvolume mountpoint" +msgstr "Punt de muntatge del subvolum" + +msgid "Subvolume options" +msgstr "Opcions del subvolum" + +msgid "Save" +msgstr "Guardar" + +msgid "Subvolume name :" +msgstr "Nom del subvolum :" + +msgid "Select a mount point :" +msgstr "Seleccioneu un punt de muntatge :" + +msgid "Select the desired subvolume options " +msgstr "Seleccioneu les opcions de subvolum desitjades " + +msgid "Define users with sudo privilege, by username: " +msgstr "Definiu usuaris amb privilegi sudo, per nom d'usuari: " + +msgid "[!] A log file has been created here: {}" +msgstr "[!] S'ha creat un fitxer de registre aquí: {}" + +msgid "Would you like to use BTRFS subvolumes with a default structure?" +msgstr "Us agradaria utilitzar subvolums BTRFS amb una estructura predeterminada?" + +msgid "Would you like to use BTRFS compression?" +msgstr "Us agradaria utilitzar la compressió BTRFS?" + +msgid "Would you like to create a separate partition for /home?" +msgstr "Us agradaria crear una partició separada per a /home?" + +msgid "The selected drives do not have the minimum capacity required for an automatic suggestion\n" +msgstr "Les unitats seleccionades no tenen la capacitat mínima requerida per una recomanació automàtica\n" + +msgid "Minimum capacity for /home partition: {}GB\n" +msgstr "Capacitat mínima per la partició /home: {}GB\n" + +msgid "Minimum capacity for Arch Linux partition: {}GB" +msgstr "Capacitat mínima per la partició Arch Linux: {}GB" + +msgid "Continue" +msgstr "Continuar" + +msgid "yes" +msgstr "sí" + +msgid "no" +msgstr "no" + +msgid "set: {}" +msgstr "establir: {}" + +msgid "Manual configuration setting must be a list" +msgstr "La configuració manual ha de ser una llista" + +msgid "No iface specified for manual configuration" +msgstr "No s'ha especificat iface per a la configuració manual" + +msgid "Manual nic configuration with no auto DHCP requires an IP address" +msgstr "La configuració manual de la NIC sense DHCP automàtic necessita una direcció IP" + +msgid "Add interface" +msgstr "Afegir interfície" + +msgid "Edit interface" +msgstr "Editar interfície" + +msgid "Delete interface" +msgstr "Eliminar interfície" + +msgid "Select interface to add" +msgstr "Seleccioneu la interfície a afegir" + +msgid "Manual configuration" +msgstr "Configuració manual" + +msgid "Mark/Unmark a partition as compressed (btrfs only)" +msgstr "Marcar/Desmarcar una partició com a comprimida (només btrfs)" + +msgid "The password you are using seems to be weak, are you sure you want to use it?" +msgstr "La contrasenya que esteu utilitzant sembla dèbil, segur que voleu utilitzar-la?" + +msgid "Provides a selection of desktop environments and tiling window managers, e.g. gnome, kde, sway" +msgstr "Proporciona una selecció d'entorns d'escriptori i gestors de finestres en mosaic, com ara gnome, kde, sway" + +msgid "Select your desired desktop environment" +msgstr "Seleccioneu el vostre entorn d'escriptori desitjat" + +msgid "A very basic installation that allows you to customize Arch Linux as you see fit." +msgstr "Una instal·lació molt bàsica que us permet personalitzar Arch Linux com us sembli millor." + +msgid "Provides a selection of various server packages to install and enable, e.g. httpd, nginx, mariadb" +msgstr "Proporciona una selecció de varis paquets de servidor per a instal·lar i habilitar, com ara httpd, nginx, mariadb" + +msgid "Choose which servers to install, if none then a minimal installation will be done" +msgstr "Escolliu quins servidors instal·lar. Si no n'hi ha cap, es farà una instal·lació mínima" + +msgid "Installs a minimal system as well as xorg and graphics drivers." +msgstr "Instal·la un sistema mínim, així com controladors xorg i gràfics." + +msgid "Press Enter to continue." +msgstr "Polseu Enter per a continuar." + +msgid "Would you like to chroot into the newly created installation and perform post-installation configuration?" +msgstr "Us agradaria accedir a la instal·lació acabada de crear i realitzar la configuració posterior a la instal·lació?" + +msgid "Are you sure you want to reset this setting?" +msgstr "Segur que voleu re-establir aquesta configuració?" + +msgid "Select one or more hard drives to use and configure\n" +msgstr "Seleccioneu un o més discos durs per a utilitzar i configurar\n" + +msgid "Any modifications to the existing setting will reset the disk layout!" +msgstr "Qualsevol modificació a la configuració existent re-establirà el disseny del disc!" + +msgid "If you reset the harddrive selection this will also reset the current disk layout. Are you sure?" +msgstr "Si re-establiu la selecció del disc dur, això també reiniciarà el disseny actual del disc. N'esteu segurs?" + +msgid "Save and exit" +msgstr "Guardar i sortir" + +msgid "" +"{}\n" +"contains queued partitions, this will remove those, are you sure?" +msgstr "" +"{}\n" +"conté particions a la cua, això les eliminarà, n'esteu segurs?" + +msgid "No audio server" +msgstr "Sense servidor d'àudio" + +msgid "(default)" +msgstr "(per defecte)" + +msgid "Use ESC to skip" +msgstr "Utilitzeu ESC per a ometre" + +msgid "" +"Use CTRL+C to reset current selection\n" +"\n" +msgstr "" +"Utilitzeu CTRL+C per reiniciar la selecció actual\n" +"\n" + +msgid "Copy to: " +msgstr "Copiar a: " + +msgid "Edit: " +msgstr "Editar: " + +msgid "Key: " +msgstr "Clau: " + +msgid "Edit {}: " +msgstr "Editar {}: " + +msgid "Add: " +msgstr "Afegir: " + +msgid "Value: " +msgstr "Valor: " + +msgid "You can skip selecting a drive and partitioning and use whatever drive-setup is mounted at /mnt (experimental)" +msgstr "Podeu ometre la selecció d'una unitat i la partició i utilitzar qualsevol configuració d'unitat que estigui muntada a /mnt (experimental)" + +msgid "Select one of the disks or skip and use /mnt as default" +msgstr "Seleccioneu un dels discs o ometeu i utilitzeu /mnt com a predeterminat" + +msgid "Select which partitions to mark for formatting:" +msgstr "Seleccioneu quines particions marcar per a formatar:" + +msgid "Use HSM to unlock encrypted drive" +msgstr "Utilitzar HSM per desbloquejar la unitat xifrada" + +msgid "Device" +msgstr "Dispositiu" + +msgid "Size" +msgstr "Mida" + +msgid "Free space" +msgstr "Espai lliure" + +msgid "Bus-type" +msgstr "Tipus de bus" + +msgid "Either root-password or at least 1 user with sudo privileges must be specified" +msgstr "S'ha d'especificar una contrasenya de root o un mínim d'un usuari amb privilegis sudo" + +msgid "Enter username (leave blank to skip): " +msgstr "Introduïu el nom d'usuari (deixeu-ho en blanc per a ometre): " + +msgid "The username you entered is invalid. Try again" +msgstr "El nom d'usuari introduït no és vàlid. Intenteu-ho de nou" + +msgid "Should \"{}\" be a superuser (sudo)?" +msgstr "Cal que \"{}\" sigui un superusuari (sudo)?" + +msgid "Select which partitions to encrypt" +msgstr "Seleccioneu quines particions xifrar" + +msgid "very weak" +msgstr "molt dèbil" + +msgid "weak" +msgstr "dèbil" + +msgid "moderate" +msgstr "moderada" + +msgid "strong" +msgstr "forta" + +msgid "Add subvolume" +msgstr "Afegir subvolum" + +msgid "Edit subvolume" +msgstr "Editar subvolum" + +msgid "Delete subvolume" +msgstr "Eliminar subvolum" + +msgid "Configured {} interfaces" +msgstr "{} interfícies configurades" + +msgid "This option enables the number of parallel downloads that can occur during installation" +msgstr "Aquesta opció habilita el número de descàrregues paral·leles que poden haver-hi durant la instal·lació" + +msgid "" +"Enter the number of parallel downloads to be enabled.\n" +" (Enter a value between 1 to {})\n" +"Note:" +msgstr "" +"Introduïu el número de descàrregues paral·leles a activar.\n" +" (Introduïu un valor entre 1 i {})\n" +"Nota:" + +msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {} downloads at a time )" +msgstr " - Valor màxim : {} ( Permet {} descàrregues paral·leles, permet {} descàrregues simultànies )" + +msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a time )" +msgstr " - Valor mínim : 1 ( Permet 1 descàrrega paral·lela, permet 2 descàrregues simultànies )" + +msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )" +msgstr " - Deshabilitar/Per defecte : 0 ( Desactiva les descàrregues paral·leles, només permet 1 descàrrega simultània )" + +#, python-brace-format +msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]" +msgstr "Entrada no vàlida! Intenteu-ho novament amb una entrada vàlida [1 a {max_downloads}, o 0 per desactivar]" + +msgid "Parallel Downloads" +msgstr "Descàrregues paral·leles" + +msgid "ESC to skip" +msgstr "ESC per a ometre" + +msgid "CTRL+C to reset" +msgstr "CTRL+C per a re-establir" + +msgid "TAB to select" +msgstr "TAB per a seleccionar" + +msgid "[Default value: 0] > " +msgstr "[Valor per defecte: 0] > " + +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "Per a poder utilitzar aquesta traducció, instal·leu manualment una font que suporti l'idioma." + +msgid "The font should be stored as {}" +msgstr "La font s'ha de guardar com a {}" + +msgid "Archinstall requires root privileges to run. See --help for more." +msgstr "Archinstall necessita permisos de root per a executar-se. Vegeu --help per a més detalls." + +msgid "Select an execution mode" +msgstr "Seleccioneu un mode d'execució" + +msgid "Unable to fetch profile from specified url: {}" +msgstr "No es pot recuperar el perfil de la URL especificada: {}" + +msgid "Profiles must have unique name, but profile definitions with duplicate name found: {}" +msgstr "Els perfils han de tenir un nom únic, però s'han trobat definicions de perfil amb noms duplicats: {}" + +msgid "Select one or more devices to use and configure" +msgstr "Seleccioneu un o més dispositius per a utilitzar i configurar" + +msgid "If you reset the device selection this will also reset the current disk layout. Are you sure?" +msgstr "Si re-establiu la selecció del dispositiu, això també en re-establirà el seu disseny actual. N'esteu segurs?" + +msgid "Existing Partitions" +msgstr "Particions existents" + +msgid "Select a partitioning option" +msgstr "Seleccioneu una opció de partició" + +msgid "Enter the root directory of the mounted devices: " +msgstr "Introduïu el directori arrel dels dispositius muntats: " + +msgid "Minimum capacity for /home partition: {}GiB\n" +msgstr "Capacitat mínima per a la partició /home: {}GiB\n" + +msgid "Minimum capacity for Arch Linux partition: {}GiB" +msgstr "Capacitat mínima per a la partició Arch Linux: {}GiB" + +msgid "This is a list of pre-programmed profiles_bck, they might make it easier to install things like desktop environments" +msgstr "Aquesta és una llista de profiles_bck preprogramada que podria facilitar la instal·lació de coses com ara entorns d'escriptori" + +msgid "Current profile selection" +msgstr "Selecció de perfil actual" + +msgid "Remove all newly added partitions" +msgstr "Eliminar totes les particions afegides recentment" + +msgid "Assign mountpoint" +msgstr "Assignar punt de muntatge" + +msgid "Mark/Unmark to be formatted (wipes data)" +msgstr "Marcar/Desmarcar per a formatar (esborra les dades)" + +msgid "Mark/Unmark as bootable" +msgstr "Marcar/Desmarcar com a arranc" + +msgid "Change filesystem" +msgstr "Canviar el sistema de fitxers" + +msgid "Mark/Unmark as compressed" +msgstr "Marcar/Desmarcar com a comprimit" + +msgid "Set subvolumes" +msgstr "Establir subvolums" + +msgid "Delete partition" +msgstr "Eliminar partició" + +msgid "Partition" +msgstr "Partició" + +msgid "This partition is currently encrypted, to format it a filesystem has to be specified" +msgstr "Aquesta partició està actualment xifrada, cal especificar un sistema de fitxers per a formatar-la" + +msgid "Partition mount-points are relative to inside the installation, the boot would be /boot as an example." +msgstr "Els punts de muntatge de la partició són relatius a l'interior de la instal·lació; per exemple, /boot seria l'arranc." + +msgid "If mountpoint /boot is set, then the partition will also be marked as bootable." +msgstr "Si s'estableix el punt de muntatge /boot, la partició també es marcarà com a partició d'arranc." + +msgid "Mountpoint: " +msgstr "Punt de muntatge: " + +msgid "Current free sectors on device {}:" +msgstr "Sectors lliures actuals al dispositiu {}:" + +msgid "Total sectors: {}" +msgstr "Sectors totals: {}" + +msgid "Enter the start sector (default: {}): " +msgstr "Introduïu el sector d'inici (per defecte: {}): " + +msgid "Enter the end sector of the partition (percentage or block number, default: {}): " +msgstr "Introduïu el sector final de la partició (percentatge o número de bloc, per defecte: {}): " + +msgid "This will remove all newly added partitions, continue?" +msgstr "Això eliminarà totes les particions recentment afegides, continuar?" + +msgid "Partition management: {}" +msgstr "Gestió de particions: {}" + +msgid "Total length: {}" +msgstr "Llargada total: {}" + +msgid "Encryption type" +msgstr "Tipus de xifrat" + +msgid "Partitions" +msgstr "Particions" + +msgid "No HSM devices available" +msgstr "No hi ha dispositius HSM disponibles" + +msgid "Partitions to be encrypted" +msgstr "Particions a xifrar" + +msgid "Select disk encryption option" +msgstr "Seleccioneu la opció de xifrat de disc" + +msgid "Select a FIDO2 device to use for HSM" +msgstr "Seleccioneu un dispositiu FIDO2 per a utilitzar amb HSM" + +msgid "Use a best-effort default partition layout" +msgstr "Utilitzar un disseny de partició òptim perdeterminat" + +msgid "Manual Partitioning" +msgstr "Partició manual" + +msgid "Pre-mounted configuration" +msgstr "Configuració premuntada" + +msgid "Unknown" +msgstr "Desconegut" + +msgid "Partition encryption" +msgstr "Xifrat de partició" + +msgid " ! Formatting {} in " +msgstr " ! Formatant {} en " + +msgid "← Back" +msgstr "← Tornar" + +msgid "Disk encryption" +msgstr "Xifrat de disc" + +msgid "Configuration" +msgstr "Configuració" + +msgid "Password" +msgstr "Contrasenya" + +msgid "All settings will be reset, are you sure?" +msgstr "Tots els ajusts es reiniciaran, n'esteu segurs?" + +msgid "Back" +msgstr "Tornar" + +msgid "Please chose which greeter to install for the chosen profiles: {}" +msgstr "Si us plau, seleccioneu quin gestor d'inici de sessió instal·lar pels perfils escollits: {}" + +msgid "Environment type: {}" +msgstr "Tipus d'entorn: {}" + +msgid "The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues, are you okay with that?" +msgstr "El controlador propietari d'Nvidia no és compatible amb sway. És possible que experimenteu problemes. Voleu continuar?" + +msgid "Installed packages" +msgstr "Paquets instal·lats" + +msgid "Add profile" +msgstr "Afegir perfil" + +msgid "Edit profile" +msgstr "Editar perfil" + +msgid "Delete profile" +msgstr "Eliminar perfil" + +msgid "Profile name: " +msgstr "Nom del perfil: " + +msgid "The profile name you entered is already in use. Try again" +msgstr "El nom de perfil que heu introduït ja està en ús. Intenteu-ho de nou" + +msgid "Packages to be install with this profile (space separated, leave blank to skip): " +msgstr "Paquets que s'instal·laran amb aquest perfil (separats per espais, deixeu-ho en blanc per a ometre): " + +msgid "Services to be enabled with this profile (space separated, leave blank to skip): " +msgstr "Serveis que s'habilitaran amb aquest perfil (separats per espais, deixeu-ho en blanc per a ometre): " + +msgid "Should this profile be enabled for installation?" +msgstr "Cal habilitar aquest perfil per la instal·lació?" + +msgid "Create your own" +msgstr "Creeu el vostre propi" + +msgid "" +"\n" +"Select a graphics driver or leave blank to install all open-source drivers" +msgstr "" +"\n" +"Seleccioneu un controlador gràfic o deixeu-ho en blanc per instal·lar tots els controladors de codi obert" + +msgid "Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" +msgstr "Sway necessita accés als vostres dispositius de hardware (teclat, ratolí, etc)" + +msgid "" +"\n" +"\n" +"Choose an option to give Sway access to your hardware" +msgstr "" +"\n" +"\n" +"Escolliu una opció per permetre que Sway accedeixi al vostre hardware" + +msgid "Graphics driver" +msgstr "Controlador de gràfics" + +msgid "Greeter" +msgstr "Gestor d'inici de sessió" + +msgid "Please chose which greeter to install" +msgstr "Si us plau, escolliu quin gestor d'inici de sessió instal·lar" + +msgid "This is a list of pre-programmed default_profiles" +msgstr "Això és una llista de default_profiles preprogramada" + +msgid "Disk configuration" +msgstr "Configuració del disc" + +msgid "Profiles" +msgstr "Perfils" + +msgid "Finding possible directories to save configuration files ..." +msgstr "Buscant possibles directoris on guardar els fitxers de configuració ..." + +msgid "Select directory (or directories) for saving configuration files" +msgstr "Seleccioneu un directori (o directoris) on guardar els fitxers de configuració" + +msgid "Add a custom mirror" +msgstr "Afegir un mirall personalitzat" + +msgid "Change custom mirror" +msgstr "Canviar mirall personalitzat" + +msgid "Delete custom mirror" +msgstr "Eliminar mirall personalitzat" + +msgid "Enter name (leave blank to skip): " +msgstr "Introduïu el nom: (deixeu-ho en blanc per a ometre): " + +msgid "Enter url (leave blank to skip): " +msgstr "Introduïu la URL (deixeu-ho en blanc per a ometre): " + +msgid "Select signature check option" +msgstr "Seleccioneu la opció de verificació de firma" + +msgid "Select signature option" +msgstr "Seleccioneu la opció de firma" + +msgid "Custom mirrors" +msgstr "Miralls personalitzats" + +msgid "Defined" +msgstr "Definit" + +msgid "Save user configuration (including disk layout)" +msgstr "Guardar la configuració de l'usuari (incloent el disseny del disc)" + +msgid "" +"Enter a directory for the configuration(s) to be saved (tab completion enabled)\n" +"Save directory: " +msgstr "" +"Introduïu un directori on guardar les configuracions (compleció amb TAB activada)\n" +"Directori d'emmagatzematge: " + +msgid "" +"Do you want to save {} configuration file(s) in the following location?\n" +"\n" +"{}" +msgstr "" +"Voleu guardar {} fitxer(s) de configuració a la següent ubicació?\n" +"\n" +"{}" + +msgid "Saving {} configuration files to {}" +msgstr "Guardant {} fitxer(s) de configuració a {}" + +msgid "Mirrors" +msgstr "Miralls" + +msgid "Mirror regions" +msgstr "Regions dels miralls" + +msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {max_downloads+1} downloads at a time )" +msgstr " - Valor màxim : {} ( Permet {} descàrregues paral·leles, permets {max_downloads+1} descàrregues simultànies )" + +msgid "Invalid input! Try again with a valid input [1 to {}, or 0 to disable]" +msgstr "Entrada no vàlida! Intenteu-ho de nou amb una entrada vàlida [1 a {}, o 0 per desactivar]" + +msgid "Locales" +msgstr "Llocs" + +msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)" +msgstr "Utilitzar NetworkManager (necessari per a configurar internet gràficament a GNOME i KDE)" + +msgid "Total: {} / {}" +msgstr "Total: {} / {}" + +msgid "All entered values can be suffixed with a unit: B, KB, KiB, MB, MiB..." +msgstr "Tots els valors introduïts poden tenir una unitat com a sufix: B, KB, KiB, MB, MiB..." + +msgid "If no unit is provided, the value is interpreted as sectors" +msgstr "Si no es proporciona cap unitat, el valor s'interpreta com sectors" + +msgid "Enter start (default: sector {}): " +msgstr "Introduïu l'inici (per defecte: sector {}): " + +msgid "Enter end (default: {}): " +msgstr "Introduïu el final (per defecte: {}): " + +msgid "Unable to determine fido2 devices. Is libfido2 installed?" +msgstr "No es poden determinar els dispositius fido2. Està instal·lat libfido2?" + +msgid "Path" +msgstr "Ruta" + +msgid "Manufacturer" +msgstr "Fabricant" + +msgid "Product" +msgstr "Producte" + +#, python-brace-format +msgid "Invalid configuration: {error}" +msgstr "Configuració no vàlida: {error}" + +msgid "Type" +msgstr "Tipus" + +msgid "This option enables the number of parallel downloads that can occur during package downloads" +msgstr "Aquesta opció habilita el número de descàrregues paral·leles que poden haver-hi mentre es descarreguen paquets" + +msgid "" +"Enter the number of parallel downloads to be enabled.\n" +"\n" +"Note:\n" +msgstr "" +"Introduïu el número de descàrregues paral·leles a activar.\n" +"\n" +"Nota:\n" + +msgid " - Maximum recommended value : {} ( Allows {} parallel downloads at a time )" +msgstr " - Valor màxim recomanat : {} ( Permets {} descàrregues paral·leles simultànies )" + +msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )\n" +msgstr " - Desactivar/Per defecte : 0 ( Desactiva les descàrregues paral·leles, només permet 1 descàrrega simultània )\n" + +msgid "Invalid input! Try again with a valid input [or 0 to disable]" +msgstr "Entrada no vàlida! Intenteu-ho de nou amb una entrada vàlida [o 0 per a desactivar]" + +msgid "Hyprland needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" +msgstr "Hyprland necessita accés al vostre seient (col·lecció de dispositius de hardware, és a dir, teclat, ratolí, etc)" + +msgid "" +"\n" +"\n" +"Choose an option to give Hyprland access to your hardware" +msgstr "" +"\n" +"\n" +"Escolliu una opció per permetre a Hyprland l'accés al vostre hardware" + +msgid "All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..." +msgstr "Tots els valors introduïts poden tenir un sufix d'unitat: %, B, KB, KiB, MB, MiB..." + +msgid "Would you like to use unified kernel images?" +msgstr "Us agradaria utilitzar imatges del kernel unificades?" + +msgid "Unified kernel images" +msgstr "Imatges del kernel unificades" + +msgid "Waiting for time sync (timedatectl show) to complete." +msgstr "Esperant a què es completi la sincronització de l'hora (timedatectl show)." + +msgid "Time syncronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" +msgstr "La sincronització d'hora no es completa. Mentre espereu - consulteu la documentació per a trobar solucions: https://archinstall.readthedocs.io/" + +msgid "Skipping waiting for automatic time sync (this can cause issues if time is out of sync during installation)" +msgstr "Ometent l'espera de la sincronització automàtica de l'hora (això pot causar problemes si l'hora no està sincronitzada durant la instal·lació)" + +msgid "Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." +msgstr "Esperant a què es completi la sincronització del clauer d'Arch Linux (archlinux-keyring-wkd-sync)." + +msgid "Selected profiles: " +msgstr "Perfils seleccionats: " + +msgid "Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" +msgstr "La sincronització d'hora no es completa. Mentre espereu - consulteu la documentació per a trobar solucions: https://archinstall.readthedocs.io/" + +msgid "Mark/Unmark as nodatacow" +msgstr "Marcar/Desmarcar com nodatacow" + +msgid "Would you like to use compression or disable CoW?" +msgstr "Us agradaria utilitzar compressió o desactivar CoW?" + +msgid "Use compression" +msgstr "Utilitzar compressió" + +msgid "Disable Copy-on-Write" +msgstr "Desactivar Copy-on-Write" + +msgid "Provides a selection of desktop environments and tiling window managers, e.g. GNOME, KDE Plasma, Sway" +msgstr "Proporciona una selecció d'entorns d'escriptori i gestors de finestres en mosaic, com ara GNOME, KDE Plasma, Sway" + +msgid "Configuration type: {}" +msgstr "Tipus de configuració: {}" + +msgid "LVM configuration type" +msgstr "Tipus de configuració LVM" + +msgid "LVM disk encryption with more than 2 partitions is currently not supported" +msgstr "Actualment no s'admet el xifrat de disc LVM amb més de 2 particions" + +msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)" +msgstr "Utilitzar NetworkManager (necessari per a configurar internet gràficament a GNOME i KDE Plasma)" + +msgid "Select a LVM option" +msgstr "Seleccionar una opció LVM" + +msgid "Partitioning" +msgstr "Particionament" + +msgid "Logical Volume Management (LVM)" +msgstr "Gestió de volums lògics (LVM)" + +msgid "Physical volumes" +msgstr "Volums físics" + +msgid "Volumes" +msgstr "Volums" + +msgid "LVM volumes" +msgstr "Volums LVM" + +msgid "LVM volumes to be encrypted" +msgstr "Volums LVM a xifrar" + +msgid "Select which LVM volumes to encrypt" +msgstr "Seleccioneu quins volums LVM cal xifrar" + +msgid "Default layout" +msgstr "Disseny predeterminat" + +msgid "No Encryption" +msgstr "Sense xifrat" + +msgid "LUKS" +msgstr "LUKS" + +msgid "LVM on LUKS" +msgstr "LVM en LUKS" + +msgid "LUKS on LVM" +msgstr "LUKS en LVM" + +msgid "Yes" +msgstr "Sí" + +msgid "No" +msgstr "No" + +msgid "Archinstall help" +msgstr "Ajuda d'Archinstall" + +msgid " (default)" +msgstr " (predeterminat)" + +msgid "Press Ctrl+h for help" +msgstr "Polseu Ctrl+h per ajuda" diff --git a/archinstall/locales/cs/LC_MESSAGES/base.mo b/archinstall/locales/cs/LC_MESSAGES/base.mo index 310e04f180..7cb44093f4 100644 Binary files a/archinstall/locales/cs/LC_MESSAGES/base.mo and b/archinstall/locales/cs/LC_MESSAGES/base.mo differ diff --git a/archinstall/locales/cs/LC_MESSAGES/base.po b/archinstall/locales/cs/LC_MESSAGES/base.po index d6c768d0d8..752f8ec006 100644 --- a/archinstall/locales/cs/LC_MESSAGES/base.po +++ b/archinstall/locales/cs/LC_MESSAGES/base.po @@ -1218,104 +1218,89 @@ msgstr "Přeskakuji čekání na automatickou synchronizaci času (nesynchronizo msgid "Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." msgstr "Čekám na dokončení synchronizace Arch Linux keyring (archlinux-keyring-wkd-sync)." -#, fuzzy msgid "Selected profiles: " -msgstr "Smazat profil" +msgstr "Vybrané profily: " -#, fuzzy msgid "Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" msgstr "Synchronizace času není dokončena, mezitím se můžete podívat na možnosti řešení: https://archinstall.readthedocs.io/" -#, fuzzy msgid "Mark/Unmark as nodatacow" -msgstr "Označit/Odznačit jako zaváděcí" +msgstr "Označit/Odznačit jako nodatacow" -#, fuzzy msgid "Would you like to use compression or disable CoW?" -msgstr "Přejete si použít BTRFS kompresi?" +msgstr "Přejete si použít kompresi nebo zakázat CoW?" msgid "Use compression" -msgstr "" +msgstr "Použít kompresi" msgid "Disable Copy-on-Write" -msgstr "" +msgstr "Zakázat Copy-on-Write" -#, fuzzy msgid "Provides a selection of desktop environments and tiling window managers, e.g. GNOME, KDE Plasma, Sway" -msgstr "Nabízí výběr desktopových prostředí a tiling správců oken, např. gnome, kde, sway" +msgstr "Nabízí výběr desktopových prostředí a dlaždicových správců oken, např. GNOME, KDE Plasma, Sway" -#, fuzzy msgid "Configuration type: {}" -msgstr "Konfigurace" +msgstr "Typ konfigurace: {}" -#, fuzzy msgid "LVM configuration type" -msgstr "Žádná konfigurace" +msgstr "Typ LVM konfigurace" msgid "LVM disk encryption with more than 2 partitions is currently not supported" -msgstr "" +msgstr "LVM šifrování disku s více jak dvěma oddíly není v tuto chvíli podporováno" -#, fuzzy msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)" -msgstr "Použít NetworkManager (potřebné pro grafickou konfiguraci v GNOME a KDE)" +msgstr "Použít NetworkManager (neubytné pro grafickou konfiguraci inernetu v GNOME a KDE)" -#, fuzzy msgid "Select a LVM option" -msgstr "Zvolte časovou zónu" +msgstr "Vyberte možnost LVM" -#, fuzzy msgid "Partitioning" -msgstr "Diskový oddíl" +msgstr "Rozdělení diskových oddílů" msgid "Logical Volume Management (LVM)" -msgstr "" +msgstr "Logical Volume Management (LVM)" msgid "Physical volumes" -msgstr "" +msgstr "Fyzické svazky" msgid "Volumes" -msgstr "" +msgstr "Svazky" -#, fuzzy msgid "LVM volumes" -msgstr "Nastavit podsvazky" +msgstr "LVM svazky" -#, fuzzy msgid "LVM volumes to be encrypted" -msgstr "Zvolte oddíl k zašifrování" +msgstr "LVM svazky k zašifrování" -#, fuzzy msgid "Select which LVM volumes to encrypt" -msgstr "Zvolte oddíl, který bude označen jako šifrovaný" +msgstr "Zvolte LVM svazky k zašifrování" -#, fuzzy msgid "Default layout" -msgstr "Rozdělení disku" +msgstr "Výchozí rozložení" -#, fuzzy msgid "No Encryption" -msgstr "Typ šifrování" +msgstr "Žádné šifrování" msgid "LUKS" -msgstr "" +msgstr "LUKS" msgid "LVM on LUKS" -msgstr "" +msgstr "LVM na LUKS" msgid "LUKS on LVM" -msgstr "" +msgstr "LUKS na LVM" -#, fuzzy msgid "Yes" -msgstr "ano" +msgstr "Ano" msgid "No" -msgstr "" +msgstr "Ne" -#, fuzzy msgid "Archinstall help" -msgstr "Jazyk pro Archinstall" +msgstr "Nápověda pro Archinstall" -#, fuzzy msgid " (default)" -msgstr "(výchozí)" +msgstr " (výchozí)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/de/LC_MESSAGES/base.mo b/archinstall/locales/de/LC_MESSAGES/base.mo index 7dda3e368b..3955e9bf5c 100644 Binary files a/archinstall/locales/de/LC_MESSAGES/base.mo and b/archinstall/locales/de/LC_MESSAGES/base.mo differ diff --git a/archinstall/locales/de/LC_MESSAGES/base.po b/archinstall/locales/de/LC_MESSAGES/base.po index abf3fb74c1..5adcbdb9fb 100644 --- a/archinstall/locales/de/LC_MESSAGES/base.po +++ b/archinstall/locales/de/LC_MESSAGES/base.po @@ -1144,10 +1144,10 @@ msgid "Total: {} / {}" msgstr "Gesamtlänge: {}" msgid "All entered values can be suffixed with a unit: B, KB, KiB, MB, MiB..." -msgstr "" +msgstr "Alle eingegebenen Werte können mit einer Einheit angegeben werden: B, KB, KiB, MB, MiB..." msgid "If no unit is provided, the value is interpreted as sectors" -msgstr "" +msgstr "Wenn keine Einheit angegeben wurde, wird der Wert als Sektoren interpretiert." #, fuzzy msgid "Enter start (default: sector {}): " @@ -1158,23 +1158,23 @@ msgid "Enter end (default: {}): " msgstr "Bitte geben Sie den Startsektor ein (Standard: {}): " msgid "Unable to determine fido2 devices. Is libfido2 installed?" -msgstr "" +msgstr "Fehler beim Finden der fido2 Geräte. Ist libfido2 installiert?" msgid "Path" -msgstr "" +msgstr "Pfad" msgid "Manufacturer" -msgstr "" +msgstr "Hersteller" msgid "Product" -msgstr "" +msgstr "Produkt" #, fuzzy, python-brace-format msgid "Invalid configuration: {error}" msgstr "Manuelle Konfiguration" msgid "Type" -msgstr "" +msgstr "Typ" #, fuzzy msgid "This option enables the number of parallel downloads that can occur during package downloads" @@ -1188,7 +1188,7 @@ msgid "" msgstr "" "Geben Sie die Nummer an parallelen Downloads an.\n" " (Wert zwischen 1 und {max_downloads})\n" -"Achtung:" +"Achtung:\n" #, fuzzy msgid " - Maximum recommended value : {} ( Allows {} parallel downloads at a time )" @@ -1214,36 +1214,36 @@ msgid "" msgstr "" "\n" "\n" -"Option auswählen, um Sway Zugriff auf deine Hardware zu geben" +"Option auswählen, um Hyprland Zugriff auf deine Hardware zu geben" msgid "All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..." -msgstr "" +msgstr "Alle eingegebenen Werte können mit einer Einheit angegeben werden: %, B, KB, KiB, MB, Mib" #, fuzzy msgid "Would you like to use unified kernel images?" msgstr "Möchten Sie Auslagerungsspeicher (Swap) als zram verwenden?" msgid "Unified kernel images" -msgstr "" +msgstr "Vereinigte Kernel-Images" msgid "Waiting for time sync (timedatectl show) to complete." -msgstr "" +msgstr "Warte auf fertigstellung Zeitsynchronisierung (timedatectl show)." msgid "Time syncronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" -msgstr "" +msgstr "Zeitsynchronisierung wird nicht fertig, während du wartest, lies dir die Dokumentation für Umgehungen dieses Fehlers durch: https://archinstall.readthedocs.io/" msgid "Skipping waiting for automatic time sync (this can cause issues if time is out of sync during installation)" -msgstr "" +msgstr "Überspringe warten auf die Automatische Zeitsynchronisierung (dies kann Fehler verursachen, wenn die Zeit während der Installation nicht synchronisiert ist.)" msgid "Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." -msgstr "" +msgstr "Warte auf Arch Linux keyring synchronisation (archlinux-keyring-wkd-sync)." #, fuzzy msgid "Selected profiles: " msgstr "Profil entfernen" msgid "Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" -msgstr "" +msgstr "Zeitsynchronisierung wird nicht fertig, während du wartest, lies dir die Dokumentation für Umgehungen dieses Fehlers durch: https://archinstall.readthedocs.io/" #, fuzzy msgid "Mark/Unmark as nodatacow" @@ -1254,10 +1254,10 @@ msgid "Would you like to use compression or disable CoW?" msgstr "Möchten sie btrfs Komprimierung verwenden?" msgid "Use compression" -msgstr "" +msgstr "Kompriemirung verwenden" msgid "Disable Copy-on-Write" -msgstr "" +msgstr "Copy-on-Write deaktivieren" #, fuzzy msgid "Provides a selection of desktop environments and tiling window managers, e.g. GNOME, KDE Plasma, Sway" @@ -1272,7 +1272,7 @@ msgid "LVM configuration type" msgstr "Keine Konfiguration" msgid "LVM disk encryption with more than 2 partitions is currently not supported" -msgstr "" +msgstr "LVM-Verschlüsselung ist derzeit nicht mit mehr als 2 Partitionen unterstützt" #, fuzzy msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)" @@ -1287,13 +1287,13 @@ msgid "Partitioning" msgstr "Partition" msgid "Logical Volume Management (LVM)" -msgstr "" +msgstr "Logisches Volumenmanagement (LVM)" msgid "Physical volumes" -msgstr "" +msgstr "Physisches Volumen" msgid "Volumes" -msgstr "" +msgstr "Volumen" #, fuzzy msgid "LVM volumes" @@ -1316,20 +1316,20 @@ msgid "No Encryption" msgstr "Verschlüsselungstyp" msgid "LUKS" -msgstr "" +msgstr "LUKS" msgid "LVM on LUKS" -msgstr "" +msgstr "LVM auf LUKS" msgid "LUKS on LVM" -msgstr "" +msgstr "LUKS auf LVM" #, fuzzy msgid "Yes" msgstr "Ja" msgid "No" -msgstr "" +msgstr "Nein" #, fuzzy msgid "Archinstall help" @@ -1338,3 +1338,6 @@ msgstr "Sprache für Archinstall" #, fuzzy msgid " (default)" msgstr "(Standard)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/el/LC_MESSAGES/base.po b/archinstall/locales/el/LC_MESSAGES/base.po index 332423874a..c2de4ea36a 100644 --- a/archinstall/locales/el/LC_MESSAGES/base.po +++ b/archinstall/locales/el/LC_MESSAGES/base.po @@ -1381,3 +1381,6 @@ msgstr "Γλώσσα archinstall" #, fuzzy msgid " (default)" msgstr "(προκαθορισμένο)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/en/LC_MESSAGES/base.po b/archinstall/locales/en/LC_MESSAGES/base.po index a9f29fa255..3ba590611d 100644 --- a/archinstall/locales/en/LC_MESSAGES/base.po +++ b/archinstall/locales/en/LC_MESSAGES/base.po @@ -1244,3 +1244,6 @@ msgstr "" msgid " (default)" msgstr "" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/es/LC_MESSAGES/base.mo b/archinstall/locales/es/LC_MESSAGES/base.mo index 3c7554cc12..4ff9eeefc0 100644 Binary files a/archinstall/locales/es/LC_MESSAGES/base.mo and b/archinstall/locales/es/LC_MESSAGES/base.mo differ diff --git a/archinstall/locales/es/LC_MESSAGES/base.po b/archinstall/locales/es/LC_MESSAGES/base.po index 268c3fb04f..e8b28d41d1 100644 --- a/archinstall/locales/es/LC_MESSAGES/base.po +++ b/archinstall/locales/es/LC_MESSAGES/base.po @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.4.4\n" +"X-Generator: Poedit 3.4.2\n" msgid "[!] A log file has been created here: {} {}" msgstr "[!] Se ha creado un archivo de registro aquí: {} {}" @@ -24,7 +24,7 @@ msgid "And one more time for verification: " msgstr "Una vez más para verificar: " msgid "Would you like to use swap on zram?" -msgstr "¿Te gustaría usar swap en zram?" +msgstr "¿Le gustaría usar swap en zram?" msgid "Desired hostname for the installation: " msgstr "Nombre de host deseado para la instalación: " @@ -367,7 +367,7 @@ msgid "Enter a password: " msgstr "Ingrese una contraseña: " msgid "Enter a encryption password for {}" -msgstr "Introduzca una contraseña de cifrado para {}" +msgstr "Ingrese una contraseña de cifrado para {}" msgid "Enter disk encryption password (leave blank for no encryption): " msgstr "Ingrese la contraseña de cifrado de disco (deje en blanco para no cifrar): " @@ -385,7 +385,7 @@ msgid "Verifying that additional packages exist (this might take a few seconds)" msgstr "Verificando que los paquetes adicionales existen (esto puede tardar unos segundos)" msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n" -msgstr "Te gustaría utilizar la sincronización automática de hora (NTP) con los servidores de hora predeterminados?\n" +msgstr "Le gustaría utilizar la sincronización automática de hora (NTP) con los servidores de hora predeterminados?\n" msgid "" "Hardware time and other post-configuration steps might be required in order for NTP to work.\n" @@ -591,7 +591,7 @@ msgid "Would you like to use BTRFS subvolumes with a default structure?" msgstr "¿Le gustaría utilizar subvolúmenes BTRFS con una estructura predeterminada?" msgid "Would you like to use BTRFS compression?" -msgstr "¿Te gustaría usar la compresión BTRFS?" +msgstr "¿Le gustaría usar la compresión BTRFS?" msgid "Would you like to create a separate partition for /home?" msgstr "¿Le gustaría crear una partición separada para /home?" @@ -990,7 +990,7 @@ msgid "Back" msgstr "Regresar" msgid "Please chose which greeter to install for the chosen profiles: {}" -msgstr "Por favor, elija qué saludador instalar para los perfiles elegidos: {}" +msgstr "Por favor, elija qué gestor de inicio de sesión instalar para los perfiles elegidos: {}" msgid "Environment type: {}" msgstr "Tipo de entorno: {}" @@ -1051,10 +1051,10 @@ msgid "Graphics driver" msgstr "Controlador de gráficos" msgid "Greeter" -msgstr "Saludador" +msgstr "Gestor de inicio de sesión" msgid "Please chose which greeter to install" -msgstr "Por favor, elija qué saludador instalar" +msgstr "Por favor, elija qué gestor de inicio de sesión instalar" msgid "This is a list of pre-programmed default_profiles" msgstr "Esta es una lista de default_profiles preprogramados" @@ -1262,7 +1262,6 @@ msgstr "Usar NetworkManager (necesario para configurar internet gráficamente en msgid "Select a LVM option" msgstr "Seleccione una opción LVM" -#, fuzzy msgid "Partitioning" msgstr "Particionamiento" @@ -1311,6 +1310,9 @@ msgstr "Ayuda de archinstall" msgid " (default)" msgstr " (predeterminado)" +msgid "Press Ctrl+h for help" +msgstr "Presione Ctrl+h para obtener ayuda" + #~ msgid "Add :" #~ msgstr "Añadir :" diff --git a/archinstall/locales/et/LC_MESSAGES/base.po b/archinstall/locales/et/LC_MESSAGES/base.po index 2bb9834895..b697c8ac30 100644 --- a/archinstall/locales/et/LC_MESSAGES/base.po +++ b/archinstall/locales/et/LC_MESSAGES/base.po @@ -1355,3 +1355,6 @@ msgstr "Archinstalli keel" #, fuzzy msgid " (default)" msgstr "(vaikimisi)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/fi/LC_MESSAGES/base.po b/archinstall/locales/fi/LC_MESSAGES/base.po index dec628f0f7..a336d106b3 100644 --- a/archinstall/locales/fi/LC_MESSAGES/base.po +++ b/archinstall/locales/fi/LC_MESSAGES/base.po @@ -1324,3 +1324,6 @@ msgstr "Archinstall kieli" #, fuzzy msgid " (default)" msgstr "(oletus)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/fr/LC_MESSAGES/base.po b/archinstall/locales/fr/LC_MESSAGES/base.po index 69e356dec3..2b12064113 100644 --- a/archinstall/locales/fr/LC_MESSAGES/base.po +++ b/archinstall/locales/fr/LC_MESSAGES/base.po @@ -14,12 +14,8 @@ msgstr "" msgid "[!] A log file has been created here: {} {}" msgstr "[!] Un fichier journal a été créé ici : {} {}" -msgid "" -" Please submit this issue (and file) to https://github.com/archlinux/" -"archinstall/issues" -msgstr "" -" Veuillez soumettre ce problème (et le fichier) à https://github.com/" -"archlinux/archinstall/issues" +msgid " Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues" +msgstr " Veuillez soumettre ce problème (et le fichier) à https://github.com/archlinux/archinstall/issues" msgid "Do you really want to abort?" msgstr "Voulez-vous vraiment abandonner ?" @@ -34,13 +30,10 @@ msgid "Desired hostname for the installation: " msgstr "Nom d'hôte souhaité pour l'installation : " msgid "Username for required superuser with sudo privileges: " -msgstr "" -"Nom d'utilisateur pour le superutilisateur requis avec les privilèges sudo : " +msgstr "Nom d'utilisateur pour le superutilisateur requis avec les privilèges sudo : " msgid "Any additional users to install (leave blank for no users): " -msgstr "" -"Utilisateur supplémentaire à installer (laisser vide pour aucun " -"utilisateur) : " +msgstr "Utilisateur supplémentaire à installer (laisser vide pour aucun utilisateur) : " msgid "Should this user be a superuser (sudoer)?" msgstr "Cet utilisateur doit-il être un superutilisateur (sudoer) ?" @@ -49,9 +42,7 @@ msgid "Select a timezone" msgstr "Sélectionner un fuseau horaire" msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?" -msgstr "" -"Souhaitez-vous utiliser GRUB comme chargeur de démarrage au lieu de systemd-" -"boot ?" +msgstr "Souhaitez-vous utiliser GRUB comme chargeur de démarrage au lieu de systemd-boot ?" msgid "Choose a bootloader" msgstr "Choisir un chargeur de démarrage" @@ -59,60 +50,38 @@ msgstr "Choisir un chargeur de démarrage" msgid "Choose an audio server" msgstr "Choisir un serveur audio" -msgid "" -"Only packages such as base, base-devel, linux, linux-firmware, efibootmgr " -"and optional profile packages are installed." -msgstr "" -"Seuls les paquets tels que base, base-devel, linux, linux-firmware, " -"efibootmgr et les paquets de profil optionnels sont installés." +msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr and optional profile packages are installed." +msgstr "Seuls les paquets tels que base, base-devel, linux, linux-firmware, efibootmgr et les paquets de profil optionnels sont installés." -msgid "" -"If you desire a web browser, such as firefox or chromium, you may specify it " -"in the following prompt." -msgstr "" -"Si vous désirez un navigateur Web, tel que firefox ou chrome, vous pouvez le " -"spécifier dans l'invite suivante." +msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt." +msgstr "Si vous désirez un navigateur Web, tel que firefox ou chrome, vous pouvez le spécifier dans l'invite suivante." -msgid "" -"Write additional packages to install (space separated, leave blank to skip): " -msgstr "" -"Saisir les paquets supplémentaires à installer (séparés par des espaces, " -"vide pour ignorer) : " +msgid "Write additional packages to install (space separated, leave blank to skip): " +msgstr "Saisir les paquets supplémentaires à installer (séparés par des espaces, vide pour ignorer) : " msgid "Copy ISO network configuration to installation" msgstr "Copier la configuration réseau ISO dans l'installation" -msgid "" -"Use NetworkManager (necessary for configuring internet graphically in GNOME " -"and KDE)" -msgstr "" -"Utiliser NetworkManager (nécessaire pour configurer graphiquement Internet " -"dans GNOME et KDE)" +msgid "Use NetworkManager (necessary for configuring internet graphically in GNOME and KDE)" +msgstr "Utiliser NetworkManager (nécessaire pour configurer graphiquement Internet dans GNOME et KDE)" msgid "Select one network interface to configure" msgstr "Sélectionner une interface réseau à configurer" -msgid "" -"Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" -msgstr "" -"Sélectionner le mode à configurer pour \"{}\" ou ignorer pour utiliser le " -"mode par défaut \"{}\"" +msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" +msgstr "Sélectionner le mode à configurer pour \"{}\" ou ignorer pour utiliser le mode par défaut \"{}\"" msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " msgstr "Entrer l'IP et le sous-réseau pour {} (exemple : 192.168.0.5/24) : " msgid "Enter your gateway (router) IP address or leave blank for none: " -msgstr "" -"Entrer l'adresse IP de votre passerelle (routeur) ou laisser vide pour " -"aucune : " +msgstr "Entrer l'adresse IP de votre passerelle (routeur) ou laisser vide pour aucune : " msgid "Enter your DNS servers (space separated, blank for none): " msgstr "Entrer vos serveurs DNS (séparés par des espaces, vide pour aucun) : " msgid "Select which filesystem your main partition should use" -msgstr "" -"Sélectionner le système de fichiers que votre partition principale doit " -"utiliser" +msgstr "Sélectionner le système de fichiers que votre partition principale doit utiliser" msgid "Current partition layout" msgstr "Disposition actuelle des partitions" @@ -127,21 +96,14 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Entrer un type de système de fichiers souhaité pour la partition" -msgid "" -"Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " -msgstr "" -"Entrer l'emplacement de départ (en unités séparées : s, Go, %, etc. ; par " -"défaut : {}) : " +msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "Entrer l'emplacement de départ (en unités séparées : s, Go, %, etc. ; par défaut : {}) : " msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " -msgstr "" -"Entrer l'emplacement de fin (en unités séparées : s, Go, %, etc. ; ex : " -"{}) : " +msgstr "Entrer l'emplacement de fin (en unités séparées : s, Go, %, etc. ; ex : {}) : " msgid "{} contains queued partitions, this will remove those, are you sure?" -msgstr "" -"{} contient des partitions en file d'attente, cela les supprimera, êtes-vous " -"sûr ?" +msgstr "{} contient des partitions en file d'attente, cela les supprimera, êtes-vous sûr ?" msgid "" "{}\n" @@ -161,17 +123,11 @@ msgstr "" "\n" "Sélectionner par index où et quelle partition montée" -msgid "" -" * Partition mount-points are relative to inside the installation, the boot " -"would be /boot as an example." -msgstr "" -" * Les points de montage de la partition sont relatifs à l'intérieur de " -"l'installation, le démarrage serait /boot par exemple." +msgid " * Partition mount-points are relative to inside the installation, the boot would be /boot as an example." +msgstr " * Les points de montage de la partition sont relatifs à l'intérieur de l'installation, le démarrage serait /boot par exemple." msgid "Select where to mount partition (leave blank to remove mountpoint): " -msgstr "" -"Sélectionner où monter la partition (laisser vide pour supprimer le point de " -"montage) : " +msgstr "Sélectionner où monter la partition (laisser vide pour supprimer le point de montage) : " msgid "" "{}\n" @@ -216,58 +172,34 @@ msgid "Archinstall language" msgstr "Langue d'Archinstall" msgid "Wipe all selected drives and use a best-effort default partition layout" -msgstr "" -"Effacer tous les lecteurs sélectionnés et utiliser une disposition de " -"partition par défaut optimale" +msgstr "Effacer tous les lecteurs sélectionnés et utiliser une disposition de partition par défaut optimale" -msgid "" -"Select what to do with each individual drive (followed by partition usage)" -msgstr "" -"Sélectionner ce qu'il faut faire avec chaque lecteur individuel (suivi de " -"l'utilisation de la partition)" +msgid "Select what to do with each individual drive (followed by partition usage)" +msgstr "Sélectionner ce qu'il faut faire avec chaque lecteur individuel (suivi de l'utilisation de la partition)" msgid "Select what you wish to do with the selected block devices" -msgstr "" -"Sélectionner ce que vous souhaitez faire avec les périphériques de bloc " -"sélectionnés" +msgstr "Sélectionner ce que vous souhaitez faire avec les périphériques de bloc sélectionnés" -msgid "" -"This is a list of pre-programmed profiles, they might make it easier to " -"install things like desktop environments" -msgstr "" -"Ceci est une liste préprogrammée de profiles, ils pourraient faciliter " -"l'installation d'outils comme les environnements de bureau" +msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments" +msgstr "Ceci est une liste préprogrammée de profiles, ils pourraient faciliter l'installation d'outils comme les environnements de bureau" msgid "Select keyboard layout" msgstr "Sélectionner la disposition du clavier" msgid "Select one of the regions to download packages from" -msgstr "" -"Sélectionner l'une des régions depuis lesquelles télécharger les paquets" +msgstr "Sélectionner l'une des régions depuis lesquelles télécharger les paquets" msgid "Select one or more hard drives to use and configure" msgstr "Sélectionner un ou plusieurs disques durs à utiliser et à configurer" -msgid "" -"For the best compatibility with your AMD hardware, you may want to use " -"either the all open-source or AMD / ATI options." -msgstr "" -"Pour une meilleure compatibilité avec votre matériel AMD, vous pouvez " -"utiliser les options entièrement open source ou AMD / ATI." +msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options." +msgstr "Pour une meilleure compatibilité avec votre matériel AMD, vous pouvez utiliser les options entièrement open source ou AMD / ATI." -msgid "" -"For the best compatibility with your Intel hardware, you may want to use " -"either the all open-source or Intel options.\n" -msgstr "" -"Pour une compatibilité optimale avec votre matériel Intel, vous pouvez " -"utiliser les options entièrement open source ou Intel.\n" +msgid "For the best compatibility with your Intel hardware, you may want to use either the all open-source or Intel options.\n" +msgstr "Pour une compatibilité optimale avec votre matériel Intel, vous pouvez utiliser les options entièrement open source ou Intel.\n" -msgid "" -"For the best compatibility with your Nvidia hardware, you may want to use " -"the Nvidia proprietary driver.\n" -msgstr "" -"Pour une meilleure compatibilité avec votre matériel Nvidia, vous pouvez " -"utiliser le pilote propriétaire Nvidia.\n" +msgid "For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n" +msgstr "Pour une meilleure compatibilité avec votre matériel Nvidia, vous pouvez utiliser le pilote propriétaire Nvidia.\n" msgid "" "\n" @@ -276,8 +208,7 @@ msgid "" msgstr "" "\n" "\n" -"Sélectionner un pilote graphique ou laisser vide pour installer tous les " -"pilotes open-source" +"Sélectionner un pilote graphique ou laisser vide pour installer tous les pilotes open-source" msgid "All open-source (default)" msgstr "Tout open-source (par défaut)" @@ -300,12 +231,8 @@ msgstr "Sélectionner une ou plusieurs des options ci-dessous : " msgid "Adding partition...." msgstr "Ajout de la partition...." -msgid "" -"You need to enter a valid fs-type in order to continue. See `man parted` for " -"valid fs-type's." -msgstr "" -"Vous devez entrer un type de fs valide pour continuer. Voir `man parted` " -"pour les types de fs valides." +msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's." +msgstr "Vous devez entrer un type de fs valide pour continuer. Voir `man parted` pour les types de fs valides." msgid "Error: Listing profiles on URL \"{}\" resulted in:" msgstr "Erreur : la liste des profils sur l'URL \"{}\" a entraîné :" @@ -378,8 +305,7 @@ msgid "" msgstr "" "Vous avez décidé d'ignorer la sélection du disque dur\n" "et vous utiliserez la configuration de disque montée sur {} (expérimental)\n" -"ATTENTION : Archinstall ne vérifiera pas l'adéquation de cette " -"configuration\n" +"ATTENTION : Archinstall ne vérifiera pas l'adéquation de cette configuration\n" "Souhaitez-vous continuer ?" msgid "Re-using partition instance: {}" @@ -404,8 +330,7 @@ msgid "Mark/Unmark a partition as encrypted" msgstr "Marquer/Démarquer une partition comme chiffrée" msgid "Mark/Unmark a partition as bootable (automatic for /boot)" -msgstr "" -"Marquer/Démarquer une partition comme amorçable (automatique pour /boot)" +msgstr "Marquer/Démarquer une partition comme amorçable (automatique pour /boot)" msgid "Set desired filesystem for a partition" msgstr "Définir le système de fichiers souhaité pour une partition" @@ -445,9 +370,7 @@ msgid "Enter a encryption password for {}" msgstr "Entrer un mot de passe de chiffrement pour {}" msgid "Enter disk encryption password (leave blank for no encryption): " -msgstr "" -"Entrer le mot de passe de chiffrement du disque (laisser vide pour aucun " -"chiffrement) : " +msgstr "Entrer le mot de passe de chiffrement du disque (laisser vide pour aucun chiffrement) : " msgid "Create a required super-user with sudo privileges: " msgstr "Créer un super-utilisateur requis avec les privilèges sudo : " @@ -458,44 +381,31 @@ msgstr "Entrer le mot de passe root (laisser vide pour désactiver root) : " msgid "Password for user \"{}\": " msgstr "Mot de passe pour l'utilisateur \"{}\" : " -msgid "" -"Verifying that additional packages exist (this might take a few seconds)" -msgstr "" -"Vérifier que des paquets supplémentaires existent (cela peut prendre " -"quelques secondes)" +msgid "Verifying that additional packages exist (this might take a few seconds)" +msgstr "Vérifier que des paquets supplémentaires existent (cela peut prendre quelques secondes)" -msgid "" -"Would you like to use automatic time synchronization (NTP) with the default " -"time servers?\n" -msgstr "" -"Souhaitez-vous utiliser la synchronisation automatique de l'heure (NTP) avec " -"les serveurs de temps par défaut ?\n" +msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n" +msgstr "Souhaitez-vous utiliser la synchronisation automatique de l'heure (NTP) avec les serveurs de temps par défaut ?\n" msgid "" -"Hardware time and other post-configuration steps might be required in order " -"for NTP to work.\n" +"Hardware time and other post-configuration steps might be required in order for NTP to work.\n" "For more information, please check the Arch wiki" msgstr "" -"Le temps matériel et d'autres étapes de post-configuration peuvent être " -"nécessaires pour que NTP fonctionne.\n" +"Le temps matériel et d'autres étapes de post-configuration peuvent être nécessaires pour que NTP fonctionne.\n" "Pour plus d'informations, veuillez consulter le wiki Arch" msgid "Enter a username to create an additional user (leave blank to skip): " -msgstr "" -"Entrer un nom d'utilisateur pour créer un utilisateur supplémentaire " -"(laisser vide pour ignorer) : " +msgstr "Entrer un nom d'utilisateur pour créer un utilisateur supplémentaire (laisser vide pour ignorer) : " msgid "Use ESC to skip\n" msgstr "Utiliser ESC pour ignorer\n" msgid "" "\n" -" Choose an object from the list, and select one of the available actions for " -"it to execute" +" Choose an object from the list, and select one of the available actions for it to execute" msgstr "" "\n" -"Choisir un objet dans la liste et sélectionner l'une des actions disponibles " -"pour qu'il s'exécute" +"Choisir un objet dans la liste et sélectionner l'une des actions disponibles pour qu'il s'exécute" msgid "Cancel" msgstr "Annuler" @@ -531,18 +441,11 @@ msgstr "" "\n" "Voici la configuration choisie :" -msgid "" -"Pacman is already running, waiting maximum 10 minutes for it to terminate." -msgstr "" -"Pacman est déjà en cours d'exécution, attendez au maximum 10 minutes pour " -"qu'il se termine." +msgid "Pacman is already running, waiting maximum 10 minutes for it to terminate." +msgstr "Pacman est déjà en cours d'exécution, attendez au maximum 10 minutes pour qu'il se termine." -msgid "" -"Pre-existing pacman lock never exited. Please clean up any existing pacman " -"sessions before using archinstall." -msgstr "" -"Le verrou pacman préexistant n'a jamais été fermé. Veuillez nettoyer toutes " -"les sessions pacman existantes avant d'utiliser archinstall." +msgid "Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall." +msgstr "Le verrou pacman préexistant n'a jamais été fermé. Veuillez nettoyer toutes les sessions pacman existantes avant d'utiliser archinstall." msgid "Choose which optional additional repositories to enable" msgstr "Choisir les dépôts supplémentaires en option à activer" @@ -679,16 +582,13 @@ msgid "Select the desired subvolume options " msgstr "Sélectionner les options de sous-volume souhaitées " msgid "Define users with sudo privilege, by username: " -msgstr "" -"Définir les utilisateurs avec le privilège sudo, par nom d'utilisateur : " +msgstr "Définir les utilisateurs avec le privilège sudo, par nom d'utilisateur : " msgid "[!] A log file has been created here: {}" msgstr "[!] Un fichier journal a été créé ici : {}" msgid "Would you like to use BTRFS subvolumes with a default structure?" -msgstr "" -"Souhaitez-vous utiliser des sous-volumes BTRFS avec une structure par " -"défaut ?" +msgstr "Souhaitez-vous utiliser des sous-volumes BTRFS avec une structure par défaut ?" msgid "Would you like to use BTRFS compression?" msgstr "Souhaitez-vous utiliser la compression BTRFS ?" @@ -696,12 +596,8 @@ msgstr "Souhaitez-vous utiliser la compression BTRFS ?" msgid "Would you like to create a separate partition for /home?" msgstr "Souhaitez-vous créer une partition séparée pour /home ?" -msgid "" -"The selected drives do not have the minimum capacity required for an " -"automatic suggestion\n" -msgstr "" -"Les disques sélectionnés n'ont pas la capacité minimale requise pour une " -"suggestion automatique\n" +msgid "The selected drives do not have the minimum capacity required for an automatic suggestion\n" +msgstr "Les disques sélectionnés n'ont pas la capacité minimale requise pour une suggestion automatique\n" msgid "Minimum capacity for /home partition: {}GB\n" msgstr "Capacité minimale pour la partition /home : {} Go\n" @@ -728,9 +624,7 @@ msgid "No iface specified for manual configuration" msgstr "Aucun iface spécifié pour la configuration manuelle" msgid "Manual nic configuration with no auto DHCP requires an IP address" -msgstr "" -"La configuration manuelle de la carte réseau sans DHCP automatique nécessite " -"une adresse IP" +msgstr "La configuration manuelle de la carte réseau sans DHCP automatique nécessite une adresse IP" msgid "Add interface" msgstr "Ajouter une interface" @@ -750,42 +644,23 @@ msgstr "Configuration manuelle" msgid "Mark/Unmark a partition as compressed (btrfs only)" msgstr "Marquer/Démarquer une partition comme compressée (btrfs uniquement)" -msgid "" -"The password you are using seems to be weak, are you sure you want to use it?" -msgstr "" -"Le mot de passe que vous utilisez semble faible, êtes-vous sûr de vouloir " -"l'utiliser ?" +msgid "The password you are using seems to be weak, are you sure you want to use it?" +msgstr "Le mot de passe que vous utilisez semble faible, êtes-vous sûr de vouloir l'utiliser ?" -msgid "" -"Provides a selection of desktop environments and tiling window managers, e." -"g. gnome, kde, sway" -msgstr "" -"Fournit une sélection d'environnements de bureau et de gestionnaires de " -"fenêtres en mosaïque, par ex. gnome, kde, sway" +msgid "Provides a selection of desktop environments and tiling window managers, e.g. gnome, kde, sway" +msgstr "Fournit une sélection d'environnements de bureau et de gestionnaires de fenêtres en mosaïque, par ex. gnome, kde, sway" msgid "Select your desired desktop environment" msgstr "Sélectionner l'environnement de bureau souhaité" -msgid "" -"A very basic installation that allows you to customize Arch Linux as you see " -"fit." -msgstr "" -"Une installation très basique qui vous permet de personnaliser Arch Linux " -"comme bon vous semble." +msgid "A very basic installation that allows you to customize Arch Linux as you see fit." +msgstr "Une installation très basique qui vous permet de personnaliser Arch Linux comme bon vous semble." -msgid "" -"Provides a selection of various server packages to install and enable, e.g. " -"httpd, nginx, mariadb" -msgstr "" -"Fournit une sélection de divers paquets de serveur à installer et à activer, " -"par ex. httpd, nginx, mariadb" +msgid "Provides a selection of various server packages to install and enable, e.g. httpd, nginx, mariadb" +msgstr "Fournit une sélection de divers paquets de serveur à installer et à activer, par ex. httpd, nginx, mariadb" -msgid "" -"Choose which servers to install, if none then a minimal installation will be " -"done" -msgstr "" -"Choisir les serveurs à installer, s'il n'y en a pas, une installation " -"minimale sera effectuée" +msgid "Choose which servers to install, if none then a minimal installation will be done" +msgstr "Choisir les serveurs à installer, s'il n'y en a pas, une installation minimale sera effectuée" msgid "Installs a minimal system as well as xorg and graphics drivers." msgstr "Installe un système minimal ainsi que les pilotes graphiques et xorg." @@ -793,12 +668,8 @@ msgstr "Installe un système minimal ainsi que les pilotes graphiques et xorg." msgid "Press Enter to continue." msgstr "Appuyer sur Entrée pour continuer." -msgid "" -"Would you like to chroot into the newly created installation and perform " -"post-installation configuration?" -msgstr "" -"Souhaitez-vous chrooter dans l'installation nouvellement créée et effectuer " -"la configuration post-installation ?" +msgid "Would you like to chroot into the newly created installation and perform post-installation configuration?" +msgstr "Souhaitez-vous chrooter dans l'installation nouvellement créée et effectuer la configuration post-installation ?" msgid "Are you sure you want to reset this setting?" msgstr "Voulez-vous vraiment réinitialiser ce paramètre ?" @@ -807,16 +678,10 @@ msgid "Select one or more hard drives to use and configure\n" msgstr "Sélectionner un ou plusieurs disques durs à utiliser et à configurer\n" msgid "Any modifications to the existing setting will reset the disk layout!" -msgstr "" -"Toute modification du paramètre existant réinitialisera la disposition du " -"disque !" +msgstr "Toute modification du paramètre existant réinitialisera la disposition du disque !" -msgid "" -"If you reset the harddrive selection this will also reset the current disk " -"layout. Are you sure?" -msgstr "" -"Si vous réinitialisez la sélection du disque dur, cela réinitialisera " -"également la disposition actuelle du disque. Êtes-vous sûr ?" +msgid "If you reset the harddrive selection this will also reset the current disk layout. Are you sure?" +msgstr "Si vous réinitialisez la sélection du disque dur, cela réinitialisera également la disposition actuelle du disque. Êtes-vous sûr ?" msgid "Save and exit" msgstr "Sauvegarder et quitter" @@ -826,8 +691,7 @@ msgid "" "contains queued partitions, this will remove those, are you sure?" msgstr "" "{}\n" -"contient des partitions en file d'attente, cela les supprimera, êtes-vous " -"sûr ?" +"contient des partitions en file d'attente, cela les supprimera, êtes-vous sûr ?" msgid "No audio server" msgstr "Pas de serveur audio" @@ -863,13 +727,8 @@ msgstr "Ajouter : " msgid "Value: " msgstr "Valeur : " -msgid "" -"You can skip selecting a drive and partitioning and use whatever drive-setup " -"is mounted at /mnt (experimental)" -msgstr "" -"Vous pouvez ignorer la sélection d'un lecteur et le partitionnement et " -"utiliser n'importe quelle configuration de lecteur montée sur /mnt " -"(expérimental)" +msgid "You can skip selecting a drive and partitioning and use whatever drive-setup is mounted at /mnt (experimental)" +msgstr "Vous pouvez ignorer la sélection d'un lecteur et le partitionnement et utiliser n'importe quelle configuration de lecteur montée sur /mnt (expérimental)" msgid "Select one of the disks or skip and use /mnt as default" msgstr "Sélectionner l'un des disques ou ignorer et utiliser /mnt par défaut" @@ -892,12 +751,8 @@ msgstr "Espace libre" msgid "Bus-type" msgstr "Type de bus" -msgid "" -"Either root-password or at least 1 user with sudo privileges must be " -"specified" -msgstr "" -"Le mot de passe root ou au moins 1 utilisateur avec des privilèges sudo doit " -"être spécifié" +msgid "Either root-password or at least 1 user with sudo privileges must be specified" +msgstr "Le mot de passe root ou au moins 1 utilisateur avec des privilèges sudo doit être spécifié" msgid "Enter username (leave blank to skip): " msgstr "Entrer le nom d'utilisateur (laisser vide pour passer) : " @@ -935,12 +790,8 @@ msgstr "Supprimer le sous-volume" msgid "Configured {} interfaces" msgstr "Interfaces {} configurées" -msgid "" -"This option enables the number of parallel downloads that can occur during " -"installation" -msgstr "" -"Cette option active le nombre de téléchargements parallèles qui peuvent se " -"produire pendant l'installation" +msgid "This option enables the number of parallel downloads that can occur during installation" +msgstr "Cette option active le nombre de téléchargements parallèles qui peuvent se produire pendant l'installation" msgid "" "Enter the number of parallel downloads to be enabled.\n" @@ -951,34 +802,18 @@ msgstr "" " (Entrer une valeur comprise entre 1 et {})\n" "Note :" -msgid "" -" - Maximum value : {} ( Allows {} parallel downloads, allows {} downloads " -"at a time )" -msgstr "" -" - Valeur maximale : {} (Autorise {} téléchargements parallèles, autorise {} " -"téléchargements à la fois)" +msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {} downloads at a time )" +msgstr " - Valeur maximale : {} (Autorise {} téléchargements parallèles, autorise {} téléchargements à la fois)" -msgid "" -" - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a " -"time )" -msgstr "" -" - Valeur minimale : 1 (Autorise 1 téléchargement parallèle, autorise 2 " -"téléchargements à la fois)" +msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a time )" +msgstr " - Valeur minimale : 1 (Autorise 1 téléchargement parallèle, autorise 2 téléchargements à la fois)" -msgid "" -" - Disable/Default : 0 ( Disables parallel downloading, allows only 1 " -"download at a time )" -msgstr "" -" - Désactiver/Défaut : 0 (Désactive le téléchargement parallèle, n'autorise " -"qu'un seul téléchargement à la fois)" +msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )" +msgstr " - Désactiver/Défaut : 0 (Désactive le téléchargement parallèle, n'autorise qu'un seul téléchargement à la fois)" #, python-brace-format -msgid "" -"Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to " -"disable]" -msgstr "" -"Entrée invalide ! Réessayer avec une entrée valide [1 pour {max_downloads}, " -"ou 0 pour désactiver]" +msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]" +msgstr "Entrée invalide ! Réessayer avec une entrée valide [1 pour {max_downloads}, ou 0 pour désactiver]" msgid "Parallel Downloads" msgstr "Téléchargements parallèles" @@ -995,20 +830,14 @@ msgstr "TAB pour sélectionner" msgid "[Default value: 0] > " msgstr "[Valeur par défaut : 0] > " -msgid "" -"To be able to use this translation, please install a font manually that " -"supports the language." -msgstr "" -"Pour pouvoir utiliser cette traduction, veuillez installer manuellement une " -"police prenant en charge la langue." +msgid "To be able to use this translation, please install a font manually that supports the language." +msgstr "Pour pouvoir utiliser cette traduction, veuillez installer manuellement une police prenant en charge la langue." msgid "The font should be stored as {}" msgstr "La police doit être stockée sous {}" msgid "Archinstall requires root privileges to run. See --help for more." -msgstr "" -"Archinstall nécessite des privilèges root pour s'exécuter. Voir l'aide pour " -"plus d'informations (--help)." +msgstr "Archinstall nécessite des privilèges root pour s'exécuter. Voir l'aide pour plus d'informations (--help)." msgid "Select an execution mode" msgstr "Sélectionner un mode d'exécution" @@ -1016,22 +845,14 @@ msgstr "Sélectionner un mode d'exécution" msgid "Unable to fetch profile from specified url: {}" msgstr "Impossible de récupérer le profil à partir de l'URL spécifiée : {}" -msgid "" -"Profiles must have unique name, but profile definitions with duplicate name " -"found: {}" -msgstr "" -"Les profils doivent avoir un nom unique, mais des définitions de profil avec " -"un nom en double ont été trouvées : {}" +msgid "Profiles must have unique name, but profile definitions with duplicate name found: {}" +msgstr "Les profils doivent avoir un nom unique, mais des définitions de profil avec un nom en double ont été trouvées : {}" msgid "Select one or more devices to use and configure" msgstr "Sélectionner un ou plusieurs périphériques à utiliser et à configurer" -msgid "" -"If you reset the device selection this will also reset the current disk " -"layout. Are you sure?" -msgstr "" -"Si vous réinitialisez la sélection de périphérique, cela réinitialisera " -"également la disposition actuelle du disque. Etes-vous sûr ?" +msgid "If you reset the device selection this will also reset the current disk layout. Are you sure?" +msgstr "Si vous réinitialisez la sélection de périphérique, cela réinitialisera également la disposition actuelle du disque. Etes-vous sûr ?" msgid "Existing Partitions" msgstr "Partitions existantes" @@ -1048,12 +869,8 @@ msgstr "Capacité minimale pour la partition /home : {} Gio\n" msgid "Minimum capacity for Arch Linux partition: {}GiB" msgstr "Capacité minimale pour la partition Arch Linux : {} Gio" -msgid "" -"This is a list of pre-programmed profiles_bck, they might make it easier to " -"install things like desktop environments" -msgstr "" -"Ceci est une liste préprogrammée de profiles_bck, ils pourraient faciliter " -"l'installation de choses comme les environnements de bureau" +msgid "This is a list of pre-programmed profiles_bck, they might make it easier to install things like desktop environments" +msgstr "Ceci est une liste préprogrammée de profiles_bck, ils pourraient faciliter l'installation de choses comme les environnements de bureau" msgid "Current profile selection" msgstr "Sélection du profil actuel" @@ -1085,26 +902,14 @@ msgstr "Supprimer la partition" msgid "Partition" msgstr "Partition" -msgid "" -"This partition is currently encrypted, to format it a filesystem has to be " -"specified" -msgstr "" -"Cette partition est actuellement chiffrée, pour la formater, un système de " -"fichiers doit être spécifié" +msgid "This partition is currently encrypted, to format it a filesystem has to be specified" +msgstr "Cette partition est actuellement chiffrée, pour la formater, un système de fichiers doit être spécifié" -msgid "" -"Partition mount-points are relative to inside the installation, the boot " -"would be /boot as an example." -msgstr "" -"Les points de montage de partition sont relatifs à l'intérieur de " -"l'installation, le démarrage serait /boot par exemple." +msgid "Partition mount-points are relative to inside the installation, the boot would be /boot as an example." +msgstr "Les points de montage de partition sont relatifs à l'intérieur de l'installation, le démarrage serait /boot par exemple." -msgid "" -"If mountpoint /boot is set, then the partition will also be marked as " -"bootable." -msgstr "" -"Si le point de montage /boot est défini, la partition sera également marquée " -"comme amorçable." +msgid "If mountpoint /boot is set, then the partition will also be marked as bootable." +msgstr "Si le point de montage /boot est défini, la partition sera également marquée comme amorçable." msgid "Mountpoint: " msgstr "Point de montage : " @@ -1118,17 +923,11 @@ msgstr "Total des secteurs : {}" msgid "Enter the start sector (default: {}): " msgstr "Saisir le secteur de début (par défaut : {}) : " -msgid "" -"Enter the end sector of the partition (percentage or block number, default: " -"{}): " -msgstr "" -"Saisir le secteur de fin de la partition (pourcentage ou numéro de bloc, par " -"défaut : {}) : " +msgid "Enter the end sector of the partition (percentage or block number, default: {}): " +msgstr "Saisir le secteur de fin de la partition (pourcentage ou numéro de bloc, par défaut : {}) : " msgid "This will remove all newly added partitions, continue?" -msgstr "" -"Cela supprimera toutes les partitions nouvellement ajoutées, voulez-vous " -"continuer ?" +msgstr "Cela supprimera toutes les partitions nouvellement ajoutées, voulez-vous continuer ?" msgid "Partition management: {}" msgstr "Gestion des partitions : {}" @@ -1191,19 +990,13 @@ msgid "Back" msgstr "Retour" msgid "Please chose which greeter to install for the chosen profiles: {}" -msgstr "" -"Veuillez choisir le greeter (interface de connexion) à installer pour les " -"profils choisis : {}" +msgstr "Veuillez choisir le greeter (interface de connexion) à installer pour les profils choisis : {}" msgid "Environment type: {}" msgstr "Type d'environnement : {}" -msgid "" -"The proprietary Nvidia driver is not supported by Sway. It is likely that " -"you will run into issues, are you okay with that?" -msgstr "" -"Le pilote Nvidia propriétaire n'est pas pris en charge par Sway. Il est " -"probable que vous rencontriez des problèmes, êtes-vous d'accord avec cela ?" +msgid "The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues, are you okay with that?" +msgstr "Le pilote Nvidia propriétaire n'est pas pris en charge par Sway. Il est probable que vous rencontriez des problèmes, êtes-vous d'accord avec cela ?" msgid "Installed packages" msgstr "Paquets installés" @@ -1221,22 +1014,13 @@ msgid "Profile name: " msgstr "Nom de profil : " msgid "The profile name you entered is already in use. Try again" -msgstr "" -"Le nom de profil que vous avez saisi est déjà utilisé. Essayer à nouveau" +msgstr "Le nom de profil que vous avez saisi est déjà utilisé. Essayer à nouveau" -msgid "" -"Packages to be install with this profile (space separated, leave blank to " -"skip): " -msgstr "" -"Saisir les paquets à installer avec ce profil (séparés par des espaces, vide " -"pour ignorer) : " +msgid "Packages to be install with this profile (space separated, leave blank to skip): " +msgstr "Saisir les paquets à installer avec ce profil (séparés par des espaces, vide pour ignorer) : " -msgid "" -"Services to be enabled with this profile (space separated, leave blank to " -"skip): " -msgstr "" -"Saisir les services à activer avec ce profil (séparés par des espaces, vide " -"pour ignorer) : " +msgid "Services to be enabled with this profile (space separated, leave blank to skip): " +msgstr "Saisir les services à activer avec ce profil (séparés par des espaces, vide pour ignorer) : " msgid "Should this profile be enabled for installation?" msgstr "Ce profil doit-il être activé pour l'installation ?" @@ -1249,15 +1033,10 @@ msgid "" "Select a graphics driver or leave blank to install all open-source drivers" msgstr "" "\n" -"Sélectionner un pilote graphique ou laisser vide pour installer tous les " -"pilotes open source" +"Sélectionner un pilote graphique ou laisser vide pour installer tous les pilotes open source" -msgid "" -"Sway needs access to your seat (collection of hardware devices i.e. " -"keyboard, mouse, etc)" -msgstr "" -"Sway a besoin d'accéder à votre espace (ensemble de périphériques " -"matériels : clavier, souris, etc.)" +msgid "Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" +msgstr "Sway a besoin d'accéder à votre espace (ensemble de périphériques matériels : clavier, souris, etc.)" msgid "" "\n" @@ -1287,14 +1066,10 @@ msgid "Profiles" msgstr "Profils" msgid "Finding possible directories to save configuration files ..." -msgstr "" -"Recherche des répertoires possibles pour enregistrer les fichiers de " -"configuration..." +msgstr "Recherche des répertoires possibles pour enregistrer les fichiers de configuration..." msgid "Select directory (or directories) for saving configuration files" -msgstr "" -"Sélectionner le répertoire (ou les répertoires) pour enregistrer les " -"fichiers de configuration" +msgstr "Sélectionner le répertoire (ou les répertoires) pour enregistrer les fichiers de configuration" msgid "Add a custom mirror" msgstr "Ajouter un miroir personnalisé" @@ -1324,16 +1099,13 @@ msgid "Defined" msgstr "Défini" msgid "Save user configuration (including disk layout)" -msgstr "" -"Enregistrer la configuration utilisateur (y compris la disposition du disque)" +msgstr "Enregistrer la configuration utilisateur (y compris la disposition du disque)" msgid "" -"Enter a directory for the configuration(s) to be saved (tab completion " -"enabled)\n" +"Enter a directory for the configuration(s) to be saved (tab completion enabled)\n" "Save directory: " msgstr "" -"Saisir un répertoire pour la/les configuration(s) à enregistrer (complétion " -"par tabulation activée)\n" +"Saisir un répertoire pour la/les configuration(s) à enregistrer (complétion par tabulation activée)\n" "Entrer le nom du répertoire de sauvegarde : " msgid "" @@ -1341,8 +1113,7 @@ msgid "" "\n" "{}" msgstr "" -"Voulez-vous enregistrer {} fichier(s) de configuration à l'emplacement " -"suivant ?\n" +"Voulez-vous enregistrer {} fichier(s) de configuration à l'emplacement suivant ?\n" "\n" "{}" @@ -1355,39 +1126,26 @@ msgstr "Miroirs" msgid "Mirror regions" msgstr "Régions miroir" -msgid "" -" - Maximum value : {} ( Allows {} parallel downloads, allows " -"{max_downloads+1} downloads at a time )" -msgstr "" -" - Valeur maximale : {} (Autorise {} téléchargements parallèles, autorise " -"{max_downloads+1} téléchargements à la fois)" +msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {max_downloads+1} downloads at a time )" +msgstr " - Valeur maximale : {} (Autorise {} téléchargements parallèles, autorise {max_downloads+1} téléchargements à la fois)" msgid "Invalid input! Try again with a valid input [1 to {}, or 0 to disable]" -msgstr "" -"Entrée invalide ! Réessayer avec une entrée valide [1 pour {}, ou 0 pour " -"désactiver]" +msgstr "Entrée invalide ! Réessayer avec une entrée valide [1 pour {}, ou 0 pour désactiver]" msgid "Locales" msgstr "Paramètres régionaux" -msgid "" -"Use NetworkManager (necessary to configure internet graphically in GNOME and " -"KDE)" -msgstr "" -"Utiliser NetworkManager (nécessaire pour configurer graphiquement internet " -"dans GNOME et KDE)" +msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)" +msgstr "Utiliser NetworkManager (nécessaire pour configurer graphiquement internet dans GNOME et KDE)" msgid "Total: {} / {}" msgstr "Total (taille) : {} / {}" msgid "All entered values can be suffixed with a unit: B, KB, KiB, MB, MiB..." -msgstr "" -"Toutes les valeurs saisies peuvent être saccompagnées par une unité : B, KB, " -"KiB, MB, MiB..." +msgstr "Toutes les valeurs saisies peuvent être saccompagnées par une unité : B, KB, KiB, MB, MiB..." msgid "If no unit is provided, the value is interpreted as sectors" -msgstr "" -"Si aucune unité n'est fournie, la valeur est interprétée comme des secteurs\"" +msgstr "Si aucune unité n'est fournie, la valeur est interprétée comme des secteurs\"" msgid "Enter start (default: sector {}): " msgstr "Saisir le secteur de début (par défaut : secteur {}) : " @@ -1396,9 +1154,7 @@ msgid "Enter end (default: {}): " msgstr "Saisir le secteur de fin (par défaut : secteur {}) : " msgid "Unable to determine fido2 devices. Is libfido2 installed?" -msgstr "" -"Impossible de déterminer les appareils fido2. Est-ce que libfido2 est " -"installé ?" +msgstr "Impossible de déterminer les appareils fido2. Est-ce que libfido2 est installé ?" msgid "Path" msgstr "Chemin" @@ -1416,12 +1172,8 @@ msgstr "Configuration invalide : {error}" msgid "Type" msgstr "Type" -msgid "" -"This option enables the number of parallel downloads that can occur during " -"package downloads" -msgstr "" -"Cette option active le nombre de téléchargements parallèles pouvant avoir " -"lieu lors des téléchargements des paquets" +msgid "This option enables the number of parallel downloads that can occur during package downloads" +msgstr "Cette option active le nombre de téléchargements parallèles pouvant avoir lieu lors des téléchargements des paquets" msgid "" "Enter the number of parallel downloads to be enabled.\n" @@ -1432,29 +1184,17 @@ msgstr "" "\n" "Note :\n" -msgid "" -" - Maximum recommended value : {} ( Allows {} parallel downloads at a time )" -msgstr "" -" - Valeur maximale recommandée : {} (Autorise {} téléchargements parallèles " -"à la fois)" +msgid " - Maximum recommended value : {} ( Allows {} parallel downloads at a time )" +msgstr " - Valeur maximale recommandée : {} (Autorise {} téléchargements parallèles à la fois)" -msgid "" -" - Disable/Default : 0 ( Disables parallel downloading, allows only 1 " -"download at a time )\n" -msgstr "" -" - Désactiver/Par défaut : 0 (Désactive le téléchargement parallèle, " -"autorise un seul téléchargement à la fois)\n" +msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )\n" +msgstr " - Désactiver/Par défaut : 0 (Désactive le téléchargement parallèle, autorise un seul téléchargement à la fois)\n" msgid "Invalid input! Try again with a valid input [or 0 to disable]" -msgstr "" -"Entrée invalide ! Réessayer avec une entrée valide [ou 0 pour désactiver]" +msgstr "Entrée invalide ! Réessayer avec une entrée valide [ou 0 pour désactiver]" -msgid "" -"Hyprland needs access to your seat (collection of hardware devices i.e. " -"keyboard, mouse, etc)" -msgstr "" -"Hyprland a besoin d'accéder à votre espace (ensemble de périphériques " -"matériels, par exemple clavier, souris, etc)" +msgid "Hyprland needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" +msgstr "Hyprland a besoin d'accéder à votre espace (ensemble de périphériques matériels, par exemple clavier, souris, etc)" msgid "" "\n" @@ -1465,11 +1205,8 @@ msgstr "" "\n" "Choisir une option pour donner à Hyprland l'accès à votre matériel" -msgid "" -"All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..." -msgstr "" -"Toutes les valeurs saisies peuvent être accompagnées par une unité : %, B, " -"KB, KiB, MB, MiB..." +msgid "All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..." +msgstr "Toutes les valeurs saisies peuvent être accompagnées par une unité : %, B, KB, KiB, MB, MiB..." msgid "Would you like to use unified kernel images?" msgstr "Souhaitez-vous utiliser des images de noyau unifiées ?" @@ -1478,49 +1215,28 @@ msgid "Unified kernel images" msgstr "Images du noyau unifiées" msgid "Waiting for time sync (timedatectl show) to complete." -msgstr "" -"En attente de la fin de la synchronisation de l'heure (timedatectl show)." +msgstr "En attente de la fin de la synchronisation de l'heure (timedatectl show)." -msgid "" -"Time syncronization not completing, while you wait - check the docs for " -"workarounds: https://archinstall.readthedocs.io/" -msgstr "" -"La synchronisation de l'heure ne se termine pas, veuillez consulter la " -"documentation afin de trouver des solutions de contournement : https://" -"archinstall.readthedocs.io/" +msgid "Time syncronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" +msgstr "La synchronisation de l'heure ne se termine pas, veuillez consulter la documentation afin de trouver des solutions de contournement : https://archinstall.readthedocs.io/" -msgid "" -"Skipping waiting for automatic time sync (this can cause issues if time is " -"out of sync during installation)" -msgstr "" -"Ignorer l'attente de la synchronisation automatique de l'heure (cela peut " -"entraîner des problèmes si l'heure n'est pas synchronisée lors de " -"l'installation)" +msgid "Skipping waiting for automatic time sync (this can cause issues if time is out of sync during installation)" +msgstr "Ignorer l'attente de la synchronisation automatique de l'heure (cela peut entraîner des problèmes si l'heure n'est pas synchronisée lors de l'installation)" -msgid "" -"Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." -msgstr "" -"En attente de la fin de la synchronisation du trousseau de clés d'Arch Linux " -"(archlinux-keyring-wkd-sync)." +msgid "Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." +msgstr "En attente de la fin de la synchronisation du trousseau de clés d'Arch Linux (archlinux-keyring-wkd-sync)." msgid "Selected profiles: " msgstr "Profils sélectionnés : " -msgid "" -"Time synchronization not completing, while you wait - check the docs for " -"workarounds: https://archinstall.readthedocs.io/" -msgstr "" -"La synchronisation de l'heure ne se termine pas, veuillez consulter la " -"documentation afin de trouver des solutions de contournement : https://" -"archinstall.readthedocs.io/" +msgid "Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" +msgstr "La synchronisation de l'heure ne se termine pas, veuillez consulter la documentation afin de trouver des solutions de contournement : https://archinstall.readthedocs.io/" msgid "Mark/Unmark as nodatacow" msgstr "Marquer/Démarquer comme nodatacow" msgid "Would you like to use compression or disable CoW?" -msgstr "" -"Souhaitez-vous utiliser la compression ou désactiver la copie à l'écriture " -"(CoW) ?" +msgstr "Souhaitez-vous utiliser la compression ou désactiver la copie à l'écriture (CoW) ?" msgid "Use compression" msgstr "Utiliser la compression" @@ -1528,12 +1244,8 @@ msgstr "Utiliser la compression" msgid "Disable Copy-on-Write" msgstr "Désactiver la copie à l'écriture (CoW)" -msgid "" -"Provides a selection of desktop environments and tiling window managers, e." -"g. GNOME, KDE Plasma, Sway" -msgstr "" -"Fournit une sélection d'environnements de bureau et de gestionnaires de " -"fenêtres en mosaïque, par ex. GNOME, KDE Plasma, Sway" +msgid "Provides a selection of desktop environments and tiling window managers, e.g. GNOME, KDE Plasma, Sway" +msgstr "Fournit une sélection d'environnements de bureau et de gestionnaires de fenêtres en mosaïque, par ex. GNOME, KDE Plasma, Sway" msgid "Configuration type: {}" msgstr "Type de configuration : {}" @@ -1541,18 +1253,11 @@ msgstr "Type de configuration : {}" msgid "LVM configuration type" msgstr "Type de configuration LVM" -msgid "" -"LVM disk encryption with more than 2 partitions is currently not supported" -msgstr "" -"Le chiffrement de disque LVM avec plus de 2 partitions n'est actuellement " -"pas pris en charge" +msgid "LVM disk encryption with more than 2 partitions is currently not supported" +msgstr "Le chiffrement de disque LVM avec plus de 2 partitions n'est actuellement pas pris en charge" -msgid "" -"Use NetworkManager (necessary to configure internet graphically in GNOME and " -"KDE Plasma)" -msgstr "" -"Utiliser NetworkManager (nécessaire pour configurer internet graphiquement " -"dans GNOME et KDE Plasma)" +msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)" +msgstr "Utiliser NetworkManager (nécessaire pour configurer internet graphiquement dans GNOME et KDE Plasma)" msgid "Select a LVM option" msgstr "Sélectionner une option LVM" @@ -1605,6 +1310,9 @@ msgstr "Aide pour Archinstall" msgid " (default)" msgstr " (défaut)" +msgid "Press Ctrl+h for help" +msgstr "" + #, python-brace-format #~ msgid "Edit {origkey} :" #~ msgstr "Modifier {origkey} :" diff --git a/archinstall/locales/he/LC_MESSAGES/base.po b/archinstall/locales/he/LC_MESSAGES/base.po index d49b15ad0b..e9f5bd5c1c 100644 --- a/archinstall/locales/he/LC_MESSAGES/base.po +++ b/archinstall/locales/he/LC_MESSAGES/base.po @@ -1335,3 +1335,6 @@ msgstr "השפה של Archinstall" #, fuzzy msgid " (default)" msgstr "(ברירת מחדל)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/hi/LC_MESSAGES/base.po b/archinstall/locales/hi/LC_MESSAGES/base.po index 1823d9bde5..0472ed3f79 100644 --- a/archinstall/locales/hi/LC_MESSAGES/base.po +++ b/archinstall/locales/hi/LC_MESSAGES/base.po @@ -1246,3 +1246,6 @@ msgstr "" msgid " (default)" msgstr "" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/hu/LC_MESSAGES/base.mo b/archinstall/locales/hu/LC_MESSAGES/base.mo index c74308fa60..f99cc3519c 100644 Binary files a/archinstall/locales/hu/LC_MESSAGES/base.mo and b/archinstall/locales/hu/LC_MESSAGES/base.mo differ diff --git a/archinstall/locales/hu/LC_MESSAGES/base.po b/archinstall/locales/hu/LC_MESSAGES/base.po index 03d61eb561..140835c322 100644 --- a/archinstall/locales/hu/LC_MESSAGES/base.po +++ b/archinstall/locales/hu/LC_MESSAGES/base.po @@ -66,10 +66,10 @@ msgid "Use NetworkManager (necessary for configuring internet graphically in GNO msgstr "A hálózatkezelő használata (szükséges az internet grafikus konfigurálásához GNOME-ban és KDE-ben)" msgid "Select one network interface to configure" -msgstr "Válasszon ki egy hálózati interfészt a konfiguráláshoz" +msgstr "Válasszon ki egy hálózati csatolót a konfiguráláshoz" msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" -msgstr "Válassza ki, hogy melyik módot szeretné beállítani a(z) \"{}\" számára, vagy hagyja ki ezt a lépést az alapértelmezett \"{}\" mód használatához" +msgstr "Válassza ki, hogy melyik módot szeretné beállítani a(z) „{}” számára, vagy hagyja ki ezt a lépést az alapértelmezett „{}” mód használatához" msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " msgstr "Adja meg az IP-címét és az alhálózatát (például: 192.168.0.5/24) ehhez: {}: " @@ -214,7 +214,7 @@ msgid "All open-source (default)" msgstr "Minden nyílt forráskódú (alapértelmezett)" msgid "Choose which kernels to use or leave blank for default \"{}\"" -msgstr "Válassza ki a használni kívánt kerneleket, vagy hagyja üresen a(z) alapértelmezett \"{}\" kernel használatához" +msgstr "Válassza ki a használni kívánt kerneleket, vagy hagyja üresen a(z) alapértelmezett „{}” kernel használatához" msgid "Choose which locale language to use" msgstr "Válassza ki a használni kívánt területi nyelvet" @@ -232,13 +232,13 @@ msgid "Adding partition...." msgstr "Partíció hozzáadása...." msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's." -msgstr "A folytatáshoz meg kell adnia egy érvényes fs-típust. Az érvényes fs-típusokat megtekinthetőek a `man parted` részben." +msgstr "A folytatáshoz meg kell adnia egy érvényes fs-típust. Az érvényes fs-típusokat megtekinthetőek a „man parted” részben." msgid "Error: Listing profiles on URL \"{}\" resulted in:" -msgstr "Hiba: A(z) \"{}\" URL-címen lévő profilok listázása a következőket eredményezte:" +msgstr "Hiba: A(z) „{}” URL-címen lévő profilok listázása a következőket eredményezte:" msgid "Error: Could not decode \"{}\" result as JSON:" -msgstr "Hiba: Nem sikerült dekódolni a(z) \"{}\" eredményt JSON-ként:" +msgstr "Hiba: Nem sikerült dekódolni a(z) „{}” eredményt JSON-ként:" msgid "Keyboard layout" msgstr "Billentyűzetkiosztás" @@ -357,7 +357,7 @@ msgid "" "Use ESC to skip\n" "\n" msgstr "" -"Használja az ESC billentyűt a kihagyáshoz\n" +"ESC → a kihagyáshoz\n" "\n" msgid "Suggest partition layout" @@ -379,7 +379,7 @@ msgid "Enter root password (leave blank to disable root): " msgstr "Adjon meg egy root jelszót (a root letiltásához hagyja üresen): " msgid "Password for user \"{}\": " -msgstr "\"{}\" felhasználó jelszava: " +msgstr "„{}” felhasználó jelszava: " msgid "Verifying that additional packages exist (this might take a few seconds)" msgstr "További csomagok létezésének ellenőrzése (ez eltarthat néhány másodpercig)" @@ -399,7 +399,7 @@ msgstr "Adjon meg egy felhasználónevet egy további felhasználó létrehozás msgid "Use ESC to skip\n" msgstr "" -"Használja az ESC billentyűt a kihagyáshoz\n" +"ESC → a kihagyáshoz\n" "\n" msgid "" @@ -428,7 +428,7 @@ msgid "Delete" msgstr "Törlés" msgid "Select an action for '{}'" -msgstr "Válasszon egy műveletet a következőhöz: '{}'" +msgstr "Válasszon egy műveletet a következőhöz: „{}”" msgid "Copy to new key:" msgstr "Másolás új kulcsba:" @@ -617,7 +617,7 @@ msgid "no" msgstr "nem" msgid "set: {}" -msgstr "beállít: {}" +msgstr "beállítás: {}" msgid "Manual configuration setting must be a list" msgstr "A kézi konfigurációs beállításnak egy listának kell lennie" @@ -629,16 +629,16 @@ msgid "Manual nic configuration with no auto DHCP requires an IP address" msgstr "A kézi nic konfiguráció automatikus DHCP nélkül egy IP-címet igényel" msgid "Add interface" -msgstr "Interfész hozzáadása" +msgstr "Csatoló hozzáadása" msgid "Edit interface" -msgstr "Interfész szerkesztése" +msgstr "Csatoló szerkesztése" msgid "Delete interface" -msgstr "Interfész törlése" +msgstr "Csatoló törlése" msgid "Select interface to add" -msgstr "Válassza ki a hozzáadandó interfészt" +msgstr "Válassza ki a hozzáadandó csatolót" msgid "Manual configuration" msgstr "Kézi konfiguráció" @@ -702,13 +702,13 @@ msgid "(default)" msgstr "(alapértelmezett)" msgid "Use ESC to skip" -msgstr "Használja az ESC billentyűt a kihagyáshoz" +msgstr "ESC → a kihagyáshoz" msgid "" "Use CTRL+C to reset current selection\n" "\n" msgstr "" -"Használja a CTRL+C billentyűkombinációt az aktuális kijelölés visszaállításához\n" +"CTRL+C → az aktuális kijelölés visszaállításához\n" "\n" msgid "Copy to: " @@ -751,7 +751,7 @@ msgid "Free space" msgstr "Szabad terület" msgid "Bus-type" -msgstr "Bus-típus" +msgstr "Busz-típus" msgid "Either root-password or at least 1 user with sudo privileges must be specified" msgstr "Meg kell adni egy root jelszót, vagy legalább 1 sudo jogosultsággal rendelkező felhasználót" @@ -763,7 +763,7 @@ msgid "The username you entered is invalid. Try again" msgstr "A megadott felhasználónév érvénytelen. Próbálja újra" msgid "Should \"{}\" be a superuser (sudo)?" -msgstr "\"{}\" felhasználónak rendszergazdának (sudoer) kell lennie?" +msgstr "„{}” felhasználónak rendszergazdának (sudoer) kell lennie?" msgid "Select which partitions to encrypt" msgstr "Válassza ki mely partíciókat szeretné titkosítani" @@ -790,7 +790,7 @@ msgid "Delete subvolume" msgstr "Alkötet törlése" msgid "Configured {} interfaces" -msgstr "{} konfigurált interfész" +msgstr "{} konfigurált csatoló" msgid "This option enables the number of parallel downloads that can occur during installation" msgstr "Ez a beállítás lehetővé teszi, hogy a telepítés során hány párhuzamos letöltés történhet" @@ -821,13 +821,13 @@ msgid "Parallel Downloads" msgstr "Párhuzamos letöltések" msgid "ESC to skip" -msgstr "Használja az ESC billentyűt a kihagyáshoz" +msgstr "ESC → a kihagyáshoz" msgid "CTRL+C to reset" -msgstr "Használja a CTRL+C billentyűkombinációt a visszaállításhoz" +msgstr "CTRL+C → a visszaállításhoz" msgid "TAB to select" -msgstr "TAB billentyűvel több elemet is megjelölhet telepítésre" +msgstr "TAB → az elem(ek) megjelöléséhez" msgid "[Default value: 0] > " msgstr "[Alapértelmezett érték: 0] > " @@ -1107,7 +1107,7 @@ msgid "" "Enter a directory for the configuration(s) to be saved (tab completion enabled)\n" "Save directory: " msgstr "" -"Adjon meg egy könyvtárat a menteni kívánt konfiguráció(k) számára (a lap kitöltés engedélyezve van)\n" +"Adjon meg egy könyvtárat a menteni kívánt konfiguráció(k) számára (a tabulátoros kiegészítés engedélyezve van)\n" "Mentési könyvtár: " msgid "" @@ -1311,3 +1311,6 @@ msgstr "Archtelepítő súgó" msgid " (default)" msgstr " (alapértelmezett)" + +msgid "Press Ctrl+h for help" +msgstr "CTRL+h → a súgó megnyitásához" diff --git a/archinstall/locales/id/LC_MESSAGES/base.po b/archinstall/locales/id/LC_MESSAGES/base.po index fb853cef8e..9b74354a2a 100644 --- a/archinstall/locales/id/LC_MESSAGES/base.po +++ b/archinstall/locales/id/LC_MESSAGES/base.po @@ -1376,3 +1376,6 @@ msgstr "Bahasa Archinstall" #, fuzzy msgid " (default)" msgstr "(default)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/it/LC_MESSAGES/base.po b/archinstall/locales/it/LC_MESSAGES/base.po index 28dbc704f8..1d9c43ee4d 100644 --- a/archinstall/locales/it/LC_MESSAGES/base.po +++ b/archinstall/locales/it/LC_MESSAGES/base.po @@ -1323,3 +1323,6 @@ msgstr "Lingua di Archinstall" #, fuzzy msgid " (default)" msgstr "(predefinito)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/ja/LC_MESSAGES/base.mo b/archinstall/locales/ja/LC_MESSAGES/base.mo index 723c4b6d70..3bf9e662fc 100644 Binary files a/archinstall/locales/ja/LC_MESSAGES/base.mo and b/archinstall/locales/ja/LC_MESSAGES/base.mo differ diff --git a/archinstall/locales/ja/LC_MESSAGES/base.po b/archinstall/locales/ja/LC_MESSAGES/base.po index 74a4653cb2..2695ef5710 100644 --- a/archinstall/locales/ja/LC_MESSAGES/base.po +++ b/archinstall/locales/ja/LC_MESSAGES/base.po @@ -1309,3 +1309,6 @@ msgstr "Archinstall ヘルプ" msgid " (default)" msgstr " (デフォルト)" + +msgid "Press Ctrl+h for help" +msgstr "Ctrl+H でヘルプを表示" diff --git a/archinstall/locales/ka/LC_MESSAGES/base.mo b/archinstall/locales/ka/LC_MESSAGES/base.mo index 04c94cd0c4..1edea66ee3 100644 Binary files a/archinstall/locales/ka/LC_MESSAGES/base.mo and b/archinstall/locales/ka/LC_MESSAGES/base.mo differ diff --git a/archinstall/locales/ka/LC_MESSAGES/base.po b/archinstall/locales/ka/LC_MESSAGES/base.po index b911d6df7d..e9dcb94924 100644 --- a/archinstall/locales/ka/LC_MESSAGES/base.po +++ b/archinstall/locales/ka/LC_MESSAGES/base.po @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" msgid "[!] A log file has been created here: {} {}" msgstr "[!] ჟურნალის ფაილი შეიქმნა აქ: {} {}" @@ -70,13 +70,13 @@ msgid "Select one network interface to configure" msgstr "მოსარგებად ერთ-ერთი ქსელის ინტერფეისი აირჩიეთ" msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" -msgstr "აირჩიეთ მოსარგები რეჟიმი \"{}\"-სთვის ან გამოტოვეთ ნაგულისხმები რეჟიმის \"{}\" გამოსაყენებლად" +msgstr "აირჩიეთ მოსარგები რეჟიმი \"{}\"-სთვის ან გამოტოვეთ ნაგულისხმევი რეჟიმის \"{}\" გამოსაყენებლად" msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " msgstr "შეიყვანეთ IP მისამართი და ქვექსელი {}-სთვის (მაგ: 192.168.0.5/24): " msgid "Enter your gateway (router) IP address or leave blank for none: " -msgstr "აირჩიეთ ნაგულისხმები რაუტერის IP მისამართი, ან ცარიელი დატოვეთ: " +msgstr "აირჩიეთ ნაგულისხმევი რაუტერის IP მისამართი, ან ცარიელი დატოვეთ: " msgid "Enter your DNS servers (space separated, blank for none): " msgstr "შეიყვანეთ თქვენი DNS სერვერების მისამართები (გამოყოფილი ცარიელი ადგილით. ცარიელი, თუ არ გნებავთ, გამოიყენოთ): " @@ -98,10 +98,10 @@ msgid "Enter a desired filesystem type for the partition" msgstr "შეიყვანეთ დანაყოფის სასურველი ფაილური სისტემის ტიპი" msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " -msgstr "" +msgstr "აირჩიეთ დაწყების მდებარეობა (parted-ის ერთეულებში: s, GB, % და ა.შ. ; ნაგულისხმევი: {}): " msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " -msgstr "" +msgstr "აირჩიეთ დასრულების მდებარეობა (parted-ის ერთეულებში: s, GB, % და ა.შ. ; მაგ: {}): " msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} რიგში ჩაყენებულ დანაყოფებს შეიცავს. ეს წაშლის მათ. დარწმუნებული ბრძანდებით?" @@ -212,10 +212,10 @@ msgstr "" "აირჩიეთ გრაფიკის დრაივერი ან, ღია კოდის მქონე დრაივერის დასაყენებლად, ცარიელი დატოვეთ" msgid "All open-source (default)" -msgstr "ყველა ღია კოდით (ნაგულისხმები)" +msgstr "ყველა ღია კოდით (ნაგულისხმევი)" msgid "Choose which kernels to use or leave blank for default \"{}\"" -msgstr "აირჩიეთ, რომელი ბირთვი გნებავთ, გამოიყენოთ. ან ნაგულისხმებისთვის (\"{}\") ცარიელი დატოვეთ" +msgstr "აირჩიეთ, რომელი ბირთვი გნებავთ, გამოიყენოთ. ან ნაგულისხმევისთვის (\"{}\") ცარიელი დატოვეთ" msgid "Choose which locale language to use" msgstr "აირჩიეთ, რომელი ლოკალის ენა გნებავთ, გამოიყენოთ" @@ -386,7 +386,7 @@ msgid "Verifying that additional packages exist (this might take a few seconds)" msgstr "დამატებითი პაკეტების არსებობის შემოწმება (ამას რამდენიმე წამი შეიძლება დასჭირდეს)" msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n" -msgstr "გნებავთ დროის ავტომატური სინქრონიზაციის (NTP) ნაგულისხმები დროის სერვერებით გამოყენება?\n" +msgstr "გნებავთ დროის ავტომატური სინქრონიზაციის (NTP) ნაგულისხმევი დროის სერვერებით გამოყენება?\n" msgid "" "Hardware time and other post-configuration steps might be required in order for NTP to work.\n" @@ -589,7 +589,7 @@ msgid "[!] A log file has been created here: {}" msgstr "[!] ჟურნალის ფაილის მდებარეობა: {}" msgid "Would you like to use BTRFS subvolumes with a default structure?" -msgstr "გნებავთ BTRFS-ის ქვეტომები ნაგულისხმები სტრუქტურით გამოიყენოთ?" +msgstr "გნებავთ BTRFS-ის ქვეტომები ნაგულისხმევი სტრუქტურით გამოიყენოთ?" msgid "Would you like to use BTRFS compression?" msgstr "გნებავთ BTRFS-ის შეკუმშვის გამოყენება?" @@ -698,7 +698,7 @@ msgid "No audio server" msgstr "აუდიოსერვერის გრეშე" msgid "(default)" -msgstr "(ნაგულისხმები)" +msgstr "(ნაგულისხმევი)" msgid "Use ESC to skip" msgstr "გამოსატოვებლად გამოიყენეთ ღილაკი Esc" @@ -732,7 +732,7 @@ msgid "You can skip selecting a drive and partitioning and use whatever drive-se msgstr "შეგიძლიათ დისკის არჩევანი და დაყოფა გამოტოვოთ და გამოიყენოთ სასურველი დისკი, რომელიც /mnt-ზეა მიმაგრებული (ექსპერიმენტალური)" msgid "Select one of the disks or skip and use /mnt as default" -msgstr "აირჩიეთ ერტი ან მეტი დისკი ან გამოტოვება და ნაგულისხმები /mnt-ის გამოყენება" +msgstr "აირჩიეთ ერტი ან მეტი დისკი ან გამოტოვება და ნაგულისხმევი /mnt-ის გამოყენება" msgid "Select which partitions to mark for formatting:" msgstr "აირჩიეთ, რომელი დანაყოფები მოვნიშნო დასაფორმატებლად:" @@ -810,11 +810,11 @@ msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads a msgstr " - მინიმალური მნიშვნელობა : 1 ( დაუშვებს 1 პარალელურ გადმოწერას, დაუშვებს 2 ერთდროულ გადმოწერას )" msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )" -msgstr " - გამორთვა/ნაგულისხმები : 0 ( პარალელური გადმოწერების გათიშვა. დროის ერთ მომენტში მხოლოდ ერთი გადმოწერა მოხდება )" +msgstr " - გამორთვა/ნაგულისხმევი : 0 ( პარალელური გადმოწერების გათიშვა. დროის ერთ მომენტში მხოლოდ ერთი გადმოწერა მოხდება )" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]" -msgstr "შეყვანილი რიცხვი არასწორია! თავიდან სცადეთ [1-დან {}-მდე, ან 0, გასათიშად]" +msgstr "შეყვანილი რიცხვი არასწორია! თავიდან სცადეთ [1-დან {max_downloads}-მდე, ან 0, გასათიშად]" msgid "Parallel Downloads" msgstr "პარალელური გადმოწერები" @@ -829,7 +829,7 @@ msgid "TAB to select" msgstr "ასარჩევად TAB" msgid "[Default value: 0] > " -msgstr "[ნაგულისხმები მნიშვნელობა: 0] > " +msgstr "[ნაგულისხმევი მნიშვნელობა: 0] > " msgid "To be able to use this translation, please install a font manually that supports the language." msgstr "თარგმანის გამოსაყენებლად ფონტი, რომელსაც ენის მხარდაჭერა გააჩნია, ხელით უნდა დააყენოთ." @@ -838,124 +838,103 @@ msgid "The font should be stored as {}" msgstr "ფონტი {}-ში უნდა იყოს შენახული" msgid "Archinstall requires root privileges to run. See --help for more." -msgstr "" +msgstr "Archinstall-ს გასაშვებად root მომხმარებლის პრივილეგიები სჭირდება. მეტი ინფორმაციისთვის იხილეთ --help." -#, fuzzy msgid "Select an execution mode" -msgstr "აირჩიეთ ქმედება '{}'-სთვის" +msgstr "აირჩიეთ შესრულების რეჟიმი" msgid "Unable to fetch profile from specified url: {}" -msgstr "" +msgstr "პროფილის მიღება შეუძლებელია მითითებული ბმულიდან: {}" msgid "Profiles must have unique name, but profile definitions with duplicate name found: {}" -msgstr "" +msgstr "პროფილებს უნიკალური სახელი უნდა ჰქონდეთ, მაგრამ აღმოჩენილია პროფილის აღწერები გამეორებადი სახელით: {}" -#, fuzzy msgid "Select one or more devices to use and configure" -msgstr "აირჩიეთ ერთი ან მეტი მყარი დისკი და მოირგეთ" +msgstr "აირჩიეთ ერთი ან მეტი მოწყობილობა და მოირგეთ" -#, fuzzy msgid "If you reset the device selection this will also reset the current disk layout. Are you sure?" msgstr "ეს მყარი დისკის არჩევანს და მიმდინარე დისკის განლაგებას საწყის მნიშვნელობებზე დააბრუნებს. დარწმუნებული ბრძანდებით?" -#, fuzzy msgid "Existing Partitions" -msgstr "დანაყოფები" +msgstr "არსებული დანაყოფები" -#, fuzzy msgid "Select a partitioning option" -msgstr "აირჩიეთ დისკის დაშიფვრის პარამეტრი" +msgstr "აირჩიეთ დისკის დაყოფის პარამეტრი" -#, fuzzy msgid "Enter the root directory of the mounted devices: " -msgstr "შეიყვანეთ საქაღალდე, სადაც კონფიგურაცი(ებ)-ი იქნება შენახული: " +msgstr "შეიყვანეთ მიმაგრებული მოწყობილობების ძირითადი საქაღალდე: " -#, fuzzy msgid "Minimum capacity for /home partition: {}GiB\n" -msgstr "მინიმალური სივრცე დანაყოფისთვის /home: {}გბ\n" +msgstr "მინიმალური სივრცე დანაყოფისთვის /home: {}გიბ\n" -#, fuzzy msgid "Minimum capacity for Arch Linux partition: {}GiB" -msgstr "მინიმალური სივრცე ArchLinux-ის დანაყოფისთვის: {}გბ" +msgstr "მინიმალური სივრცე Arch Linux-ის დანაყოფისთვის: {}გიბ" -#, fuzzy msgid "This is a list of pre-programmed profiles_bck, they might make it easier to install things like desktop environments" -msgstr "ეს წინასწარ მითითებული პროფილების სიაა. მათი დახმარებით ისეთი რამების, როგორიცაა სამუშაო მაგიდის გარემოები, დაყენება უფრო ადვილია" +msgstr "ეს წინასწარ მითითებული profiles_bck-ის სიაა. მათი დახმარებით ისეთი რამების, როგორიცაა სამუშაო მაგიდის გარემოები, დაყენება უფრო ადვილია" -#, fuzzy msgid "Current profile selection" -msgstr "მიმდინარე დანაყოფების განლაგება" +msgstr "მიმდინარე პროფილის არჩევანი" -#, fuzzy msgid "Remove all newly added partitions" -msgstr "ახალი დანაყოფის შექმნა" +msgstr "ყველა ახლად დამატებული დანაყოფის წაშლა" -#, fuzzy msgid "Assign mountpoint" -msgstr "დანაყოფის მიმაგრების წერტილის მინიჭება" +msgstr "მიმაგრების წერტილის მინიჭება" -#, fuzzy msgid "Mark/Unmark to be formatted (wipes data)" -msgstr "დანაყოფის დასაფორმატებლობის ჭდის მოხსნა/დადება (მონაცემები წაიშლება)" +msgstr "დასაფორმატებულობის ჭდის მოხსნა/დადება (მონაცემები წაიშლება)" msgid "Mark/Unmark as bootable" -msgstr "" +msgstr "ჩატვირთვადი ალმის დაყენება/მოხსნა" msgid "Change filesystem" -msgstr "" +msgstr "ფაილური სისტემის შეცვლა" -#, fuzzy msgid "Mark/Unmark as compressed" -msgstr "დანაყოფზე შეკუმშულობის ჭდის მოხსნა/დადება (მხოლოდ btrfs)" +msgstr "შეკუმშულად მონიშვნა/მონიშვნის მოხსნა" -#, fuzzy msgid "Set subvolumes" -msgstr "ქვეტომის წაშლა" +msgstr "ქვეტომების დაყენება" -#, fuzzy msgid "Delete partition" msgstr "დანაყოფის წაშლა" -#, fuzzy msgid "Partition" -msgstr "დანაყოფები" +msgstr "დანაყოფი" msgid "This partition is currently encrypted, to format it a filesystem has to be specified" -msgstr "" +msgstr "ეს დანაყოფი ამჟამად დაშიფრულია. დასაფორმატებლად აუცილებელია ფაილური სისტემის მითითება" -#, fuzzy msgid "Partition mount-points are relative to inside the installation, the boot would be /boot as an example." -msgstr " * დანაყოფის მიმაგრების წერტილები შედარებითია დაყენების შიგნით. ჩატვირთვა, მაგალითად, /boot შეიძლება, იყოს." +msgstr "დანაყოფის მიმაგრების წერტილები შედარებითია დაყენების შიგნით. ჩატვირთვა, მაგალითად, /boot შეიძლება, იყოს." msgid "If mountpoint /boot is set, then the partition will also be marked as bootable." -msgstr "" +msgstr "თუ /boot მიმაგრების წერტილი დაყენებულია, ეს დანაყოფი ასევე მოინიშნება, როგორც ჩატვირთვადი." msgid "Mountpoint: " -msgstr "" +msgstr "მიმაგრების წერტილი: " msgid "Current free sectors on device {}:" -msgstr "" +msgstr "ამჟამად თავისუფალი სექტორები მოწყობილობაზე {}:" -#, fuzzy msgid "Total sectors: {}" -msgstr "არასწორი საქაღალდე: {}" +msgstr "სექტორები ჯამში: {}" -#, fuzzy msgid "Enter the start sector (default: {}): " -msgstr "შეიყვანეთ საწყისი სექტორი (პროცენტებში ან ბლოკის ნომერი. ნაგულისხმები: {}): " +msgstr "შეიყვანეთ საწყისი სექტორი (ნაგულისხმევი: {}): " -#, fuzzy msgid "Enter the end sector of the partition (percentage or block number, default: {}): " -msgstr "შეიყვანეთ დანაყოფის ბოლო სექტორი (პროცენტულად ან ბლოკის ნომერი. მაგ: {}): " +msgstr "შეიყვანეთ დანაყოფის ბოლო სექტორი (პროცენტულად ან ბლოკის ნომერი. ნაგულისხმევი: {}): " msgid "This will remove all newly added partitions, continue?" -msgstr "" +msgstr "ეს ყველა ახლად დამატებულ დანაყოფს წაშლის. გავაგრძელო?" msgid "Partition management: {}" -msgstr "" +msgstr "დანაყოფების მართვა: {}" msgid "Total length: {}" -msgstr "" +msgstr "ჯამური სიგრძე: {}" msgid "Encryption type" msgstr "დაშიფვრის ტიპი" @@ -975,37 +954,32 @@ msgstr "აირჩიეთ დისკის დაშიფვრის პ msgid "Select a FIDO2 device to use for HSM" msgstr "აირჩიეთ HSM-სთვის გამოსაყენებელი FIDO2 მოწყობილობა" -#, fuzzy msgid "Use a best-effort default partition layout" -msgstr "მონიშნულ დისკებზე ყველაფრის წაშლა და დანაყოფების განლაგების საუკეთესო განლაგების გამოყენება" +msgstr "დანაყოფების განლაგების საუკეთესო განლაგების გამოყენება" -#, fuzzy msgid "Manual Partitioning" -msgstr "დანაყოფები" +msgstr "ხელით დაყოფა" -#, fuzzy msgid "Pre-mounted configuration" -msgstr "მორგების გარეშე" +msgstr "წინასწარ მიმაგრებული კონფიგურაცია" msgid "Unknown" -msgstr "" +msgstr "უცნობი" msgid "Partition encryption" msgstr "დანაყოფის დაშიფვრა" msgid " ! Formatting {} in " -msgstr "" +msgstr " ! {}-ის დაფორმატება ფორმატში " -#, fuzzy msgid "← Back" -msgstr "უკან" +msgstr "← უკან" msgid "Disk encryption" msgstr "დისკის დაშიფვრა" -#, fuzzy msgid "Configuration" -msgstr "მორგების გარეშე" +msgstr "მორგება" msgid "Password" msgstr "პაროლი" @@ -1017,361 +991,325 @@ msgid "Back" msgstr "უკან" msgid "Please chose which greeter to install for the chosen profiles: {}" -msgstr "" +msgstr "აირჩიეთ, რომელი მისალმების ეკრანის დაყენება გნებავთ არჩეული პროფილებისთვის: {}" msgid "Environment type: {}" -msgstr "" +msgstr "გარემოს ტიპი: {}" msgid "The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues, are you okay with that?" -msgstr "" +msgstr "Sway-ის დახურული კოდის მქონე Nvidia-ის დრაივერის მხარდაჭერა არ გააჩნია. როგორც ჩანს, შარში ყოფთ თავს. დარწმუნებული ბრძანდებით?" -#, fuzzy msgid "Installed packages" -msgstr "დამატებითი პაკეტები" +msgstr "დაყენებული პაკეტები" -#, fuzzy msgid "Add profile" -msgstr "პროფილი" +msgstr "პროფილის დამატება" -#, fuzzy msgid "Edit profile" -msgstr "პროფილი" +msgstr "პროფილის ჩასწორება" -#, fuzzy msgid "Delete profile" -msgstr "ინტერფეისის წაშლა" +msgstr "პროფილის წაშლა" -#, fuzzy msgid "Profile name: " -msgstr "პროფილი" +msgstr "პროფილის სახელი: " -#, fuzzy msgid "The profile name you entered is already in use. Try again" -msgstr "შეყვანილი მომხმარებლის სახელი არასწორია. კიდევ სცადეთ" +msgstr "შეყვანილი პროფილის სახელი უკვე გამოიყენება. კიდევ სცადეთ" -#, fuzzy msgid "Packages to be install with this profile (space separated, leave blank to skip): " -msgstr "დამატებითი პაკეტები დასაყენებლად (გამოტოვებით გამოყოფილი, გამოსატოვებლად ცარიელი დატოვეთ): " +msgstr "ამ პროფილთან დასაყენებელი პაკეტები (ჰარეებით გამოყოფილი, გამოსატოვებლად ცარიელი დატოვეთ): " -#, fuzzy msgid "Services to be enabled with this profile (space separated, leave blank to skip): " -msgstr "დამატებითი პაკეტები დასაყენებლად (გამოტოვებით გამოყოფილი, გამოსატოვებლად ცარიელი დატოვეთ): " +msgstr "ამ პროფილთან ჩასართავი სერვისები (ჰარეებით გამოყოფილი, გამოსატოვებლად ცარიელი დატოვეთ): " msgid "Should this profile be enabled for installation?" -msgstr "" +msgstr "უნდა ჩაირთოს თუ არა ეს პროფილი დაყენებისთვის?" msgid "Create your own" -msgstr "" +msgstr "შექმენით საკუთარი" -#, fuzzy msgid "" "\n" "Select a graphics driver or leave blank to install all open-source drivers" msgstr "" "\n" -"\n" "აირჩიეთ გრაფიკის დრაივერი ან, ღია კოდის მქონე დრაივერის დასაყენებლად, ცარიელი დატოვეთ" msgid "Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" -msgstr "" +msgstr "Sway-ს თქვენს სამუშაო ადგილთან (აპარატურასთან, როგორიცაა კლავიატურა, თაგუნა და ა.შ>) წვდომა სჭირდება" msgid "" "\n" "\n" "Choose an option to give Sway access to your hardware" msgstr "" +"\n" +"\n" +"აირჩიეთ ეს პარამეტრი, რომ Sway-ს თქვენს აპარატურასთან წვდომა მისცეთ" msgid "Graphics driver" -msgstr "" +msgstr "გრაფიკის დრაივერი" msgid "Greeter" -msgstr "" +msgstr "მისამების ეკრანი" msgid "Please chose which greeter to install" -msgstr "" +msgstr "აირჩიეთ, რომელი მისალმების ეკრანის დაყენება გნებავთ" msgid "This is a list of pre-programmed default_profiles" -msgstr "" +msgstr "ეს წინასწარ დაპროგრამებული ნაგულისხმევი პროფილების სიაა" -#, fuzzy msgid "Disk configuration" -msgstr "მორგების გარეშე" +msgstr "დისკის მორგება" -#, fuzzy msgid "Profiles" -msgstr "პროფილი" +msgstr "პროფილები" msgid "Finding possible directories to save configuration files ..." -msgstr "" +msgstr "მიმდინარეობს კონფიგურაციის ფაილების შესანახად შესაძლო საქაღალდეების ძებნა ..." -#, fuzzy msgid "Select directory (or directories) for saving configuration files" -msgstr "აირჩიეთ ერთი ან მეტი მყარი დისკი და მოირგეთ" +msgstr "აირჩიეთ საქაღალდე (ან საქაღალდეები) კონფიგურაციის ფაილების შესანახად" -#, fuzzy msgid "Add a custom mirror" -msgstr "მომხმარებლის დამატება" +msgstr "მორგებული სარკის დამატება" msgid "Change custom mirror" -msgstr "" +msgstr "მორგებული სარკის შეცვლა" msgid "Delete custom mirror" -msgstr "" +msgstr "მორგებული სარკის წაშლა" -#, fuzzy msgid "Enter name (leave blank to skip): " -msgstr "შეიყვანეთ მომხმარებლი სახელი (გამოსატოვებლად ცარიელი დატოვეთ): " +msgstr "შეიყვანეთ სახელი (გამოსატოვებლად ცარიელი დატოვეთ): " -#, fuzzy msgid "Enter url (leave blank to skip): " -msgstr "შეიყვანეთ მომხმარებლი სახელი (გამოსატოვებლად ცარიელი დატოვეთ): " +msgstr "შეიყვანეთ ბმული (გამოსატოვებლად ცარიელი დატოვეთ): " -#, fuzzy msgid "Select signature check option" -msgstr "აირჩიეთ დისკის დაშიფვრის პარამეტრი" +msgstr "აირჩიეთ ხელმოწერის შემოწმების პარამეტრი" -#, fuzzy msgid "Select signature option" -msgstr "აირჩიეთ დისკის დაშიფვრის პარამეტრი" +msgstr "აირჩიეთ ხელმოწერის პარამეტრი" msgid "Custom mirrors" -msgstr "" +msgstr "მორგებული სარკეები" msgid "Defined" -msgstr "" +msgstr "აღწერილია" -#, fuzzy msgid "Save user configuration (including disk layout)" -msgstr "მომხმარებლის კონფიგურაციის შენახვა" +msgstr "მომხმარებლის კონფიგურაციის შენახვა (დისკის განლაგების ჩართვით)" -#, fuzzy msgid "" "Enter a directory for the configuration(s) to be saved (tab completion enabled)\n" "Save directory: " -msgstr "შეიყვანეთ საქაღალდე, სადაც კონფიგურაცი(ებ)-ი იქნება შენახული: " +msgstr "" +"შეიყვანეთ საქაღალდე კონფიგურაცი(ებ)-ის შესანახად (ტაბით დასრულება ჩართულია)\n" +"შენახვის საქაღალდე: " msgid "" "Do you want to save {} configuration file(s) in the following location?\n" "\n" "{}" msgstr "" +"გნებავთ, შეინახოთ {} კონფიგურაციის ფაილები შემდეგ მისამართზე?\n" +"\n" +"{}" -#, fuzzy msgid "Saving {} configuration files to {}" -msgstr "კონფიგურაციი შენახვა" +msgstr "{}-კონფიგურაციის ფაილების შენახვა {}-ზე" -#, fuzzy msgid "Mirrors" -msgstr "სარკის რეგიონი" +msgstr "სარკეები" -#, fuzzy msgid "Mirror regions" -msgstr "სარკის რეგიონი" +msgstr "სარკის რეგიონები" -#, fuzzy msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {max_downloads+1} downloads at a time )" -msgstr " - მინიმალური მნიშვნელობა : {} ( დაუშვებს {} პარალელურ გადმოწერას, დაუშვებს {} ერთდროულ გადმოწერას )" +msgstr " - მინიმალური მნიშვნელობა : {} ( დაუშვებს {} პარალელურ გადმოწერას, დაუშვებს {მაქს_გადმოწერები+1} ერთდროულ გადმოწერას )" msgid "Invalid input! Try again with a valid input [1 to {}, or 0 to disable]" msgstr "შეყვანილი რიცხვი არასწორია! თავიდან სცადეთ [1-დან {}-მდე, ან 0, გასათიშად]" msgid "Locales" -msgstr "" +msgstr "ლოკალები" -#, fuzzy msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)" msgstr "NetworkManager-ის გამოყენება (აუცილებელია ინტერნეტის GNOME/KDE-დან მოსარგებად)" msgid "Total: {} / {}" -msgstr "" +msgstr "სულ: {} / {}" msgid "All entered values can be suffixed with a unit: B, KB, KiB, MB, MiB..." -msgstr "" +msgstr "ყველა შეყვანილ მნიშვნელობად სუფიქსად შეგიძლიათ მიუთითოთ ერთეული: B, KB, KiB, MB, MiB..." msgid "If no unit is provided, the value is interpreted as sectors" -msgstr "" +msgstr "თუ ერთეული მითითებული არაა, მნიშვნელობა სექტორების რაოდენობად იქნება აღქმული" -#, fuzzy msgid "Enter start (default: sector {}): " -msgstr "შეიყვანეთ საწყისი სექტორი (პროცენტებში ან ბლოკის ნომერი. ნაგულისხმები: {}): " +msgstr "შეიყვანეთ საწყისი სექტორი (ნაგულისხმევი: {}): " -#, fuzzy msgid "Enter end (default: {}): " -msgstr "შეიყვანეთ საწყისი სექტორი (პროცენტებში ან ბლოკის ნომერი. ნაგულისხმები: {}): " +msgstr "შეიყვანეთ ბოლო სექტორი (ნაგულისხმევი: {}): " msgid "Unable to determine fido2 devices. Is libfido2 installed?" -msgstr "" +msgstr "შეცდომა fido2 მოწყობილობების დადგენისას. libfido2 დაყენებული გაქვთ?" msgid "Path" -msgstr "" +msgstr "ბილიკი" msgid "Manufacturer" -msgstr "" +msgstr "მწარმოებელი" msgid "Product" -msgstr "" +msgstr "პროდუქტი" -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid configuration: {error}" -msgstr "ხელით მორგება" +msgstr "არასწორი კონფიგურაცია: {error}" msgid "Type" -msgstr "" +msgstr "ტიპი" -#, fuzzy msgid "This option enables the number of parallel downloads that can occur during package downloads" msgstr "ეს პარამეტრი დაყენებისას მითითებული რაოდენობის პარალელურ გადმოწერას დაუშვებს" -#, fuzzy msgid "" "Enter the number of parallel downloads to be enabled.\n" "\n" "Note:\n" msgstr "" "შეიყვანეთ დასაშვები პარალელური გადმოწერების რაოდენობა.\n" -" (შეიყვანეთ მნიშვნელობა 1-დან {}-მდე)\n" -"დაიმახსოვრეთ:" +"\n" +"შენიშვნა:\n" -#, fuzzy msgid " - Maximum recommended value : {} ( Allows {} parallel downloads at a time )" -msgstr " - მინიმალური მნიშვნელობა : {} ( დაუშვებს {} პარალელურ გადმოწერას, დაუშვებს {} ერთდროულ გადმოწერას )" +msgstr " - მინიმალური მნიშვნელობა : {} ( დაუშვებს {} პარალელურ გადმოწერას )" -#, fuzzy msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )\n" -msgstr " - გამორთვა/ნაგულისხმები : 0 ( პარალელური გადმოწერების გათიშვა. დროის ერთ მომენტში მხოლოდ ერთი გადმოწერა მოხდება )" +msgstr " - გამორთვა/ნაგულისხმევი : 0 ( პარალელური გადმოწერების გათიშვა. დროის ერთ მომენტში მხოლოდ ერთი გადმოწერა მოხდება )\n" -#, fuzzy msgid "Invalid input! Try again with a valid input [or 0 to disable]" -msgstr "შეყვანილი რიცხვი არასწორია! თავიდან სცადეთ [1-დან {}-მდე, ან 0, გასათიშად]" +msgstr "შეყვანილი რიცხვი არასწორია! თავიდან სცადეთ [ან დააყენეთ 0, გასათიშად]" msgid "Hyprland needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" -msgstr "" +msgstr "Hyperland-ს თქვენს სამუშაო ადგილთან (აპარატურასთან, როგორიცაა კლავიატურა, თაგუნა და ა.შ>) წვდომა სჭირდება" msgid "" "\n" "\n" "Choose an option to give Hyprland access to your hardware" msgstr "" +"\n" +"\n" +"აირჩიეთ ეს პარამეტრი, რომ Hyperland-ს თქვენს აპარატურასთან წვდომა მისცეთ" msgid "All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..." -msgstr "" +msgstr "ყველა შეყვანილ მნიშვნელობად სუფიქსად შეგიძლიათ მიუთითოთ ერთეული: B, KB, KiB, MB, MiB..." -#, fuzzy msgid "Would you like to use unified kernel images?" -msgstr "გნებავთ სვოპის ZRAM-ზე გამოყენება?" +msgstr "გნებავთ გაერთიანებული ბირთვის დისკის ასლის ფაილების გამოყენება?" msgid "Unified kernel images" -msgstr "" +msgstr "გაერთიანებული ბირთვის დისკის ასლის ფაილები" msgid "Waiting for time sync (timedatectl show) to complete." -msgstr "" +msgstr "დროის სინქრონიზაციის (timedatectl show) დასრულების მოლოდინი." msgid "Time syncronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" -msgstr "" +msgstr "დროის სინქრონიზაცია არ სრულდება. სანამ ელოდებით, შეამოწმეთ დოკუმენტაცია, როგორ აიცილოთ ეს თავიდან: https://archinstall.readthedocs.io/" msgid "Skipping waiting for automatic time sync (this can cause issues if time is out of sync during installation)" -msgstr "" +msgstr "ავტომატური დროის სინქრონიზაციის მოლოდინის გამოტოვება (ამას შეუძლია, პრობლემები გამოიწვიოს, თუ დრო დაყენებისას აირევა)" msgid "Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." -msgstr "" +msgstr "ველოდები Arch Linux-ის ბრელოკის სინქრონიზაციის (archlinux-keyring-wkd-sync) დასრულებას." -#, fuzzy msgid "Selected profiles: " -msgstr "ინტერფეისის წაშლა" +msgstr "მონიშნული პროფილები: " msgid "Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" -msgstr "" +msgstr "დროის სინქრონიზაცია არ სრულდება. სანამ ელოდებით, შეამოწმეთ დოკუმენტაცია, როგორ აიცილოთ ეს თავიდან: https://archinstall.readthedocs.io/" -#, fuzzy msgid "Mark/Unmark as nodatacow" -msgstr "დანაყოფზე შეკუმშულობის ჭდის მოხსნა/დადება (მხოლოდ btrfs)" +msgstr "'nodatacow' ალმის დასმა/მოხსნა" -#, fuzzy msgid "Would you like to use compression or disable CoW?" -msgstr "გნებავთ BTRFS-ის შეკუმშვის გამოყენება?" +msgstr "შეკუმშვის გამოყენება გნებავთ, თუ CoW-ის გათიშვა?" msgid "Use compression" -msgstr "" +msgstr "შეკუმშვის გამოყენება" msgid "Disable Copy-on-Write" -msgstr "" +msgstr "ჩაწერისას-დაკოპირების გათიშვა" -#, fuzzy msgid "Provides a selection of desktop environments and tiling window managers, e.g. GNOME, KDE Plasma, Sway" -msgstr "მოგაწვდით სამუშაო გარემოებისა და ფანჯრების მმართველების არჩევანს. მაგ: gnome, kde, sway" +msgstr "მოგაწვდით სამუშაო გარემოებისა და ფანჯრების მმართველების არჩევანს. მაგ: GNOME, KDE Plasma, Sway" -#, fuzzy msgid "Configuration type: {}" -msgstr "მორგების გარეშე" +msgstr "მორგების ტიპი: {}" -#, fuzzy msgid "LVM configuration type" -msgstr "მორგების გარეშე" +msgstr "LVM-ის კონფიგურაციის ტიპი" msgid "LVM disk encryption with more than 2 partitions is currently not supported" -msgstr "" +msgstr "LVM დისკის დაშიფვრა ორზე მეტი დანაყოფით ამჟამად მხარდაჭერილი არაა" -#, fuzzy msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)" -msgstr "NetworkManager-ის გამოყენება (აუცილებელია ინტერნეტის GNOME/KDE-დან მოსარგებად)" +msgstr "NetworkManager-ის გამოყენება (აუცილებელია ინტერნეტის GNOME/KDE Plasma-დან მოსარგებად)" -#, fuzzy msgid "Select a LVM option" -msgstr "აირჩიეთ დროის სარტყელი" +msgstr "აირჩიეთ LVM-ის პარამეტრი" -#, fuzzy msgid "Partitioning" -msgstr "დანაყოფები" +msgstr "დაყოფა" msgid "Logical Volume Management (LVM)" -msgstr "" +msgstr "ლოგიკური ტომების მართვა (LVM)" msgid "Physical volumes" -msgstr "" +msgstr "ფიზიკური ტომები" msgid "Volumes" -msgstr "" +msgstr "ტომები" -#, fuzzy msgid "LVM volumes" -msgstr "ქვეტომის წაშლა" +msgstr "LVM-ის ტომები" -#, fuzzy msgid "LVM volumes to be encrypted" -msgstr "დასაშიფრი დანაყოფები" +msgstr "დასაშიფრი LVM-ის ტომები" -#, fuzzy msgid "Select which LVM volumes to encrypt" -msgstr "არჩიეთ დასაშიფრი დანაყოფები" +msgstr "აირჩიეთ, რომელი LVM-ის ტომი დაიშიფროს" -#, fuzzy msgid "Default layout" -msgstr "დისკის განლაგება" +msgstr "ნაგულისხმები განლაგება" -#, fuzzy msgid "No Encryption" -msgstr "დაშიფვრის ტიპი" +msgstr "დაშიფვრის გარეშე" msgid "LUKS" -msgstr "" +msgstr "LUKS" msgid "LVM on LUKS" -msgstr "" +msgstr "LVM LUKS-ზე" msgid "LUKS on LVM" -msgstr "" +msgstr "LUKS LVM-ზე" -#, fuzzy msgid "Yes" msgstr "დიახ" msgid "No" -msgstr "" +msgstr "არა" -#, fuzzy msgid "Archinstall help" -msgstr "Archinstall-ის ენა" +msgstr "Archinstall-ის დახმარება" -#, fuzzy msgid " (default)" -msgstr "(ნაგულისხმები)" +msgstr " (ნაგულისხმევი)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/ko/LC_MESSAGES/base.po b/archinstall/locales/ko/LC_MESSAGES/base.po index 1c5d69103c..1621472c5f 100644 --- a/archinstall/locales/ko/LC_MESSAGES/base.po +++ b/archinstall/locales/ko/LC_MESSAGES/base.po @@ -1377,3 +1377,6 @@ msgstr "Archinstall 언어" #, fuzzy msgid " (default)" msgstr "(기본)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/lt/LC_MESSAGES/base.po b/archinstall/locales/lt/LC_MESSAGES/base.po index 0a2b255430..25f050a181 100644 --- a/archinstall/locales/lt/LC_MESSAGES/base.po +++ b/archinstall/locales/lt/LC_MESSAGES/base.po @@ -1252,3 +1252,6 @@ msgstr "Archinstall liežuvis" msgid " (default)" msgstr "" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/nl/LC_MESSAGES/base.po b/archinstall/locales/nl/LC_MESSAGES/base.po index 44362dfdfe..e52efbd51f 100644 --- a/archinstall/locales/nl/LC_MESSAGES/base.po +++ b/archinstall/locales/nl/LC_MESSAGES/base.po @@ -1390,6 +1390,9 @@ msgstr "Archinstall-taal" msgid " (default)" msgstr "" +msgid "Press Ctrl+h for help" +msgstr "" + #~ msgid "Add :" #~ msgstr "Toevoegen:" diff --git a/archinstall/locales/pl/LC_MESSAGES/base.po b/archinstall/locales/pl/LC_MESSAGES/base.po index dec517035c..2eb822abb9 100644 --- a/archinstall/locales/pl/LC_MESSAGES/base.po +++ b/archinstall/locales/pl/LC_MESSAGES/base.po @@ -1384,6 +1384,9 @@ msgstr "Język archinstall-a" msgid " (default)" msgstr "(domyślne)" +msgid "Press Ctrl+h for help" +msgstr "" + #~ msgid "When picking a directory to save configuration files to, by default we will ignore the following folders: " #~ msgstr "Podczas wybierania katalogu do zapisywania plików konfiguracyjnych, domyślnie ignorowane są następujące foldery: " diff --git a/archinstall/locales/pt/LC_MESSAGES/base.mo b/archinstall/locales/pt/LC_MESSAGES/base.mo index aea7fe450c..8f05e64068 100644 Binary files a/archinstall/locales/pt/LC_MESSAGES/base.mo and b/archinstall/locales/pt/LC_MESSAGES/base.mo differ diff --git a/archinstall/locales/pt/LC_MESSAGES/base.po b/archinstall/locales/pt/LC_MESSAGES/base.po index 029207e992..575e806cea 100644 --- a/archinstall/locales/pt/LC_MESSAGES/base.po +++ b/archinstall/locales/pt/LC_MESSAGES/base.po @@ -3,7 +3,7 @@ # msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: archinstall\n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" "Last-Translator: Hugo Carvalho \n" @@ -13,7 +13,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.4.1\n" +"X-Generator: Poedit 3.0.1\n" msgid "[!] A log file has been created here: {} {}" msgstr "[!] Foi criado um ficheiro de registo aqui: {} {}" @@ -22,13 +22,13 @@ msgid " Please submit this issue (and file) to https://github.com/archlinux/a msgstr " Submeta este problema (e ficheiro) para https://github.com/archlinux/archinstall/issues" msgid "Do you really want to abort?" -msgstr "Queres mesmo abortar?" +msgstr "Quer mesmo abortar?" msgid "And one more time for verification: " msgstr "Uma última vez para verificação: " msgid "Would you like to use swap on zram?" -msgstr "Gostaria de usar a swap em zram?" +msgstr "Pretende usar a swap em zram?" msgid "Desired hostname for the installation: " msgstr "Nome do computador desejado para a instalação: " @@ -43,10 +43,10 @@ msgid "Should this user be a superuser (sudoer)?" msgstr "Deve este utilizador ser um superutilizador (sudoer)?" msgid "Select a timezone" -msgstr "Selecione um fuso horário" +msgstr "Selecionar um fuso horário" msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?" -msgstr "Gostaria de utilizar o GRUB como carregador de arranque em vez do systemd-boot?" +msgstr "Pretende usar o GRUB como carregador de arranque em vez do systemd-boot?" msgid "Choose a bootloader" msgstr "Escolha um carregador de arranque" @@ -58,7 +58,7 @@ msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr msgstr "Apenas pacotes como base, base-devel, linux, linux-firmware, efibootmgr e pacotes opcionais de perfil são instalados." msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt." -msgstr "Se quer um navegador web, como firefox ou chromium, deve especificá-lo na próxima pergunta." +msgstr "Se quer um navegador web, como firefox ou chromium, deve especificá-lo na pergunta seguinte." msgid "Write additional packages to install (space separated, leave blank to skip): " msgstr "Inserir pacotes adicionais a instalar (separados por espaço, deixar em branco para ignorar): " @@ -70,7 +70,7 @@ msgid "Use NetworkManager (necessary for configuring internet graphically in GNO msgstr "Usar o Gestor de Redes \"NetworkManager\" (necessário para configurar Internet graficamente em GNOME e KDE)" msgid "Select one network interface to configure" -msgstr "Selecione uma interface de rede para configurar" +msgstr "Selecionar uma interface de rede para configurar" msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" msgstr "Selecionar qual o modo a configurar para \"{}\" ou ignorar para usar o modo predefinido \"{}\"" @@ -88,7 +88,7 @@ msgid "Select which filesystem your main partition should use" msgstr "Selecionar o sistema de ficheiros que a partição principal deve utilizar" msgid "Current partition layout" -msgstr "Esquema actual da partições" +msgstr "Esquema atual da partições" msgid "" "Select what to do with\n" @@ -116,7 +116,7 @@ msgid "" msgstr "" "{}\n" "\n" -"Seleciona por índice quais partições remover" +"Selecionar por índice quais partições remover" msgid "" "{}\n" @@ -125,13 +125,13 @@ msgid "" msgstr "" "{}\n" "\n" -"Seleciona por índice quais partições montar em" +"Selecionar por índice quais partições montar em" msgid " * Partition mount-points are relative to inside the installation, the boot would be /boot as an example." msgstr " * Os pontos de montagem das partições são relativos à dentro da instalação, o boot seria /boot por exemplo." msgid "Select where to mount partition (leave blank to remove mountpoint): " -msgstr "Seleciona onde montar a partição (deixa em branco para remover o ponto de montagem): " +msgstr "Selecionar onde montar a partição (deixa em branco para remover o ponto de montagem): " msgid "" "{}\n" @@ -140,7 +140,7 @@ msgid "" msgstr "" "{}\n" "\n" -"Seleciona a partição a mascar para formatar" +"Selecionar a partição a mascar para formatar" msgid "" "{}\n" @@ -149,7 +149,7 @@ msgid "" msgstr "" "{}\n" "\n" -"Seleciona a partição a marcar como encriptada" +"Selecionar a partição a marcar como encriptada" msgid "" "{}\n" @@ -158,7 +158,7 @@ msgid "" msgstr "" "{}\n" "\n" -"Seleciona a partição a marcar como bootável" +"Selecionar a partição a marcar como de arranque" msgid "" "{}\n" @@ -167,10 +167,10 @@ msgid "" msgstr "" "{}\n" "\n" -"Seleciona a partição a definir um sistema de ficheiros" +"Selecionar a partição a definir um sistema de ficheiros" msgid "Enter a desired filesystem type for the partition: " -msgstr "Escreve o tipo de sistema de ficheiros desejado para a partição: " +msgstr "Introduza o tipo de sistema de ficheiros desejado para a partição: " msgid "Archinstall language" msgstr "Idioma do Archinstall" @@ -182,7 +182,7 @@ msgid "Select what to do with each individual drive (followed by partition usage msgstr "Seleciona o que fazer com cada disco individual (seguido de uso de partição)" msgid "Select what you wish to do with the selected block devices" -msgstr "Seleciona o que desejas fazer com os dispositivos de bloco selecionados" +msgstr "Selecionar o que desejas fazer com os dispositivos de bloco selecionados" msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments" msgstr "Esta é uma lista de perfis pré-programados, podem facilitar a instalação de ambientes de trabalho" @@ -652,7 +652,7 @@ msgid "The password you are using seems to be weak, are you sure you want to use msgstr "A palavra-passe que está a usar parece ser fraca, tem a certeza que deseja utilizá-la?" msgid "Provides a selection of desktop environments and tiling window managers, e.g. gnome, kde, sway" -msgstr "Proporciona uma seleção de ambientes gráficos e gerenciadores de janela como por exemplo gnome, kde, sway" +msgstr "Disponibiliza uma seleção de ambientes gráficos e gestores de janela como por exemplo gnome, kde, sway" msgid "Select your desired desktop environment" msgstr "Selecionar o ambiente gráfico desejado" @@ -673,10 +673,10 @@ msgid "Press Enter to continue." msgstr "Prima Enter para continuar." msgid "Would you like to chroot into the newly created installation and perform post-installation configuration?" -msgstr "Deseja fazer chroot para a nova instalação e realizar configuração pós-instalação?" +msgstr "Pretende fazer chroot para a nova instalação e realizar configuração pós-instalação?" msgid "Are you sure you want to reset this setting?" -msgstr "Tem a certeza que desejar repor esta configuração?" +msgstr "Tem a certeza que pretende repor esta configuração?" msgid "Select one or more hard drives to use and configure\n" msgstr "Selecionar uma ou mais unidades a usar e configurar\n" @@ -685,7 +685,7 @@ msgid "Any modifications to the existing setting will reset the disk layout!" msgstr "Quaisquer modificações na configuração existente irá repor o esquema de disco!" msgid "If you reset the harddrive selection this will also reset the current disk layout. Are you sure?" -msgstr "Se repor a seleção da unidade isso também repor o esquema do disco atual. Tem a certeza?" +msgstr "Se repor a seleção da unidade isto também repor o esquema do disco atual. Tem a certeza?" msgid "Save and exit" msgstr "Guardar e sair" @@ -695,22 +695,22 @@ msgid "" "contains queued partitions, this will remove those, are you sure?" msgstr "" "{}\n" -"contém partições enfileiradas, isso irá removê-las, tem certeza?" +"contém partições em fila de espera, isto irá removê-las, tem a certeza?" msgid "No audio server" msgstr "Sem servidor de áudio" msgid "(default)" -msgstr "(por omissão)" +msgstr " (predefinição)" msgid "Use ESC to skip" -msgstr "Use ESC para ignorar" +msgstr "Usar ESC para ignorar" msgid "" "Use CTRL+C to reset current selection\n" "\n" msgstr "" -"Use CTRL+C para redefinir a seleção atual\n" +"Usar CTRL+C para repor a seleção atual\n" "\n" msgid "Copy to: " @@ -1231,107 +1231,92 @@ msgstr "Ignorar a espera pela sincronização automática da hora (isto pode cau msgid "Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." msgstr "A aguardar que a sincronização do chaveiro do Arch Linux (archlinux-keyring-wkd-sync) seja concluída." -#, fuzzy msgid "Selected profiles: " -msgstr "Eliminar perfil" +msgstr "Perfis selecionados: " -#, fuzzy msgid "Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" msgstr "A sincronização da hora não está a ser concluída, enquanto espera - consulte a documentação para obter soluções alternativas: https://archinstall.readthedocs.io/" -#, fuzzy msgid "Mark/Unmark as nodatacow" -msgstr "Marcar/Desmarcar como partição de aranque" +msgstr "Marcar/Desmarcar como nodatacow" -#, fuzzy msgid "Would you like to use compression or disable CoW?" -msgstr "Deseja usar a compressão BTRFS?" +msgstr "Pretende utilizar a compressão ou desativar o CoW?" msgid "Use compression" -msgstr "" +msgstr "Usar compressão" msgid "Disable Copy-on-Write" -msgstr "" +msgstr "Desativar Copy-on-Write" -#, fuzzy msgid "Provides a selection of desktop environments and tiling window managers, e.g. GNOME, KDE Plasma, Sway" -msgstr "Proporciona uma seleção de ambientes gráficos e gerenciadores de janela como por exemplo gnome, kde, sway" +msgstr "Disponibiliza uma seleção de ambientes gráficos e gestores de janelas em mosaico, por exemplo, GNOME, KDE Plasma, Sway" -#, fuzzy msgid "Configuration type: {}" -msgstr "Configuração" +msgstr "Tipo de configuração: {}" -#, fuzzy msgid "LVM configuration type" -msgstr "Nenhuma configuração" +msgstr "Tipo de configuração LVM" msgid "LVM disk encryption with more than 2 partitions is currently not supported" -msgstr "" +msgstr "A encriptação de disco LVM com mais de 2 partições não é atualmente suportada" -#, fuzzy msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)" -msgstr "Usar o Gestor de Redes \"NetworkManager\" (necessário para configurar a Internet graficamente no GNOME e KDE)" +msgstr "Usar o Gestor de redes \"NetworkManager\" (necessário para configurar a Internet graficamente no GNOME e no KDE Plasma)" -#, fuzzy msgid "Select a LVM option" -msgstr "Selecione um fuso horário" +msgstr "Selecionar uma opção LVM" -#, fuzzy msgid "Partitioning" -msgstr "Partição" +msgstr "Particionamento" msgid "Logical Volume Management (LVM)" -msgstr "" +msgstr "Gestão de volumes lógicos (LVM)" msgid "Physical volumes" -msgstr "" +msgstr "Volumes físicos" msgid "Volumes" -msgstr "" +msgstr "Volumes" -#, fuzzy msgid "LVM volumes" -msgstr "Definir subvolumes" +msgstr "Volumes LVM" -#, fuzzy msgid "LVM volumes to be encrypted" -msgstr "Partições a serem encriptadas" +msgstr "Volumes LVM a encriptar" -#, fuzzy msgid "Select which LVM volumes to encrypt" -msgstr "Selecionar quais as partições encriptar" +msgstr "Selecionar os volumes LVM a encriptar" -#, fuzzy msgid "Default layout" -msgstr "Esquema do disco" +msgstr "Estrutura predefinida" -#, fuzzy msgid "No Encryption" -msgstr "Tipo de encriptação" +msgstr "Sem encriptação" msgid "LUKS" -msgstr "" +msgstr "LUKS" msgid "LVM on LUKS" -msgstr "" +msgstr "LVM em LUKS" msgid "LUKS on LVM" -msgstr "" +msgstr "LUKS em LVM" -#, fuzzy msgid "Yes" -msgstr "sim" +msgstr "Sim" msgid "No" -msgstr "" +msgstr "Não" -#, fuzzy msgid "Archinstall help" -msgstr "Idioma do Archinstall" +msgstr "Ajuda do Archinstall" -#, fuzzy msgid " (default)" -msgstr "(por omissão)" +msgstr " (predefinição)" + +msgid "Press Ctrl+h for help" +msgstr "Prima Ctrl+h para obter ajuda" #~ msgid "Add :" #~ msgstr "Adicionar :" diff --git a/archinstall/locales/pt_BR/LC_MESSAGES/base.mo b/archinstall/locales/pt_BR/LC_MESSAGES/base.mo index 4714d73b5a..cc9404bd59 100644 Binary files a/archinstall/locales/pt_BR/LC_MESSAGES/base.mo and b/archinstall/locales/pt_BR/LC_MESSAGES/base.mo differ diff --git a/archinstall/locales/pt_BR/LC_MESSAGES/base.po b/archinstall/locales/pt_BR/LC_MESSAGES/base.po index f520254f31..6f180d2a47 100644 --- a/archinstall/locales/pt_BR/LC_MESSAGES/base.po +++ b/archinstall/locales/pt_BR/LC_MESSAGES/base.po @@ -1235,107 +1235,92 @@ msgstr "Pulando a espera pela sincronização automática de fuso horário (isso msgid "Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." msgstr "Aguardando a sincronização do Arch Linux Keyring (archlinux-keyring-wkd-sync) ser concluída." -#, fuzzy msgid "Selected profiles: " -msgstr "Deletar perfil" +msgstr "Perfis selecionados: " -#, fuzzy msgid "Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" msgstr "Sincronização de fuso horário não concluída, enquanto você espera - confira a documentação para soluções alternativas: https://archinstall.readthedocs.io/" -#, fuzzy msgid "Mark/Unmark as nodatacow" -msgstr "Marcar/desmarcar como inicializável" +msgstr "Marcar/desmarcar como nodatacow" -#, fuzzy msgid "Would you like to use compression or disable CoW?" -msgstr "Deseja usar a compressão BTRFS?" +msgstr "Você gostaria de usar compressão ou desativar a Cópia na Gravação?" msgid "Use compression" -msgstr "" +msgstr "Usar compressão" msgid "Disable Copy-on-Write" -msgstr "" +msgstr "Desativar Cópia na Gravação" -#, fuzzy msgid "Provides a selection of desktop environments and tiling window managers, e.g. GNOME, KDE Plasma, Sway" msgstr "Proporciona uma seleção de ambientes gráficos e gerenciadores de janela como por exemplo gnome, kde, sway" -#, fuzzy msgid "Configuration type: {}" -msgstr "Configuração" +msgstr "Tipo de configuração: {}" -#, fuzzy msgid "LVM configuration type" -msgstr "Nenhuma configuração" +msgstr "Tipo de configuracao LVM" msgid "LVM disk encryption with more than 2 partitions is currently not supported" -msgstr "" +msgstr "Criptografia de disco LVM com mais de 2 partições atualmente não é suportada." -#, fuzzy msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)" msgstr "Usar NetworkManager (necessário para configurar internet graficamente no GNOME e KDE)" -#, fuzzy msgid "Select a LVM option" -msgstr "Selecione um fuso horário" +msgstr "Selecione uma opção de Gerenciador de Volume Logico" -#, fuzzy msgid "Partitioning" -msgstr "Partição" +msgstr "Particionado" msgid "Logical Volume Management (LVM)" -msgstr "" +msgstr "Gerenciamento de Volume Lógico (LVM)" msgid "Physical volumes" -msgstr "" +msgstr "Volumes físicos" msgid "Volumes" -msgstr "" +msgstr "Volumes" -#, fuzzy msgid "LVM volumes" -msgstr "Definir subvolumes" +msgstr "LVM Volumes" -#, fuzzy msgid "LVM volumes to be encrypted" msgstr "Partições a serem encriptadas" -#, fuzzy msgid "Select which LVM volumes to encrypt" -msgstr "Selecione quais partições encriptar" +msgstr "Selecione quais volumes encriptar" -#, fuzzy msgid "Default layout" -msgstr "Layout da unidade" +msgstr "Layout padrão" -#, fuzzy msgid "No Encryption" -msgstr "Tipo de encriptação" +msgstr "Sem encriptação" msgid "LUKS" -msgstr "" +msgstr "LUKS" msgid "LVM on LUKS" -msgstr "" +msgstr "LVM em LUKS" msgid "LUKS on LVM" -msgstr "" +msgstr "LUKS em LVM" -#, fuzzy msgid "Yes" -msgstr "sim" +msgstr "Sim" msgid "No" -msgstr "" +msgstr "Não" -#, fuzzy msgid "Archinstall help" -msgstr "Idioma do Archinstall" +msgstr "Ajuda do archinstall" -#, fuzzy msgid " (default)" msgstr "(padrão)" +msgid "Press Ctrl+h for help" +msgstr "Pressione Ctrl+h para ajuda" + #~ msgid "When picking a directory to save configuration files to, by default we will ignore the following folders: " #~ msgstr "Ao selecionar um diretório para salvar arquivos de configuração, por padrão nós ignoramos as seguintes pastas: " diff --git a/archinstall/locales/ro/LC_MESSAGES/base.po b/archinstall/locales/ro/LC_MESSAGES/base.po index 7e617dae16..6dfe3ea817 100644 --- a/archinstall/locales/ro/LC_MESSAGES/base.po +++ b/archinstall/locales/ro/LC_MESSAGES/base.po @@ -1330,3 +1330,6 @@ msgstr "Limba pentru Archinstall" #, fuzzy msgid " (default)" msgstr "(predefinit)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/ru/LC_MESSAGES/base.mo b/archinstall/locales/ru/LC_MESSAGES/base.mo index e0d4d292c2..74a9041af0 100644 Binary files a/archinstall/locales/ru/LC_MESSAGES/base.mo and b/archinstall/locales/ru/LC_MESSAGES/base.mo differ diff --git a/archinstall/locales/ru/LC_MESSAGES/base.po b/archinstall/locales/ru/LC_MESSAGES/base.po index fbe42b7b0c..8dfee56616 100644 --- a/archinstall/locales/ru/LC_MESSAGES/base.po +++ b/archinstall/locales/ru/LC_MESSAGES/base.po @@ -9,14 +9,19 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.4.4\n" msgid "[!] A log file has been created here: {} {}" msgstr "[!] Здесь был создан файл журнала: {} {}" -msgid " Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues" -msgstr " Пожалуйста, отправьте эту проблему (и файл) по адресу https://github.com/archlinux/archinstall/issues" +msgid "" +" Please submit this issue (and file) to https://github.com/archlinux/" +"archinstall/issues" +msgstr "" +" Пожалуйста, отправьте эту проблему (и файл) по адресу https://github.com/" +"archlinux/archinstall/issues" msgid "Do you really want to abort?" msgstr "Вы действительно хотите прекратить?" @@ -31,10 +36,13 @@ msgid "Desired hostname for the installation: " msgstr "Желаемое имя хоста для установки: " msgid "Username for required superuser with sudo privileges: " -msgstr "Имя пользователя для требуемого суперпользователя с привилегиями sudo: " +msgstr "" +"Имя пользователя для требуемого суперпользователя с привилегиями sudo: " msgid "Any additional users to install (leave blank for no users): " -msgstr "Любые дополнительные пользователи для установки (оставьте пустым, если пользователей нет): " +msgstr "" +"Любые дополнительные пользователи для установки (оставьте пустым, если " +"пользователей нет): " msgid "Should this user be a superuser (sudoer)?" msgstr "Должен ли этот пользователь быть суперпользователем (sudoer)?" @@ -51,38 +59,59 @@ msgstr "Выберите загрузчик" msgid "Choose an audio server" msgstr "Выберите звуковой сервер" -msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr and optional profile packages are installed." -msgstr "Устанавливаются только такие пакеты, как base, base-devel, linux, linux-firmware, efibootmgr и дополнительные пакеты профиля." +msgid "" +"Only packages such as base, base-devel, linux, linux-firmware, efibootmgr " +"and optional profile packages are installed." +msgstr "" +"Устанавливаются только такие пакеты, как base, base-devel, linux, linux-" +"firmware, efibootmgr и дополнительные пакеты профиля." -msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt." -msgstr "Если вы хотите использовать веб-браузер, например, firefox или chromium, вы можете указать его в следующем запросе." +msgid "" +"If you desire a web browser, such as firefox or chromium, you may specify it " +"in the following prompt." +msgstr "" +"Если вы хотите использовать веб-браузер, например, firefox или chromium, вы " +"можете указать его в следующем запросе." -msgid "Write additional packages to install (space separated, leave blank to skip): " -msgstr "Напишите дополнительные пакеты для установки (разделите пробелами, оставьте пустым, чтобы пропустить): " +msgid "" +"Write additional packages to install (space separated, leave blank to skip): " +msgstr "" +"Напишите дополнительные пакеты для установки (разделите пробелами, оставьте " +"пустым, чтобы пропустить): " msgid "Copy ISO network configuration to installation" msgstr "Копировать сетевую конфигурацию ISO в установку" -msgid "Use NetworkManager (necessary for configuring internet graphically in GNOME and KDE)" -msgstr "Использовать NetworkManager (необходим для графической настройки интернета в GNOME и KDE)" +msgid "" +"Use NetworkManager (necessary for configuring internet graphically in GNOME " +"and KDE)" +msgstr "" +"Использовать NetworkManager (необходим для графической настройки интернета в " +"GNOME и KDE)" msgid "Select one network interface to configure" msgstr "Выберите один сетевой интерфейс для настройки" -msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" -msgstr "Выберите режим для конфигурации \"{}\" или пропустите, чтобы использовать режим по умолчанию \"{}\"." +msgid "" +"Select which mode to configure for \"{}\" or skip to use default mode \"{}\"" +msgstr "" +"Выберите режим для конфигурации \"{}\" или пропустите, чтобы использовать " +"режим по умолчанию \"{}\"." msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): " msgstr "Введите IP-адрес и подсеть для {} (пример: 192.168.0.5/24): " msgid "Enter your gateway (router) IP address or leave blank for none: " -msgstr "Введите IP-адрес вашего шлюза (маршрутизатора) или оставьте пустым, если его нет: " +msgstr "" +"Введите IP-адрес вашего шлюза (маршрутизатора) или оставьте пустым, если его " +"нет: " msgid "Enter your DNS servers (space separated, blank for none): " msgstr "Введите ваши DNS-серверы (через пробел, пустой - нет): " msgid "Select which filesystem your main partition should use" -msgstr "Выберите, какую файловую систему должен использовать ваш основной раздел" +msgstr "" +"Выберите, какую файловую систему должен использовать ваш основной раздел" msgid "Current partition layout" msgstr "Текущая разметка разделов" @@ -97,11 +126,16 @@ msgstr "" msgid "Enter a desired filesystem type for the partition" msgstr "Введите желаемый тип файловой системы для раздела" -msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " -msgstr "Введите начальное значение (в раздельных блоках: с, ГБ, % и т.д.; по умолчанию: {}): " +msgid "" +"Enter the start location (in parted units: s, GB, %, etc. ; default: {}): " +msgstr "" +"Введите начальное значение (в раздельных блоках: с, ГБ, % и т.д.; по " +"умолчанию: {}): " msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): " -msgstr "Введите конечное значение (в раздельных блоках: с, Гб, % и т.д.; например: {}): " +msgstr "" +"Введите конечное значение (в раздельных блоках: с, Гб, % и т.д.; например: " +"{}): " msgid "{} contains queued partitions, this will remove those, are you sure?" msgstr "{} содержит разделы в очереди, это удалит их, вы уверены?" @@ -124,11 +158,17 @@ msgstr "" "\n" "Выберите по индексу, какой раздел куда монтировать" -msgid " * Partition mount-points are relative to inside the installation, the boot would be /boot as an example." -msgstr " * Точки монтирования разделов являются относительными внутри установки, например, загрузочный будет /boot." +msgid "" +" * Partition mount-points are relative to inside the installation, the boot " +"would be /boot as an example." +msgstr "" +" * Точки монтирования разделов являются относительными внутри установки, " +"например, загрузочный будет /boot." msgid "Select where to mount partition (leave blank to remove mountpoint): " -msgstr "Выберите куда монтировать раздел (оставьте пустым, чтобы удалить точку монтирования): " +msgstr "" +"Выберите куда монтировать раздел (оставьте пустым, чтобы удалить точку " +"монтирования): " msgid "" "{}\n" @@ -173,16 +213,25 @@ msgid "Archinstall language" msgstr "Язык Archinstall" msgid "Wipe all selected drives and use a best-effort default partition layout" -msgstr "Стереть все выбранные диски и использовать оптимальную схему разделов по умолчанию" +msgstr "" +"Стереть все выбранные диски и использовать оптимальную схему разделов по " +"умолчанию" -msgid "Select what to do with each individual drive (followed by partition usage)" -msgstr "Выберите, что делать с каждым отдельным диском (с последующим использованием разделов)" +msgid "" +"Select what to do with each individual drive (followed by partition usage)" +msgstr "" +"Выберите, что делать с каждым отдельным диском (с последующим использованием " +"разделов)" msgid "Select what you wish to do with the selected block devices" msgstr "Выберите, что вы хотите сделать с выбранными блочными устройствами" -msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments" -msgstr "Это список предварительно запрограммированных профилей, они могут облегчить установку таких вещей, как окружения рабочего стола" +msgid "" +"This is a list of pre-programmed profiles, they might make it easier to " +"install things like desktop environments" +msgstr "" +"Это список предварительно запрограммированных профилей, они могут облегчить " +"установку таких вещей, как окружения рабочего стола" msgid "Select keyboard layout" msgstr "Выберите раскладку клавиатуры" @@ -191,16 +240,29 @@ msgid "Select one of the regions to download packages from" msgstr "Выберите один из регионов для загрузки пакетов" msgid "Select one or more hard drives to use and configure" -msgstr "Выберите один или несколько жестких дисков для использования и настройте их" +msgstr "" +"Выберите один или несколько жестких дисков для использования и настройте их" -msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options." -msgstr "Для наилучшей совместимости с оборудованием AMD вы можете использовать либо все варианты с открытым исходным кодом, либо AMD / ATI." +msgid "" +"For the best compatibility with your AMD hardware, you may want to use " +"either the all open-source or AMD / ATI options." +msgstr "" +"Для наилучшей совместимости с оборудованием AMD вы можете использовать либо " +"все варианты с открытым исходным кодом, либо AMD / ATI." -msgid "For the best compatibility with your Intel hardware, you may want to use either the all open-source or Intel options.\n" -msgstr "Для лучшей совместимости с оборудованием Intel вы можете использовать либо все варианты с открытым исходным кодом, либо Intel.\n" +msgid "" +"For the best compatibility with your Intel hardware, you may want to use " +"either the all open-source or Intel options.\n" +msgstr "" +"Для лучшей совместимости с оборудованием Intel вы можете использовать либо " +"все варианты с открытым исходным кодом, либо Intel.\n" -msgid "For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n" -msgstr "Для наилучшей совместимости с оборудованием Nvidia вы можете использовать проприетарный драйвер Nvidia.\n" +msgid "" +"For the best compatibility with your Nvidia hardware, you may want to use " +"the Nvidia proprietary driver.\n" +msgstr "" +"Для наилучшей совместимости с оборудованием Nvidia вы можете использовать " +"проприетарный драйвер Nvidia.\n" msgid "" "\n" @@ -209,13 +271,15 @@ msgid "" msgstr "" "\n" "\n" -"Выберите графический драйвер или оставьте пустым, чтобы установить все драйверы с открытым исходным кодом" +"Выберите графический драйвер или оставьте пустым, чтобы установить все " +"драйверы с открытым исходным кодом" msgid "All open-source (default)" msgstr "Все с открытым исходным кодом (по умолчанию)" msgid "Choose which kernels to use or leave blank for default \"{}\"" -msgstr "Выберите, какие ядра использовать, или оставьте пустым по умолчанию \"{}\"." +msgstr "" +"Выберите, какие ядра использовать, или оставьте пустым по умолчанию \"{}\"." msgid "Choose which locale language to use" msgstr "Выберите, какой язык локали использовать" @@ -232,8 +296,12 @@ msgstr "Выберите один или несколько из приведе msgid "Adding partition...." msgstr "Добавление раздела...." -msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's." -msgstr "Чтобы продолжить, вам нужно ввести действительный fs-тип. Смотрите `man parted` для правильных fs-типов." +msgid "" +"You need to enter a valid fs-type in order to continue. See `man parted` for " +"valid fs-type's." +msgstr "" +"Чтобы продолжить, вам нужно ввести действительный fs-тип. Смотрите `man " +"parted` для правильных fs-типов." msgid "Error: Listing profiles on URL \"{}\" resulted in:" msgstr "Ошибка: Перечисление профилей по URL \"{}\" привело к:" @@ -305,7 +373,8 @@ msgid "" "Do you wish to continue?" msgstr "" "Вы решили пропустить выбор жесткого диска\n" -"и будете использовать любой диск, смонтированный по адресу {} (экспериментально)\n" +"и будете использовать любой диск, смонтированный по адресу {} " +"(экспериментально)\n" "ПРЕДУПРЕЖДЕНИЕ: Archinstall не будет проверять пригодность этой установки.\n" "Вы хотите продолжить?" @@ -325,13 +394,16 @@ msgid "Assign mount-point for a partition" msgstr "Назначить точку монтирования для раздела" msgid "Mark/Unmark a partition to be formatted (wipes data)" -msgstr "Пометить/снять отметку с раздела, который будет отформатирован (стирание данных)" +msgstr "" +"Пометить/снять отметку с раздела, который будет отформатирован (стирание " +"данных)" msgid "Mark/Unmark a partition as encrypted" msgstr "Пометить/снять отметку с раздела как зашифрованный" msgid "Mark/Unmark a partition as bootable (automatic for /boot)" -msgstr "Пометить/снять отметку с раздела как загрузочный (автоматически для /boot)" +msgstr "" +"Пометить/снять отметку с раздела как загрузочный (автоматически для /boot)" msgid "Set desired filesystem for a partition" msgstr "Установите желаемую файловую систему для раздела" @@ -371,7 +443,8 @@ msgid "Enter a encryption password for {}" msgstr "Введите пароль шифрования для {}" msgid "Enter disk encryption password (leave blank for no encryption): " -msgstr "Введите пароль шифрования диска (оставьте пустым для отсутствия шифрования): " +msgstr "" +"Введите пароль шифрования диска (оставьте пустым для отсутствия шифрования): " msgid "Create a required super-user with sudo privileges: " msgstr "Создайте необходимого суперпользователя с привилегиями sudo: " @@ -382,31 +455,43 @@ msgstr "Введите пароль root (оставьте пустым, что msgid "Password for user \"{}\": " msgstr "Пароль для пользователя \"{}\": " -msgid "Verifying that additional packages exist (this might take a few seconds)" -msgstr "Проверка наличия дополнительных пакетов (это может занять несколько секунд)" +msgid "" +"Verifying that additional packages exist (this might take a few seconds)" +msgstr "" +"Проверка наличия дополнительных пакетов (это может занять несколько секунд)" -msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n" -msgstr "Вы хотите использовать автоматическую синхронизацию времени (NTP) с серверами времени по умолчанию?\n" +msgid "" +"Would you like to use automatic time synchronization (NTP) with the default " +"time servers?\n" +msgstr "" +"Вы хотите использовать автоматическую синхронизацию времени (NTP) с " +"серверами времени по умолчанию?\n" msgid "" -"Hardware time and other post-configuration steps might be required in order for NTP to work.\n" +"Hardware time and other post-configuration steps might be required in order " +"for NTP to work.\n" "For more information, please check the Arch wiki" msgstr "" -"Для работы NTP может потребоваться аппаратное время и другие шаги после конфигурации.\n" +"Для работы NTP может потребоваться аппаратное время и другие шаги после " +"конфигурации.\n" "Для получения дополнительной информации, пожалуйста, ознакомьтесь с ArchWiki" msgid "Enter a username to create an additional user (leave blank to skip): " -msgstr "Введите имя пользователя для создания дополнительного пользователя (оставьте пустым, чтобы пропустить): " +msgstr "" +"Введите имя пользователя для создания дополнительного пользователя (оставьте " +"пустым, чтобы пропустить): " msgid "Use ESC to skip\n" msgstr "Используйте ESC, чтобы пропустить\n" msgid "" "\n" -" Choose an object from the list, and select one of the available actions for it to execute" +" Choose an object from the list, and select one of the available actions for " +"it to execute" msgstr "" "\n" -" Выберите объект из списка и выберите одно из доступных действий для его выполнения" +" Выберите объект из списка и выберите одно из доступных действий для его " +"выполнения" msgid "Cancel" msgstr "Отменить" @@ -442,11 +527,17 @@ msgstr "" "\n" "Это выбранная вами конфигурация:" -msgid "Pacman is already running, waiting maximum 10 minutes for it to terminate." -msgstr "Pacman уже запущен, ожидание его завершения составляет максимум 10 минут." +msgid "" +"Pacman is already running, waiting maximum 10 minutes for it to terminate." +msgstr "" +"Pacman уже запущен, ожидание его завершения составляет максимум 10 минут." -msgid "Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall." -msgstr "Существовавшая ранее блокировка pacman не завершилась. Пожалуйста, очистите все существующие сессии pacman перед использованием archinstall." +msgid "" +"Pre-existing pacman lock never exited. Please clean up any existing pacman " +"sessions before using archinstall." +msgstr "" +"Существовавшая ранее блокировка pacman не завершилась. Пожалуйста, очистите " +"все существующие сессии pacman перед использованием archinstall." msgid "Choose which optional additional repositories to enable" msgstr "Выберите, какие дополнительные репозитории следует включить" @@ -537,7 +628,8 @@ msgid "Missing configurations:\n" msgstr "Отсутствующие конфигурации:\n" msgid "Either root-password or at least 1 superuser must be specified" -msgstr "Должен быть указан либо пароль root, либо как минимум 1 суперпользователь" +msgstr "" +"Должен быть указан либо пароль root, либо как минимум 1 суперпользователь" msgid "Manage superuser accounts: " msgstr "Управление учетными записями суперпользователей: " @@ -597,8 +689,12 @@ msgstr "Хотите ли вы использовать сжатие BTRFS?" msgid "Would you like to create a separate partition for /home?" msgstr "Хотите ли вы создать отдельный раздел для /home?" -msgid "The selected drives do not have the minimum capacity required for an automatic suggestion\n" -msgstr "Выбранные диски не имеют минимальной емкости, необходимой для автоматического предложения\n" +msgid "" +"The selected drives do not have the minimum capacity required for an " +"automatic suggestion\n" +msgstr "" +"Выбранные диски не имеют минимальной емкости, необходимой для " +"автоматического предложения\n" msgid "Minimum capacity for /home partition: {}GB\n" msgstr "Минимальный размер раздела /home: {}GB\n" @@ -625,7 +721,9 @@ msgid "No iface specified for manual configuration" msgstr "Не указан iface для ручной настройки" msgid "Manual nic configuration with no auto DHCP requires an IP address" -msgstr "Ручная конфигурация сетевого адаптера без автоматического DHCP требует IP-адреса" +msgstr "" +"Ручная конфигурация сетевого адаптера без автоматического DHCP требует IP-" +"адреса" msgid "Add interface" msgstr "Добавить интерфейс" @@ -645,44 +743,74 @@ msgstr "Ручная конфигурация" msgid "Mark/Unmark a partition as compressed (btrfs only)" msgstr "Пометить/снять отметку с раздела как сжатый (только для btrfs)" -msgid "The password you are using seems to be weak, are you sure you want to use it?" -msgstr "Пароль, который вы используете, кажется слабым, вы уверены, что хотите его использовать?" +msgid "" +"The password you are using seems to be weak, are you sure you want to use it?" +msgstr "" +"Пароль, который вы используете, кажется слабым, вы уверены, что хотите его " +"использовать?" -msgid "Provides a selection of desktop environments and tiling window managers, e.g. gnome, kde, sway" -msgstr "Предоставляет выбор окружений рабочего стола и тайловых оконных менеджеров, например, gnome, kde, sway" +msgid "" +"Provides a selection of desktop environments and tiling window managers, e." +"g. gnome, kde, sway" +msgstr "" +"Предоставляет выбор окружений рабочего стола и тайловых оконных менеджеров, " +"например, gnome, kde, sway" msgid "Select your desired desktop environment" msgstr "Выберите желаемое окружение рабочего стола" -msgid "A very basic installation that allows you to customize Arch Linux as you see fit." -msgstr "Очень базовая установка, позволяющая настроить Arch Linux по своему усмотрению." +msgid "" +"A very basic installation that allows you to customize Arch Linux as you see " +"fit." +msgstr "" +"Очень базовая установка, позволяющая настроить Arch Linux по своему " +"усмотрению." -msgid "Provides a selection of various server packages to install and enable, e.g. httpd, nginx, mariadb" -msgstr "Предоставляет выбор различных пакетов сервера для установки и включения, например, httpd, nginx, mariadb" +msgid "" +"Provides a selection of various server packages to install and enable, e.g. " +"httpd, nginx, mariadb" +msgstr "" +"Предоставляет выбор различных пакетов сервера для установки и включения, " +"например, httpd, nginx, mariadb" -msgid "Choose which servers to install, if none then a minimal installation will be done" -msgstr "Выберите серверы для установки, если их нет, то будет выполнена минимальная установка" +msgid "" +"Choose which servers to install, if none then a minimal installation will be " +"done" +msgstr "" +"Выберите серверы для установки, если их нет, то будет выполнена минимальная " +"установка" msgid "Installs a minimal system as well as xorg and graphics drivers." -msgstr "Устанавливает минимальную систему, а также xorg и графические драйверы." +msgstr "" +"Устанавливает минимальную систему, а также xorg и графические драйверы." msgid "Press Enter to continue." msgstr "Нажмите Enter, чтобы продолжить." -msgid "Would you like to chroot into the newly created installation and perform post-installation configuration?" -msgstr "Хотите ли вы использовать chroot в новой созданной установке и выполнить настройку после установки?" +msgid "" +"Would you like to chroot into the newly created installation and perform " +"post-installation configuration?" +msgstr "" +"Хотите ли вы использовать chroot в новой созданной установке и выполнить " +"настройку после установки?" msgid "Are you sure you want to reset this setting?" msgstr "Вы уверены, что хотите сбросить эту настройку?" msgid "Select one or more hard drives to use and configure\n" -msgstr "Выберите один или несколько жестких дисков для использования и настройки\n" +msgstr "" +"Выберите один или несколько жестких дисков для использования и настройки\n" msgid "Any modifications to the existing setting will reset the disk layout!" -msgstr "Любые изменения существующей настройки приведут к сбросу разметки диска!" +msgstr "" +"Любые изменения существующей настройки приведут к сбросу разметки диска!" -msgid "If you reset the harddrive selection this will also reset the current disk layout. Are you sure?" -msgstr "Если вы сбросите выбор жесткого диска, это также сбросит текущую разметку диска. Вы уверены?" +msgid "" +"If you reset the harddrive selection this will also reset the current disk " +"layout. Are you sure?" +msgstr "" +"Если вы сбросите выбор жесткого диска, это также сбросит текущую разметку " +"диска. Вы уверены?" msgid "Save and exit" msgstr "Сохранить и выйти" @@ -728,8 +856,12 @@ msgstr "Добавить: " msgid "Value: " msgstr "Значение: " -msgid "You can skip selecting a drive and partitioning and use whatever drive-setup is mounted at /mnt (experimental)" -msgstr "Вы можете не выбирать диск и разметку и использовать любой диск, смонтированный в /mnt (экспериментально)" +msgid "" +"You can skip selecting a drive and partitioning and use whatever drive-setup " +"is mounted at /mnt (experimental)" +msgstr "" +"Вы можете не выбирать диск и разметку и использовать любой диск, " +"смонтированный в /mnt (экспериментально)" msgid "Select one of the disks or skip and use /mnt as default" msgstr "Выберите один из дисков или пропустите и используйте /mnt по умолчанию" @@ -752,8 +884,12 @@ msgstr "Свободное место" msgid "Bus-type" msgstr "Тип шины" -msgid "Either root-password or at least 1 user with sudo privileges must be specified" -msgstr "Должен быть указан либо пароль root, либо хотя бы 1 пользователь с привилегиями sudo" +msgid "" +"Either root-password or at least 1 user with sudo privileges must be " +"specified" +msgstr "" +"Должен быть указан либо пароль root, либо хотя бы 1 пользователь с " +"привилегиями sudo" msgid "Enter username (leave blank to skip): " msgstr "Введите имя пользователя (оставьте пустым, чтобы пропустить): " @@ -791,8 +927,12 @@ msgstr "Удалить подтом" msgid "Configured {} interfaces" msgstr "Настроено интерфейсов: {}" -msgid "This option enables the number of parallel downloads that can occur during installation" -msgstr "Этот параметр определяет количество параллельных загрузок, которые могут происходить во время установки" +msgid "" +"This option enables the number of parallel downloads that can occur during " +"installation" +msgstr "" +"Этот параметр определяет количество параллельных загрузок, которые могут " +"происходить во время установки" msgid "" "Enter the number of parallel downloads to be enabled.\n" @@ -803,18 +943,34 @@ msgstr "" " (Введите значение от 1 до {})\n" "Примечание:" -msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {} downloads at a time )" -msgstr " - Минимальное значение: {} ( Позволяет {} параллельную загрузку, позволяет {} загрузки одновременно )" +msgid "" +" - Maximum value : {} ( Allows {} parallel downloads, allows {} downloads " +"at a time )" +msgstr "" +" - Минимальное значение: {} ( Позволяет {} параллельную загрузку, позволяет " +"{} загрузки одновременно )" -msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a time )" -msgstr " - Минимальное значение: 1 ( Позволяет 1 параллельную загрузку, позволяет 2 загрузки одновременно )" +msgid "" +" - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a " +"time )" +msgstr "" +" - Минимальное значение: 1 ( Позволяет 1 параллельную загрузку, позволяет 2 " +"загрузки одновременно )" -msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )" -msgstr " - Отключить/по умолчанию: 0 ( Отключает параллельную загрузку, позволяет только 1 загрузку за один раз )" +msgid "" +" - Disable/Default : 0 ( Disables parallel downloading, allows only 1 " +"download at a time )" +msgstr "" +" - Отключить/по умолчанию: 0 ( Отключает параллельную загрузку, позволяет " +"только 1 загрузку за один раз )" #, python-brace-format -msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]" -msgstr "Неверный ввод! Повторите попытку с правильным вводом [1 - {max_downloads}, или 0 - отключить]" +msgid "" +"Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to " +"disable]" +msgstr "" +"Неверный ввод! Повторите попытку с правильным вводом [1 - {max_downloads}, " +"или 0 - отключить]" msgid "Parallel Downloads" msgstr "Параллельные загрузки" @@ -831,14 +987,20 @@ msgstr "TAB, чтобы выбрать" msgid "[Default value: 0] > " msgstr "[Значение по умолчанию: 0] > " -msgid "To be able to use this translation, please install a font manually that supports the language." -msgstr "Чтобы иметь возможность использовать этот перевод, пожалуйста, установите вручную шрифт, поддерживающий данный язык." +msgid "" +"To be able to use this translation, please install a font manually that " +"supports the language." +msgstr "" +"Чтобы иметь возможность использовать этот перевод, пожалуйста, установите " +"вручную шрифт, поддерживающий данный язык." msgid "The font should be stored as {}" msgstr "Шрифт должен быть сохранен как {}" msgid "Archinstall requires root privileges to run. See --help for more." -msgstr "Для запуска Archinstall требуются привилегии root. Для получения дополнительной информации смотрите --help." +msgstr "" +"Для запуска Archinstall требуются привилегии root. Для получения " +"дополнительной информации смотрите --help." msgid "Select an execution mode" msgstr "Выберите режим выполнения" @@ -846,14 +1008,22 @@ msgstr "Выберите режим выполнения" msgid "Unable to fetch profile from specified url: {}" msgstr "Невозможно получить профиль из указанного url: {}" -msgid "Profiles must have unique name, but profile definitions with duplicate name found: {}" -msgstr "Профили должны иметь уникальное имя, но найдены определения профиля с дублирующимся именем: {}" +msgid "" +"Profiles must have unique name, but profile definitions with duplicate name " +"found: {}" +msgstr "" +"Профили должны иметь уникальное имя, но найдены определения профиля с " +"дублирующимся именем: {}" msgid "Select one or more devices to use and configure" msgstr "Выберите одно или несколько устройств для использования и настройки" -msgid "If you reset the device selection this will also reset the current disk layout. Are you sure?" -msgstr "Если вы сбросите выбор устройства, это также сбросит текущую разметку дисков. Вы уверены?" +msgid "" +"If you reset the device selection this will also reset the current disk " +"layout. Are you sure?" +msgstr "" +"Если вы сбросите выбор устройства, это также сбросит текущую разметку " +"дисков. Вы уверены?" msgid "Existing Partitions" msgstr "Существующие разделы" @@ -870,8 +1040,12 @@ msgstr "Минимальный размер раздела /home: {}GiB\n" msgid "Minimum capacity for Arch Linux partition: {}GiB" msgstr "Минимальный размер раздела Arch Linux: {}GiB" -msgid "This is a list of pre-programmed profiles_bck, they might make it easier to install things like desktop environments" -msgstr "Это список предварительно запрограммированных профилей, они могут облегчить установку таких вещей, как окружения рабочего стола" +msgid "" +"This is a list of pre-programmed profiles_bck, they might make it easier to " +"install things like desktop environments" +msgstr "" +"Это список предварительно запрограммированных профилей, они могут облегчить " +"установку таких вещей, как окружения рабочего стола" msgid "Current profile selection" msgstr "Текущий выбор профиля" @@ -903,14 +1077,26 @@ msgstr "Удалить раздел" msgid "Partition" msgstr "Раздел" -msgid "This partition is currently encrypted, to format it a filesystem has to be specified" -msgstr "Этот раздел в настоящее время зашифрован, для его форматирования необходимо указать файловую систему" +msgid "" +"This partition is currently encrypted, to format it a filesystem has to be " +"specified" +msgstr "" +"Этот раздел в настоящее время зашифрован, для его форматирования необходимо " +"указать файловую систему" -msgid "Partition mount-points are relative to inside the installation, the boot would be /boot as an example." -msgstr "Точки монтирования разделов являются относительными внутри установки, например, загрузочный раздел будет /boot." +msgid "" +"Partition mount-points are relative to inside the installation, the boot " +"would be /boot as an example." +msgstr "" +"Точки монтирования разделов являются относительными внутри установки, " +"например, загрузочный раздел будет /boot." -msgid "If mountpoint /boot is set, then the partition will also be marked as bootable." -msgstr "Если установлена точка монтирования /boot, то раздел также будет помечен как загрузочный." +msgid "" +"If mountpoint /boot is set, then the partition will also be marked as " +"bootable." +msgstr "" +"Если установлена точка монтирования /boot, то раздел также будет помечен как " +"загрузочный." msgid "Mountpoint: " msgstr "Точка монтирования: " @@ -924,8 +1110,11 @@ msgstr "Всего секторов: {}" msgid "Enter the start sector (default: {}): " msgstr "Введите начальный сектор (по умолчанию: {}): " -msgid "Enter the end sector of the partition (percentage or block number, default: {}): " -msgstr "Введите конечный сектор раздела (процент или номер блока, по умолчанию: {}): " +msgid "" +"Enter the end sector of the partition (percentage or block number, default: " +"{}): " +msgstr "" +"Введите конечный сектор раздела (процент или номер блока, по умолчанию: {}): " msgid "This will remove all newly added partitions, continue?" msgstr "Это приведет к удалению всех вновь добавленных разделов, продолжить?" @@ -991,13 +1180,19 @@ msgid "Back" msgstr "Назад" msgid "Please chose which greeter to install for the chosen profiles: {}" -msgstr "Пожалуйста, выберите, какой экран приветствия установить для выбранных профилей: {}" +msgstr "" +"Пожалуйста, выберите, какой экран приветствия установить для выбранных " +"профилей: {}" msgid "Environment type: {}" msgstr "Тип окружения рабочего стола: {}" -msgid "The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues, are you okay with that?" -msgstr "Проприетарный драйвер Nvidia не поддерживается Sway. Вполне вероятно, что вы столкнетесь с проблемами, вы согласны с этим?" +msgid "" +"The proprietary Nvidia driver is not supported by Sway. It is likely that " +"you will run into issues, are you okay with that?" +msgstr "" +"Проприетарный драйвер Nvidia не поддерживается Sway. Вполне вероятно, что вы " +"столкнетесь с проблемами, вы согласны с этим?" msgid "Installed packages" msgstr "Устанавливаемые пакеты" @@ -1017,11 +1212,19 @@ msgstr "Имя профиля: " msgid "The profile name you entered is already in use. Try again" msgstr "Введенное вами имя профиля уже используется. Попробуйте еще раз" -msgid "Packages to be install with this profile (space separated, leave blank to skip): " -msgstr "Пакеты, которые будут установлены с этим профилем (разделенные пробелами, оставьте пустым, чтобы пропустить): " +msgid "" +"Packages to be install with this profile (space separated, leave blank to " +"skip): " +msgstr "" +"Пакеты, которые будут установлены с этим профилем (разделенные пробелами, " +"оставьте пустым, чтобы пропустить): " -msgid "Services to be enabled with this profile (space separated, leave blank to skip): " -msgstr "Службы, которые должны быть включены с помощью этого профиля (разделенные пробелами, оставьте пустым, чтобы пропустить): " +msgid "" +"Services to be enabled with this profile (space separated, leave blank to " +"skip): " +msgstr "" +"Службы, которые должны быть включены с помощью этого профиля (разделенные " +"пробелами, оставьте пустым, чтобы пропустить): " msgid "Should this profile be enabled for installation?" msgstr "Должен ли этот профиль быть включен для установки?" @@ -1034,10 +1237,15 @@ msgid "" "Select a graphics driver or leave blank to install all open-source drivers" msgstr "" "\n" -"Выберите графический драйвер или оставьте пустым, чтобы установить все драйверы с открытым исходным кодом" +"Выберите графический драйвер или оставьте пустым, чтобы установить все " +"драйверы с открытым исходным кодом" -msgid "Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" -msgstr "Sway необходим доступ к вашему компьютеру (набор аппаратных устройств, т.е. клавиатура, мышь и т.д.)" +msgid "" +"Sway needs access to your seat (collection of hardware devices i.e. " +"keyboard, mouse, etc)" +msgstr "" +"Sway необходим доступ к вашему компьютеру (набор аппаратных устройств, т.е. " +"клавиатура, мышь и т.д.)" msgid "" "\n" @@ -1103,10 +1311,12 @@ msgid "Save user configuration (including disk layout)" msgstr "Сохранить конфигурацию пользователя (включая разметку диска)" msgid "" -"Enter a directory for the configuration(s) to be saved (tab completion enabled)\n" +"Enter a directory for the configuration(s) to be saved (tab completion " +"enabled)\n" "Save directory: " msgstr "" -"Введите каталог для сохранения конфигурации (-ций) (включено заполнение вкладок)\n" +"Введите каталог для сохранения конфигурации (-ций) (включено заполнение " +"вкладок)\n" "Каталог сохранения: " msgid "" @@ -1127,26 +1337,39 @@ msgstr "Зеркала" msgid "Mirror regions" msgstr "Регионы зеркала" -msgid " - Maximum value : {} ( Allows {} parallel downloads, allows {max_downloads+1} downloads at a time )" -msgstr " - Максимальное значение: {} ( Позволяет {} параллельных загрузок, позволяет {max_downloads+1} загрузок одновременно )" +msgid "" +" - Maximum value : {} ( Allows {} parallel downloads, allows " +"{max_downloads+1} downloads at a time )" +msgstr "" +" - Максимальное значение: {} ( Позволяет {} параллельных загрузок, позволяет " +"{max_downloads+1} загрузок одновременно )" msgid "Invalid input! Try again with a valid input [1 to {}, or 0 to disable]" -msgstr "Неверный ввод! Повторите попытку с правильным вводом [1 - {}, или 0 - отключить]" +msgstr "" +"Неверный ввод! Повторите попытку с правильным вводом [1 - {}, или 0 - " +"отключить]" msgid "Locales" msgstr "Локализации" -msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)" -msgstr "Использовать NetworkManager (необходим для графической настройки интернета в GNOME и KDE)" +msgid "" +"Use NetworkManager (necessary to configure internet graphically in GNOME and " +"KDE)" +msgstr "" +"Использовать NetworkManager (необходим для графической настройки интернета в " +"GNOME и KDE)" msgid "Total: {} / {}" msgstr "Весь размер: {} / {}" msgid "All entered values can be suffixed with a unit: B, KB, KiB, MB, MiB..." -msgstr "Все вводимые значения могут иметь суффикс с единицей измерения: Б, Кб, КиБ, Мб, МиБ..." +msgstr "" +"Все вводимые значения могут иметь суффикс с единицей измерения: Б, Кб, КиБ, " +"Мб, МиБ..." msgid "If no unit is provided, the value is interpreted as sectors" -msgstr "Если единица измерения не указана, то значение интерпретируется как сектор" +msgstr "" +"Если единица измерения не указана, то значение интерпретируется как сектор" msgid "Enter start (default: sector {}): " msgstr "Введите начало (по умолчанию: сектор {}): " @@ -1173,8 +1396,12 @@ msgstr "Неверная конфигурация: {error}" msgid "Type" msgstr "Тип" -msgid "This option enables the number of parallel downloads that can occur during package downloads" -msgstr "Этот параметр определяет количество параллельных загрузок, которые могут происходить во время загрузки пакетов" +msgid "" +"This option enables the number of parallel downloads that can occur during " +"package downloads" +msgstr "" +"Этот параметр определяет количество параллельных загрузок, которые могут " +"происходить во время загрузки пакетов" msgid "" "Enter the number of parallel downloads to be enabled.\n" @@ -1185,17 +1412,30 @@ msgstr "" "\n" "Примечание:\n" -msgid " - Maximum recommended value : {} ( Allows {} parallel downloads at a time )" -msgstr " - Максимальное рекомендуемое значение: {} ( Позволяет {} параллельных загрузок одновременно )" +msgid "" +" - Maximum recommended value : {} ( Allows {} parallel downloads at a time )" +msgstr "" +" - Максимальное рекомендуемое значение: {} ( Позволяет {} параллельных " +"загрузок одновременно )" -msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )\n" -msgstr " - Отключить/по умолчанию: 0 ( Отключает параллельную загрузку, позволяет только 1 загрузку за один раз )\n" +msgid "" +" - Disable/Default : 0 ( Disables parallel downloading, allows only 1 " +"download at a time )\n" +msgstr "" +" - Отключить/по умолчанию: 0 ( Отключает параллельную загрузку, позволяет " +"только 1 загрузку за один раз )\n" msgid "Invalid input! Try again with a valid input [or 0 to disable]" -msgstr "Неверный ввод! Повторите попытку с правильным вводом [ или 0, чтобы отключить ]" +msgstr "" +"Неверный ввод! Повторите попытку с правильным вводом [ или 0, чтобы " +"отключить ]" -msgid "Hyprland needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)" -msgstr "Hyprland необходим доступ к вашему компьютеру ( набор аппаратных устройств, т.е. клавиатура, мышь и т.д. )" +msgid "" +"Hyprland needs access to your seat (collection of hardware devices i.e. " +"keyboard, mouse, etc)" +msgstr "" +"Hyprland необходим доступ к вашему компьютеру ( набор аппаратных устройств, " +"т.е. клавиатура, мышь и т.д. )" msgid "" "\n" @@ -1206,8 +1446,11 @@ msgstr "" "\n" "Выберите опцию, чтобы предоставить Hyprland доступ к вашему оборудованию" -msgid "All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..." -msgstr "Все вводимые значения могут иметь суффикс с единицей измерения: %, Б, Кб, КиБ, Мб, МиБ..." +msgid "" +"All entered values can be suffixed with a unit: %, B, KB, KiB, MB, MiB..." +msgstr "" +"Все вводимые значения могут иметь суффикс с единицей измерения: %, Б, Кб, " +"КиБ, Мб, МиБ..." msgid "Would you like to use unified kernel images?" msgstr "Хотите ли Вы использовать унифицированные образы ядра?" @@ -1218,20 +1461,35 @@ msgstr "Унифицированные образы ядра" msgid "Waiting for time sync (timedatectl show) to complete." msgstr "Ожидание завершения синхронизации времени (timedatectl show)." -msgid "Time syncronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" -msgstr "Синхронизация времени не завершена, пока вы ждете - проверьте документацию на предмет обходных путей: https://archinstall.readthedocs.io/" +msgid "" +"Time syncronization not completing, while you wait - check the docs for " +"workarounds: https://archinstall.readthedocs.io/" +msgstr "" +"Синхронизация времени не завершена, пока вы ждете - проверьте документацию " +"на предмет обходных путей: https://archinstall.readthedocs.io/" -msgid "Skipping waiting for automatic time sync (this can cause issues if time is out of sync during installation)" -msgstr "Пропуск ожидания автоматической синхронизации времени (это может привести к проблемам, если время не синхронизируется во время установки)" +msgid "" +"Skipping waiting for automatic time sync (this can cause issues if time is " +"out of sync during installation)" +msgstr "" +"Пропуск ожидания автоматической синхронизации времени (это может привести к " +"проблемам, если время не синхронизируется во время установки)" -msgid "Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." -msgstr "Ожидание завершения синхронизации связки ключей Arch Linux (archlinux-keyring-wkd-sync)." +msgid "" +"Waiting for Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete." +msgstr "" +"Ожидание завершения синхронизации связки ключей Arch Linux (archlinux-" +"keyring-wkd-sync)." msgid "Selected profiles: " msgstr "Выбранные профили: " -msgid "Time synchronization not completing, while you wait - check the docs for workarounds: https://archinstall.readthedocs.io/" -msgstr "Синхронизация времени не завершена, пока вы ждете - проверьте документацию на предмет обходных путей: https://archinstall.readthedocs.io/" +msgid "" +"Time synchronization not completing, while you wait - check the docs for " +"workarounds: https://archinstall.readthedocs.io/" +msgstr "" +"Синхронизация времени не завершена, пока вы ждете - проверьте документацию " +"на предмет обходных путей: https://archinstall.readthedocs.io/" msgid "Mark/Unmark as nodatacow" msgstr "Пометить/снять пометку как nodatacow" @@ -1245,8 +1503,12 @@ msgstr "Использовать сжатие" msgid "Disable Copy-on-Write" msgstr "Отключить копирование при записи (CoW)" -msgid "Provides a selection of desktop environments and tiling window managers, e.g. GNOME, KDE Plasma, Sway" -msgstr "Предоставляет выбор окружений рабочего стола и тайловых оконных менеджеров, например, GNOME, KDE Plasma, Sway" +msgid "" +"Provides a selection of desktop environments and tiling window managers, e." +"g. GNOME, KDE Plasma, Sway" +msgstr "" +"Предоставляет выбор окружений рабочего стола и тайловых оконных менеджеров, " +"например, GNOME, KDE Plasma, Sway" msgid "Configuration type: {}" msgstr "Тип конфигурации: {}" @@ -1254,11 +1516,18 @@ msgstr "Тип конфигурации: {}" msgid "LVM configuration type" msgstr "Тип конфигурации LVM" -msgid "LVM disk encryption with more than 2 partitions is currently not supported" -msgstr "Шифрование дисков LVM с более чем 2 разделами в настоящее время не поддерживается" +msgid "" +"LVM disk encryption with more than 2 partitions is currently not supported" +msgstr "" +"Шифрование дисков LVM с более чем 2 разделами в настоящее время не " +"поддерживается" -msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE Plasma)" -msgstr "Использовать NetworkManager (необходим для графической настройки интернета в GNOME и KDE Plasma)" +msgid "" +"Use NetworkManager (necessary to configure internet graphically in GNOME and " +"KDE Plasma)" +msgstr "" +"Использовать NetworkManager (необходим для графической настройки интернета в " +"GNOME и KDE Plasma)" msgid "Select a LVM option" msgstr "Выберите вариант LVM" @@ -1310,3 +1579,6 @@ msgstr "Справка Archinstall" msgid " (default)" msgstr " (по умолчанию)" + +msgid "Press Ctrl+h for help" +msgstr "Нажмите Ctrl+h для справки" diff --git a/archinstall/locales/sv/LC_MESSAGES/base.po b/archinstall/locales/sv/LC_MESSAGES/base.po index f4dbea3c05..a3e46c4aef 100644 --- a/archinstall/locales/sv/LC_MESSAGES/base.po +++ b/archinstall/locales/sv/LC_MESSAGES/base.po @@ -1376,3 +1376,6 @@ msgstr "Språk för detta gränssnitt" #, fuzzy msgid " (default)" msgstr "(standard)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/ta/LC_MESSAGES/base.mo b/archinstall/locales/ta/LC_MESSAGES/base.mo index 595ab95091..3dd25a54cb 100644 Binary files a/archinstall/locales/ta/LC_MESSAGES/base.mo and b/archinstall/locales/ta/LC_MESSAGES/base.mo differ diff --git a/archinstall/locales/ta/LC_MESSAGES/base.po b/archinstall/locales/ta/LC_MESSAGES/base.po index c90696e394..29f464876b 100644 --- a/archinstall/locales/ta/LC_MESSAGES/base.po +++ b/archinstall/locales/ta/LC_MESSAGES/base.po @@ -1311,3 +1311,6 @@ msgstr "Archinstall உதவி" msgid " (default)" msgstr "(இயல்புநிலை)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/tr/LC_MESSAGES/base.mo b/archinstall/locales/tr/LC_MESSAGES/base.mo index cd82b635bc..829b896361 100644 Binary files a/archinstall/locales/tr/LC_MESSAGES/base.mo and b/archinstall/locales/tr/LC_MESSAGES/base.mo differ diff --git a/archinstall/locales/tr/LC_MESSAGES/base.po b/archinstall/locales/tr/LC_MESSAGES/base.po index b731abbc82..e67716ac50 100644 --- a/archinstall/locales/tr/LC_MESSAGES/base.po +++ b/archinstall/locales/tr/LC_MESSAGES/base.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 21.05.2022\n" "PO-Revision-Date: 2024-7-6 23:34+0100\n" -"Last-Translator: arlsdk @arlsdk \n" +"Last-Translator: Abdullah Koyuncu @wiseweb-works \n" "Language-Team: wiseweb-works, AlperShal, arlsdk, tugsatenes, eren-ince, Schwarzeisc00l, Oruch379\n" "Language: tr\n" "MIME-Version: 1.0\n" @@ -230,7 +230,7 @@ msgid "Select one or more of the options below: " msgstr "Aşağıdaki seçeneklerden bir ya da daha fazlasını seçin: " msgid "Adding partition...." -msgstr "Disk bölümü ekleniyor…." +msgstr "Disk bölümü ekleniyor...." msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's." msgstr "Devam etmek için geçerli bir ds-tipi (dosya sistemi / fs-type) girmeniz gerekiyor. Geçerli ds-tiplerini görmek için `man parted` komutunu çalıştırın.." @@ -1314,15 +1314,18 @@ msgstr "LVM üzerinde LUKS" #, fuzzy msgid "Yes" -msgstr "evet" +msgstr "Evet" msgid "No" -msgstr "" +msgstr "Hayır" #, fuzzy msgid "Archinstall help" -msgstr "Archinstall dili" +msgstr "Archinstall yardım" #, fuzzy msgid " (default)" msgstr "(varsayılan)" + +msgid "Press Ctrl+h for help" +msgstr "Yardım için Ctrl+h tuşlarına basınız" diff --git a/archinstall/locales/uk/LC_MESSAGES/base.po b/archinstall/locales/uk/LC_MESSAGES/base.po index f2c6b38a8d..0656904789 100644 --- a/archinstall/locales/uk/LC_MESSAGES/base.po +++ b/archinstall/locales/uk/LC_MESSAGES/base.po @@ -1374,3 +1374,6 @@ msgstr "Мова Archinstall" #, fuzzy msgid " (default)" msgstr "(типово)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/ur/LC_MESSAGES/base.po b/archinstall/locales/ur/LC_MESSAGES/base.po index 803ff594aa..550cce47a5 100644 --- a/archinstall/locales/ur/LC_MESSAGES/base.po +++ b/archinstall/locales/ur/LC_MESSAGES/base.po @@ -1393,6 +1393,9 @@ msgstr "آرچ انسٹال کے لیے زبان" msgid " (default)" msgstr "" +msgid "Press Ctrl+h for help" +msgstr "" + #~ msgid "Add :" #~ msgstr "شامل:" diff --git a/archinstall/locales/zh-CN/LC_MESSAGES/base.po b/archinstall/locales/zh-CN/LC_MESSAGES/base.po index 062487ec9a..b73cdd5275 100644 --- a/archinstall/locales/zh-CN/LC_MESSAGES/base.po +++ b/archinstall/locales/zh-CN/LC_MESSAGES/base.po @@ -1326,3 +1326,6 @@ msgstr "Archinstall 语言" #, fuzzy msgid " (default)" msgstr "(默认)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/locales/zh-TW/LC_MESSAGES/base.po b/archinstall/locales/zh-TW/LC_MESSAGES/base.po index 9acc0b4750..8c6785e2b3 100644 --- a/archinstall/locales/zh-TW/LC_MESSAGES/base.po +++ b/archinstall/locales/zh-TW/LC_MESSAGES/base.po @@ -1346,3 +1346,6 @@ msgstr "Archinstall 語言" #, fuzzy msgid " (default)" msgstr "(默認)" + +msgid "Press Ctrl+h for help" +msgstr "" diff --git a/archinstall/scripts/guided.py b/archinstall/scripts/guided.py index 06c83a1688..c6d6752fe5 100644 --- a/archinstall/scripts/guided.py +++ b/archinstall/scripts/guided.py @@ -41,7 +41,7 @@ def ask_user_questions() -> None: global_menu.run() -def perform_installation(mountpoint: Path): +def perform_installation(mountpoint: Path) -> None: """ Performs the installation steps on a block device. Only requirement is that the block devices are diff --git a/archinstall/scripts/list.py b/archinstall/scripts/list.py index 0e0363a170..0b9a0d1d6f 100644 --- a/archinstall/scripts/list.py +++ b/archinstall/scripts/list.py @@ -7,4 +7,4 @@ if script.stem in ['__init__', 'list']: continue - print(f" {script.stem}") \ No newline at end of file + print(f" {script.stem}") diff --git a/archinstall/scripts/minimal.py b/archinstall/scripts/minimal.py index 7ebc0d6c24..f2f7726584 100644 --- a/archinstall/scripts/minimal.py +++ b/archinstall/scripts/minimal.py @@ -23,7 +23,7 @@ info(" - Optional systemd network via --network") -def perform_installation(mountpoint: Path): +def perform_installation(mountpoint: Path) -> None: disk_config: disk.DiskLayoutConfiguration = archinstall.arguments['disk_config'] disk_encryption: disk.DiskEncryption = archinstall.arguments.get('disk_encryption', None) @@ -58,7 +58,7 @@ def perform_installation(mountpoint: Path): info(" * devel (password: devel)") -def prompt_disk_layout(): +def prompt_disk_layout() -> None: fs_type = None if filesystem := archinstall.arguments.get('filesystem', None): fs_type = disk.FilesystemType(filesystem) @@ -72,7 +72,7 @@ def prompt_disk_layout(): ) -def parse_disk_encryption(): +def parse_disk_encryption() -> None: if enc_password := archinstall.arguments.get('!encryption-password', None): modification: List[disk.DeviceModification] = archinstall.arguments['disk_config'] partitions: List[disk.PartitionModification] = [] diff --git a/archinstall/scripts/only_hd.py b/archinstall/scripts/only_hd.py index cb849a50d9..abc3cf46bb 100644 --- a/archinstall/scripts/only_hd.py +++ b/archinstall/scripts/only_hd.py @@ -7,7 +7,7 @@ from archinstall.lib import disk -def ask_user_questions(): +def ask_user_questions() -> None: global_menu = archinstall.GlobalMenu(data_store=archinstall.arguments) global_menu.enable('archinstall-language') @@ -23,7 +23,7 @@ def ask_user_questions(): global_menu.run() -def perform_installation(mountpoint: Path): +def perform_installation(mountpoint: Path) -> None: """ Performs the installation steps on a block device. Only requirement is that the block devices are diff --git a/archinstall/scripts/swiss.py b/archinstall/scripts/swiss.py index 35e128301d..9c4efcbcf6 100644 --- a/archinstall/scripts/swiss.py +++ b/archinstall/scripts/swiss.py @@ -42,18 +42,18 @@ class SetupMenu(GlobalMenu): def __init__(self, storage_area: Dict[str, Any]): super().__init__(data_store=storage_area) - def setup_selection_menu_options(self): + def setup_selection_menu_options(self) -> None: super().setup_selection_menu_options() self._menu_options['mode'] = menu.Selector( 'Execution mode', - lambda x : select_mode(), + lambda x: select_mode(), display_func=lambda x: x.value if x else '', default=ExecutionMode.Full) self._menu_options['continue'] = menu.Selector( 'Continue', - exec_func=lambda n,v: True) + exec_func=lambda n, v: True) self.enable('archinstall-language') self.enable('ntp') @@ -61,7 +61,7 @@ def setup_selection_menu_options(self): self.enable('continue') self.enable('abort') - def exit_callback(self): + def exit_callback(self) -> None: if self._data_store.get('mode', None): archinstall.arguments['mode'] = self._data_store['mode'] info(f"Archinstall will execute under {archinstall.arguments['mode']} mode") @@ -76,7 +76,7 @@ def __init__( self._execution_mode = exec_mode super().__init__(data_store) - def setup_selection_menu_options(self): + def setup_selection_menu_options(self) -> None: super().setup_selection_menu_options() options_list = [] @@ -96,11 +96,11 @@ def setup_selection_menu_options(self): mandatory_list = ['disk_config', 'bootloader', 'hostname'] case ExecutionMode.Only_HD: - options_list = ['disk_config', 'disk_encryption','swap'] + options_list = ['disk_config', 'disk_encryption', 'swap'] mandatory_list = ['disk_config'] case ExecutionMode.Only_OS: options_list = [ - 'mirror_config','bootloader', 'hostname', + 'mirror_config', 'bootloader', 'hostname', '!root-password', '!users', 'profile_config', 'audio_config', 'kernels', 'packages', 'additional-repositories', 'network_config', 'timezone', 'ntp' ] @@ -130,7 +130,7 @@ def setup_selection_menu_options(self): self.enable(entry) -def ask_user_questions(exec_mode: ExecutionMode = ExecutionMode.Full): +def ask_user_questions(exec_mode: ExecutionMode = ExecutionMode.Full) -> None: """ First, we'll ask the user for a bunch of user input. Not until we're satisfied with what we want to install @@ -163,7 +163,7 @@ def ask_user_questions(exec_mode: ExecutionMode = ExecutionMode.Full): menu.run() -def perform_installation(mountpoint: Path, exec_mode: ExecutionMode): +def perform_installation(mountpoint: Path, exec_mode: ExecutionMode) -> None: disk_config: disk.DiskLayoutConfiguration = archinstall.arguments['disk_config'] disk_encryption: disk.DiskEncryption = archinstall.arguments.get('disk_encryption', None) diff --git a/archinstall/tui/curses_menu.py b/archinstall/tui/curses_menu.py index 59b1d23a99..23088f8c1a 100644 --- a/archinstall/tui/curses_menu.py +++ b/archinstall/tui/curses_menu.py @@ -267,6 +267,7 @@ def _assemble_entries(self, entries: List[ViewportEntry]) -> str: for e in entries: view[e.row] = self._replace_str(view[e.row], e.col, e.text) + view = [v.rstrip() for v in view] return '\n'.join(view) @@ -302,7 +303,7 @@ def __init__( self._init_wins() def _init_wins(self): - self._main_win = curses.newwin(self._edit_height , self._width, self.y_start, 0) + self._main_win = curses.newwin(self._edit_height, self._width, self.y_start, 0) self._main_win.nodelay(False) x_offset = 0 @@ -1249,7 +1250,6 @@ def __init__(self): self._screen: Any = None self._colors: Dict[str, int] = {} self._component: Optional[AbstractCurses] = None - signal.signal(signal.SIGWINCH, self._sig_win_resize) def init(self) -> None: @@ -1289,7 +1289,7 @@ def run(self, component: AbstractCurses) -> Result: self._screen.clear() return self._main_loop(component) - def _sig_win_resize(self, signum: int, frame): + def _sig_win_resize(self, signum: int, frame) -> None: if self._component: self._component.resize_win() @@ -1300,11 +1300,11 @@ def _main_loop(self, component: AbstractCurses) -> Result: def _reset_terminal(self): os.system("reset") - def _soft_clear_terminal(self): + def _soft_clear_terminal(self) -> None: print(chr(27) + "[2J", end="") print(chr(27) + "[1;1H", end="") - def _set_up_colors(self): + def _set_up_colors(self) -> None: curses.init_pair(STYLE.NORMAL.value, curses.COLOR_WHITE, curses.COLOR_BLACK) curses.init_pair(STYLE.CURSOR_STYLE.value, curses.COLOR_CYAN, curses.COLOR_BLACK) curses.init_pair(STYLE.MENU_STYLE.value, curses.COLOR_WHITE, curses.COLOR_BLUE) diff --git a/docs/_static/logo.png b/docs/_static/logo.png index ac3ed4e826..5128e1e702 100644 Binary files a/docs/_static/logo.png and b/docs/_static/logo.png differ diff --git a/docs/_static/logo.pride.png b/docs/_static/logo.pride.png index 82e8f42706..1f41b6bcb6 100644 Binary files a/docs/_static/logo.pride.png and b/docs/_static/logo.pride.png differ diff --git a/docs/conf.py b/docs/conf.py index 013cd2d25f..d39d862eb6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -5,13 +5,13 @@ sys.path.insert(0, os.path.abspath('..')) -def process_docstring(app, what, name, obj, options, lines): +def process_docstring(app, what, name, obj, options, lines) -> None: spaces_pat = re.compile(r"( {8})") ll = [spaces_pat.sub(" ", line) for line in lines] lines[:] = ll -def setup(app): +def setup(app) -> None: app.connect('autodoc-process-docstring', process_docstring) diff --git a/docs/flowcharts/BlockDeviceSelection.svg b/docs/flowcharts/BlockDeviceSelection.svg index 2d63f67409..33dd7f709b 100644 --- a/docs/flowcharts/BlockDeviceSelection.svg +++ b/docs/flowcharts/BlockDeviceSelection.svg @@ -1,3 +1 @@ - - -
Select BlockDevices
Select BlockDevices
No
No
Yes
Yes
Empty Selection
Empty Selection
Yes / No
Yes / No
Encrypt Root
Encrypt Root
No
No
Yes
Yes
Multiple BD's
Multiple BD's
Select /boot, / and optional mounts
Select /boot, / and...
Yes
Yes
No
No
Contains Partitions
Contains Partitions
No
No
Yes
Yes
Old /boot has content
Old /boot has cont...
Select Root FIlesystem
Select Root FIlesyst...
Mount Partitions
Mount Partitions
Install on /mnt
Install on /mnt
Yes
Yes
Wipe /Boot
Wipe /Boot
Clear old
systemd-boot files
Clear old...
Viewer does not support full SVG 1.1
\ No newline at end of file +
Select BlockDevices
Select BlockDevices
No
No
Yes
Yes
Empty Selection
Empty Selection
Yes / No
Yes / No
Encrypt Root
Encrypt Root
No
No
Yes
Yes
Multiple BD's
Multiple BD's
Select /boot, / and optional mounts
Select /boot, / and...
Yes
Yes
No
No
Contains Partitions
Contains Partitions
No
No
Yes
Yes
Old /boot has content
Old /boot has cont...
Select Root FIlesystem
Select Root FIlesyst...
Mount Partitions
Mount Partitions
Install on /mnt
Install on /mnt
Yes
Yes
Wipe /Boot
Wipe /Boot
Clear old
systemd-boot files
Clear old...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/docs/logo.png b/docs/logo.png index ac3ed4e826..5128e1e702 100644 Binary files a/docs/logo.png and b/docs/logo.png differ diff --git a/examples/interactive_installation.py b/examples/interactive_installation.py index 108e127254..751462dff3 100644 --- a/examples/interactive_installation.py +++ b/examples/interactive_installation.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Callable, Optional import archinstall from archinstall import Installer @@ -11,7 +11,7 @@ from archinstall import info, debug if TYPE_CHECKING: - _: Any + _: Callable[[str], str] def ask_user_questions() -> None: diff --git a/examples/minimal_installation.py b/examples/minimal_installation.py index 4159fbc2fb..2447e509fe 100644 --- a/examples/minimal_installation.py +++ b/examples/minimal_installation.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import TYPE_CHECKING, Any, List +from typing import TYPE_CHECKING, Callable, List import archinstall from archinstall import disk @@ -10,7 +10,7 @@ from archinstall.default_profiles.minimal import MinimalProfile if TYPE_CHECKING: - _: Any + _: Callable[[str], str] def perform_installation(mountpoint: Path) -> None: diff --git a/mypy.ini b/mypy.ini deleted file mode 100644 index 9ba682483e..0000000000 --- a/mypy.ini +++ /dev/null @@ -1,20 +0,0 @@ -[mypy] -python_version = 3.11 -follow_imports = silent -check_untyped_defs = True -strict_equality = True -warn_unused_configs = True -disallow_any_generics = True -disallow_subclassing_any = True -disallow_untyped_calls = True -disallow_untyped_defs = True -disallow_incomplete_defs = True -disallow_untyped_decorators = True -warn_redundant_casts = True -warn_unused_ignores = True -warn_return_any = True -warn_unreachable = True -extra_checks = True -files = examples/ -exclude = (?x)( - ^archinstall) diff --git a/pyproject.toml b/pyproject.toml index 9bca3f60cf..5f9f934f1f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,7 @@ classifiers = [ dependencies = [ "simple-term-menu==1.6.4", "pyparted @ https://github.com//dcantrell/pyparted/archive/v3.13.0.tar.gz#sha512=26819e28d73420937874f52fda03eb50ab1b136574ea9867a69d46ae4976d38c4f26a2697fa70597eed90dd78a5ea209bafcc3227a17a7a5d63cff6d107c2b11", + "pydantic==2.8.2" ] [project.urls] @@ -30,9 +31,10 @@ Source = "https://github.com/archlinux/archinstall" [project.optional-dependencies] log = ["systemd_python==235"] dev = [ - "mypy==1.10.1", - "flake8==7.1.0", - "pre-commit==3.7.1", + "mypy==1.11.2", + "flake8==7.1.1", + "pre-commit==3.8.0", + "ruff==0.6.3", ] doc = ["sphinx"] @@ -61,10 +63,95 @@ archinstall = "archinstall" [tool.mypy] python_version = "3.11" -files = "archinstall/" -exclude = "tests" -check_untyped_defs=true +files = "." +exclude = "^build/" +check_untyped_defs = true +disallow_any_explicit = false +disallow_any_expr = false +disallow_any_generics = false +disallow_any_unimported = false +disallow_incomplete_defs = false +disallow_subclassing_any = true +disallow_untyped_calls = true +disallow_untyped_decorators = true +disallow_untyped_defs = false +extra_checks = true +strict = false +strict_equality = true +warn_redundant_casts = true +warn_return_any = true +warn_unreachable = true +warn_unused_configs = true +warn_unused_ignores = true + +[[tool.mypy.overrides]] +module = "archinstall.examples.*" +disallow_any_explicit = true +disallow_any_generics = true +disallow_any_unimported = true +disallow_incomplete_defs = true +disallow_untyped_defs = true +follow_imports = "silent" + +[[tool.mypy.overrides]] +module = "archinstall.lib.*" +strict_equality = false +warn_return_any = false +warn_unreachable = false + +[[tool.mypy.overrides]] +module = "archinstall.scripts.*" +warn_unreachable = false + +[[tool.mypy.overrides]] +module = "archinstall.tui.*" +strict_equality = false +warn_return_any = false +warn_unreachable = false + +[[tool.mypy.overrides]] +module = [ + "parted", + "simple_term_menu", +] +ignore_missing_imports = true [tool.bandit] targets = ["archinstall"] exclude = ["/tests"] + +[tool.ruff] +target-version = "py311" +builtins = ["_"] +line-length = 220 + +[tool.ruff.lint] +select = [ + "ASYNC", # flake8-async + "C90", # mccabe + "E", # pycodestyle errors + "EXE", # flake8-executable + "F", # Pyflakes + "FLY", # flynt + "G", # flake8-logging-format + "ICN", # flake8-import-conventions + "LOG", # flake8-logging + "PIE", # flake8-pie + "PLC", # Pylint conventions + "PLE", # Pylint errors + "RSE", # flake8-raise + "SLOT", # flake8-slot + "T10", # flake8-debugger + "W", # pycodestyle warnings + "YTT", # flake8-2020 +] + +ignore = [ + "E701", # multiple-statements-on-one-line-colon + "E722", # bare-except + "F401", # unused-import + "W191", # tab-indentation +] + +[tool.ruff.lint.mccabe] +max-complexity = 40 diff --git a/renovate.json b/renovate.json index 39a2b6e9a5..f86597e36d 100644 --- a/renovate.json +++ b/renovate.json @@ -2,5 +2,8 @@ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "config:base" - ] + ], + "pre-commit": { + "enabled": true + } }