13 Commits

Author SHA1 Message Date
Eric Turgeon 201f813ab0 Merge pull request #14 from Emsalettin1/turkishsupport
Added Turkish support
2026-06-03 17:13:07 -03:00
Emsalettin1 2c96c08333 Added turkish support 2026-05-20 17:17:55 +03:00
Eric Turgeon 3b5a409858 Merge pull request #13 from ghostbsd/rc
Add install_station service and Rework ZFS page UI layout and swap sizing
2026-05-13 23:10:57 -03:00
ericbsd 708aed30d6 Fix ZFS page validation and Next button reliability
Replace the swap size text entry with a SpinButton capped to the
selected disk size, consolidate _disk_count_valid and _update_next_button
into a single _is_ready method that checks all preconditions, update the
Next button from on_password_changed so it disables when passwords stop
matching, re-enable the Next button in back_page so navigating back no
longer leaves it stuck disabled, reduce the left panel gap, and fix a
startup crash from mirror_selection firing before swap_entry was created.
2026-05-13 19:23:54 -03:00
ericbsd 4d4c54671e Rework ZFS page UI layout and swap sizing
Redesign the ZFS configuration page with a two-column layout (settings
on the left, disk list on the right), add a user-editable swap size
field that defaults to actual RAM size, make the pool name always
editable, and simplify pool type values to plain identifiers (stripe,
mirror, raidz1/2/3). Consolidate duplicated next-button sensitivity
logic into _update_next_button(), replace deprecated Gtk.STOCK icons
with icon names, encrypt swap when GELI is enabled, and bump version
to 0.4.
2026-05-13 08:11:34 -03:00
ericbsd 6035e6355f Add install_station service and related configuration updates 2025-12-21 20:40:28 -04:00
Eric Turgeon 917823091e Merge pull request #12 from ghostbsd/fix/xinitrc-path-and-ui
Fix .xinitrc path and improve UI visibility in installation
2025-12-10 17:37:59 -04:00
ericbsd 19b027bc0b Fix .xinitrc path and improve UI visibility in installation
- Change .xinitrc path from `/usr/home/ghostbsd/` to `/home/ghostbsd/` for
  correct FreeBSD home directory handling
- Fix indentation of .xinitrc writelines() calls to be inside the file context
  manager (prevents potential file write errors)
- Add explicit label2.show() call in InstallWindow to ensure progress label
  visibility during installation

These changes ensure proper file handling in "Try Live" mode and improve
installation UI feedback reliability.
2025-12-10 17:33:12 -04:00
Eric Turgeon b3f1cb636d Merge pull request #11 from JKearnsl/feat/translate-ru
translate ru
2025-12-09 19:52:25 -04:00
ericbsd 523bd172c3 Merge remote-tracking branch 'origin/master' 2025-12-09 19:45:37 -04:00
ericbsd 1507a5a456 Add missing logic for .xinitrc updates in "Try Live" mode
- Renamed `install_mode` to `what_to_do` and `filesystem_type` to `install_type` across modules for clarity and consistency
- Implemented `.xinitrc` configuration updates in "Try Live" mode
- Added logic to save ZFS configuration during installation process
- Improved button handling and code readability in the interface controller
2025-12-09 19:45:12 -04:00
JKearnsl 98c8a2c84c use utf8 for cyrillic 2025-12-07 16:23:00 +03:00
JKearnsl f61de14266 translate ru 2025-12-07 16:11:06 +03:00
13 changed files with 516 additions and 475 deletions
+6
View File
@@ -156,5 +156,11 @@ class Configuration:
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=echo '# WARNING: Do NOT set initial_setup_enable=YES manually!' >> /etc/rc.conf\n")
f.write("runCommand=echo '# This service is ONLY for first boot after installation.' >> /etc/rc.conf\n")
f.write("runCommand=echo '# It will automatically disable itself after running.' >> /etc/rc.conf\n")
f.write("runCommand=sysrc initial_setup_enable=YES\n")
f.write("runCommand=sed -i '' '/^autologin-user=/d' /usr/local/etc/lightdm/lightdm.conf\n")
f.write("runCommand=sed -i '' '/^autologin-session=/d' /usr/local/etc/lightdm/lightdm.conf\n")
except IOError as e:
raise IOError(f"Failed to write configuration file: {e}") from e
+4 -5
View File
@@ -1,7 +1,6 @@
"""
Contains the data class and some commonly use variables
"""
import os
import gettext
be_name: str = "default"
@@ -46,8 +45,8 @@ class InstallationData:
ufs_config_data: list = []
# Installation type and mode
install_mode: str = "" # "install" or "try"
filesystem_type: str = "" # "zfs", "ufs", or "custom"
what_to_do: str = "" # "install" or "try"
install_type: str = "" # "zfs", "ufs", or "custom"
# Language and localization
language: str = ""
@@ -79,8 +78,8 @@ class InstallationData:
cls.boot = ""
cls.zfs_config_data = []
cls.ufs_config_data = []
cls.install_mode = ""
cls.filesystem_type = ""
cls.what_to_do = ""
cls.install_type = ""
cls.language = ""
cls.language_code = ""
cls.keyboard_layout = ""
+1
View File
@@ -112,6 +112,7 @@ class InstallWindow:
label2.set_line_wrap(True)
# label2.set_max_width_chars(10)
label2.set_alignment(0.0, 0.2)
label2.show()
hbox2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=0, name="TransBox")
hbox2.show()
hbox.pack_start(hbox2, True, True, 0)
+3 -3
View File
@@ -48,7 +48,7 @@ class InstallTypes:
# Only respond to activation, not deactivation
if widget.get_active():
cls.ne = val
InstallationData.filesystem_type = val
InstallationData.install_type = val
print(f"Filesystem type selected: {val}")
@classmethod
@@ -58,7 +58,7 @@ class InstallTypes:
Returns:
str: Current filesystem type ('zfs' or 'custom')
"""
return InstallationData.filesystem_type or cls.ne
return InstallationData.install_type or cls.ne
@classmethod
def get_model(cls) -> Gtk.Box:
@@ -88,7 +88,7 @@ class InstallTypes:
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
InstallationData.install_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?"))
+13 -28
View File
@@ -208,12 +208,14 @@ class Interface:
InstallationData.keyboard_variant,
InstallationData.keyboard_model_code
)
# Continue to network setup for live session
cls.next_setup_page()
with open('/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()
elif page == 4:
Button.show_back()
if InstallationData.filesystem_type == "custom":
if InstallationData.install_type == "custom":
custom_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0)
custom_box.show()
get_part = cls.custom_partition.get_model()
@@ -223,7 +225,7 @@ class Interface:
cls.page.next_page()
cls.page.show_all()
Button.next_button.set_sensitive(False)
elif InstallationData.filesystem_type == "zfs":
elif InstallationData.install_type == "zfs":
zfs_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0)
zfs_box.show()
get_zfs = cls.full_zfs.get_model()
@@ -234,6 +236,11 @@ class Interface:
cls.page.show_all()
Button.next_button.set_sensitive(False)
elif page == 5:
# Save ZFS configuration before proceeding
if InstallationData.install_type == "zfs":
cls.full_zfs.save_selection()
# For custom partitioning, data is already saved in InstallationData
boot_manager_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0)
boot_manager_box.show()
get_root = cls.boot_manager.get_model()
@@ -265,28 +272,6 @@ class Interface:
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."""
@@ -313,4 +298,4 @@ class Interface:
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)
Button.next_button.set_sensitive(True)
+3 -2
View File
@@ -7,6 +7,7 @@ import re
from time import sleep
from subprocess import Popen, PIPE, STDOUT, call
from install_station.data import query, zfs_datasets, InstallationData
from install_station.system_calls import get_ram_size_mb
# Define required file paths
@@ -779,7 +780,7 @@ class AutoFreeSpace:
InstallationData.slice = main_slice.replace(drive, "")
root_size = int(main_size)
swap_size = 2048
swap_size = get_ram_size_mb()
root_size -= swap_size
part_list = disk_db[drive]['partitions'][main_slice]['partition-list']
@@ -861,7 +862,7 @@ class AutoFreeSpace:
InstallationData.disk = drive
InstallationData.scheme = 'partscheme=GPT'
root_size = int(main_size)
swap_size = 2048
swap_size = get_ram_size_mb()
root_size -= int(swap_size)
if self.bios_type == "UEFI" and efi_exist is False:
boot_size = 256
+15
View File
@@ -258,6 +258,21 @@ def timezone_dictionary() -> dict[str, list[str]]:
return dictionary
def get_ram_size_mb() -> int:
"""Query the system RAM size in megabytes using sysctl.
Returns:
System RAM size in MB
"""
output = Popen(
'sysctl -n hw.realmem',
shell=True,
stdout=PIPE,
universal_newlines=True
).stdout.read().strip()
return int(output) // 1048576
def zfs_disk_query() -> list[str]:
"""Query available disks for ZFS installation.
+3 -3
View File
@@ -48,7 +48,7 @@ class TryOrInstall:
# Only respond to activation, not deactivation
if widget.get_active():
cls.what = val
InstallationData.install_mode = val
InstallationData.what_to_do = val
print(f"Mode selected: {val}")
@classmethod
@@ -62,7 +62,7 @@ class TryOrInstall:
Returns:
str: Current installation mode ('install' or 'try')
"""
return InstallationData.install_mode or cls.what
return InstallationData.what_to_do or cls.what
@classmethod
def initialize(cls) -> None:
@@ -78,7 +78,7 @@ class TryOrInstall:
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
InstallationData.what_to_do = cls.what
cls.vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0)
cls.vbox1.show()
+190 -242
View File
@@ -3,6 +3,7 @@ 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 (
get_ram_size_mb,
zfs_disk_query,
zfs_disk_size_query,
)
@@ -38,13 +39,13 @@ class ZFS:
zfs_disk_list = []
pool_type = 'stripe'
scheme = 'GPT'
zpool = False
disk_encrypt = False
mirror = 'single disk'
mirror = 'stripe'
vbox1 = None
# UI elements as class variables
pool = None
swap_entry = None
password = None
repassword = None
mirrorTips = None
@@ -69,28 +70,19 @@ class ZFS:
# 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 = ''
swap_size = cls.swap_entry.get_value_as_int()
zfs_num = size - swap_size
dgeli = '.eli' if cls.disk_encrypt else ''
# 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"zpoolName={cls.pool.get_text()}\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()
@@ -98,18 +90,13 @@ class ZFS:
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':
if len(cls.zfs_disk_list) <= 1:
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
for i in range(1, len(zfs_disk)):
mirror_dsk += ' ' + zfs_disk[i].partition('-')[0].rstrip()
pool_disk = f' ({cls.pool_type}:{mirror_dsk})\n'
if bios_or_uefi() == "UEFI":
zfs_num = zfs_num - 100
@@ -118,19 +105,51 @@ class ZFS:
# 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:
# encpass must be on the line immediately after the .eli partition
if cls.disk_encrypt:
InstallationData.zfs_config_data.append(f'encpass={cls.password.get_text()}\n')
else:
InstallationData.zfs_config_data.append('#encpass=None\n')
if swap_size != 0:
if cls.disk_encrypt:
InstallationData.zfs_config_data.append('disk0-part=SWAP.eli 0 none\n')
else:
InstallationData.zfs_config_data.append('disk0-part=SWAP 0 none\n')
InstallationData.zfs_config_data.append('commitDiskLabel\n')
@classmethod
def _is_ready(cls):
"""
Check if all conditions are met to proceed to the next page.
Returns:
bool: True if disk count, swap entry, and encryption requirements are all satisfied.
"""
count = len(cls.zfs_disk_list)
if cls.mirror == "stripe":
disks_ok = count >= 1
elif cls.mirror == "mirror":
disks_ok = count >= 2
elif cls.mirror == "raidz1":
disks_ok = count == 3
elif cls.mirror == "raidz2":
disks_ok = count == 4
elif cls.mirror == "raidz3":
disks_ok = count == 5
else:
disks_ok = False
if cls.disk_encrypt:
encrypt_ok = (cls.password.get_text() == cls.repassword.get_text()
and len(cls.password.get_text()) > 0)
else:
encrypt_ok = True
return disks_ok and encrypt_ok
@classmethod
def scheme_selection(cls, combobox):
"""
Handle partition scheme selection from combo box.
Args:
combobox: ComboBox widget containing scheme options (GPT/MBR)
"""
@@ -143,80 +162,48 @@ class ZFS:
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)
data = model[index][0]
cls.mirror = data
if cls.mirror == "1+ disks Stripe":
smallest_msg = get_text("(select the smallest disk first)")
if cls.mirror == "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":
get_text("Select 1 or more drives, no redundancy") + " " + smallest_msg)
elif cls.mirror == "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.mirrorTips.set_text(
get_text("Select 2 or more drives for mirroring") + " " + smallest_msg)
elif cls.mirror == "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.mirrorTips.set_text(
get_text("Select 3 drives for RAIDZ1") + " " + smallest_msg)
elif cls.mirror == "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.mirrorTips.set_text(
get_text("Select 4 drives for RAIDZ2") + " " + smallest_msg)
elif cls.mirror == "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
cls.mirrorTips.set_text(
get_text("Select 5 drives for RAIDZ3") + " " + smallest_msg)
Button.next_button.set_sensitive(cls._is_ready())
@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
"""
@@ -229,31 +216,21 @@ class ZFS:
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)
Button.next_button.set_sensitive(cls._is_ready())
@classmethod
def on_password_changed(cls, _widget):
"""
Handle password entry changes and update strength display.
Wraps the common password_strength function to extract the text
from the Entry widget and pass it with the strength label.
Args:
_widget: Entry widget that triggered the change (unused)
"""
password_strength(cls.password.get_text(), cls.strenght_label)
Button.next_button.set_sensitive(cls._is_ready())
@classmethod
def initialize(cls):
@@ -271,7 +248,8 @@ class ZFS:
"""
cls.vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0)
cls.vbox1.show()
# Chose disk
# Disk list in a scrolled window
sw = Gtk.ScrolledWindow(hexpand=True, vexpand=True)
sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN)
sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
@@ -319,37 +297,39 @@ class ZFS:
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('<b>Pool Type</b>'))
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('<b>Pool Name</b>'))
pool_name_label.set_use_markup(True)
# Pool Layout
cls.mirror = 'stripe'
mirror_label = Gtk.Label(label=get_text('Pool Layout'))
mirror_label.set_use_markup(True)
mirror_box = Gtk.ComboBoxText()
mirror_box.append_text("stripe")
mirror_box.append_text("mirror")
mirror_box.append_text("raidz1")
mirror_box.append_text("raidz2")
mirror_box.append_text("raidz3")
mirror_box.set_active(0)
mirror_box.connect('changed', cls.mirror_selection)
# Pool Name (always editable)
pool_label = Gtk.Label(label=get_text('Pool Name'))
pool_label.set_use_markup(True)
cls.pool = Gtk.Entry()
cls.pool.set_text('zroot')
# Swap Size
swap_label = Gtk.Label(label=get_text('Swap Size(MB)'))
swap_label.set_use_markup(True)
ram_mb = get_ram_size_mb()
adj = Gtk.Adjustment(ram_mb, 0, ram_mb, 1, 100, 0)
cls.swap_entry = Gtk.SpinButton(adjustment=adj, numeric=True)
cls.swap_entry.set_editable(True)
# Creating MBR or GPT drive
scheme_label = Gtk.Label(label='<b>Partition Scheme</b>')
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")
@@ -360,52 +340,85 @@ class ZFS:
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 = Gtk.CheckButton(label=get_text("Encrypt Disk (GELI)"))
encrypt_check.connect("toggled", cls.on_check_encrypt)
encrypt_check.set_sensitive(True)
# password
# 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.password.connect("changed", cls.on_password_changed)
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.strenght_label.set_size_request(-1, 20)
# Verify password
cls.vpasswd_label = Gtk.Label(label=get_text("Confirm"))
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
# Password match image
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)
cls.img.set_size_request(20, 20)
# Two-column layout: left settings, right disk list
hbox_main = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=False, spacing=10)
# Left panel: settings grid
left_grid = Gtk.Grid()
left_grid.set_row_spacing(4)
left_grid.set_column_spacing(6)
left_grid.set_hexpand(False)
mirror_label.set_alignment(0, 0.5)
pool_label.set_alignment(0, 0.5)
swap_label.set_alignment(0, 0.5)
cls.passwd_label.set_alignment(0, 0.5)
cls.vpasswd_label.set_alignment(0, 0.5)
# Row 0-1: Pool Layout
left_grid.attach(mirror_label, 0, 0, 2, 1)
left_grid.attach(mirror_box, 0, 1, 2, 1)
# Row 2-3: Pool Name
left_grid.attach(pool_label, 0, 2, 2, 1)
left_grid.attach(cls.pool, 0, 3, 2, 1)
# Row 4-5: Swap Size
left_grid.attach(swap_label, 0, 4, 2, 1)
left_grid.attach(cls.swap_entry, 0, 5, 2, 1)
# Row 6: Separator
sep = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
left_grid.attach(sep, 0, 6, 2, 1)
# Row 7: Encrypt Disk checkbox
left_grid.attach(encrypt_check, 0, 7, 2, 1)
# Row 8: Password label + strength indicator
left_grid.attach(cls.passwd_label, 0, 8, 1, 1)
left_grid.attach(cls.strenght_label, 1, 8, 1, 1)
# Row 9: Password input
left_grid.attach(cls.password, 0, 9, 2, 1)
# Row 10: Confirm label + match icon
left_grid.attach(cls.vpasswd_label, 0, 10, 1, 1)
left_grid.attach(cls.img, 1, 10, 1, 1)
# Row 11: Confirm input
left_grid.attach(cls.repassword, 0, 11, 2, 1)
hbox_main.pack_start(left_grid, False, False, 10)
# Right panel: tips + disk list
right_panel = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0)
cls.mirrorTips.set_alignment(0, 0.5)
right_panel.pack_start(cls.mirrorTips, False, False, 0)
right_panel.pack_start(sw, True, True, 0)
hbox_main.pack_start(right_panel, True, True, 10)
cls.vbox1.pack_start(hbox_main, True, True, 10)
return
@classmethod
@@ -465,62 +478,21 @@ class ZFS:
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()
return True
# Update swap SpinButton upper limit based on first selected disk
if cls.zfs_disk_list:
disk_size = int(cls.zfs_disk_list[0].partition('-')[2].rstrip()) - 512
cls.swap_entry.get_adjustment().set_upper(disk_size)
else:
cls.swap_entry.get_adjustment().set_upper(get_ram_size_mb())
Button.next_button.set_sensitive(cls._is_ready())
print(cls.zfs_disk_list)
return True
@@ -589,32 +561,8 @@ class ZFS:
_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)
cls.img.set_from_icon_name("gtk-yes", Gtk.IconSize.MENU)
Button.next_button.set_sensitive(cls._is_ready())
else:
cls.img.set_from_stock(Gtk.STOCK_NO, 5)
cls.img.set_from_icon_name("gtk-no", Gtk.IconSize.MENU)
Button.next_button.set_sensitive(False)
+120 -96
View File
@@ -9,11 +9,11 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-24 18:07-0300\n"
"PO-Revision-Date: 2025-07-09 20:20-0300\n"
"Last-Translator: Eric Turgeon <EMAIL@ADDRESS>\n"
"Last-Translator: Boyarshinov Nikita <boyarshinovn@gmail.com>\n"
"Language-Team: Russian <gnu@d07.ru>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
@@ -21,104 +21,104 @@ msgstr ""
#: install_station/boot_manager.py:121
#: install_station/interface_controller.py:241
msgid "Boot Option"
msgstr ""
msgstr "Вариант загрузки"
#: install_station/boot_manager.py:135
msgid "Setup rEFInd boot manager"
msgstr ""
msgstr "Настроить менеджер загрузки rEFInd"
#: install_station/boot_manager.py:149
msgid "Setup FreeBSD boot manager"
msgstr ""
msgstr "Настроить менеджер загрузки FreeBSD"
#: install_station/boot_manager.py:164
#, python-brace-format
msgid "FreeBSD {loader} loader only"
msgstr ""
msgstr "Только загрузчик FreeBSD {loader}"
#: install_station/common.py:123
msgid "Space not allowed"
msgstr ""
msgstr "Пробелы не разрешены"
#: install_station/common.py:125 install_station/common.py:127
msgid "Super Weak"
msgstr ""
msgstr "Очень слабый"
#: install_station/common.py:129 install_station/common.py:135
msgid "Very Weak"
msgstr ""
msgstr "Очень слабый"
#: install_station/common.py:131 install_station/common.py:137
#: install_station/common.py:143
msgid "Fairly Weak"
msgstr ""
msgstr "Довольно слабый"
#: install_station/common.py:133 install_station/common.py:139
#: install_station/common.py:145 install_station/common.py:151
msgid "Weak"
msgstr ""
msgstr "Слабый"
#: install_station/common.py:141 install_station/common.py:147
#: install_station/common.py:153 install_station/common.py:159
msgid "Strong"
msgstr ""
msgstr "Надёжный"
#: install_station/common.py:149 install_station/common.py:155
#: install_station/common.py:161 install_station/common.py:167
msgid "Fairly Strong"
msgstr ""
msgstr "Довольно надёжный"
#: install_station/common.py:157 install_station/common.py:163
msgid "Very Strong"
msgstr ""
msgstr "Очень надёжный"
#: install_station/common.py:165 install_station/common.py:169
msgid "Super Strong"
msgstr ""
msgstr "Исключительно надёжный"
#: install_station/custom.py:248
msgid "Create"
msgstr ""
msgstr "Создать"
#: install_station/custom.py:252
msgid "Delete"
msgstr ""
msgstr "Удалить"
#: install_station/custom.py:256
msgid "Revert"
msgstr ""
msgstr "Отменить"
#: install_station/custom.py:260
msgid "Auto"
msgstr ""
msgstr "Авто"
#: install_station/custom.py:328 install_station/custom.py:566
msgid "Add Partition"
msgstr ""
msgstr "Добавить раздел"
#: install_station/custom.py:342
msgid "Type:"
msgstr ""
msgstr "Тип:"
#: install_station/custom.py:343 install_station/custom.py:580
msgid "Size(MB):"
msgstr ""
msgstr "Размер (МБ):"
#: install_station/custom.py:344
msgid "Mount point:"
msgstr ""
msgstr "Точка монтирования:"
#: install_station/custom.py:496
msgid "Partition Scheme"
msgstr ""
msgstr "Схема разделов"
#: install_station/custom.py:515
msgid "GPT: GUID Partition Table"
msgstr ""
msgstr "GPT: Таблица разделов GUID"
#: install_station/custom.py:516
msgid "MBR: DOS Partition"
msgstr ""
msgstr "MBR: Раздел DOS"
#: install_station/end.py:10
msgid ""
@@ -128,30 +128,35 @@ msgid ""
"any changes you make or documents you save will\n"
"not be preserved on reboot."
msgstr ""
"Установка завершена. Вам необходимо перезагрузить\n"
"компьютер, чтобы использовать новую систему.\n"
"Вы можете продолжить использование live-носителя,\n"
"однако любые внесённые изменения или сохранённые\n"
"документы не сохранятся после перезагрузки."
#: install_station/end.py:31
msgid "Installation Completed"
msgstr ""
msgstr "Установка завершена"
#: install_station/end.py:47
msgid "Restart"
msgstr ""
msgstr "Перезагрузить"
#: install_station/end.py:49
msgid "Continue"
msgstr ""
msgstr "Продолжить"
#: install_station/error.py:17
msgid "Installation Error"
msgstr ""
msgstr "Ошибка установки"
#: install_station/error.py:28
msgid "Installation has failed!"
msgstr ""
msgstr "Установка не удалась!"
#: install_station/error.py:33
msgid "GhostBSD issue system"
msgstr ""
msgstr "Система отслеживания ошибок GhostBSD"
#: install_station/error.py:35
#, python-brace-format
@@ -159,14 +164,16 @@ msgid ""
"Please report the issue to {anchor}, and \n"
"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log."
msgstr ""
"Пожалуйста, сообщите об ошибке в {anchor} и\n"
"не забудьте приложить файл /tmp/.pc-sysinstall/pc-sysinstall.log."
#: install_station/error.py:45
msgid "Ok"
msgstr ""
msgstr "ОК"
#: install_station/install_type.py:94
msgid "How do you want to install GhostBSD?"
msgstr ""
msgstr "Как вы хотите установить GhostBSD?"
#: install_station/install_type.py:100
msgid ""
@@ -174,32 +181,37 @@ msgid ""
"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 "
"configurations."
msgstr ""
"<b>Конфигурация дисков</b>\n"
"Установите GhostBSD, используя конфигурации Stripe, Mirror, RAIDZ1, RAIDZ2 "
"или RAIDZ3."
#: install_station/install_type.py:113
msgid ""
"<b>Multi-Boot Configuration</b>\n"
"Install GhostBSD with ZFS alongside other operating systems."
msgstr ""
"<b>Конфигурация Multi-Boot</b>\n"
"Установите GhostBSD с ZFS вместе с другими операционными системами."
#: install_station/install.py:46
msgid "Creating ghostbsd_installation.cfg"
msgstr ""
msgstr "Создание ghostbsd_installation.cfg"
#: install_station/install.py:50
msgid "Deleting partition"
msgstr ""
msgstr "Удаление раздела"
#: install_station/install.py:55
msgid "Creating disk partition"
msgstr ""
msgstr "Создание раздела диска"
#: install_station/install.py:60
msgid "Creating new partitions"
msgstr ""
msgstr "Создание новых разделов"
#: install_station/install.py:90
msgid "Installation in progress"
msgstr ""
msgstr "Идёт установка"
#: install_station/install.py:102
msgid ""
@@ -212,253 +224,265 @@ msgid ""
"\n"
"We hope you'll enjoy our BSD operating system."
msgstr ""
"Благодарим за выбор GhostBSD!\n"
"\n"
"Мы считаем, что каждая операционная система должна быть простой, элегантной, "
"безопасной и защищать вашу приватность, оставаясь при этом простой в "
"использовании. GhostBSD упрощает FreeBSD для тех, кому не хватает технической "
"экспертизы для его использования, и снижает порог входа для использования BSD.\n"
"\n"
"Мы надеемся, что вам понравится наша операционная система BSD."
#: install_station/interface_controller.py:24
#: install_station/interface_controller.py:35
msgid "Back"
msgstr ""
msgstr "Назад"
#: install_station/interface_controller.py:26
#: install_station/interface_controller.py:36
msgid "Cancel"
msgstr ""
msgstr "Отмена"
#: install_station/interface_controller.py:28
#: install_station/interface_controller.py:37
#: install_station/interface_controller.py:297
msgid "Next"
msgstr ""
msgstr "Далее"
#: install_station/interface_controller.py:129
#: install_station/interface_controller.py:130 install_station/language.py:101
msgid "Welcome to GhostBSD"
msgstr ""
msgstr "Добро пожаловать в GhostBSD"
#: install_station/interface_controller.py:139
msgid "Button"
msgstr ""
msgstr "Кнопка"
#: install_station/interface_controller.py:160
msgid "Keyboard Setup"
msgstr ""
msgstr "Настройка клавиатуры"
#: install_station/interface_controller.py:172
#: install_station/interface_controller.py:274
#: install_station/interface_controller.py:279
msgid "Network Setup"
msgstr ""
msgstr "Настройка сети"
#: install_station/interface_controller.py:183
msgid "Try Or Install GhostBSD"
msgstr ""
msgstr "Попробовать или Установить GhostBSD"
#: install_station/interface_controller.py:194
msgid "Installation Types"
msgstr ""
msgstr "Типы установки"
#: install_station/interface_controller.py:221
msgid "Custom Configuration"
msgstr ""
msgstr "Пользовательская конфигурация"
#: install_station/interface_controller.py:231
msgid "ZFS Configuration"
msgstr ""
msgstr "Конфигурация ZFS"
#: install_station/interface_controller.py:243
msgid "Install"
msgstr ""
msgstr "Установить"
#: install_station/interface_controller.py:253
msgid "Installation Progress"
msgstr ""
msgstr "Ход установки"
#: install_station/interface_controller.py:260
msgid "Progress Bar"
msgstr ""
msgstr "Индикатор выполнения"
#: install_station/keyboard.py:45
msgid "Type here to test your keyboard"
msgstr ""
msgstr "Печатайте здесь для проверки клавиатуры"
#: install_station/keyboard.py:102
msgid "Keyboard Layout"
msgstr ""
msgstr "Раскладка клавиатуры"
#: install_station/keyboard.py:122
msgid "Keyboard Models"
msgstr ""
msgstr "Модели клавиатур"
#: install_station/keyboard.py:230
msgid "English (US)"
msgstr ""
msgstr "Английский (США)"
#: install_station/keyboard.py:231
msgid "English (Canada)"
msgstr ""
msgstr "Английский (Канада)"
#: install_station/keyboard.py:232
msgid "French (Canada)"
msgstr ""
msgstr "Французский (Канада)"
#: install_station/language.py:93 install_station/language.py:197
msgid "Please select your language:"
msgstr ""
msgstr "Пожалуйста, выберите ваш язык:"
#: install_station/language.py:99 install_station/language.py:116
msgid "Language"
msgstr ""
msgstr "Язык"
#: install_station/network_setup.py:107 install_station/network_setup.py:184
msgid "Network card connected to the internet"
msgstr ""
msgstr "Сетевая карта подключена к интернету"
#: install_station/network_setup.py:113 install_station/network_setup.py:190
msgid "Network card not connected to the internet"
msgstr ""
msgstr "Сетевая карта не подключена к интернету"
#: install_station/network_setup.py:116 install_station/network_setup.py:193
msgid "No network card detected"
msgstr ""
msgstr "Сетевая карта не обнаружена"
#: install_station/network_setup.py:125 install_station/network_setup.py:203
msgid "WiFi card detected and connected to an access point"
msgstr ""
msgstr "Wi-Fi карта обнаружена и подключена к точке доступа"
#: install_station/network_setup.py:129 install_station/network_setup.py:207
msgid "WiFi card detected but not connected to an access point"
msgstr ""
msgstr "Wi-Fi карта обнаружена, но не подключена к точке доступа"
#: install_station/network_setup.py:132 install_station/network_setup.py:210
msgid "WiFi card not detected or not supported"
msgstr ""
msgstr "Wi-Fi карта не обнаружена или не поддерживается"
#: install_station/network_setup.py:366
msgid "Wi-Fi Network Authentication Required"
msgstr ""
msgstr "Требуется аутентификация в Wi-Fi сети"
#: install_station/network_setup.py:379
#, python-brace-format
msgid "{ssid} Wi-Fi Network Authentication failed"
msgstr ""
msgstr "Аутентификация в Wi-Fi сети {ssid} не удалась"
#: install_station/network_setup.py:381
#, python-brace-format
msgid "Authentication required by {ssid} Wi-Fi Network"
msgstr ""
msgstr "Аутентификация, требуемая Wi-Fi сетью {ssid}"
#: install_station/network_setup.py:384
msgid "Password:"
msgstr ""
msgstr "Пароль:"
#: install_station/network_setup.py:387
msgid "Show password"
msgstr ""
msgstr "Показать пароль"
#: install_station/try_install.py:102
msgid "What would you like to do?"
msgstr ""
msgstr "Что бы вы хотели сделать?"
#: install_station/try_install.py:109
msgid ""
"<b>Install GhostBSD</b>\n"
"Install GhostBSD on your computer."
msgstr ""
"<b>Установить GhostBSD</b>\n"
"Установить GhostBSD на ваш компьютер."
#: install_station/try_install.py:122
msgid ""
"<b>Try GhostBSD</b>\n"
"Run GhostBSD without installing to your computer."
msgstr ""
"<b>Попробовать GhostBSD</b>\n"
"Запустить GhostBSD без установки на ваш компьютер."
#: install_station/use_zfs.py:160
msgid ""
"Please select 1 or more drive for stripe (select the smallest disk first)"
msgstr ""
msgstr "Пожалуйста, выберите 1 или более дисков для stripe (сначала выберите наименьший диск)"
#: install_station/use_zfs.py:167
msgid "Please select 2 drive for mirroring (select the smallest disk first)"
msgstr ""
msgstr "Пожалуйста, выберите 2 диска для зеркалирования (сначала выберите наименьший диск)"
#: install_station/use_zfs.py:175
msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)"
msgstr ""
msgstr "Пожалуйста, выберите 3 диска для RAIDZ1 (сначала выберите наименьший диск)"
#: install_station/use_zfs.py:182
msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)"
msgstr ""
msgstr "Пожалуйста, выберите 4 диска для RAIDZ2 (сначала выберите наименьший диск)"
#: install_station/use_zfs.py:189
msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)"
msgstr ""
msgstr "Пожалуйста, выберите 5 дисков для RAIDZ3 (сначала выберите наименьший диск)"
#: install_station/use_zfs.py:292
msgid "Disk"
msgstr ""
msgstr "Диск"
#: install_station/use_zfs.py:299
msgid "Size(MB)"
msgstr ""
msgstr "Размер (МБ)"
#: install_station/use_zfs.py:305
msgid "Name"
msgstr ""
msgstr "Имя"
#: install_station/use_zfs.py:309
msgid "Check"
msgstr ""
msgstr "Выбрать"
#: install_station/use_zfs.py:322
msgid "Please select one drive"
msgstr ""
msgstr "Пожалуйста, выберите один диск"
#: install_station/use_zfs.py:327
msgid "<b>Pool Type</b>"
msgstr ""
msgstr "<b>Тип пула</b>"
#: install_station/use_zfs.py:331
msgid "1+ disks Stripe"
msgstr ""
msgstr "1+ диск(ов) Stripe"
#: install_station/use_zfs.py:332
msgid "2+ disks Mirror"
msgstr ""
msgstr "2+ диск(а) Mirror"
#: install_station/use_zfs.py:333
msgid "3 disks RAIDZ1"
msgstr ""
msgstr "3 диска RAIDZ1"
#: install_station/use_zfs.py:334
msgid "4 disks RAIDZ2"
msgstr ""
msgstr "4 диска RAIDZ2"
#: install_station/use_zfs.py:335
msgid "5 disks RAIDZ3"
msgstr ""
msgstr "5 дисков RAIDZ3"
#: install_station/use_zfs.py:345
msgid "<b>Pool Name</b>"
msgstr ""
msgstr "<b>Имя пула</b>"
#: install_station/use_zfs.py:365
msgid "Encrypt Disk"
msgstr ""
msgstr "Шифровать диск"
#: install_station/use_zfs.py:369
msgid "Password"
msgstr ""
msgstr "Пароль"
#: install_station/use_zfs.py:376
msgid "Verify it"
msgstr ""
msgstr "Подтвердите его"
#: install_station/use_zfs.py:537
msgid "Warning"
msgstr ""
msgstr "Предупреждение"
#: install_station/use_zfs.py:548
msgid "Smallest disk need to be SELECTED first!\n"
msgstr ""
msgstr "Сначала нужно выбрать наименьший диск!\n"
#: install_station/use_zfs.py:549
msgid "All the disk selected will reset."
msgstr ""
msgstr "Все выбранные диски будут сброшены."
+119 -94
View File
@@ -13,111 +13,111 @@ msgstr ""
"Language-Team: Turkish <gnome-turk@gnome.org>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\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:241
msgid "Boot Option"
msgstr ""
msgstr "Önyükleme Seçeneği"
#: install_station/boot_manager.py:135
msgid "Setup rEFInd boot manager"
msgstr ""
msgstr "rEFInd önyükleme yöneticisini kur"
#: install_station/boot_manager.py:149
msgid "Setup FreeBSD boot manager"
msgstr ""
msgstr "FreeBSD önyükleme yöneticisini kur"
#: install_station/boot_manager.py:164
#, python-brace-format
msgid "FreeBSD {loader} loader only"
msgstr ""
msgstr "Yalnızca FreeBSD {loader} yükleyicisi"
#: install_station/common.py:123
msgid "Space not allowed"
msgstr ""
msgstr "Boşluk bırakılamaz"
#: install_station/common.py:125 install_station/common.py:127
msgid "Super Weak"
msgstr ""
msgstr "Aşırı Zayıf"
#: install_station/common.py:129 install_station/common.py:135
msgid "Very Weak"
msgstr ""
msgstr "Çok Zayıf"
#: install_station/common.py:131 install_station/common.py:137
#: install_station/common.py:143
msgid "Fairly Weak"
msgstr ""
msgstr "Oldukça Zayıf"
#: install_station/common.py:133 install_station/common.py:139
#: install_station/common.py:145 install_station/common.py:151
msgid "Weak"
msgstr ""
msgstr "Zayıf"
#: install_station/common.py:141 install_station/common.py:147
#: install_station/common.py:153 install_station/common.py:159
msgid "Strong"
msgstr ""
msgstr "Güçlü"
#: install_station/common.py:149 install_station/common.py:155
#: install_station/common.py:161 install_station/common.py:167
msgid "Fairly Strong"
msgstr ""
msgstr "Oldukça Güçlü"
#: install_station/common.py:157 install_station/common.py:163
msgid "Very Strong"
msgstr ""
msgstr "Çok Güçlü"
#: install_station/common.py:165 install_station/common.py:169
msgid "Super Strong"
msgstr ""
msgstr "Aşırı Güçlü"
#: install_station/custom.py:248
msgid "Create"
msgstr ""
msgstr "Oluştur"
#: install_station/custom.py:252
msgid "Delete"
msgstr ""
msgstr "Sil"
#: install_station/custom.py:256
msgid "Revert"
msgstr ""
msgstr "Geri al"
#: install_station/custom.py:260
msgid "Auto"
msgstr ""
msgstr "Otomatik"
#: install_station/custom.py:328 install_station/custom.py:566
msgid "Add Partition"
msgstr ""
msgstr "Bölüm Ekle"
#: install_station/custom.py:342
msgid "Type:"
msgstr ""
msgstr "Tür:"
#: install_station/custom.py:343 install_station/custom.py:580
msgid "Size(MB):"
msgstr ""
msgstr "Boyut(MB):"
#: install_station/custom.py:344
msgid "Mount point:"
msgstr ""
msgstr "Bağlama noktası:"
#: install_station/custom.py:496
msgid "Partition Scheme"
msgstr ""
msgstr "Bölümlendirme Şeması"
#: install_station/custom.py:515
msgid "GPT: GUID Partition Table"
msgstr ""
msgstr "GPT: GUID Bölümlendirme Tablosu"
#: install_station/custom.py:516
msgid "MBR: DOS Partition"
msgstr ""
msgstr "MBR: DOS Bölümlendirmesi"
#: install_station/end.py:10
msgid ""
@@ -127,30 +127,35 @@ msgid ""
"any changes you make or documents you save will\n"
"not be preserved on reboot."
msgstr ""
"Kurulum tamamlandı. Yeni kurulumu kullanmak için\n"
"bilgisayarı yeniden başlatmanız gerekiyor.\n"
"Canlı ortamı kullanmaya devam edebilirsiniz; ancak\n"
"yaptığınız herhangi bir değişiklik veya kaydettiğiniz bir belge\n"
"yeniden başlatmadan sonra korunmayacaktır."
#: install_station/end.py:31
msgid "Installation Completed"
msgstr ""
msgstr "Kurulum Tamamlandı"
#: install_station/end.py:47
msgid "Restart"
msgstr ""
msgstr "Yeniden Başlat"
#: install_station/end.py:49
msgid "Continue"
msgstr ""
msgstr "Devam Et"
#: install_station/error.py:17
msgid "Installation Error"
msgstr ""
msgstr "Kurulum Hatası"
#: install_station/error.py:28
msgid "Installation has failed!"
msgstr ""
msgstr "Kurulum başarısız oldu!"
#: install_station/error.py:33
msgid "GhostBSD issue system"
msgstr ""
msgstr "GhostBSD Sorun Takip Sistemi"
#: install_station/error.py:35
#, python-brace-format
@@ -158,14 +163,16 @@ msgid ""
"Please report the issue to {anchor}, and \n"
"be sure to provide /tmp/.pc-sysinstall/pc-sysinstall.log."
msgstr ""
"Lütfen sorunu {anchor} adresine bildirin ve \n"
"/tmp/.pc-sysinstall/pc-sysinstall.log dosyasını eklediğinizden emin olun."
#: install_station/error.py:45
msgid "Ok"
msgstr ""
msgstr "Tamam"
#: install_station/install_type.py:94
msgid "How do you want to install GhostBSD?"
msgstr ""
msgstr "GhostBSD'yi nasıl yüklemek istersiniz?"
#: install_station/install_type.py:100
msgid ""
@@ -173,32 +180,37 @@ msgid ""
"Install GhostBSD using Stripe, Mirror, RAIDZ1, RAIDZ2, or RAIDZ3 "
"configurations."
msgstr ""
"<b>Disk Yapılandırması</b>\n"
"GhostBSD'yi Stripe, Mirror, RAIDZ1, RAIDZ2 veya RAIDZ3 yapılandırmalarını "
"kullanarak kurun."
#: install_station/install_type.py:113
msgid ""
"<b>Multi-Boot Configuration</b>\n"
"Install GhostBSD with ZFS alongside other operating systems."
msgstr ""
"<b>Çoklu Önyükleme Yapılandırması</b>\n"
"GhostBSD'yi ZFS ile birlikte diğer işletim sistemlerinin yanına kurun."
#: install_station/install.py:46
msgid "Creating ghostbsd_installation.cfg"
msgstr ""
msgstr "ghostbsd_installation.cfg Oluşturuluyor"
#: install_station/install.py:50
msgid "Deleting partition"
msgstr ""
msgstr "Bölümlendirme siliniyor"
#: install_station/install.py:55
msgid "Creating disk partition"
msgstr ""
msgstr "Disk bölümlendirmesi oluşturuluyor"
#: install_station/install.py:60
msgid "Creating new partitions"
msgstr ""
msgstr "Yeni bölümlendirmeler oluşturuluyor"
#: install_station/install.py:90
msgid "Installation in progress"
msgstr ""
msgstr "Kuruluyor"
#: install_station/install.py:102
msgid ""
@@ -211,253 +223,266 @@ msgid ""
"\n"
"We hope you'll enjoy our BSD operating system."
msgstr ""
"GhostBSD'yi seçtiğiniz için teşekkür ederiz!\n"
"\n"
"Her işletim sisteminin basit, zarif, güvenli olması, gizliliğinizi koruması ve "
"aynı zamanda kullanım kolaylığı sunması gerektiğine inanıyoruz. "
"GhostBSD, FreeBSD'yi kullanmak için gereken teknik uzmanlığa sahip olmayanlar "
"için sistemi basitleştiriyor ve BSD'ye giriş eşiğini düşürüyor. \n"
"\n"
"İşletim sistemimizi keyifle kullanmanızı umuyoruz."
#: install_station/interface_controller.py:24
#: install_station/interface_controller.py:35
msgid "Back"
msgstr ""
msgstr "Geri"
#: install_station/interface_controller.py:26
#: install_station/interface_controller.py:36
msgid "Cancel"
msgstr ""
msgstr "İptal"
#: install_station/interface_controller.py:28
#: install_station/interface_controller.py:37
#: install_station/interface_controller.py:297
msgid "Next"
msgstr ""
msgstr "İleri"
#: install_station/interface_controller.py:129
#: install_station/interface_controller.py:130 install_station/language.py:101
msgid "Welcome to GhostBSD"
msgstr ""
msgstr "GhostBSD'ye Hoş geldiniz"
#: install_station/interface_controller.py:139
msgid "Button"
msgstr ""
msgstr "Buton"
#: install_station/interface_controller.py:160
msgid "Keyboard Setup"
msgstr ""
msgstr "Klavye Yapılandırması"
#: install_station/interface_controller.py:172
#: install_station/interface_controller.py:274
#: install_station/interface_controller.py:279
msgid "Network Setup"
msgstr ""
msgstr "Ağ Yapılandırması"
#: install_station/interface_controller.py:183
msgid "Try Or Install GhostBSD"
msgstr ""
msgstr "GhostBSD'yi Deneyin veya Kurun"
#: install_station/interface_controller.py:194
msgid "Installation Types"
msgstr ""
msgstr "Kurulum Türleri"
#: install_station/interface_controller.py:221
msgid "Custom Configuration"
msgstr ""
msgstr "Özel Yapılandırma"
#: install_station/interface_controller.py:231
msgid "ZFS Configuration"
msgstr ""
msgstr "ZFS Yapılandırması"
#: install_station/interface_controller.py:243
msgid "Install"
msgstr ""
msgstr "Kur"
#: install_station/interface_controller.py:253
msgid "Installation Progress"
msgstr ""
msgstr "Kurulum İlerlemesi"
#: install_station/interface_controller.py:260
msgid "Progress Bar"
msgstr ""
msgstr "İlerleme Çubuğu"
#: install_station/keyboard.py:45
msgid "Type here to test your keyboard"
msgstr ""
msgstr "Klavyenizi test etmek için buraya yazın"
#: install_station/keyboard.py:102
msgid "Keyboard Layout"
msgstr ""
msgstr "Klavye Düzeni"
#: install_station/keyboard.py:122
msgid "Keyboard Models"
msgstr ""
msgstr "Klavye Modelleri"
#: install_station/keyboard.py:230
msgid "English (US)"
msgstr ""
msgstr "İngilizce (ABD)"
#: install_station/keyboard.py:231
msgid "English (Canada)"
msgstr ""
msgstr "İngilizce (Kanada)"
#: install_station/keyboard.py:232
msgid "French (Canada)"
msgstr ""
msgstr "Fransızca (Kanada)"
#: install_station/language.py:93 install_station/language.py:197
msgid "Please select your language:"
msgstr ""
msgstr "Lütfen dilinizi seçin:"
#: install_station/language.py:99 install_station/language.py:116
msgid "Language"
msgstr ""
msgstr "Dil"
#: install_station/network_setup.py:107 install_station/network_setup.py:184
msgid "Network card connected to the internet"
msgstr ""
msgstr "İnternete bağlı ağ kartı"
#: install_station/network_setup.py:113 install_station/network_setup.py:190
msgid "Network card not connected to the internet"
msgstr ""
msgstr "İnternete bağlı olmayan ağ kartı"
#: install_station/network_setup.py:116 install_station/network_setup.py:193
msgid "No network card detected"
msgstr ""
msgstr "Ağ kartı bulunamadı"
#: install_station/network_setup.py:125 install_station/network_setup.py:203
msgid "WiFi card detected and connected to an access point"
msgstr ""
msgstr "WiFi kartı algılandı ve bir erişim noktasına bağlı"
#: install_station/network_setup.py:129 install_station/network_setup.py:207
msgid "WiFi card detected but not connected to an access point"
msgstr ""
msgstr "WiFi kartı algılandı ancak bir erişim noktasına bağlı değil"
#: install_station/network_setup.py:132 install_station/network_setup.py:210
msgid "WiFi card not detected or not supported"
msgstr ""
msgstr "Wi-Fi kartı algılanmadı veya desteklenmiyor"
#: install_station/network_setup.py:366
msgid "Wi-Fi Network Authentication Required"
msgstr ""
msgstr "Wi-Fi Ağ Kimlik Doğrulaması Gerekli"
#: install_station/network_setup.py:379
#, python-brace-format
msgid "{ssid} Wi-Fi Network Authentication failed"
msgstr ""
msgstr "{ssid} Wi-Fi ağı için kimlik doğrulaması başarısız oldu"
#: install_station/network_setup.py:381
#, python-brace-format
msgid "Authentication required by {ssid} Wi-Fi Network"
msgstr ""
msgstr "{ssid} Wi-Fi ağı için kimlik doğrulaması gerekiyor"
#: install_station/network_setup.py:384
msgid "Password:"
msgstr ""
msgstr "Şifre:"
#: install_station/network_setup.py:387
msgid "Show password"
msgstr ""
msgstr "Şifreyi göster"
#: install_station/try_install.py:102
msgid "What would you like to do?"
msgstr ""
msgstr "Ne yapmak istersiniz?"
#: install_station/try_install.py:109
msgid ""
"<b>Install GhostBSD</b>\n"
"Install GhostBSD on your computer."
msgstr ""
"<b>GhostBSD'yi Kur</b>\n"
"GhostBSD'yi bilgisayarınıza kurun."
#: install_station/try_install.py:122
msgid ""
"<b>Try GhostBSD</b>\n"
"Run GhostBSD without installing to your computer."
msgstr ""
"<b>GhostBSD'yi Dene</b>\n"
"Bilgisayarınızda GhostBSD'yi kurmadan çalıştırın."
#: install_station/use_zfs.py:160
msgid ""
"Please select 1 or more drive for stripe (select the smallest disk first)"
msgstr ""
"Lütfen stripe için 1 veya daha fazla sürücü seçin (öncelikle en küçük diski seçin)."
#: install_station/use_zfs.py:167
msgid "Please select 2 drive for mirroring (select the smallest disk first)"
msgstr ""
msgstr "Lütfen mirror için 2 sürücü seçin (öncelikle en küçük diski seçin)"
#: install_station/use_zfs.py:175
msgid "Please select 3 drive for RAIDZ1 (select the smallest disk first)"
msgstr ""
msgstr "Lütfen RAIDZ1 için 3 sürücü seçin (öncelikle en küçük diski seçin)"
#: install_station/use_zfs.py:182
msgid "Please select 4 drive for RAIDZ2 (select the smallest disk first)"
msgstr ""
msgstr "Lütfen RAIDZ2 için 4 sürücü seçin (öncelikle en küçük diski seçin)"
#: install_station/use_zfs.py:189
msgid "Please select 5 drive for RAIDZ3 (select the smallest disk first)"
msgstr ""
msgstr "Lütfen RAIDZ3 için 5 sürücü seçin (öncelikle en küçük diski seçin)"
#: install_station/use_zfs.py:292
msgid "Disk"
msgstr ""
msgstr "Disk"
#: install_station/use_zfs.py:299
msgid "Size(MB)"
msgstr ""
msgstr "Boyut(MB)"
#: install_station/use_zfs.py:305
msgid "Name"
msgstr ""
msgstr "İsim"
#: install_station/use_zfs.py:309
msgid "Check"
msgstr ""
msgstr "Kontrol Et"
#: install_station/use_zfs.py:322
msgid "Please select one drive"
msgstr ""
msgstr "Lütfen bir sürücü seçiniz"
#: install_station/use_zfs.py:327
msgid "<b>Pool Type</b>"
msgstr ""
msgstr "<b>Havuz Türü</b>"
#: install_station/use_zfs.py:331
msgid "1+ disks Stripe"
msgstr ""
msgstr "1+ diskli Stripe"
#: install_station/use_zfs.py:332
msgid "2+ disks Mirror"
msgstr ""
msgstr "2+ diskli Mirror"
#: install_station/use_zfs.py:333
msgid "3 disks RAIDZ1"
msgstr ""
msgstr "3 diskli RAIDZ1"
#: install_station/use_zfs.py:334
msgid "4 disks RAIDZ2"
msgstr ""
msgstr "4 diskli RAIDZ2"
#: install_station/use_zfs.py:335
msgid "5 disks RAIDZ3"
msgstr ""
msgstr "5 diskli RAIDZ3"
#: install_station/use_zfs.py:345
msgid "<b>Pool Name</b>"
msgstr ""
msgstr "<b>Havuz Adı</b>"
#: install_station/use_zfs.py:365
msgid "Encrypt Disk"
msgstr ""
msgstr "Diski Şifrele"
#: install_station/use_zfs.py:369
msgid "Password"
msgstr ""
msgstr "Şifre"
#: install_station/use_zfs.py:376
msgid "Verify it"
msgstr ""
msgstr "Doğrula"
#: install_station/use_zfs.py:537
msgid "Warning"
msgstr ""
msgstr "Uyarı"
#: install_station/use_zfs.py:548
msgid "Smallest disk need to be SELECTED first!\n"
msgstr ""
msgstr "Öncelikle en küçük disk SEÇİLMELİDİR!\n"
#: install_station/use_zfs.py:549
msgid "All the disk selected will reset."
msgstr ""
msgstr "Seçilen tüm diskler sıfırlanacaktır."
+3 -2
View File
@@ -14,7 +14,7 @@ from DistUtilsExtra.command.build_i18n import build_i18n
from DistUtilsExtra.command.clean_i18n import clean_i18n
prefix = sys.prefix
__VERSION__ = '0.1'
__VERSION__ = '0.4'
PROGRAM_VERSION = __VERSION__
@@ -157,7 +157,8 @@ lib_install_station_backend_query = [
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)
(f'{prefix}/lib/install-station/image', lib_install_station_image),
(f'{prefix}/etc/rc.d', ['src/install_station'])
]
data_files.extend(data_file_list(f'{prefix}/share/locale', 'build/mo'))
+36
View File
@@ -0,0 +1,36 @@
#!/bin/sh
#
# PROVIDE: install_station
# REQUIRE: LOGIN FILESYSTEMS
# BEFORE: lightdm
# KEYWORD: shutdown
. /etc/rc.subr
name="install_station"
rcvar="${name}_enable"
start_cmd="${name}_start"
stop_cmd=":"
install_station_start()
{
# Create .xinitrc for root to run installer
cat > /root/.xinitrc <<'EOF'
exec marco &
exec feh --bg-fill /usr/local/share/backgrounds/ghostbsd/blue-layered-stripes.jpg &
exec install-station
EOF
chmod 755 /root/.xinitrc
# Start X as root - this will block until install-station exits
su -l root -c "startx -- :0 vt09"
# Cleanup
rm -f /root/.xinitrc
# Disable this service for future boots
sysrc install_station_enable=NO
}
load_rc_config $name
run_rc_command "$1"