From 03be190e660dbe105fb52ba46d1267ffb00b576f Mon Sep 17 00:00:00 2001 From: Nippy Date: Thu, 17 Sep 2026 16:35:07 +0200 Subject: welcome app fix --- raveos-welcome/PKGBUILD | 2 +- raveos-welcome/raveos_welcome.py | 339 +++++++++++++++++++++------------------ 2 files changed, 183 insertions(+), 158 deletions(-) (limited to 'raveos-welcome') diff --git a/raveos-welcome/PKGBUILD b/raveos-welcome/PKGBUILD index bd3c6ed..d56278f 100644 --- a/raveos-welcome/PKGBUILD +++ b/raveos-welcome/PKGBUILD @@ -1,7 +1,7 @@ # Maintainer: nippy pkgname=raveos-welcome pkgver=2.2.2 -pkgrel=4 +pkgrel=5 pkgdesc="RaveOS Welcome Application and Safe GPU Performance Optimizer" arch=('x86_64') url="https://git.rp1.hu/RaveOS/RaveOS-PKGBUILD" diff --git a/raveos-welcome/raveos_welcome.py b/raveos-welcome/raveos_welcome.py index 7d1d9e6..2ad5a6d 100644 --- a/raveos-welcome/raveos_welcome.py +++ b/raveos-welcome/raveos_welcome.py @@ -19,7 +19,7 @@ from PyQt6.QtWidgets import ( ) from PyQt6.QtCore import ( Qt, QThread, pyqtSignal, QTimer, QPropertyAnimation, - QEasingCurve, QPoint, QSize, pyqtProperty, QObject, QProcess + QEasingCurve, QPoint, QSize, pyqtProperty, QObject, QProcess, QLocale ) from PyQt6.QtGui import ( QFont, QFontDatabase, QColor, QPalette, QLinearGradient, @@ -54,51 +54,68 @@ COLORS = { # ─── Translations ───────────────────────────────────────────────────────────── -_current_lang = "hu" +def _detect_system_lang(): + """Kezdőnyelv a rendszer locale alapján (hu/de, egyébként en).""" + try: + name = QLocale.system().name() + except Exception: + return "en" + if name.startswith("hu"): + return "hu" + if name.startswith("de"): + return "de" + return "en" + +_current_lang = _detect_system_lang() T = { # Nav - "nav_back": {"hu": "← Vissza", "en": "← Back"}, - "nav_next": {"hu": "Tovább →", "en": "Next →"}, + "nav_back": {"hu": "← Vissza", "de": "← Zurück", "en": "← Back"}, + "nav_next": {"hu": "Tovább →", "de": "Weiter →", "en": "Next →"}, # Step bar - "step_welcome": {"hu": "ÜDVÖZLÉS", "en": "WELCOME"}, - "step_network": {"hu": "HÁLÓZAT", "en": "NETWORK"}, - "step_optimize": {"hu": "OPTIMALIZÁCIÓ", "en": "OPTIMIZE"}, - "step_hyprland": {"hu": "HYPRLAND", "en": "HYPRLAND"}, - "step_credits": {"hu": "KÖZREMŰKÖDŐK", "en": "CREDITS"}, - "step_finish": {"hu": "BEFEJEZÉS", "en": "FINISH"}, + "step_welcome": {"hu": "ÜDVÖZLÉS", "de": "WILLKOMMEN", "en": "WELCOME"}, + "step_network": {"hu": "HÁLÓZAT", "de": "NETZWERK", "en": "NETWORK"}, + "step_optimize": {"hu": "OPTIMALIZÁCIÓ", "de": "OPTIMIERUNG", "en": "OPTIMIZE"}, + "step_hyprland": {"hu": "HYPRLAND", "de": "HYPRLAND", "en": "HYPRLAND"}, + "step_credits": {"hu": "KÖZREMŰKÖDŐK", "de": "MITWIRKENDE", "en": "CREDITS"}, + "step_finish": {"hu": "BEFEJEZÉS", "de": "ABSCHLUSS", "en": "FINISH"}, # Welcome page - "welcome_tag": {"hu": "LINUX DISTRIBUTION", "en": "LINUX DISTRIBUTION"}, + "welcome_tag": {"hu": "LINUX DISTRIBUTION", "de": "LINUX DISTRIBUTION", "en": "LINUX DISTRIBUTION"}, "welcome_about": {"hu": "RaveOS finomhangolás, kulcsra kész állapot!", + "de": "RaveOS optimiert, startklar!", "en": "RaveOS tuned, ready to go!"}, - "btn_support": {"hu": "€ Támogatás", "en": "€ Support"}, + "btn_support": {"hu": "€ Támogatás", "de": "€ Unterstützen", "en": "€ Support"}, "feat_perf": {"hu": "CachyOS kernel\noptimalizált teljesítmény", + "de": "CachyOS Kernel\noptimierte Leistung", "en": "CachyOS kernel\noptimized performance"}, "feat_gaming": {"hu": "Gaming-ready\nProton, MangoHud, GameMode", + "de": "Gaming-ready\nProton, MangoHud, GameMode", "en": "Gaming-ready\nProton, MangoHud, GameMode"}, "feat_apps": {"hu": "App Installer\negy kattintás, minden szoftver", + "de": "App Installer\nein Klick, alle Software", "en": "App Installer\none click, all software"}, # WiFi page - "wifi_title": {"hu": "HÁLÓZAT", "en": "NETWORK"}, - "wifi_subtitle": {"hu": "WiFi kapcsolat", "en": "WiFi connection"}, - "wifi_scan": {"hu": "Frissítés", "en": "Refresh"}, - "wifi_password": {"hu": "Jelszó:", "en": "Password:"}, - "wifi_connect": {"hu": "CSATLAKOZÁS", "en": "CONNECT"}, - "wifi_scanning": {"hu": "Hálózatok keresése...","en": "Scanning networks..."}, - "wifi_none": {"hu": "Nem találtam hálózatot.","en": "No networks found."}, - "wifi_found": {"hu": "{n} hálózat található","en": "{n} networks found"}, - "wifi_open": {"hu": " [nyílt]", "en": " [open]"}, - "wifi_encrypted": {"hu": " [titkosított]", "en": " [encrypted]"}, - "wifi_selected": {"hu": "Kiválasztva: {ssid}", "en": "Selected: {ssid}"}, - "wifi_connecting": {"hu": "Csatlakozás folyamatban...","en": "Connecting..."}, - "wifi_connected": {"hu": "Csatlakozva: {ssid}", "en": "Connected: {ssid}"}, - "wifi_error": {"hu": "Hiba: {err}", "en": "Error: {err}"}, - "wifi_timeout": {"hu": "Időtúllépés — próbáld újra","en": "Timeout — try again"}, - "wifi_unknown_err": {"hu": "Ismeretlen hiba", "en": "Unknown error"}, + "wifi_title": {"hu": "HÁLÓZAT", "de": "NETZWERK", "en": "NETWORK"}, + "wifi_subtitle": {"hu": "WiFi kapcsolat", "de": "WLAN-Verbindung", "en": "WiFi connection"}, + "wifi_scan": {"hu": "Frissítés", "de": "Aktualisieren", "en": "Refresh"}, + "wifi_password": {"hu": "Jelszó:", "de": "Passwort:", "en": "Password:"}, + "wifi_connect": {"hu": "CSATLAKOZÁS", "de": "VERBINDEN", "en": "CONNECT"}, + "wifi_scanning": {"hu": "Hálózatok keresése...","de": "Netzwerke werden gesucht...", "en": "Scanning networks..."}, + "wifi_none": {"hu": "Nem találtam hálózatot.","de": "Kein Netzwerk gefunden.", "en": "No networks found."}, + "wifi_found": {"hu": "{n} hálózat található","de": "{n} Netzwerke gefunden", "en": "{n} networks found"}, + "wifi_open": {"hu": " [nyílt]", "de": " [offen]", "en": " [open]"}, + "wifi_encrypted": {"hu": " [titkosított]", "de": " [verschlüsselt]", "en": " [encrypted]"}, + "wifi_selected": {"hu": "Kiválasztva: {ssid}", "de": "Ausgewählt: {ssid}", "en": "Selected: {ssid}"}, + "wifi_connecting": {"hu": "Csatlakozás folyamatban...","de": "Verbindung wird hergestellt...", "en": "Connecting..."}, + "wifi_connected": {"hu": "Csatlakozva: {ssid}", "de": "Verbunden: {ssid}", "en": "Connected: {ssid}"}, + "wifi_error": {"hu": "Hiba: {err}", "de": "Fehler: {err}", "en": "Error: {err}"}, + "wifi_timeout": {"hu": "Időtúllépés — próbáld újra","de": "Zeitüberschreitung — bitte erneut versuchen", "en": "Timeout — try again"}, + "wifi_unknown_err": {"hu": "Ismeretlen hiba", "de": "Unbekannter Fehler", "en": "Unknown error"}, # Optimize page - "opt_title": {"hu": "OPTIMALIZÁCIÓ", "en": "OPTIMIZATION"}, - "opt_gaming": {"hu": "GAMING OPTIMALIZÁCIÓ — GPU: {gpu}", "en": "GAMING OPTIMIZATION — GPU: {gpu}"}, + "opt_title": {"hu": "OPTIMALIZÁCIÓ", "de": "OPTIMIERUNG", "en": "OPTIMIZATION"}, + "opt_gaming": {"hu": "GAMING OPTIMALIZÁCIÓ — GPU: {gpu}", "de": "GAMING-OPTIMIERUNG — GPU: {gpu}", "en": "GAMING OPTIMIZATION — GPU: {gpu}"}, "opt_sysctl": {"hu": "Kernel/sysctl tweaks", + "de": "Kernel/sysctl-Tweaks", "en": "Kernel/sysctl tweaks"}, "opt_sysctl_desc": {"hu": "Kernel paraméterek optimalizálása gaming-hoz:\n" "• vm.swappiness=10 — RAM preferálása swap helyett\n" @@ -107,6 +124,7 @@ T = { "• split_lock_mitigate=0 — egyes játékok gyorsabban futnak\n" "• TCP FastOpen — gyorsabb hálózati kapcsolatok online játékhoz\n" "Permanensen mentve: /etc/sysctl.d/99-gaming.conf", + "de": "Kernel-Parameter-Optimierung für Gaming:\n• vm.swappiness=10 — RAM statt Swap bevorzugen\n• THP=madvise — Transparent Huge Pages, weniger Micro-Stutter\n• NMI-Watchdog aus — weniger CPU-Interrupt-Overhead\n• split_lock_mitigate=0 — manche Spiele laufen schneller\n• TCP FastOpen — schnelleres Netzwerk für Online-Gaming\nDauerhaft gespeichert: /etc/sysctl.d/99-gaming.conf", "en": "Kernel parameter optimization for gaming:\n" "• vm.swappiness=10 — prefer RAM over swap\n" "• THP=madvise — Transparent Huge Pages, less micro-stutter\n" @@ -115,30 +133,35 @@ T = { "• TCP FastOpen — faster network for online gaming\n" "Saved permanently: /etc/sysctl.d/99-gaming.conf"}, "opt_io_sched": {"hu": "I/O Scheduler", + "de": "I/O Scheduler", "en": "I/O Scheduler"}, "opt_io_sched_desc":{"hu": "Lemez olvasás/írás ütemező optimalizálása:\n" "• SSD → mq-deadline: alacsonyabb latency mint BFQ\n" "• NVMe → none: NVMe saját belső ütemezőt használ, külső felesleges\n" "• HDD → bfq: legjobb forgódobos meghajtóhoz\n" "Permanensen mentve: /etc/udev/rules.d/60-ssd-scheduler.rules", + "de": "Optimierung des I/O-Schedulers:\n• SSD → mq-deadline: geringere Latenz als BFQ\n• NVMe → none: NVMe nutzt seinen eigenen internen Scheduler\n• HDD → bfq: am besten für rotierende Laufwerke\nDauerhaft gespeichert: /etc/udev/rules.d/60-ssd-scheduler.rules", "en": "Disk I/O scheduler optimization:\n" "• SSD → mq-deadline: lower latency than BFQ\n" "• NVMe → none: NVMe uses its own internal scheduler\n" "• HDD → bfq: best for rotational drives\n" "Saved permanently: /etc/udev/rules.d/60-ssd-scheduler.rules"}, "opt_ananicy": {"hu": "ananicy-cpp", + "de": "ananicy-cpp", "en": "ananicy-cpp"}, "opt_ananicy_desc": {"hu": "Automatikus process prioritás kezelő:\n" "• Játékok indításkor magasabb CPU prioritást kapnak\n" "• Háttérfolyamatok (frissítők, indexelők) alacsonyabb prioritást kapnak\n" "• Eredmény: stabilabb FPS, kevesebb frame drop\n" "Telepíti: ananicy-cpp + cachyos-ananicy-rules, majd engedélyezi", + "de": "Automatische Prozess-Prioritätsverwaltung:\n• Spiele erhalten beim Start eine höhere CPU-Priorität\n• Hintergrundprozesse (Updater, Indexer) erhalten niedrigere Priorität\n• Ergebnis: stabilere FPS, weniger Frame-Drops\nInstalliert: ananicy-cpp + cachyos-ananicy-rules und aktiviert sie", "en": "Automatic process priority handler:\n" "• Games get higher CPU priority on launch\n" "• Background processes (updaters, indexers) get lower priority\n" "• Result: more stable FPS, fewer frame drops\n" "Installs: ananicy-cpp + cachyos-ananicy-rules, then enables"}, "opt_gamemode": {"hu": "GameMode + MangoHud", + "de": "GameMode + MangoHud", "en": "GameMode + MangoHud"}, "opt_gamemode_desc":{"hu": "GameMode: automatikus teljesítmény-boost játék közben:\n" "• CPU governor powersave → performance játék indításkor\n" @@ -148,6 +171,7 @@ T = { "• FPS, frametime, GPU/CPU hőmérséklet, VRAM kijelzés\n" "• GOverlay: grafikus felület a MangoHud beállításához\n" "• Steam launch options: MANGOHUD=1 gamemoderun %command%", + "de": "GameMode: automatischer Leistungsschub beim Spielen:\n• CPU-Governor powersave → performance beim Spielstart\n• Wechselt beim Beenden des Spiels zurück zu powersave\n• I/O- und Prozesspriorität werden ebenfalls optimiert\n\nMangoHud: In-Game-Overlay:\n• FPS, Frametime, GPU/CPU-Temperatur, VRAM-Anzeige\n• GOverlay: GUI zum Konfigurieren von MangoHud\n• Steam-Startoptionen: MANGOHUD=1 gamemoderun %command%", "en": "GameMode: automatic performance boost while gaming:\n" "• CPU governor powersave → performance on game launch\n" "• Reverts to powersave when game closes\n" @@ -157,42 +181,49 @@ T = { "• GOverlay: GUI to configure MangoHud\n" "• Steam launch options: MANGOHUD=1 gamemoderun %command%"}, "opt_gpu_profile": {"hu": "GPU Power Profile — 3D Full Screen", + "de": "GPU Power Profile — 3D Full Screen", "en": "GPU Power Profile — 3D Full Screen"}, "opt_gpu_profile_desc": {"hu": "AMDGPU teljesítmény profil átváltása 3D_FULL_SCREEN-re:\n" "• Agresszívebb GPU órajel játék közben\n" "• Alapértelmezett profil visszafogottabb teljesítményre törekszik\n" "• Eredmény: magasabb és stabilabb FPS\n" "Permanensen mentve: /etc/tmpfiles.d/gpu-power-profile.conf", + "de": "AMDGPU-Leistungsprofil auf 3D_FULL_SCREEN umstellen:\n• Aggressivere GPU-Takte beim Spielen\n• Das Standardprofil ist konservativer\n• Ergebnis: höhere und stabilere FPS\nDauerhaft gespeichert: /etc/tmpfiles.d/gpu-power-profile.conf", "en": "AMDGPU power profile switch to 3D_FULL_SCREEN:\n" "• More aggressive GPU clocks while gaming\n" "• Default profile is more conservative\n" "• Result: higher and more stable FPS\n" "Saved permanently: /etc/tmpfiles.d/gpu-power-profile.conf"}, "opt_amd_overdrive": {"hu": "AMD Overdrive (ppfeaturemask)", + "de": "AMD Overdrive (ppfeaturemask)", "en": "AMD Overdrive (ppfeaturemask)"}, "opt_amd_overdrive_desc": {"hu": "AMD GPU Overdrive funkciók feloldása:\n" "• Lehetővé teszi a manuális órajel és feszültség állítást (LACT-ban)\n" "• Alapértelmezetten az AMD zárolja ezeket a funkciókat\n" "• Beállítás: /etc/modprobe.d/99-amdgpu-overdrive.conf\n" "FIGYELEM: initramfs újraépítést igényel, újraindítás szükséges utána!", + "de": "AMD-GPU-Overdrive-Funktionen freischalten:\n• Ermöglicht manuelle Takt- und Spannungseinstellung (in LACT)\n• AMD sperrt diese Funktionen standardmäßig\n• Konfiguration: /etc/modprobe.d/99-amdgpu-overdrive.conf\nACHTUNG: erfordert einen initramfs-Neuaufbau, danach Neustart nötig!", "en": "Unlock AMD GPU Overdrive features:\n" "• Enables manual clock and voltage tuning (in LACT)\n" "• AMD locks these features by default\n" "• Config: /etc/modprobe.d/99-amdgpu-overdrive.conf\n" "WARNING: requires initramfs rebuild, reboot needed after!"}, "opt_amd_powercap": {"hu": "AMD GPU Power Cap — Maximum", + "de": "AMD GPU Power Cap — Maximum", "en": "AMD GPU Power Cap — Maximum"}, "opt_amd_powercap_desc": {"hu": "AMD GPU teljesítmény korlát feloldása maximumra:\n" "• A GPU alapból korlátozott TDP-re van beállítva\n" "• Ez beállítja a power1_cap értékét a maximálisan engedélyezett értékre\n" "• Eredmény: GPU teljes teljesítményen futhat, magasabb FPS csúcsok\n" "• Permanensen mentve: /etc/tmpfiles.d/amd-powercap.conf", + "de": "AMD-GPU-Leistungslimit auf Maximum freischalten:\n• Die GPU ist standardmäßig auf eine begrenzte TDP eingestellt\n• Setzt power1_cap auf den maximal erlaubten Wert\n• Ergebnis: GPU kann mit voller Leistung laufen, höhere FPS-Spitzen\n• Dauerhaft gespeichert: /etc/tmpfiles.d/amd-powercap.conf", "en": "Unlock AMD GPU power cap to maximum:\n" "• GPU is limited to restricted TDP by default\n" "• Sets power1_cap to the maximum allowed value\n" "• Result: GPU can run at full power, higher FPS peaks\n" "• Saved permanently: /etc/tmpfiles.d/amd-powercap.conf"}, "opt_nvidia_perf": {"hu": "Nvidia Maximum Performance", + "de": "Nvidia Maximum Performance", "en": "Nvidia Maximum Performance"}, "opt_nvidia_perf_desc": {"hu": "Nvidia GPU teljesítmény maximalizálása:\n" "• nvidia-smi persistence mode bekapcsolva (gyorsabb driver válasz)\n" @@ -200,108 +231,112 @@ T = { "• GPU firmware offload letiltva (NVreg_EnableGpuFirmware=0)\n" "Permanensen mentve: /etc/modprobe.d/99-nvidia-gaming.conf\n" "FIGYELEM: initramfs újraépítést igényel, újraindítás szükséges utána!", + "de": "Nvidia-GPU-Leistung maximieren:\n• nvidia-smi Persistence Mode an (schnellere Treiberantwort)\n• Auto-Boost auf älteren Karten deaktiviert (stabilere Takte)\n• GPU-Firmware-Offload deaktiviert (NVreg_EnableGpuFirmware=0)\nDauerhaft gespeichert: /etc/modprobe.d/99-nvidia-gaming.conf\nACHTUNG: erfordert einen initramfs-Neuaufbau, danach Neustart nötig!", "en": "Maximize Nvidia GPU performance:\n" "• nvidia-smi persistence mode on (faster driver response)\n" "• Auto-boost disabled on older cards (more stable clocks)\n" "• GPU firmware offload disabled (NVreg_EnableGpuFirmware=0)\n" "Saved permanently: /etc/modprobe.d/99-nvidia-gaming.conf\n" "WARNING: requires initramfs rebuild, reboot needed after!"}, - "opt_apply": {"hu": "TELEPÍTÉS / ALKALMAZÁS", "en": "INSTALL / APPLY"}, - "opt_apply_empty": {"hu": "Nincs kijelölve semmi.", "en": "Nothing selected."}, - "opt_apply_missing":{"hu": "Hiányzó script: ", "en": "Missing script: "}, - "opt_apply_ok": {"hu": "Sikeresen alkalmazva!", "en": "Successfully applied!"}, + "opt_apply": {"hu": "TELEPÍTÉS / ALKALMAZÁS", "de": "INSTALLIEREN / ANWENDEN", "en": "INSTALL / APPLY"}, + "opt_apply_empty": {"hu": "Nincs kijelölve semmi.", "de": "Nichts ausgewählt.", "en": "Nothing selected."}, + "opt_apply_missing":{"hu": "Hiányzó script: ", "de": "Fehlendes Skript: ", "en": "Missing script: "}, + "opt_apply_ok": {"hu": "Sikeresen alkalmazva!", "de": "Erfolgreich angewendet!", "en": "Successfully applied!"}, "opt_apply_err": {"hu": "Hiba (kód: {code}) — napló: {log}", + "de": "Fehler (Code: {code}) — Protokoll: {log}", "en": "Error (code: {code}) — log: {log}"}, "opt_reboot_needed": {"hu": "A GPU optimalizációk érvénybe lépéséhez a számítógépet újra kell indítani!", + "de": "Für die GPU-Optimierungen ist ein Neustart erforderlich!", "en": "A reboot is required for GPU optimizations to take effect!"}, # Hyprland page - "hypr_title": {"hu": "HYPRLAND — KEYBINDS", "en": "HYPRLAND — KEYBINDS"}, - "hypr_source": {"hu": "Forrás: ", "en": "Source: "}, - "hypr_none": {"hu": "Nem található Hyprland konfiguráció.", "en": "No Hyprland configuration found."}, + "hypr_title": {"hu": "HYPRLAND — KEYBINDS", "de": "HYPRLAND — TASTENKÜRZEL", "en": "HYPRLAND — KEYBINDS"}, + "hypr_source": {"hu": "Forrás: ", "de": "Quelle: ", "en": "Source: "}, + "hypr_none": {"hu": "Nem található Hyprland konfiguráció.", "de": "Keine Hyprland-Konfiguration gefunden.", "en": "No Hyprland configuration found."}, # Hyprland descriptions - "hypr_spotlight": {"hu": "Spotlight (DMS) megnyitása", "en": "Open Spotlight (DMS)"}, - "hypr_terminal": {"hu": "Terminál megnyitása (Kitty)", "en": "Open terminal (Kitty)"}, - "hypr_filemanager": {"hu": "Fájlkezelő megnyitása (Thunar)", "en": "Open file manager (Thunar)"}, - "hypr_launcher": {"hu": "App launcher megnyitása", "en": "Open app launcher"}, - "hypr_logout": {"hu": "Kijelentkezés / leállítás", "en": "Logout / shutdown"}, - "hypr_exit": {"hu": "Hyprland kilépés", "en": "Exit Hyprland"}, - "hypr_volume": {"hu": "Hangerő állítás", "en": "Adjust volume"}, - "hypr_mute": {"hu": "Némítás ki/be", "en": "Toggle mute"}, - "hypr_brightness": {"hu": "Fényerő állítás", "en": "Adjust brightness"}, - "hypr_next_track": {"hu": "Következő szám", "en": "Next track"}, - "hypr_prev_track": {"hu": "Előző szám", "en": "Previous track"}, - "hypr_play_pause": {"hu": "Lejátszás / szünet", "en": "Play / pause"}, - "hypr_clipboard": {"hu": "Vágólap megjelenítése", "en": "Show clipboard"}, - "hypr_screenshot": {"hu": "Képernyőkép készítése", "en": "Take screenshot"}, - "hypr_lock": {"hu": "Képernyőzár", "en": "Lock screen"}, - "hypr_kill": {"hu": "Aktív ablak bezárása", "en": "Close active window"}, - "hypr_float": {"hu": "Lebegő mód ki/be", "en": "Toggle floating mode"}, - "hypr_pseudo": {"hu": "Pseudo-tiling ki/be", "en": "Toggle pseudo-tiling"}, - "hypr_fullscreen": {"hu": "Teljes képernyős mód", "en": "Fullscreen mode"}, - "hypr_exit2": {"hu": "Kilépés", "en": "Exit"}, - "hypr_scratchpad": {"hu": "Scratchpad megjelenítése", "en": "Toggle scratchpad"}, - "hypr_focus_l": {"hu": "Fókusz mozgatása balra", "en": "Focus left"}, - "hypr_focus_r": {"hu": "Fókusz mozgatása jobbra", "en": "Focus right"}, - "hypr_focus_u": {"hu": "Fókusz mozgatása fel", "en": "Focus up"}, - "hypr_focus_d": {"hu": "Fókusz mozgatása le", "en": "Focus down"}, - "hypr_ws_goto": {"hu": "Váltás {p}. munkaterületre", "en": "Switch to workspace {p}"}, - "hypr_ws_move": {"hu": "Ablak áthelyezése {p}. munkaterületre", "en": "Move window to workspace {p}"}, - "hypr_ws_generic": {"hu": "Munkaterület: {p}", "en": "Workspace: {p}"}, - "hypr_ws_scratch": {"hu": "Ablak → scratchpad", "en": "Window → scratchpad"}, - "hypr_ws_scratch_t":{"hu": "Scratchpad ki/be", "en": "Toggle scratchpad"}, - "hypr_ws_next": {"hu": "Következő munkaterület", "en": "Next workspace"}, - "hypr_ws_prev": {"hu": "Előző munkaterület", "en": "Previous workspace"}, - "hypr_ws_goto_n": {"hu": "Váltás {n}. munkaterületre", "en": "Switch to workspace {n}"}, - "hypr_ws_move_n": {"hu": "Ablak áthelyezése {n}. munkaterületre", "en": "Move window to workspace {n}"}, - "hypr_layout": {"hu": "Layout: {p}", "en": "Layout: {p}"}, - "hypr_run": {"hu": "Futtatás: {prog}", "en": "Run: {prog}"}, - "hypr_run_generic": {"hu": "Program futtatása", "en": "Run program"}, + "hypr_spotlight": {"hu": "Spotlight (DMS) megnyitása", "de": "Spotlight (DMS) öffnen", "en": "Open Spotlight (DMS)"}, + "hypr_terminal": {"hu": "Terminál megnyitása (Kitty)", "de": "Terminal öffnen (Kitty)", "en": "Open terminal (Kitty)"}, + "hypr_filemanager": {"hu": "Fájlkezelő megnyitása (Thunar)", "de": "Dateimanager öffnen (Thunar)", "en": "Open file manager (Thunar)"}, + "hypr_launcher": {"hu": "App launcher megnyitása", "de": "App-Launcher öffnen", "en": "Open app launcher"}, + "hypr_logout": {"hu": "Kijelentkezés / leállítás", "de": "Abmelden / Herunterfahren", "en": "Logout / shutdown"}, + "hypr_exit": {"hu": "Hyprland kilépés", "de": "Hyprland beenden", "en": "Exit Hyprland"}, + "hypr_volume": {"hu": "Hangerő állítás", "de": "Lautstärke anpassen", "en": "Adjust volume"}, + "hypr_mute": {"hu": "Némítás ki/be", "de": "Stummschaltung umschalten", "en": "Toggle mute"}, + "hypr_brightness": {"hu": "Fényerő állítás", "de": "Helligkeit anpassen", "en": "Adjust brightness"}, + "hypr_next_track": {"hu": "Következő szám", "de": "Nächster Titel", "en": "Next track"}, + "hypr_prev_track": {"hu": "Előző szám", "de": "Vorheriger Titel", "en": "Previous track"}, + "hypr_play_pause": {"hu": "Lejátszás / szünet", "de": "Wiedergabe / Pause", "en": "Play / pause"}, + "hypr_clipboard": {"hu": "Vágólap megjelenítése", "de": "Zwischenablage anzeigen", "en": "Show clipboard"}, + "hypr_screenshot": {"hu": "Képernyőkép készítése", "de": "Screenshot erstellen", "en": "Take screenshot"}, + "hypr_lock": {"hu": "Képernyőzár", "de": "Bildschirm sperren", "en": "Lock screen"}, + "hypr_kill": {"hu": "Aktív ablak bezárása", "de": "Aktives Fenster schließen", "en": "Close active window"}, + "hypr_float": {"hu": "Lebegő mód ki/be", "de": "Schwebenden Modus umschalten", "en": "Toggle floating mode"}, + "hypr_pseudo": {"hu": "Pseudo-tiling ki/be", "de": "Pseudo-Tiling umschalten", "en": "Toggle pseudo-tiling"}, + "hypr_fullscreen": {"hu": "Teljes képernyős mód", "de": "Vollbildmodus", "en": "Fullscreen mode"}, + "hypr_exit2": {"hu": "Kilépés", "de": "Beenden", "en": "Exit"}, + "hypr_scratchpad": {"hu": "Scratchpad megjelenítése", "de": "Scratchpad anzeigen", "en": "Toggle scratchpad"}, + "hypr_focus_l": {"hu": "Fókusz mozgatása balra", "de": "Fokus nach links verschieben", "en": "Focus left"}, + "hypr_focus_r": {"hu": "Fókusz mozgatása jobbra", "de": "Fokus nach rechts verschieben", "en": "Focus right"}, + "hypr_focus_u": {"hu": "Fókusz mozgatása fel", "de": "Fokus nach oben verschieben", "en": "Focus up"}, + "hypr_focus_d": {"hu": "Fókusz mozgatása le", "de": "Fokus nach unten verschieben", "en": "Focus down"}, + "hypr_ws_goto": {"hu": "Váltás {p}. munkaterületre", "de": "Zu Arbeitsfläche {p} wechseln", "en": "Switch to workspace {p}"}, + "hypr_ws_move": {"hu": "Ablak áthelyezése {p}. munkaterületre", "de": "Fenster auf Arbeitsfläche {p} verschieben", "en": "Move window to workspace {p}"}, + "hypr_ws_generic": {"hu": "Munkaterület: {p}", "de": "Arbeitsfläche: {p}", "en": "Workspace: {p}"}, + "hypr_ws_scratch": {"hu": "Ablak → scratchpad", "de": "Fenster → Scratchpad", "en": "Window → scratchpad"}, + "hypr_ws_scratch_t":{"hu": "Scratchpad ki/be", "de": "Scratchpad umschalten", "en": "Toggle scratchpad"}, + "hypr_ws_next": {"hu": "Következő munkaterület", "de": "Nächste Arbeitsfläche", "en": "Next workspace"}, + "hypr_ws_prev": {"hu": "Előző munkaterület", "de": "Vorherige Arbeitsfläche", "en": "Previous workspace"}, + "hypr_ws_goto_n": {"hu": "Váltás {n}. munkaterületre", "de": "Zu Arbeitsfläche {n} wechseln", "en": "Switch to workspace {n}"}, + "hypr_ws_move_n": {"hu": "Ablak áthelyezése {n}. munkaterületre", "de": "Fenster auf Arbeitsfläche {n} verschieben", "en": "Move window to workspace {n}"}, + "hypr_layout": {"hu": "Layout: {p}", "de": "Layout: {p}", "en": "Layout: {p}"}, + "hypr_run": {"hu": "Futtatás: {prog}", "de": "Ausführen: {prog}", "en": "Run: {prog}"}, + "hypr_run_generic": {"hu": "Program futtatása", "de": "Programm ausführen", "en": "Run program"}, # Credits page - "credits_title": {"hu": "KÖZREMŰKÖDŐK", "en": "CONTRIBUTORS"}, - "credits_rp1_name": {"hu": "RavePriest1", "en": "RavePriest1"}, - "credits_rp1_role": {"hu": "Névadó, hivatalos naplopó", "en": "Namesake, official slacker"}, - "credits_rp1_desc": {"hu": "Nem tudja mit akar — magyar streamer.", "en": "Doesn't know what he wants — Hungarian streamer."}, - "credits_nippy_name": {"hu": "Nippy", "en": "Nippy"}, - "credits_nippy_role": {"hu": "Fejlesztő", "en": "Developer"}, - "credits_nippy_desc": {"hu": "Agyérgörcsöt kap PR1-től, mert nem tudja mit akar.", "en": "Gets an aneurysm from PR1 because he doesn't know what he wants."}, - "credits_gabesz_name": {"hu": "GabeszM", "en": "GabeszM"}, - "credits_gabesz_role": {"hu": "Fejlesztő", "en": "Developer"}, - "credits_gabesz_desc": {"hu": "Weboldal, GNOME kiegészítő és alt-tab dizájn — mert valakinek kellett.", "en": "Website, GNOME extension and alt-tab design — because someone had to."}, - "credits_stefi_name": {"hu": "Stefi", "en": "Stefi"}, - "credits_stefi_role": {"hu": "Design", "en": "Design"}, - "credits_stefi_desc": {"hu": "5000 lesz!", "en": "That'll be 5000!"}, + "credits_title": {"hu": "KÖZREMŰKÖDŐK", "de": "MITWIRKENDE", "en": "CONTRIBUTORS"}, + "credits_rp1_name": {"hu": "RavePriest1", "de": "RavePriest1", "en": "RavePriest1"}, + "credits_rp1_role": {"hu": "Névadó, hivatalos naplopó", "de": "Namensgeber, offizieller Faulenzer", "en": "Namesake, official slacker"}, + "credits_rp1_desc": {"hu": "Nem tudja mit akar — magyar streamer.", "de": "Weiß nicht, was er will — ungarischer Streamer.", "en": "Doesn't know what he wants — Hungarian streamer."}, + "credits_nippy_name": {"hu": "Nippy", "de": "Nippy", "en": "Nippy"}, + "credits_nippy_role": {"hu": "Fejlesztő", "de": "Entwickler", "en": "Developer"}, + "credits_nippy_desc": {"hu": "Agyérgörcsöt kap PR1-től, mert nem tudja mit akar.", "de": "Bekommt von PR1 einen Nervenzusammenbruch, weil er nicht weiß, was er will.", "en": "Gets an aneurysm from PR1 because he doesn't know what he wants."}, + "credits_gabesz_name": {"hu": "GabeszM", "de": "GabeszM", "en": "GabeszM"}, + "credits_gabesz_role": {"hu": "Fejlesztő", "de": "Entwickler", "en": "Developer"}, + "credits_gabesz_desc": {"hu": "Weboldal, GNOME kiegészítő és alt-tab dizájn — mert valakinek kellett.", "de": "Website, GNOME-Erweiterung und Alt-Tab-Design — weil es jemand machen musste.", "en": "Website, GNOME extension and alt-tab design — because someone had to."}, + "credits_stefi_name": {"hu": "Stefi", "de": "Stefi", "en": "Stefi"}, + "credits_stefi_role": {"hu": "Design", "de": "Design", "en": "Design"}, + "credits_stefi_desc": {"hu": "5000 lesz!", "de": "Das macht 5000!", "en": "That'll be 5000!"}, # Finish page - "finish_ok": {"hu": "OK", "en": "OK"}, - "finish_title": {"hu": "KÉSZ!", "en": "DONE!"}, - "finish_sub": {"hu": "A RaveOS be van állítva.", "en": "RaveOS is set up."}, - "finish_next_step": {"hu": "KÖVETKEZŐ LÉPÉS", "en": "NEXT STEP"}, + "finish_ok": {"hu": "OK", "de": "OK", "en": "OK"}, + "finish_title": {"hu": "KÉSZ!", "de": "FERTIG!", "en": "DONE!"}, + "finish_sub": {"hu": "A RaveOS be van állítva.", "de": "RaveOS ist eingerichtet.", "en": "RaveOS is set up."}, + "finish_next_step": {"hu": "KÖVETKEZŐ LÉPÉS", "de": "NÄCHSTER SCHRITT", "en": "NEXT STEP"}, "finish_inst_desc": {"hu": "Az App Installer segítségével telepíthetsz minden fontos " "szoftvert egy helyen — böngészőtől kezdve a fejlesztőeszközökig.", + "de": "Mit dem App Installer kannst du die gesamte wichtige Software an einem Ort installieren — von Browsern bis zu Entwicklerwerkzeugen.", "en": "With the App Installer you can install all important " "software in one place — from browsers to developer tools."}, - "finish_install": {"hu": "APP INSTALLER INDÍTÁSA", "en": "LAUNCH APP INSTALLER"}, - "finish_reboot": {"hu": "ÚJRAINDÍTÁS", "en": "REBOOT SYSTEM"}, - "finish_close": {"hu": "Bezárás", "en": "Close"}, - "finish_install_missing": {"hu": "Nem található az App Installer.", "en": "App Installer not found."}, - "finish_install_err": {"hu": "Nem sikerült elindítani. Napló: {log}", "en": "Failed to launch. Log: {log}"}, + "finish_install": {"hu": "APP INSTALLER INDÍTÁSA", "de": "APP INSTALLER STARTEN", "en": "LAUNCH APP INSTALLER"}, + "finish_reboot": {"hu": "ÚJRAINDÍTÁS", "de": "SYSTEM NEU STARTEN", "en": "REBOOT SYSTEM"}, + "finish_close": {"hu": "Bezárás", "de": "Schließen", "en": "Close"}, + "finish_install_missing": {"hu": "Nem található az App Installer.", "de": "App Installer nicht gefunden.", "en": "App Installer not found."}, + "finish_install_err": {"hu": "Nem sikerült elindítani. Napló: {log}", "de": "Start fehlgeschlagen. Protokoll: {log}", "en": "Failed to launch. Log: {log}"}, # Tooltip keys (for optimize page descriptions that use _ACTION_DESCS) - "action_killactive": {"hu": "Aktív ablak bezárása", "en": "Close active window"}, - "action_togglefloat": {"hu": "Lebegő mód ki/be", "en": "Toggle floating mode"}, - "action_pseudo": {"hu": "Pseudo-tiling ki/be", "en": "Toggle pseudo-tiling"}, - "action_fullscreen": {"hu": "Teljes képernyős mód", "en": "Fullscreen mode"}, - "action_exit": {"hu": "Kilépés", "en": "Exit"}, - "action_scratchpad": {"hu": "Scratchpad megjelenítése", "en": "Toggle scratchpad"}, - "action_focus_l": {"hu": "Fókusz mozgatása balra", "en": "Focus left"}, - "action_focus_r": {"hu": "Fókusz mozgatása jobbra", "en": "Focus right"}, - "action_focus_u": {"hu": "Fókusz mozgatása fel", "en": "Focus up"}, - "action_focus_d": {"hu": "Fókusz mozgatása le", "en": "Focus down"}, + "action_killactive": {"hu": "Aktív ablak bezárása", "de": "Aktives Fenster schließen", "en": "Close active window"}, + "action_togglefloat": {"hu": "Lebegő mód ki/be", "de": "Schwebenden Modus umschalten", "en": "Toggle floating mode"}, + "action_pseudo": {"hu": "Pseudo-tiling ki/be", "de": "Pseudo-Tiling umschalten", "en": "Toggle pseudo-tiling"}, + "action_fullscreen": {"hu": "Teljes képernyős mód", "de": "Vollbildmodus", "en": "Fullscreen mode"}, + "action_exit": {"hu": "Kilépés", "de": "Beenden", "en": "Exit"}, + "action_scratchpad": {"hu": "Scratchpad megjelenítése", "de": "Scratchpad anzeigen", "en": "Toggle scratchpad"}, + "action_focus_l": {"hu": "Fókusz mozgatása balra", "de": "Fokus nach links verschieben", "en": "Focus left"}, + "action_focus_r": {"hu": "Fókusz mozgatása jobbra", "de": "Fokus nach rechts verschieben", "en": "Focus right"}, + "action_focus_u": {"hu": "Fókusz mozgatása fel", "de": "Fokus nach oben verschieben", "en": "Focus up"}, + "action_focus_d": {"hu": "Fókusz mozgatása le", "de": "Fokus nach unten verschieben", "en": "Focus down"}, } def _t(key, **kwargs): """Get translation for key, with optional format kwargs.""" lang = _current_lang - text = T.get(key, {}).get(lang, T.get(key, {}).get("hu", key)) + text = T.get(key, {}).get(lang, T.get(key, {}).get("en", key)) if kwargs: try: return text.format(**kwargs) @@ -701,7 +736,7 @@ class WelcomePage(QWidget): links_row2.setSpacing(8) all_links = [ - ("support", "https://ko-fi.com/ravepriest1"), + ("support", "https://ko-fi.com/raveteam"), ("RP Kick", "https://kick.com/rpslair"), ("RP YouTube", "https://www.youtube.com/@RPslair"), ("RP Twitch", "https://www.twitch.tv/ravepriest1"), @@ -1943,7 +1978,12 @@ class FinishPage(QWidget): class RaveOSWelcome(QMainWindow): def __init__(self): super().__init__() - self.setWindowTitle("RaveOS — Üdvözlünk") + if _current_lang == "de": + self.setWindowTitle("RaveOS — Willkommen") + elif _current_lang == "en": + self.setWindowTitle("RaveOS — Welcome") + else: + self.setWindowTitle("RaveOS — Üdvözlünk") self.setMinimumSize(720, 640) self.resize(800, 720) self.setStyleSheet(STYLESHEET) @@ -1993,14 +2033,6 @@ class RaveOSWelcome(QMainWindow): self.lang_hu_btn.setObjectName("lang_btn") self.lang_hu_btn.setFixedHeight(30) self.lang_hu_btn.setCheckable(True) - self.lang_hu_btn.setChecked(True) - self.lang_hu_btn.setStyleSheet( - f"QPushButton {{ background: {COLORS['accent']}; color: #ffffff;" - f" border: none; border-radius: 4px; padding: 4px 12px;" - f" font-size: 11px; font-weight: 600; }}" - f"QPushButton:hover {{ background: {COLORS['accent_hover']}; }}" - f"QPushButton:checked {{ background: {COLORS['accent']}; color: #ffffff; }}" - ) self.lang_hu_btn.clicked.connect(lambda: self._set_lang("hu")) nav.addWidget(self.lang_hu_btn) @@ -2008,17 +2040,18 @@ class RaveOSWelcome(QMainWindow): self.lang_en_btn.setObjectName("lang_btn") self.lang_en_btn.setFixedHeight(30) self.lang_en_btn.setCheckable(True) - self.lang_en_btn.setChecked(False) - self.lang_en_btn.setStyleSheet( - f"QPushButton {{ background: {COLORS['surface']}; color: {COLORS['text_dim']};" - f" border: 1px solid {COLORS['border']}; border-radius: 4px; padding: 4px 12px;" - f" font-size: 11px; font-weight: 600; }}" - f"QPushButton:hover {{ border-color: {COLORS['accent']}; color: {COLORS['accent_light']}; }}" - f"QPushButton:checked {{ background: {COLORS['accent']}; color: #ffffff; border: none; }}" - ) self.lang_en_btn.clicked.connect(lambda: self._set_lang("en")) nav.addWidget(self.lang_en_btn) + self.lang_de_btn = QPushButton("Deutsch") + self.lang_de_btn.setObjectName("lang_btn") + self.lang_de_btn.setFixedHeight(30) + self.lang_de_btn.setCheckable(True) + self.lang_de_btn.clicked.connect(lambda: self._set_lang("de")) + nav.addWidget(self.lang_de_btn) + + self._apply_lang_buttons() + self.back_btn = QPushButton(_t("nav_back")) self.back_btn.setObjectName("secondary") self.back_btn.clicked.connect(self._prev_page) @@ -2037,43 +2070,32 @@ class RaveOSWelcome(QMainWindow): self.p_finish.launch_installer.connect(self._launch_installer) self._update_nav() - def _set_lang(self, lang): - global _current_lang - if _current_lang == lang: - return - _current_lang = lang - self.lang_hu_btn.setChecked(lang == "hu") - self.lang_en_btn.setChecked(lang == "en") - if lang == "hu": - self.lang_hu_btn.setStyleSheet( - f"QPushButton {{ background: {COLORS['accent']}; color: #ffffff;" - f" border: none; border-radius: 4px; padding: 4px 12px;" - f" font-size: 11px; font-weight: 600; }}" - f"QPushButton:hover {{ background: {COLORS['accent_hover']}; }}" - f"QPushButton:checked {{ background: {COLORS['accent']}; color: #ffffff; }}" - ) - self.lang_en_btn.setStyleSheet( - f"QPushButton {{ background: {COLORS['surface']}; color: {COLORS['text_dim']};" - f" border: 1px solid {COLORS['border']}; border-radius: 4px; padding: 4px 12px;" - f" font-size: 11px; font-weight: 600; }}" - f"QPushButton:hover {{ border-color: {COLORS['accent']}; color: {COLORS['accent_light']}; }}" - f"QPushButton:checked {{ background: {COLORS['accent']}; color: #ffffff; border: none; }}" - ) - else: - self.lang_en_btn.setStyleSheet( - f"QPushButton {{ background: {COLORS['accent']}; color: #ffffff;" + def _lang_btn_active_style(self): + return (f"QPushButton {{ background: {COLORS['accent']}; color: #ffffff;" f" border: none; border-radius: 4px; padding: 4px 12px;" f" font-size: 11px; font-weight: 600; }}" f"QPushButton:hover {{ background: {COLORS['accent_hover']}; }}" - f"QPushButton:checked {{ background: {COLORS['accent']}; color: #ffffff; }}" - ) - self.lang_hu_btn.setStyleSheet( - f"QPushButton {{ background: {COLORS['surface']}; color: {COLORS['text_dim']};" + f"QPushButton:checked {{ background: {COLORS['accent']}; color: #ffffff; }}") + + def _lang_btn_inactive_style(self): + return (f"QPushButton {{ background: {COLORS['surface']}; color: {COLORS['text_dim']};" f" border: 1px solid {COLORS['border']}; border-radius: 4px; padding: 4px 12px;" f" font-size: 11px; font-weight: 600; }}" f"QPushButton:hover {{ border-color: {COLORS['accent']}; color: {COLORS['accent_light']}; }}" - f"QPushButton:checked {{ background: {COLORS['accent']}; color: #ffffff; border: none; }}" - ) + f"QPushButton:checked {{ background: {COLORS['accent']}; color: #ffffff; border: none; }}") + + def _apply_lang_buttons(self): + active_btn = {"hu": self.lang_hu_btn, "en": self.lang_en_btn, "de": self.lang_de_btn}[_current_lang] + for btn in (self.lang_hu_btn, self.lang_en_btn, self.lang_de_btn): + btn.setChecked(btn is active_btn) + btn.setStyleSheet(self._lang_btn_active_style() if btn is active_btn else self._lang_btn_inactive_style()) + + def _set_lang(self, lang): + global _current_lang + if _current_lang == lang: + return + _current_lang = lang + self._apply_lang_buttons() self._retranslate_all() def _make_step_bar(self): @@ -2121,6 +2143,7 @@ class RaveOSWelcome(QMainWindow): self.next_btn.setText(_t("finish_close") if is_last else _t("nav_next")) self.lang_hu_btn.setVisible(idx == 0) self.lang_en_btn.setVisible(idx == 0) + self.lang_de_btn.setVisible(idx == 0) self._update_steps(idx) def _update_steps(self, idx): @@ -2142,7 +2165,9 @@ class RaveOSWelcome(QMainWindow): ) def _retranslate_all(self): - if _current_lang == "en": + if _current_lang == "de": + self.setWindowTitle("RaveOS — Willkommen") + elif _current_lang == "en": self.setWindowTitle("RaveOS — Welcome") else: self.setWindowTitle("RaveOS — Üdvözlünk") -- cgit v1.3