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