summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.forgejo/workflows/build-theme-send-core-repo.yml45
-rw-r--r--raveos-app-installer/PKGBUILD2
-rw-r--r--raveos-app-installer/app-list.json280
-rw-r--r--raveos-app-installer/data/backup/backup-paths.json225
-rw-r--r--raveos-app-installer/raveos-app-installer.py351
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 ─────────────────────────────────────────────────