diff options
| author | Nippy <nippy@rp1.hu> | 2026-07-03 22:11:38 +0200 |
|---|---|---|
| committer | Nippy <nippy@rp1.hu> | 2026-07-03 22:11:38 +0200 |
| commit | 7e492da95489cea9c1dc8e9b4e0d8ac2e61e1fe9 (patch) | |
| tree | ffa73840b9bc65a17ae60d9d4628373751d52101 | |
| parent | 725b9b1defce4e0f05476cdee9c5a79a6b531afa (diff) | |
| download | RaveOS-PKGBUILD-7e492da95489cea9c1dc8e9b4e0d8ac2e61e1fe9.tar.gz RaveOS-PKGBUILD-7e492da95489cea9c1dc8e9b4e0d8ac2e61e1fe9.zip | |
raveosappfix
| -rw-r--r-- | .forgejo/workflows/build-theme-send-core-repo.yml | 45 | ||||
| -rw-r--r-- | raveos-app-installer/PKGBUILD | 2 | ||||
| -rw-r--r-- | raveos-app-installer/app-list.json | 280 | ||||
| -rw-r--r-- | raveos-app-installer/data/backup/backup-paths.json | 225 | ||||
| -rw-r--r-- | raveos-app-installer/raveos-app-installer.py | 351 |
5 files changed, 655 insertions, 248 deletions
diff --git a/.forgejo/workflows/build-theme-send-core-repo.yml b/.forgejo/workflows/build-theme-send-core-repo.yml index 00d7fe6..9168a59 100644 --- a/.forgejo/workflows/build-theme-send-core-repo.yml +++ b/.forgejo/workflows/build-theme-send-core-repo.yml @@ -203,51 +203,6 @@ jobs: makepkg -s --noconfirm -f cp -v build/raveos-welcome-*.pkg.tar.zst /tmp/builtpkgs/ - - name: Mirror linux-cachyos + sddm-astronaut-theme from Chaotic-AUR - run: | - set -euo pipefail - CORE="/tmp/raveos-core-repo/x86_64" - MIRRORS="https://de-mirror.chaotic.cx/chaotic-aur/x86_64 https://cdn-mirror.chaotic.cx/chaotic-aur/x86_64 https://geo-mirror.chaotic.cx/chaotic-aur/x86_64" - - for PKG in sddm-astronaut-theme; do - LATEST="" - for MIRROR in $MIRRORS; do - LATEST=$(curl -fsSL --retry 3 --retry-delay 5 --max-time 15 "${MIRROR}/" \ - | grep -o "href=\"${PKG}-[0-9][^\"]*\.pkg\.tar\.zst\"" \ - | sed 's/href="//;s/"//' | head -1) - [ -n "$LATEST" ] && break - done - - if [ -z "$LATEST" ]; then - echo "$PKG nem talalhato egyik mirrorban sem -> skip" - continue - fi - - if [[ ! "$LATEST" =~ ^[a-zA-Z0-9_.+-]+\.pkg\.tar\.zst$ ]]; then - echo "HIBA: Ervenytelen csomagfajlnev: $LATEST -> skip" - continue - fi - - if [ -f "$CORE/$LATEST" ]; then - echo "$PKG $LATEST mar bent van a core repoban -> skip" - continue - fi - - echo "$PKG uj verzio: $LATEST - letoltes..." - DOWNLOADED=0 - for MIRROR in $MIRRORS; do - if curl -fL --retry 3 --retry-delay 5 --max-time 300 --progress-bar \ - "${MIRROR}/${LATEST}" -o "/tmp/builtpkgs/${LATEST}" 2>/dev/null; then - echo "$PKG letoltve OK ($MIRROR)" - DOWNLOADED=1 - break - fi - echo "$PKG letoltes sikertelen: $MIRROR -> kovetkezo" - rm -f "/tmp/builtpkgs/${LATEST}" || true - done - [ "$DOWNLOADED" -eq 0 ] && echo "$PKG letoltes minden mirrorrol sikertelen -> skip" || true - done - - name: Publish packages to raveos-core-repo (only if changed) run: | set -euo pipefail diff --git a/raveos-app-installer/PKGBUILD b/raveos-app-installer/PKGBUILD index 18e8c05..09a7fa4 100644 --- a/raveos-app-installer/PKGBUILD +++ b/raveos-app-installer/PKGBUILD @@ -8,7 +8,7 @@ pkgname=raveos-app-installer pkgver=3.1 -pkgrel=1 +pkgrel=3 pkgdesc="RaveOS graphical application installer" arch=('any') url="https://git.rp1.hu/RaveOS/raveos-app-installer" diff --git a/raveos-app-installer/app-list.json b/raveos-app-installer/app-list.json index 1c03717..896e01e 100644 --- a/raveos-app-installer/app-list.json +++ b/raveos-app-installer/app-list.json @@ -5,7 +5,10 @@ "id": "audacious", "name": "Audacious", "category": "Media", - "desc": "Audacious – Local Music Player (Flatpak, 432Hz config)", + "desc": { + "hu": "Audacious – helyi zenelejátszó (Flatpak, 432Hz konfiggal)", + "en": "Audacious – Local Music Player (Flatpak, 432Hz config)" + }, "type": "flatpak-user", "flatpak_id": "org.atheme.audacious", "config_dir": "audacious", @@ -15,7 +18,10 @@ "id": "audacity", "name": "Audacity", "category": "Media", - "desc": "Audio editor and recorder", + "desc": { + "hu": "Hangszerkesztő és -felvevő", + "en": "Audio editor and recorder" + }, "type": "pacman", "packages": [ "audacity" @@ -27,7 +33,10 @@ "id": "bitwarden", "name": "Bitwarden", "category": "Security", - "desc": "Bitwarden password manager", + "desc": { + "hu": "Bitwarden jelszókezelő", + "en": "Bitwarden password manager" + }, "type": "pacman", "packages": [ "bitwarden" @@ -37,7 +46,10 @@ "id": "bottles", "name": "Bottles", "category": "Games", - "desc": "Wine prefix manager", + "desc": { + "hu": "Wine prefix kezelő", + "en": "Wine prefix manager" + }, "type": "flatpak-user", "flatpak_id": "com.usebottles.bottles" }, @@ -45,7 +57,10 @@ "id": "brave-origin-bin", "name": "Brave Origin", "category": "Internet", - "desc": "Brave Origin - a Brave letisztitott, reklam/rewards/kripto-mentes valtozata", + "desc": { + "hu": "Brave Origin - a Brave letisztított, reklám/rewards/kripto-mentes változata", + "en": "Brave Origin - a decluttered version of Brave without ads, rewards, or crypto features" + }, "type": "pacman", "config_dir": "com.brave.Browser/config/BraveSoftware/Brave-Browser", "config_dest": "{HOME}/.config/BraveSoftware/Brave-Origin" @@ -54,7 +69,10 @@ "id": "calibre", "name": "Calibre", "category": "Office", - "desc": "E-book manager", + "desc": { + "hu": "E-book kezelő", + "en": "E-book manager" + }, "type": "pacman", "packages": [ "calibre" @@ -64,7 +82,10 @@ "id": "corectrl", "name": "CoreCTRL", "category": "System", - "desc": "AMD GPU control application", + "desc": { + "hu": "AMD GPU vezérlő alkalmazás", + "en": "AMD GPU control application" + }, "type": "script", "script": "corectrl.sh", "check_packages": [ @@ -76,7 +97,10 @@ "id": "darktable", "name": "Darktable", "category": "Media", - "desc": "Photo workflow application (like Lightroom)", + "desc": { + "hu": "Fotó munkafolyamat alkalmazás (mint a Lightroom)", + "en": "Photo workflow application (like Lightroom)" + }, "type": "flatpak-user", "flatpak_id": "org.darktable.Darktable" }, @@ -84,7 +108,10 @@ "id": "discord", "name": "Discord + Vencord", "category": "Internet", - "desc": "Discord client with Vencord mod", + "desc": { + "hu": "Discord kliens Vencord móddal", + "en": "Discord client with Vencord mod" + }, "type": "script", "script": "discord.sh", "check_packages": [ @@ -95,7 +122,10 @@ "id": "docker", "name": "Docker", "category": "Dev", - "desc": "Docker container engine", + "desc": { + "hu": "Docker konténer motor", + "en": "Docker container engine" + }, "type": "pacman", "packages": [ "docker" @@ -108,7 +138,10 @@ "id": "dosbox", "name": "DOSBox-X", "category": "Games", - "desc": "DOS emulator for old games", + "desc": { + "hu": "DOS emulátor régi játékokhoz", + "en": "DOS emulator for old games" + }, "type": "flatpak-user", "flatpak_id": "com.dosbox_x.DOSBox-X" }, @@ -116,7 +149,10 @@ "id": "doublecmd", "name": "Double Commander", "category": "System", - "desc": "Two-panel file manager (like Total Commander)", + "desc": { + "hu": "Kétpaneles fájlkezelő (mint a Total Commander)", + "en": "Two-panel file manager (like Total Commander)" + }, "type": "pacman", "packages": [ "doublecmd-qt5" @@ -126,7 +162,10 @@ "id": "easyeffects", "name": "Easy Effects", "category": "Media", - "desc": "Audio effects for PipeWire", + "desc": { + "hu": "Hangeffektek PipeWire-hoz", + "en": "Audio effects for PipeWire" + }, "type": "flatpak-user", "flatpak_id": "com.github.wwmm.easyeffects" }, @@ -134,7 +173,10 @@ "id": "fastfetch", "name": "Fastfetch", "category": "System", - "desc": "System info display in terminal", + "desc": { + "hu": "Rendszerinformáció megjelenítése a terminálban", + "en": "System info display in terminal" + }, "type": "pacman", "packages": [ "fastfetch" @@ -144,7 +186,10 @@ "id": "firejail", "name": "Firejail", "category": "Security", - "desc": "Sandbox for applications", + "desc": { + "hu": "Homokozó (sandbox) alkalmazásokhoz", + "en": "Sandbox for applications" + }, "type": "pacman", "packages": [ "firejail" @@ -154,7 +199,10 @@ "id": "freetube", "name": "FreeTube", "category": "Media", - "desc": "Privacy-friendly YouTube client", + "desc": { + "hu": "Adatvédelem-barát YouTube kliens", + "en": "Privacy-friendly YouTube client" + }, "type": "flatpak-user", "flatpak_id": "io.freetubeapp.FreeTube", "config_dir": "FreeTube", @@ -164,7 +212,10 @@ "id": "gamemode", "name": "GameMode", "category": "Games", - "desc": "GameMode + Gamescope for gaming optimization", + "desc": { + "hu": "GameMode + Gamescope játékoptimalizáláshoz", + "en": "GameMode + Gamescope for gaming optimization" + }, "type": "pacman", "packages": [ "gamemode", @@ -176,7 +227,10 @@ "id": "gnome-clocks", "name": "GNOME Clocks", "category": "System", - "desc": "Alarm, world clock, stopwatch, timer", + "desc": { + "hu": "Ébresztő, világóra, stopper, időzítő", + "en": "Alarm, world clock, stopwatch, timer" + }, "type": "script", "script": "gnome-clocks.sh", "check_packages": [ @@ -187,7 +241,10 @@ "id": "gtkstresstesting", "name": "GTKStressTesting", "category": "System", - "desc": "CPU monitoring and stress testing", + "desc": { + "hu": "CPU monitorozás és stressz teszt", + "en": "CPU monitoring and stress testing" + }, "type": "flatpak-user", "flatpak_id": "com.leinardi.gst" }, @@ -195,7 +252,10 @@ "id": "helvum", "name": "Helvum", "category": "Media", - "desc": "Patchbay for PipeWire", + "desc": { + "hu": "Patchbay PipeWire-hoz", + "en": "Patchbay for PipeWire" + }, "type": "pacman", "packages": [ "helvum" @@ -205,7 +265,10 @@ "id": "heroic", "name": "Heroic Games Launcher", "category": "Games", - "desc": "Epic Games launcher + MangoHud", + "desc": { + "hu": "Epic Games launcher + MangoHud", + "en": "Epic Games launcher + MangoHud" + }, "type": "flatpak-user", "flatpak_id": "com.heroicgameslauncher.hgl", "post_install": [ @@ -217,7 +280,10 @@ "id": "input-remapper", "name": "Input Remapper", "category": "System", - "desc": "Mouse/keyboard button remapper, macro tool", + "desc": { + "hu": "Egér/billentyűzet gombkiosztás átalakító, makró eszköz", + "en": "Mouse/keyboard button remapper, macro tool" + }, "type": "pacman", "packages": [ "input-remapper-git" @@ -227,7 +293,10 @@ "id": "jellyfin", "name": "Jellyfin Media Player", "category": "Media", - "desc": "Jellyfin client for media streaming", + "desc": { + "hu": "Jellyfin kliens médiastreameléshez", + "en": "Jellyfin client for media streaming" + }, "type": "flatpak-user", "flatpak_id": "org.jellyfin.JellyfinDesktop" }, @@ -235,7 +304,10 @@ "id": "kdeconnect", "name": "KDE Connect", "category": "System", - "desc": "Connect phone and PC", + "desc": { + "hu": "Telefon és PC összekapcsolása", + "en": "Connect phone and PC" + }, "type": "pacman", "packages": [ "kdeconnect" @@ -245,7 +317,10 @@ "id": "kdenlive", "name": "Kdenlive", "category": "Media", - "desc": "Video editor for Linux", + "desc": { + "hu": "Videószerkesztő Linuxra", + "en": "Video editor for Linux" + }, "type": "pacman", "packages": [ "kdenlive" @@ -255,7 +330,10 @@ "id": "keepassxc", "name": "KeePassXC", "category": "Security", - "desc": "Password manager with encrypted local database", + "desc": { + "hu": "Jelszókezelő titkosított helyi adatbázissal", + "en": "Password manager with encrypted local database" + }, "type": "pacman", "packages": [ "keepassxc" @@ -265,7 +343,10 @@ "id": "krusader", "name": "Krusader", "category": "System", - "desc": "Two-panel file manager", + "desc": { + "hu": "Kétpaneles fájlkezelő", + "en": "Two-panel file manager" + }, "type": "pacman", "packages": [ "krusader" @@ -275,7 +356,10 @@ "id": "kvm", "name": "KVM / QEMU", "category": "System", - "desc": "Virtualization with KVM + QEMU", + "desc": { + "hu": "Virtualizáció KVM + QEMU-val", + "en": "Virtualization with KVM + QEMU" + }, "type": "script", "script": "kvm.sh", "check_packages": [ @@ -286,7 +370,10 @@ "id": "libreoffice", "name": "LibreOffice", "category": "Office", - "desc": "LibreOffice Fresh with Hungarian language", + "desc": { + "hu": "LibreOffice Fresh magyar nyelvvel", + "en": "LibreOffice Fresh with Hungarian language" + }, "type": "pacman", "packages": [ "libreoffice-fresh", @@ -297,7 +384,10 @@ "id": "librewolf", "name": "LibreWolf", "category": "Internet", - "desc": "Firefox ESR based privacy browser", + "desc": { + "hu": "Firefox ESR alapú adatvédelmi böngésző", + "en": "Firefox ESR based privacy browser" + }, "type": "flatpak-user", "flatpak_id": "io.gitlab.librewolf-community", "config_dir": "librewolf", @@ -307,7 +397,10 @@ "id": "lutris", "name": "Lutris", "category": "Games", - "desc": "Game launcher with Wine support", + "desc": { + "hu": "Játék launcher Wine támogatással", + "en": "Game launcher with Wine support" + }, "type": "script", "script": "lutris.sh", "check_packages": [ @@ -318,7 +411,10 @@ "id": "mangohud", "name": "MangoHud / Goverlay", "category": "Games", - "desc": "FPS overlay and settings (like MSI Afterburner)", + "desc": { + "hu": "FPS overlay és beállítások (mint az MSI Afterburner)", + "en": "FPS overlay and settings (like MSI Afterburner)" + }, "type": "pacman", "config_dir": ".config", "config_dest": "{HOME}/.config/MangoHud", @@ -332,7 +428,10 @@ "id": "mc", "name": "Midnight Commander", "category": "System", - "desc": "Two-panel terminal file manager", + "desc": { + "hu": "Kétpaneles terminálos fájlkezelő", + "en": "Two-panel terminal file manager" + }, "type": "pacman", "packages": [ "mc" @@ -342,7 +441,10 @@ "id": "mumble", "name": "Mumble", "category": "Internet", - "desc": "Voice chat application", + "desc": { + "hu": "Hangchat alkalmazás", + "en": "Voice chat application" + }, "type": "pacman", "packages": [ "mumble" @@ -352,7 +454,10 @@ "id": "obs", "name": "OBS Studio", "category": "Media", - "desc": "Streaming and recording software", + "desc": { + "hu": "Streamelő és felvevő szoftver", + "en": "Streaming and recording software" + }, "type": "flatpak-user", "flatpak_id": "com.obsproject.Studio" }, @@ -360,7 +465,10 @@ "id": "onlyoffice", "name": "OnlyOffice", "category": "Office", - "desc": "MS Office compatible suite", + "desc": { + "hu": "MS Office kompatibilis irodai csomag", + "en": "MS Office compatible suite" + }, "type": "flatpak-user", "flatpak_id": "org.onlyoffice.desktopeditors" }, @@ -368,7 +476,10 @@ "id": "7zip", "name": "7-Zip", "category": "System", - "desc": "7-Zip archive manager", + "desc": { + "hu": "7-Zip tömörítő kezelő", + "en": "7-Zip archive manager" + }, "type": "pacman", "packages": [ "7zip" @@ -378,7 +489,10 @@ "id": "peazip", "name": "Peazip", "category": "System", - "desc": "Peazip GUI archive manager", + "desc": { + "hu": "Peazip grafikus tömörítő kezelő", + "en": "Peazip GUI archive manager" + }, "type": "pacman", "packages": [ "peazip" @@ -388,7 +502,10 @@ "id": "occt", "name": "OCCT", "category": "System", - "desc": "System Stability Tester", + "desc": { + "hu": "Rendszerstabilitás teszter", + "en": "System Stability Tester" + }, "type": "pacman", "packages": [ "occt" @@ -398,7 +515,10 @@ "id": "octopi", "name": "Octopi", "category": "System", - "desc": "Graphical package manager", + "desc": { + "hu": "Grafikus csomagkezelő", + "en": "Graphical package manager" + }, "type": "pacman", "packages": [ "octopi" @@ -408,7 +528,10 @@ "id": "pavucontrol", "name": "Pavucontrol", "category": "Media", - "desc": "Per-application volume control", + "desc": { + "hu": "Alkalmazásonkénti hangerőszabályzás", + "en": "Per-application volume control" + }, "type": "pacman", "packages": [ "pavucontrol" @@ -418,7 +541,10 @@ "id": "photogimp", "name": "PhotoGIMP", "category": "Media", - "desc": "GIMP with Photoshop-like interface", + "desc": { + "hu": "GIMP Photoshop-szerű felülettel", + "en": "GIMP with Photoshop-like interface" + }, "type": "flatpak-user", "flatpak_id": "org.gimp.GIMP", "check_flatpak": "org.gimp.GIMP", @@ -441,7 +567,10 @@ "id": "printer", "name": "Printer Support", "category": "System", - "desc": "Printer drivers and CUPS", + "desc": { + "hu": "Nyomtató driverek és CUPS", + "en": "Printer drivers and CUPS" + }, "type": "script", "script": "printer.sh", "check_packages": [ @@ -453,7 +582,10 @@ "id": "qbittorrent", "name": "qBittorrent", "category": "Internet", - "desc": "Torrent client", + "desc": { + "hu": "Torrent kliens", + "en": "Torrent client" + }, "type": "pacman", "config_dir": "qBittorrent", "config_dest": "{HOME}/.config/qBittorrent", @@ -465,7 +597,10 @@ "id": "signal", "name": "Signal", "category": "Internet", - "desc": "Encrypted messenger", + "desc": { + "hu": "Titkosított üzenetküldő", + "en": "Encrypted messenger" + }, "type": "pacman", "packages": [ "signal-desktop" @@ -475,7 +610,10 @@ "id": "spotify", "name": "Spotify", "category": "Media", - "desc": "Music streaming service", + "desc": { + "hu": "Zenestreamelő szolgáltatás", + "en": "Music streaming service" + }, "type": "flatpak-user", "flatpak_id": "com.spotify.Client" }, @@ -483,7 +621,10 @@ "id": "spotube", "name": "Spotube", "category": "Media", - "desc": "Free Spotify client without premium", + "desc": { + "hu": "Ingyenes Spotify kliens premium nélkül", + "en": "Free Spotify client without premium" + }, "type": "flatpak-user", "flatpak_id": "com.github.KRTirtho.Spotube" }, @@ -491,7 +632,10 @@ "id": "steam", "name": "Steam", "category": "Games", - "desc": "Steam + ProtonGE (complex installation)", + "desc": { + "hu": "Steam + ProtonGE (összetett telepítés)", + "en": "Steam + ProtonGE (complex installation)" + }, "type": "script", "script": "steam.sh", "check_packages": [ @@ -502,7 +646,10 @@ "id": "teamspeak", "name": "TeamSpeak 3", "category": "Internet", - "desc": "TeamSpeak VOIP client", + "desc": { + "hu": "TeamSpeak VOIP kliens", + "en": "TeamSpeak VOIP client" + }, "type": "pacman", "packages": [ "teamspeak3" @@ -512,7 +659,10 @@ "id": "telegram", "name": "Telegram", "category": "Internet", - "desc": "Encrypted messenger", + "desc": { + "hu": "Titkosított üzenetküldő", + "en": "Encrypted messenger" + }, "type": "pacman", "packages": [ "telegram-desktop" @@ -522,7 +672,10 @@ "id": "vibrant", "name": "Vibrant Linux", "category": "System", - "desc": "Color saturation adjustment tool", + "desc": { + "hu": "Szín-telítettség beállító eszköz", + "en": "Color saturation adjustment tool" + }, "type": "flatpak-user", "flatpak_id": "io.github.libvibrant.vibrantLinux" }, @@ -530,7 +683,10 @@ "id": "vivaldi", "name": "Vivaldi", "category": "Internet", - "desc": "Vivaldi web browser", + "desc": { + "hu": "Vivaldi webböngésző", + "en": "Vivaldi web browser" + }, "type": "pacman", "config_dir": "vivaldi", "config_dest": "{HOME}/.config/vivaldi", @@ -543,7 +699,10 @@ "id": "vlc", "name": "VLC", "category": "Media", - "desc": "VLC Media Player (Flatpak)", + "desc": { + "hu": "VLC médialejátszó (Flatpak)", + "en": "VLC Media Player (Flatpak)" + }, "type": "flatpak-user", "flatpak_id": "org.videolan.VLC" }, @@ -551,7 +710,10 @@ "id": "vulkan-radeon", "name": "Vulkan Radeon", "category": "Games", - "desc": "AMD Vulkan drivers for gaming", + "desc": { + "hu": "AMD Vulkan driverek gaminghez", + "en": "AMD Vulkan drivers for gaming" + }, "type": "pacman", "packages": [ "vulkan-radeon", @@ -563,7 +725,10 @@ "id": "xpadneo", "name": "Xbox Controller", "category": "Games", - "desc": "Xbox Controller support (Bluetooth)", + "desc": { + "hu": "Xbox kontroller támogatás (Bluetooth)", + "en": "Xbox Controller support (Bluetooth)" + }, "type": "pacman", "packages": [ "xpadneo-dkms" @@ -573,7 +738,10 @@ "id": "windows11", "name": "Windows 11", "category": "System", - "desc": "Windows 11 Installer - Experts Only!", + "desc": { + "hu": "Windows 11 telepítő - csak haladóknak!", + "en": "Windows 11 Installer - Experts Only!" + }, "type": "message", "message": "!! MAJOM VAGY !!\n\nWindows 11? Komolyan? Linux-on vagy, elvezd!\n\nHa tenyleg kell Windows, hasznalj KVM/QEMU-t a listabol." } diff --git a/raveos-app-installer/data/backup/backup-paths.json b/raveos-app-installer/data/backup/backup-paths.json index 38f6e3f..abfe315 100644 --- a/raveos-app-installer/data/backup/backup-paths.json +++ b/raveos-app-installer/data/backup/backup-paths.json @@ -3,13 +3,22 @@ "groups": [ { "id": "apps", - "label": "Alkalmazásprofilok", - "description": "Böngészők, kommunikációs appok és fontos desktop alkalmazások profiljai.", + "label": { + "hu": "Alkalmazásprofilok", + "en": "Application profiles" + }, + "description": { + "hu": "Böngészők, kommunikációs appok és fontos desktop alkalmazások profiljai.", + "en": "Profiles of browsers, communication apps, and important desktop applications." + }, "default_expanded": true, "items": [ { "id": "librewolf_profile", - "label": "LibreWolf profil", + "label": { + "hu": "LibreWolf profil", + "en": "LibreWolf profile" + }, "path": ".var/app/io.gitlab.librewolf-community/.librewolf", "scope": "home", "default_selected": true, @@ -17,7 +26,10 @@ }, { "id": "vivaldi_profile", - "label": "Vivaldi profil", + "label": { + "hu": "Vivaldi profil", + "en": "Vivaldi profile" + }, "path": ".config/vivaldi", "scope": "home", "default_selected": true, @@ -25,7 +37,10 @@ }, { "id": "brave_profile", - "label": "Brave Origin profil", + "label": { + "hu": "Brave Origin profil", + "en": "Brave Origin profile" + }, "path": ".config/BraveSoftware/Brave-Origin", "scope": "home", "default_selected": true, @@ -33,7 +48,10 @@ }, { "id": "bitwarden_config", - "label": "Bitwarden beállítások", + "label": { + "hu": "Bitwarden beállítások", + "en": "Bitwarden settings" + }, "path": ".config/Bitwarden", "scope": "home", "default_selected": true, @@ -41,7 +59,10 @@ }, { "id": "heroic_config", - "label": "Heroic Games Launcher beállítások", + "label": { + "hu": "Heroic Games Launcher beállítások", + "en": "Heroic Games Launcher settings" + }, "path": ".var/app/com.heroicgameslauncher.hgl/config/heroic", "scope": "home", "default_selected": true, @@ -49,7 +70,10 @@ }, { "id": "qbittorrent_config", - "label": "qBittorrent beállítások", + "label": { + "hu": "qBittorrent beállítások", + "en": "qBittorrent settings" + }, "path": ".config/qBittorrent", "scope": "home", "default_selected": true, @@ -57,7 +81,10 @@ }, { "id": "signal_config", - "label": "Signal profil", + "label": { + "hu": "Signal profil", + "en": "Signal profile" + }, "path": ".config/Signal", "scope": "home", "default_selected": true, @@ -65,7 +92,10 @@ }, { "id": "telegram_data", - "label": "Telegram Desktop adatok", + "label": { + "hu": "Telegram Desktop adatok", + "en": "Telegram Desktop data" + }, "path": ".local/share/TelegramDesktop", "scope": "home", "default_selected": true, @@ -73,7 +103,10 @@ }, { "id": "discord_config", - "label": "Discord beállítások", + "label": { + "hu": "Discord beállítások", + "en": "Discord settings" + }, "path": ".config/discord", "scope": "home", "default_selected": false, @@ -81,7 +114,10 @@ }, { "id": "vencord_config", - "label": "Vencord beállítások", + "label": { + "hu": "Vencord beállítások", + "en": "Vencord settings" + }, "path": ".config/Vencord", "scope": "home", "default_selected": false, @@ -89,16 +125,25 @@ }, { "id": "steam_userdata", - "label": "Steam felhasználói adatok", + "label": { + "hu": "Steam felhasználói adatok", + "en": "Steam user data" + }, "path": ".local/share/Steam", "scope": "home", "default_selected": false, "size_hint": "large", - "note": "Nagy lehet, játékadatokat és cache-t is tartalmazhat." + "note": { + "hu": "Nagy lehet, játékadatokat és cache-t is tartalmazhat.", + "en": "Can be large, may include game data and cache." + } }, { "id": "lutris_data", - "label": "Lutris adatok", + "label": { + "hu": "Lutris adatok", + "en": "Lutris data" + }, "path": ".local/share/lutris", "scope": "home", "default_selected": false, @@ -108,13 +153,22 @@ }, { "id": "desktop", - "label": "Desktop és felület", - "description": "Témák, GNOME shell kiegészítők és HUD/overlay beállítások.", + "label": { + "hu": "Desktop és felület", + "en": "Desktop and interface" + }, + "description": { + "hu": "Témák, GNOME shell kiegészítők és HUD/overlay beállítások.", + "en": "Themes, GNOME Shell extensions, and HUD/overlay settings." + }, "default_expanded": true, "items": [ { "id": "icons_dir", - "label": "Ikonok", + "label": { + "hu": "Ikonok", + "en": "Icons" + }, "path": ".icons", "scope": "home", "default_selected": true, @@ -122,7 +176,10 @@ }, { "id": "themes_dir", - "label": "Témák", + "label": { + "hu": "Témák", + "en": "Themes" + }, "path": ".themes", "scope": "home", "default_selected": true, @@ -130,7 +187,10 @@ }, { "id": "gnome_shell_data", - "label": "GNOME Shell kiegészítők", + "label": { + "hu": "GNOME Shell kiegészítők", + "en": "GNOME Shell extensions" + }, "path": ".local/share/gnome-shell", "scope": "home", "default_selected": true, @@ -138,7 +198,10 @@ }, { "id": "flatpak_overrides", - "label": "Flatpak override-ok", + "label": { + "hu": "Flatpak override-ok", + "en": "Flatpak overrides" + }, "path": ".local/share/flatpak/overrides", "scope": "home", "default_selected": true, @@ -146,7 +209,10 @@ }, { "id": "mangohud_config", - "label": "MangoHud beállítások", + "label": { + "hu": "MangoHud beállítások", + "en": "MangoHud settings" + }, "path": ".config/MangoHud", "scope": "home", "default_selected": true, @@ -154,7 +220,10 @@ }, { "id": "goverlay_config", - "label": "GOverlay beállítások", + "label": { + "hu": "GOverlay beállítások", + "en": "GOverlay settings" + }, "path": ".config/goverlay", "scope": "home", "default_selected": true, @@ -164,13 +233,22 @@ }, { "id": "work", - "label": "Munka és produktivitás", - "description": "Irodai, média- és alkotó appok fontos user-adatkönyvtárai.", + "label": { + "hu": "Munka és produktivitás", + "en": "Work and productivity" + }, + "description": { + "hu": "Irodai, média- és alkotó appok fontos user-adatkönyvtárai.", + "en": "Important user data directories of office, media, and creative apps." + }, "default_expanded": false, "items": [ { "id": "libreoffice_config", - "label": "LibreOffice beállítások", + "label": { + "hu": "LibreOffice beállítások", + "en": "LibreOffice settings" + }, "path": ".config/libreoffice", "scope": "home", "default_selected": true, @@ -178,7 +256,10 @@ }, { "id": "onlyoffice_data", - "label": "OnlyOffice adatok", + "label": { + "hu": "OnlyOffice adatok", + "en": "OnlyOffice data" + }, "path": ".local/share/onlyoffice", "scope": "home", "default_selected": false, @@ -186,7 +267,10 @@ }, { "id": "calibre_config", - "label": "Calibre beállítások", + "label": { + "hu": "Calibre beállítások", + "en": "Calibre settings" + }, "path": ".config/calibre", "scope": "home", "default_selected": false, @@ -194,7 +278,10 @@ }, { "id": "kdenlive_data", - "label": "Kdenlive adatok", + "label": { + "hu": "Kdenlive adatok", + "en": "Kdenlive data" + }, "path": ".local/share/kdenlive", "scope": "home", "default_selected": false, @@ -202,7 +289,10 @@ }, { "id": "freetube_config", - "label": "FreeTube profil", + "label": { + "hu": "FreeTube profil", + "en": "FreeTube profile" + }, "path": ".config/FreeTube", "scope": "home", "default_selected": false, @@ -212,22 +302,37 @@ }, { "id": "content", - "label": "Nagy felhasználói tartalmak", - "description": "Nem alapból kijelölt könyvtárak, mert nagyok lehetnek.", + "label": { + "hu": "Nagy felhasználói tartalmak", + "en": "Large user content" + }, + "description": { + "hu": "Nem alapból kijelölt könyvtárak, mert nagyok lehetnek.", + "en": "Directories not selected by default because they can be large." + }, "default_expanded": false, "items": [ { "id": "games_dir", - "label": "Games könyvtár", + "label": { + "hu": "Games könyvtár", + "en": "Games directory" + }, "path": "Games", "scope": "home", "default_selected": false, "size_hint": "xlarge", - "note": "Játékadatok miatt nagyon nagy lehet." + "note": { + "hu": "Játékadatok miatt nagyon nagy lehet.", + "en": "Can be very large due to game data." + } }, { "id": "calibre_library", - "label": "Calibre Library", + "label": { + "hu": "Calibre Library", + "en": "Calibre Library" + }, "path": "Calibre Library", "scope": "home", "default_selected": false, @@ -235,7 +340,10 @@ }, { "id": "desktop_dir", - "label": "Asztal / Desktop", + "label": { + "hu": "Asztal / Desktop", + "en": "Desktop" + }, "path": "Desktop", "scope": "home", "default_selected": false, @@ -243,7 +351,10 @@ }, { "id": "documents_dir", - "label": "Dokumentumok / Documents", + "label": { + "hu": "Dokumentumok / Documents", + "en": "Documents" + }, "path": "Documents", "scope": "home", "default_selected": false, @@ -251,7 +362,10 @@ }, { "id": "downloads_dir", - "label": "Letöltések / Downloads", + "label": { + "hu": "Letöltések / Downloads", + "en": "Downloads" + }, "path": "Downloads", "scope": "home", "default_selected": false, @@ -259,7 +373,10 @@ }, { "id": "pictures_dir", - "label": "Képek / Pictures", + "label": { + "hu": "Képek / Pictures", + "en": "Pictures" + }, "path": "Pictures", "scope": "home", "default_selected": false, @@ -267,7 +384,10 @@ }, { "id": "videos_dir", - "label": "Videók / Videos", + "label": { + "hu": "Videók / Videos", + "en": "Videos" + }, "path": "Videos", "scope": "home", "default_selected": false, @@ -275,7 +395,10 @@ }, { "id": "music_dir", - "label": "Zenék / Music", + "label": { + "hu": "Zenék / Music", + "en": "Music" + }, "path": "Music", "scope": "home", "default_selected": false, @@ -285,13 +408,22 @@ }, { "id": "system", - "label": "Rendszerközeli mentés", - "description": "Csak haladó felhasználóknak, külön megerősítéssel.", + "label": { + "hu": "Rendszerközeli mentés", + "en": "System-level backup" + }, + "description": { + "hu": "Csak haladó felhasználóknak, külön megerősítéssel.", + "en": "For advanced users only, requires extra confirmation." + }, "default_expanded": false, "items": [ { "id": "libvirt_system", - "label": "libvirt rendszerbeállítások", + "label": { + "hu": "libvirt rendszerbeállítások", + "en": "libvirt system configuration" + }, "path": "/etc/libvirt", "scope": "system", "default_selected": false, @@ -300,7 +432,10 @@ }, { "id": "jellyfin_web_config", - "label": "Jellyfin web config", + "label": { + "hu": "Jellyfin web config", + "en": "Jellyfin web config" + }, "path": "/usr/share/jellyfin/web/config.json", "scope": "system", "default_selected": false, diff --git a/raveos-app-installer/raveos-app-installer.py b/raveos-app-installer/raveos-app-installer.py index 2c51a73..c6425c1 100644 --- a/raveos-app-installer/raveos-app-installer.py +++ b/raveos-app-installer/raveos-app-installer.py @@ -47,9 +47,6 @@ APP_LIST_CANDIDATES = [ Path.home() / ".config" / "raveos" / "app-list.json", ] -CATEGORY_ALL = "All" - - # ───────────────────────────────────────────────────────────────────────────── # Téma (a welcome app stílusa) # ───────────────────────────────────────────────────────────────────────────── @@ -82,6 +79,76 @@ TYPE_LABEL = { } +# ───────────────────────────────────────────────────────────────────────────── +# Nyelv (hu/en) — session-szintű, alapértelmezett hu, a welcome app mintájára +# ───────────────────────────────────────────────────────────────────────────── + +_current_lang = "hu" + +T = { + "header_installer": {"hu": " · ALKALMAZÁSTELEPÍTŐ", "en": " · APP INSTALLER"}, + "header_backup": {"hu": " · MENTÉS / VISSZAÁLLÍTÁS", "en": " · BACKUP / RESTORE"}, + "nav_backup": {"hu": "Mentés / Visszaállítás", "en": "Backup / Restore"}, + "nav_back": {"hu": "← Vissza", "en": "← Back"}, + "tab_all": {"hu": "Összes", "en": "All"}, + "tab_installed": {"hu": "Telepített", "en": "Installed"}, + "search_placeholder": {"hu": "Keresés…", "en": "Search…"}, + "btn_install": {"hu": "Telepítés", "en": "Install"}, + "btn_remove": {"hu": "Eltávolítás", "en": "Remove"}, + "row_installed": {"hu": "telepítve", "en": "installed"}, + "row_not_installed": {"hu": "nincs telepítve", "en": "not installed"}, + "row_info": {"hu": "info", "en": "info"}, + "dest_placeholder": {"hu": "Backup fájl útvonala (.tar.gz)…", "en": "Backup file path (.tar.gz)…"}, + "btn_browse": {"hu": "Tallóz", "en": "Browse"}, + "btn_save": {"hu": "Mentés", "en": "Save"}, + "btn_restore": {"hu": "Visszaállítás", "en": "Restore"}, + "dlg_auth_title": {"hu": "Hitelesítés szükséges", "en": "Authentication required"}, + "dlg_pw_label": {"hu": "Sudo jelszó:", "en": "Sudo password:"}, + "dlg_pw_placeholder": {"hu": "Jelszó…", "en": "Password…"}, + "dlg_pw_empty_err": {"hu": "A jelszó nem lehet üres.", "en": "Password cannot be empty."}, + "dlg_pw_wrong_err": {"hu": "Hibás jelszó, próbáld újra.", "en": "Wrong password, try again."}, + "dlg_ok": {"hu": "OK", "en": "OK"}, + "dlg_cancel": {"hu": "Mégse", "en": "Cancel"}, + "log_nothing_selected": {"hu": "Nincs kijelölve semmi.", "en": "Nothing selected."}, + "log_nothing_to_do": {"hu": "Nincs végrehajtható művelet.", "en": "No action to perform."}, + "log_action_start": {"hu": "{action} indul ({n} app)…", "en": "{action} starting ({n} app)…"}, + "log_done": {"hu": "\nKész: {ok}/{total} lépés sikeres.", "en": "\nDone: {ok}/{total} steps succeeded."}, + "bk_start_backup": {"hu": "Mentés indul -> {dest}", "en": "Backup starting -> {dest}"}, + "bk_start_restore": {"hu": "Visszaállítás indul <- {dest}", "en": "Restore starting <- {dest}"}, + "bk_need_dest": {"hu": "Add meg a célfájlt.", "en": "Specify the destination file."}, + "bk_invalid_file": {"hu": "Nem létező vagy érvénytelen backup fájl.", "en": "Backup file doesn't exist or is invalid."}, + "bk_need_selection": {"hu": "Jelölj ki legalább egy elemet.", "en": "Select at least one item."}, + "bk_done_backup_ok": {"hu": "Mentés kész.", "en": "Backup complete."}, + "bk_done_restore_ok": {"hu": "Visszaállítás kész.", "en": "Restore complete."}, + "bk_result_ok": {"hu": "OK", "en": "OK"}, + "bk_result_err": {"hu": "HIBA", "en": "ERROR"}, + "filedialog_caption": {"hu": "Backup fájl", "en": "Backup file"}, + "not_installed_hint": {"hu": " [kihagyva, nem létezik]", "en": " [skipped, doesn't exist]"}, + "lang_hu": {"hu": "Magyar", "en": "Magyar"}, + "lang_en": {"hu": "English", "en": "English"}, +} + + +def tr(key, **kwargs): + lang = _current_lang + text = T.get(key, {}).get(lang, T.get(key, {}).get("hu", key)) + if kwargs: + try: + return text.format(**kwargs) + except (KeyError, IndexError): + return text + return text + + +def _loc(val): + """Katalógus-adat (app-list.json / backup-paths.json) i18n feloldása. + Ha a mező {"hu":..,"en":..} alakú, az aktuális nyelvre bontja, kulcs + hiányában hu-ra esik vissza; sima stringnél visszaadja változatlanul.""" + if isinstance(val, dict): + return val.get(_current_lang, val.get("hu", "")) + return val or "" + + def build_qss() -> str: return f""" QWidget {{ @@ -248,7 +315,6 @@ def load_catalog() -> list: continue a.setdefault("type", "pacman") a.setdefault("category", "Other") - a.setdefault("description", a.get("desc", "")) cleaned.append(a) cleaned.sort(key=lambda x: x["name"].lower()) return cleaned @@ -520,18 +586,19 @@ def run_gui() -> int: mid.setSpacing(2) top = QLabel(app["name"]) top.setStyleSheet(f"font-weight:600; font-size:14px; color:{C['text']};") + desc = _loc(app.get("desc")) sub = QLabel(f"{app['category']} · {TYPE_LABEL.get(app['type'], app['type'])}" - + (f" · {app['description']}" if app["description"] else "")) + + (f" · {desc}" if desc else "")) sub.setStyleSheet(f"color:{C['text_dim']}; font-size:12px;") mid.addWidget(top) mid.addWidget(sub) lay.addLayout(mid, 1) if self.is_message: - status = QLabel("info") + status = QLabel(tr("row_info")) status.setStyleSheet(f"color:{C['accent_hi']}; font-size:12px;") else: - status = QLabel("telepítve" if installed else "nincs telepítve") + status = QLabel(tr("row_installed") if installed else tr("row_not_installed")) status.setStyleSheet( f"color:{C['accent_hi'] if installed else C['text_mut']}; font-size:12px;") lay.addWidget(status) @@ -646,11 +713,11 @@ def run_gui() -> int: elif Path(p).exists(): tf.add(p, arcname=Path(p).name) else: - self.log.emit(f" [kihagyva, nem létezik]") + self.log.emit(tr("not_installed_hint")) except Exception as exc: self.log.emit(f" [HIBA, kihagyva: {exc}]") self.progress.emit(int((i + 1) / total * 100)) - self.done.emit(True, "Mentés kész.") + self.done.emit(True, tr("bk_done_backup_ok")) except Exception as exc: self.done.emit(False, str(exc)) else: @@ -672,7 +739,7 @@ def run_gui() -> int: except Exception as exc: self.log.emit(f" [HIBA, kihagyva: {exc}]") self.progress.emit(int((i + 1) / total_members * 100)) - self.done.emit(True, "Visszaállítás kész.") + self.done.emit(True, tr("bk_done_restore_ok")) except Exception as exc: self.done.emit(False, str(exc)) @@ -714,13 +781,29 @@ def run_gui() -> int: os_.setStyleSheet(f"color:{C['accent']};") wm.addWidget(rave) wm.addWidget(os_) - self.header_sep = QLabel(" · APP INSTALLER") + self.header_sep = QLabel(tr("header_installer")) self.header_sep.setFont(display_font(15)) self.header_sep.setStyleSheet(f"color:{C['text_dim']};") wm.addWidget(self.header_sep) hl.addLayout(wm) hl.addStretch(1) - self.btn_nav = QPushButton("Backup / Restore") + + self.lang_hu_btn = QPushButton(tr("lang_hu")) + self.lang_hu_btn.setCheckable(True) + self.lang_hu_btn.setChecked(True) + self.lang_hu_btn.setFixedHeight(28) + self.lang_hu_btn.clicked.connect(lambda: self._set_lang("hu")) + hl.addWidget(self.lang_hu_btn) + self.lang_en_btn = QPushButton(tr("lang_en")) + self.lang_en_btn.setCheckable(True) + self.lang_en_btn.setChecked(False) + self.lang_en_btn.setFixedHeight(28) + self.lang_en_btn.clicked.connect(lambda: self._set_lang("en")) + hl.addWidget(self.lang_en_btn) + self._style_lang_btns() + hl.addSpacing(12) + + self.btn_nav = QPushButton(tr("nav_backup")) self.btn_nav.clicked.connect(self._go_backup) hl.addWidget(self.btn_nav) hl.addSpacing(12) @@ -741,8 +824,8 @@ def run_gui() -> int: frow = QHBoxLayout() frow.setSpacing(8) - self.tab_all = QPushButton("All") - self.tab_inst = QPushButton("Installed") + self.tab_all = QPushButton(tr("tab_all")) + self.tab_inst = QPushButton(tr("tab_installed")) for t in (self.tab_all, self.tab_inst): t.setObjectName("Tab") t.setCheckable(True) @@ -757,13 +840,12 @@ def run_gui() -> int: frow.addWidget(self.tab_inst) frow.addSpacing(8) self.search = QLineEdit() - self.search.setPlaceholderText("Keresés…") + self.search.setPlaceholderText(tr("search_placeholder")) self.search.textChanged.connect(self.apply_filter) frow.addWidget(self.search, 1) self.cat = QComboBox() - cats = [CATEGORY_ALL] + sorted({a["category"] for a in catalog}) - self.cat.addItems(cats) - self.cat.currentTextChanged.connect(self.apply_filter) + self.cat.addItems([tr("tab_all")] + sorted({a["category"] for a in catalog})) + self.cat.currentIndexChanged.connect(self.apply_filter) frow.addWidget(self.cat) bl.addLayout(frow) @@ -788,10 +870,10 @@ def run_gui() -> int: arow = QHBoxLayout() arow.setSpacing(8) - self.btn_install = QPushButton("Telepítés") + self.btn_install = QPushButton(tr("btn_install")) self.btn_install.setObjectName("Primary") self.btn_install.clicked.connect(lambda: self.run_action(True)) - self.btn_remove = QPushButton("Eltávolítás") + self.btn_remove = QPushButton(tr("btn_remove")) self.btn_remove.setObjectName("Danger") self.btn_remove.clicked.connect(lambda: self.run_action(False)) self.btn_remove.hide() @@ -814,67 +896,22 @@ def run_gui() -> int: bk_scroll.setWidgetResizable(True) bk_scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) bk_host = QWidget() - bk_vl = QVBoxLayout(bk_host) - bk_vl.setContentsMargins(0, 0, 6, 0) - bk_vl.setSpacing(14) - - home = str(Path.home()) - for bgrp in load_backup_catalog(): - gl = QLabel(bgrp.get("label", bgrp["id"])) - gl.setStyleSheet(f"font-weight:600; font-size:13px; color:{C['accent']}; background:transparent;") - bk_vl.addWidget(gl) - desc = bgrp.get("description", "") - if desc: - dl = QLabel(desc) - dl.setStyleSheet(f"color:{C['text_dim']}; font-size:11px; background:transparent;") - dl.setWordWrap(True) - bk_vl.addWidget(dl) - for item in bgrp.get("items", []): - brow = QFrame() - brow.setObjectName("Row") - rl = QHBoxLayout(brow) - rl.setContentsMargins(12, 7, 12, 7) - rl.setSpacing(10) - cb = QCheckBox() - cb.setChecked(item.get("default_selected", False)) - abs_path = str(Path(home) / item["path"]) if item.get("scope","home") == "home" else item["path"] - self.backup_checkboxes[item["id"]] = ( - cb, abs_path, item.get("label", item["id"]), - item.get("requires_root", False), - ) - rl.addWidget(cb) - mid = QVBoxLayout() - mid.setSpacing(1) - tl = QLabel(item.get("label", item["id"])) - tl.setStyleSheet(f"font-weight:600; font-size:13px; color:{C['text']}; background:transparent;") - sl = QLabel(abs_path) - sl.setStyleSheet(f"color:{C['text_dim']}; font-size:11px; background:transparent;") - mid.addWidget(tl) - mid.addWidget(sl) - if item.get("note"): - nl = QLabel(item["note"]) - nl.setStyleSheet(f"color:{C['danger_hi']}; font-size:11px; background:transparent;") - mid.addWidget(nl) - rl.addLayout(mid, 1) - if item.get("size_hint"): - hl2 = QLabel(item["size_hint"]) - hl2.setStyleSheet(f"color:{C['text_mut']}; font-size:11px; background:transparent;") - rl.addWidget(hl2) - bk_vl.addWidget(brow) - - bk_vl.addStretch(1) + self.bk_vl = QVBoxLayout(bk_host) + self.bk_vl.setContentsMargins(0, 0, 6, 0) + self.bk_vl.setSpacing(14) + self.build_backup_items() bk_scroll.setWidget(bk_host) bbl.addWidget(bk_scroll, 1) dest_row = QHBoxLayout() dest_row.setSpacing(8) self.dest_edit = QLineEdit() - self.dest_edit.setPlaceholderText("Backup fájl útvonala (.tar.gz)…") + self.dest_edit.setPlaceholderText(tr("dest_placeholder")) self.dest_edit.setText(str(Path.home() / "raveos-backup.tar.gz")) - browse_btn = QPushButton("Tallóz") - browse_btn.clicked.connect(self._bk_browse) + self.btn_bk_browse = QPushButton(tr("btn_browse")) + self.btn_bk_browse.clicked.connect(self._bk_browse) dest_row.addWidget(self.dest_edit, 1) - dest_row.addWidget(browse_btn) + dest_row.addWidget(self.btn_bk_browse) bbl.addLayout(dest_row) self.bk_log = QPlainTextEdit() @@ -886,10 +923,10 @@ def run_gui() -> int: bk_arow = QHBoxLayout() bk_arow.setSpacing(8) - self.btn_bk_save = QPushButton("Mentés") + self.btn_bk_save = QPushButton(tr("btn_save")) self.btn_bk_save.setObjectName("Primary") self.btn_bk_save.clicked.connect(self._do_backup) - self.btn_bk_restore = QPushButton("Visszaállítás") + self.btn_bk_restore = QPushButton(tr("btn_restore")) self.btn_bk_restore.setObjectName("Danger") self.btn_bk_restore.clicked.connect(self._do_restore) self.bk_bar = QProgressBar() @@ -904,6 +941,114 @@ def run_gui() -> int: self.build_rows() self.apply_filter() + # ── nyelv ───────────────────────────────────────────────────────────── + def _style_lang_btns(self): + active = ( + f"QPushButton {{ background: {C['accent']}; color: #15240f;" + " border: 1px solid transparent; border-radius: 4px;" + " padding: 4px 12px; font-size: 11px; font-weight: 600; }}" + ) + inactive = ( + f"QPushButton {{ background: {C['surface']}; color: {C['text_dim']};" + f" border: 1px solid {C['border']}; border-radius: 4px;" + " padding: 4px 12px; font-size: 11px; font-weight: 600; }}" + ) + self.lang_hu_btn.setStyleSheet(active if _current_lang == "hu" else inactive) + self.lang_en_btn.setStyleSheet(active if _current_lang == "en" else inactive) + + 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") + self._style_lang_btns() + self._retranslate_all() + + def _retranslate_all(self): + on_backup = self.stack.currentIndex() == 1 + self.header_sep.setText(tr("header_backup") if on_backup else tr("header_installer")) + self.btn_nav.setText(tr("nav_back") if on_backup else tr("nav_backup")) + self.tab_all.setText(tr("tab_all")) + self.tab_inst.setText(tr("tab_installed")) + self.search.setPlaceholderText(tr("search_placeholder")) + cur_cat = self.cat.currentText() if self.cat.currentIndex() != 0 else None + self.cat.blockSignals(True) + self.cat.clear() + self.cat.addItems([tr("tab_all")] + sorted({a["category"] for a in self.catalog})) + if cur_cat is not None: + idx = self.cat.findText(cur_cat) + self.cat.setCurrentIndex(idx if idx >= 0 else 0) + self.cat.blockSignals(False) + self.btn_install.setText(tr("btn_install")) + self.btn_remove.setText(tr("btn_remove")) + self.dest_edit.setPlaceholderText(tr("dest_placeholder")) + self.btn_bk_browse.setText(tr("btn_browse")) + self.btn_bk_save.setText(tr("btn_save")) + self.btn_bk_restore.setText(tr("btn_restore")) + keep_scroll = self.scroll.verticalScrollBar().value() + self.build_rows() + self.apply_filter() + self.scroll.verticalScrollBar().setValue(keep_scroll) + self.build_backup_items() + + # ── backup lista építés (nyelvváltáskor is újraépül) ──────────────────── + def build_backup_items(self): + prev_checked = {iid: cb.isChecked() for iid, (cb, _, _, _) in self.backup_checkboxes.items()} + while self.bk_vl.count(): + taken = self.bk_vl.takeAt(0) + w = taken.widget() + if w: + w.setParent(None) + self.backup_checkboxes = {} + home = str(Path.home()) + for bgrp in load_backup_catalog(): + gl = QLabel(_loc(bgrp.get("label", bgrp["id"]))) + gl.setStyleSheet(f"font-weight:600; font-size:13px; color:{C['accent']}; background:transparent;") + self.bk_vl.addWidget(gl) + desc = _loc(bgrp.get("description", "")) + if desc: + dl = QLabel(desc) + dl.setStyleSheet(f"color:{C['text_dim']}; font-size:11px; background:transparent;") + dl.setWordWrap(True) + self.bk_vl.addWidget(dl) + for item in bgrp.get("items", []): + brow = QFrame() + brow.setObjectName("Row") + rl = QHBoxLayout(brow) + rl.setContentsMargins(12, 7, 12, 7) + rl.setSpacing(10) + cb = QCheckBox() + cb.setChecked(prev_checked.get(item["id"], item.get("default_selected", False))) + abs_path = str(Path(home) / item["path"]) if item.get("scope","home") == "home" else item["path"] + label = _loc(item.get("label", item["id"])) + self.backup_checkboxes[item["id"]] = ( + cb, abs_path, label, + item.get("requires_root", False), + ) + rl.addWidget(cb) + mid = QVBoxLayout() + mid.setSpacing(1) + tl = QLabel(label) + tl.setStyleSheet(f"font-weight:600; font-size:13px; color:{C['text']}; background:transparent;") + sl = QLabel(abs_path) + sl.setStyleSheet(f"color:{C['text_dim']}; font-size:11px; background:transparent;") + mid.addWidget(tl) + mid.addWidget(sl) + note = _loc(item.get("note")) + if note: + nl = QLabel(note) + nl.setStyleSheet(f"color:{C['danger_hi']}; font-size:11px; background:transparent;") + mid.addWidget(nl) + rl.addLayout(mid, 1) + if item.get("size_hint"): + hl2 = QLabel(item["size_hint"]) + hl2.setStyleSheet(f"color:{C['text_mut']}; font-size:11px; background:transparent;") + rl.addWidget(hl2) + self.bk_vl.addWidget(brow) + self.bk_vl.addStretch(1) + # ── frissítés ───────────────────────────────────────────────────────── def _refresh_and_filter(self): self.idx = installed_index() @@ -913,15 +1058,15 @@ def run_gui() -> int: # ── navigáció ───────────────────────────────────────────────────────── def _go_backup(self): self.stack.setCurrentIndex(1) - self.header_sep.setText(" · BACKUP / RESTORE") - self.btn_nav.setText("← Vissza") + self.header_sep.setText(tr("header_backup")) + self.btn_nav.setText(tr("nav_back")) self.btn_nav.clicked.disconnect() self.btn_nav.clicked.connect(self._go_apps) def _go_apps(self): self.stack.setCurrentIndex(0) - self.header_sep.setText(" · APP INSTALLER") - self.btn_nav.setText("Backup / Restore") + self.header_sep.setText(tr("header_installer")) + self.btn_nav.setText(tr("nav_backup")) self.btn_nav.clicked.disconnect() self.btn_nav.clicked.connect(self._go_backup) @@ -938,6 +1083,7 @@ def run_gui() -> int: def apply_filter(self): q = self.search.text().strip().lower() + cat_idx = self.cat.currentIndex() cat = self.cat.currentText() only_inst = self.tab_inst.isChecked() self.btn_remove.setVisible(only_inst) @@ -948,10 +1094,10 @@ def run_gui() -> int: show = False if not only_inst and r.installed: show = False - if cat != CATEGORY_ALL and r.app["category"] != cat: + if cat_idx != 0 and r.app["category"] != cat: show = False if q and q not in r.app["name"].lower() \ - and q not in r.app["description"].lower(): + and q not in _loc(r.app.get("desc")).lower(): show = False r.setVisible(show) @@ -965,13 +1111,13 @@ def run_gui() -> int: err_msg = "" while True: dlg = QDialog(self) - dlg.setWindowTitle("Hitelesítés szükséges") + dlg.setWindowTitle(tr("dlg_auth_title")) dlg.setFixedWidth(360) lay = QVBoxLayout(dlg) lay.setSpacing(10) lay.setContentsMargins(20, 16, 20, 16) - lbl = QLabel(err_msg if err_msg else "Sudo jelszó:") + lbl = QLabel(err_msg if err_msg else tr("dlg_pw_label")) lbl.setStyleSheet( f"color: {'#e06c6c' if err_msg else C['text_dim']}; font-size: 13px;") lbl.setWordWrap(True) @@ -979,7 +1125,7 @@ def run_gui() -> int: pw_edit = QLineEdit() pw_edit.setEchoMode(QLineEdit.EchoMode.Password) - pw_edit.setPlaceholderText("Jelszó…") + pw_edit.setPlaceholderText(tr("dlg_pw_placeholder")) pw_edit.setStyleSheet( f"background: {C['surface']}; color: {C['text']};" "border: 1px solid #444; border-radius: 4px;" @@ -987,9 +1133,9 @@ def run_gui() -> int: lay.addWidget(pw_edit) btn_row = QHBoxLayout() - btn_ok = QPushButton("OK") + btn_ok = QPushButton(tr("dlg_ok")) btn_ok.setDefault(True) - btn_cancel = QPushButton("Mégse") + btn_cancel = QPushButton(tr("dlg_cancel")) btn_ok.setFixedHeight(32) btn_cancel.setFixedHeight(32) btn_ok.setStyleSheet( @@ -1011,7 +1157,7 @@ def run_gui() -> int: pw = pw_edit.text() if not pw: - err_msg = "A jelszó nem lehet üres." + err_msg = tr("dlg_pw_empty_err") continue try: @@ -1024,7 +1170,7 @@ def run_gui() -> int: ) if chk.returncode == 0: return pw - err_msg = "Hibás jelszó, próbáld újra." + err_msg = tr("dlg_pw_wrong_err") except Exception: # Ha az ellenőrzés nem sikerül, elfogadjuk és hagyjuk a parancsot hibázni return pw @@ -1032,13 +1178,13 @@ def run_gui() -> int: def run_action(self, install: bool): apps = self.selected() if not apps: - self.log.appendPlainText("Nincs kijelölve semmi.") + self.log.appendPlainText(tr("log_nothing_selected")) return if self.worker and self.worker.isRunning(): return steps = plan_commands(apps, install, gui=True) if not steps: - self.log.appendPlainText("Nincs végrehajtható művelet.") + self.log.appendPlainText(tr("log_nothing_to_do")) return # Jelszó — 5 percen belül megjegyzett jelszót újra felhasználjuk @@ -1059,8 +1205,11 @@ def run_gui() -> int: self.bar.setValue(0) self.log.clear() self.log.show() - self.log.appendPlainText(("Telepítés" if install else "Eltávolítás") - + f" indul ({len(apps)} app)…") + self.log.appendPlainText(tr( + "log_action_start", + action=tr("btn_install") if install else tr("btn_remove"), + n=len(apps), + )) self.worker = Worker(steps, password) self.worker.log.connect(self.log.appendPlainText) self.worker.progress.connect(self.bar.setValue) @@ -1069,7 +1218,7 @@ def run_gui() -> int: def on_done(self, ok, total): self.bar.setValue(100) - self.log.appendPlainText(f"\nKész: {ok}/{total} lépés sikeres.") + self.log.appendPlainText(tr("log_done", ok=ok, total=total)) self.idx = installed_index() keep_scroll = self.scroll.verticalScrollBar().value() self.build_rows() @@ -1086,7 +1235,7 @@ def run_gui() -> int: # ── backup akciók ───────────────────────────────────────────────────── def _bk_browse(self): path, _ = QFileDialog.getSaveFileName( - self, "Backup fájl", str(Path.home()), "Tar archive (*.tar.gz)") + self, tr("filedialog_caption"), str(Path.home()), "Tar archive (*.tar.gz)") if path: if not path.endswith(".tar.gz"): path += ".tar.gz" @@ -1119,18 +1268,18 @@ def run_gui() -> int: def _do_backup(self): paths = self._bk_selected() if not paths: - self.bk_log.appendPlainText("Nincs kijelölve semmi.") + self.bk_log.appendPlainText(tr("log_nothing_selected")) return dest = self.dest_edit.text().strip() if not dest: - self.bk_log.appendPlainText("Add meg a célfájlt.") + self.bk_log.appendPlainText(tr("bk_need_dest")) return password, ok = self._bk_password_if_needed(paths) if not ok: return self.bk_log.clear() self.bk_log.show() - self.bk_log.appendPlainText(f"Mentés indul -> {dest}") + self.bk_log.appendPlainText(tr("bk_start_backup", dest=dest)) self.bk_bar.setValue(0) self._bk_set_busy(True) self.backup_worker = BackupWorker(paths, dest, restore=False, password=password) @@ -1142,18 +1291,18 @@ def run_gui() -> int: def _do_restore(self): dest = self.dest_edit.text().strip() if not dest or not Path(dest).is_file(): - self.bk_log.appendPlainText("Nem létező vagy érvénytelen backup fájl.") + self.bk_log.appendPlainText(tr("bk_invalid_file")) return paths = self._bk_selected() if not paths: - self.bk_log.appendPlainText("Jelölj ki legalább egy elemet.") + self.bk_log.appendPlainText(tr("bk_need_selection")) return password, ok = self._bk_password_if_needed(paths) if not ok: return self.bk_log.clear() self.bk_log.show() - self.bk_log.appendPlainText(f"Visszaállítás indul <- {dest}") + self.bk_log.appendPlainText(tr("bk_start_restore", dest=dest)) self.bk_bar.setValue(0) self._bk_set_busy(True) self.backup_worker = BackupWorker(paths, dest, restore=True, password=password) @@ -1164,7 +1313,7 @@ def run_gui() -> int: def _bk_done(self, ok, msg): self.bk_bar.setValue(100 if ok else 0) - self.bk_log.appendPlainText(f"\n{'OK' if ok else 'HIBA'}: {msg}") + self.bk_log.appendPlainText(f"\n{tr('bk_result_ok') if ok else tr('bk_result_err')}: {msg}") self._bk_set_busy(False) # ── alkalmazás bootstrap ───────────────────────────────────────────────── |