Files
installer-gui/install_station/language.py
T
ericbsd 9db6c513c9 Add initial install_station Python package structure
- Add install_station package with __init__.py and core modules
  - Include boot_manager.py for boot loader configuration (BootManager class with singleton pattern)
  - Add common.py with password strength validation utilities and ZFS dataset definitions
  - Add custom.py with Partitions class for disk partitioning management (1010 lines)
  - Establish foundation for GTK+ based GhostBSD installer application

  Modules added:
  - boot_manager: UEFI/BIOS boot manager selection with rEFInd and FreeBSD options
  - common: Password validation functions and deprecated decorator utility
  - custom: Comprehensive partition management with GTK+ interface
2025-07-09 21:29:53 -03:00

143 lines
4.8 KiB
Python

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, logo
import gettext
gettext.bindtextdomain('install-station', '/usr/local/share/locale')
gettext.textdomain('install-station')
_ = gettext.gettext
# Ensure temp directory exists
if not os.path.exists(tmp):
os.makedirs(tmp)
lang_dictionary = language_dictionary()
# Text to be replace be multiple language file.
welltext = _("Select the language you want to use with GhostBSD.")
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:
_instance = None
def __new__(cls):
"""Implement singleton pattern."""
if cls._instance is None:
cls._instance = super(Language, cls).__new__(cls)
cls._instance._initialized = False
return cls._instance
def __init__(self):
"""Initialize only once."""
if not self._initialized:
self._language = None
self._vbox1 = None
self._initialize_ui()
self._initialized = True
# On selection it overwrite the default language file.
def _language_selection(self, tree_selection):
model, treeiter = tree_selection.get_selected()
if treeiter is not None:
value = model[treeiter][0]
self._language = lang_dictionary[value]
InstallationData.language = value
InstallationData.language_code = lang_dictionary[value]
return
def _setup_language_columns(self, treeView):
cell = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(None, cell, text=0)
column_header = Gtk.Label(label=_('Language'))
column_header.set_use_markup(True)
column_header.show()
column.set_widget(column_header)
column.set_sort_column_id(0)
treeView.append_column(column)
return
# Initial definition.
def _initialize_ui(self):
# Add a Default vertical box
self._vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0)
self._vbox1.show()
# Add a second vertical box
grid = Gtk.Grid()
title = Gtk.Label(label=_('Welcome To GhostBSD!'), name="Header")
title.set_property("height-request", 50)
self._vbox1.pack_start(title, False, False, 0)
self._vbox1.pack_start(grid, True, True, 0)
grid.set_row_spacing(10)
grid.set_column_spacing(3)
grid.set_column_homogeneous(True)
grid.set_row_homogeneous(True)
grid.set_margin_left(10)
grid.set_margin_right(10)
grid.set_margin_top(10)
grid.set_margin_bottom(10)
# Adding a Scrolling Window
sw = Gtk.ScrolledWindow()
sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN)
sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
# Adding a treestore and store language in it.
store = Gtk.TreeStore(str)
for line in lang_dictionary:
store.append(None, [line])
treeview = Gtk.TreeView()
treeview.set_model(store)
treeview.set_rules_hint(True)
self._setup_language_columns(treeview)
tree_selection = treeview.get_selection()
tree_selection.set_mode(Gtk.SelectionMode.SINGLE)
tree_selection.connect("changed", self._language_selection)
sw.add(treeview)
sw.show()
grid.attach(sw, 1, 2, 1, 9)
# add text in a label.
vbox2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0)
vbox2.set_border_width(10)
vbox2.show()
wellcome_text = Gtk.Label(label=welltext)
wellcome_text.set_use_markup(True)
table = Gtk.Table()
table.attach(wellcome_text, 0, 1, 3, 4)
vbox2.pack_start(table, False, False, 5)
image = Gtk.Image()
image.set_from_file(logo)
image.show()
# grid.attach(self.wellcome, 1, 1, 3, 1)
vbox2.pack_start(image, True, True, 5)
grid.attach(vbox2, 2, 2, 2, 9)
grid.show()
@classmethod
def get_model(cls):
return cls()._vbox1
@classmethod
def get_language(cls):
"""Get the selected language."""
return InstallationData.language_code or cls()._language
def save_selection(self):
# Language is now saved in InstallationData automatically
pass
@classmethod
def save_language(cls):
language_code = InstallationData.language_code or cls()._language
if language_code:
localize_system(language_code)