diff --git a/.gitignore b/.gitignore index 735f9fb..06ee84c 100644 --- a/.gitignore +++ b/.gitignore @@ -49,7 +49,6 @@ coverage.xml # Translations *.mo -*.pot # Django stuff: *.log @@ -105,4 +104,5 @@ venv.bak/ # Editor directories and files .vscode/ -.idea/.idea +.idea +CLAUDE.md diff --git a/LICENSE b/LICENSE index dd5715a..2b83667 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2020, GhostBSD +Copyright (c) 2020-2025, GhostBSD All rights reserved. Redistribution and use in source and binary forms, with or without modification, diff --git a/README.md b/README.md index d0147a5..a2539e8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,16 @@ Install Station === -It is a strip down version of gbi and it is the new installer for GhostBSD. It depend on gbi. +It is a strip down version of install-station and it is the new installer for GhostBSD. -Install Station only edit disk, partition and will install GhostBSD. Users and system setup will be done with at the first boot after installation with Setup Station \ No newline at end of file +Install Station only edit disk, partition and will install GhostBSD. Users and system setup will be done with at the first boot after installation with Setup Station. + +## Managing Translations +To create a translation file. +```shell +./setup.py create_translation --locale=fr +``` + +To update translation files +```shell +./setup.py update_translations +``` \ No newline at end of file diff --git a/install-station b/install-station index daba86e..5d4e0e5 100755 --- a/install-station +++ b/install-station @@ -1,242 +1,63 @@ #!/usr/local/bin/python +""" +Install Station executable module. -import sys -import os -import shutil +This is the main entry point for the Install Station GTK+ application. +It initializes all page components and sets up the main window interface. +""" import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk -installer = "/usr/local/lib/gbi/" -sys.path.append(installer) -from welcome_live import Welcome -from installType import Types -from use_ufs import use_ufs -from partition import Partitions -from use_zfs import ZFS -from boot_manager import bootManager -from partition_handler import create_disk_partition_db -from install import installProgress, installWindow -from network_setup import network_setup -logo = "/usr/local/lib/gbi/image/logo.png" -tmp = "/tmp/.gbi/" -if not os.path.exists(tmp): - os.makedirs(tmp) -disk = '%sdisk' % tmp -dslice = '%sslice' % tmp -disk_schem = '%sscheme' % tmp -zfs_config = '%szfs_config' % tmp -ufs_config = '%sufs_config' % tmp -partitiondb = "%spartitiondb/" % tmp +from install_station.language import Language +from install_station.keyboard import Keyboard +from install_station.network_setup import NetworkSetup +from install_station.try_install import TryOrInstall +from install_station.install_type import InstallTypes +from install_station.custom import PartitionManager +from install_station.use_zfs import ZFS +from install_station.boot_manager import BootManager +from install_station.data import logo +from install_station.window import Window +from install_station.interface_controller import Interface, Button -class MainWindow(): - """Main window class.""" +class MainWindow: + """ + Install Station main window class. + + This class initializes the main GTK window and sets up all page components + for the installation wizard interface. + """ - def delete(self, widget, event=None): - """Close the main window.""" - if os.path.exists('/tmp/.gbi'): - shutil.rmtree('/tmp/.gbi') - Gtk.main_quit() - return False - - def next_page(self, widget): - if self.welcome.get_what() == "install": - self.next_install_page() - else: - self.next_setup_page() - - def next_install_page(self): - """Go to the next window.""" - page = self.notebook.get_current_page() - if page == 0: - typebox = Gtk.VBox(homogeneous=False, spacing=0) - typebox.show() - self.types = Types() - get_types = self.types.get_model() - typebox.pack_start(get_types, True, True, 0) - label = Gtk.Label(label="Types") - self.notebook.insert_page(typebox, label, 1) - self.notebook.next_page() - self.notebook.show_all() - self.cancel_button.show() - self.next_button.show() - elif page == 1: - create_disk_partition_db() - self.back_button.show() - if self.types.get_type() == "ufs": - udbox = Gtk.VBox(homogeneous=False, spacing=0) - udbox.show() - self.partition = use_ufs(self.next_button) - get_ud = self.partition.get_model() - udbox.pack_start(get_ud, True, True, 0) - label = Gtk.Label(label="UFS Disk Configuration") - self.notebook.insert_page(udbox, label, 2) - self.notebook.next_page() - self.notebook.show_all() - self.next_button.set_sensitive(False) - elif self.types.get_type() == "custom": - Pbox = Gtk.VBox(homogeneous=False, spacing=0) - Pbox.show() - self.partition = Partitions(self.next_button) - get_part = self.partition.get_model() - Pbox.pack_start(get_part, True, True, 0) - label = Gtk.Label(label="UFS Custom Configuration") - self.notebook.insert_page(Pbox, label, 2) - self.notebook.next_page() - self.notebook.show_all() - self.next_button.set_sensitive(False) - elif self.types.get_type() == "zfs": - Zbox = Gtk.VBox(homogeneous=False, spacing=0) - Zbox.show() - self.partition = ZFS(self.next_button) - get_ZFS = self.partition.get_model() - Zbox.pack_start(get_ZFS, True, True, 0) - label = Gtk.Label(label="ZFS Configuration") - self.notebook.insert_page(Zbox, label, 2) - self.notebook.next_page() - self.notebook.show_all() - self.next_button.set_sensitive(False) - elif page == 2: - self.partition.save_selection() - Mbox = Gtk.VBox(homogeneous=False, spacing=0) - Mbox.show() - self.bootmanager = bootManager() - get_root = self.bootmanager.get_model() - Mbox.pack_start(get_root, True, True, 0) - label = Gtk.Label(label="Boot Option") - self.notebook.insert_page(Mbox, label, 3) - self.next_button.set_label("Install") - self.notebook.next_page() - self.notebook.show_all() - self.next_button.set_sensitive(True) - elif page == 3: - Ibox = Gtk.VBox(homogeneous=False, spacing=0) - Ibox.show() - install = installWindow() - get_install = install.get_model() - Ibox.pack_start(get_install, True, True, 0) - label = Gtk.Label(label="Installation") - self.notebook.insert_page(Ibox, label, 8) - self.notebook.next_page() - instpro = installProgress(self.window) - progressBar = instpro.getProgressBar() - box1 = Gtk.VBox(homogeneous=False, spacing=0) - box1.show() - label = Gtk.Label(label="Progress Bar") - box1.pack_end(progressBar, False, False, 0) - self.nbButton.insert_page(box1, label, 4) - self.nbButton.next_page() - self.window.show_all() - - def next_setup_page(self): - page = self.notebook.get_current_page() - if page == 0: - self.next_button.show() - self.next_button.set_sensitive(False) - self.window.set_title("Setup GhostBSD") - net_setup_box = Gtk.VBox(homogeneous=False, spacing=0) - net_setup_box.show() - self.net_setup = network_setup(self.next_button) - model = self.net_setup.get_model() - net_setup_box.pack_start(model, True, True, 0) - label = Gtk.Label(label="Network Setup") - self.notebook.insert_page(net_setup_box, label, 1) - self.notebook.next_page() - self.notebook.show_all() - if page == 1: - xinitrc = open('/usr/home/ghostbsd/.xinitrc', 'w') - xinitrc.writelines('gsettings set org.mate.SettingsDaemon.plugins.housekeeping active true &\n') - xinitrc.writelines('gsettings set org.mate.screensaver lock-enabled false &\n') - xinitrc.writelines('exec ck-launch-session mate-session\n') - xinitrc.close() - Gtk.main_quit() - - def back_page(self, widget): - """Go back to the previous window.""" - current_page = self.notebook.get_current_page() - if current_page == 2: - self.back_button.hide() - elif current_page == 3: - self.next_button.set_label("Next") - self.notebook.prev_page() - new_page = self.notebook.get_current_page() - if current_page == 2 and new_page == 1: - if os.path.exists(partitiondb): - shutil.rmtree(partitiondb) - if os.path.exists(tmp + 'create'): - os.remove(tmp + 'create') - if os.path.exists(tmp + 'delete'): - os.remove(tmp + 'delete') - if os.path.exists(tmp + 'destroy'): - os.remove(tmp + 'destroy') - if os.path.exists(tmp + 'partlabel'): - os.remove(tmp + 'partlabel') - if os.path.exists(zfs_config): - os.remove(zfs_config) - if os.path.exists(ufs_config): - os.remove(ufs_config) - if os.path.exists(disk): - os.remove(disk) - if os.path.exists(dslice): - os.remove(dslice) - if os.path.exists(disk_schem): - os.remove(disk_schem) - self.next_button.set_sensitive(True) - - def __init__(self): - """Were the Main window start.""" - self.window = Gtk.Window() - self.window.connect("delete_event", self.delete) - self.window.set_border_width(0) - self.window.set_default_size(800, 500) - self.window.set_size_request(800, 500) - self.window.set_title("Install GhostBSD") - self.window.set_border_width(0) - self.window.set_icon_from_file(logo) - mainHBox = Gtk.HBox(homogeneous=False, spacing=0) - mainHBox.show() - mainVbox = Gtk.VBox(homogeneous=False, spacing=0) - mainVbox.show() - self.window.add(mainHBox) - mainHBox.pack_start(mainVbox, True, True, 0) - self.notebook = Gtk.Notebook() - mainVbox.pack_start(self.notebook, True, True, 0) - self.notebook.show() - self.notebook.set_show_tabs(False) - self.notebook.set_show_border(False) - welcome_box = Gtk.VBox(homogeneous=False, spacing=0) - welcome_box.show() - self.welcome = Welcome(self.next_install_page, self.next_setup_page) - get_types = self.welcome.get_model() - welcome_box.pack_start(get_types, True, True, 0) - label = Gtk.Label(label="Welcome") - self.notebook.insert_page(welcome_box, label, 0) - # Set what page to start at type of installation - self.notebook.set_current_page(0) - self.table = Gtk.Table(n_rows=1, n_columns=6, homogeneous=True) - self.back_button = Gtk.Button(label='Back') - self.back_button.connect("clicked", self.back_page) - self.table.attach(self.back_button, 3, 4, 0, 1) - self.cancel_button = Gtk.Button(label='Cancel') - self.cancel_button.connect("clicked", self.delete) - self.table.attach(self.cancel_button, 4, 5, 0, 1) - self.next_button = Gtk.Button(label='Next') - self.next_button.connect("clicked", self.next_page) - self.table.attach(self.next_button, 5, 6, 0, 1) - self.table.set_col_spacings(5) - self.table.show() - self.nbButton = Gtk.Notebook() - mainVbox.pack_end(self.nbButton, False, False, 5) - self.nbButton.show() - self.nbButton.set_show_tabs(False) - self.nbButton.set_show_border(False) - label = Gtk.Label(label="Button") - self.nbButton.insert_page(self.table, label, 0) - self.window.show_all() - self.back_button.hide() - self.cancel_button.hide() - self.next_button.hide() + def __init__(self) -> None: + """ + Initialize the Install Station main window. + + Sets up page assignments to Interface class, configures the main window + properties, and creates the main interface layout. + """ + Interface.welcome = Language + Interface.keyboard = Keyboard + Interface.network_setup = NetworkSetup + Interface.try_install = TryOrInstall + Interface.installation_type = InstallTypes + Interface.custom_partition = PartitionManager + Interface.full_zfs = ZFS + Interface.boot_manager = BootManager + Window.connect("delete_event", Interface.delete) + Window.set_border_width(0) + Window.set_default_size(800, 500) + Window.set_size_request(800, 500) + Window.set_title("Install GhostBSD") + Window.set_border_width(0) + Window.set_icon_from_file(logo) + main_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=0) + main_box.show() + Window.add(main_box) + main_box.pack_start(Interface.get_interface(), True, True, 0) + Window.show_all() + Button.show_initial() MainWindow() diff --git a/install_station/__init__.py b/install_station/__init__.py new file mode 100644 index 0000000..1927838 --- /dev/null +++ b/install_station/__init__.py @@ -0,0 +1,14 @@ +""" +Install Station Package. + +A streamlined installer for GhostBSD providing a GTK+ interface +for disk partitioning and OS installation. + +This package contains all the modules needed for the installation wizard +including language selection, keyboard configuration, network setup, +and filesystem management. +""" + +__version__ = "0.1" +__author__ = "Eric Turgeon" +__license__ = "BSD" \ No newline at end of file diff --git a/install_station/boot_manager.py b/install_station/boot_manager.py new file mode 100644 index 0000000..e5789e5 --- /dev/null +++ b/install_station/boot_manager.py @@ -0,0 +1,214 @@ +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk, Gdk +from install_station.partition import bios_or_uefi +from install_station.data import InstallationData, get_text + + +cssProvider = Gtk.CssProvider() +cssProvider.load_from_path('/usr/local/lib/install-station/ghostbsd-style.css') +screen = Gdk.Screen.get_default() +styleContext = Gtk.StyleContext() +styleContext.add_provider_for_screen( + screen, + cssProvider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION +) + + +class BootManager: + """ + Utility class for managing boot manager selection in GhostBSD installation following the utility class pattern. + + This class provides a GTK+ interface for selecting and configuring boot managers + including rEFInd, FreeBSD boot manager, and native UEFI/BIOS loaders. The class + automatically determines available options based on the partition scheme (GPT/MBR) + and firmware type (UEFI/BIOS). + + Available boot manager options: + - rEFInd: Available only for GPT + UEFI configurations + - FreeBSD boot manager: Available only for MBR partition schemes + - Native loader: Default option, always available (UEFI or BIOS loader) + + The class follows a utility pattern with class methods and variables for state management, + designed to integrate with the InstallationData system for configuration persistence. + """ + # Class variables for state management + boot = None + vbox1 = None + + # UI elements as class variables + refind = None + bsd = None + none = None + box3 = None + + @classmethod + def get_model(cls): + """ + Return the GTK widget model for the boot manager interface. + + Creates and initializes the UI if it doesn't exist yet. + + Returns: + Gtk.Box: The main container widget for the boot manager interface + """ + if cls.vbox1 is None: + cls.initialize() + return cls.vbox1 + + @classmethod + def boot_manager_selection(cls, _radiobutton, val: str): + """ + Handle boot manager selection from radio buttons. + + Called when a radio button is toggled to update the selected boot manager + option and store it in both the class variable and InstallationData. + + Args: + _radiobutton: The radio button widget that was toggled (unused) + val: The boot manager value ('refind', 'bsd', or 'none') + """ + cls.boot = val + InstallationData.boot = cls.boot + + @classmethod + def get_boot_manager_option(cls): + """ + Get the currently selected boot manager option. + + Returns the boot manager value from InstallationData if available, + otherwise falls back to the class variable. + + Returns: + str: The selected boot manager ('refind', 'bsd', or 'none') + """ + return InstallationData.boot or cls.boot + + @classmethod + def initialize(cls): + """ + Initialize the boot manager user interface following the utility class pattern. + + Creates the GTK+ interface for boot manager selection including: + - Title header ("Boot Option") + - Radio button group for boot manager options + - Automatic option availability based on partition scheme and firmware type + - Default selection of native loader option + + The interface adapts based on: + - Firmware type (UEFI/BIOS) detected from system + - Partition scheme (GPT/MBR) from installation configuration + - rEFInd: Only available for GPT + UEFI + - FreeBSD boot manager: Only available for MBR + - Native loader: Always available as default + + This method is called automatically by get_model() when the interface is first accessed. + """ + cls.vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.vbox1.show() + + # Determine firmware type + if bios_or_uefi() == "UEFI": + loader = "UEFI" + else: + loader = "BIOS" + + # Get partition scheme from InstallationData + scheme = cls._get_partition_scheme() + + # Create title header + title = Gtk.Label(label=get_text('Boot Option'), name="Header") + title.set_property("height-request", 50) + cls.vbox1.pack_start(title, False, False, 0) + + # Create main horizontal container + hbox1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=0) + hbox1.show() + cls.vbox1.pack_start(hbox1, True, True, 10) + + # Create vertical box for radio buttons + bbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + bbox1.show() + + # rEFInd boot manager option + cls.refind = Gtk.RadioButton(label=get_text("Setup rEFInd boot manager")) + bbox1.pack_start(cls.refind, False, True, 10) + cls.refind.connect("toggled", cls.boot_manager_selection, "refind") + cls.refind.show() + + # Enable rEFInd only for GPT + UEFI + if scheme == 'GPT' and loader == "UEFI": + cls.refind.set_sensitive(True) + else: + cls.refind.set_sensitive(False) + + # FreeBSD boot manager option + cls.bsd = Gtk.RadioButton.new_with_label_from_widget( + cls.refind, + get_text("Setup FreeBSD boot manager") + ) + bbox1.pack_start(cls.bsd, False, True, 10) + cls.bsd.connect("toggled", cls.boot_manager_selection, "bsd") + cls.bsd.show() + + # Enable FreeBSD boot manager only for MBR + if scheme == 'MBR': + cls.bsd.set_sensitive(True) + else: + cls.bsd.set_sensitive(False) + + # Native loader option (always available) + cls.none = Gtk.RadioButton.new_with_label_from_widget( + cls.bsd, + get_text("FreeBSD {loader} loader only").format(loader=loader) + ) + bbox1.pack_start(cls.none, False, True, 10) + cls.none.connect("toggled", cls.boot_manager_selection, "none") + cls.none.show() + + # Add radio button container to main layout + hbox1.pack_start(bbox1, False, False, 50) + + # Set default selection + cls.none.set_active(True) + cls.boot = "none" + InstallationData.boot = cls.boot + + # Create additional container for future expansion + cls.box3 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.box3.set_border_width(0) + cls.vbox1.pack_start(cls.box3, True, True, 0) + + @classmethod + def _get_partition_scheme(cls): + """ + Determine the partition scheme from installation configuration data. + + Checks ZFS and UFS configuration data, then falls back to InstallationData.scheme + or defaults to GPT if no scheme is found. + + Returns: + str: The partition scheme ('GPT' or 'MBR') + """ + # Check ZFS config data for scheme + if InstallationData.zfs_config_data: + scheme_line = next((line for line in InstallationData.zfs_config_data if 'partscheme=' in line), '') + if scheme_line: + return scheme_line.split('=')[1].strip() + + # Check UFS config data for scheme + if InstallationData.ufs_config_data: + scheme_line = next((line for line in InstallationData.ufs_config_data if 'partscheme=' in line), '') + if scheme_line: + return scheme_line.split('=')[1].strip() + + # Use scheme from InstallationData or default to GPT + if InstallationData.scheme: + # Handle both 'partscheme=GPT' and 'GPT' formats + if 'partscheme=' in InstallationData.scheme: + return InstallationData.scheme.split('=')[1].strip() + else: + return InstallationData.scheme.strip() + + return 'GPT' # Default fallback diff --git a/install_station/common.py b/install_station/common.py new file mode 100644 index 0000000..50f2471 --- /dev/null +++ b/install_station/common.py @@ -0,0 +1,194 @@ +""" +Common utility functions for Install Station. + +This module provides various utility functions including password strength +checking, text validation, and deprecation decorators. +""" +import re +import warnings +from install_station.data import get_text + + +def lower_case(text: str) -> bool: + """ + Find if password contain only lower case. + :param text: password + + :return: True if password contain only lower case + """ + search = re.compile(r'[^a-z]').search + return not bool(search(text)) + + +# Find if password contain only upper case +def upper_case(text: str) -> bool: + """ + Find if password contain only upper case. + :param text: password + + :return: True if password contain only upper case + """ + search = re.compile(r'[^A-Z]').search + return not bool(search(text)) + + +# Find if password contain only lower case and number +def lower_and_number(text: str) -> bool: + """ + Find if password contain only lower case and number. + :param text: password + + :return: True if password contain only lower case and number + """ + search = re.compile(r'[^a-z0-9]').search + return not bool(search(text)) + + +# Find if password contain only upper case and number +def upper_and_number(text: str) -> bool: + """ + Find if password contain only upper case and number. + :param text: password + + :return: True if password contain only upper case and number + """ + search = re.compile(r'[^A-Z0-9]').search + return not bool(search(text)) + + +# Find if password contain only lower and upper case and +def lower_upper(text: str) -> bool: + """ + Find if password contain only lower and upper case and + :param text: password + + :return: True if password contain only lower and upper case and + """ + search = re.compile(r'[^a-zA-Z]').search + return not bool(search(text)) + + +def lower_upper_number(text: str) -> bool: + """ + Find if password contains only lowercase, uppercase letters and numbers. + + Args: + text: password to check + + Returns: + True if password contains only lowercase, uppercase letters and numbers + """ + search = re.compile(r'[^a-zA-Z0-9]').search + return not bool(search(text)) + + +# Find if password contain only lowercase, uppercase numbers +# and some special character. +def all_character(text: str) -> bool: + """ + Find if password contain only lowercase, uppercase numbers + and some special character. + :param text: password + + :return: True if password contain only lowercase, uppercase numbers + and some special character. + """ + search = re.compile(r'[^a-zA-Z0-9~!@#$%^&*_+":;\'-]').search + return not bool(search(text)) + + +def password_strength(password: str, label3) -> None: + """ + Evaluate and display password strength. + + Args: + password: The password to evaluate + label3: GTK Label widget to display strength result + """ + same_character_type = any( + [ + lower_case(password), + upper_case(password), + password.isdigit() + ] + ) + mix_character = any( + [ + lower_and_number(password), + upper_and_number(password), + lower_upper(password) + ] + ) + if ' ' in password or '\t' in password: + label3.set_text(get_text("Space not allowed")) + elif len(password) <= 4: + label3.set_text(get_text("Super Weak")) + elif len(password) <= 8 and same_character_type: + label3.set_text(get_text("Super Weak")) + elif len(password) <= 8 and mix_character: + label3.set_text(get_text("Very Weak")) + elif len(password) <= 8 and lower_upper_number(password): + label3.set_text(get_text("Fairly Weak")) + elif len(password) <= 8 and all_character(password): + label3.set_text(get_text("Weak")) + elif len(password) <= 12 and same_character_type: + label3.set_text(get_text("Very Weak")) + elif len(password) <= 12 and mix_character: + label3.set_text(get_text("Fairly Weak")) + elif len(password) <= 12 and lower_upper_number(password): + label3.set_text(get_text("Weak")) + elif len(password) <= 12 and all_character(password): + label3.set_text(get_text("Strong")) + elif len(password) <= 16 and same_character_type: + label3.set_text(get_text("Fairly Weak")) + elif len(password) <= 16 and mix_character: + label3.set_text(get_text("Weak")) + elif len(password) <= 16 and lower_upper_number(password): + label3.set_text(get_text("Strong")) + elif len(password) <= 16 and all_character(password): + label3.set_text(get_text("Fairly Strong")) + elif len(password) <= 20 and same_character_type: + label3.set_text(get_text("Weak")) + elif len(password) <= 20 and mix_character: + label3.set_text(get_text("Strong")) + elif len(password) <= 20 and lower_upper_number(password): + label3.set_text(get_text("Fairly Strong")) + elif len(password) <= 20 and all_character(password): + label3.set_text(get_text("Very Strong")) + elif len(password) <= 24 and same_character_type: + label3.set_text(get_text("Strong")) + elif len(password) <= 24 and mix_character: + label3.set_text(get_text("Fairly Strong")) + elif len(password) <= 24 and lower_upper_number(password): + label3.set_text(get_text("Very Strong")) + elif len(password) <= 24 and all_character(password): + label3.set_text(get_text("Super Strong")) + elif same_character_type: + label3.set_text(get_text("Fairly Strong")) + else: + label3.set_text(get_text("Super Strong")) + + +def deprecated(*, version: str, reason: str): + """ + Decorator to mark functions as deprecated. + + Args: + version: Version when function was deprecated + reason: Reason for deprecation + + Returns: + Decorator function that adds deprecation warnings + """ + def decorator(func): + def wrapper(*args, **kwargs): + warnings.warn( + f"{func.__name__} is deprecated (version {version}): {reason}", + category=DeprecationWarning, + stacklevel=2 + ) + return func(*args, **kwargs) + wrapper.__name__ = func.__name__ + wrapper.__doc__ = func.__doc__ + return wrapper + return decorator diff --git a/install_station/create_cfg.py b/install_station/create_cfg.py new file mode 100644 index 0000000..3472ffd --- /dev/null +++ b/install_station/create_cfg.py @@ -0,0 +1,167 @@ +from install_station.data import InstallationData, installation_config + + +class Configuration: + """ + Utility class for creating and validating GhostBSD installation configuration files. + + This class provides methods to generate the ghostbsd_installation.cfg file + used by the GhostBSD installer and validate all required installation data + before configuration file creation. + + The class follows a utility pattern with class methods for stateless operations, + designed to integrate with the InstallationData system for configuration management. + """ + + @classmethod + def sanity_check(cls): + """ + Perform sanity checks on all installation data used by create_cfg. + + Validates that all required installation parameters are present and valid + before attempting to create the configuration file. + + Returns: + tuple: (bool, list) - (is_valid, list_of_errors) + is_valid: True if all checks pass, False otherwise + list_of_errors: List of error messages describing validation failures + """ + errors = [] + + # Check basic installation data + if not hasattr(InstallationData, 'boot') or not InstallationData.boot: + errors.append("Boot manager not specified") + elif InstallationData.boot not in ['refind', 'grub', 'none']: + errors.append(f"Invalid boot manager: {InstallationData.boot}") + + # Check ZFS configuration path + if InstallationData.zfs_config_data: + if not isinstance(InstallationData.zfs_config_data, list): + errors.append("ZFS config data is not a list") + else: + # Check for required ZFS configuration elements + has_partscheme = any('partscheme' in str(line) for line in InstallationData.zfs_config_data) + if not has_partscheme: + errors.append("ZFS config missing partition scheme") + + has_disk = any('disk0=' in str(line) for line in InstallationData.zfs_config_data) + if not has_disk: + errors.append("ZFS config missing disk specification") + else: + # Check custom partition configuration path + if not hasattr(InstallationData, 'disk') or not InstallationData.disk: + errors.append("Disk not specified for custom partitioning") + + if not hasattr(InstallationData, 'slice') or not InstallationData.slice: + errors.append("Partition slice not specified") + + if not hasattr(InstallationData, 'scheme') or not InstallationData.scheme: + errors.append("Partition scheme not specified") + elif InstallationData.scheme not in ['partscheme=GPT', 'partscheme=MBR']: + errors.append(f"Invalid partition scheme: {InstallationData.scheme}") + + if not hasattr(InstallationData, 'new_partition') or not InstallationData.new_partition: + errors.append("No partitions defined for custom partitioning") + elif not isinstance(InstallationData.new_partition, list): + errors.append("Partition data is not a list") + + # Check installation config file path + if not installation_config: + errors.append("Installation config file path not defined") + + return len(errors) == 0, errors + + @classmethod + def create_cfg(cls): + """ + Create the ghostbsd_installation.cfg file to install GhostBSD. + + Generates the configuration file used by the GhostBSD installer based on + data stored in InstallationData. Supports both ZFS and custom partitioning + configurations. + + The configuration includes: + - Installation mode and type settings + - Disk and partition configuration + - Boot manager setup + - Network configuration + - First boot preparation commands + + Raises: + ValueError: If sanity check fails, indicating invalid configuration data + IOError: If unable to write to the configuration file + """ + # Perform sanity check before creating configuration + is_valid, errors = cls.sanity_check() + if not is_valid: + error_msg = "Configuration validation failed:\n" + "\n".join(f"- {error}" for error in errors) + raise ValueError(error_msg) + + try: + with open(installation_config, 'w') as f: + # Installation Mode + f.write('# Installation Mode\n') + f.write('installMode=fresh\n') + f.write('installInteractive=no\n') + f.write('installType=GhostBSD\n') + f.write('installMedium=livezfs\n') + f.write('packageType=livezfs\n') + + if InstallationData.zfs_config_data: + # ZFS Configuration Path + for line in InstallationData.zfs_config_data: + if 'partscheme' in line: + f.write(line) + boot = InstallationData.boot + if boot == 'refind': + f.write('bootManager=none\n') + f.write(f'efiLoader={boot}\n') + else: + f.write(f'bootManager={boot}\n') + f.write('efiLoader=none\n') + else: + f.write(line) + else: + # Custom Partition Configuration Path + d_output = InstallationData.disk + f.write('\n# Disk Setup\n') + f.write('ashift=12\n') + f.write(f'disk0={d_output}\n') + # Partition Slice. + f.write(f'partition={InstallationData.slice}\n') + # Boot Menu + boot = InstallationData.boot + if boot == 'refind': + f.write('bootManager=none\n') + f.write(f'efiLoader={boot}\n') + else: + f.write(f'bootManager={boot}\n') + f.write('efiLoader=none\n') + f.write(f'{InstallationData.scheme}\n') + f.write('commitDiskPart\n') + # Partition Setup + f.write('\n# Partition Setup\n') + for line in InstallationData.new_partition: + if 'BOOT' in line or 'BIOS' in line or 'UEFI' in line: + pass + else: + f.write(f'disk0-part={line.strip()}\n') + f.write('commitDiskLabel\n') + + # Network Configuration + f.write('\n# Network Configuration\n') + f.write('hostname=installed\n') + + # First Boot Preparation Commands + f.write('\n# command to prepare first boot\n') + f.write("runCommand=sysrc hostname='installed'\n") + f.write("runCommand=pw userdel -n ghostbsd -r\n") + f.write("runCommand=sed -i '' 's/ghostbsd/root/g' /etc/gettytab\n") + f.write("runCommand=sed -i '' 's/ghostbsd/root/g' /etc/ttys\n") + f.write("runCommand=mv /usr/local/etc/devd/automount_devd" + ".conf.skip /usr/local/etc/devd/automount_devd.conf\n") + f.write("runCommand=mv /usr/local/etc/devd/automount_devd" + "_localdisks.conf.skip /usr/local/etc/devd/" + "automount_devd_localdisks.conf\n") + except IOError as e: + raise IOError(f"Failed to write configuration file: {e}") diff --git a/install_station/custom.py b/install_station/custom.py new file mode 100644 index 0000000..35861fb --- /dev/null +++ b/install_station/custom.py @@ -0,0 +1,883 @@ +import gi +gi.require_version('Gtk', '3.0') +gi.require_version('Gdk', '3.0') +from gi.repository import Gtk, Gdk +from install_station.partition import ( + DiskPartition, + DeletePartition, + bios_or_uefi, + CreateSlice, + AutoFreeSpace, + CreatePartition, + CreateLabel +) +from install_station.data import InstallationData, logo, get_text +from install_station.interface_controller import Button + + +bios_type = bios_or_uefi() + +cssProvider = Gtk.CssProvider() +cssProvider.load_from_path('/usr/local/lib/install-station/ghostbsd-style.css') +screen = Gdk.Screen.get_default() +styleContext = Gtk.StyleContext() +styleContext.add_provider_for_screen( + screen, + cssProvider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION +) + + +class PartitionManager: + """ + Utility class for partition management operations following the pattern of InstallTypes and ZFS. + + This class provides a GTK+ interface for managing disk partitions including creating, + deleting, and configuring partitions with support for both GPT and MBR schemes. + Supports ZFS, UFS, SWAP, BOOT, and UEFI filesystem types. + + The class follows a utility pattern with class methods and variables for state management, + designed to integrate with the InstallationData system for configuration persistence. + """ + # Class variables for state management + fs = None + mount_point = None + window = None + efi_exist = True + fs_behind = None + disk_index = None + path = None + disk = None + vbox1 = None + scheme = 'GPT' + size = None + slice = None + label = None + mount_point_behind = None + change_schemes = False + iter = None + store = None + treeview = None + tree_selection = None + + # UI elements as class variables + create_bt = None + delete_bt = None + revert_bt = None + auto_bt = None + fs_type = None + entry = None + mount_point_box = None + + @classmethod + def set_fs(cls, widget): + """ + Set the filesystem type from a ComboBoxText widget selection. + + Args: + widget: GTK ComboBoxText widget containing filesystem type options + """ + cls.fs = widget.get_active_text() + + @classmethod + def get_mount_point(cls, widget): + """ + Get the mount point from a ComboBoxText widget selection. + + Args: + widget: GTK ComboBoxText widget containing mount point options + """ + cls.mount_point = widget.get_active_text() + + @classmethod + def get_model(cls): + """ + Return the GTK widget model for the partition manager. + + Creates and initializes the UI if it doesn't exist yet. + + Returns: + Gtk.Box: The main container widget for the partition manager interface + """ + if cls.vbox1 is None: + cls.initialize() + return cls.vbox1 + + @classmethod + def initialize(cls): + """ + Initialize the partition manager UI following the utility class pattern. + + Creates the main interface including the partition tree view, control buttons, + and sets up the partition database. This method is called automatically + by get_model() when the interface is first accessed. + """ + DiskPartition.create_partition_database() + cls.vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.vbox1.show() + + # Scrolled window for partition tree + sw = Gtk.ScrolledWindow(hexpand=True, vexpand=True) + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + cls.store = Gtk.TreeStore(str, str, str, str, bool) + cls.tree_store() + cls.treeview = Gtk.TreeView() + cls.treeview.set_model(cls.store) + cls.treeview.set_rules_hint(True) + + # Setup columns + cls._setup_columns() + + cls.treeview.set_reorderable(True) + cls.treeview.expand_all() + cls.tree_selection = cls.treeview.get_selection() + cls.tree_selection.set_mode(Gtk.SelectionMode.SINGLE) + cls.tree_selection.connect("changed", cls.partition_selection) + sw.add(cls.treeview) + sw.show() + cls.vbox1.pack_start(sw, True, True, 0) + + # Button box + hbox1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=0) + hbox1.set_border_width(10) + cls.vbox1.pack_start(hbox1, False, False, 0) + hbox1.show() + cls.scheme = 'GPT' + hbox1.pack_start(cls.delete_create_button(), False, False, 10) + + @classmethod + def _setup_columns(cls): + """ + Setup treeview columns for the partition display. + + Creates columns for Partition, Size(MB), Mount Point, and System/Type + with appropriate widths and header labels. + """ + columns_config = [ + ('Partition', 0, 150), + ('Size(MB)', 1, 150), + ('Mount Point', 2, 150), + ('System/Type', 3, 150) + ] + + for i, (title, text_col, width) in enumerate(columns_config): + cell = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(None, cell, text=text_col) + column_header = Gtk.Label(label=title) + column_header.set_use_markup(True) + column_header.show() + column.set_widget(column_header) + column.set_resizable(True) + column.set_fixed_width(width) + if i == 0: + column.set_sort_column_id(0) + cls.treeview.append_column(column) + + @classmethod + def tree_store(cls): + """ + Populate the tree store with disk and partition information from the disk database. + + Creates a hierarchical tree structure showing: + - Disks (top level) + - Partitions/slices (second level) + - Labels/partitions (third level) + + Each level displays relevant information like size, mount points, and filesystem types. + + Returns: + Gtk.TreeStore: The populated tree store model + """ + cls.store.clear() + disk_db = DiskPartition.get_disk_database() + cls.disk_index = list(disk_db.keys()) + for disk in disk_db: + disk_info = disk_db[disk] + disk_scheme = disk_info['scheme'] + mount_point = '' + disk_size = str(disk_info['size']) + disk_partitions = disk_info['partitions'] + partition_list = disk_info['partition-list'] + pinter1 = cls.store.append(None, [disk, disk_size, mount_point, + disk_scheme, True]) + for partition in partition_list: + partition_info = disk_partitions[partition] + file_system = partition_info['file-system'] + mount_point = partition_info['mount-point'] + partition_size = str(partition_info['size']) + partition_partitions = partition_info['partitions'] + label_list = partition_info['partition-list'] + pinter2 = cls.store.append(pinter1, [partition, partition_size, mount_point, file_system, True]) + for label in label_list: + label_info = partition_partitions[label] + file_system = label_info['file-system'] + label_mount_point = label_info['mount-point'] + label_size = str(label_info['size']) + cls.store.append(pinter2, [label, label_size, label_mount_point, file_system, True]) + return cls.store + + @classmethod + def update(cls): + """ + Update the treeview after partition operations. + + Refreshes the partition tree display, expands all rows, and attempts + to restore the previously selected row if it still exists. + """ + old_path = cls.path + cls.tree_store() + cls.treeview.expand_all() + if old_path: + cls.treeview.row_activated(old_path, cls.treeview.get_columns()[0]) + cls.treeview.set_cursor(old_path) + + @classmethod + def delete_create_button(cls): + """ + Create the button toolbar for partition operations. + + Creates a horizontal box containing Create, Delete, Revert, and Auto buttons + for partition management operations. + + Returns: + Gtk.Box: Container with partition operation buttons + """ + bbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=True, spacing=10) + bbox.set_border_width(5) + bbox.set_spacing(10) + cls.create_bt = Gtk.Button(label=get_text("Create")) + cls.create_bt.connect("clicked", cls.create_partition) + cls.create_bt.set_sensitive(False) + bbox.pack_start(cls.create_bt, True, True, 0) + cls.delete_bt = Gtk.Button(label=get_text("Delete")) + cls.delete_bt.connect("clicked", cls.delete_partition) + cls.delete_bt.set_sensitive(False) + bbox.pack_start(cls.delete_bt, True, True, 0) + cls.revert_bt = Gtk.Button(label=get_text("Revert")) + cls.revert_bt.connect("clicked", cls.revert_change) + cls.revert_bt.set_sensitive(False) + bbox.pack_start(cls.revert_bt, True, True, 0) + cls.auto_bt = Gtk.Button(label=get_text("Auto")) + cls.auto_bt.connect("clicked", cls.auto_partition) + cls.auto_bt.set_sensitive(False) + bbox.pack_start(cls.auto_bt, True, True, 0) + return bbox + + @classmethod + def on_add_label(cls, _widget, entry, free_space, path): + """ + Handle adding a new label/partition in MBR scheme. + + Args: + _widget: The button widget (unused) + entry: SpinButton containing the partition size + free_space: Available space in MB + path: TreePath indicating the parent location + """ + create_size = entry.get_value_as_int() + left_size = free_space - create_size + CreateLabel(path, cls.disk, cls.slice, left_size, create_size, + cls.mount_point, cls.fs) + cls.window.hide() + cls.update() + + @classmethod + def on_add_partition(cls, _widget, entry, free_space, path): + """ + Handle adding a new partition in GPT scheme. + + Args: + _widget: The button widget (unused) + entry: SpinButton containing the partition size + free_space: Available space in MB + path: TreePath indicating the parent location + """ + create_size = entry.get_value_as_int() + left_size = int(free_space - create_size) + CreatePartition(path, cls.disk, left_size, create_size, + cls.mount_point, cls.fs) + cls.window.hide() + cls.update() + + @classmethod + def cancel(cls, _widget): + """ + Cancel the current partition operation and close the dialog. + + Args: + _widget: The cancel button widget (unused) + """ + cls.window.hide() + cls.update() + + @classmethod + def label_editor(cls, path, size, scheme): + """ + Open the partition/label editor dialog. + + Creates a dialog window for configuring a new partition with options for + filesystem type, size, and mount point based on the partitioning scheme. + + Args: + path: TreePath indicating where to create the partition + size: Available free space in MB + scheme: Partitioning scheme ('GPT' or 'MBR') + """ + free_space = int(size) + cls.window = Gtk.Window() + cls.window.set_title(title=get_text("Add Partition")) + cls.window.set_border_width(0) + cls.window.set_size_request(480, 200) + cls.window.set_icon_from_file(logo) + box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.window.add(box1) + box1.show() + box2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=10) + box2.set_border_width(10) + box1.pack_start(box2, True, True, 0) + box2.show() + + # Create partition configuration table + table = Gtk.Table(1, 2, True) + label1 = Gtk.Label(label=get_text("Type:")) + label2 = Gtk.Label(label=get_text("Size(MB):")) + label3 = Gtk.Label(label=get_text("Mount point:")) + cls.fs_type = Gtk.ComboBoxText() + cls.fs_type.append_text('ZFS') + cls.fs_type.append_text('SWAP') + cls.fs_type.append_text('UFS') # Add UFS option + + # Set filesystem options based on scheme and existing partitions + if scheme == 'GPT': + if bios_type == "UEFI": + cls.fs_type.append_text("UEFI") + if cls.efi_exist is False: + cls.fs_type.set_active(3) # UEFI + cls.fs = "UEFI" + elif cls.mount_point_behind == "/" or cls.fs_behind == "ZFS": + cls.fs_type.set_active(1) # SWAP + cls.fs = "SWAP" + else: + cls.fs_type.set_active(0) # ZFS + cls.fs = "ZFS" + else: + cls.fs_type.append_text("BOOT") + if not InstallationData.new_partition: + cls.fs_type.set_active(4) # BOOT + cls.fs = "BOOT" + elif len(InstallationData.new_partition) == 0: + cls.fs_type.set_active(4) # BOOT + cls.fs = "BOOT" + elif cls.mount_point_behind == "/" or cls.fs_behind == "ZFS": + cls.fs_type.set_active(1) # SWAP + cls.fs = "SWAP" + else: + cls.fs_type.set_active(0) # ZFS + cls.fs = "ZFS" + elif cls.mount_point_behind == "/" or cls.fs_behind == "ZFS": + cls.fs_type.set_active(1) # SWAP + cls.fs = "SWAP" + else: + cls.fs_type.set_active(0) # ZFS + cls.fs = "ZFS" + + cls.fs_type.connect("changed", cls.set_fs) + + # Size spinner + adj = Gtk.Adjustment(free_space, 0, free_space, 1, 100, 0) + cls.entry = Gtk.SpinButton(adjustment=adj, numeric=True) + cls.entry.set_editable(True) + + # Mount point selection + cls.mount_point_box = Gtk.ComboBoxText() + cls.mount_point = "none" + cls.mount_point_box.append_text('none') + cls.mount_point_box.append_text('/') + if InstallationData.new_partition: + if scheme == 'GPT' and len(InstallationData.new_partition) == 1: + cls.mount_point_box.append_text('/boot') + elif scheme == 'MBR' and len(InstallationData.new_partition) == 0: + cls.mount_point_box.append_text('/boot') + elif scheme == 'MBR' and not InstallationData.new_partition: + cls.mount_point_box.append_text('/boot') + cls.mount_point_box.append_text('/etc') + cls.mount_point_box.append_text('/root') + cls.mount_point_box.append_text('/tmp') + cls.mount_point_box.append_text('/usr') + cls.mount_point_box.append_text('/home') + cls.mount_point_box.append_text('/var') + cls.mount_point_box.set_active(0) + + # Enable mount point selection for UFS + if 'UFS' in cls.fs: + cls.mount_point_box.set_sensitive(True) + else: + cls.mount_point_box.set_sensitive(False) + cls.mount_point_box.connect("changed", cls.get_mount_point) + + # Add to table + table.attach(label1, 0, 1, 1, 2) + table.attach(cls.fs_type, 1, 2, 1, 2) + table.attach(label2, 0, 1, 2, 3) + table.attach(cls.entry, 1, 2, 2, 3) + table.attach(label3, 0, 1, 3, 4) + table.attach(cls.mount_point_box, 1, 2, 3, 4) + box2.pack_start(table, False, False, 0) + + # Buttons + box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=10) + box2.set_border_width(5) + box1.pack_start(box2, False, True, 0) + box2.show() + bbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=True, spacing=10) + bbox.set_border_width(5) + bbox.set_spacing(10) + + button = Gtk.Button(stock=Gtk.STOCK_CANCEL) + button.connect("clicked", cls.cancel) + bbox.pack_start(button, True, True, 0) + + button = Gtk.Button(stock=Gtk.STOCK_ADD) + if scheme == 'MBR': + button.connect( + "clicked", cls.on_add_label, cls.entry, free_space, path + ) + elif scheme == 'GPT' and cls.fs == 'BOOT': + button.connect( + "clicked", cls.on_add_partition, cls.entry, free_space, path + ) + elif scheme == 'GPT' and cls.fs == 'UEFI' and cls.efi_exist is False: + button.connect( + "clicked", cls.on_add_partition, cls.entry, free_space, path + ) + else: + button.connect( + "clicked", cls.on_add_partition, cls.entry, free_space, path + ) + bbox.pack_start(button, True, True, 0) + box2.pack_end(bbox, True, True, 5) + cls.window.show_all() + + @classmethod + def scheme_selection(cls, combobox): + """ + Handle partition scheme selection from combo box. + + Args: + combobox: ComboBox widget containing scheme options + """ + model = combobox.get_model() + index = combobox.get_active() + data = model[index][0] + value = data.partition(':')[0] + cls.scheme = value + + @classmethod + def add_gpt_mbr(cls, _widget): + """ + Apply the selected partition scheme to the disk. + + Args: + _widget: The add button widget (unused) + """ + DiskPartition.set_disk_scheme(cls.scheme, cls.disk, cls.size) + cls.update() + cls.window.hide() + + @classmethod + def scheme_editor(cls): + """ + Create a partition scheme editor window. + + Opens a dialog allowing the user to select between GPT and MBR + partition schemes for the selected disk. + """ + cls.window = Gtk.Window() + cls.window.set_title(get_text("Partition Scheme")) + cls.window.set_border_width(0) + cls.window.set_size_request(400, 150) + cls.window.set_icon_from_file(logo) + box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.window.add(box1) + box1.show() + box2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=10) + box2.set_border_width(10) + box1.pack_start(box2, True, True, 0) + box2.show() + + # Creating MBR or GPT drive + label = Gtk.Label(label='Select a partition scheme for this drive:') + label.set_use_markup(True) + + # Adding a combo box to selecting MBR or GPT scheme. + cls.scheme = 'GPT' + scheme_box = Gtk.ComboBoxText() + scheme_box.append_text(get_text("GPT: GUID Partition Table")) + scheme_box.append_text(get_text("MBR: DOS Partition")) + scheme_box.connect('changed', cls.scheme_selection) + scheme_box.set_active(0) + table = Gtk.Table(1, 2, True) + table.attach(label, 0, 2, 0, 1) + table.attach(scheme_box, 0, 2, 1, 2) + box2.pack_start(table, False, False, 0) + box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=10) + box2.set_border_width(5) + box1.pack_start(box2, False, True, 0) + box2.show() + + # Add create_scheme button + bbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=True, spacing=10) + bbox.set_border_width(5) + bbox.set_spacing(10) + button = Gtk.Button(stock=Gtk.STOCK_ADD) + button.connect("clicked", cls.add_gpt_mbr) + bbox.pack_start(button, True, True, 0) + box2.pack_end(bbox, True, True, 5) + cls.window.show_all() + + @classmethod + def get_value(cls, _widget, entry): + """ + Handle slice creation from the slice editor dialog. + + Gets the partition size from the entry widget and creates a new slice + in the MBR partition table. + + Args: + _widget: The add button widget (unused) + entry: SpinButton containing the partition size + """ + partition_size = int(entry.get_value_as_int()) + rs = int(cls.size) - partition_size + CreateSlice(partition_size, rs, cls.path, cls.disk) + cls.update() + cls.window.hide() + + @classmethod + def slice_editor(cls): + """ + Create a window for editing partition slices in MBR scheme. + + Opens a dialog for creating a new slice partition with size configuration. + Used specifically for MBR partitioning scheme. + """ + free_space = int(cls.size) + cls.window = Gtk.Window() + cls.window.set_title(get_text("Add Partition")) + cls.window.set_border_width(0) + cls.window.set_size_request(400, 150) + cls.window.set_icon_from_file(logo) + box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.window.add(box1) + box1.show() + box2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=10) + box2.set_border_width(10) + box1.pack_start(box2, True, True, 0) + box2.show() + + # Create Partition slice + table = Gtk.Table(1, 2, True) + label1 = Gtk.Label(label=get_text("Size(MB):")) + adj = Gtk.Adjustment(free_space, 0, free_space, 1, 100, 0) + cls.entry = Gtk.SpinButton(adjustment=adj, numeric=True) + cls.entry.set_numeric(True) + table.attach(label1, 0, 1, 1, 2) + table.attach(cls.entry, 1, 2, 1, 2) + box2.pack_start(table, False, False, 0) + box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=10) + box2.set_border_width(5) + box1.pack_start(box2, False, True, 0) + box2.show() + + # Add button + bbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=True, spacing=10) + bbox.set_border_width(5) + bbox.set_spacing(10) + button = Gtk.Button(stock=Gtk.STOCK_CANCEL) + button.connect("clicked", cls.cancel) + bbox.pack_start(button, True, True, 0) + button = Gtk.Button(stock=Gtk.STOCK_ADD) + button.connect("clicked", cls.get_value, cls.entry) + bbox.pack_start(button, True, True, 0) + box2.pack_end(bbox, True, True, 5) + cls.window.show_all() + + @classmethod + def delete_partition(cls, _widget): + """ + Delete the currently selected partition. + + Removes the selected partition or slice from the disk and updates + the partition display. + + Args: + _widget: The delete button widget (unused) + """ + part = cls.slice if cls.label == "Not selected" else cls.label + DeletePartition(part, cls.path) + cls.update() + + @classmethod + def auto_partition(cls, _widget): + """ + Automatically partition the disk with default ZFS configuration. + + Creates automatic partitions suitable for ZFS installation including + boot partitions (if needed) and ZFS root partition. + + Args: + _widget: The auto button widget (unused) + """ + cls.create_bt.set_sensitive(False) + cls.delete_bt.set_sensitive(False) + cls.auto_bt.set_sensitive(False) + cls.revert_bt.set_sensitive(False) + if 'freespace' in cls.slice: + AutoFreeSpace(cls.path, cls.size, 'ZFS', cls.efi_exist, + cls.disk, cls.scheme) + cls.update() + else: + print('wrong utilization') + + @classmethod + def revert_change(cls, _widget): + """ + Revert all partition changes and restore original state. + + Clears all partition configuration data from InstallationData and + recreates the original partition database, effectively undoing + all partition modifications. + + Args: + _widget: The revert button widget (unused) + """ + # Reset all partition configuration data in InstallationData + InstallationData.create = [] + InstallationData.scheme = "" + InstallationData.disk = "" + InstallationData.slice = "" + InstallationData.delete = [] + InstallationData.destroy = {} + InstallationData.new_partition = [] + DiskPartition.create_partition_database() + cls.tree_store() + cls.treeview.expand_all() + + @classmethod + def create_partition(cls, _widget): + """ + Create a new partition based on the current selection. + + Opens the appropriate editor dialog based on the selected item: + - Scheme editor for un-partitioned disks + - Label editor for free space in MBR or GPT + - Slice editor for MBR primary partition creation + + Args: + _widget: The create button widget (unused) + """ + cls.create_bt.set_sensitive(False) + cls.delete_bt.set_sensitive(False) + cls.auto_bt.set_sensitive(False) + cls.revert_bt.set_sensitive(False) + if cls.change_schemes is True: + cls.scheme_editor() + elif 'freespace' in cls.label: + cls.label_editor(cls.path, cls.size, 'MBR') + elif 'freespace' in cls.slice: + if cls.scheme == "MBR" and cls.path[1] < 4: + cls.slice_editor() + elif cls.scheme == "GPT": + cls.label_editor(cls.path, cls.size, 'GPT') + else: + print('This method of creating partition is not implemented') + + @classmethod + def partition_selection(cls, widget): + """ + Handle partition selection events and update UI button states. + + This method is called when a user selects a different item in the partition + tree view. It analyzes the selection and enables/disables appropriate buttons + based on what operations are valid for the selected item. + + The method handles complex logic for: + - Determining partition hierarchy (disk/slice/label) + - Checking partition scheme compatibility + - Validating boot partition requirements + - Managing button sensitivity states + + Args: + widget: TreeSelection widget that triggered the selection change + """ + efi_already_exist = False + model, cls.iter, = widget.get_selected() + if cls.iter is None: + Button.next_button.set_sensitive(False) + return None + cls.path = model.get_path(cls.iter) + main_tree_iter = model.get_iter(cls.path) + cls.size = model.get_value(main_tree_iter, 1) + tree_iter1 = model.get_iter(cls.path[0]) + cls.scheme = model.get_value(tree_iter1, 3) + cls.disk = model.get_value(tree_iter1, 0) + + if len(cls.path) >= 2: + tree_iter2 = model.get_iter(cls.path[:2]) + cls.slice = model.get_value(tree_iter2, 0) + cls.change_schemes = False + else: + if len(cls.path) == 1: + if DiskPartition.how_partition(cls.disk) == 0: + cls.change_schemes = True + elif DiskPartition.how_partition(cls.disk) == 1: + slice_path = f'{cls.path[0]}:0' + try: + tree_iter2 = model.get_iter(slice_path) + if 'freespace' in model.get_value(tree_iter2, 0): + cls.change_schemes = True + else: + cls.change_schemes = False + except ValueError: + cls.change_schemes = True + else: + cls.change_schemes = False + cls.slice = 'Not selected' + else: + cls.slice = 'Not selected' + cls.change_schemes = False + + if len(cls.path) == 3: + tree_iter3 = model.get_iter(cls.path[:3]) + cls.label = model.get_value(tree_iter3, 0) + else: + cls.label = 'Not selected' + + # Get previous partition info for context + if len(cls.path) == 2 and cls.path[1] > 0 and cls.scheme == "GPT": + path_behind = f'{cls.path[0]}:{str(int(cls.path[1] - 1))}' + tree_iter4 = model.get_iter(path_behind) + cls.mount_point_behind = model.get_value(tree_iter4, 2) + cls.fs_behind = model.get_value(tree_iter4, 3) + elif len(cls.path) == 3 and cls.path[2] > 0 and cls.scheme == "MBR": + path1 = cls.path[0] + path2 = str(cls.path[1]) + path3 = str(int(cls.path[2] - 1)) + path_behind2 = f'{path1}:{path2}:{path3}' + tree_iter1 = model.get_iter(path_behind2) + cls.mount_point_behind = model.get_value(tree_iter1, 2) + cls.fs_behind = model.get_value(tree_iter1, 3) + else: + cls.mount_point_behind = None + cls.fs_behind = None + + # Set button states based on selection + if 'freespace' in cls.slice: + cls.create_bt.set_sensitive(True) + cls.delete_bt.set_sensitive(False) + cls.auto_bt.set_sensitive(True) + # Scan for efi partition + for num in range(cls.path[1]): + partition_path = f"{cls.path[0]}:{num}" + tree_iter_1 = model.get_iter(partition_path) + first_fs = model.get_value(tree_iter_1, 3) + if first_fs == "UEFI" or 'efi' in first_fs: + cls.efi_exist = True + break + else: + cls.efi_exist = False + elif 'freespace' in cls.label: + if cls.path[1] > 3: + cls.create_bt.set_sensitive(False) + else: + cls.create_bt.set_sensitive(True) + cls.auto_bt.set_sensitive(True) + cls.delete_bt.set_sensitive(False) + elif 's' in cls.slice and len(cls.path) > 1: + cls.create_bt.set_sensitive(False) + cls.delete_bt.set_sensitive(True) + cls.auto_bt.set_sensitive(False) + elif 'p' in cls.slice and len(cls.path) > 1: + cls.create_bt.set_sensitive(False) + cls.delete_bt.set_sensitive(True) + cls.auto_bt.set_sensitive(False) + else: + cls.delete_bt.set_sensitive(False) + cls.auto_bt.set_sensitive(False) + if DiskPartition.how_partition(cls.disk) == 0: + cls.create_bt.set_sensitive(True) + elif cls.change_schemes is True: + cls.create_bt.set_sensitive(True) + else: + cls.create_bt.set_sensitive(False) + + # Handle partition validation + if InstallationData.new_partition: + cls.partitions = InstallationData.new_partition + if not cls.partitions: + Button.next_button.set_sensitive(False) + return None + if 'GPT' in InstallationData.scheme: + if InstallationData.disk: + disk = InstallationData.disk + disk_id = cls.disk_index.index(disk) + num = 0 + while True: + partition_path = f"{disk_id}:{num}" + try: + tree_iter_1 = model.get_iter(partition_path) + first_fs = model.get_value(tree_iter_1, 3) + if 'efi' in first_fs: + efi_already_exist = True + break + except ValueError: + efi_already_exist = False + break + num += 1 + if 'BOOT' in cls.partitions[0] and bios_type == 'BIOS': + if len(cls.partitions) >= 2 and 'ZFS' in cls.partitions[1]: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif efi_already_exist is True and bios_type == 'UEFI': + if 'ZFS' in cls.partitions[0]: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif len(cls.partitions) >= 2 and 'UEFI' in cls.partitions[0] and 'ZFS' in cls.partitions[1]: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif 'MBR' in InstallationData.scheme: + cls.efi_exist = False + if len(cls.partitions) >= 1: + if "/boot\n" in cls.partitions[0]: + if len(cls.partitions) >= 2 and 'ZFS' in cls.partitions[1]: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif 'ZFS' in cls.partitions[0]: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + else: + Button.next_button.set_sensitive(False) + else: + Button.next_button.set_sensitive(False) + else: + Button.next_button.set_sensitive(False) + + # Check if any configuration exists to enable revert button + path_exist = [ + bool(InstallationData.create), + bool(InstallationData.scheme), + bool(InstallationData.disk), + bool(InstallationData.slice), + bool(InstallationData.delete), + bool(InstallationData.destroy), + bool(InstallationData.new_partition) + ] + if any(path_exist): + cls.revert_bt.set_sensitive(True) + else: + cls.revert_bt.set_sensitive(False) diff --git a/install_station/data.py b/install_station/data.py new file mode 100644 index 0000000..6e03150 --- /dev/null +++ b/install_station/data.py @@ -0,0 +1,108 @@ +""" +Contains the data class and some commonly use variables +""" +import os +import gettext + +be_name: str = "default" +logo: str = "/usr/local/lib/install-station/image/logo.png" +gif_logo: str = "/usr/local/lib/install-station/image/G_logo.gif" +pc_sysinstall: str = "/usr/local/sbin/pc-sysinstall" +query: str = "sh /usr/local/lib/install-station/backend-query" +tmp: str = "/tmp" +installation_config: str = f'{tmp}/ghostbsd_installation.cfg' +zfs_datasets: str = "/," \ + "/home(mountpoint=/home)," \ + "/tmp(mountpoint=/tmp|exec=on|setuid=off)," \ + "/usr(mountpoint=/usr|canmount=off)," \ + "/usr/ports(setuid=off)," \ + "/usr/src," \ + "/var(mountpoint=/var|canmount=off)," \ + "/var/audit(exec=off|setuid=off)," \ + "/var/crash(exec=off|setuid=off)," \ + "/var/log(exec=off|setuid=off)," \ + "/var/mail(atime=on)," \ + "/var/tmp(setuid=off)" + + +class InstallationData: + """ + Centralized data storage for installation configuration + """ + # Partition configuration + destroy: dict = {} + delete: list = [] + new_partition: list = [] + create: list = [] + scheme: str = "" + disk: str = "" + slice: str = "" + boot: str = "" + + # ZFS configuration data (instead of zfs_config file) + zfs_config_data: list = [] + + # UFS configuration data (instead of ufs_config file) + ufs_config_data: list = [] + + # Installation type and mode + install_mode: str = "" # "install" or "try" + filesystem_type: str = "" # "zfs", "ufs", or "custom" + + # Language and localization + language: str = "" + language_code: str = "" + + # Keyboard configuration + keyboard_layout: str = "" + keyboard_layout_code: str = "" + keyboard_variant: str = "" + keyboard_model: str = "" + keyboard_model_code: str = "" + + # Boot manager configuration + boot_manager: str = "" + + # Network configuration (for live mode) + network_config: dict = {} + + @classmethod + def reset(cls) -> None: + """Reset all installation data""" + cls.destroy = {} + cls.delete = [] + cls.new_partition = [] + cls.create = [] + cls.scheme = "" + cls.disk = "" + cls.slice = "" + cls.boot = "" + cls.zfs_config_data = [] + cls.ufs_config_data = [] + cls.install_mode = "" + cls.filesystem_type = "" + cls.language = "" + cls.language_code = "" + cls.keyboard_layout = "" + cls.keyboard_layout_code = "" + cls.keyboard_variant = "" + cls.keyboard_model = "" + cls.keyboard_model_code = "" + cls.boot_manager = "" + cls.network_config = {} + + +def get_text(text: str) -> str: + """ + Global translation function that always returns current language translation. + + Args: + text: Text to translate + + Returns: + str: Translated text in current language + """ + # Force reload of translations for current language + gettext.bindtextdomain('install-station', '/usr/local/share/locale') + gettext.textdomain('install-station') + return gettext.gettext(text) diff --git a/install_station/end.py b/install_station/end.py new file mode 100644 index 0000000..6b9c059 --- /dev/null +++ b/install_station/end.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk +from subprocess import Popen +from install_station.data import get_text + + +lyrics = get_text("""Installation is complete. You need to restart the +computer in order to use the new installation. +You can continue to use this live media, although +any changes you make or documents you save will +not be preserved on reboot.""") + + +class EndWindow: + @classmethod + def on_reboot(cls, _widget): + Popen('shutdown -r now', shell=True) + Gtk.main_quit() + + @classmethod + def on_close(cls, _widget): + Gtk.main_quit() + + def __init__(self): + window = Gtk.Window() + window.set_border_width(8) + window.connect("destroy", Gtk.main_quit) + window.set_title(get_text("Installation Completed")) + window.set_icon_from_file("/usr/local/lib/install-station/image/logo.png") + box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + window.add(box1) + box1.show() + box2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=10) + box2.set_border_width(10) + box1.pack_start(box2, True, True, 0) + box2.show() + label = Gtk.Label(label=lyrics) + box2.pack_start(label, True, True, 0) + box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=10) + box2.set_border_width(5) + box1.pack_start(box2, False, True, 0) + box2.show() + table = Gtk.Table(1, 2, True) + restart = Gtk.Button(label=get_text("Restart")) + restart.connect("clicked", self.on_reboot) + continue_button = Gtk.Button(label=get_text("Continue")) + continue_button.connect("clicked", self.on_close) + table.attach(continue_button, 0, 1, 0, 1) + table.attach(restart, 1, 2, 0, 1) + box2.pack_start(table, True, True, 0) + window.show_all() diff --git a/install_station/error.py b/install_station/error.py new file mode 100644 index 0000000..47235a7 --- /dev/null +++ b/install_station/error.py @@ -0,0 +1,49 @@ +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk +from install_station.data import get_text + + +class ErrorWindow: + + @classmethod + def on_close(cls, _widget): + Gtk.main_quit() + + def __init__(self): + window = Gtk.Window() + window.set_border_width(8) + window.connect("destroy", Gtk.main_quit) + window.set_title(get_text("Installation Error")) + # window.set_icon_from_file("/usr/local/lib/install-station/image/logo.png") + box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + window.add(box1) + box1.show() + box2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=10) + box2.set_border_width(10) + box1.pack_start(box2, True, True, 0) + box2.show() + title = Gtk.Label() + title.set_use_markup(True) + title_text = get_text("Installation has failed!") + title.set_markup(f'{title_text}') + label = Gtk.Label() + label.set_use_markup(True) + url = 'https://github.com/ghostbsd/ghostbsd-src/issues/new/choose' + anchor = f"{get_text('GhostBSD issue system')}" + message = get_text( + "Please report the issue to {anchor}, and \nbe sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." + ).format(anchor=anchor) + label.set_markup(message) + box2.pack_start(title, True, True, 0) + box2.pack_start(label, True, True, 0) + box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=10) + box2.set_border_width(5) + box1.pack_start(box2, False, True, 0) + box2.show() + table = Gtk.Table(n_rows=1, n_columns=2, homogeneous=True) + ok = Gtk.Button(label=get_text("Ok")) + ok.connect("clicked", self.on_close) + table.attach(ok, 0, 2, 0, 1) + box2.pack_start(table, True, True, 0) + window.show_all() diff --git a/install_station/install.py b/install_station/install.py new file mode 100644 index 0000000..faa3fc6 --- /dev/null +++ b/install_station/install.py @@ -0,0 +1,147 @@ +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk, GLib, Gdk +import threading +from subprocess import Popen, PIPE, STDOUT +from time import sleep +from install_station.partition import ( + delete_partition, + destroy_partition, + add_partition +) +from install_station.create_cfg import Configuration +from install_station.end import EndWindow +from install_station.error import ErrorWindow +from install_station.window import Window +from install_station.data import ( + gif_logo, + InstallationData, + installation_config, + pc_sysinstall, + get_text +) + + +cssProvider = Gtk.CssProvider() +cssProvider.load_from_path('/usr/local/lib/install-station/ghostbsd-style.css') +screen = Gdk.Screen.get_default() +styleContext = Gtk.StyleContext() +styleContext.add_provider_for_screen( + screen, + cssProvider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION +) + + +def update_progress(progressbar, text): + """ + This method + """ + new_val = progressbar.get_fraction() + 0.000003 + progressbar.set_fraction(new_val) + progressbar.set_text(text[0:80]) + + +def read_output(command, progressbar): + GLib.idle_add(update_progress, progressbar, get_text("Creating ghostbsd_installation.cfg")) + Configuration.create_cfg() + sleep(1) + if InstallationData.delete: + GLib.idle_add(update_progress, progressbar, get_text("Deleting partition")) + delete_partition() + sleep(1) + # destroy disk partition and create scheme + if InstallationData.destroy: + GLib.idle_add(update_progress, progressbar, get_text("Creating disk partition")) + destroy_partition() + sleep(1) + # create partition + if InstallationData.create: + GLib.idle_add(update_progress, progressbar, get_text("Creating new partitions")) + add_partition() + sleep(1) + progressbar_text = None + process = Popen( + command, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True, universal_newlines=True + ) + while True: + line = process.stdout.readline() + if not line: + break + progressbar_text = line.rstrip() + GLib.idle_add(update_progress, progressbar, progressbar_text) + # Those for next 4 line is for debugging only. + # filer = open(f"{tmp}/tmp", "a") + # filer.writelines(progressbar_text) + # filer.close + print(progressbar_text) + if progressbar_text.rstrip() == "Installation finished!": + EndWindow() + else: + ErrorWindow() + Window.hide() + + +class InstallWindow: + + def __init__(self): + self.vBox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + self.vBox.show() + label = Gtk.Label(label=get_text("Installation in progress"), name="Header") + label.set_property("height-request", 50) + self.vBox.pack_start(label, False, False, 0) + + hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=0, name="install") + hbox.show() + self.vBox.pack_end(hbox, True, True, 0) + vbox2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + vbox2.show() + label2 = Gtk.Label(name="sideText") + + label2.set_markup(get_text( + "Thank you for choosing GhostBSD!\n\n" + "We believe every computer operating system should " + "be simple, elegant, secure and protect your privacy" + " while being easy to use. GhostBSD is simplifying " + "FreeBSD for those who lack the technical expertise " + "required to use it and lower the entry-level of " + "using BSD. \n\nWe hope you'll enjoy our BSD " + "operating system." + )) + label2.set_justify(Gtk.Justification.LEFT) + label2.set_line_wrap(True) + # label2.set_max_width_chars(10) + label2.set_alignment(0.0, 0.2) + hbox2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=0, name="TransBox") + hbox2.show() + hbox.pack_start(hbox2, True, True, 0) + hbox2.pack_start(label2, True, True, 30) + image = Gtk.Image() + image.set_from_file(gif_logo) + # image.set_size_request(width=256, height=256) + image.show() + hbox.pack_end(image, True, True, 20) + + def get_model(self): + return self.vBox + + +class InstallProgress: + + def __init__(self): + self.pbar = Gtk.ProgressBar() + self.pbar.set_show_text(True) + command = f'sudo {pc_sysinstall} -c {installation_config}' + thread = threading.Thread( + target=read_output, + args=( + command, + self.pbar + ), + daemon=True + ) + thread.start() + self.pbar.show() + + def get_progressbar(self): + return self.pbar diff --git a/install_station/install_type.py b/install_station/install_type.py new file mode 100644 index 0000000..410f2d2 --- /dev/null +++ b/install_station/install_type.py @@ -0,0 +1,125 @@ +""" +Module to create the inner window for select what type of installation. +""" +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk, Gdk +from install_station.data import InstallationData, get_text + +cssProvider = Gtk.CssProvider() +cssProvider.load_from_path('/usr/local/lib/install-station/ghostbsd-style.css') +screen = Gdk.Screen.get_default() +styleContext = Gtk.StyleContext() +styleContext.add_provider_for_screen( + screen, + cssProvider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION +) + + +class InstallTypes: + """Utility class for filesystem type selection following the utility class pattern. + + This class provides a GTK+ interface for installation type selection including: + - Filesystem type selection between ZFS disk configuration and multi-boot + - Radio button interface for user selection + - Integration with InstallationData for persistent configuration + + The class follows a utility pattern with class methods and variables for state management, + designed to integrate with the Interface controller for navigation flow. + """ + # Class variables instead of instance variables + ne: str = 'zfs' + vbox1: Gtk.Box | None = None + full_zfs_button: Gtk.RadioButton | None = None + custom_button: Gtk.RadioButton | None = None + + @classmethod + def filesystem_type(cls, widget: Gtk.RadioButton, val: str) -> None: + """Handle filesystem type selection from radio buttons. + + Only responds to activation, not deactivation. Updates both + class variables and InstallationData with the selected filesystem type. + + Args: + widget: RadioButton widget that triggered the action + val: Filesystem type value ('zfs' or 'custom') + """ + # Only respond to activation, not deactivation + if widget.get_active(): + cls.ne = val + InstallationData.filesystem_type = val + print(f"Filesystem type selected: {val}") + + @classmethod + def get_type(cls) -> str: + """Get the current filesystem type selection. + + Returns: + str: Current filesystem type ('zfs' or 'custom') + """ + return InstallationData.filesystem_type or cls.ne + + @classmethod + def get_model(cls) -> Gtk.Box: + """Return the GTK widget model for the installation type interface. + + Returns the main container widget that was created during initialization. + + Returns: + Gtk.Box: The main container widget for the installation type interface + """ + if cls.vbox1 is None: + cls.initialize() + return cls.vbox1 + + @classmethod + def initialize(cls) -> None: + """Initialize the installation type selection UI following the utility class pattern. + + Creates the main interface including: + - Radio buttons for ZFS disk configuration and multi-boot setup + - Descriptive text for each option + - Centered layout with proper spacing + + This method is called automatically by get_model() when the interface is first accessed. + """ + cls.vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.vbox1.show() + vbox2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + hbox1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=0) + InstallationData.filesystem_type = cls.ne + cls.vbox1.pack_start(hbox1, True, False, 0) + hbox1.set_halign(Gtk.Align.CENTER) + label = Gtk.Label(label=get_text("How do you want to install GhostBSD?")) + label.set_alignment(0, 0.5) + vbox2.pack_start(label, False, False, 10) + # Create radio button group + cls.full_zfs_button = Gtk.RadioButton( + label=get_text( + "Disks Configuration" + "\nInstall GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 configurations." + ) + ) + cls.full_zfs_button.get_child().set_use_markup(True) + cls.full_zfs_button.get_child().set_line_wrap(True) + vbox2.pack_start(cls.full_zfs_button, True, True, 10) + cls.full_zfs_button.connect("toggled", cls.filesystem_type, "zfs") + cls.full_zfs_button.show() + + cls.custom_button = Gtk.RadioButton.new_with_label_from_widget( + cls.full_zfs_button, + get_text( + "Multi-Boot Configuration\n" + "Install GhostBSD with ZFS alongside other operating systems." + ) + ) + cls.custom_button.get_child().set_use_markup(True) + cls.custom_button.get_child().set_line_wrap(True) + vbox2.pack_start(cls.custom_button, False, True, 10) + cls.custom_button.connect("toggled", cls.filesystem_type, "custom") + cls.custom_button.show() + + hbox1.pack_start(vbox2, True, False, 150) + vbox2.set_halign(Gtk.Align.CENTER) + cls.full_zfs_button.set_active(True) diff --git a/install_station/interface_controller.py b/install_station/interface_controller.py new file mode 100644 index 0000000..17c01ef --- /dev/null +++ b/install_station/interface_controller.py @@ -0,0 +1,316 @@ +""" +Interface Controller Module. + +This module provides the main navigation interface and button controls +for the Install Station GTK application wizard. +""" +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk +from install_station.install import InstallProgress, InstallWindow +from install_station.partition import DiskPartition +from install_station.window import Window +from install_station.data import InstallationData, get_text +from install_station.system_calls import localize_system, set_keyboard + + +class Button: + """ + Button management class for navigation controls. + + Manages the Back, Cancel, and Next buttons used throughout + the installation wizard interface. + """ + back_button: Gtk.Button = Gtk.Button(label=get_text('Back')) + """This button is used to go back to the previous page.""" + cancel_button: Gtk.Button = Gtk.Button(label=get_text('Cancel')) + """This button is used to quit and clean up.""" + next_button: Gtk.Button = Gtk.Button(label=get_text('Next')) + """This button is used to go to the next page.""" + _box: Gtk.Box | None = None + + @classmethod + def update_button_labels(cls) -> None: + """Update button labels with current language translations.""" + cls.back_button.set_label(get_text('Back')) + cls.cancel_button.set_label(get_text('Cancel')) + cls.next_button.set_label(get_text('Next')) + + @classmethod + def hide_all(cls) -> None: + """ + This method hides all buttons. + """ + cls.back_button.hide() + cls.cancel_button.hide() + cls.next_button.hide() + + @classmethod + def show_initial(cls) -> None: + """ + This method shows the initial buttons. Cancel and Next. + """ + cls.back_button.hide() + cls.cancel_button.show() + cls.next_button.show() + + @classmethod + def show_back(cls) -> None: + """ + This method shows the back button. + """ + cls.back_button.show() + + @classmethod + def hide_back(cls) -> None: + """ + This method hides the back button. + """ + cls.back_button.hide() + + @classmethod + def box(cls) -> Gtk.Box: + """ + This method creates a box container of buttons aligned to the right. + + Returns: + Box container with buttons aligned to the right for navigation. + """ + if cls._box is None: + # Use Box instead of Grid for better right-alignment control + cls._box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=5) + cls._box.set_halign(Gtk.Align.END) # Align the entire box to the right + + cls.back_button.connect("clicked", Interface.back_page) + cls._box.pack_start(cls.back_button, False, False, 0) + + cls.cancel_button.connect("clicked", Interface.delete) + cls._box.pack_start(cls.cancel_button, False, False, 0) + + cls.next_button.connect("clicked", Interface.next_page) + cls._box.pack_start(cls.next_button, False, False, 0) + + cls._box.show() + return cls._box + + +class Interface: + """ + Main interface controller for the installation wizard. + + Manages the GTK Notebook pages and navigation between different + screens in the installation process including language, keyboard, + network setup, installation type, and configuration screens. + """ + welcome = None + keyboard = None + network_setup = None + try_install = None + installation_type = None + custom_partition = None + full_zfs = None + boot_manager = None + page: Gtk.Notebook = Gtk.Notebook() + nbButton: Gtk.Notebook | None = None + + @classmethod + def get_interface(cls) -> Gtk.Box: + interface_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + interface_box.show() + interface_box.pack_start(cls.page, True, True, 0) + cls.page.show() + cls.page.set_show_tabs(False) + cls.page.set_show_border(False) + welcome_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + welcome_box.show() + cls.welcome.initialize() + get_types = cls.welcome.get_model() + welcome_box.pack_start(get_types, True, True, 0) + Window.set_title(get_text("Welcome to GhostBSD")) + label = Gtk.Label(label=get_text("Welcome to GhostBSD")) + cls.page.insert_page(welcome_box, label, 0) + # Set what page to start at type of installation + cls.page.set_current_page(0) + cls.nbButton = Gtk.Notebook() + interface_box.pack_end(cls.nbButton, False, False, 5) + cls.nbButton.show() + cls.nbButton.set_show_tabs(False) + cls.nbButton.set_show_border(False) + label = Gtk.Label(label=get_text("Button")) + cls.nbButton.insert_page(Button.box(), label, 0) + return interface_box + + @classmethod + def delete(cls, _widget: Gtk.Widget, _event=None) -> None: + """Close the main window.""" + InstallationData.reset() + Gtk.main_quit() + + @classmethod + def next_page(cls, _widget: Gtk.Button) -> None: + """Go to the next window.""" + page = cls.page.get_current_page() + if page == 0: + # Check if the keyboard page already exists + if cls.page.get_n_pages() <= 1: + keyboard_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + keyboard_box.show() + get_keyboard = cls.keyboard.get_model() + keyboard_box.pack_start(get_keyboard, True, True, 0) + label = Gtk.Label(label=get_text("Keyboard Setup")) + cls.page.insert_page(keyboard_box, label, 1) + cls.page.next_page() + cls.page.show_all() + Button.show_back() + elif page == 1: + # Check if the network setup page already exists + if cls.page.get_n_pages() <= 2: + network_setup_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + network_setup_box.show() + get_network_setup = cls.network_setup.get_model() + network_setup_box.pack_start(get_network_setup, True, True, 0) + label = Gtk.Label(label=get_text("Network Setup")) + cls.page.insert_page(network_setup_box, label, 2) + cls.page.next_page() + cls.page.show_all() + elif page == 2: + # Check if the try_install page already exists + if cls.page.get_n_pages() <= 3: + try_install_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + try_install_box.show() + get_try_install = cls.try_install.get_model() + try_install_box.pack_start(get_try_install, True, True, 0) + label = Gtk.Label(label=get_text("Try Or Install GhostBSD")) + cls.page.insert_page(try_install_box, label, 3) + cls.page.next_page() + cls.page.show_all() + elif page == 3: + if cls.try_install.get_what() == 'install': + if cls.page.get_n_pages() <= 4: + type_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + type_box.show() + get_types = cls.installation_type.get_model() + type_box.pack_start(get_types, True, True, 0) + label = Gtk.Label(label=get_text("Installation Types")) + cls.page.insert_page(type_box, label, 4) + cls.page.next_page() + cls.page.show_all() + else: + # Apply localization and keyboard layout for live session + # Apply system localization if language was selected + if InstallationData.language_code: + localize_system(InstallationData.language_code) + + # Apply keyboard layout if selected + if InstallationData.keyboard_layout_code: + set_keyboard( + InstallationData.keyboard_layout_code, + InstallationData.keyboard_variant, + InstallationData.keyboard_model_code + ) + + # Continue to network setup for live session + cls.next_setup_page() + elif page == 4: + Button.show_back() + if InstallationData.filesystem_type == "custom": + custom_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + custom_box.show() + get_part = cls.custom_partition.get_model() + custom_box.pack_start(get_part, True, True, 0) + label = Gtk.Label(label=get_text("Custom Configuration")) + cls.page.insert_page(custom_box, label, 5) + cls.page.next_page() + cls.page.show_all() + Button.next_button.set_sensitive(False) + elif InstallationData.filesystem_type == "zfs": + zfs_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + zfs_box.show() + get_zfs = cls.full_zfs.get_model() + zfs_box.pack_start(get_zfs, True, True, 0) + label = Gtk.Label(label=get_text("ZFS Configuration")) + cls.page.insert_page(zfs_box, label, 5) + cls.page.next_page() + cls.page.show_all() + Button.next_button.set_sensitive(False) + elif page == 5: + boot_manager_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + boot_manager_box.show() + get_root = cls.boot_manager.get_model() + boot_manager_box.pack_start(get_root, True, True, 0) + label = Gtk.Label(label=get_text("Boot Option")) + cls.page.insert_page(boot_manager_box, label, 6) + Button.next_button.set_label(get_text("Install")) + cls.page.next_page() + cls.page.show_all() + Button.next_button.set_sensitive(True) + elif page == 6: + installation_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + installation_box.show() + install_window = InstallWindow() + get_install = install_window.get_model() + installation_box.pack_start(get_install, True, True, 0) + label = Gtk.Label(label=get_text("Installation Progress")) + cls.page.insert_page(installation_box, label, 7) + cls.page.next_page() + installation_progressbar = InstallProgress() + progressbar = installation_progressbar.get_progressbar() + box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + box1.show() + label = Gtk.Label(label=get_text("Progress Bar")) + box1.pack_end(progressbar, False, False, 0) + cls.nbButton.insert_page(box1, label, 1) + cls.nbButton.next_page() + current_page_widget = cls.page.get_nth_page(cls.page.get_current_page()) + title_text = cls.page.get_tab_label_text(current_page_widget) + Window.set_title(title_text) + + @classmethod + def next_setup_page(cls) -> None: + page = cls.page.get_current_page() + if page == 0: + Button.next_button.show() + Button.next_button.set_sensitive(False) + Window.set_title(get_text("Network Setup")) + net_setup_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + net_setup_box.show() + model = cls.network_setup.get_model() + net_setup_box.pack_start(model, True, True, 0) + label = Gtk.Label(label=get_text("Network Setup")) + cls.page.insert_page(net_setup_box, label, 1) + cls.page.next_page() + cls.page.show_all() + if page == 1: + with open('/usr/home/ghostbsd/.xinitrc', 'w') as xinitrc: + xinitrc.writelines('gsettings set org.mate.SettingsDaemon.plugins.housekeeping active true &\n') + xinitrc.writelines('gsettings set org.mate.screensaver lock-enabled false &\n') + xinitrc.writelines('exec ck-launch-session mate-session\n') + Gtk.main_quit() + + @classmethod + def back_page(cls, _widget: Gtk.Button) -> None: + """Go back to the previous window.""" + current_page = cls.page.get_current_page() + if current_page == 1: + Button.hide_back() + elif current_page == 3: + Button.next_button.set_label(get_text("Next")) + cls.page.prev_page() + new_page = cls.page.get_current_page() + if current_page == 1 and new_page == 0: + # Reset partition configuration data when going back + InstallationData.destroy = {} + InstallationData.delete = [] + InstallationData.create = [] + InstallationData.new_partition = [] + InstallationData.scheme = "" + InstallationData.disk = "" + InstallationData.slice = "" + InstallationData.zfs_config_data = [] + InstallationData.ufs_config_data = [] + # Clean up temporary directory if it exists + DiskPartition.create_partition_database() + current_page_widget = cls.page.get_nth_page(cls.page.get_current_page()) + title_text = cls.page.get_tab_label_text(current_page_widget) + Window.set_title(title_text) + # Button.next_button.set_sensitive(True) diff --git a/install_station/keyboard.py b/install_station/keyboard.py new file mode 100644 index 0000000..e865b70 --- /dev/null +++ b/install_station/keyboard.py @@ -0,0 +1,313 @@ +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk, Gdk +import os +from install_station.system_calls import ( + keyboard_dictionary, + keyboard_models, + change_keyboard, + set_keyboard +) +from install_station.data import InstallationData, tmp, get_text + +# Ensure temp directory exists +if not os.path.exists(tmp): + os.makedirs(tmp) + +layout = f'{tmp}layout' +variant = f'{tmp}variant' +KBFile = f'{tmp}keyboard' + +kb_dictionary = keyboard_dictionary() +kbm_dictionary = keyboard_models() + +cssProvider = Gtk.CssProvider() +cssProvider.load_from_path('/usr/local/lib/install-station/ghostbsd-style.css') +screen = Gdk.Screen.get_default() +styleContext = Gtk.StyleContext() +styleContext.add_provider_for_screen( + screen, + cssProvider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION +) + + +class PlaceHolderEntry(Gtk.Entry): + """ + GTK Entry widget with placeholder text functionality. + + This class extends Gtk.Entry to provide placeholder text that disappears + when the widget gains focus and returns when focus is lost if empty. + """ + + def __init__(self, *args, **kwds) -> None: + Gtk.Entry.__init__(self, *args, **kwds) + self.placeholder = get_text('Type here to test your keyboard') + self.set_text(self.placeholder) + self._default = True + self.connect('focus-in-event', self._focus_in_event) + self.connect('focus-out-event', self._focus_out_event) + + def _focus_in_event(self, _widget: Gtk.Widget, _event) -> None: + if self._default: + self.set_text('') + + def _focus_out_event(self, _widget: Gtk.Widget, _event) -> None: + if Gtk.Entry.get_text(self) == '': + self.set_text(self.placeholder) + self._default = True + else: + self._default = False + + def get_text(self) -> str: + if self._default: + return '' + return Gtk.Entry.get_text(self) + + +class Keyboard: + """ + Utility class for the keyboard configuration screen following the utility class pattern. + + This class provides a GTK+ interface for keyboard layout and model selection including: + - Keyboard layout selection from available system layouts + - Keyboard model selection from available models + - Real-time keyboard testing with preview text entry + - Integration with InstallationData for persistent configuration + + The class follows a utility pattern with class methods and variables for state management, + designed to integrate with the Interface controller for navigation flow. + """ + # Class variables instead of instance variables + kb_layout: str | None = None + kb_variant: str | None = None + kb_model: str | None = None + vbox1: Gtk.Box | None = None + treeView: Gtk.TreeView | None = None + test_entry: PlaceHolderEntry | None = None + + @classmethod + def layout_columns(cls, treeview: Gtk.TreeView) -> None: + """ + Configure the keyboard layout treeview with appropriate columns. + + Creates a single column with a "Keyboard Layout" header for displaying + available keyboard layouts in the tree view. + + Args: + treeview: TreeView widget to configure with layout column + """ + cell = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(None, cell, text=0) + column_header = Gtk.Label(label=f'{get_text("Keyboard Layout")}') + column_header.set_use_markup(True) + column_header.show() + column.set_widget(column_header) + column.set_sort_column_id(0) + treeview.append_column(column) + + @classmethod + def variant_columns(cls, treeview: Gtk.TreeView) -> None: + """ + Configure the keyboard model treeview with appropriate columns. + + Creates a single column with a "Keyboard Models" header for displaying + available keyboard models in the tree view. + + Args: + treeview: TreeView widget to configure with model column + """ + cell = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(None, cell, text=0) + column_header = Gtk.Label(label=f'{get_text("Keyboard Models")}') + column_header.set_use_markup(True) + column_header.show() + column.set_widget(column_header) + column.set_sort_column_id(0) + treeview.append_column(column) + + @classmethod + def layout_selection(cls, tree_selection: Gtk.TreeSelection) -> None: + """ + Handle keyboard layout selection from the treeview. + + Extracts the selected layout from the tree view and updates both + class variables and InstallationData with the layout information. + Also applies the keyboard layout change immediately for testing. + + Args: + tree_selection: TreeSelection widget containing the user's layout choice + """ + model, treeiter = tree_selection.get_selected() + if treeiter is not None: + value = model[treeiter][0] + kb_lv = kb_dictionary[value] + cls.kb_layout = kb_lv['layout'] + cls.kb_variant = kb_lv['variant'] + # Save to InstallationData + InstallationData.keyboard_layout = value + InstallationData.keyboard_layout_code = cls.kb_layout + InstallationData.keyboard_variant = cls.kb_variant + change_keyboard(cls.kb_layout, cls.kb_variant) + print(f"Keyboard layout selected: {value} ({cls.kb_layout}/{cls.kb_variant})") + + @classmethod + def model_selection(cls, tree_selection: Gtk.TreeSelection) -> None: + """ + Handle keyboard model selection from the treeview. + + Extracts the selected model from the tree view and updates both + class variables and InstallationData with the model information. + Also applies the keyboard model change immediately for testing. + + Args: + tree_selection: TreeSelection widget containing the user's model choice + """ + model, treeiter = tree_selection.get_selected() + if treeiter is not None: + value = model[treeiter][0] + cls.kb_model = kbm_dictionary[value] + # Save to InstallationData + InstallationData.keyboard_model = value + InstallationData.keyboard_model_code = cls.kb_model + if cls.kb_layout and cls.kb_variant: + change_keyboard(cls.kb_layout, cls.kb_variant, cls.kb_model) + print(f"Keyboard model selected: {value} ({cls.kb_model})") + + @classmethod + def save_selection(cls) -> None: + """ + Save the current keyboard selection. + + This method saves keyboard configuration to both InstallationData + (for the installer) and temporary files (for compatibility). + """ + # Data is now saved in InstallationData automatically + # Keep file writing for compatibility + if cls.kb_layout and cls.kb_variant and cls.kb_model: + with open(KBFile, 'w') as file: + file.write(f"{cls.kb_layout}\\n") + file.write(f"{cls.kb_variant}\\n") + file.write(f"{cls.kb_model}\\n") + + @classmethod + def save_keyboard(cls) -> None: + """ + Apply the keyboard configuration to the system. + + This method applies the selected keyboard layout, variant, and model + to the current system for immediate use. + """ + if cls.kb_layout and cls.kb_variant and cls.kb_model: + set_keyboard(cls.kb_layout, cls.kb_variant, cls.kb_model) + + @classmethod + def initialize(cls) -> None: + """ + Initialize the keyboard configuration UI following the utility class pattern. + + Creates the main interface including: + - Keyboard layout selection tree view on the left side + - Keyboard model selection tree view on the right side + - Test entry field at the bottom for keyboard testing + - Grid-based layout with proper spacing and margins + + This method is called automatically by get_model() when the interface is first accessed. + """ + cls.vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.vbox1.show() + + main_grid = Gtk.Grid() + cls.vbox1.pack_start(main_grid, True, True, 0) + + # Create two scrolled windows side by side for layout and model selection + # Left side - Keyboard layouts + sw_layouts = Gtk.ScrolledWindow() + sw_layouts.set_shadow_type(Gtk.ShadowType.ETCHED_IN) + sw_layouts.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + + layout_store = Gtk.TreeStore(str) + layout_store.append(None, [get_text('English (US)')]) + layout_store.append(None, [get_text('English (Canada)')]) + layout_store.append(None, [get_text('French (Canada)')]) + for line in sorted(kb_dictionary): + layout_store.append(None, [line.rstrip()]) + + cls.treeView = Gtk.TreeView() + cls.treeView.set_model(layout_store) + cls.treeView.set_rules_hint(True) + cls.layout_columns(cls.treeView) + layout_selection = cls.treeView.get_selection() + layout_selection.set_mode(Gtk.SelectionMode.SINGLE) + layout_selection.connect("changed", cls.layout_selection) + sw_layouts.add(cls.treeView) + sw_layouts.show() + + # Right side - Keyboard models + sw_models = Gtk.ScrolledWindow() + sw_models.set_shadow_type(Gtk.ShadowType.ETCHED_IN) + sw_models.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + + model_store = Gtk.TreeStore(str) + for line in sorted(kbm_dictionary): + model_store.append(None, [line.rstrip()]) + + model_treeview = Gtk.TreeView() + model_treeview.set_model(model_store) + model_treeview.set_rules_hint(True) + cls.variant_columns(model_treeview) + model_selection = model_treeview.get_selection() + model_selection.set_mode(Gtk.SelectionMode.SINGLE) + model_selection.connect("changed", cls.model_selection) + sw_models.add(model_treeview) + sw_models.show() + + # Bottom - Test entry + cls.test_entry = PlaceHolderEntry() + + # Layout everything in grid + main_grid.set_row_spacing(5) + main_grid.set_column_spacing(10) + main_grid.set_column_homogeneous(True) + main_grid.set_row_homogeneous(True) + main_grid.set_margin_left(10) + main_grid.set_margin_right(10) + main_grid.set_margin_top(10) + main_grid.set_margin_bottom(10) + + main_grid.attach(sw_layouts, 0, 0, 1, 8) + main_grid.attach(sw_models, 1, 0, 1, 8) + main_grid.attach(cls.test_entry, 0, 9, 2, 1) + main_grid.show() + # Set default selection + cls.treeView.set_cursor(0) + + @classmethod + def get_model(cls) -> Gtk.Box: + """ + Return the GTK widget model for the keyboard configuration interface. + + Returns the main container widget that was created during initialization. + + Returns: + Gtk.Box: The main container widget for the keyboard configuration interface + """ + if cls.vbox1 is None: + cls.initialize() + return cls.vbox1 + + @classmethod + def get_keyboard_info(cls) -> dict[str, str | None]: + """ + Get the current keyboard configuration information. + + Returns: + dict: Dictionary containing keyboard layout, variant, and model information + """ + return { + 'layout': InstallationData.keyboard_layout or cls.kb_layout, + 'layout_code': InstallationData.keyboard_layout_code or cls.kb_layout, + 'variant': InstallationData.keyboard_variant or cls.kb_variant, + 'model': InstallationData.keyboard_model or cls.kb_model, + 'model_code': InstallationData.keyboard_model_code or cls.kb_model + } diff --git a/install_station/language.py b/install_station/language.py new file mode 100644 index 0000000..c834b6a --- /dev/null +++ b/install_station/language.py @@ -0,0 +1,262 @@ +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk, Gdk +import os +from install_station.system_calls import ( + language_dictionary, + localize_system +) +from install_station.data import InstallationData, tmp, gif_logo, get_text +from install_station.window import Window + +# Ensure temp directory exists +if not os.path.exists(tmp): + os.makedirs(tmp) + +lang_dictionary = language_dictionary() + +cssProvider = Gtk.CssProvider() +cssProvider.load_from_path('/usr/local/lib/install-station/ghostbsd-style.css') +screen = Gdk.Screen.get_default() +styleContext = Gtk.StyleContext() +styleContext.add_provider_for_screen( + screen, + cssProvider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION +) + + +class Language: + """ + Utility class for the language selection screen following the utility class pattern. + + This class provides a GTK+ interface for language selection including: + - Language selection from available system languages + - Visual elements with welcome message and logo + - Integration with InstallationData for persistent configuration + - Environment variable setting for immediate translation updates + + The class follows a utility pattern with class methods and variables for state management, + designed to integrate with the Interface controller for navigation flow. + """ + # Class variables instead of instance variables + vbox1: Gtk.Box | None = None + language: str | None = None + treeview: Gtk.TreeView | None = None + welcome_text: Gtk.Label | None = None + language_column_header: Gtk.Label | None = None + + @classmethod + def language_selection(cls, tree_selection: Gtk.TreeSelection) -> None: + """ + Handle language selection from the treeview. + + Extracts the selected language from the tree view and updates both + class variables and InstallationData with the language name and code. + Also sets environment variables globally so all modules pick up the language. + + Args: + tree_selection: TreeSelection widget containing the user's language choice + """ + model, treeiter = tree_selection.get_selected() + if treeiter is not None: + value = model[treeiter][0] + language_code = lang_dictionary[value] + cls.language = language_code + InstallationData.language = value + InstallationData.language_code = language_code + print(f"Language selected: {value} ({language_code})") + + # Set environment variables globally so all modules pick up the language + import os + os.environ['LANGUAGE'] = language_code + os.environ['LC_ALL'] = f'{language_code}.UTF-8' + os.environ['LANG'] = f'{language_code}.UTF-8' + + # Update the UI text with new translations + cls.update_ui_text() + + @classmethod + def update_ui_text(cls) -> None: + """ + Update all UI text elements with new translations after language change. + """ + from install_station.interface_controller import Button + + # Update navigation buttons + Button.update_button_labels() + + # Update the welcome text + if hasattr(cls, 'welcome_text') and cls.welcome_text: + cls.welcome_text.set_text( + get_text( + "Please select your language:" + ) + ) + + # Update the language column header + if hasattr(cls, 'language_column_header') and cls.language_column_header: + cls.language_column_header.set_text(get_text('Language')) + + Window.set_title(get_text("Welcome to GhostBSD")) + + @classmethod + def setup_language_columns(cls, treeview: Gtk.TreeView) -> None: + """ + Configure the language selection treeview with appropriate columns. + + Creates a single column with a "Language" header for displaying + available languages in the tree view. + + Args: + treeview: TreeView widget to configure with language column + """ + cell = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(None, cell, text=0) + column_header = Gtk.Label(label=get_text('Language')) + column_header.set_use_markup(True) + column_header.show() + column.set_widget(column_header) + # Store reference for updating + cls.language_column_header = column_header + column.set_sort_column_id(0) + treeview.append_column(column) + + @classmethod + def save_selection(cls) -> None: + """ + Save the current language selection. + + This method is maintained for compatibility but language selection + is now automatically saved to InstallationData when chosen. + """ + # Language is now saved in InstallationData automatically + pass + + @classmethod + def save_language(cls) -> None: + """ + Apply the language configuration to the system. + + This method applies the selected language to the system for + permanent configuration during installation. + """ + language_code = InstallationData.language_code or cls.language + if language_code: + localize_system(language_code) + + @classmethod + def initialize(cls) -> None: + """ + Initialize the language selection UI following the utility class pattern. + + Creates the main interface including: + - Language selection tree view on the left side + - Welcome message and logo on the right side + - Grid-based layout with proper spacing and margins + + This method is called automatically by get_model() when the interface is first accessed. + """ + cls.language = None + + # Main container + cls.vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.vbox1.show() + + main_grid = Gtk.Grid() + cls.vbox1.pack_start(main_grid, True, True, 0) + + # Left side - Language selection + sw = Gtk.ScrolledWindow() + sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN) + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + + store = Gtk.TreeStore(str) + for line in lang_dictionary: + store.append(None, [line]) + + cls.treeview = Gtk.TreeView() + cls.treeview.set_model(store) + cls.treeview.set_rules_hint(True) + cls.treeview.set_headers_visible(False) + cls.setup_language_columns(cls.treeview) + tree_selection = cls.treeview.get_selection() + tree_selection.set_mode(Gtk.SelectionMode.SINGLE) + tree_selection.connect("changed", cls.language_selection) + sw.add(cls.treeview) + sw.show() + + # Right side - Welcome content + right_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=10) + right_box.set_border_width(20) + right_box.show() + + # Welcome text + cls.welcome_text = Gtk.Label( + label=get_text( + "Please select your language:" + ) + ) + cls.welcome_text.set_use_markup(True) + cls.welcome_text.set_line_wrap(True) + cls.welcome_text.set_justify(Gtk.Justification.CENTER) + cls.welcome_text.show() + + # Logo + image = Gtk.Image() + image.set_from_file(gif_logo) + image.show() + + right_box.pack_start(cls.welcome_text, False, False, 10) + right_box.pack_start(sw, True, True, 10) + + # Layout in grid + main_grid.set_row_spacing(10) + main_grid.set_column_spacing(20) + main_grid.set_column_homogeneous(True) + main_grid.set_row_homogeneous(True) + main_grid.set_margin_left(10) + main_grid.set_margin_right(10) + main_grid.set_margin_top(10) + main_grid.set_margin_bottom(10) + + main_grid.attach(image, 0, 0, 1, 1) + main_grid.attach(right_box, 1, 0, 1, 1) + main_grid.show() + + @classmethod + def get_model(cls) -> Gtk.Box: + """ + Return the GTK widget model for the language selection interface. + + Returns the main container widget that was created during initialization. + + Returns: + Gtk.Box: The main container widget for the language selection interface + """ + if cls.vbox1 is None: + cls.initialize() + return cls.vbox1 + + @classmethod + def get_language(cls) -> str | None: + """ + Get the selected language code. + + Returns: + str: The selected language code + """ + return InstallationData.language_code or cls.language + + @classmethod + def get_language_info(cls) -> dict[str, str]: + """ + Get the current language configuration information. + + Returns: + dict: Dictionary containing language name and code information + """ + return { + 'language': InstallationData.language or '', + 'language_code': InstallationData.language_code or cls.language or '' + } diff --git a/install_station/network_setup.py b/install_station/network_setup.py new file mode 100644 index 0000000..ded8d84 --- /dev/null +++ b/install_station/network_setup.py @@ -0,0 +1,470 @@ +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk, Gdk, GLib, GdkPixbuf +import re +import _thread +from time import sleep +from NetworkMgr.net_api import ( + networkdictionary, + connectToSsid, + delete_ssid_wpa_supplicant_config, + nic_status +) +from install_station.data import get_text +from install_station.interface_controller import Button + +logo = "/usr/local/lib/install-station/logo.png" +cssProvider = Gtk.CssProvider() +cssProvider.load_from_path('/usr/local/lib/install-station/ghostbsd-style.css') +screen = Gdk.Screen.get_default() +styleContext = Gtk.StyleContext() +styleContext.add_provider_for_screen( + screen, + cssProvider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION +) + + +class NetworkSetup: + """ + Utility class for network setup following the utility class pattern. + + This class provides a GTK+ interface for network configuration including: + - Wired network detection and status + - WiFi network detection and connection + - Network authentication dialogs + - Integration with Button class for navigation + + The class follows a utility pattern with class methods and variables for state management, + designed to integrate with the Interface controller for navigation flow. + """ + # Class variables instead of instance variables + vbox1: Gtk.Box | None = None + network_info: dict | None = None + wire_connection_label: Gtk.Label | None = None + wire_connection_image: Gtk.Image | None = None + wifi_connection_label: Gtk.Label | None = None + wifi_connection_image: Gtk.Image | None = None + connection_box: Gtk.Box | None = None + store: Gtk.ListStore | None = None + window: Gtk.Window | None = None + password: Gtk.Entry | None = None + + @classmethod + def get_model(cls) -> Gtk.Box: + """ + Return the GTK widget model for the network setup interface. + + Returns the main container widget that was created during initialization. + + Returns: + Gtk.Box: The main container widget for the network setup interface + """ + if cls.vbox1 is None: + cls.initialize() + return cls.vbox1 + + @staticmethod + def wifi_stat(bar: int) -> str: + """ + Get WiFi signal strength icon name based on signal bar percentage. + + Args: + bar (int): Signal strength percentage + + Returns: + str: Icon name for the signal strength + """ + if bar > 75: + return 'nm-signal-100' + elif bar > 50: + return 'nm-signal-75' + elif bar > 25: + return 'nm-signal-50' + elif bar > 5: + return 'nm-signal-25' + else: + return 'nm-signal-00' + + @classmethod + def update_network_detection(cls) -> None: + """ + Update network detection status and UI elements. + + Checks both wired and wireless network connections and updates + the UI with current status and enables/disables next button. + """ + cards = cls.network_info['cards'] + card_list = list(cards.keys()) + r = re.compile("wlan") + wlan_list = list(filter(r.match, card_list)) + wire_list = list(set(card_list).difference(wlan_list)) + + # Update wired connection status + if wire_list: + for card in wire_list: + if cards[card]['state']['connection'] == 'Connected': + wire_text = get_text('Network card connected to the internet') + cls.wire_connection_image.set_from_stock(Gtk.STOCK_YES, 5) + print('Connected True') + Button.next_button.set_sensitive(True) + break + else: + wire_text = get_text('Network card not connected to the internet') + cls.wire_connection_image.set_from_stock(Gtk.STOCK_NO, 5) + else: + wire_text = get_text('No network card detected') + cls.wire_connection_image.set_from_stock(Gtk.STOCK_NO, 5) + + cls.wire_connection_label.set_label(wire_text) + + # Update WiFi connection status + if wlan_list: + for wlan_card in wlan_list: + if cards[wlan_card]['state']['connection'] == 'Connected': + wifi_text = get_text('WiFi card detected and connected to an access point') + cls.wifi_connection_image.set_from_stock(Gtk.STOCK_YES, 5) + break + else: + wifi_text = get_text('WiFi card detected but not connected to an access point') + cls.wifi_connection_image.set_from_stock(Gtk.STOCK_NO, 5) + else: + wifi_text = get_text("WiFi card not detected or not supported") + cls.wifi_connection_image.set_from_stock(Gtk.STOCK_NO, 5) + + cls.wifi_connection_label.set_label(wifi_text) + + @classmethod + def update_ui_text(cls) -> None: + """ + Update all UI text elements with new translations after language change. + """ + # Update button labels + Button.update_button_labels() + + # Update network status if elements exist + if cls.network_info: + cls.update_network_detection() + + @classmethod + def initialize(cls) -> None: + """ + Initialize the network setup UI following the utility class pattern. + + Creates the main interface including: + - Network status indicators for wired and wireless + - WiFi access point list if available + - Grid-based layout with proper spacing and margins + + This method is called automatically by get_model() when the interface is first accessed. + """ + cls.network_info = networkdictionary() + print(cls.network_info) + + cls.vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.vbox1.show() + + cards = cls.network_info['cards'] + card_list = list(cards.keys()) + r = re.compile("wlan") + wlan_list = list(filter(r.match, card_list)) + wire_list = list(set(card_list).difference(wlan_list)) + + cls.wire_connection_label = Gtk.Label() + cls.wire_connection_label.set_xalign(0.01) + cls.wire_connection_image = Gtk.Image() + cls.wifi_connection_label = Gtk.Label() + cls.wifi_connection_label.set_xalign(0.01) + cls.wifi_connection_image = Gtk.Image() + + # Check wired connection status + if wire_list: + for card in wire_list: + if cards[card]['state']['connection'] == 'Connected': + wire_text = get_text('Network card connected to the internet') + cls.wire_connection_image.set_from_stock(Gtk.STOCK_YES, 5) + print('Connected True') + Button.next_button.set_sensitive(True) + break + else: + wire_text = get_text('Network card not connected to the internet') + cls.wire_connection_image.set_from_stock(Gtk.STOCK_NO, 5) + else: + wire_text = get_text('No network card detected') + cls.wire_connection_image.set_from_stock(Gtk.STOCK_NO, 5) + + cls.wire_connection_label.set_label(wire_text) + + # Check WiFi status and setup WiFi list if available + wlan_card = "" + if wlan_list: + for wlan_card in wlan_list: + if cards[wlan_card]['state']['connection'] == 'Connected': + wifi_text = get_text('WiFi card detected and connected to an access point') + cls.wifi_connection_image.set_from_stock(Gtk.STOCK_YES, 5) + break + else: + wifi_text = get_text('WiFi card detected but not connected to an access point') + cls.wifi_connection_image.set_from_stock(Gtk.STOCK_NO, 5) + else: + wifi_text = get_text('WiFi card not detected or not supported') + cls.wifi_connection_image.set_from_stock(Gtk.STOCK_NO, 5) + + cls.wifi_connection_label.set_label(wifi_text) + + cls.connection_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=True, spacing=20) + if wlan_card: + # Setup WiFi access point list + sw = Gtk.ScrolledWindow() + sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN) + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + cls.store = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str) + for ssid in cls.network_info['cards'][wlan_card]['info']: + ssid_info = cls.network_info['cards'][wlan_card]['info'][ssid] + bar = ssid_info[4] + stat = NetworkSetup.wifi_stat(bar) + pixbuf = Gtk.IconTheme.get_default().load_icon(stat, 32, 0) + cls.store.append([pixbuf, ssid, f'{ssid_info}']) + treeview = Gtk.TreeView() + treeview.set_model(cls.store) + treeview.set_rules_hint(True) + pixbuf_cell = Gtk.CellRendererPixbuf() + pixbuf_column = Gtk.TreeViewColumn('Stat', pixbuf_cell) + pixbuf_column.add_attribute(pixbuf_cell, "pixbuf", 0) + pixbuf_column.set_resizable(True) + treeview.append_column(pixbuf_column) + cell = Gtk.CellRendererText() + column = Gtk.TreeViewColumn('SSID', cell, text=1) + column.set_sort_column_id(1) + treeview.append_column(column) + tree_selection = treeview.get_selection() + tree_selection.set_mode(Gtk.SelectionMode.SINGLE) + tree_selection.connect("changed", cls.wifi_setup, wlan_card) + sw.add(treeview) + cls.connection_box.pack_start(sw, True, True, 50) + + # Layout the interface + main_grid = Gtk.Grid() + main_grid.set_row_spacing(10) + main_grid.set_column_spacing(10) + main_grid.set_column_homogeneous(True) + main_grid.set_row_homogeneous(True) + cls.vbox1.pack_start(main_grid, True, True, 10) + main_grid.attach(cls.wire_connection_image, 2, 1, 1, 1) + main_grid.attach(cls.wire_connection_label, 3, 1, 8, 1) + main_grid.attach(cls.wifi_connection_image, 2, 2, 1, 1) + main_grid.attach(cls.wifi_connection_label, 3, 2, 8, 1) + main_grid.attach(cls.connection_box, 1, 4, 10, 5) + + @classmethod + def wifi_setup(cls, tree_selection: Gtk.TreeSelection, wifi_card: str) -> None: + """ + Handle WiFi access point selection and connection setup. + + Args: + tree_selection: TreeSelection widget containing the selected access point + wifi_card: WiFi card interface name + """ + model, treeiter = tree_selection.get_selected() + if treeiter is not None: + ssid = model[treeiter][1] + ssid_info = cls.network_info['cards'][wifi_card]['info'][ssid] + caps = ssid_info[6] + print(ssid) + print(ssid_info) + if caps == 'E' or caps == 'ES': + if f'"{ssid}"' in open("/etc/wpa_supplicant.conf").read(): + cls.try_to_connect_to_ssid(ssid, ssid_info, wifi_card) + else: + NetworkSetup.open_wpa_supplicant(ssid) + cls.try_to_connect_to_ssid(ssid, ssid_info, wifi_card) + else: + if f'"{ssid}"' in open('/etc/wpa_supplicant.conf').read(): + cls.try_to_connect_to_ssid(ssid, ssid_info, wifi_card) + else: + cls.authentication(ssid_info, wifi_card, False) + + @classmethod + def add_to_wpa_supplicant(cls, _widget: Gtk.Button, ssid_info: list, card: str) -> None: + """ + Add WiFi credentials to wpa_supplicant configuration and connect. + + Args: + _widget: Button widget that triggered the action (unused) + ssid_info: WiFi network information + card: WiFi card interface name + """ + pwd = cls.password.get_text() + NetworkSetup.setup_wpa_supplicant(ssid_info[0], ssid_info, pwd) + _thread.start_new_thread( + cls.try_to_connect_to_ssid, + (ssid_info[0], ssid_info, card) + ) + cls.window.hide() + + @classmethod + def try_to_connect_to_ssid(cls, ssid: str, ssid_info: list, card: str) -> None: + """ + Attempt to connect to the specified WiFi network. + + Args: + ssid: WiFi network SSID + ssid_info: WiFi network information + card: WiFi card interface name + """ + if connectToSsid(ssid, card) is False: + delete_ssid_wpa_supplicant_config(ssid) + GLib.idle_add(cls.restart_authentication, ssid_info, card) + else: + for _ in list(range(30)): + if nic_status(card) == 'associated': + cls.network_info = networkdictionary() + print(cls.network_info) + cls.update_network_detection() + break + sleep(1) + else: + delete_ssid_wpa_supplicant_config(ssid) + GLib.idle_add(cls.restart_authentication, ssid_info, card) + return + + @classmethod + def restart_authentication(cls, ssid_info: list, card: str) -> None: + """ + Restart WiFi authentication after a failed connection attempt. + + Args: + ssid_info: WiFi network information + card: WiFi card interface name + """ + cls.authentication(ssid_info, card, True) + + @classmethod + def on_check(cls, widget: Gtk.CheckButton) -> None: + """ + Toggle password visibility in authentication dialog. + + Args: + widget: CheckButton widget for show/hide password + """ + if widget.get_active(): + cls.password.set_visibility(True) + else: + cls.password.set_visibility(False) + + @classmethod + def authentication(cls, ssid_info: list, card: str, failed: bool) -> str: + """ + Show WiFi authentication dialog. + + Args: + ssid_info: WiFi network information + card: WiFi card interface name + failed: Boolean indicating if this is a retry after failed authentication + """ + cls.window = Gtk.Window() + cls.window.set_title(get_text("Wi-Fi Network Authentication Required")) + cls.window.set_border_width(0) + cls.window.set_size_request(500, 200) + box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.window.add(box1) + box1.show() + box2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=10) + box2.set_border_width(10) + box1.pack_start(box2, True, True, 0) + box2.show() + + # Set dialog title based on authentication status + if failed: + title = get_text("{ssid} Wi-Fi Network Authentication failed").format(ssid=ssid_info[0]) + else: + title = get_text("Authentication required by {ssid} Wi-Fi Network").format(ssid=ssid_info[0]) + label = Gtk.Label(label=f"{title}") + label.set_use_markup(True) + pwd_label = Gtk.Label(label=get_text("Password:")) + cls.password = Gtk.Entry() + cls.password.set_visibility(False) + check = Gtk.CheckButton(label=get_text("Show password")) + check.connect("toggled", cls.on_check) + table = Gtk.Table(1, 2, True) + table.attach(label, 0, 5, 0, 1) + table.attach(pwd_label, 1, 2, 2, 3) + table.attach(cls.password, 2, 4, 2, 3) + table.attach(check, 2, 4, 3, 4) + box2.pack_start(table, False, False, 0) + box2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=10) + box2.set_border_width(5) + box1.pack_start(box2, False, True, 0) + box2.show() + + # Add authentication buttons + cancel = Gtk.Button(stock=Gtk.STOCK_CANCEL) + cancel.connect("clicked", cls.close) + connect = Gtk.Button(stock=Gtk.STOCK_CONNECT) + connect.connect("clicked", cls.add_to_wpa_supplicant, ssid_info, card) + table = Gtk.Table(1, 2, True) + table.set_col_spacings(10) + table.attach(connect, 4, 5, 0, 1) + table.attach(cancel, 3, 4, 0, 1) + box2.pack_end(table, True, True, 5) + cls.window.show_all() + return 'Done' + + @classmethod + def close(cls, _widget: Gtk.Button) -> None: + """ + Close the authentication dialog. + + Args: + _widget: Button widget that triggered the action (unused) + """ + cls.window.hide() + + @staticmethod + def setup_wpa_supplicant(ssid: str, ssid_info: list, pwd: str) -> None: + """ + Setup wpa_supplicant configuration for WiFi network. + + Args: + ssid: WiFi network SSID + ssid_info: WiFi network information + pwd: WiFi network password + """ + if 'RSN' in ssid_info[-1]: + ws = '\nnetwork={' + ws += f'\n ssid="{ssid}"' + ws += '\n key_mgmt=WPA-PSK' + ws += '\n proto=RSN' + ws += f'\n psk="{pwd}"\n' + ws += '}\n' + elif 'WPA' in ssid_info[-1]: + ws = '\nnetwork={' + ws += f'\n ssid="{ssid}"' + ws += '\n key_mgmt=WPA-PSK' + ws += '\n proto=WPA' + ws += f'\n psk="{pwd}"\n' + ws += '}\n' + else: + ws = '\nnetwork={' + ws += f'\n ssid="{ssid}"' + ws += '\n key_mgmt=NONE' + ws += '\n wep_tx_keyidx=0' + ws += f'\n wep_key0={pwd}\n' + ws += '}\n' + wsf = open("/etc/wpa_supplicant.conf", 'a') + wsf.writelines(ws) + wsf.close() + + @staticmethod + def open_wpa_supplicant(ssid: str) -> None: + """ + Add open network entry to wpa_supplicant configuration. + + Args: + ssid: WiFi network SSID + """ + ws = '\nnetwork={' + ws += f'\n ssid={ssid}' + ws += '\n key_mgmt=NONE\n}\n' + with open("/etc/wpa_supplicant.conf", 'a') as wsf: + wsf.writelines(ws) diff --git a/install_station/partition.py b/install_station/partition.py new file mode 100644 index 0000000..0ac9cc8 --- /dev/null +++ b/install_station/partition.py @@ -0,0 +1,1309 @@ +"""Disk partition management module for GhostBSD Install Station. + +Provides disk partitioning functionality including detection, creation, deletion +of partitions for GPT/MBR schemes with ZFS support and manages the partition database. +""" +import re +from time import sleep +from subprocess import Popen, PIPE, STDOUT, call +from install_station.data import query, zfs_datasets, InstallationData + +# Define required file paths + + +def get_disk_from_partition(part: str) -> str: + """Extract the disk name from a partition identifier. + + Args: + part (str): Partition identifier (e.g., 'ada0p1', 'ada0s1a') + + Returns: + str: Disk name (e.g., 'ada0') + """ + if set("p") & set(part): + return part.partition('p')[0] + else: + return part.partition('s')[0] + + +def slice_number(part: str) -> int: + """Extract the slice/partition number from a partition identifier. + + Args: + part (str): Partition identifier (e.g., 'ada0p1', 'ada0s1') + + Returns: + int: Slice/partition number + """ + if set("p") & set(part): + return int(part.partition('p')[2]) + else: + return int(part.partition('s')[2]) + + +def find_next_partition(partition_name: str, partition_list: list[str]) -> str: + """Find the next available partition name with sequential numbering. + + Args: + partition_name (str): Base partition name (e.g., 'freespace', 'ada0p') + partition_list (list): List of existing partition names + + Returns: + str: Next available partition name (e.g., 'freespace1', 'ada0p2') + """ + for num in range(1, 10000): + if f'{partition_name}{num}' not in partition_list: + return f'{partition_name}{num}' + + +def disk_list() -> list[str]: + """Get a list of available disk devices on the system. + + Queries the FreeBSD kernel for available disks and filters out + optical drives (CD/DVD devices). + + Returns: + list: Sorted list of disk device names (e.g., ['ada0', 'ada1']) + """ + disk_popen = Popen( + 'sysctl -n kern.disks', + shell=True, + stdin=PIPE, + stdout=PIPE, + universal_newlines=True, + close_fds=True + ) + disks = disk_popen.stdout.read() + cleaned_disk = re.sub(r'acd[0-9]*|cd[0-9]*|scd[0-9]*', '', disks) + return sorted(cleaned_disk.split()) + + +def device_model(disk: str) -> str: + """Get the model description of a disk device. + + Args: + disk (str): Disk device name (e.g., 'ada0') + + Returns: + str: Device model description + """ + device_popen = Popen( + f"diskinfo -v {disk} 2>/dev/null | grep 'Disk descr' | cut -d '#' -f1 | tr -d '\t'", + shell=True, + stdin=PIPE, + stdout=PIPE, + universal_newlines=True, + close_fds=True + ) + return device_popen.stdout.read().strip() + + +def disk_size(disk: str) -> str: + """Get the size of a disk device. + + Args: + disk (str): Disk device name (e.g., 'ada0') + + Returns: + str: Disk size information + """ + disk_size_output = Popen( + f"{query}/disk-info.sh {disk}", + shell=True, + stdin=PIPE, + stdout=PIPE, + universal_newlines=True, + stderr=STDOUT, + close_fds=True + ) + return disk_size_output.stdout.readlines()[0].rstrip() + + +def get_scheme(disk: str) -> str: + """Detect the partition scheme of a disk device. + + Args: + disk (str): Disk device name (e.g., 'ada0') + + Returns: + str: Partition scheme ('GPT', 'MBR', or empty if none) + """ + scheme_output = Popen( + f"{query}/detect-sheme.sh {disk}", + shell=True, + stdin=PIPE, + stdout=PIPE, + universal_newlines=True, + stderr=STDOUT, + close_fds=True + ) + return scheme_output.stdout.readlines()[0].rstrip() + + +class DiskPartition: + """Main class for disk partition detection and database management. + + This class provides methods to scan disk devices, detect existing partitions, + and maintain an in-memory database of partition information for both GPT and + MBR partition schemes. + + Attributes: + disk_database (dict): In-memory database of disk and partition information + query_partition (str): Path to disk partition query script + """ + disk_database: dict = {} + + query_partition = f'{query}/disk-part.sh' + + @classmethod + def mbr_partition_slice_db(cls, disk): + """Create database of MBR slices and their partitions. + + Args: + disk (str): Disk device name (e.g., 'ada0') + + Returns: + dict: Database of slices with their partition information + """ + partition_output = Popen( + f'{cls.query_partition} {disk}', + shell=True, + stdin=PIPE, + stdout=PIPE, + universal_newlines=True + ) + slice_db = {} + free_num = 1 + for line in partition_output.stdout: + info = line.strip().split() + slice_name = info[0] + if 'freespace' in line: + slice_name = f'freespace{free_num}' + free_num += 1 + part_db = cls.mbr_partition_db(info[0]) + part_list = [] if part_db is None else list(part_db.keys()) + partitions = { + 'name': slice_name, + 'size': info[1].partition('M')[0], + 'mount-point': '', + 'file-system': info[2], + 'stat': None, + 'partitions': part_db, + 'partition-list': part_list + } + slice_db[slice_name] = partitions + return slice_db + + @classmethod + def mbr_partition_db(cls, partition_slice): + """Create database of partitions within an MBR slice. + + Args: + partition_slice (str): Slice identifier (e.g., 'ada0s1') + + Returns: + dict or None: Database of partitions within the slice, or None for freespace + """ + if 'freespace' in partition_slice: + return None + else: + slice_output = Popen( + f'{query}/disk-label.sh {partition_slice}', + shell=True, + stdin=PIPE, + stdout=PIPE, + universal_newlines=True + ) + partition_db = {} + alph = ord('a') + free_num = 1 + for line in slice_output.stdout: + info = line.strip().split() + if 'freespace' in line: + partition_name = f'freespace{free_num}' + free_num += 1 + else: + letter = chr(alph) + partition_name = f'{partition_slice}{letter}' + alph += 1 + partitions = { + 'name': partition_name, + 'size': info[0].partition('M')[0], + 'mount-point': '', + 'file-system': info[2], + 'stat': None, + } + partition_db[partition_name] = partitions + if not partition_db: + return None + return partition_db + + @classmethod + def gpt_partition_db(cls, disk): + """Create database of GPT partitions on a disk. + + Args: + disk (str): Disk device name (e.g., 'ada0') + + Returns: + dict: Database of GPT partitions + """ + partition_output = Popen( + f'{cls.query_partition} {disk}', + shell=True, + stdin=PIPE, + stdout=PIPE, + universal_newlines=True + ) + partition_db = {} + free_num = 1 + for line in partition_output.stdout: + info = line.strip().split() + slice_name = info[0] + if 'freespace' in line: + slice_name = f'freespace{free_num}' + free_num += 1 + partitions = { + 'name': info[0], + 'size': info[1].partition('M')[0], + 'mount-point': '', + 'file-system': info[2], + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + partition_db[slice_name] = partitions + return partition_db + + @classmethod + def create_partition_database(cls): + """Scan all disks and create comprehensive partition database. + + This method queries all available disks, detects their partition schemes, + and builds a complete database of disk and partition information. + """ + # if os.path.exists(disk_db_file): + # os.remove(disk_db_file) + # drives_database = open(disk_db_file, 'wb') + disk_db = {} + for disk in disk_list(): + disk_info_db = {} + disk_info_db.setdefault('scheme', get_scheme(disk)) + if disk_info_db['scheme'] == "GPT": + part_db = cls.gpt_partition_db(disk) + elif disk_info_db['scheme'] == "MBR": + part_db = cls.mbr_partition_slice_db(disk) + else: + disk_info_db['scheme'] = None + part_db = {} + part_list = [] if part_db is None else list(part_db.keys()) + disk_info_db['size'] = disk_size(disk) + disk_info_db['device_model'] = device_model(disk) + disk_info_db['partitions'] = part_db + disk_info_db['partition-list'] = part_list + disk_info_db['stat'] = None + disk_db[disk] = disk_info_db + cls.disk_database = disk_db + + @classmethod + def get_disk_database(cls): + """Get the current disk database. + + Returns: + dict: Current disk and partition database + """ + return cls.disk_database.copy() + + @classmethod + def how_partition(cls, disk): + """Get the number of partitions on a disk. + + Args: + disk (str): Disk device name + + Returns: + int: Number of partitions on the disk + """ + return len(cls.disk_database[disk]['partitions']) + + @classmethod + def set_disk_scheme(cls, scheme, disk, size): + """Set or update the partitioning scheme for a disk. + + Args: + scheme (str or None): Partition scheme ('GPT' or 'MBR') + disk (str): Disk device name + size (str): Disk size + """ + if scheme is None: + cls.disk_database[disk]['scheme'] = 'GPT' + else: + cls.disk_database[disk]['scheme'] = scheme + # this need to data and not use pickle with open. + InstallationData.destroy[disk] = scheme + if not cls.disk_database[disk]['partitions']: + cls.disk_database[disk]['partitions'] = { + 'freespace1': { + 'name': 'freespace1', + 'size': size, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + } + cls.disk_database[disk]['partition-list'] = [ + 'freespace1' + ] + + +class DeletePartition: + """Class for handling partition deletion operations. + + This class provides methods to delete partitions from both GPT and MBR + partition schemes, handling the consolidation of free space and updating + the partition database accordingly. + """ + + def find_if_label(self, part): + """Check if a partition identifier represents a BSD label. + + Args: + part (str): Partition identifier + + Returns: + bool: True if the partition has a BSD label suffix (letter) + """ + last = part[-1] + if re.search('[a-z]', last): + return True + return False + + def delete_label(self, drive, label, partition, path): + """Delete a BSD label partition and consolidate free space. + + Args: + drive (str): Disk device name + label (str): Label partition to delete + partition (str): Parent slice containing the label + path (list): Path information for partition location + """ + disk_partitions = DiskPartition.disk_database[drive]['partitions'][partition] + partitions_info = disk_partitions['partitions'] + label_list = disk_partitions['partition-list'] + last_list_number = len(label_list) - 1 + store_list_number = path[2] + size_free = int(partitions_info[label]['size']) + + if last_list_number == store_list_number and len(label_list) > 1: + label_behind = label_list[store_list_number - 1] + if 'freespace' in label_behind: + size_free += int(partitions_info[label_behind]['size']) + label_list.remove(label) + disk_partitions['partitions'].pop(label, None) + disk_partitions['partitions'][label_behind] = { + 'name': label_behind, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_partitions['partition-list'] = label_list + else: + free_name = find_next_partition('freespace', label_list) + label_list[store_list_number] = free_name + disk_partitions['partitions'].pop(label, None) + disk_partitions['partitions'][free_name] = { + 'name': free_name, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_partitions['partition-list'] = label_list + elif store_list_number == 0 and len(label_list) > 1: + label_after = label_list[store_list_number + 1] + if 'freespace' in label_after: + size_free += int(partitions_info[label_after]['size']) + label_list.remove(label) + disk_partitions['partitions'].pop(label, None) + disk_partitions['partitions'][label_after] = { + 'name': label_after, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_partitions['partition-list'] = label_list + else: + free_name = find_next_partition('freespace', label_list) + label_list[store_list_number] = free_name + disk_partitions['partitions'].pop(label, None) + disk_partitions['partitions'][free_name] = { + 'name': free_name, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_partitions['partition-list'] = label_list + elif len(label_list) > 2: + label_behind = label_list[store_list_number - 1] + label_after = label_list[store_list_number + 1] + size_behind = int(partitions_info[label_behind]['size']) + size_after = int(partitions_info[label_after]['size']) + if ('freespace' in label_behind + and 'freespace' in label_after): + size_free += size_behind + size_after + label_list.remove(label) + label_list.remove(label_after) + disk_partitions['partitions'].pop(label, None) + disk_partitions['partitions'].pop(label_after, None) + disk_partitions['partitions'][label_behind] = { + 'name': label_behind, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_partitions['partition-list'] = label_list + elif 'freespace' in label_behind: + size_free += size_behind + label_list.remove(label) + disk_partitions['partitions'].pop(label, None) + disk_partitions['partitions'][label_behind] = { + 'name': label_behind, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_partitions['partition-list'] = label_list + elif 'freespace' in label_after: + size_free += size_after + label_list.remove(label) + disk_partitions['partitions'].pop(label, None) + disk_partitions['partitions'].pop(label_after, None) + disk_partitions['partitions'][label_after] = { + 'name': label_after, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_partitions['partition-list'] = label_list + else: + free_name = find_next_partition('freespace', label_list) + label_list[store_list_number] = free_name + disk_partitions['partitions'].pop(label, None) + disk_partitions['partitions'][free_name] = { + 'name': free_name, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_partitions['partition-list'] = label_list + else: + free_name = find_next_partition('freespace', label_list) + label_list[store_list_number] = free_name + disk_partitions['partitions'].pop(label, None) + disk_partitions['partitions'][free_name] = { + 'name': free_name, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_partitions['partition-list'] = label_list + + # Data is already updated in DiskPartition.disk_database - no need to save to file + remaining_partition = [] + for part in label_list: + partitions_info = disk_partitions['partitions'] + if part in partitions_info: + size = partitions_info[part]['size'] + mount_point = partitions_info[part]['mount-point'] + file_system = partitions_info[part]['file-system'] + stat = partitions_info[part]['stat'] + if stat == 'New': + remaining_partition.append(f'{file_system} {size} {mount_point}\n') + InstallationData.new_partition = remaining_partition + + def __init__(self, part, path): + """Initialize partition deletion operation. + + Args: + part (str): Partition identifier to delete + path (list): Path information for partition location + """ + drive = get_disk_from_partition(part) + if part == "freespace": + pass + elif self.find_if_label(part) is True: + spart = part[:-1] + self.delete_label(drive, part, spart, path) + else: + self.delete_slice(drive, part, path) + + def delete_slice(self, drive, partition, path): + """Delete a slice/partition and consolidate adjacent free space. + + Args: + drive (str): Disk device name + partition (str): Partition to delete + path (list): Path information for partition location + """ + disk_data = DiskPartition.disk_database + partitions_info = disk_data[drive]['partitions'] + partition_list = disk_data[drive]['partition-list'] + last_list_number = len(partition_list) - 1 + store_list_number = path[1] + size_free = int(partitions_info[partition]['size']) + if last_list_number == store_list_number and len(partition_list) > 1: + partition_behind = partition_list[store_list_number - 1] + if 'freespace' in partition_behind: + size_free += int(partitions_info[partition_behind]['size']) + partition_list.remove(partition) + disk_data[drive]['partitions'].pop(partition, None) + disk_data[drive]['partitions'][partition_behind] = { + 'name': partition_behind, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_data[drive]['partition-list'] = partition_list + else: + free_name = find_next_partition('freespace', partition_list) + partition_list[store_list_number] = free_name + disk_data[drive]['partitions'].pop(partition, None) + disk_data[drive]['partitions'][free_name] = { + 'name': free_name, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_data[drive]['partition-list'] = partition_list + elif store_list_number == 0 and len(partition_list) > 1: + partition_after = partition_list[store_list_number + 1] + if 'freespace' in partition_after: + size_free += int(partitions_info[partition_after]['size']) + partition_list.remove(partition) + disk_data[drive]['partitions'].pop(partition, None) + disk_data[drive]['partitions'][partition_after] = { + 'name': partition_after, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_data[drive]['partition-list'] = partition_list + else: + free_name = find_next_partition('freespace', partition_list) + partition_list[store_list_number] = free_name + disk_data[drive]['partitions'].pop(partition, None) + disk_data[drive]['partitions'][free_name] = { + 'name': free_name, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_data[drive]['partition-list'] = partition_list + elif len(partition_list) > 2: + partition_behind = partition_list[store_list_number - 1] + partition_after = partition_list[store_list_number + 1] + size_behind = int(partitions_info[partition_behind]['size']) + size_after = int(partitions_info[partition_after]['size']) + if ('freespace' in partition_behind + and 'freespace' in partition_after): + size_free += size_behind + size_after + partition_list.remove(partition) + partition_list.remove(partition_after) + disk_data[drive]['partitions'].pop(partition, None) + disk_data[drive]['partitions'][partition_behind] = { + 'name': partition_behind, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_data[drive]['partition-list'] = partition_list + elif 'freespace' in partition_behind: + size_free += size_behind + partition_list.remove(partition) + disk_data[drive]['partitions'].pop(partition, None) + disk_data[drive]['partitions'][partition_behind] = { + 'name': partition_behind, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_data[drive]['partition-list'] = partition_list + elif 'freespace' in partition_after: + size_free += size_after + partition_list.remove(partition) + disk_data[drive]['partitions'].pop(partition, None) + disk_data[drive]['partitions'][partition_after] = { + 'name': partition_after, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_data[drive]['partition-list'] = partition_list + else: + free_name = find_next_partition('freespace', partition_list) + partition_list[store_list_number] = free_name + disk_data[drive]['partitions'].pop(partition, None) + disk_data[drive]['partitions'][free_name] = { + 'name': free_name, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_data[drive]['partition-list'] = partition_list + else: + free_name = find_next_partition('freespace', partition_list) + partition_list[store_list_number] = free_name + disk_data[drive]['partitions'].pop(partition, None) + disk_data[drive]['partitions'][free_name] = { + 'name': free_name, + 'size': size_free, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + disk_data[drive]['partition-list'] = partition_list + + # if delete file exist check if slice is in the list + + if partition not in InstallationData.delete: + InstallationData.delete.append(partition) + + if "p" in partition and InstallationData.new_partition: + remaining_partition = [] + for part in partition_list: + partitions_info = disk_data[drive]['partitions'] + size = partitions_info[part]['size'] + mount_point = partitions_info[part]['mount-point'] + file_system = partitions_info[part]['file-system'] + stat = partitions_info[part]['stat'] + if stat == 'New': + remaining_partition.append(f'{file_system} {size} {mount_point}\n') + InstallationData.new_partition = remaining_partition + + +class AutoFreeSpace: + """Class for automatic partition creation in free space. + + This class handles automatic partitioning of free space on disks, + creating appropriate partition layouts for both MBR and GPT schemes + with support for different filesystems. + """ + + def create_mbr_partiton(self, drive, size, path, fs): + """Create MBR partitions automatically in free space. + + Creates a BSD slice with root and swap partitions. + + Args: + drive (str): Disk device name + size (str): Available size in MB + path (list): Path information for partition location + fs (str): Filesystem type ('ZFS' or 'UFS') + """ + # remove 1M to size to avoid no space left + main_size = int(size) - 1 + InstallationData.disk = drive + + InstallationData.scheme = 'partscheme=MBR' + + disk_db = DiskPartition.disk_database + slice_list = disk_db[drive]['partition-list'] + store_list_number = path[1] + main_slice = find_next_partition(f'{drive}s', slice_list) + slice_list[store_list_number] = main_slice + disk_db[drive]['partitions'][main_slice] = { + 'name': main_slice, + 'size': size, + 'mount-point': 'none', + 'file-system': 'BSD', + 'stat': 'New', + 'partitions': {}, + 'partition-list': [] + } + disk_db[drive]['partition-list'] = slice_list + + InstallationData.slice = main_slice.replace(drive, "") + + root_size = int(main_size) + swap_size = 2048 + root_size -= swap_size + + part_list = disk_db[drive]['partitions'][main_slice]['partition-list'] + + if fs == "ZFS": + layout = zfs_datasets + else: + layout = '/' + + root_part = f'{main_slice}a' + part_list.append(root_part) + disk_db[drive]['partitions'][main_slice]['partitions'][root_part] = { + 'name': root_part, + 'size': root_size, + 'mount-point': layout, + 'file-system': fs, + 'stat': 'New', + 'partitions': {}, + 'partition-list': [] + } + + swap_part = f'{main_slice}b' + part_list.append(swap_part) + disk_db[drive]['partitions'][main_slice]['partitions'][swap_part] = { + 'name': swap_part, + 'size': swap_size, + 'mount-point': 'none', + 'file-system': 'SWAP', + 'stat': 'New', + 'partitions': {}, + 'partition-list': [] + } + + disk_db[drive]['partitions'][main_slice]['partition-list'] = part_list + + # Data is already updated in DiskPartition.disk_database - no need to save to file + + # Add new partitions to InstallationData + InstallationData.new_partition = [ + f'{fs} {root_size} {layout}\n', + f'SWAP {swap_size} none\n' + ] + + # Add to create list for partition creation operations + InstallationData.create.append([main_slice, main_size]) + + def __init__(self, path, size, fs, efi_exist, disk, scheme): + """Initialize automatic partition creation. + + Args: + path (list): Path information for partition location + size (str): Available size in MB + fs (str): Filesystem type ('ZFS' or 'UFS') + efi_exist (bool): Whether EFI partition already exists + disk (str): Disk device name + scheme (str): Partition scheme ('GPT' or 'MBR') + """ + self.bios_type = bios_or_uefi() + if scheme == "GPT": + self.create_gpt_partiton(disk, size, path, fs, efi_exist) + elif scheme == "MBR": + self.create_mbr_partiton(disk, size, path, fs) + + def create_gpt_partiton(self, drive, size, path, fs, efi_exist): + """Create GPT partitions automatically in free space. + + Creates boot (if needed), root, and swap partitions with appropriate + sizing for the target filesystem. + + Args: + drive (str): Disk device name + size (str): Available size in MB + path (list): Path information for partition location + fs (str): Filesystem type ('ZFS' or 'UFS') + efi_exist (bool): Whether EFI partition already exists + """ + # remove 1M to size to avoid no space left + main_size = int(size) - 1 + InstallationData.disk = drive + InstallationData.scheme = 'partscheme=GPT' + root_size = int(main_size) + swap_size = 2048 + root_size -= int(swap_size) + if self.bios_type == "UEFI" and efi_exist is False: + boot_size = 256 + else: + boot_size = 1 if self.bios_type == "BIOS" else 0 + boot_name = 'UEFI' if self.bios_type == "UEFI" else 'BOOT' + root_size -= boot_size + disk_data = DiskPartition.disk_database + partition_list = disk_data[drive]['partition-list'] + store_list_number = path[1] + if boot_size != 0: + boot_partition = find_next_partition(f'{drive}p', partition_list) + partition_list[store_list_number] = boot_partition + store_list_number += 1 + disk_data[drive]['partitions'][boot_partition] = { + 'name': boot_partition, + 'size': boot_size, + 'mount-point': 'none', + 'file-system': boot_name, + 'stat': 'New', + 'partitions': {}, + 'partition-list': [] + } + # Add boot partition to create list + InstallationData.create.append([boot_partition, boot_size]) + + if fs == "ZFS": + layout = zfs_datasets + else: + layout = '/' + + root_partition = find_next_partition(f'{drive}p', partition_list) + if store_list_number == path[1]: + partition_list[store_list_number] = root_partition + else: + partition_list.insert(store_list_number, root_partition) + store_list_number += 1 + disk_data[drive]['partitions'][root_partition] = { + 'name': root_partition, + 'size': root_size, + 'mount-point': layout, + 'file-system': fs, + 'stat': 'New', + 'partitions': {}, + 'partition-list': [] + } + + InstallationData.slice = root_partition.replace(drive, '') + + swap_partition = find_next_partition(f'{drive}p', partition_list) + partition_list.insert(store_list_number, swap_partition) + disk_data[drive]['partitions'][swap_partition] = { + 'name': swap_partition, + 'size': swap_size, + 'mount-point': 'none', + 'file-system': 'SWAP', + 'stat': 'New', + 'partitions': {}, + 'partition-list': [] + } + + disk_data[drive]['partition-list'] = partition_list + + # Data is already updated in DiskPartition.disk_database - no need to save to file + + # Add new partitions to InstallationData + new_partitions = [] + if self.bios_type == "UEFI" and efi_exist is False: + new_partitions.append(f'UEFI {boot_size} none\n') + elif self.bios_type == "BIOS": + new_partitions.append(f'BOOT {boot_size} none\n') + new_partitions.extend([ + f'{fs} {root_size} {layout}\n', + f'SWAP {swap_size} none\n' + ]) + InstallationData.new_partition = new_partitions + + +class CreateLabel: + """Class for creating BSD label partitions within MBR slices. + + This class handles the creation of individual partitions (labels) + within BSD slices in MBR partition schemes. + """ + def __init__(self, path, drive, main_slice, size_left, create_size, + mountpoint, fs): + """Create a new BSD label partition within a slice. + + Args: + path (list): Path information for partition location + drive (str): Disk device name + main_slice (str): Parent slice identifier + size_left (int): Remaining size after partition creation + create_size (int): Size of new partition in MB + mountpoint (str): Mount point for the partition + fs (str): Filesystem type + """ + InstallationData.disk = drive + InstallationData.scheme = 'partscheme=MBR' + InstallationData.slice = main_slice.replace(drive, "") + disk_db = DiskPartition.disk_database + store_list_number = path[2] + part_list = disk_db[drive]['partitions'][main_slice]['partition-list'] + alpha_num = ord('a') + alpha_num += store_list_number + letter = chr(alpha_num) + if fs == "ZFS": + mountpoint = zfs_datasets + + partition = f'{main_slice}{letter}' + part_list[store_list_number] = partition + disk_db[drive]['partitions'][main_slice]['partitions'][partition] = { + 'name': partition, + 'size': create_size, + 'mount-point': mountpoint, + 'file-system': fs, + 'stat': 'New', + 'partitions': {}, + 'partition-list': [] + } + if size_left != 0: + free = find_next_partition('freespace', part_list) + part_list.append(free) + disk_db[drive]['partitions'][main_slice]['partitions'][free] = { + 'name': free, + 'size': size_left, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + + disk_db[drive]['partitions'][main_slice]['partition-list'] = part_list + + # Data is already updated in DiskPartition.disk_database - no need to save to file + + # Update InstallationData with new partition information + new_partitions = [] + for partition_name in part_list: + drive_part = disk_db[drive]['partitions'] + part_info = drive_part[main_slice]['partitions'][partition_name] + if part_info['stat'] == 'New': + partition_text = f'{part_info["file-system"]} ' \ + f'{part_info["size"]} ' \ + f'{part_info["mount-point"]}\n' + new_partitions.append(partition_text) + + InstallationData.new_partition = new_partitions + + +# class modifyLabel(): + +# def __init_get_text(self, path, size_left, create_size, mount_point, fs, +# data, disk): +# if not os.path.exists(disk_file): +# file_disk = open(disk_file, 'w') +# file_disk.writelines('%s\n' % disk) +# file_disk.close() +# sl = path[1] + 1 +# lv = path[2] +# write_scheme = open(scheme_file, 'w') +# write_scheme.writelines('partscheme=MBR') +# write_scheme.close() +# write_slice = open(slice_file, 'w') +# write_slice.writelines('s%s\n' % sl) +# write_slice.close() +# alph = ord('a') +# alph += lv +# letter = chr(alph) +# llist = [] +# mllist = label_query(disk + 's%s' % sl) +# plf = open(partitiondb + disk + 's%s' % sl, 'wb') +# if size_left == 0: +# create_size -= 1 +# llist.extend(([disk + 's%s' % sl + letter, create_size, mount_point, +# fs])) +# mllist[lv] = llist +# llist = [] +# if size_left > 0: +# llist.extend((['freespace', size_left, '', ''])) +# mllist.append(llist) +# pickle.dump(mllist, plf) +# plf.close() +# llist = open(partitiondb + disk + 's%s' % sl, 'rb') +# sabeltlist = pickle.load(llist) +# write_partition = open(partition_label_file, 'w') +# for partlist in sabeltlist: +# if partlist[2] != '': +# write_partition.writelines('%s %s %s\n' % (partlist[3], +# partlist[1], partlist[2])) +# write_partition.close() + + +class CreateSlice: + """Class for creating MBR slices (BSD partitions). + + This class handles the creation of BSD slices within MBR partition + schemes, which can then contain multiple BSD label partitions. + """ + + def __init__(self, create_size, size_left, path, drive): + """Create a new MBR slice. + + Args: + create_size (int): Size of new slice in MB + size_left (int): Remaining size after slice creation + path (list): Path information for slice location + drive (str): Disk device name + """ + InstallationData.disk = drive + InstallationData.scheme = 'partscheme=MBR' + + disk_db = DiskPartition.disk_database + store_list_number = path[1] + partition_list = disk_db[drive]['partition-list'] + + partition = find_next_partition(f'{drive}s', partition_list) + + partition_list[store_list_number] = partition + # Store slice partition + disk_db[drive]['partitions'][partition] = { + 'name': partition, + 'size': create_size, + 'mount-point': 'none', + 'file-system': 'BSD', + 'stat': 'New', + 'partitions': {}, + 'partition-list': ['freespace1'] + } + # Store freespace for partition partition + disk_db[drive]['partitions'][partition]['partitions']['freespace1'] = { + 'name': 'freespace1', + 'size': create_size, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + # Store freespace if some left + if size_left != 0: + free_name = find_next_partition('freespace', partition_list) + partition_list.append(free_name) + disk_db[drive]['partitions'][free_name] = { + 'name': free_name, + 'size': size_left, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + + disk_db[drive]['partition-list'] = partition_list + + # Data is already updated in DiskPartition.disk_database - no need to save to file + + InstallationData.slice = partition.replace(drive, '') + + # Add to create list for partition creation operations + InstallationData.create.append([partition, create_size]) + + +class CreatePartition(): + """Class for creating GPT partitions. + + This class handles the creation of individual partitions within + GPT partition schemes, supporting various filesystem types and + mount points. + """ + def __init__(self, path, drive, size_left, create_size, mount_point, fs): + """Create a new GPT partition. + + Args: + path (list): Path information for partition location + drive (str): Disk device name + size_left (int): Remaining size after partition creation + create_size (int): Size of new partition in MB + mount_point (str): Mount point for the partition + fs (str): Filesystem type + """ + InstallationData.disk = drive + + InstallationData.scheme = 'partscheme=GPT' + + if fs == "ZFS": + mount_point = zfs_datasets + + disk_data = DiskPartition.disk_database + store_list_number = path[1] + partition_list = disk_data[drive]['partition-list'] + + partition = find_next_partition(f'{drive}p', partition_list) + + partition_list[store_list_number] = partition + # Store slice partition + disk_data[drive]['partitions'][partition] = { + 'name': partition, + 'size': create_size, + 'mount-point': mount_point, + 'file-system': fs, + 'stat': 'New', + 'partitions': {}, + 'partition-list': [] + } + # Store freespace if some left + if size_left != 0: + free_name = find_next_partition('freespace', partition_list) + partition_list.append(free_name) + disk_data[drive]['partitions'][free_name] = { + 'name': free_name, + 'size': size_left, + 'mount-point': '', + 'file-system': 'none', + 'stat': None, + 'partitions': {}, + 'partition-list': [] + } + + disk_data[drive]['partition-list'] = partition_list + + # Data is already updated in DiskPartition.disk_database - no need to save to file + + if mount_point == '/' or fs == "ZFS": + InstallationData.slice = partition.replace(drive, '') + + if fs == "UEFI" or fs == "BOOT": + # Add to create list for partition creation operations + InstallationData.create.append([partition, create_size]) + + # Update InstallationData with new partition information + new_partitions = [] + for partition_name in partition_list: + partition_info = disk_data[drive]['partitions'][partition_name] + if partition_info['stat'] == 'New': + partition_text = f'{partition_info["file-system"]} ' \ + f'{partition_info["size"]} ' \ + f'{partition_info["mount-point"]}\n' + new_partitions.append(partition_text) + + InstallationData.new_partition = new_partitions + + +def delete_partition() -> None: + """Execute physical deletion of partitions marked for deletion. + + Iterates through partitions marked for deletion in InstallationData + and removes them from the disk using FreeBSD gpart commands. + + Raises: + RuntimeError: If no partitions are marked for deletion + """ + if InstallationData.delete: + for partition in InstallationData.delete: + num = slice_number(partition) + drive = get_disk_from_partition(partition) + call(f"sudo zpool labelclear -f {partition}", shell=True) + sleep(1) + call(f'sudo gpart delete -i {num} {drive}', shell=True) + sleep(1) + else: + raise RuntimeError('No partitions to delete') + + +def destroy_partition() -> None: + """Destroy and recreate partition tables on disks. + + Completely destroys existing partition tables and creates new ones + with the specified scheme for disks marked for destruction. + + Raises: + RuntimeError: If no disks are marked for destruction + """ + if InstallationData.destroy: + for drive, scheme in InstallationData.destroy.items(): + # Destroy the disk geom + gpart_destroy = f"sudo gpart destroy -F {drive}" + call(gpart_destroy, shell=True) + sleep(1) + clear_drive = f"sudo dd if=/dev/zero of={drive} bs=1m count=1" + call(clear_drive, shell=True) + sleep(1) + call(f'sudo gpart create -s {scheme} {drive}', shell=True) + sleep(1) + else: + raise RuntimeError('No disks to destroy') + + +def bios_or_uefi() -> str: + """Detect the system boot method (BIOS or UEFI). + + Returns: + str: 'BIOS' or 'UEFI' depending on the system boot method + """ + cmd = "sysctl -n machdep.bootmethod" + output1 = Popen(cmd, shell=True, stdout=PIPE, + universal_newlines=True, close_fds=True) + return output1.stdout.readlines()[0].rstrip() + + +def add_partition() -> None: + """Execute physical creation of partitions marked for creation. + + Creates actual partitions on disk using FreeBSD gpart commands + for all partitions marked for creation in InstallationData. + Handles different partition types (EFI, BIOS boot, FreeBSD, etc.). + + Raises: + RuntimeError: If no partitions are marked for creation + """ + if InstallationData.create: + boot = InstallationData.boot + for partition_info in InstallationData.create: + part = partition_info[0] + size = int(partition_info[1]) + drive = get_disk_from_partition(part) + sl = slice_number(part) + if set("p") & set(part): + if bios_or_uefi() == 'UEFI': + cmd = f'sudo gpart add -a 4k -s {size}M -t efi ' \ + f'-i {sl} {drive}' + call(cmd, shell=True) + sleep(1) + call(f'sudo zpool labelclear -f {drive}p{sl}', shell=True) + cmd2 = f'sudo newfs_msdos -F 16 {drive}p{sl}' + call(cmd2, shell=True) + else: + if boot == "grub": + cmd = f'sudo gpart add -a 4k -s {size}M -t ' \ + 'bios-boot -i {sl} {drive}' + else: + # freebsd-boot partition must never be larger + # than 512B blocks. + cmd = 'sudo gpart add -a 4k -s 512 -t ' \ + f'freebsd-boot -i {sl} {drive}' + call(cmd, shell=True) + call(f'sudo zpool labelclear -f {drive}p{sl}', shell=True) + elif set("s") & set(part): + cmd = f'sudo gpart add -a 4k -s {size}M -t freebsd ' \ + f'-i {sl} {drive}' + call(cmd, shell=True) + sleep(2) + else: + raise RuntimeError('No partitions to create') diff --git a/install_station/system_calls.py b/install_station/system_calls.py new file mode 100644 index 0000000..93343a6 --- /dev/null +++ b/install_station/system_calls.py @@ -0,0 +1,315 @@ +#!/usr/bin/env python + +import re +import os +from subprocess import Popen, run, PIPE +from install_station.data import pc_sysinstall + + +def replace_pattern(current: str, new: str, file: str) -> None: + """Replace text patterns in a file using regex substitution. + + Args: + current: Regular expression pattern to search for + new: Replacement text + file: Path to file to modify + """ + parser_file = open(file, 'r').read() + parser_patched = re.sub(current, new, parser_file) + save_parser_file = open(file, 'w') + save_parser_file.writelines(parser_patched) + save_parser_file.close() + + +def language_dictionary() -> dict[str, str]: + """Get available system languages from pc-sysinstall. + + Returns: + Dictionary mapping language names to language codes + """ + langs = Popen(f'{pc_sysinstall} query-langs', shell=True, stdin=PIPE, + stdout=PIPE, universal_newlines=True, + close_fds=True).stdout.readlines() + dictionary = {} + for line in langs: + lang_list = line.rstrip() + lang_name = lang_list.partition(' ')[2] + lang_code = lang_list.partition(' ')[0] + dictionary[lang_name] = lang_code + return dictionary + + +def localize_system(locale: str) -> None: + """Apply localization settings to the system. + + Updates login.conf, profile files, and greeter configurations + with the specified locale. + + Args: + locale: Language code (e.g. 'en_US', 'fr_FR') + """ + slick_greeter = "/usr/local/share/xgreeters/slick-greeter.desktop" + gtk_greeter = "/usr/local/share/xgreeters/lightdm-gtk-greeter.desktop" + replace_pattern('lang=C', f'lang={locale}', '/etc/login.conf') + replace_pattern('en_US', locale, '/etc/profile') + replace_pattern('en_US', locale, '/usr/share/skel/dot.profile') + + if os.path.exists(slick_greeter): + replace_pattern( + 'Exec=slick-greeter', + f'Exec=env LANG={locale}.UTF-8 slick-greeter', + slick_greeter + ) + elif os.path.exists(gtk_greeter): + replace_pattern( + 'Exec=lightdm-gtk-greete', + f'Exec=env LANG={locale}.UTF-8 lightdm-gtk-greeter', + gtk_greeter + ) + + +def keyboard_dictionary() -> dict[str, dict[str, str | None]]: + """Get available keyboard layouts and variants from pc-sysinstall. + + Returns: + Dictionary mapping keyboard layout names to layout/variant dictionaries + """ + xkeyboard_layouts = Popen(f'{pc_sysinstall} xkeyboard-layouts', shell=True, + stdout=PIPE, + universal_newlines=True).stdout.readlines() + dictionary = {} + for line in xkeyboard_layouts: + keyboard_list = list(filter(None, line.rstrip().split(' '))) + kb_name = keyboard_list[1].strip() + kb_layouts = keyboard_list[0].strip() + kb_variant = None + # Skip the "custom" layout as it's not a real keyboard layout + if kb_layouts != 'custom': + dictionary[kb_name] = {'layout': kb_layouts, 'variant': kb_variant} + + xkeyboard_variants = Popen(f'{pc_sysinstall} xkeyboard-variants', + shell=True, stdout=PIPE, + universal_newlines=True).stdout.readlines() + for line in xkeyboard_variants: + xkb_variant = line.rstrip() + kb_name = xkb_variant.partition(':')[2].strip() + keyboard_list = list(filter + (None, xkb_variant.partition(':')[0].split())) + kb_layouts = keyboard_list[1].strip() + kb_variant = keyboard_list[0].strip() + dictionary[kb_name] = {'layout': kb_layouts, 'variant': kb_variant} + return dictionary + + +def keyboard_models() -> dict[str, str]: + """Get available keyboard models from pc-sysinstall. + + Returns: + Dictionary mapping keyboard model names to model codes + """ + xkeyboard_models = Popen(f'{pc_sysinstall} xkeyboard-models', shell=True, + stdout=PIPE, + universal_newlines=True).stdout.readlines() + dictionary = {} + for line in xkeyboard_models: + kbm_name = line.rstrip().partition(' ')[2] + kbm_code = line.rstrip().partition(' ')[0] + dictionary[kbm_name] = kbm_code + return dictionary + + +def change_keyboard(kb_layout: str, kb_variant: str | None = None, kb_model: str | None = None) -> None: + """Apply keyboard layout change immediately using setxkbmap. + + Args: + kb_layout: Keyboard layout code + kb_variant: Optional keyboard variant code + kb_model: Optional keyboard model code + """ + if kb_variant is None and kb_model is not None: + run(f"setxkbmap -layout {kb_layout} -model {kb_model}", shell=True) + elif kb_variant is not None and kb_model is None: + run(f"setxkbmap -layout {kb_layout} -variant {kb_variant}", shell=True) + elif kb_variant is not None and kb_model is not None: + set_kb_cmd = f"setxkbmap -layout {kb_layout} -variant {kb_variant} " \ + f"-model {kb_model}" + run(set_kb_cmd, shell=True) + else: + run(f"setxkbmap -layout {kb_layout}", shell=True) + + +def set_keyboard(kb_layout: str, kb_variant: str | None = None, kb_model: str | None = None) -> None: + """ + Permanently configure keyboard layout for the live system. + Based on pc-sysinstall's localize_x_keyboard function. + """ + setxkbmap_cmd = "" + + # Build setxkbmap command + if kb_model and kb_model != "NONE": + setxkbmap_cmd = f"-model {kb_model}" + kx_model = kb_model + else: + kx_model = "pc104" + + if kb_layout and kb_layout != "NONE": + setxkbmap_cmd = f"{setxkbmap_cmd} -layout {kb_layout}".strip() + kx_layout = kb_layout + else: + kx_layout = "us" + + if kb_variant and kb_variant != "NONE": + setxkbmap_cmd = f"{setxkbmap_cmd} -variant {kb_variant}" + + # Apply the keyboard layout immediately + if setxkbmap_cmd: + run(f"setxkbmap {setxkbmap_cmd}", shell=True) + + # Create .xprofile for persistent keyboard layout + xprofile_path = "/home/ghostbsd/.xprofile" + try: + # Read existing .xprofile or create new one + if os.path.exists(xprofile_path): + with open(xprofile_path, 'r') as f: + content = f.read() + # Remove existing setxkbmap lines + lines = [line for line in content.splitlines() if not line.strip().startswith('setxkbmap')] + else: + lines = ["#!/bin/sh"] + + # Add new setxkbmap command + lines.append(f"setxkbmap {setxkbmap_cmd}") + + # Write back to .xprofile + with open(xprofile_path, 'w') as f: + f.write('\n'.join(lines) + '\n') + + # Make executable + os.chmod(xprofile_path, 0o755) + + except (OSError, IOError) as e: + print(f"Warning: Could not update .xprofile: {e}") + + # Set console keymap in rc.conf for live system persistence + try: + _set_console_keymap(kx_layout) + except (OSError, IOError) as e: + print(f"Warning: Could not update console keymap: {e}") + + +def _set_console_keymap(key_layout: str) -> None: + """Helper function to set console keymap in rc.conf""" + # Map X11 layouts to console keymaps (from pc-sysinstall) + keymap_mapping = { + 'ca': 'ca-fr.kbd', + 'et': 'ee.kbd', + 'es': 'es.acc.kbd', + 'gb': 'uk.kbd' + } + + console_keymap = keymap_mapping.get(key_layout, f"{key_layout}.kbd") + + rc_conf_path = "/etc/rc.conf" + keymap_line = f'keymap="{console_keymap}"\n' + + # Check if keymap already exists in rc.conf + if os.path.exists(rc_conf_path): + with open(rc_conf_path, 'r') as f: + lines = f.readlines() + + # Remove existing keymap lines + lines = [line for line in lines if not line.strip().startswith('keymap=')] + + # Add new keymap + lines.append(keymap_line) + + with open(rc_conf_path, 'w') as f: + f.writelines(lines) + else: + with open(rc_conf_path, 'w') as f: + f.write(keymap_line) + + +def timezone_dictionary() -> dict[str, list[str]]: + """Get available timezones from pc-sysinstall. + + Returns: + Dictionary mapping continents to lists of cities/regions + """ + tz_list = Popen(f'{pc_sysinstall} list-tzones', shell=True, + stdout=PIPE, universal_newlines=True).stdout.readlines() + city_list = [] + dictionary = {} + last_continent = '' + for zone in tz_list: + zone_list = zone.partition(':')[0].rstrip().split('/') + continent = zone_list[0] + if continent != last_continent: + city_list = [] + if len(zone_list) == 3: + city = zone_list[1] + '/' + zone_list[2] + elif len(zone_list) == 4: + city = zone_list[1] + '/' + zone_list[2] + '/' + zone_list[3] + else: + city = zone_list[1] + city_list.append(city) + dictionary[continent] = city_list + last_continent = continent + return dictionary + + +def zfs_disk_query() -> list[str]: + """Query available disks for ZFS installation. + + Returns: + List of available disk device names + """ + disk_output = Popen( + f"{pc_sysinstall} disk-list", + shell=True, + stdin=PIPE, + stdout=PIPE, + universal_newlines=True, + close_fds=True + ) + return disk_output.stdout.readlines() + + +def zfs_disk_size_query(disk: str) -> str: + """Query disk size information. + + Args: + disk: Disk device name + + Returns: + Disk size information string + """ + disk_info_output = Popen( + f"{pc_sysinstall} disk-info {disk}", + shell=True, + stdin=PIPE, + stdout=PIPE, + universal_newlines=True, + close_fds=True + ) + return disk_info_output.stdout.readlines()[3].partition('=')[2] + + +def set_admin_user(username: str, name: str, password: str, shell: str, homedir: str, hostname: str) -> None: + """Set up administrator user and system hostname. + + Args: + username: Username for the admin user + name: Full name for the admin user + password: Password for the admin user + shell: Default shell for the admin user + homedir: Home directory path for the admin user + hostname: System hostname to set + """ + # Set Root user + run(f"echo '{password}' | pw usermod -n root -h 0", shell=True) + cmd = f"echo '{password}' | pw useradd {username} -c {name} -h 0" \ + f" -s {shell} -m -d {homedir} -g wheel,operator" + run(cmd, shell=True) + run(f"sysrc hostname={hostname}", shell=True) + run(f"hostname {hostname}", shell=True) diff --git a/install_station/try_install.py b/install_station/try_install.py new file mode 100644 index 0000000..48aaa9e --- /dev/null +++ b/install_station/try_install.py @@ -0,0 +1,161 @@ +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk, Gdk +from install_station.data import InstallationData, get_text, gif_logo + +cssProvider = Gtk.CssProvider() +cssProvider.load_from_path('/usr/local/lib/install-station/ghostbsd-style.css') +screen = Gdk.Screen.get_default() +styleContext = Gtk.StyleContext() +styleContext.add_provider_for_screen( + screen, + cssProvider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION +) + + +class TryOrInstall: + """ + Utility class for the welcome screen and initial mode selection following the utility class pattern. + + This class provides a GTK+ interface for the initial GhostBSD welcome screen including: + - Mode selection between "Install GhostBSD" and "Try GhostBSD" using radio buttons + - Visual elements with GhostBSD logo and instructional text + - Integration with InstallationData for persistent configuration + + The class follows a utility pattern with class methods and variables for state management, + designed to integrate with the Interface controller for navigation flow. + """ + # Class variables instead of instance variables + what: str | None = None + install_button: Gtk.RadioButton | None = None + try_button: Gtk.RadioButton | None = None + instruction_label: Gtk.Label | None = None + vbox1: Gtk.Box | None = None + + @classmethod + def mode_selection(cls, widget: Gtk.RadioButton, val: str) -> None: + """ + Handle mode selection from radio buttons. + + Only responds to activation, not deactivation. Updates both + class variables and InstallationData with the selected mode. + + Args: + widget: RadioButton widget that triggered the action + val: Mode value ('install' or 'try') + """ + # Only respond to activation, not deactivation + if widget.get_active(): + cls.what = val + InstallationData.install_mode = val + print(f"Mode selected: {val}") + + @classmethod + def get_what(cls) -> str | None: + """ + Get the current installation mode. + + Returns the installation mode from InstallationData if available, + otherwise falls back to the class variable. + + Returns: + str: Current installation mode ('install' or 'try') + """ + return InstallationData.install_mode or cls.what + + @classmethod + def initialize(cls) -> None: + """ + Initialize the welcome screen UI following the utility class pattern. + + Creates the main interface including: + - GhostBSD logo on the left side + - Radio buttons for Install/Try options on the right side + - Instructional text explaining the options + - Grid-based layout with proper spacing and margins + + This method is called automatically by get_model() when the interface is first accessed. + """ + cls.what = 'install' # Default to install mode + InstallationData.install_mode = cls.what + + cls.vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.vbox1.show() + + main_grid = Gtk.Grid() + cls.vbox1.pack_start(main_grid, True, True, 0) + + # Left side - Logo + logo_image = Gtk.Image() + logo_image.set_from_file(gif_logo) + logo_image.show() + + # Right side - Radio button options + right_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + right_box.set_border_width(20) + right_box.set_halign(Gtk.Align.CENTER) + right_box.set_valign(Gtk.Align.CENTER) + right_box.show() + + # Instruction label + cls.instruction_label = Gtk.Label(label=get_text("What would you like to do?")) + cls.instruction_label.set_alignment(0.0, 0.5) + right_box.pack_start(cls.instruction_label, False, False, 10) + + # Create radio button group + cls.install_button = Gtk.RadioButton( + label=get_text( + "Install GhostBSD\n" + "Install GhostBSD on your computer." + ) + ) + cls.install_button.get_child().set_use_markup(True) + cls.install_button.get_child().set_line_wrap(True) + right_box.pack_start(cls.install_button, False, False, 10) + cls.install_button.connect("toggled", cls.mode_selection, "install") + cls.install_button.show() + + cls.try_button = Gtk.RadioButton.new_with_label_from_widget( + cls.install_button, + get_text( + "Try GhostBSD\n" + "Run GhostBSD without installing to your computer." + ) + ) + cls.try_button.get_child().set_use_markup(True) + cls.try_button.get_child().set_line_wrap(True) + right_box.pack_start(cls.try_button, False, False, 10) + cls.try_button.connect("toggled", cls.mode_selection, "try") + cls.try_button.show() + + # Layout in grid + main_grid.set_row_spacing(20) + main_grid.set_column_spacing(20) + main_grid.set_column_homogeneous(True) + main_grid.set_row_homogeneous(True) + main_grid.set_margin_left(10) + main_grid.set_margin_right(10) + main_grid.set_margin_top(10) + main_grid.set_margin_bottom(10) + + main_grid.attach(logo_image, 0, 0, 1, 1) + main_grid.attach(right_box, 1, 0, 1, 1) + main_grid.show() + + # Set default selection + cls.install_button.set_active(True) + + @classmethod + def get_model(cls) -> Gtk.Box: + """ + Return the GTK widget model for the welcome screen interface. + + Returns the main container widget created during initialization. + + Returns: + Gtk.Box: The main container widget for the welcome screen interface + """ + if cls.vbox1 is None: + cls.initialize() + return cls.vbox1 diff --git a/install_station/use_zfs.py b/install_station/use_zfs.py new file mode 100644 index 0000000..1e0441b --- /dev/null +++ b/install_station/use_zfs.py @@ -0,0 +1,620 @@ +from gi.repository import Gtk, Gdk +from install_station.common import password_strength +from install_station.data import InstallationData, zfs_datasets, be_name, logo, get_text +from install_station.partition import bios_or_uefi +from install_station.system_calls import ( + zfs_disk_query, + zfs_disk_size_query, +) +from install_station.interface_controller import Button + + +cssProvider = Gtk.CssProvider() +cssProvider.load_from_path('/usr/local/lib/install-station/ghostbsd-style.css') +screen = Gdk.Screen.get_default() +styleContext = Gtk.StyleContext() +styleContext.add_provider_for_screen( + screen, + cssProvider, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION +) + + +class ZFS: + """ + Utility class for ZFS configuration and disk management following the utility class pattern. + + This class provides a GTK+ interface for configuring ZFS installations including: + - Disk selection and validation + - Pool type configuration (stripe, mirror, RAIDZ1/2/3) + - Partition scheme selection (GPT/MBR) + - Disk encryption setup with password verification + - ZFS pool name configuration + + The class follows a utility pattern with class methods and variables for state management, + designed to integrate with the InstallationData system for configuration persistence. + """ + # Class variables instead of instance variables + zfs_disk_list = [] + pool_type = 'stripe' + scheme = 'GPT' + zpool = False + disk_encrypt = False + mirror = 'single disk' + vbox1 = None + + # UI elements as class variables + pool = None + password = None + repassword = None + mirrorTips = None + strenght_label = None + img = None + check_cell = None + store = None + + @classmethod + def save_selection(cls): + """ + Save the current ZFS configuration to InstallationData. + + Validates required fields and generates ZFS configuration data including: + - Pool name and type (stripe, mirror, RAIDZ1/2/3) + - Disk partitioning scheme and encryption settings + - Boot environment and dataset configuration + + Raises: + ValueError: If required fields are missing or invalid + """ + # Validate required fields are populated + if not cls.zfs_disk_list: + raise ValueError("No disks selected for ZFS configuration") + + if cls.zpool and not cls.pool.get_text().strip(): + raise ValueError("Pool name cannot be empty when zpool is enabled") + + if cls.disk_encrypt and not cls.password.get_text().strip(): + raise ValueError("Password cannot be empty when disk encryption is enabled") + + size = int(cls.zfs_disk_list[0].partition('-')[2].rstrip()) - 512 + swap = 0 + zfs_num = size - swap + if cls.disk_encrypt is True: + dgeli = '.eli' + else: + dgeli = '' + + # Store configuration data in InstallationData instead of writing to file + InstallationData.zfs_config_data = [] + + if cls.zpool is True: + InstallationData.zfs_config_data.append(f"zpoolName={cls.pool.get_text()}\n") + else: + InstallationData.zfs_config_data.append("#zpoolName=None\n") + InstallationData.zfs_config_data.append(f"beName={be_name}\n") + InstallationData.zfs_config_data.append('ashift=12\n\n') + disk = cls.zfs_disk_list[0].partition('-')[0].rstrip() + InstallationData.zfs_config_data.append(f'disk0={disk}\n') + InstallationData.zfs_config_data.append('partition=ALL\n') + InstallationData.zfs_config_data.append(f'partscheme={cls.scheme}\n') + InstallationData.zfs_config_data.append('commitDiskPart\n\n') + if cls.pool_type == 'none': + pool_disk = '\n' + else: + zfs_disk = cls.zfs_disk_list + disk_len = len(zfs_disk) - 1 + num = 1 + mirror_dsk = '' + while disk_len != 0: + mirror_dsk += ' ' + zfs_disk[num].partition('-')[0].rstrip() + print(mirror_dsk) + num += 1 + disk_len -= 1 + pool_disk = f' ({cls.pool_type}:{mirror_dsk})\n' + if bios_or_uefi() == "UEFI": + zfs_num = zfs_num - 100 + else: + zfs_num = zfs_num - 1 + # adding zero to use remaining space + zfs_part = f'disk0-part=ZFS{dgeli} {zfs_num} {zfs_datasets}{pool_disk}' + InstallationData.zfs_config_data.append(zfs_part) + if swap != 0: + InstallationData.zfs_config_data.append('disk0-part=swap 0 none\n') + if cls.disk_encrypt is True: + InstallationData.zfs_config_data.append(f'encpass={cls.password.get_text()}\n') + else: + InstallationData.zfs_config_data.append('#encpass=None\n') + InstallationData.zfs_config_data.append('commitDiskLabel\n') + + @classmethod + def scheme_selection(cls, combobox): + """ + Handle partition scheme selection from combo box. + + Args: + combobox: ComboBox widget containing scheme options (GPT/MBR) + """ + model = combobox.get_model() + index = combobox.get_active() + data = model[index][0] + cls.scheme = data.partition(':')[0] + + @classmethod + def mirror_selection(cls, combobox): + """ + Handle pool type selection and update UI accordingly. + + Sets the pool type (stripe, mirror, RAIDZ1/2/3) and updates the tip text + and next button sensitivity based on the number of selected disks. + + Args: + combobox: ComboBox widget containing pool type options + """ + model = combobox.get_model() + index = combobox.get_active() + data = model[index][0] # Get the internal value (English) + cls.mirror = data + if cls.mirror == "1+ disks Stripe": + cls.pool_type = 'stripe' + cls.mirrorTips.set_text( + get_text("Please select 1 or more drive for stripe (select the smallest disk first)")) + if len(cls.zfs_disk_list) >= 1: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "2+ disks Mirror": + cls.pool_type = 'mirror' + mir_msg1 = get_text("Please select 2 drive for mirroring (select the smallest disk first)") + cls.mirrorTips.set_text(mir_msg1) + if len(cls.zfs_disk_list) >= 2: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "3 disks RAIDZ1": + cls.pool_type = 'raidz1' + cls.mirrorTips.set_text(get_text("Please select 3 drive for RAIDZ1 (select the smallest disk first)")) + if len(cls.zfs_disk_list) == 3: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "4 disks RAIDZ2": + cls.pool_type = 'raidz2' + cls.mirrorTips.set_text(get_text("Please select 4 drive for RAIDZ2 (select the smallest disk first)")) + if len(cls.zfs_disk_list) == 4: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "5 disks RAIDZ3": + cls.pool_type = 'raidz3' + cls.mirrorTips.set_text(get_text("Please select 5 drive for RAIDZ3 (select the smallest disk first)")) + if len(cls.zfs_disk_list) == 5: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + + @classmethod + def on_check_poll(cls, widget): + """ + Handle custom pool name checkbox toggle. + + Enables or disables the pool name entry field based on checkbox state. + + Args: + widget: CheckButton widget for pool name enable/disable + """ + if widget.get_active(): + cls.pool.set_sensitive(True) + cls.zpool = True + else: + cls.pool.set_sensitive(False) + cls.zpool = False + + @classmethod + def on_check_encrypt(cls, widget): + """ + Handle disk encryption checkbox toggle. + + Enables or disables password fields and updates next button sensitivity + based on encryption state and current disk selection. + + Args: + widget: CheckButton widget for disk encryption enable/disable + """ + if widget.get_active(): + cls.password.set_sensitive(True) + cls.repassword.set_sensitive(True) + cls.disk_encrypt = True + Button.next_button.set_sensitive(False) + else: + cls.password.set_sensitive(False) + cls.repassword.set_sensitive(False) + cls.disk_encrypt = False + if cls.mirror == "1+ disks Stripe": + if len(cls.zfs_disk_list) >= 1: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "2+ disks Mirror": + if len(cls.zfs_disk_list) >= 2: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "3 disks RAIDZ1": + if len(cls.zfs_disk_list) == 3: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "4 disks RAIDZ2": + if len(cls.zfs_disk_list) == 4: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "5 disks RAIDZ3": + if len(cls.zfs_disk_list) == 5: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + + @classmethod + def initialize(cls): + """ + Initialize the ZFS configuration UI following the utility class pattern. + + Creates the main interface including: + - Disk selection tree view with checkboxes + - Pool type selection (stripe, mirror, RAIDZ1/2/3) + - Pool name configuration + - Partition scheme selection (GPT/MBR) + - Disk encryption options with password fields + + This method is called automatically by get_model() when the interface is first accessed. + """ + cls.vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + cls.vbox1.show() + # Chose disk + sw = Gtk.ScrolledWindow(hexpand=True, vexpand=True) + sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN) + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + cls.store = Gtk.TreeStore(str, str, str, 'gboolean') + for disk in zfs_disk_query(): + dsk = disk.partition(':')[0].rstrip() + dsk_name = disk.partition(':')[2].rstrip() + dsk_size = zfs_disk_size_query(dsk).rstrip() + cls.store.append(None, [dsk, dsk_size, dsk_name, False]) + treeview = Gtk.TreeView() + treeview.set_model(cls.store) + treeview.set_rules_hint(True) + cls.check_cell = Gtk.CellRendererToggle() + cls.check_cell.set_property('activatable', True) + cls.check_cell.connect('toggled', cls.col1_toggled_cb, cls.store) + cell = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(None, cell, text=0) + column_header = Gtk.Label(label=get_text('Disk')) + column_header.set_use_markup(True) + column_header.show() + column.set_widget(column_header) + column.set_sort_column_id(0) + cell2 = Gtk.CellRendererText() + column2 = Gtk.TreeViewColumn(None, cell2, text=0) + column_header2 = Gtk.Label(label=get_text('Size(MB)')) + column_header2.set_use_markup(True) + column_header2.show() + column2.set_widget(column_header2) + cell3 = Gtk.CellRendererText() + column3 = Gtk.TreeViewColumn(None, cell3, text=0) + column_header3 = Gtk.Label(label=get_text('Name')) + column_header3.set_use_markup(True) + column_header3.show() + column3.set_widget(column_header3) + column1 = Gtk.TreeViewColumn(get_text("Check"), cls.check_cell) + column1.add_attribute(cls.check_cell, "active", 3) + column.set_attributes(cell, text=0) + column2.set_attributes(cell2, text=1) + column3.set_attributes(cell3, text=2) + treeview.append_column(column1) + treeview.append_column(column) + treeview.append_column(column2) + treeview.append_column(column3) + tree_selection = treeview.get_selection() + tree_selection.set_mode(Gtk.SelectionMode.SINGLE) + sw.add(treeview) + sw.show() + cls.mirrorTips = Gtk.Label(label=get_text('Please select one drive')) + cls.mirrorTips.set_justify(Gtk.Justification.LEFT) + cls.mirrorTips.set_alignment(0.01, 0.5) + # Mirror, raidz and stripe + cls.mirror = 'none' + mirror_label = Gtk.Label(label=get_text('Pool Type')) + mirror_label.set_use_markup(True) + mirror_box = Gtk.ComboBox() + mirror_store = Gtk.ListStore(str, str) # value, display_text + mirror_store.append(["1+ disks Stripe", get_text("1+ disks Stripe")]) + mirror_store.append(["2+ disks Mirror", get_text("2+ disks Mirror")]) + mirror_store.append(["3 disks RAIDZ1", get_text("3 disks RAIDZ1")]) + mirror_store.append(["4 disks RAIDZ2", get_text("4 disks RAIDZ2")]) + mirror_store.append(["5 disks RAIDZ3", get_text("5 disks RAIDZ3")]) + mirror_box.set_model(mirror_store) + renderer = Gtk.CellRendererText() + mirror_box.pack_start(renderer, True) + mirror_box.add_attribute(renderer, "text", 1) # Display column 1 (translated text) + mirror_box.connect('changed', cls.mirror_selection) + mirror_box.set_active(0) + + # Pool Name + cls.zpool = False + pool_name_label = Gtk.Label(label=get_text('Pool Name')) + pool_name_label.set_use_markup(True) + cls.pool = Gtk.Entry() + cls.pool.set_text('zroot') + # Creating MBR or GPT drive + scheme_label = Gtk.Label(label='Partition Scheme') + scheme_label.set_use_markup(True) + # Adding a combo box to selecting MBR or GPT sheme. + cls.scheme = 'GPT' + shemebox = Gtk.ComboBoxText() + shemebox.append_text("GPT") + shemebox.append_text("MBR") + shemebox.connect('changed', cls.scheme_selection) + shemebox.set_active(0) + if bios_or_uefi() == "UEFI": + shemebox.set_sensitive(False) + else: + shemebox.set_sensitive(True) + # GELI Disk encryption + cls.disk_encrypt = False + encrypt_check = Gtk.CheckButton(label=get_text("Encrypt Disk")) + encrypt_check.connect("toggled", cls.on_check_encrypt) + encrypt_check.set_sensitive(True) + # password + cls.passwd_label = Gtk.Label(label=get_text("Password")) + cls.password = Gtk.Entry() + cls.password.set_sensitive(False) + cls.password.set_visibility(False) + cls.password.connect("changed", password_strength) + cls.strenght_label = Gtk.Label() + cls.strenght_label.set_alignment(0.1, 0.5) + cls.vpasswd_label = Gtk.Label(label=get_text("Verify it")) + cls.repassword = Gtk.Entry() + cls.repassword.set_sensitive(False) + cls.repassword.set_visibility(False) + cls.repassword.connect("changed", cls.password_verification) + # set image for password matching + cls.img = Gtk.Image() + cls.img.set_alignment(0.2, 0.5) + # table = Gtk.Table(12, 12, True) + grid = Gtk.Grid() + grid.set_row_spacing(10) + # grid.set_column_homogeneous(True) + # grid.set_row_homogeneous(True) + # grid.attach(Title, 1, 1, 10, 1) + grid.attach(mirror_label, 1, 2, 1, 1) + grid.attach(mirror_box, 2, 2, 1, 1) + grid.attach(pool_name_label, 7, 2, 2, 1) + grid.attach(cls.pool, 9, 2, 2, 1) + grid.attach(cls.mirrorTips, 1, 3, 8, 1) + # grid.attach(zfs4kcheck, 9, 3, 2, 1) + grid.attach(sw, 1, 4, 10, 3) + # grid.attach(scheme_label, 1, 9, 1, 1) + # grid.attach(shemebox, 2, 9, 1, 1) + # grid.attach(cls.swap_encrypt_check, 9, 15, 11, 12) + # grid.attach(swap_mirror_check, 9, 15, 11, 12) + # grid.attach(encrypt_check, 2, 8, 2, 1) + # grid.attach(cls.passwd_label, 1, 9, 1, 1) + # grid.attach(cls.password, 2, 9, 2, 1) + # grid.attach(cls.strenght_label, 4, 9, 2, 1) + # grid.attach(cls.vpasswd_label, 1, 10, 1, 1) + # grid.attach(cls.repassword, 2, 10, 2, 1) + # grid.attach(cls.img, 4, 10, 2, 1) + cls.vbox1.pack_start(grid, True, True, 10) + return + + @classmethod + def get_model(cls): + """ + Return the GTK widget model for the ZFS configuration interface. + + Creates and initializes the UI if it doesn't exist yet. + + Returns: + Gtk.Box: The main container widget for the ZFS configuration interface + """ + if cls.vbox1 is None: + cls.initialize() + return cls.vbox1 + + @classmethod + def check_if_small_disk(cls, size): + """ + Check if any selected disk is larger than the specified size. + + Used to enforce the requirement that the smallest disk must be selected first + for ZFS pool configurations. + + Args: + size: Size in MB to compare against selected disks + + Returns: + bool: True if any selected disk is larger than the specified size + """ + if len(cls.zfs_disk_list) != 0: + for line in cls.zfs_disk_list: + if int(line.partition('-')[2]) > int(size): + return True + else: + return False + else: + return False + + @classmethod + def col1_toggled_cb(cls, _cell, path, model): + """ + Handle disk selection checkbox toggle events. + + Manages the disk selection list and updates next button sensitivity + based on pool type requirements. Enforces the rule that the smallest + disk must be selected first. + + Args: + _cell: CellRendererToggle that was clicked (unused) + path: TreePath of the toggled row + model: TreeStore model containing disk data + + Returns: + bool: Always returns True to indicate the event was handled + """ + model[path][3] = not model[path][3] + if model[path][3] is False: + cls.zfs_disk_list.remove(model[path][0] + "-" + model[path][1]) + if cls.mirror == "1+ disks Stripe": + if len(cls.zfs_disk_list) >= 1: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "2+ disks Mirror": + if len(cls.zfs_disk_list) >= 2: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "3 disks RAIDZ1": + if len(cls.zfs_disk_list) == 3: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "4 disks RAIDZ2": + if len(cls.zfs_disk_list) == 4: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "5 disks RAIDZ3": + if len(cls.zfs_disk_list) == 5: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + else: + if cls.check_if_small_disk(model[path][1]) is False: + cls.zfs_disk_list.extend([model[path][0] + "-" + model[path][1]]) + if cls.mirror == "1+ disks Stripe": + if len(cls.zfs_disk_list) >= 1: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "2+ disks Mirror": + if len(cls.zfs_disk_list) >= 2: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "3 disks RAIDZ1": + if len(cls.zfs_disk_list) == 3: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "4 disks RAIDZ2": + if len(cls.zfs_disk_list) == 4: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "5 disks RAIDZ3": + if len(cls.zfs_disk_list) == 5: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + else: + cls.check_cell.set_sensitive(False) + cls.small_disk_warning() + + print(cls.zfs_disk_list) + return True + + @classmethod + def small_disk_warning(cls): + """ + Display a warning dialog when disks are selected out of size order. + + Shows a dialog informing the user that the smallest disk must be + selected first and offers to reset all selections. + """ + window = Gtk.Window() + window.set_title(get_text("Warning")) + window.set_border_width(0) + # window.set_size_request(480, 200) + window.set_icon_from_file(logo) + box1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0) + window.add(box1) + box1.show() + box2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=10) + box2.set_border_width(10) + box1.pack_start(box2, True, True, 0) + box2.show() + warning_text = get_text("Smallest disk need to be SELECTED first!\n") + warning_text += get_text("All the disk selected will reset.") + label = Gtk.Label(label=warning_text) + # Add button + box2.pack_start(label, True, True, 0) + bbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=10) + bbox.set_border_width(5) + button = Gtk.Button(stock=Gtk.STOCK_OK) + button.connect("clicked", cls.resset_selection, window) + bbox.add(button) + box2.pack_end(bbox, True, True, 5) + window.show_all() + + @classmethod + def resset_selection(cls, _widget, window): + """ + Reset all disk selections and close the warning dialog. + + Clears the disk selection list and unchecks all checkboxes in the tree view. + + Args: + _widget: Button widget that triggered the reset (unused) + window: Warning dialog window to close + """ + cls.zfs_disk_list = [] + rows = len(cls.store) + for row in range(0, rows): + cls.store[row][3] = False + row += 1 + cls.check_cell.set_sensitive(True) + window.hide() + + @classmethod + def password_verification(cls, _widget): + """ + Verify that password and confirmation password fields match. + + Updates the verification image and next button sensitivity based on + password match status and current disk selection requirements. + + Args: + _widget: Entry widget that triggered the verification (unused) + """ + if cls.password.get_text() == cls.repassword.get_text(): + cls.img.set_from_stock(Gtk.STOCK_YES, 5) + if cls.mirror == "1+ disks Stripe": + if len(cls.zfs_disk_list) >= 1: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "2+ disks Mirror": + if len(cls.zfs_disk_list) >= 2: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "3 disks RAIDZ1": + if len(cls.zfs_disk_list) == 3: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "4 disks RAIDZ2": + if len(cls.zfs_disk_list) == 4: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + elif cls.mirror == "5 disks RAIDZ3": + if len(cls.zfs_disk_list) == 5: + Button.next_button.set_sensitive(True) + else: + Button.next_button.set_sensitive(False) + else: + cls.img.set_from_stock(Gtk.STOCK_NO, 5) + Button.next_button.set_sensitive(False) diff --git a/install_station/window.py b/install_station/window.py new file mode 100644 index 0000000..bd3b841 --- /dev/null +++ b/install_station/window.py @@ -0,0 +1,103 @@ +""" +Window Module. + +This module provides a singleton wrapper around GTK Window to provide +a consistent interface for the main application window. +""" +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + + +class Window: + """ + Singleton wrapper for GTK Window. + + Provides a class-based interface to a single GTK Window instance + that can be accessed throughout the application. + """ + window: Gtk.Window = Gtk.Window() + + @classmethod + def connect(cls, signal: str, callback) -> int: + """Connect a signal handler to the window. + + Args: + signal: Signal name to connect to + callback: Callback function to invoke + + Returns: + Connection ID + """ + return cls.window.connect(signal, callback) + + @classmethod + def set_border_width(cls, width: int) -> None: + """Set the border width of the window. + + Args: + width: Border width in pixels + """ + return cls.window.set_border_width(width) + + @classmethod + def set_default_size(cls, width: int, height: int) -> None: + """Set the default size of the window. + + Args: + width: Default width in pixels + height: Default height in pixels + """ + return cls.window.set_default_size(width, height) + + @classmethod + def set_size_request(cls, width: int, height: int) -> None: + """Set the size request of the window. + + Args: + width: Requested width in pixels + height: Requested height in pixels + """ + return cls.window.set_size_request(width, height) + + @classmethod + def set_title(cls, title: str) -> None: + """Set the window title. + + Args: + title: Window title text + """ + return cls.window.set_title(title) + + @classmethod + def set_icon_from_file(cls, filename: str) -> None: + """Set the window icon from a file. + + Args: + filename: Path to icon file + """ + return cls.window.set_icon_from_file(filename) + + @classmethod + def add(cls, widget: Gtk.Widget) -> None: + """Add a widget to the window. + + Args: + widget: Widget to add to the window + """ + return cls.window.add(widget) + + @classmethod + def show_all(cls) -> None: + """Show the window and all its children.""" + return cls.window.show_all() + + @classmethod + def hide(cls) -> None: + """Hide the window.""" + return cls.window.hide() + + @classmethod + def __getattr__(cls, name: str): + """Fallback for any methods not explicitly defined.""" + return getattr(cls.window, name) diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..14f755b --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,18 @@ +install-station +install_station/boot_manager.py +install_station/common.py +install_station/custom.py +install_station/data.py +install_station/end.py +install_station/error.py +install_station/install.py +install_station/install_type.py +install_station/interface_controller.py +install_station/keyboard.py +install_station/language.py +install_station/network_setup.py +install_station/partition.py +install_station/system_calls.py +install_station/use_zfs.py +install_station/welcome_live.py +install_station/window.py \ No newline at end of file diff --git a/po/ar_SA.po b/po/ar_SA.po new file mode 100644 index 0000000..3dffcee --- /dev/null +++ b/po/ar_SA.po @@ -0,0 +1,462 @@ +# Arabic translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:27-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Arabic <(nothing)>\n" +"Language: ar_SA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/bg_BG.po b/po/bg_BG.po new file mode 100644 index 0000000..10b9f7a --- /dev/null +++ b/po/bg_BG.po @@ -0,0 +1,463 @@ +# Bulgarian translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:26-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/ca_ES.po b/po/ca_ES.po new file mode 100644 index 0000000..b8f7058 --- /dev/null +++ b/po/ca_ES.po @@ -0,0 +1,463 @@ +# Catalan translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:26-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/cs_CZ.po b/po/cs_CZ.po new file mode 100644 index 0000000..56ddf0c --- /dev/null +++ b/po/cs_CZ.po @@ -0,0 +1,463 @@ +# Czech translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:24-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Czech \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/da_DK.po b/po/da_DK.po new file mode 100644 index 0000000..8f96ab7 --- /dev/null +++ b/po/da_DK.po @@ -0,0 +1,463 @@ +# Danish translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:24-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Danish \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/de_DE.po b/po/de_DE.po new file mode 100644 index 0000000..27d7a70 --- /dev/null +++ b/po/de_DE.po @@ -0,0 +1,463 @@ +# German translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:19-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/el_GR.po b/po/el_GR.po new file mode 100644 index 0000000..d01c500 --- /dev/null +++ b/po/el_GR.po @@ -0,0 +1,463 @@ +# Greek translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:24-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Greek \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/en_GB.po b/po/en_GB.po new file mode 100644 index 0000000..07dfb7b --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,583 @@ +# English translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:26-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: English (British) <(nothing)>\n" +"Language: en_GB\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "Boot Option" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "Setup rEFInd boot manager" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "Setup FreeBSD boot manager" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "FreeBSD {loader} loader only" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "Space not allowed" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "Super Weak" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "Very Weak" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "Fairly Weak" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "Weak" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "Strong" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "Fairly Strong" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "Very Strong" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "Super Strong" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "Create" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "Delete" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "Revert" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "Auto" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "Add Partition" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "Type:" + +#: install_station/custom.py:343 install_station/custom.py:580 +#, fuzzy +msgid "Size(MB):" +msgstr "Size(MB)" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "Mount point:" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "Partition Scheme" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "GPT: GUID Partition Table" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "MBR: DOS Partition" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "Installation Completed" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "Restart" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "Continue" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "Installation Error" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "Installation has failed!" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "GhostBSD issue system" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." + +#: install_station/error.py:45 +msgid "Ok" +msgstr "Ok" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "How do you want to install GhostBSD?" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "Creating ghostbsd_installation.cfg" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "Deleting partition" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "Creating disk partition" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "Creating new partitions" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "Installation in progress" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "Back" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "Cancel" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "Next" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "Welcome to GhostBSD" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "Button" + +#: install_station/interface_controller.py:137 +#, fuzzy +msgid "Keyboard Setup" +msgstr "Keyboard Layout" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "Network Setup" + +#: install_station/interface_controller.py:160 +#, fuzzy +msgid "Try Or Install GhostBSD" +msgstr "Install GhostBSD" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "Installation Types" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "Custom Configuration" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "ZFS Configuration" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "Install" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "Installation Progress" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "Progress Bar" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "Type here to test your keyboard" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "Keyboard Layout" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "Keyboard Models" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "English (US)" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "English (Canada)" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "French (Canada)" + +#: install_station/language.py:93 install_station/language.py:197 +#, fuzzy +msgid "Please select your language:" +msgstr "Please select one drive" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "Language" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "Network card connected to the internet" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "Network card not connected to the internet" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "No network card detected" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "WiFi card detected and connected to an access point" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "WiFi card detected but not connected to an access point" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "WiFi card not detected or not supported" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "Wi-Fi Network Authentication Required" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "{ssid} Wi-Fi Network Authentication failed" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "Authentication required by {ssid} Wi-Fi Network" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "Password:" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "Show password" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +#, fuzzy +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" +"Please select 1 or more drive for stripe (select the smallest disc first)" + +#: install_station/use_zfs.py:167 +#, fuzzy +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "Please select 2 drive for mirroring (select the smallest disc first)" + +#: install_station/use_zfs.py:175 +#, fuzzy +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "Please select 3 drive for RAIDZ1 (select the smallest disc first)" + +#: install_station/use_zfs.py:182 +#, fuzzy +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "Please select 4 drive for RAIDZ2 (select the smallest disc first)" + +#: install_station/use_zfs.py:189 +#, fuzzy +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "Please select 5 drive for RAIDZ3 (select the smallest disc first)" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "Disc" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "Size(MB)" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "Name" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "Check" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "Please select one drive" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "Pool Type" + +#: install_station/use_zfs.py:331 +#, fuzzy +msgid "1+ disks Stripe" +msgstr "1+ discs Stripe" + +#: install_station/use_zfs.py:332 +#, fuzzy +msgid "2+ disks Mirror" +msgstr "2+ discs Mirror" + +#: install_station/use_zfs.py:333 +#, fuzzy +msgid "3 disks RAIDZ1" +msgstr "3 discs RAIDZ1" + +#: install_station/use_zfs.py:334 +#, fuzzy +msgid "4 disks RAIDZ2" +msgstr "4 discs RAIDZ2" + +#: install_station/use_zfs.py:335 +#, fuzzy +msgid "5 disks RAIDZ3" +msgstr "5 discs RAIDZ3" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "Pool Name" + +#: install_station/use_zfs.py:365 +#, fuzzy +msgid "Encrypt Disk" +msgstr "Encrypt Disc" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "Password" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "Verify it" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "Warning" + +#: install_station/use_zfs.py:548 +#, fuzzy +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "Smallest disc need to be SELECTED first!\n" + +#: install_station/use_zfs.py:549 +#, fuzzy +msgid "All the disk selected will reset." +msgstr "All the disc selected will reset." + +#~ msgid "" +#~ "Welcome! Please select your language to continue with the GhostBSD " +#~ "installation or live session." +#~ msgstr "" +#~ "Welcome! Please select your language to continue with the GhostBSD " +#~ "installation or live session." + +#~ msgid "Try GhostBSD" +#~ msgstr "Try GhostBSD" + +#, fuzzy +#~ msgid "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD\".\n" +#~ "To install GhostBSD on your computer hard disc drive, click \"Install " +#~ "GhostBSD\"." +#~ msgstr "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD.\"\n" +#~ "\n" +#~ "To install GhostBSD on your computer hard disc drive, click \"Install " +#~ "GhostBSD.\"\n" +#~ "\n" +#~ "Note: Select your preferred language from the list on the left. The " +#~ "installer supports multiple languages in both modes." + +#, fuzzy +#~ msgid "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD\".To install " +#~ "GhostBSD on your computer hard disc drive, click \"Install GhostBSD\"." +#~ msgstr "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD.\"\n" +#~ "\n" +#~ "To install GhostBSD on your computer hard disc drive, click \"Install " +#~ "GhostBSD.\"\n" +#~ "\n" +#~ "Note: Select your preferred language from the list on the left. The " +#~ "installer supports multiple languages in both modes." + +#~ msgid "Select the language you want to use with GhostBSD." +#~ msgstr "Select the language you want to use with GhostBSD." + +#~ msgid "Welcome To GhostBSD!" +#~ msgstr "Welcome To GhostBSD!" + +#, fuzzy +#~ msgid "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD.\"\n" +#~ "\n" +#~ "To install GhostBSD on your computer hard disc drive, click \"Install " +#~ "GhostBSD.\"\n" +#~ "\n" +#~ "Note: Select your preferred language from the list on the left. The " +#~ "installer supports multiple languages in both modes." +#~ msgstr "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD.\"\n" +#~ "\n" +#~ "To install GhostBSD on your computer hard disc drive, click \"Install " +#~ "GhostBSD.\"\n" +#~ "\n" +#~ "Note: Select your preferred language from the list on the left. The " +#~ "installer supports multiple languages in both modes." + +#, fuzzy +#~ msgid "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD.\"\n" +#~ " \n" +#~ "\n" +#~ "To install GhostBSD on your computer hard disk drive, click \"Install " +#~ "GhostBSD.\"\n" +#~ "\n" +#~ "Note: Language selection only works when selecting \"Try GhostBSD.\"\n" +#~ " When installing GhostBSD, the installation program is only in " +#~ "English." +#~ msgstr "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD.\"\n" +#~ "\n" +#~ "To install GhostBSD on your computer hard disc drive, click \"Install " +#~ "GhostBSD.\"\n" +#~ "\n" +#~ "Note: Language selection only works when selecting \"Try GhostBSD.\"\n" +#~ " When installing GhostBSD, the installation programme is only in " +#~ "English." diff --git a/po/en_US.po b/po/en_US.po new file mode 100644 index 0000000..eab8683 --- /dev/null +++ b/po/en_US.po @@ -0,0 +1,574 @@ +# English translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:25-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: English\n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "Boot Option" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "Setup rEFInd boot manager" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "Setup FreeBSD boot manager" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "FreeBSD {loader} loader only" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "Space not allowed" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "Super Weak" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "Very Weak" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "Fairly Weak" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "Weak" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "Strong" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "Fairly Strong" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "Very Strong" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "Super Strong" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "Create" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "Delete" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "Revert" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "Auto" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "Add Partition" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "Type:" + +#: install_station/custom.py:343 install_station/custom.py:580 +#, fuzzy +msgid "Size(MB):" +msgstr "Size(MB)" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "Mount point:" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "Partition Scheme" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "GPT: GUID Partition Table" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "MBR: DOS Partition" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot.Installation is complete. You need to restart " +"the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "Installation Completed" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "Restart" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "Continue" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "Installation Error" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "Installation has failed!" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "GhostBSD issue system" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." + +#: install_station/error.py:45 +msgid "Ok" +msgstr "Ok" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "How do you want to install GhostBSD?" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "Creating ghostbsd_installation.cfg" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "Deleting partition" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "Creating disk partition" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "Creating new partitions" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "Installation in progress" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "Back" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "Cancel" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "Next" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "Welcome to GhostBSD" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "Button" + +#: install_station/interface_controller.py:137 +#, fuzzy +msgid "Keyboard Setup" +msgstr "Keyboard Layout" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "Network Setup" + +#: install_station/interface_controller.py:160 +#, fuzzy +msgid "Try Or Install GhostBSD" +msgstr "Install GhostBSD" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "Installation Types" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "Custom Configuration" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "ZFS Configuration" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "Install" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "Installation Progress" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "Progress Bar" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "Type here to test your keyboard" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "Keyboard Layout" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "Keyboard Models" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "English (US)" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "English (Canada)" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "French (Canada)" + +#: install_station/language.py:93 install_station/language.py:197 +#, fuzzy +msgid "Please select your language:" +msgstr "Please select one drive" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "Language" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "Network card connected to the internet" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "Network card not connected to the internet" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "No network card detected" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "WiFi card detected and connected to an access point" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "WiFi card detected but not connected to an access point" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "WiFi card not detected or not supported" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "Wi-Fi Network Authentication Required" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "{ssid} Wi-Fi Network Authentication failed" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "Authentication required by {ssid} Wi-Fi Network" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "Password:" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "Show password" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" +"Please select 1 or more drive for stripe (select the smallest disk first)" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "Please select 2 drive for mirroring (select the smallest disk first)" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "Please select 3 drive for RAIDZ1 (select the smallest disk first)" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "Please select 4 drive for RAIDZ2 (select the smallest disk first)" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "Please select 5 drive for RAIDZ3 (select the smallest disk first)" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "Disk" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "Size(MB)" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "Name" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "Check" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "Please select one drive" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "Pool Type" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "1+ disks Stripe" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "2+ disks Mirror" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "3 disks RAIDZ1" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "4 disks RAIDZ2" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "5 disks RAIDZ3" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "Pool Name" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "Encrypt Disk" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "Password" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "Verify it" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "Warning" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "Smallest disk need to be SELECTED first!\n" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "All the disk selected will reset." + +#~ msgid "" +#~ "Welcome! Please select your language to continue with the GhostBSD " +#~ "installation or live session." +#~ msgstr "" +#~ "Welcome! Please select your language to continue with the GhostBSD " +#~ "installation or live session." + +#~ msgid "Try GhostBSD" +#~ msgstr "Try GhostBSD" + +#, fuzzy +#~ msgid "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD\".\n" +#~ "To install GhostBSD on your computer hard disc drive, click \"Install " +#~ "GhostBSD\"." +#~ msgstr "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD.\"\n" +#~ "\n" +#~ "To install GhostBSD on your computer hard disk drive, click \"Install " +#~ "GhostBSD.\"\n" +#~ "\n" +#~ "Note: Select your preferred language from the list on the left. The " +#~ "installer supports multiple languages in both modes." + +#, fuzzy +#~ msgid "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD\".To install " +#~ "GhostBSD on your computer hard disc drive, click \"Install GhostBSD\"." +#~ msgstr "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD.\"\n" +#~ "\n" +#~ "To install GhostBSD on your computer hard disk drive, click \"Install " +#~ "GhostBSD.\"\n" +#~ "\n" +#~ "Note: Select your preferred language from the list on the left. The " +#~ "installer supports multiple languages in both modes." + +#~ msgid "Select the language you want to use with GhostBSD." +#~ msgstr "Select the language you want to use with GhostBSD." + +#~ msgid "Welcome To GhostBSD!" +#~ msgstr "Welcome To GhostBSD!" + +#~ msgid "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD.\"\n" +#~ "\n" +#~ "To install GhostBSD on your computer hard disc drive, click \"Install " +#~ "GhostBSD.\"\n" +#~ "\n" +#~ "Note: Select your preferred language from the list on the left. The " +#~ "installer supports multiple languages in both modes." +#~ msgstr "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD.\"\n" +#~ "\n" +#~ "To install GhostBSD on your computer hard disc drive, click \"Install " +#~ "GhostBSD.\"\n" +#~ "\n" +#~ "Note: Select your preferred language from the list on the left. The " +#~ "installer supports multiple languages in both modes." + +#, fuzzy +#~ msgid "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD.\"\n" +#~ " \n" +#~ "\n" +#~ "To install GhostBSD on your computer hard disk drive, click \"Install " +#~ "GhostBSD.\"\n" +#~ "\n" +#~ "Note: Language selection only works when selecting \"Try GhostBSD.\"\n" +#~ " When installing GhostBSD, the installation program is only in " +#~ "English." +#~ msgstr "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD.\"\n" +#~ "\n" +#~ "To install GhostBSD on your computer hard disk drive, click \"Install " +#~ "GhostBSD.\"\n" +#~ "\n" +#~ "Note: Language selection only works when selecting \"Try GhostBSD.\"\n" +#~ " When installing GhostBSD, the installation program is only in " +#~ "English." diff --git a/po/es_ES.po b/po/es_ES.po new file mode 100644 index 0000000..4b19ec6 --- /dev/null +++ b/po/es_ES.po @@ -0,0 +1,463 @@ +# Spanish translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:19-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Spanish \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/et_EE.po b/po/et_EE.po new file mode 100644 index 0000000..3796122 --- /dev/null +++ b/po/et_EE.po @@ -0,0 +1,463 @@ +# Estonian translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:26-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Estonian \n" +"Language: et\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/fi_FI.po b/po/fi_FI.po new file mode 100644 index 0000000..505b683 --- /dev/null +++ b/po/fi_FI.po @@ -0,0 +1,463 @@ +# Finnish translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:24-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/fr_CA.po b/po/fr_CA.po new file mode 100644 index 0000000..4eb626e --- /dev/null +++ b/po/fr_CA.po @@ -0,0 +1,517 @@ +# French translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:35-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: French \n" +"Language: fr_CA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "Option de démarrage" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "Configurer le gestionnaire de démarrage rEFInd" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "Configurer le gestionnaire de démarrage FreeBSD" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "Chargeur FreeBSD {loader} uniquement" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "Espace non autorisé" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "Très faible" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "Très faible" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "Plutôt faible" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "Faible" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "Fort" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "Plutôt fort" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "Très fort" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "Très fort" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "Créer" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "Supprimer" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "Annuler" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "Automatique" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "Ajouter une partition" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "Type :" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "Taille (Mo) :" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "Point de montage :" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "Schéma de partition" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "GPT : Table de partition GUID" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "MBR : Partition DOS" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" +"L'installation est complète. Vous devez redémarrer\n" +"l'ordinateur pour utiliser la nouvelle installation.\n" +"Vous pouvez continuer à utiliser ce support live, bien que\n" +"tous les changements que vous apportez ou les documents\n" +"que vous sauvegardez ne seront pas préservés au redémarrage." + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "Installation complétée" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "Redémarrer" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "Continuer" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "Erreur d'installation" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "L'installation a échoué !" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "Système de signalement GhostBSD" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" +"Veuillez signaler le problème à {anchor}, et \n" +"assurez-vous de fournir /tmp/.pc-sysinstall/pc-sysinstall.log." + +#: install_station/error.py:45 +msgid "Ok" +msgstr "OK" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "Comment voulez-vous installer GhostBSD ?" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" +"Configuration des disques\n" +"Installer GhostBSD en utilisant les configurations Stripe, Mirror, RAIDZ1, " +"RAIDZ2, ou RAIDZ3." + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" +"Configuration multi-démarrage\n" +"Installer GhostBSD avec ZFS aux côtés d'autres systèmes d'exploitation." + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "Création de ghostbsd_installation.cfg" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "Suppression de la partition" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "Création de la partition de disque" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "Création de nouvelles partitions" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "Installation en cours" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" +"Merci d'avoir choisi GhostBSD !\n" +"\n" +"Nous croyons que chaque système d'exploitation devrait être simple, élégant, " +"sécurisé et protéger votre vie privée tout en étant facile à utiliser. " +"GhostBSD simplifie FreeBSD pour ceux qui manquent de l'expertise technique " +"nécessaire pour l'utiliser et abaisse le niveau d'entrée d'utilisation de " +"BSD. \n" +"\n" +"Nous espérons que vous apprécierez notre système d'exploitation BSD." + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "Retour" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "Annuler" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "Suivant" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "Bienvenue dans GhostBSD" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "Bouton" + +#: install_station/interface_controller.py:137 +#, fuzzy +msgid "Keyboard Setup" +msgstr "Disposition du clavier" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "Configuration réseau" + +#: install_station/interface_controller.py:160 +#, fuzzy +msgid "Try Or Install GhostBSD" +msgstr "Installer GhostBSD" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "Types d'installation" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "Configuration personnalisée" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "Configuration ZFS" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "Installer" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "Progrès de l'installation" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "Barre de progrès" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "Tapez ici pour tester votre clavier" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "Disposition du clavier" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "Modèles de clavier" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "Anglais (États-Unis)" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "Anglais (Canada)" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "Français (Canada)" + +#: install_station/language.py:93 install_station/language.py:197 +#, fuzzy +msgid "Please select your language:" +msgstr "Veuillez sélectionner un lecteur" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "Langue" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "Carte réseau connectée à l'internet" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "Carte réseau non connectée à l'internet" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "Aucune carte réseau détectée" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "Carte WiFi détectée et connectée à un point d'accès" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "Carte WiFi détectée mais non connectée à un point d'accès" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "Carte WiFi non détectée ou non supportée" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "Authentification du réseau Wi-Fi requise" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "L'authentification du réseau Wi-Fi {ssid} a échoué" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "Authentification requise par le réseau Wi-Fi {ssid}" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "Mot de passe :" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "Afficher le mot de passe" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" +"Veuillez sélectionner 1 ou plusieurs disques pour stripe (sélectionnez " +"d'abord le plus petit disque)" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" +"Veuillez sélectionner 2 disques pour la mise en miroir (sélectionnez d'abord " +"le plus petit disque)" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" +"Veuillez sélectionner 3 disques pour RAIDZ1 (sélectionnez d'abord le plus " +"petit disque)" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" +"Veuillez sélectionner 4 disques pour RAIDZ2 (sélectionnez d'abord le plus " +"petit disque)" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" +"Veuillez sélectionner 5 disques pour RAIDZ3 (sélectionnez d'abord le plus " +"petit disque)" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "Disque" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "Taille (Mo)" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "Nom" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "Vérifier" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "Veuillez sélectionner un lecteur" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "Type de pool" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "1+ disques Stripe" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "2+ disques Miroir" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "3 disques RAIDZ1" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "4 disques RAIDZ2" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "5 disques RAIDZ3" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "Nom du pool" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "Chiffrer le disque" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "Mot de passe" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "Vérifiez-le" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "Avertissement" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "Le plus petit disque doit être SÉLECTIONNÉ en premier !\n" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "Tous les disques sélectionnés seront remis à zéro." + +#~ msgid "" +#~ "Welcome! Please select your language to continue with the GhostBSD " +#~ "installation or live session." +#~ msgstr "" +#~ "Bienvenue ! Veuillez sélectionner votre langue pour continuer avec " +#~ "l'installation ou la session live de GhostBSD." + +#~ msgid "Try GhostBSD" +#~ msgstr "Essayer GhostBSD" + +#~ msgid "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD\".\n" +#~ "To install GhostBSD on your computer hard disc drive, click \"Install " +#~ "GhostBSD\"." +#~ msgstr "" +#~ "Pour utiliser GhostBSD sans l'installer, sélectionnez \"Essayer " +#~ "GhostBSD\".\n" +#~ "Pour installer GhostBSD sur le disque dur de votre ordinateur, cliquez " +#~ "sur \"Installer GhostBSD\"." diff --git a/po/fr_FR.po b/po/fr_FR.po new file mode 100644 index 0000000..70f095b --- /dev/null +++ b/po/fr_FR.po @@ -0,0 +1,517 @@ +# French translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 08:08-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: French \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "Option de démarrage" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "Configurer le gestionnaire de démarrage rEFInd" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "Configurer le gestionnaire de démarrage FreeBSD" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "Chargeur FreeBSD {loader} uniquement" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "Espace non autorisé" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "Très faible" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "Très faible" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "Plutôt faible" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "Faible" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "Fort" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "Plutôt fort" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "Très fort" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "Très fort" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "Créer" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "Supprimer" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "Annuler" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "Automatique" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "Ajouter une partition" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "Type :" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "Taille (Mo) :" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "Point de montage :" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "Schéma de partition" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "GPT : Table de partition GUID" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "MBR : Partition DOS" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" +"L'installation est terminée. Vous devez redémarrer\n" +"l'ordinateur pour utiliser la nouvelle installation.\n" +"Vous pouvez continuer à utiliser ce support live, bien que\n" +"tous les changements que vous apportez ou les documents\n" +"que vous sauvegardez ne seront pas préservés au redémarrage." + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "Installation terminée" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "Redémarrer" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "Continuer" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "Erreur d'installation" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "L'installation a échoué !" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "Système de signalement GhostBSD" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" +"Veuillez signaler le problème à {anchor}, et \n" +"assurez-vous de fournir /tmp/.pc-sysinstall/pc-sysinstall.log." + +#: install_station/error.py:45 +msgid "Ok" +msgstr "OK" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "Comment voulez-vous installer GhostBSD ?" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" +"Configuration des disques\n" +"Installer GhostBSD en utilisant les configurations Stripe, Mirror, RAIDZ1, " +"RAIDZ2, ou RAIDZ3." + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" +"Configuration multi-démarrage\n" +"Installer GhostBSD avec ZFS aux côtés d'autres systèmes d'exploitation." + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "Création de ghostbsd_installation.cfg" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "Suppression de la partition" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "Création de la partition de disque" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "Création de nouvelles partitions" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "Installation en cours" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" +"Merci d'avoir choisi GhostBSD !\n" +"\n" +"Nous croyons que chaque système d'exploitation devrait être simple, élégant, " +"sécurisé et protéger votre vie privée tout en étant facile à utiliser. " +"GhostBSD simplifie FreeBSD pour ceux qui manquent de l'expertise technique " +"nécessaire pour l'utiliser et abaisse le niveau d'entrée d'utilisation de " +"BSD. \n" +"\n" +"Nous espérons que vous apprécierez notre système d'exploitation BSD." + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "Retour" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "Annuler" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "Suivant" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "Bienvenue sur GhostBSD" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "Bouton" + +#: install_station/interface_controller.py:137 +#, fuzzy +msgid "Keyboard Setup" +msgstr "Disposition du clavier" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "Configuration réseau" + +#: install_station/interface_controller.py:160 +#, fuzzy +msgid "Try Or Install GhostBSD" +msgstr "Installer GhostBSD" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "Types d'installation" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "Configuration personnalisée" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "Configuration ZFS" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "Installer" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "Progression de l'installation" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "Barre de progression" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "Tapez ici pour tester votre clavier" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "Disposition du clavier" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "Modèles de clavier" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "Anglais (États-Unis)" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "Anglais (Canada)" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "Français (Canada)" + +#: install_station/language.py:93 install_station/language.py:197 +#, fuzzy +msgid "Please select your language:" +msgstr "Veuillez sélectionner un lecteur" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "Langue" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "Carte réseau connectée à Internet" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "Carte réseau non connectée à Internet" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "Aucune carte réseau détectée" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "Carte WiFi détectée et connectée à un point d'accès" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "Carte WiFi détectée mais non connectée à un point d'accès" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "Carte WiFi non détectée ou non prise en charge" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "Authentification du réseau Wi-Fi requise" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "L'authentification du réseau Wi-Fi {ssid} a échoué" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "Authentification requise par le réseau Wi-Fi {ssid}" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "Mot de passe :" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "Afficher le mot de passe" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" +"Veuillez sélectionner 1 ou plusieurs disques pour stripe (sélectionnez " +"d'abord le plus petit disque)" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" +"Veuillez sélectionner 2 disques pour la mise en miroir (sélectionnez d'abord " +"le plus petit disque)" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" +"Veuillez sélectionner 3 disques pour RAIDZ1 (sélectionnez d'abord le plus " +"petit disque)" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" +"Veuillez sélectionner 4 disques pour RAIDZ2 (sélectionnez d'abord le plus " +"petit disque)" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" +"Veuillez sélectionner 5 disques pour RAIDZ3 (sélectionnez d'abord le plus " +"petit disque)" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "Disque" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "Taille (Mo)" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "Nom" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "Vérifier" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "Veuillez sélectionner un lecteur" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "Type de pool" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "1+ disques Stripe" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "2+ disques Miroir" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "3 disques RAIDZ1" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "4 disques RAIDZ2" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "5 disques RAIDZ3" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "Nom du pool" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "Chiffrer le disque" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "Mot de passe" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "Vérifiez-le" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "Avertissement" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "Le plus petit disque doit être SÉLECTIONNÉ en premier !\n" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "Tous les disques sélectionnés seront réinitialisés." + +#~ msgid "" +#~ "Welcome! Please select your language to continue with the GhostBSD " +#~ "installation or live session." +#~ msgstr "" +#~ "Bienvenue ! Veuillez sélectionner votre langue pour continuer avec " +#~ "l'installation ou la session live de GhostBSD." + +#~ msgid "Try GhostBSD" +#~ msgstr "Essayez GhostBSD" + +#~ msgid "" +#~ "To run GhostBSD without installing, select \"Try GhostBSD\".\n" +#~ "To install GhostBSD on your computer hard disc drive, click \"Install " +#~ "GhostBSD\"." +#~ msgstr "" +#~ "Pour exécuter GhostBSD sans l'installer, sélectionnez \"Essayez " +#~ "GhostBSD\".\n" +#~ "Pour installer GhostBSD sur le disque dur de votre ordinateur, cliquez " +#~ "sur \"Installer GhostBSD\"." diff --git a/po/hr_HR.po b/po/hr_HR.po new file mode 100644 index 0000000..0fc093a --- /dev/null +++ b/po/hr_HR.po @@ -0,0 +1,464 @@ +# Croatian translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:26-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Croatian \n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\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<10 || n%100>=20) ? 1 : 2);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/hu_HU.po b/po/hu_HU.po new file mode 100644 index 0000000..d2fa1c7 --- /dev/null +++ b/po/hu_HU.po @@ -0,0 +1,463 @@ +# Hungarian translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:24-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/install-station.pot b/po/install-station.pot new file mode 100644 index 0000000..5a4c508 --- /dev/null +++ b/po/install-station.pot @@ -0,0 +1,463 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/it_IT.po b/po/it_IT.po new file mode 100644 index 0000000..efd0133 --- /dev/null +++ b/po/it_IT.po @@ -0,0 +1,463 @@ +# Italian translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:19-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/ja_JP.po b/po/ja_JP.po new file mode 100644 index 0000000..38b276b --- /dev/null +++ b/po/ja_JP.po @@ -0,0 +1,463 @@ +# Japanese translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:21-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/ko_KR.po b/po/ko_KR.po new file mode 100644 index 0000000..4aa0524 --- /dev/null +++ b/po/ko_KR.po @@ -0,0 +1,463 @@ +# Korean translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:25-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Korean \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/lt_LT.po b/po/lt_LT.po new file mode 100644 index 0000000..c149903 --- /dev/null +++ b/po/lt_LT.po @@ -0,0 +1,464 @@ +# Lithuanian translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:26-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"(n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/lv_LV.po b/po/lv_LV.po new file mode 100644 index 0000000..99d4093 --- /dev/null +++ b/po/lv_LV.po @@ -0,0 +1,464 @@ +# Latvian translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:26-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Latvian \n" +"Language: lv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " +"2);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/nl_NL.po b/po/nl_NL.po new file mode 100644 index 0000000..0fffec9 --- /dev/null +++ b/po/nl_NL.po @@ -0,0 +1,463 @@ +# Dutch translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:22-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Dutch \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/no_NO.po b/po/no_NO.po new file mode 100644 index 0000000..e1b79bc --- /dev/null +++ b/po/no_NO.po @@ -0,0 +1,463 @@ +# Norwegian translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:24-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Norwegian\n" +"Language: no\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/pl_PL.po b/po/pl_PL.po new file mode 100644 index 0000000..d298419 --- /dev/null +++ b/po/pl_PL.po @@ -0,0 +1,464 @@ +# Polish translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:22-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..0a2c350 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,464 @@ +# Portuguese translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:19-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/pt_PT.po b/po/pt_PT.po new file mode 100644 index 0000000..4cf2a9c --- /dev/null +++ b/po/pt_PT.po @@ -0,0 +1,463 @@ +# Portuguese translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:27-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/ro_RO.po b/po/ro_RO.po new file mode 100644 index 0000000..8223805 --- /dev/null +++ b/po/ro_RO.po @@ -0,0 +1,464 @@ +# Romanian translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:26-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2;\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/ru_RU.po b/po/ru_RU.po new file mode 100644 index 0000000..c6d9a0f --- /dev/null +++ b/po/ru_RU.po @@ -0,0 +1,464 @@ +# Russian translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:20-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\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<10 || n%100>=20) ? 1 : 2);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/sk_SK.po b/po/sk_SK.po new file mode 100644 index 0000000..77d2ae5 --- /dev/null +++ b/po/sk_SK.po @@ -0,0 +1,463 @@ +# Slovak translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:24-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/sl_SI.po b/po/sl_SI.po new file mode 100644 index 0000000..10072d1 --- /dev/null +++ b/po/sl_SI.po @@ -0,0 +1,464 @@ +# Slovenian translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:26-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Slovenian \n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/sv_SE.po b/po/sv_SE.po new file mode 100644 index 0000000..cd80e06 --- /dev/null +++ b/po/sv_SE.po @@ -0,0 +1,463 @@ +# Swedish translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:22-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/th_TH.po b/po/th_TH.po new file mode 100644 index 0000000..7e6da44 --- /dev/null +++ b/po/th_TH.po @@ -0,0 +1,462 @@ +# Thai translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:27-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Thai <(nothing)>\n" +"Language: th\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/tr_TR.po b/po/tr_TR.po new file mode 100644 index 0000000..eee501c --- /dev/null +++ b/po/tr_TR.po @@ -0,0 +1,463 @@ +# Turkish translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:24-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/vi_VN.po b/po/vi_VN.po new file mode 100644 index 0000000..3ee1a6a --- /dev/null +++ b/po/vi_VN.po @@ -0,0 +1,463 @@ +# Vietnamese translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:27-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..7b588aa --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,462 @@ +# Chinese translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:21-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Chinese (simplified) \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100644 index 0000000..95a7874 --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,462 @@ +# Chinese translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Eric Turgeon , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-07-12 21:21-0300\n" +"PO-Revision-Date: 2025-07-09 20:25-0300\n" +"Last-Translator: Eric Turgeon \n" +"Language-Team: Chinese (traditional) \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" + +#: install_station/boot_manager.py:121 +#: install_station/interface_controller.py:201 +msgid "Boot Option" +msgstr "" + +#: install_station/boot_manager.py:135 +msgid "Setup rEFInd boot manager" +msgstr "" + +#: install_station/boot_manager.py:149 +msgid "Setup FreeBSD boot manager" +msgstr "" + +#: install_station/boot_manager.py:164 +#, python-brace-format +msgid "FreeBSD {loader} loader only" +msgstr "" + +#: install_station/common.py:108 +msgid "Space not allowed" +msgstr "" + +#: install_station/common.py:110 install_station/common.py:112 +msgid "Super Weak" +msgstr "" + +#: install_station/common.py:114 install_station/common.py:120 +msgid "Very Weak" +msgstr "" + +#: install_station/common.py:116 install_station/common.py:122 +#: install_station/common.py:128 +msgid "Fairly Weak" +msgstr "" + +#: install_station/common.py:118 install_station/common.py:124 +#: install_station/common.py:130 install_station/common.py:136 +msgid "Weak" +msgstr "" + +#: install_station/common.py:126 install_station/common.py:132 +#: install_station/common.py:138 install_station/common.py:144 +msgid "Strong" +msgstr "" + +#: install_station/common.py:134 install_station/common.py:140 +#: install_station/common.py:146 install_station/common.py:152 +msgid "Fairly Strong" +msgstr "" + +#: install_station/common.py:142 install_station/common.py:148 +msgid "Very Strong" +msgstr "" + +#: install_station/common.py:150 install_station/common.py:154 +msgid "Super Strong" +msgstr "" + +#: install_station/custom.py:248 +msgid "Create" +msgstr "" + +#: install_station/custom.py:252 +msgid "Delete" +msgstr "" + +#: install_station/custom.py:256 +msgid "Revert" +msgstr "" + +#: install_station/custom.py:260 +msgid "Auto" +msgstr "" + +#: install_station/custom.py:328 install_station/custom.py:566 +msgid "Add Partition" +msgstr "" + +#: install_station/custom.py:342 +msgid "Type:" +msgstr "" + +#: install_station/custom.py:343 install_station/custom.py:580 +msgid "Size(MB):" +msgstr "" + +#: install_station/custom.py:344 +msgid "Mount point:" +msgstr "" + +#: install_station/custom.py:496 +msgid "Partition Scheme" +msgstr "" + +#: install_station/custom.py:515 +msgid "GPT: GUID Partition Table" +msgstr "" + +#: install_station/custom.py:516 +msgid "MBR: DOS Partition" +msgstr "" + +#: install_station/end.py:10 +msgid "" +"Installation is complete. You need to restart the\n" +"computer in order to use the new installation.\n" +"You can continue to use this live media, although\n" +"any changes you make or documents you save will\n" +"not be preserved on reboot." +msgstr "" + +#: install_station/end.py:31 +msgid "Installation Completed" +msgstr "" + +#: install_station/end.py:47 +msgid "Restart" +msgstr "" + +#: install_station/end.py:49 +msgid "Continue" +msgstr "" + +#: install_station/error.py:17 +msgid "Installation Error" +msgstr "" + +#: install_station/error.py:28 +msgid "Installation has failed!" +msgstr "" + +#: install_station/error.py:33 +msgid "GhostBSD issue system" +msgstr "" + +#: install_station/error.py:35 +#, python-brace-format +msgid "" +"Please report the issue to {anchor}, and \n" +"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log." +msgstr "" + +#: install_station/error.py:45 +msgid "Ok" +msgstr "" + +#: install_station/install_type.py:52 +msgid "How do you want to install GhostBSD?" +msgstr "" + +#: install_station/install_type.py:58 +msgid "" +"Disks Configuration\n" +"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 " +"configurations." +msgstr "" + +#: install_station/install_type.py:71 +msgid "" +"Multi-Boot Configuration\n" +"Install GhostBSD with ZFS alongside other operating systems." +msgstr "" + +#: install_station/install.py:46 +msgid "Creating ghostbsd_installation.cfg" +msgstr "" + +#: install_station/install.py:50 +msgid "Deleting partition" +msgstr "" + +#: install_station/install.py:55 +msgid "Creating disk partition" +msgstr "" + +#: install_station/install.py:60 +msgid "Creating new partitions" +msgstr "" + +#: install_station/install.py:90 +msgid "Installation in progress" +msgstr "" + +#: install_station/install.py:102 +msgid "" +"Thank you for choosing GhostBSD!\n" +"\n" +"We believe every computer operating system should be simple, elegant, secure " +"and protect your privacy while being easy to use. GhostBSD is simplifying " +"FreeBSD for those who lack the technical expertise required to use it and " +"lower the entry-level of using BSD. \n" +"\n" +"We hope you'll enjoy our BSD operating system." +msgstr "" + +#: install_station/interface_controller.py:9 +#: install_station/interface_controller.py:20 +msgid "Back" +msgstr "" + +#: install_station/interface_controller.py:11 +#: install_station/interface_controller.py:21 +msgid "Cancel" +msgstr "" + +#: install_station/interface_controller.py:13 +#: install_station/interface_controller.py:22 +#: install_station/interface_controller.py:257 +msgid "Next" +msgstr "" + +#: install_station/interface_controller.py:106 +#: install_station/interface_controller.py:107 install_station/language.py:101 +msgid "Welcome to GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:116 +msgid "Button" +msgstr "" + +#: install_station/interface_controller.py:137 +msgid "Keyboard Setup" +msgstr "" + +#: install_station/interface_controller.py:149 +#: install_station/interface_controller.py:234 +#: install_station/interface_controller.py:239 +msgid "Network Setup" +msgstr "" + +#: install_station/interface_controller.py:160 +msgid "Try Or Install GhostBSD" +msgstr "" + +#: install_station/interface_controller.py:170 +msgid "Installation Types" +msgstr "" + +#: install_station/interface_controller.py:181 +msgid "Custom Configuration" +msgstr "" + +#: install_station/interface_controller.py:191 +msgid "ZFS Configuration" +msgstr "" + +#: install_station/interface_controller.py:203 +msgid "Install" +msgstr "" + +#: install_station/interface_controller.py:213 +msgid "Installation Progress" +msgstr "" + +#: install_station/interface_controller.py:220 +msgid "Progress Bar" +msgstr "" + +#: install_station/keyboard.py:40 +msgid "Type here to test your keyboard" +msgstr "" + +#: install_station/keyboard.py:97 +msgid "Keyboard Layout" +msgstr "" + +#: install_station/keyboard.py:117 +msgid "Keyboard Models" +msgstr "" + +#: install_station/keyboard.py:225 +msgid "English (US)" +msgstr "" + +#: install_station/keyboard.py:226 +msgid "English (Canada)" +msgstr "" + +#: install_station/keyboard.py:227 +msgid "French (Canada)" +msgstr "" + +#: install_station/language.py:93 install_station/language.py:197 +msgid "Please select your language:" +msgstr "" + +#: install_station/language.py:99 install_station/language.py:116 +msgid "Language" +msgstr "" + +#: install_station/network_setup.py:107 install_station/network_setup.py:184 +msgid "Network card connected to the internet" +msgstr "" + +#: install_station/network_setup.py:113 install_station/network_setup.py:190 +msgid "Network card not connected to the internet" +msgstr "" + +#: install_station/network_setup.py:116 install_station/network_setup.py:193 +msgid "No network card detected" +msgstr "" + +#: install_station/network_setup.py:125 install_station/network_setup.py:203 +msgid "WiFi card detected and connected to an access point" +msgstr "" + +#: install_station/network_setup.py:129 install_station/network_setup.py:207 +msgid "WiFi card detected but not connected to an access point" +msgstr "" + +#: install_station/network_setup.py:132 install_station/network_setup.py:210 +msgid "WiFi card not detected or not supported" +msgstr "" + +#: install_station/network_setup.py:366 +msgid "Wi-Fi Network Authentication Required" +msgstr "" + +#: install_station/network_setup.py:379 +#, python-brace-format +msgid "{ssid} Wi-Fi Network Authentication failed" +msgstr "" + +#: install_station/network_setup.py:381 +#, python-brace-format +msgid "Authentication required by {ssid} Wi-Fi Network" +msgstr "" + +#: install_station/network_setup.py:384 +msgid "Password:" +msgstr "" + +#: install_station/network_setup.py:387 +msgid "Show password" +msgstr "" + +#: install_station/try_install.py:102 +msgid "What would you like to do?" +msgstr "" + +#: install_station/try_install.py:109 +msgid "" +"Install GhostBSD\n" +"Install GhostBSD on your computer." +msgstr "" + +#: install_station/try_install.py:122 +msgid "" +"Try GhostBSD\n" +"Run GhostBSD without installing to your computer." +msgstr "" + +#: install_station/use_zfs.py:160 +msgid "" +"Please select 1 or more drive for stripe (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:167 +msgid "Please select 2 drive for mirroring (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:175 +msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:182 +msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:189 +msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)" +msgstr "" + +#: install_station/use_zfs.py:292 +msgid "Disk" +msgstr "" + +#: install_station/use_zfs.py:299 +msgid "Size(MB)" +msgstr "" + +#: install_station/use_zfs.py:305 +msgid "Name" +msgstr "" + +#: install_station/use_zfs.py:309 +msgid "Check" +msgstr "" + +#: install_station/use_zfs.py:322 +msgid "Please select one drive" +msgstr "" + +#: install_station/use_zfs.py:327 +msgid "Pool Type" +msgstr "" + +#: install_station/use_zfs.py:331 +msgid "1+ disks Stripe" +msgstr "" + +#: install_station/use_zfs.py:332 +msgid "2+ disks Mirror" +msgstr "" + +#: install_station/use_zfs.py:333 +msgid "3 disks RAIDZ1" +msgstr "" + +#: install_station/use_zfs.py:334 +msgid "4 disks RAIDZ2" +msgstr "" + +#: install_station/use_zfs.py:335 +msgid "5 disks RAIDZ3" +msgstr "" + +#: install_station/use_zfs.py:345 +msgid "Pool Name" +msgstr "" + +#: install_station/use_zfs.py:365 +msgid "Encrypt Disk" +msgstr "" + +#: install_station/use_zfs.py:369 +msgid "Password" +msgstr "" + +#: install_station/use_zfs.py:376 +msgid "Verify it" +msgstr "" + +#: install_station/use_zfs.py:537 +msgid "Warning" +msgstr "" + +#: install_station/use_zfs.py:548 +msgid "Smallest disk need to be SELECTED first!\n" +msgstr "" + +#: install_station/use_zfs.py:549 +msgid "All the disk selected will reset." +msgstr "" diff --git a/setup.py b/setup.py index 454f8a7..d5340c2 100755 --- a/setup.py +++ b/setup.py @@ -1,56 +1,184 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- +""" +Setup script for Install Station. +Install Station is a streamlined installer for GhostBSD, providing +a GTK+ interface for disk partitioning and OS installation. +""" import os import sys -# from glob import glob -from setuptools import setup +from setuptools import setup, Command +import glob +from DistUtilsExtra.command.build_extra import build_extra +from DistUtilsExtra.command.build_i18n import build_i18n +from DistUtilsExtra.command.clean_i18n import clean_i18n -# import DistUtilsExtra.command.build_extra -# import DistUtilsExtra.command.build_i18n -# import DistUtilsExtra.command.clean_i18n - -# to update i18n .mo files (and merge .pot file into .po files) run on Linux: -# ,,python setup.py build_i18n -m'' - -# silence pyflakes, __VERSION__ is properly assigned below... +prefix = sys.prefix __VERSION__ = '0.1' - -# for line in open('gbinstall', 'r').readlines(): -# if (line.startswith('__VERSION__')): -# exec(line.strip()) PROGRAM_VERSION = __VERSION__ -def datafilelist(installbase, sourcebase): - datafileList = [] - for root, subFolders, files in os.walk(sourcebase): - fileList = [] +def data_file_list(install_base, source_base): + """ + Generate list of data files for installation. + + Args: + install_base: Base installation path + source_base: Source directory to scan + + Returns: + List of (install_path, files) tuples for setuptools + """ + data = [] + for root, subFolders, files in os.walk(source_base): + file_list = [] for f in files: - fileList.append(os.path.join(root, f)) - datafileList.append((root.replace(sourcebase, installbase), fileList)) - return datafileList + file_list.append(os.path.join(root, f)) + # Only add directories that actually have files + if file_list: + data.append((root.replace(source_base, install_base), file_list)) + return data -prefix = sys.prefix +class UpdateTranslationsCommand(Command): + """Custom command to extract messages and update .po files.""" + + description = 'Extract messages to .pot and update .po' + user_options = [] # No custom options + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + # Define paths + pot_file = 'po/install-station.pot' + po_files = glob.glob('po/*.po') + + # Check if .pot file exists, create it if it doesn't + if not os.path.exists(pot_file): + print(f"POT file {pot_file} does not exist. Creating it...") + else: + print("Updating existing .pot file...") + + # Step 1: Extract messages to .pot file (create or update) + print("Extracting messages to .pot file...") + os.system( + f'xgettext --from-code=UTF-8 -L Python --keyword=get_text -o {pot_file}' + ' install_station/*.py install-station' + ) + + # Verify .pot file was created successfully + if not os.path.exists(pot_file): + print(f"Error: Failed to create {pot_file}") + return + + # Step 2: Update .po files with the new .pot file + print("Updating .po files with new translations...") + for po_file in po_files: + print(f"Updating {po_file}...") + os.system(f'msgmerge -U {po_file} {pot_file}') + print("Translation update complete.") + + +class CreateTranslationCommand(Command): + """Custom command to create a new .po file for a specific language.""" + locale = None + description = 'Create a new .po file for the specified language' + user_options = [ + ('locale=', 'l', 'Locale code for the new translation (e.g., fr, es)') + ] + + def initialize_options(self): + self.locale = None # Initialize the locale option to None + + def finalize_options(self): + if self.locale is None: + raise Exception("You must specify the locale code (e.g., --locale=fr)") + + def run(self): + # Define paths + pot_file = 'po/install-station.pot' + po_dir = 'po' + po_file = os.path.join(po_dir, f'{self.locale}.po') + # Check if the .pot file exists + if not os.path.exists(pot_file): + print("Extracting messages to .pot file...") + os.system( + f'xgettext --from-code=UTF-8 -L Python --keyword=get_text -o {pot_file}' + ' install_station/*.py install-station' + ) + # Create the new .po file + if not os.path.exists(po_file): + print(f"Creating new {po_file} for locale '{self.locale}'...") + os.makedirs(po_dir, exist_ok=True) + os.system(f'msginit --locale={self.locale} --input={pot_file} --output-file={po_file}') + else: + print(f"PO file for locale '{self.locale}' already exists: {po_file}") + + +lib_install_station_image = [ + 'src/image/G_logo.gif', + 'src/image/install-gbsd.png', + 'src/image/logo.png', + 'src/image/disk.png', + 'src/image/laptop.png', + 'src/image/installation.jpg' +] + +lib_install_station_backend_query = [ + 'src/backend-query/detect-laptop.sh', + 'src/backend-query/detect-nics.sh', + 'src/backend-query/detect-scheme.sh', + 'src/backend-query/detect-vmware.sh', + 'src/backend-query/detect-wifi.sh', + 'src/backend-query/disk-info.sh', + 'src/backend-query/disk-label.sh', + 'src/backend-query/disk-list.sh', + 'src/backend-query/disk-part.sh', + 'src/backend-query/enable-net.sh', + 'src/backend-query/list-components.sh', + 'src/backend-query/list-rsync-backups.sh', + 'src/backend-query/list-tzones.sh', + 'src/backend-query/query-langs.sh', + 'src/backend-query/send-logs.sh', + 'src/backend-query/setup-ssh-keys.sh', + 'src/backend-query/sys-mem.sh', + 'src/backend-query/test-live.sh', + 'src/backend-query/test-netup.sh', + 'src/backend-query/update-part-list.sh', + 'src/backend-query/xkeyboard-layouts.sh', + 'src/backend-query/xkeyboard-models.sh', + 'src/backend-query/xkeyboard-variants.sh' +] -# data_files.extend(datafilelist('{prefix}/share/locale'.format(prefix=sys.prefix), 'build/mo')) +data_files = [ + (f'{prefix}/lib/install-station', ['src/ghostbsd-style.css']), + (f'{prefix}/lib/install-station/backend-query', lib_install_station_backend_query), + (f'{prefix}/lib/install-station/image', lib_install_station_image) +] -# cmdclass ={ -# "build" : DistUtilsExtra.command.build_extra.build_extra, -# "build_i18n" : DistUtilsExtra.command.build_i18n.build_i18n, -# "clean": DistUtilsExtra.command.clean_i18n.clean_i18n, -# } +data_files.extend(data_file_list(f'{prefix}/share/locale', 'build/mo')) setup( name="install-station", version=PROGRAM_VERSION, - description="install-station is a stripdown version of gbi", + description="Install Station - Streamlined GhostBSD installer", license='BSD', author='Eric Turgeon', url='https://github/GhostBSD/install-station/', package_dir={'': '.'}, install_requires=['setuptools'], - scripts=['install-station'] + packages=['install_station'], + scripts=['install-station'], + data_files=data_files, + cmdclass={ + 'create_translation': CreateTranslationCommand, + 'update_translations': UpdateTranslationsCommand, + "build": build_extra, + "build_i18n": build_i18n, + "clean": clean_i18n + } ) -# cmdclass = cmdclass, diff --git a/src/backend-query/detect-laptop.sh b/src/backend-query/detect-laptop.sh new file mode 100755 index 0000000..bf42842 --- /dev/null +++ b/src/backend-query/detect-laptop.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +dmesgLine=`dmesg | grep "acpi_acad0"` +if test "${dmesgLine}" = ""; then + echo "laptop: NO" +else + echo "laptop: YES" +fi diff --git a/src/backend-query/detect-nics.sh b/src/backend-query/detect-nics.sh new file mode 100755 index 0000000..ead211d --- /dev/null +++ b/src/backend-query/detect-nics.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +rm /tmp/netCards 2>/dev/null +touch /tmp/netCards + +config="`ifconfig -l`" + +for i in $config +do + echo "${i}" | grep -e "lo0" -e "^fwe" -e "^fwip" -e "lo1" -e "^plip" -e "^pfsync" -e "^pflog" -e "^tun" >/dev/null 2>/dev/null + if [ "$?" != "0" ] + then + IDENT="<`dmesg | grep ^${i} | grep -v "miibus" | grep '<' | cut -d '<' -f 2 | cut -d '>' -f 1 | head -1`>" + echo "${i}: $IDENT" + fi +done diff --git a/src/backend-query/detect-sheme.sh b/src/backend-query/detect-sheme.sh new file mode 100644 index 0000000..cbc9c5e --- /dev/null +++ b/src/backend-query/detect-sheme.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# +# Copyright (c) 2009-2012, GhostBSD. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistribution's of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistribution's in binary form must reproduce the above +# copyright notice,this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# +# 3. Neither then name of GhostBSD Project nor the names of its +# contributors maybe used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# /usr/local/etc/install-station/detect-sheme.sh v 0.1 Wed May 1 20:31:52 ADT 2013 Eric Turgeon +# +# Detect a disk sheme and display them. +# + + +DISK="${1}" +TMPDIR=${TMPDIR:-"/tmp"} +# Display if this is GPT or MBR formatted +gpart show ${1} | grep "GPT" >/dev/null 2>/dev/null +if [ "$?" = "0" ] ; then + #echo "${1}-format: GPT" + TYPE="GPT" +else + #echo "${1}-format: MBR" + TYPE="MBR" +fi + +echo ${TYPE} diff --git a/src/backend-query/detect-vmware.sh b/src/backend-query/detect-vmware.sh new file mode 100755 index 0000000..74b32db --- /dev/null +++ b/src/backend-query/detect-vmware.sh @@ -0,0 +1,12 @@ +#!/bin/sh + + +pciconf -lv | grep -i vmware >/dev/null 2>/dev/null +if [ "$?" = "0" ] +then + echo "vmware: YES" + exit 0 +else + echo "vmware: NO" + exit 1 +fi diff --git a/src/backend-query/detect-wifi.sh b/src/backend-query/detect-wifi.sh new file mode 100644 index 0000000..985ebc6 --- /dev/null +++ b/src/backend-query/detect-wifi.sh @@ -0,0 +1,8 @@ +#!/bin/sh +NIC="$1" +ifconfig ${NIC} | grep -q "802.11" 2>/dev/null +if [ $? -eq 0 ]; then + echo 'yes' +else + echo 'no' +fi diff --git a/src/backend-query/disk-info.sh b/src/backend-query/disk-info.sh new file mode 100755 index 0000000..464df45 --- /dev/null +++ b/src/backend-query/disk-info.sh @@ -0,0 +1,72 @@ +#!/bin/sh +# Query a disk for partitions and display them +############################# + + +if [ -z "${1}" ] +then + echo "Error: No disk specified!" + exit 1 +fi + +if [ ! -e "/dev/${1}" ] +then + echo "Error: Disk /dev/${1} does not exist!" + exit 1 +fi + +# Function to convert bytes to megabytes +convert_byte_to_megabyte() +{ + if [ -z "${1}" ] + then + echo "Error: No bytes specified!" + exit 1 + fi + + expr -e ${1} / 1048576 +}; + +# Function which returns a target disks cylinders +get_disk_cyl() +{ + cyl=`diskinfo -v ${1} | grep "# Cylinders" | tr -s ' ' | cut -f 2` + export VAL="${cyl}" +}; +DISK="${1}" + +# Function which returns a target disks heads +get_disk_heads() +{ + head=`diskinfo -v ${1} | grep "# Heads" | tr -s ' ' | cut -f 2` + export VAL="${head}" +}; + +# Function which returns a target disks sectors +get_disk_sectors() +{ + sec=`diskinfo -v ${1} | grep "# Sectors" | tr -s ' ' | cut -f 2` + export VAL="${sec}" +}; + +get_disk_cyl "${DISK}" +CYLS="${VAL}" + +get_disk_heads "${DISK}" +HEADS="${VAL}" + +get_disk_sectors "${DISK}" +SECS="${VAL}" + +#echo "cylinders=${CYLS}" +#echo "heads=${HEADS}" +#echo "sectors=${SECS}" + +# Now get the disks size in MB +KB="`diskinfo -v ${1} | grep 'bytes' | cut -d '#' -f 1 | tr -s '\t' ' ' | tr -d ' '`" +MB=$(convert_byte_to_megabyte ${KB}) +#echo "size=$MB" +echo "$MB" +# Now get the Controller Type +CTYPE="`dmesg | grep "^${1}:" | grep "B <" | cut -d '>' -f 2 | cut -d ' ' -f 3-10`" +#echo "type=$CTYPE" diff --git a/src/backend-query/disk-label.sh b/src/backend-query/disk-label.sh new file mode 100644 index 0000000..2f52d78 --- /dev/null +++ b/src/backend-query/disk-label.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# Query a disk for partitions and display them +############################# + + +DISK="${1}" +TMPDIR=${TMPDIR:-"/tmp"} +# Display if this is GPT or MBR formatted +gpart show ${1} | grep "GPT" >/dev/null 2>/dev/null +if [ "$?" = "0" ] ; then + #echo "${1}-format: GPT" + TYPE="GPT" +else + #echo "${1}-format: MBR" + TYPE="MBR" +fi + +if [ "$TYPE" = "MBR" ] ; then + sp="s" +else + sp="p" +fi + +# Get a listing of partitions on this disk +gpart show ${DISK} | grep -v ${DISK} | tr -s '\t' ' ' | cut -d ' ' -f 4,3,5 >${TMPDIR}/disk-${DISK} +while read i +do + + if [ ! -z "${i}" ] ; then + BLOCK="`echo ${i} | cut -d ' ' -f 1`" + MB="`expr ${BLOCK} / 2048`MB" + fi + if [ ! "${MB}" = "0MB" ] ; then + FS="`echo ${i} | cut -d ' ' -f 3`" + SLICE="`echo ${i} | cut -d ' ' -f 2`" + if [ "$SLICE" = '-' ] ; then + echo "${MB} freespace none" + else + if [ ! -z "$SLICE" ] ; then + echo "${MB} ${SLICE} ${FS}" + fi + fi + fi + +done <${TMPDIR}/disk-${DISK} diff --git a/src/backend-query/disk-list.sh b/src/backend-query/disk-list.sh new file mode 100755 index 0000000..c9241d6 --- /dev/null +++ b/src/backend-query/disk-list.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +# Create our device listing +SYSDISK=$(sysctl -n kern.disks) + +# Now loop through these devices, and list the disk drives +for i in ${SYSDISK} +do + + # Get the current device + DEV="${i}" + + # Make sure we don't find any cd devices + case "${DEV}" in + acd[0-9]*|cd[0-9]*|scd[0-9]*) continue ;; + esac + + # Check the dmesg output for some more info about this device + NEWLINE=$(dmesg | sed -n "s/^$DEV: .*<\(.*\)>.*$/ <\1>/p" | head -n 1) + if [ -z "$NEWLINE" ]; then + NEWLINE=" " + fi + + # Save the disk list + if [ ! -z "$DLIST" ] + then + DLIST="\n${DLIST}" + fi + + DLIST="${DEV} ${NEWLINE}${DLIST}" + +done + +# Echo out the found line +echo -e "$DLIST" | sort diff --git a/src/backend-query/disk-part.sh b/src/backend-query/disk-part.sh new file mode 100755 index 0000000..69f6584 --- /dev/null +++ b/src/backend-query/disk-part.sh @@ -0,0 +1,49 @@ +#!/bin/sh +# Query a disk for partitions and display them +############################# + + +DISK="${1}" +TMPDIR=${TMPDIR:-"/tmp"} +# Display if this is GPT or MBR formatted +gpart show ${DISK} | grep "GPT" >/dev/null 2>/dev/null +if [ "$?" = "0" ] ; then + #echo "${1}-format: GPT" + TYPE="GPT" +else + #echo "${1}-format: MBR" + TYPE="MBR" +fi + +if [ "$TYPE" = "MBR" ] ; then + sp="s" +else + sp="p" +fi + +# Get a listing of partitions on this disk +gpart show ${DISK} | grep -v ${DISK} | tr -s '\t' ' ' | cut -d ' ' -f 4,3,5 >${TMPDIR}/disk-${DISK} +while read i +do + if [ ! -z "${i}" ] ; then + BLOCK="`echo ${i} | cut -d ' ' -f 1`" + if [ "${BLOCK}" -ge 2048 ] ; then + MB="`expr ${BLOCK} / 2048`" + else + MB="1" + fi + fi + if [ ! "${MB}" = "0" ] ; then + LABEL="`echo ${i} | cut -d ' ' -f 3`" + SLICE="`echo ${i} | cut -d ' ' -f 2`" + if [ "$SLICE" = '-' ] ; then + if [ ! "${MB}" = "1" ] ; then + echo "freespace ${MB} none" + fi + else + if [ ! -z "$SLICE" ] ; then + echo "${DISK}${sp}${SLICE} ${MB} ${LABEL} " + fi + fi + fi +done <${TMPDIR}/disk-${DISK} diff --git a/src/backend-query/enable-net.sh b/src/backend-query/enable-net.sh new file mode 100755 index 0000000..ca3115d --- /dev/null +++ b/src/backend-query/enable-net.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# Script which enables networking with specified options +########################################################################### + +. ${PROGDIR}/backend/functions.sh +. ${PROGDIR}/conf/pc-sysinstall.conf +. ${BACKEND}/functions-networking.sh +. ${BACKEND}/functions-parse.sh + + +NIC="$1" +IP="$2" +NETMASK="$3" +DNS="$4" +GATEWAY="$5" +MIRRORFETCH="$6" + +if [ -z "${NIC}" ] +then + echo "ERROR: Usage enable-net " + exit 150 +fi + +if [ "$NIC" = "AUTO-DHCP" ] +then + enable_auto_dhcp +else + echo "Enabling NIC: $NIC" + ifconfig ${NIC} ${IP} ${NETMASK} + + echo "nameserver ${DNS}" >/etc/resolv.conf + + route add default ${GATE} +fi + +case ${MIRRORFETCH} in + ON|on|yes|YES) fetch -o /tmp/mirrors-list.txt ${MIRRORLIST} >/dev/null 2>/dev/null;; + *) ;; +esac diff --git a/src/backend-query/list-components.sh b/src/backend-query/list-components.sh new file mode 100755 index 0000000..6833dc7 --- /dev/null +++ b/src/backend-query/list-components.sh @@ -0,0 +1,28 @@ +#!/bin/sh +# Script which lists the available components for this release +########################################################################### + +. ${PROGDIR}/backend/functions.sh + +echo "Available Components:" + +cd ${COMPDIR} +for i in `ls -d *` +do + if [ -e "${i}/component.cfg" -a -e "${i}/install.sh" -a -e "${i}/distfiles" ] + then + NAME="`grep 'name:' ${i}/component.cfg | cut -d ':' -f 2`" + DESC="`grep 'description:' ${i}/component.cfg | cut -d ':' -f 2`" + TYPE="`grep 'type:' ${i}/component.cfg | cut -d ':' -f 2`" + echo " " + echo "name: ${i}" + echo "desc:${DESC}" + echo "type:${TYPE}" + if [ -e "${i}/component.png" ] + then + echo "icon: ${COMPDIR}/${i}/component.png" + fi + fi + +done + diff --git a/src/backend-query/list-rsync-backups.sh b/src/backend-query/list-rsync-backups.sh new file mode 100755 index 0000000..6b32fb1 --- /dev/null +++ b/src/backend-query/list-rsync-backups.sh @@ -0,0 +1,44 @@ +#!/bin/sh +# Script which lists the backups present on a server +########################################################################### + +. ${PROGDIR}/backend/functions.sh + +SSHUSER=$1 +SSHHOST=$2 +SSHPORT=$3 + +if [ -z "${SSHHOST}" -o -z "${SSHPORT}" ] +then + echo "ERROR: Usage list-rsync-backups.sh " + exit 150 +fi + +# Look for full-system backups, needs at minimum a kernel to be bootable +FINDCMD="find . -type d -maxdepth 6 -name 'kernel' | grep '/boot/kernel'" + +# Get a listing of the number of full backups saved +OLDBACKUPS=`ssh -o 'BatchMode=yes' -p ${SSHPORT} ${SSHUSER}@${SSHHOST} "${FINDCMD}"` +if [ "$?" = "0" ] +then + for i in ${OLDBACKUPS} + do + BACKPATH="`echo ${i} | sed 's|/boot/.*||g' | sed 's|^./||g'`" + if [ -z "${BACKLIST}" ] + then + BACKLIST="${BACKPATH}" + else + BACKLIST="${BACKLIST}:${BACKPATH}" + fi + done + + if [ -z "${BACKLIST}" ] + then + echo "NONE" + else + echo "$BACKLIST" + fi + +else + echo "FAILED" +fi diff --git a/src/backend-query/list-tzones.sh b/src/backend-query/list-tzones.sh new file mode 100755 index 0000000..3f8d335 --- /dev/null +++ b/src/backend-query/list-tzones.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +rm ${TMPDIR}/.tzonetmp >/dev/null 2>/dev/null + +# Backend script which lists all the available timezones for front-ends to display +while read line +do + echo "$line" | grep "^#" >/dev/null 2>/dev/null + if [ "$?" != "0" ] + then + echo "$line" | tr -s "\t" ":" | cut -d ":" -f 3-4 >>${TMPDIR}/.tzonetmp + fi +done < /usr/share/zoneinfo/zone.tab + +sort ${TMPDIR}/.tzonetmp +rm -f ${TMPDIR}/.tzonetmp >/dev/null 2>/dev/null + +exit 0 diff --git a/src/backend-query/query-langs.sh b/src/backend-query/query-langs.sh new file mode 100755 index 0000000..7951ca6 --- /dev/null +++ b/src/backend-query/query-langs.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +FOUND="0" + +cat ${PROGDIR}/conf/avail-langs + +exit 0 diff --git a/src/backend-query/send-logs.sh b/src/backend-query/send-logs.sh new file mode 100755 index 0000000..c182b22 --- /dev/null +++ b/src/backend-query/send-logs.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# Script which creates a gzipped log and optionally mails it to the specified address +############################################################################ + +. ${PROGDIR}/backend/functions.sh +. ${PROGDIR}/conf/pc-sysinstall.conf +. ${BACKEND}/functions-networking.sh +. ${BACKEND}/functions-parse.sh + +# Bring up all NICS under DHCP +enable_auto_dhcp + +MAILTO="$1" +MAILRESULT="0" + +# Set the location of our compressed log +TMPLOG="/tmp/pc-sysinstall.log" + +echo "# PC-SYSINSTALL LOG" >${TMPLOG} +cat ${LOGOUT} >> ${TMPLOG} + +# Check if we have a GUI generated install cfg +if [ -e "/tmp/sys-install.cfg" ] +then + echo "" >>${TMPLOG} + echo "# PC-SYSINSTALL CFG " >>${TMPLOG} + cat /tmp/sys-install.cfg >> ${TMPLOG} +fi + +# Save dmesg output +echo "" >>${TMPLOG} +echo "# DMESG OUTPUT " >>${TMPLOG} +dmesg >> ${TMPLOG} + +# Get gpart info on all disks +for i in `${PROGDIR}/pc-sysinstall disk-list | cut -d ':' -f 1` +do + echo "" >>${TMPLOG} + echo "# DISK INFO $i " >>${TMPLOG} + ls /dev/${i}* >>${TMPLOG} + gpart show ${i} >> ${TMPLOG} +done + +# Show Mounted volumes +echo "" >>${TMPLOG} +echo "# MOUNT OUTPUT " >>${TMPLOG} +mount >> ${TMPLOG} + +echo "Log file saved to ${TMPLOG}" +echo "Warning: This file will be lost once the system is rebooted." + +echo "Do you wish to view this logfile now? (Y/N)" +read tmp +if [ "$tmp" = "Y" -o "$tmp" = "y" ] +then + more ${TMPLOG} +fi diff --git a/src/backend-query/setup-ssh-keys.sh b/src/backend-query/setup-ssh-keys.sh new file mode 100755 index 0000000..9b09e99 --- /dev/null +++ b/src/backend-query/setup-ssh-keys.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# Script which sets up password-less logins for ssh host +########################################################################### + +. ${PROGDIR}/backend/functions.sh + +SSHUSER=$1 +SSHHOST=$2 +SSHPORT=$3 + +if [ -z "${SSHUSER}" -o -z "${SSHHOST}" -o -z "${SSHPORT}" ] +then + echo "ERROR: Usage setup-ssh-keys " + exit 150 +fi + +cd ~ + +echo "Preparing to setup SSH key authorization..." +echo "When prompted, enter your password for ${SSHUSER}@${SSHHOST}" + +if [ ! -e ".ssh/id_rsa.pub" ] +then + mkdir .ssh >/dev/null 2>/dev/null + ssh-keygen -q -t rsa -N '' -f .ssh/id_rsa + sleep 1 +fi + +if [ ! -e ".ssh/id_rsa.pub" ] +then + echo "ERROR: Failed creating .ssh/id_rsa.pub" + exit 150 +fi + +# Get the .pub key +PUBKEY="`cat .ssh/id_rsa.pub`" + +ssh -p ${SSHPORT} ${SSHUSER}@${SSHHOST} "mkdir .ssh ; echo $PUBKEY >> .ssh/authorized_keys; chmod 600 .ssh/authorized_keys ; echo $PUBKEY >> .ssh/authorized_keys2; chmod 600 .ssh/authorized_keys2" diff --git a/src/backend-query/sys-mem.sh b/src/backend-query/sys-mem.sh new file mode 100755 index 0000000..f087621 --- /dev/null +++ b/src/backend-query/sys-mem.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +MEM=`sysctl hw.realmem | sed "s|hw.realmem: ||g"` +MEM=`expr $MEM / 1024` +MEM=`expr $MEM / 1024` +echo $MEM diff --git a/src/backend-query/test-live.sh b/src/backend-query/test-live.sh new file mode 100755 index 0000000..67ec7a5 --- /dev/null +++ b/src/backend-query/test-live.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# Script which checks if we are running from install media, or real system +############################################################################# + +dmesg | grep "md0: Preloaded image" >/dev/null 2>/dev/null +if [ "$?" = "0" ] +then + echo "INSTALL-MEDIA" + exit 0 +else + echo "REAL-DISK" + exit 1 +fi + diff --git a/src/backend-query/test-netup.sh b/src/backend-query/test-netup.sh new file mode 100755 index 0000000..666781d --- /dev/null +++ b/src/backend-query/test-netup.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# Script which tests "fetch" when using a network connection, and saves +# if we are using direct connect, or need FTP passive mode +############################################################################# + +rm ${TMPDIR}/.testftp >/dev/null 2>/dev/null + +ping -c 2 www.pcbsd.org >/dev/null 2>/dev/null +if [ "$?" = "0" ] +then + echo "ftp: Up" + exit 0 +fi + +ping -c 2 www.freebsd.org >/dev/null 2>/dev/null +if [ "$?" = "0" ] +then + echo "ftp: Up" + exit 0 +fi + +echo "ftp: Down" +exit 1 diff --git a/src/backend-query/update-part-list.sh b/src/backend-query/update-part-list.sh new file mode 100755 index 0000000..ac81e4f --- /dev/null +++ b/src/backend-query/update-part-list.sh @@ -0,0 +1,84 @@ +#!/bin/sh + +# Need access to a some unmount functions +. ${PROGDIR}/backend/functions-unmount.sh + +echo "Running: find-update-parts" >> ${LOGOUT} + +rm ${TMPDIR}/AvailUpgrades >/dev/null 2>/dev/null + +FSMNT="/mnt" + +# Get the freebsd version on this partition +get_fbsd_ver() { + + VER="`file ${FSMNT}/bin/sh | grep 'for FreeBSD' | sed 's|for FreeBSD |;|g' | cut -d ';' -f 2 | cut -d ',' -f 1`" + if [ "$?" = "0" ] ; then + file ${FSMNT}/bin/sh | grep '32-bit' >/dev/null 2>/dev/null + if [ "${?}" = "0" ] ; then + echo "${1}: FreeBSD ${VER} (32bit)" + else + echo "${1}: FreeBSD ${VER} (64bit)" + fi + fi + +} + +# Create our device listing +SYSDISK="`sysctl kern.disks | cut -d ':' -f 2 | sed 's/^[ \t]*//'`" +DEVS="" + +# Now loop through these devices, and list the disk drives +for i in ${SYSDISK} +do + + # Get the current device + DEV="${i}" + # Make sure we don't find any cd devices + echo "${DEV}" | grep -e "^acd[0-9]" -e "^cd[0-9]" -e "^scd[0-9]" >/dev/null 2>/dev/null + if [ "$?" != "0" ] ; then + DEVS="${DEVS} `ls /dev/${i}*`" + fi + +done + +# Search for regular UFS / Geom Partitions to upgrade +for i in $DEVS +do + if [ ! -e "${i}a.journal" -a ! -e "${i}a" -a ! -e "${i}p2" -a ! -e "${i}p2.journal" ] ; then + continue + fi + + if [ -e "${i}a.journal" ] ; then + _dsk="${i}a.journal" + elif [ -e "${i}a" ] ; then + _dsk="${i}a" + elif [ -e "${i}p2" ] ; then + _dsk="${i}p2" + elif [ -e "${i}p2.journal" ] ; then + _dsk="${i}p2.journal" + fi + + mount ${_dsk} ${FSMNT} >>${LOGOUT} 2>>${LOGOUT} + if [ "${?}" = "0" -a -e "${FSMNT}/bin/sh" ] ; then + get_fbsd_ver "`echo ${_dsk} | sed 's|/dev/||g'`" + umount -f ${FSMNT} >/dev/null 2>/dev/null + fi +done + +# Now search for any ZFS root partitions +zpool import -o altroot=${FSMNT} -a + +# Unmount any auto-mounted stuff +umount_all_dir "${FSMNT}" + +# Get pools +_zps="`zpool list | grep -v 'NAME' | cut -d ' ' -f 1`" +for _zpools in ${_zps} +do + mount -t zfs ${_zpools} ${FSMNT} >>${LOGOUT} 2>>${LOGOUT} + if [ "${?}" = "0" -a -e "${FSMNT}/bin/sh" ] ; then + get_fbsd_ver "${_zpools}" + umount -f ${FSMNT} >/dev/null 2>/dev/null + fi +done diff --git a/src/backend-query/xkeyboard-layouts.sh b/src/backend-query/xkeyboard-layouts.sh new file mode 100755 index 0000000..b2b92f3 --- /dev/null +++ b/src/backend-query/xkeyboard-layouts.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +FOUND="0" + +# Lets parse the xorg.list file, and see what layouts are supported +while read line +do + + if [ "$FOUND" = "1" -a ! -z "$line" ] + then + echo $line | grep '! ' >/dev/null 2>/dev/null + if [ "$?" = "0" ] + then + exit 0 + else + echo "$line" + fi + fi + + if [ "${FOUND}" = "0" ] + then + echo $line | grep '! layout' >/dev/null 2>/dev/null + if [ "$?" = "0" ] + then + FOUND="1" + fi + fi + +done < /usr/local/share/X11/xkb/rules/xorg.lst + +exit 0 diff --git a/src/backend-query/xkeyboard-models.sh b/src/backend-query/xkeyboard-models.sh new file mode 100755 index 0000000..0d72681 --- /dev/null +++ b/src/backend-query/xkeyboard-models.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +FOUND="0" + +# Lets parse the xorg.list file, and see what models are supported +while read line +do + + if [ "$FOUND" = "1" -a ! -z "$line" ] + then + echo $line | grep '! ' >/dev/null 2>/dev/null + if [ "$?" = "0" ] + then + exit 0 + else + model="`echo $line | sed 's|(|[|g'`" + model="`echo $model | sed 's|)|]|g'`" + echo "$model" + fi + fi + + if [ "${FOUND}" = "0" ] + then + echo $line | grep '! model' >/dev/null 2>/dev/null + if [ "$?" = "0" ] + then + FOUND="1" + fi + fi + +done < /usr/local/share/X11/xkb/rules/xorg.lst + +exit 0 diff --git a/src/backend-query/xkeyboard-variants.sh b/src/backend-query/xkeyboard-variants.sh new file mode 100755 index 0000000..3bf18d7 --- /dev/null +++ b/src/backend-query/xkeyboard-variants.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +FOUND="0" + +# Lets parse the xorg.list file, and see what varients are supported +while read line +do + + if [ "$FOUND" = "1" -a ! -z "$line" ] + then + echo $line | grep '! ' >/dev/null 2>/dev/null + if [ "$?" = "0" ] + then + exit 0 + else + echo "$line" + fi + fi + + if [ "${FOUND}" = "0" ] + then + echo $line | grep '! variant' >/dev/null 2>/dev/null + if [ "$?" = "0" ] + then + FOUND="1" + fi + fi + +done < /usr/local/share/X11/xkb/rules/xorg.lst + +exit 0 diff --git a/src/disk.png b/src/disk.png new file mode 100644 index 0000000..a588c91 Binary files /dev/null and b/src/disk.png differ diff --git a/src/gbi.desktop b/src/gbi.desktop new file mode 100755 index 0000000..ad3f967 --- /dev/null +++ b/src/gbi.desktop @@ -0,0 +1,12 @@ +#!/usr/bin/env xdg-open + +[Desktop Entry] +Version=1.0 +Terminal=false +Type=Application +Categories=GTK;System; +NoDisplay=true +Exec=install-station +Name=Install GhostBSD +Comment=Install GhostBSD +Icon=/usr/local/lib/install-station/image/install-gbsd.png diff --git a/src/ghostbsd-style.css b/src/ghostbsd-style.css new file mode 100644 index 0000000..9472b2c --- /dev/null +++ b/src/ghostbsd-style.css @@ -0,0 +1,20 @@ +#install { + background-image: url("/usr/local/lib/install-station/image/installation.jpg"); + background-size: cover; +} + +#sideText { + color: #F9F9F9; + font-weight:bold; + font-size: 14px; +} + +#TransBox { + background-color: rgba(0, 0, 0, 0.6) +} + +#Header { + color: #F9F9F9; + background-color: #282828; + font-size: 22px; +} diff --git a/src/image/G_logo.gif b/src/image/G_logo.gif new file mode 100644 index 0000000..89f3967 Binary files /dev/null and b/src/image/G_logo.gif differ diff --git a/src/image/disk.png b/src/image/disk.png new file mode 100644 index 0000000..a588c91 Binary files /dev/null and b/src/image/disk.png differ diff --git a/src/image/install-gbsd.png b/src/image/install-gbsd.png new file mode 100644 index 0000000..5748e1c Binary files /dev/null and b/src/image/install-gbsd.png differ diff --git a/src/image/install-gbsd.svg b/src/image/install-gbsd.svg new file mode 100644 index 0000000..5112bda --- /dev/null +++ b/src/image/install-gbsd.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/image/install.png b/src/image/install.png new file mode 100644 index 0000000..bad5cd0 Binary files /dev/null and b/src/image/install.png differ diff --git a/src/image/installation.jpg b/src/image/installation.jpg new file mode 100644 index 0000000..26a5feb Binary files /dev/null and b/src/image/installation.jpg differ diff --git a/src/image/laptop.png b/src/image/laptop.png new file mode 100644 index 0000000..0723434 Binary files /dev/null and b/src/image/laptop.png differ diff --git a/src/image/logo.png b/src/image/logo.png new file mode 100644 index 0000000..c8f4353 Binary files /dev/null and b/src/image/logo.png differ diff --git a/src/laptop.png b/src/laptop.png new file mode 100644 index 0000000..0723434 Binary files /dev/null and b/src/laptop.png differ