-
-
+
+
+
@@ -15,12 +15,10 @@
-
-
-
-
+
+
-
+
@@ -30,14 +28,14 @@
-
+
-
+
@@ -51,14 +49,22 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
-
\ No newline at end of file
+
diff --git a/dash-frontend/assets/gui/view/audio_settings.xml b/dash-frontend/assets/gui/view/audio_settings.xml
index e1dbabc2..a25a2cbd 100644
--- a/dash-frontend/assets/gui/view/audio_settings.xml
+++ b/dash-frontend/assets/gui/view/audio_settings.xml
@@ -5,8 +5,8 @@
-
-
+
+
@@ -20,7 +20,7 @@
-
+
@@ -29,7 +29,7 @@
-
+
@@ -58,7 +58,8 @@
sprite_src_builtin="dashboard/magic_wand.svg"
min_width="32"
tooltip="AUDIO.AUTO_SWITCH_TO_VR_AUDIO"
- color="~color_accent"
+ color="primary"
+ sprite_color="on_primary"
tooltip_side="right" />
diff --git a/dash-frontend/assets/gui/view/bindings.xml b/dash-frontend/assets/gui/view/bindings.xml
new file mode 100644
index 00000000..7e35170e
--- /dev/null
+++ b/dash-frontend/assets/gui/view/bindings.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dash-frontend/assets/gui/view/color_palettes.xml b/dash-frontend/assets/gui/view/color_palettes.xml
new file mode 100644
index 00000000..336d9982
--- /dev/null
+++ b/dash-frontend/assets/gui/view/color_palettes.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dash-frontend/assets/gui/view/dialog_box.xml b/dash-frontend/assets/gui/view/dialog_box.xml
new file mode 100644
index 00000000..0c3f87cf
--- /dev/null
+++ b/dash-frontend/assets/gui/view/dialog_box.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/dash-frontend/assets/gui/view/download_file.xml b/dash-frontend/assets/gui/view/download_file.xml
new file mode 100644
index 00000000..836372bd
--- /dev/null
+++ b/dash-frontend/assets/gui/view/download_file.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dash-frontend/assets/gui/view/game_launcher.xml b/dash-frontend/assets/gui/view/game_launcher.xml
index 5268af98..15cf6feb 100644
--- a/dash-frontend/assets/gui/view/game_launcher.xml
+++ b/dash-frontend/assets/gui/view/game_launcher.xml
@@ -9,11 +9,11 @@
-
+
-
+
-
\ No newline at end of file
+
diff --git a/dash-frontend/assets/gui/view/input_profiles.xml b/dash-frontend/assets/gui/view/input_profiles.xml
new file mode 100644
index 00000000..88406da7
--- /dev/null
+++ b/dash-frontend/assets/gui/view/input_profiles.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dash-frontend/assets/gui/view/popup_window.xml b/dash-frontend/assets/gui/view/popup_window.xml
index 1f1f6fed..fca9b563 100644
--- a/dash-frontend/assets/gui/view/popup_window.xml
+++ b/dash-frontend/assets/gui/view/popup_window.xml
@@ -1,6 +1,4 @@
-
-
-
+
-
+
-
-
+
+
-
+
-
-
+ position="relative"
+ >
+
+
+
+
-
\ No newline at end of file
+
diff --git a/dash-frontend/assets/gui/view/remote_skymap_downloader.xml b/dash-frontend/assets/gui/view/remote_skymap_downloader.xml
new file mode 100644
index 00000000..457125df
--- /dev/null
+++ b/dash-frontend/assets/gui/view/remote_skymap_downloader.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dash-frontend/assets/gui/view/remote_skymap_list.xml b/dash-frontend/assets/gui/view/remote_skymap_list.xml
new file mode 100644
index 00000000..e2f3603a
--- /dev/null
+++ b/dash-frontend/assets/gui/view/remote_skymap_list.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/dash-frontend/assets/gui/view/skymap_list.xml b/dash-frontend/assets/gui/view/skymap_list.xml
new file mode 100644
index 00000000..b32b0ec1
--- /dev/null
+++ b/dash-frontend/assets/gui/view/skymap_list.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/dash-frontend/assets/gui/view/skymap_list_cell.xml b/dash-frontend/assets/gui/view/skymap_list_cell.xml
new file mode 100644
index 00000000..ba286753
--- /dev/null
+++ b/dash-frontend/assets/gui/view/skymap_list_cell.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dash-frontend/assets/lang/de.json b/dash-frontend/assets/lang/de.json
index 5d3d933f..f671d5ad 100644
--- a/dash-frontend/assets/lang/de.json
+++ b/dash-frontend/assets/lang/de.json
@@ -1,166 +1,331 @@
{
- "HOME_SCREEN": "Startbildschirm",
- "MONADO_RUNTIME": "Monado-Laufzeitumgebung",
- "APPLICATIONS": "Anwendungen",
- "GAMES": "Spiele",
- "SETTINGS": "Einstellungen",
- "HELLO_USER": "Hallo, {USER}!",
- "GENERAL_SETTINGS": "Allgemeine Einstellungen",
- "APPLICATION_LAUNCHER": "Anwendung Launcher",
- "APP_SETTINGS": {
- "HIDE_USERNAME": "Benutzernamen ausblenden",
- "OPAQUE_BACKGROUND": "Undurchsichtiger Hintergrund",
- "LOOK_AND_FEEL": "Aussehen und Verhalten",
- "HIDE_GRAB_HELP": "Greif-Hilfe ausblenden",
- "ANIMATION_SPEED": "UI-Animationsgeschwindigkeit",
- "ROUND_MULTIPLIER": "UI-Kantenrundung",
- "USE_SKYBOX": "Skybox aktivieren",
- "USE_PASSTHROUGH": "Passthrough aktivieren",
- "CLOCK_12H": "12-Stunden-Uhr",
- "FEATURES": "Funktionen",
- "NOTIFICATIONS_ENABLED": "Benachrichtigungen aktivieren",
- "NOTIFICATIONS_SOUND_ENABLED": "Benachrichtigungstöne",
- "KEYBOARD_SOUND_ENABLED": "Tastengeräusche",
- "SPACE_DRAG_MULTIPLIER": "Raum-Drag-Multiplikator",
- "SPACE_DRAG_UNLOCKED": "Erlaube Space-Drag auf allen Achsen",
- "SPACE_ROTATE_UNLOCKED": "Erlaube Drehungen in allen Achsen",
- "BLOCK_GAME_INPUT": "Spieleingabe blockieren",
- "BLOCK_GAME_INPUT_IGNORE_WATCH": "Ignoriere Watch beim Blockieren der Eingabe",
- "CONTROLS": "Steuerung",
- "FOCUS_FOLLOWS_MOUSE_MODE": "Mausbewegung bei Triggerberührung",
- "LEFT_HANDED_MOUSE": "Linkshändige Maus",
- "ALLOW_SLIDING": "Stabinteraktion während des Greifens",
- "INVERT_SCROLL_DIRECTION_X": "Horizontale Scrollrichtung umkehren",
- "INVERT_SCROLL_DIRECTION_Y": "Vertikale Bildlaufrichtung umkehren",
- "SCROLL_SPEED": "Scrollgeschwindigkeit",
- "LONG_PRESS_DURATION": "Dauer für lange Drückvorgänge",
- "POINTER_LERP_FACTOR": "Zeigerglättung",
- "XR_CLICK_SENSITIVITY": "XR-Klicksensitivität",
- "XR_CLICK_SENSITIVITY_RELEASE": "XR-Loslassempfindlichkeit",
- "CLICK_FREEZE_TIME_MS": "Klick-Freeze-Zeit (ms)",
- "MISC": "Verschiedenes",
- "XWAYLAND_BY_DEFAULT": "Standardmäßig Apps im Kompatibilitätsmodus ausführen",
- "UPRIGHT_SCREEN_FIX": "Bildschirm-Drehkorrektur",
- "DOUBLE_CURSOR_FIX": "Doppelter Cursor Fix",
- "SCREEN_RENDER_DOWN": "Bildschirm bei niedrigerer Auflösung rendern",
- "UPRIGHT_SCREEN_FIX_HELP": "Behebt hochstehende Bildschirme auf einigen Desktops",
- "DOUBLE_CURSOR_FIX_HELP": "Aktivieren Sie dies, wenn Sie 2 Cursor sehen",
- "XR_CLICK_SENSITIVITY_HELP": "Analoge Trigger-Empfindlichkeit",
- "XR_CLICK_SENSITIVITY_RELEASE_HELP": "Muss niedriger als Klick sein",
- "CLICK_FREEZE_TIME_MS_HELP": "Hilft bei der Präzision von Doppelklicks",
- "LEFT_HANDED_MOUSE_HELP": "Verwenden Sie diese Option, wenn die Maustasten vertauscht sind",
- "BLOCK_GAME_INPUT_HELP": "Blockiert alle Eingaben, wenn ein Overlay angefahren wird",
- "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "Blockiere die Eingabe nicht, wenn die Überwachung aktiviert ist",
- "USE_SKYBOX_HELP": "Zeige einen Skybox, wenn keine Szenen-App oder Passthrough vorhanden ist",
- "USE_PASSTHROUGH_HELP": "Aktiviere Passthrough, falls die XR-Laufzeitumgebung dies unterstützt",
- "SCREEN_RENDER_DOWN_HELP": "Hilft bei Aliasing auf hochauflösenden Bildschirmen",
- "SETS_ON_WATCH": "Sets auf der Watch",
- "TROUBLESHOOTING": "Fehlerbehebung",
- "CLEAR_SAVED_STATE": "Gespeicherten Zustand löschen",
- "CLEAR_PIPEWIRE_TOKENS": "PipeWire Tokens löschen",
- "DELETE_ALL_CONFIGS": "Konfiguration löschen",
- "RESTART_SOFTWARE": "Software neu starten",
- "CLEAR_SAVED_STATE_HELP": "Sets und Overlay-Positionen zurücksetzen",
- "CLEAR_PIPEWIRE_TOKENS_HELP": "Bildschirmauswahl beim nächsten Start abfragen",
- "DELETE_ALL_CONFIGS_HELP": "Entfernen Sie alle Konfigurationsdateien aus conf.d",
- "RESTART_SOFTWARE_HELP": "Einstellungen anwenden, die einen Neustart erfordern",
- "CAPTURE_METHOD": "Wayland-Bildschirmaufnahme",
- "CAPTURE_METHOD_HELP": "Versuchen Sie, dies zu ändern, wenn Sie\nschwarze oder fehlerhafte Bildschirme erleben",
- "KEYBOARD_MIDDLE_CLICK": "Keyboard-Mittelklick",
- "KEYBOARD_MIDDLE_CLICK_HELP": "Modifikator bei Eingabe mit violettem Laser",
- "OPTION": {
- "AUTO": "Automatisch",
- "AUTO_HELP": "Bildschirmkopie GPU falls unterstützt,\nansonsten PipeWire GPU.",
- "PIPEWIRE_HELP": "Schnelle GPU-Erfassung,\nStandard auf allen Desktops.",
- "PW_FALLBACK_HELP": "Langsame Methode mit hoher CPU-Auslastung.\nVersuchen Sie es, falls PipeWire GPU nicht funktioniert.",
- "SCREENCOPY_GPU_HELP": "Schnell, keine Bildschirmfreigabe-Popups.\nFunktioniert mit: Hyprland, Niri, River, Sway",
- "SCREENCOPY_HELP": "Langsam, keine Bildschirmfreigabe-Popups.\nFunktioniert mit: Hyprland, Niri, River, Sway",
- "NONE": "Keine",
- "HMD_PINCH": "HMD + Kneifen",
- "EYE_PINCH": "Auge + Kneifen",
- "EYE_ONLY": "Nur Auge",
- "HMD_ONLY": "Nur HMD"
- },
- "AUTOSTART_APPS": "Anwendungen, die beim Start ausgeführt werden sollen",
- "HANDSFREE_POINTER": "Freihändige Modus",
- "HANDSFREE_POINTER_HELP": "Eingabe, die bei Bewegung\nder Controller verwendet wird, wenn diese nicht verfügbar sind.\nLinkes Kneifen greift, rechtes klickt.",
- "UI_GRADIENT_INTENSITY": "UI-Verlaufsintensität",
- "RESET_PLAYSPACE": "Spielbereich zurücksetzen",
- "RESET_PLAYSPACE_HELP": "Den Abstand des Spielbereichs zurücksetzen.",
- "BLOCK_POSES_ON_KBD_INTERACTION": "Posen beim Interagieren mit der Tastatur blockieren",
- "BLOCK_POSES_ON_KBD_INTERACTION_HELP": "Verhindert, dass das Spiel Posen empfängt, wenn die Tastatur angefahren wird und „Spieleingabe blockieren“ aktiviert ist",
- "LANGUAGE": "Sprache",
- "REQUIRES_RESTART": "Erfordert Neustart",
- "GRID_OPACITY": "Bodenraster-Undurchsichtigkeit",
- "GRID_OPACITY_HELP": "Undurchsichtigkeit des Bodenrasters, wenn der Skybox aktiviert ist"
- },
- "HELLO": "Hallo!",
- "AUDIO": {
- "VOLUME": "Lautstärke",
- "SETTINGS": "Audioeinstellungen",
- "AUTO_SWITCH_TO_VR_AUDIO": "Automatisch auf VR-Audio umschalten",
- "SPEAKERS": "Lautsprecher",
- "MICROPHONES": "Mikrofone",
- "CARDS": "Sound-Karten",
- "SELECT_AUDIO_CARD_PROFILE": "Wählen Sie das Sound-Kartenprofil",
- "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "Keine VR-Lautsprecher gefunden. Schalten Sie diese manuell um.",
- "NO_VR_MICROPHONE_SWITCH_MANUALLY": "Kein VR-Mikrofon gefunden. Schalten Sie es manuell um.",
- "FAILED_TO_SWITCH_MICROPHONE": "Fehler beim Wechseln des Mikrofons",
- "MICROPHONE_SET_SUCCESSFULLY": "Mikrofon erfolgreich umgeschaltet",
- "SPEAKERS_SET_SUCCESSFULLY": "Lautsprecher erfolgreich umgeschaltet"
- },
- "ACTIONS": {
- "RECENTER_PLAYSPACE": "Playspace neu zentrieren"
- },
- "POPUP_ADD_DISPLAY": {
- "RESOLUTION": "Auflösung"
- },
- "WIDTH": "Breite",
- "HEIGHT": "Höhe",
- "HIDE": "Verbergen",
- "REMOVE": "Entfernen",
- "SHOW": "Anzeigen",
- "FAILED_TO_LAUNCH_APPLICATION": "Fehler beim Starten der Anwendung:",
- "APPLICATION_STARTED": "Anwendung gestartet",
- "CLOSE_WINDOW": "Fenster schließen",
- "GAME_LIST": {
- "NO_GAMES_FOUND": "Keine Spiele gefunden",
- "RUNNING_GAMES_LIST": "Liste der laufenden Spiele"
- },
- "TERMINATE_PROCESS": "Prozess beenden",
- "GAME_LAUNCHED": "Spiel gestartet",
- "APP_LAUNCHER": {
- "MODE": {
- "NATIVE": "Nativer Modus",
- "CAGE": "Kompatibilitätsmodus (Cage)"
- },
- "RES_TITLE": "Auflösung",
- "ASPECT_TITLE": "Seitenverhältnis",
- "ASPECT": {
- "WIDE": "Breit",
- "SEMI_WIDE": "Halb-breit",
- "SQUARE": "Quadratisch",
- "SEMI_TALL": "Halbhoch",
- "TALL": "Hoch"
- },
- "POS_TITLE": "Positionierung",
- "POS": {
- "FLOATING": "Schwebend",
- "ANCHORED": "Verankert",
- "STATIC": "Statisch",
- "FLOATING_HELP": "Bewegt sich unabhängig, zentriert sich bei Anzeige neu.",
- "ANCHORED_HELP": "Bleibt relativ zur Mittelmarkierung an Ort und Stelle.",
- "STATIC_HELP": "Keine Set zugeordnet. Wird nicht zentriert."
- },
- "AUTOSTART": "Automatisch beim Start ausführen",
- "LAUNCH": "Starten"
- },
- "DISPLAY_BRIGHTNESS": "Bildschirmhelligkeit",
- "PROCESS_LIST": "Prozessliste",
- "REFRESH": "Aktualisieren",
- "PROCESS": {
- "STOP": "Stopp",
- "FORCE_KILL": "Erzwinge Beenden"
- },
- "DEBUG_INFO": "Debug-Informationen"
-}
\ No newline at end of file
+ "HOME_SCREEN": "Startbildschirm",
+ "MONADO_RUNTIME": "Monado-Laufzeitumgebung",
+ "APPLICATIONS": "Anwendungen",
+ "GAMES": "Spiele",
+ "SETTINGS": "Einstellungen",
+ "HELLO_USER": "Hallo, {USER}!",
+ "GENERAL_SETTINGS": "Allgemeine Einstellungen",
+ "APPLICATION_LAUNCHER": "Anwendung Launcher",
+ "APP_SETTINGS": {
+ "HIDE_USERNAME": "Benutzernamen ausblenden",
+ "OPAQUE_BACKGROUND": "Undurchsichtiger Hintergrund",
+ "LOOK_AND_FEEL": "Aussehen und Verhalten",
+ "HIDE_GRAB_HELP": "Greif-Hilfe ausblenden",
+ "ANIMATION_SPEED": "UI-Animationsgeschwindigkeit",
+ "ROUND_MULTIPLIER": "UI-Kantenrundung",
+ "USE_SKYBOX": "Skybox aktivieren",
+ "USE_PASSTHROUGH": "Passthrough aktivieren",
+ "CLOCK_12H": "12-Stunden-Uhr",
+ "FEATURES": "Funktionen",
+ "NOTIFICATIONS_ENABLED": "Benachrichtigungen aktivieren",
+ "NOTIFICATIONS_SOUND_ENABLED": "Benachrichtigungstöne",
+ "KEYBOARD_SOUND_ENABLED": "Tastengeräusche",
+ "SPACE_DRAG_MULTIPLIER": "Raum-Drag-Multiplikator",
+ "SPACE_DRAG_UNLOCKED": "Erlaube Space-Drag auf allen Achsen",
+ "SPACE_ROTATE_UNLOCKED": "Erlaube Drehungen in allen Achsen",
+ "BLOCK_GAME_INPUT": "Spieleingabe blockieren",
+ "BLOCK_GAME_INPUT_IGNORE_WATCH": "Ignoriere Watch beim Blockieren der Eingabe",
+ "CONTROLS": "Steuerung",
+ "FOCUS_FOLLOWS_MOUSE_MODE": "Mausbewegung bei Triggerberührung",
+ "LEFT_HANDED_MOUSE": "Linkshändige Maus",
+ "ALLOW_SLIDING": "Stabinteraktion während des Greifens",
+ "INVERT_SCROLL_DIRECTION_X": "Horizontale Scrollrichtung umkehren",
+ "INVERT_SCROLL_DIRECTION_Y": "Vertikale Bildlaufrichtung umkehren",
+ "SCROLL_SPEED": "Scrollgeschwindigkeit",
+ "LONG_PRESS_DURATION": "Dauer für lange Drückvorgänge",
+ "POINTER_LERP_FACTOR": "Zeigerglättung",
+ "CLICK_FREEZE_TIME_MS": "Klick-Freeze-Zeit (ms)",
+ "MISC": "Verschiedenes",
+ "XWAYLAND_BY_DEFAULT": "Standardmäßig Apps im Kompatibilitätsmodus ausführen",
+ "UPRIGHT_SCREEN_FIX": "Bildschirm-Drehkorrektur",
+ "DOUBLE_CURSOR_FIX": "Doppelter Cursor Fix",
+ "SCREEN_RENDER_DOWN": "Bildschirm bei niedrigerer Auflösung rendern",
+ "UPRIGHT_SCREEN_FIX_HELP": "Behebt hochstehende Bildschirme auf einigen Desktops",
+ "DOUBLE_CURSOR_FIX_HELP": "Aktivieren Sie dies, wenn Sie 2 Cursor sehen",
+ "CLICK_FREEZE_TIME_MS_HELP": "Hilft bei der Präzision von Doppelklicks",
+ "LEFT_HANDED_MOUSE_HELP": "Verwenden Sie diese Option, wenn die Maustasten vertauscht sind",
+ "BLOCK_GAME_INPUT_HELP": "Blockiert alle Eingaben, wenn ein Overlay angefahren wird",
+ "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "Blockiere die Eingabe nicht, wenn die Überwachung aktiviert ist",
+ "USE_SKYBOX_HELP": "Zeige einen Skybox, wenn keine Szenen-App oder Passthrough vorhanden ist",
+ "USE_PASSTHROUGH_HELP": "Aktiviere Passthrough, falls die XR-Laufzeitumgebung dies unterstützt",
+ "SCREEN_RENDER_DOWN_HELP": "Hilft bei Aliasing auf hochauflösenden Bildschirmen",
+ "SETS_ON_WATCH": "Sets auf der Watch",
+ "TROUBLESHOOTING": "Fehlerbehebung",
+ "CLEAR_SAVED_STATE": "Gespeicherten Zustand löschen",
+ "CLEAR_PIPEWIRE_TOKENS": "PipeWire Tokens löschen",
+ "DELETE_ALL_CONFIGS": "Konfiguration löschen",
+ "RESTART_SOFTWARE": "Software neu starten",
+ "CLEAR_SAVED_STATE_HELP": "Sets und Overlay-Positionen zurücksetzen",
+ "CLEAR_PIPEWIRE_TOKENS_HELP": "Bildschirmauswahl beim nächsten Start abfragen",
+ "DELETE_ALL_CONFIGS_HELP": "Entfernen Sie alle Konfigurationsdateien aus conf.d",
+ "RESTART_SOFTWARE_HELP": "Einstellungen anwenden, die einen Neustart erfordern",
+ "CAPTURE_METHOD": "Wayland-Bildschirmaufnahme",
+ "CAPTURE_METHOD_HELP": "Versuchen Sie, dies zu ändern, wenn Sie\nschwarze oder fehlerhafte Bildschirme erleben",
+ "KEYBOARD_MIDDLE_CLICK": "Keyboard-Mittelklick",
+ "KEYBOARD_MIDDLE_CLICK_HELP": "Modifikator bei Eingabe mit violettem Laser",
+ "OPTION": {
+ "AUTO": "Automatisch",
+ "AUTO_HELP": "Bildschirmkopie GPU falls unterstützt,\nansonsten PipeWire GPU.",
+ "PIPEWIRE_HELP": "Schnelle GPU-Erfassung,\nStandard auf allen Desktops.",
+ "PW_FALLBACK_HELP": "Langsame Methode mit hoher CPU-Auslastung.\nVersuchen Sie es, falls PipeWire GPU nicht funktioniert.",
+ "SCREENCOPY_GPU_HELP": "Schnell, keine Bildschirmfreigabe-Popups.\nFunktioniert mit: Hyprland, Niri, River, Sway",
+ "SCREENCOPY_HELP": "Langsam, keine Bildschirmfreigabe-Popups.\nFunktioniert mit: Hyprland, Niri, River, Sway",
+ "NONE": "Keine",
+ "HMD_PINCH": "HMD + Kneifen",
+ "EYE_PINCH": "Auge + Kneifen",
+ "NONE_INPUT_HELP": "Maus und Tastatur nicht emulieren.\nEs wird nicht möglich sein, mit Displays zu interagieren.",
+ "UINPUT": "Gerätesimulation",
+ "WL_VIRTUAL": "Wayland-virtueller Input",
+ "WL_VIRTUAL_HELP": "Sendet Ereignisse an den Wayland-Compositor unter Verwendung von\nzwlr_virtual_pointer und zwp_virtual_keyboard.\nFunktioniert nur zuverlässig auf einigen Desktops.\nFunktioniert NICHT auf KDE, GNOME oder COSMIC.",
+ "EYE_ONLY": "Augenlaser",
+ "HMD_ONLY": "HMD-Laser",
+ "NONE_INPUT_CAPTURE_HELP": "Maus und Tastatur nicht erfassen.\nDie physische Maus oder Tastatur kann in den \ninnerhalb von WayVR gestarteten Apps nicht verwendet werden.",
+ "UINPUT_HELP": "Verwendet das uinput-Modul, um ein Gerät zu emulieren.\nFunktioniert auf den meisten Desktops zuverlässig.",
+ "EVDEV_HELP": "Eingabegeräte für die exklusive Nutzung erfassen.\nIhr Benutzer muss Mitglied der Input-Gruppe sein."
+ },
+ "AUTOSTART_APPS": "Anwendungen, die beim Start ausgeführt werden sollen",
+ "HANDSFREE_POINTER": "Freihändige Modus",
+ "HANDSFREE_POINTER_HELP": "Eingabe, die bei Bewegung\nder Controller verwendet wird, wenn diese nicht verfügbar sind.\nLinkes Kneifen greift, rechtes klickt.",
+ "UI_GRADIENT_INTENSITY": "UI-Verlaufsintensität",
+ "RESET_PLAYSPACE": "Spielbereich zurücksetzen",
+ "RESET_PLAYSPACE_HELP": "Den Abstand des Spielbereichs zurücksetzen.",
+ "BLOCK_POSES_ON_KBD_INTERACTION": "Posen beim Interagieren mit der Tastatur blockieren",
+ "BLOCK_POSES_ON_KBD_INTERACTION_HELP": "Verhindert, dass das Spiel Posen empfängt, wenn die Tastatur angefahren wird und „Spieleingabe blockieren“ aktiviert ist",
+ "LANGUAGE": "Sprache",
+ "REQUIRES_RESTART": "Erfordert Neustart",
+ "GRID_OPACITY": "Bodenraster-Undurchsichtigkeit",
+ "GRID_OPACITY_HELP": "Undurchsichtigkeit des Bodenrasters, wenn der Skybox aktiviert ist",
+ "BROWSE_ONLINE_CATALOG": "Online-Katalog durchsuchen...",
+ "BROWSE_SKYMAPS": "Skymaps durchsuchen",
+ "COLOR_KEYING": "Farbschlüsselung",
+ "NO_SKYMAPS_FOUND": "Keine Skymaps gefunden",
+ "SELECT_VARIANT": "Variante auswählen",
+ "SHOW_WELCOME_SCREEN": "Begrüßungsbildschirm anzeigen",
+ "SKYBOX": "Skybox",
+ "SKYMAP_ALREADY_DOWNLOADED": "Diese Skymap wurde bereits heruntergeladen. Wählen Sie die gewünschte Aktion aus.",
+ "WATCH_VIEW_ANGLE": "Betrachtungswinkel der Watch",
+ "WATCH_VIEW_ANGLE_HELP": "Steuerung, wie die Watch ausgeblendet wird",
+ "BINDINGS": {
+ "COMP": {
+ "CLICK": "Klicken",
+ "FORCE": "Kraft",
+ "TOUCH": "Berührung",
+ "VALUE": "Wert",
+ "PROXIMITY": "Nähe",
+ "X_AXIS": "X-Achse",
+ "Y_AXIS": "Y-Achse"
+ },
+ "TYPE": {
+ "BUMPER": "Bumper",
+ "DPAD_UP": "D-Pad oben",
+ "DPAD_DOWN": "D-Pad Runter",
+ "DPAD_LEFT": "D-Pad Links",
+ "DPAD_RIGHT": "D-Pad Rechts",
+ "JOYSTICK": "Joystick",
+ "MENU": "Menü",
+ "SHOULDER": "Schulter",
+ "SQUEEZE": "Greifen",
+ "SYSTEM": "System",
+ "THUMBREST": "Daumenuflage",
+ "THUMBSTICK": "Thumbstick",
+ "TRACKPAD": "Trackpad",
+ "TRIGGER": "Trigger",
+ "VIEW": "Ansehen"
+ },
+ "CLICK": {
+ "ANY": "Beliebig",
+ "DOUBLE": "Doppeltippen",
+ "TRIPLE": "Dreifach-Tippen",
+ "TYPE": "Anzahl der Taps"
+ },
+ "ACTION": {
+ "CLICK": "Klick*",
+ "GRAB": "Greifen*",
+ "ALT_CLICK": "Benutzerdefiniertes Shell-Exec (alt_click in Konfiguration festlegen)",
+ "SHOW_HIDE": "Anzeigen, ausblenden, neuzentrieren*",
+ "TOGGLE_DASHBOARD": "Dashboard umschalten",
+ "SPACE_DRAG": "Playspace-Drag",
+ "SPACE_ROTATE": "Playspace rotieren",
+ "SPACE_RESET": "Playspace zurücksetzen",
+ "CLICK_MODIFIER_RIGHT": "Rechtsklick-Modifikator",
+ "CLICK_MODIFIER_MIDDLE": "Mittlere Maustaste-Modifier",
+ "MOVE_MOUSE": "Maus bewegen (falls standardmäßig deaktiviert)",
+ "SCROLL": "Scrollen*"
+ },
+ "LEFT": "Links",
+ "RIGHT": "Rechts",
+ "COMPONENT": "Auslösetyp",
+ "SUBPATH": "Betätigungskontrolle",
+ "THRESHOLD": "Aktivieren, wenn oberer Wert überschritten\nDeaktivieren, wenn unterer Wert unterschritten"
+ },
+ "ENABLED": "Aktiviert",
+ "INPUT_EMULATION_METHOD": "Methode zur Eingabeemulation",
+ "INPUT_EMULATION_METHOD_HELP": "Versuchen Sie dies zu ändern, falls Maus- oder\nTastatureingaben nicht registriert werden.",
+ "INPUT_PROFILES": "Eingabesteuerungen ändern",
+ "INPUT_PROFILES_HELP": "OpenXR-Controller-Eingabebindungen",
+ "NOT_SUPPORTED": "Nicht unterstützt",
+ "ENABLE_WATCH": "Watch aktivieren",
+ "SPACE_DRAG": "Space-drag",
+ "SPACE_GRAVITY_DAMPING": "Dämpfung",
+ "SPACE_GRAVITY_DAMPING_HELP": "Künstlicher Widerstand, um die Bewegung zu verlangsamen. 0,1 - hoher Widerstand, 1,0 - kein Widerstand",
+ "SPACE_GRAVITY_FLING_STRENGTH": "Wurfstärke",
+ "SPACE_GRAVITY_FLING_STRENGTH_HELP": "Intensitätsmultiplikator der Schwerkraft-Abstoßungskraft nach dem Space-drag.\n0.0 - gar keine Bewegung, 2.0 - doppelte Intensität",
+ "SPACE_GRAVITY_GRAVITY": "Gravitation",
+ "SPACE_GRAVITY_GRAVITY_HELP": "Betrag der Abwärtskraft. 0.0 - keine Schwerkraft",
+ "SPACE_GRAVITY_GROUND_FRICTION": "Bodenreibung",
+ "SPACE_GRAVITY_GROUND_FRICTION_HELP": "Das Ausmaß der Reibung, das Sie verlangsamt, wenn Sie den Boden berühren.\n0.0 - keine Reibung (wie auf Eis), 1.0 - raue Oberfläche",
+ "SPACE_GRAVITY_FLOOR_HEIGHT": "Bodenhöhe",
+ "SPACE_GRAVITY_FLOOR_HEIGHT_HELP": "Die Y-Position, an der sich der Boden befindet. Die Schwerkraft wird gestoppt, wenn Sie diese Höhe erreichen.",
+ "SAVE": "Speichern",
+ "CANCEL": "Abbrechen",
+ "WHISPER": {
+ "NEED_TO_DOWNLOAD_MODEL": "Das ausgewählte Modell muss heruntergeladen werden.\nJetzt herunterladen?",
+ "REMOVE_UNUSED_MODELS": "Sie schalten die Sprache-zu-Text-Funktion aus.\nMöchten Sie die heruntergeladenen Whisper-Modelle entfernen, um Speicherplatz freizugeben?"
+ },
+ "WHISPER_MODEL": "Sprach-zu-Text-Modell",
+ "WHISPER_MODEL_HELP": "Zu verwendendes Whisper-Modell.\nGrößere Modelle liefern genauere\nErgebnisse, verbrauchen jedoch mehr VRAM.",
+ "DEFAULT_OVERLAY_SCALE": "Standardgröße des Overlays",
+ "DEFAULT_OVERLAY_SCALE_HELP": "Neue Overlays werden in dieser Skalierung erstellt.",
+ "COLOR_PALETTE": "Farbpalette",
+ "COLOR_PALETTES": "Farbpaletten",
+ "COLOR_PALETTE_CURRENT": "Derzeit aktives Thema.",
+ "COLOR_PALETTE_ACTIVATE": "Klicken Sie hier, um dieses Thema zu verwenden.",
+ "COLOR_PALETTE_HELP": "Klicken, um Farbpaletten zu durchsuchen.\nUm eigene zu erstellen, besuche die Webseite!",
+ "COLOR_PALETTE_CUSTOM_URL": "Füge dein eigenes benutzerdefiniertes Thema hinzu!",
+ "COLOR_PALETTE_CUSTOM_URL2": "Klicken Sie hier, um das Web-Handbuch zu öffnen.",
+ "SNAP_ANGLE_DEG": "Snap-Winkel für Fensterneigung und Rollwinkel",
+ "SNAP_ANGLE_DEG_HELP": "Gegriffene Fenster rasten in diesem Winkel auf der Nick- und Rollachse ein.",
+ "SAVE_PLAYSPACE_CENTER": "Playspace-Zentrum speichern",
+ "SAVE_PLAYSPACE_CENTER_HELP": "Nutzen Sie den aktuellen Playspace für die Zuweisung zum Zurücksetzen des Playspaces.",
+ "RESET_PLAYSPACE_CENTER": "Playspace-Zentrum zurücksetzen",
+ "RESET_PLAYSPACE_CENTER_HELP": "Zuvor festgelegtes Playspace-Zentrum zurücksetzen.",
+ "HANDSFREE_ALT_TAB": "App-Switcher-Ziel",
+ "HANDSFREE_ALT_TAB_HELP": "Super+X gedrückt halten, auf das gewünschte Fenster zielen und dann loslassen, um den Fokus zu wechseln.",
+ "INPUT_CAPTURE_METHOD": "Eingabe-Erfassungsmethode",
+ "POINTER_ACCELERATION": "Mausbeschleunigung",
+ "POINTER_ACCELERATION_HELP": "An: Adaptive Mausbeschleunigung\nAus: Konstante Geschwindigkeit",
+ "POINTER_SPEED": "Mausgeschwindigkeit",
+ "INPUT_CAPTURE_METHOD_HELP": "Ermöglicht die Nutzung physischer Peripheriegeräte innerhalb von WayVR.\n Super+Z: Eingabe zwischen WayVR und echtem Desktop umschalten\n Super+X: Zwischen WayVR-Apps umschalten",
+ "SPACE_DRAG_AFFECTS_WORLD": "Space-Drag bewegt Overlays"
+ },
+ "HELLO": "Hallo!",
+ "AUDIO": {
+ "VOLUME": "Lautstärke",
+ "SETTINGS": "Audioeinstellungen",
+ "AUTO_SWITCH_TO_VR_AUDIO": "Automatisch auf VR-Audio umschalten",
+ "SPEAKERS": "Lautsprecher",
+ "MICROPHONES": "Mikrofone",
+ "CARDS": "Sound-Karten",
+ "SELECT_AUDIO_CARD_PROFILE": "Wählen Sie das Sound-Kartenprofil",
+ "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "Keine VR-Lautsprecher gefunden. Schalten Sie diese manuell um.",
+ "NO_VR_MICROPHONE_SWITCH_MANUALLY": "Kein VR-Mikrofon gefunden. Schalten Sie es manuell um.",
+ "FAILED_TO_SWITCH_MICROPHONE": "Fehler beim Wechseln des Mikrofons",
+ "MICROPHONE_SET_SUCCESSFULLY": "Mikrofon erfolgreich umgeschaltet",
+ "SPEAKERS_SET_SUCCESSFULLY": "Lautsprecher erfolgreich umgeschaltet"
+ },
+ "ACTIONS": {
+ "RECENTER_PLAYSPACE": "Playspace neu zentrieren"
+ },
+ "POPUP_ADD_DISPLAY": {
+ "RESOLUTION": "Auflösung"
+ },
+ "WIDTH": "Breite",
+ "HEIGHT": "Höhe",
+ "HIDE": "Verbergen",
+ "REMOVE": "Entfernen",
+ "SHOW": "Anzeigen",
+ "FAILED_TO_LAUNCH_APPLICATION": "Fehler beim Starten der Anwendung:",
+ "APPLICATION_STARTED": "Anwendung gestartet",
+ "CLOSE_WINDOW": "Fenster schließen",
+ "GAME_LIST": {
+ "NO_GAMES_FOUND": "Keine Spiele gefunden",
+ "RUNNING_GAMES_LIST": "Liste der laufenden Spiele"
+ },
+ "TERMINATE_PROCESS": "Prozess beenden",
+ "GAME_LAUNCHED": "Spiel gestartet",
+ "APP_LAUNCHER": {
+ "MODE": {
+ "NATIVE": "Nativer Modus",
+ "CAGE": "Kompatibilitätsmodus (Cage)"
+ },
+ "RES_TITLE": "Auflösung",
+ "ASPECT_TITLE": "Seitenverhältnis",
+ "ASPECT": {
+ "WIDE": "Breit",
+ "SEMI_WIDE": "Halb-breit",
+ "SQUARE": "Quadratisch",
+ "SEMI_TALL": "Halbhoch",
+ "TALL": "Hoch"
+ },
+ "POS_TITLE": "Positionierung",
+ "POS": {
+ "FLOATING": "Schwebend",
+ "ANCHORED": "Verankert",
+ "STATIC": "Statisch",
+ "FLOATING_HELP": "Bewegt sich unabhängig, zentriert sich bei Anzeige neu.",
+ "ANCHORED_HELP": "Bleibt relativ zur Mittelmarkierung an Ort und Stelle.",
+ "STATIC_HELP": "Keine Set zugeordnet. Wird nicht zentriert."
+ },
+ "AUTOSTART": "Automatisch beim Start ausführen",
+ "LAUNCH": "Starten"
+ },
+ "DISPLAY_BRIGHTNESS": "Bildschirmhelligkeit",
+ "PROCESS_LIST": "Prozessliste",
+ "REFRESH": "Aktualisieren",
+ "PROCESS": {
+ "STOP": "Stopp",
+ "FORCE_KILL": "Erzwinge Beenden"
+ },
+ "DEBUG_INFO": "Debug-Informationen",
+ "CREATION_DATE": "Erstellungsdatum",
+ "DOWNLOADER": "Downloader",
+ "DOWNLOAD_AGAIN": "Erneut herunterladen",
+ "DOWNLOADING_FILE": "Datei wird heruntergeladen...",
+ "GETTING_STARTED": "Erste Schritte",
+ "MODIFICATION_DATE": "Änderungsdatum",
+ "LOADING": "Laden...",
+ "APPLY": "Anwenden",
+ "RELOAD_FROM_DISK": "Von Festplatte neu laden",
+ "TARGET_PATH": "Zielpfad",
+ "VERSION": "Version",
+ "DONATE": {
+ "SUPPORT_US": "Unterstütze uns",
+ "DESCRIPTION": "Wir sind ein kleines Team aus zwei Entwicklern, die WayVR in ihrer Freizeit bauen. Wenn Ihnen die Nutzung dieser Software Spaß macht, unterstützen Sie uns bitte – jede Spende hilft uns, weiterzumachen.",
+ "BUTTON_TOOLTIP": "Spenden über Open Collective",
+ "CURRENT_SUPPORTERS": "Aktuelle Unterstützer",
+ "THANK_YOU_WAYVR": "Vielen Dank vom WayVR-Team!"
+ },
+ "WELCOME": {
+ "ALL_SET": "Du bist startklar!",
+ "BASICS": "Diese Grundlagen ermöglichen Ihnen einen einfachen Einstieg in die Nutzung von WayVR.",
+ "FEATURES_DOCUMENTATION": "Es gibt viele weitere Funktionen, die es wert sind, angepasst zu werden. Weitere Informationen finden Sie in der Dokumentation unter",
+ "FINISH_TUTORIAL": "Tutorial beenden",
+ "GRAB_BOTH_HANDS": "Greifen Sie es mit beiden Händen, wenn Sie ein bestimmtes Overlay in Ihrem Set bewegen möchten.",
+ "GRAB_ONE_HAND": "Greife es mit einer Hand, um dein Set zu bewegen.",
+ "GREETING": "Hallo!",
+ "GUIDE_INTRO": "Lassen Sie sich durch Ihre ersten Schritte führen.",
+ "LASER_COLORS": "Laserfarben",
+ "LASER_FUNCTIONALITY": "Ein Großteil der Funktionalität in WayVR hängt davon ab, welche Laserfarbe verwendet wird, um mit einem UI-Element zu interagieren. Sie müssen diese Schaltflächen nicht drücken, berühren Sie sie einfach!",
+ "LAST_PAGE_INFO": "Dieses Tutorial wird nicht mehr angezeigt, sobald du die letzte Seite erreicht hast.",
+ "LOOK_AT_LEFT_WRIST": "Schau auf dein linkes Handgelenk. Das ist deine Watch.",
+ "MIDDLE_CLICK_MODE_PURPLE_LASER": "— Mittlere Maustaste-Modus: Lila Laser",
+ "MOVING_YOUR_SET": "Ihr Set wird verschoben",
+ "NEXT_BUTTON": "Drücke die Schaltfläche „Weiter“ unten, um zu beginnen.",
+ "REGULAR_MODE_BLUE_LASER": "— Regulärer Modus: Blauer Laser",
+ "REPOSITION_THIS_WINDOW_BY_GRABBING": "Positionieren Sie dieses Fenster neu, indem Sie die Greifaktion Ihres Controllers verwenden.",
+ "RIGHT_CLICK_MODE_ORANGE_LASER": "— Rechtsklick-Modus: Oranger Laser",
+ "THANKS_FOR_INSTALLING": "Vielen Dank für die Installation von WayVR!",
+ "WATCH": "Watch",
+ "WORKING_SET": "Arbeits-Set",
+ "DOUBLE_PRESS_TO_TOGGLE": "Drücke B (beim Index) oder Y (beim Meta) doppelt, um dein Set anzuzeigen, neu zu zentrieren oder auszublenden. Probier es jetzt aus.",
+ "CENTER_MARKER": "Der Zentrierungsmarker ist das, was bei der Neuzentrierung vor dir erscheint. Platziere Overlays darum herum!"
+ },
+ "DOWNLOAD": "Herunterladen",
+ "SAVED_TO_FAVOURITES": "Zu Favoriten hinzugefügt",
+ "ADD_TO_FAVOURITES": "Zu Favoriten hinzufügen",
+ "ADD_TO_FAVOURITES_HINT": "Voreinstellung speichern und an den App-Drawer anheften",
+ "REMOVE_FROM_FAVOURITES": "Aus Favoriten entfernen",
+ "EMPTY": "Leer",
+ "PINNED_APPS": "Angepinnte Anwendungen"
+}
diff --git a/dash-frontend/assets/lang/en.json b/dash-frontend/assets/lang/en.json
index 96b56062..0629f776 100644
--- a/dash-frontend/assets/lang/en.json
+++ b/dash-frontend/assets/lang/en.json
@@ -38,8 +38,71 @@
"BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "Do not block input when watch is hovered",
"BLOCK_POSES_ON_KBD_INTERACTION": "Block poses when interacting with keyboard",
"BLOCK_POSES_ON_KBD_INTERACTION_HELP": "Blocks the game from receiving poses when the keyboard is hovered and 'Block game input' is enabled",
+ "BINDINGS": {
+ "COMP": {
+ "CLICK": "Click",
+ "FORCE": "Force",
+ "TOUCH": "Touch",
+ "VALUE": "Value",
+ "PROXIMITY": "Proximity",
+ "X_AXIS": "X axis",
+ "Y_AXIS": "Y axis"
+ },
+ "TYPE": {
+ "BUMPER": "Bumper",
+ "DPAD_UP": "D-pad Up",
+ "DPAD_DOWN": "D-pad Down",
+ "DPAD_LEFT": "D-pad Left",
+ "DPAD_RIGHT": "D-pad Right",
+ "JOYSTICK": "Joystick",
+ "MENU": "Menu",
+ "SHOULDER": "Shoulder",
+ "SQUEEZE": "Grip",
+ "SYSTEM": "System",
+ "THUMBREST": "Thumbrest",
+ "THUMBSTICK": "Thumbstick",
+ "TRACKPAD": "Trackpad",
+ "TRIGGER": "Trigger",
+ "VIEW": "View"
+ },
+ "CLICK": {
+ "ANY": "Any",
+ "DOUBLE": "Double-tap",
+ "TRIPLE": "Triple-tap",
+ "TYPE": "Tap count"
+ },
+ "ACTION": {
+ "CLICK": "Click*",
+ "GRAB": "Grab*",
+ "ALT_CLICK": "Custom shell exec (set alt_click in config)",
+ "SHOW_HIDE": "Show, hide, recenter*",
+ "TOGGLE_DASHBOARD": "Toggle dashboard",
+ "SPACE_DRAG": "Playspace drag",
+ "SPACE_ROTATE": "Playspace rotate",
+ "SPACE_RESET": "Playspace reset",
+ "CLICK_MODIFIER_RIGHT": "Right-click modifier",
+ "CLICK_MODIFIER_MIDDLE": "Middle-click modifier",
+ "MOVE_MOUSE": "Move mouse (if off by default)",
+ "SCROLL": "Scroll*"
+ },
+ "LEFT": "Left",
+ "RIGHT": "Right",
+ "COMPONENT": "Actuation type",
+ "SUBPATH": "Actuating control",
+ "THRESHOLD": "Activate when above upper value\nDeactivate when below lower value"
+ },
+ "BROWSE_ONLINE_CATALOG": "Browse online catalog...",
+ "BROWSE_SKYMAPS": "Browse skymaps",
"CAPTURE_METHOD": "Wayland screen capture",
"CAPTURE_METHOD_HELP": "Try changing this if you are\nexperiencing black or glitchy screens",
+ "COLOR_KEYING": "Color keying",
+ "COLOR_PALETTE": "Color palette",
+ "COLOR_PALETTE_HELP": "Click to browse color palettes.\nTo create custom ones, see website!",
+ "COLOR_PALETTES": "Color palettes",
+ "COLOR_PALETTE_CURRENT": "Currently active theme.",
+ "COLOR_PALETTE_CUSTOM_URL": "Add your own custom theme!",
+ "COLOR_PALETTE_CUSTOM_URL2": "Click to open web manual.",
+ "COLOR_PALETTE_ACTIVATE": "Click to use this theme.",
"CLEAR_PIPEWIRE_TOKENS": "Clear PipeWire tokens",
"CLEAR_PIPEWIRE_TOKENS_HELP": "Prompt for screen selection on next start",
"CLEAR_SAVED_STATE": "Clear saved state",
@@ -52,12 +115,23 @@
"DELETE_ALL_CONFIGS_HELP": "Remove all configuration files from conf.d",
"DOUBLE_CURSOR_FIX": "Double cursor fix",
"DOUBLE_CURSOR_FIX_HELP": "Enable this if you see 2 cursors",
+ "DEFAULT_OVERLAY_SCALE": "Default overlay size",
+ "DEFAULT_OVERLAY_SCALE_HELP": "Spawn new overlays at this scale.",
+ "ENABLED": "Enabled",
"FEATURES": "Features",
"FOCUS_FOLLOWS_MOUSE_MODE": "Mouse move on trigger touch",
"HANDSFREE_POINTER": "Handsfree mode",
"HANDSFREE_POINTER_HELP": "Input to use when motion\ncontrollers are unavailable.\nLeft pinch is grab, right is click.",
+ "HANDSFREE_ALT_TAB": "App switcher aim",
+ "HANDSFREE_ALT_TAB_HELP": "Hold Super+X, aim at the desired window, then release to switch focus.",
"HIDE_GRAB_HELP": "Hide grab help",
"HIDE_USERNAME": "Hide username",
+ "INPUT_EMULATION_METHOD": "Input emulation method",
+ "INPUT_EMULATION_METHOD_HELP": "Try change this in case mouse or\nkeyboard input does not register.",
+ "INPUT_CAPTURE_METHOD": "Input capture method",
+ "INPUT_CAPTURE_METHOD_HELP": "Allows using physical peripherial inside WayVR.\n Super+Z: Switch input between WayVR and real desktop\n Super+X: Switch between WayVR apps",
+ "INPUT_PROFILES": "Change Input Bindings",
+ "INPUT_PROFILES_HELP": "OpenXR controller input bindings",
"INVERT_SCROLL_DIRECTION_X": "Invert horizontal scroll direction",
"INVERT_SCROLL_DIRECTION_Y": "Invert vertical scroll direction",
"KEYBOARD_MIDDLE_CLICK": "Keyboard middle click",
@@ -73,33 +147,68 @@
"MISC": "Miscellaneous",
"NOTIFICATIONS_ENABLED": "Enable notifications",
"NOTIFICATIONS_SOUND_ENABLED": "Notification sounds",
+ "NOT_SUPPORTED": "Not supported",
+ "NO_SKYMAPS_FOUND": "No skymaps found",
"OPAQUE_BACKGROUND": "Opaque background",
"OPTION": {
"AUTO": "Automatic",
"AUTO_HELP": "ScreenCopy GPU if supported,\notherwise PipeWire GPU.",
- "EYE_ONLY": "Eye only",
+ "EYE_ONLY": "Eye laser",
"EYE_PINCH": "Eye + pinch",
- "HMD_ONLY": "HMD only",
+ "HMD_ONLY": "HMD laser",
"HMD_PINCH": "HMD + pinch",
"NONE": "None",
+ "NONE_INPUT_HELP": "Do not emulate mouse and keyboard.\nWill not be able to interact with screens.",
+ "NONE_INPUT_CAPTURE_HELP": "Do not capture mouse and keyboard.\nWill not be able to use physical mouse or\nkeyboard in apps launched inside WayVR.",
"PIPEWIRE_HELP": "Fast GPU capture,\nstandard on all desktops.",
"PW_FALLBACK_HELP": "Slow method with high CPU usage.\nTry in case PipeWire GPU doesn't work",
"SCREENCOPY_GPU_HELP": "Fast, no screen share popups.\nWorks on: Hyprland, Niri, River, Sway",
- "SCREENCOPY_HELP": "Slow, no screen share popups.\nWorks on: Hyprland, Niri, River, Sway"
+ "SCREENCOPY_HELP": "Slow, no screen share popups.\nWorks on: Hyprland, Niri, River, Sway",
+ "UINPUT": "Device emulation",
+ "UINPUT_HELP": "Uses the uinput module to emulate a device.\nKnown to work well on most desktops.",
+ "EVDEV_HELP": "Grab input devices for exclusive use.\nYour user must be in the input group.",
+ "WL_VIRTUAL": "Wayland virtual input",
+ "WL_VIRTUAL_HELP": "Send events to the Wayland compositor using\nzwlr_virtual_pointer and zwp_virtual_keyboard.\nOnly works reliably on some desktops.\nDoes NOT work on KDE, GNOME or COSMIC."
},
+ "POINTER_ACCELERATION": "Mouse acceleration",
+ "POINTER_ACCELERATION_HELP": "On: Adaptive mouse acceleration\nOff: Constant speed",
"POINTER_LERP_FACTOR": "Pointer smoothing",
+ "POINTER_SPEED": "Mouse speed",
"REQUIRES_RESTART": "Requires restart",
"RESET_PLAYSPACE": "Reset playspace",
"RESET_PLAYSPACE_HELP": "Clear the stage space offset.",
+ "SAVE_PLAYSPACE_CENTER": "Save playspace center",
+ "SAVE_PLAYSPACE_CENTER_HELP": "Use current playspace for reset playspace binding.",
+ "RESET_PLAYSPACE_CENTER": "Reset playspace center",
+ "RESET_PLAYSPACE_CENTER_HELP": "Clear previously set playspace center.",
"RESTART_SOFTWARE": "Restart software",
"RESTART_SOFTWARE_HELP": "Apply settings that require a restart",
"ROUND_MULTIPLIER": "UI Edge roundness",
"SCREEN_RENDER_DOWN": "Render screen at lower resolution",
"SCREEN_RENDER_DOWN_HELP": "Helps with aliasing on high-res screens",
"SCROLL_SPEED": "Scroll speed",
+ "SELECT_VARIANT": "Select variant",
+ "SNAP_ANGLE_DEG": "Window pitch & roll snap angle",
+ "SNAP_ANGLE_DEG_HELP": "Grabbed windows snap to this angle on pitch and roll axis.",
+ "ENABLE_WATCH": "Enable watch",
"SETS_ON_WATCH": "Sets on watch",
+ "SHOW_WELCOME_SCREEN": "Show welcome screen",
+ "SKYBOX": "Skybox",
+ "SKYMAP_ALREADY_DOWNLOADED": "This skymap is already downloaded. Select desired action.",
+ "SPACE_DRAG": "Space drag",
"SPACE_DRAG_MULTIPLIER": "Space drag multiplier",
+ "SPACE_DRAG_AFFECTS_WORLD": "Space drag moves overlays",
"SPACE_DRAG_UNLOCKED": "Allow space drag on all axes",
+ "SPACE_GRAVITY_DAMPING": "Damping",
+ "SPACE_GRAVITY_DAMPING_HELP": "Artificial drag to slow down movement. 0.1 - high drag, 1.0 - no drag",
+ "SPACE_GRAVITY_FLING_STRENGTH": "Fling strength",
+ "SPACE_GRAVITY_FLING_STRENGTH_HELP": "Intensity multiplier of gravitational launch force after space-drag.\n0.0 - no movement at all, 2.0 - double intensity",
+ "SPACE_GRAVITY_GRAVITY": "Gravity",
+ "SPACE_GRAVITY_GRAVITY_HELP": "Amount of downwards force. 0.0 - no gravity",
+ "SPACE_GRAVITY_GROUND_FRICTION": "Ground friction",
+ "SPACE_GRAVITY_GROUND_FRICTION_HELP": "Amount of friction slowing you down if you're touching the ground.\n0.0 - no friction (just like on ice), 1.0 - rough surface",
+ "SPACE_GRAVITY_FLOOR_HEIGHT": "Floor height",
+ "SPACE_GRAVITY_FLOOR_HEIGHT_HELP": "The Y position where the floor is. Gravity stops when you reach this height.",
"SPACE_ROTATE_UNLOCKED": "Allow space rotate on all axes",
"TROUBLESHOOTING": "Troubleshooting",
"UI_GRADIENT_INTENSITY": "UI Gradient intensity",
@@ -109,13 +218,19 @@
"USE_PASSTHROUGH_HELP": "Allow passthrough if the XR runtime supports it",
"USE_SKYBOX": "Enable skybox",
"USE_SKYBOX_HELP": "Show a skybox if there's no scene app or passthrough",
+ "WATCH_VIEW_ANGLE": "Watch view angles",
+ "WATCH_VIEW_ANGLE_HELP": "Control how the watch fades away",
+ "WHISPER": {
+ "NEED_TO_DOWNLOAD_MODEL": "The selected model needs to be downloaded.\nDownload it right now?",
+ "REMOVE_UNUSED_MODELS": "You are turning off the speech-to-text feature.\nWould you like to remove downloaded Whisper models to free up space?"
+ },
+ "WHISPER_MODEL": "Speech-to-text model",
+ "WHISPER_MODEL_HELP": "Whisper model to use.\nLarger models produce more accurate\nresults, but consume more VRAM.",
"GRID_OPACITY": "Floor grid opacity",
"GRID_OPACITY_HELP": "Opacity of the floor grid when the skybox is enabled",
- "XR_CLICK_SENSITIVITY": "XR click sensitivity",
- "XR_CLICK_SENSITIVITY_HELP": "Analog trigger sensitivity",
- "XR_CLICK_SENSITIVITY_RELEASE": "XR release sensitivity",
- "XR_CLICK_SENSITIVITY_RELEASE_HELP": "Must be lower than click",
- "XWAYLAND_BY_DEFAULT": "Run apps in Compatibility mode by default"
+ "XWAYLAND_BY_DEFAULT": "Run apps in Compatibility mode by default",
+ "SAVE": "Save",
+ "CANCEL": "Cancel"
},
"APPLICATION_LAUNCHER": "Application launcher",
"APPLICATION_STARTED": "Application started",
@@ -135,8 +250,45 @@
"VOLUME": "Volume"
},
"CLOSE_WINDOW": "Close window",
+ "CREATION_DATE": "Creation date",
"DEBUG_INFO": "Debug info",
"DISPLAY_BRIGHTNESS": "Display brightness",
+ "DONATE": {
+ "SUPPORT_US": "Support us",
+ "DESCRIPTION": "We're a small team of 2 developers building WayVR in our free time. If you enjoy using this software, please consider supporting us - every donation helps us keep going.",
+ "THANK_YOU_WAYVR": "Thank you from the WayVR Team!",
+ "BUTTON_TOOLTIP": "Donate via Open Collective",
+ "CURRENT_SUPPORTERS": "Current Supporters"
+ },
+ "DOWNLOAD": "Download",
+ "DOWNLOADER": "Downloader",
+ "WELCOME": {
+ "ALL_SET": "You're all set!",
+ "BASICS": "These basics will allow you to start using WayVR with ease.",
+ "CENTER_MARKER": "Center marker is what will appear in front of you when recentering. Place overlays around it!",
+ "DOUBLE_PRESS_TO_TOGGLE": "Double-press B (on Index) or Y (on Meta) to show, recenter or hide your set. Try it now.",
+ "FEATURES_DOCUMENTATION": "There are many other features worth customizing. For more information, check the documentation at",
+ "FINISH_TUTORIAL": "Finish tutorial",
+ "GRAB_BOTH_HANDS": "Grab it with both hands if you want to move a specific overlay in your set.",
+ "GRAB_ONE_HAND": "Grab it with one hand to move your set.",
+ "GREETING": "Hi there!",
+ "GUIDE_INTRO": "Let us guide you through your first steps.",
+ "LASER_COLORS": "Laser Colors",
+ "LASER_FUNCTIONALITY": "Much of the functionality in WayVR depends on what color of laser is used to interact with a UI element. You don't need to press these buttons, just touch them!",
+ "LAST_PAGE_INFO": "This tutorial will stop showing up once you get to the last page.",
+ "LOOK_AT_LEFT_WRIST": "Look at your left wrist. That's your watch.",
+ "MIDDLE_CLICK_MODE_PURPLE_LASER": "— Middle-click Mode: Purple laser",
+ "MOVING_YOUR_SET": "Moving your set",
+ "NEXT_BUTTON": "Press \"Next\" button below to get started.",
+ "REGULAR_MODE_BLUE_LASER": "— Regular Mode: Blue laser",
+ "REPOSITION_THIS_WINDOW_BY_GRABBING": "Reposition this window using your controller's grip action.",
+ "RIGHT_CLICK_MODE_ORANGE_LASER": "— Right-click Mode: Orange laser",
+ "THANKS_FOR_INSTALLING": "Thank you for installing WayVR!",
+ "WATCH": "Watch",
+ "WORKING_SET": "Working Set"
+ },
+ "DOWNLOAD_AGAIN": "Download again",
+ "DOWNLOADING_FILE": "Downloading file...",
"FAILED_TO_LAUNCH_APPLICATION": "Failed to launch a application:",
"GAME_LAUNCHED": "Game launched",
"GAME_LIST": {
@@ -145,12 +297,15 @@
},
"GAMES": "Games",
"GENERAL_SETTINGS": "General settings",
+ "GETTING_STARTED": "Getting started",
"HEIGHT": "Height",
"HELLO": "Hello!",
"HELLO_USER": "Hello, {USER}!",
"HIDE": "Hide",
"HOME_SCREEN": "Home",
+ "MODIFICATION_DATE": "Modification date",
"MONADO_RUNTIME": "Monado runtime",
+ "LOADING": "Loading...",
"POPUP_ADD_DISPLAY": {
"RESOLUTION": "Resolution"
},
@@ -161,8 +316,18 @@
"PROCESS_LIST": "Process list",
"REFRESH": "Refresh",
"REMOVE": "Remove",
+ "APPLY": "Apply",
+ "RELOAD_FROM_DISK": "Reload from disk",
"SETTINGS": "Settings",
"SHOW": "Show",
+ "TARGET_PATH": "Target path",
"TERMINATE_PROCESS": "Terminate process",
- "WIDTH": "Width"
+ "VERSION": "Version",
+ "WIDTH": "Width",
+ "SAVED_TO_FAVOURITES": "Saved to favourites",
+ "ADD_TO_FAVOURITES": "Add to favourites",
+ "ADD_TO_FAVOURITES_HINT": "Save preset and pin it to the app drawer",
+ "REMOVE_FROM_FAVOURITES": "Remove from favourites",
+ "EMPTY": "Empty",
+ "PINNED_APPS": "Pinned applications"
}
diff --git a/dash-frontend/assets/lang/es.json b/dash-frontend/assets/lang/es.json
index b9dac274..883a4602 100644
--- a/dash-frontend/assets/lang/es.json
+++ b/dash-frontend/assets/lang/es.json
@@ -1,166 +1,331 @@
{
- "HOME_SCREEN": "Inicio",
- "MONADO_RUNTIME": "Monado tiempo de ejecución",
- "APPLICATIONS": "Aplicaciones",
- "GAMES": "Juegos",
- "SETTINGS": "Ajustes",
- "HELLO_USER": "¡Hola, {USER}!",
- "GENERAL_SETTINGS": "Ajustes generales",
- "APPLICATION_LAUNCHER": "Lanzador de aplicaciones",
- "APP_SETTINGS": {
- "HIDE_USERNAME": "Ocultar nombre de usuario",
- "OPAQUE_BACKGROUND": "Fondo opaco",
- "LOOK_AND_FEEL": "Apariencia y estilo",
- "HIDE_GRAB_HELP": "Ocultar ayuda para agarrar",
- "ANIMATION_SPEED": "Velocidad de animación de la IU",
- "ROUND_MULTIPLIER": "Redondeo de bordes de la IU",
- "USE_SKYBOX": "Activar skybox",
- "USE_PASSTHROUGH": "Activar passthrough",
- "CLOCK_12H": "Reloj de 12 horas",
- "FEATURES": "Funciones",
- "NOTIFICATIONS_ENABLED": "Habilitar notificaciones",
- "NOTIFICATIONS_SOUND_ENABLED": "Sonidos de notificación",
- "KEYBOARD_SOUND_ENABLED": "Sonidos del teclado",
- "SPACE_DRAG_MULTIPLIER": "Multiplicador de arrastre espacial",
- "SPACE_DRAG_UNLOCKED": "Permitir arrastre del espacio en todos los ejes",
- "SPACE_ROTATE_UNLOCKED": "Permitir rotación espacial en todos los ejes",
- "BLOCK_GAME_INPUT": "Bloquear entrada del juego",
- "BLOCK_GAME_INPUT_IGNORE_WATCH": "Ignorar watch al bloquear la entrada",
- "CONTROLS": "Controles",
- "FOCUS_FOLLOWS_MOUSE_MODE": "El movimiento del ratón en el disparador",
- "LEFT_HANDED_MOUSE": "Ratón para zurdos",
- "ALLOW_SLIDING": "Interacción con el stick durante el agarre",
- "INVERT_SCROLL_DIRECTION_X": "Invertir dirección de desplazamiento horizontal",
- "INVERT_SCROLL_DIRECTION_Y": "Invertir la dirección del desplazamiento vertical",
- "SCROLL_SPEED": "Velocidad de desplazamiento",
- "LONG_PRESS_DURATION": "Duración de la pulsación larga",
- "POINTER_LERP_FACTOR": "Suavizado del puntero",
- "XR_CLICK_SENSITIVITY": "Sensibilidad del clic XR",
- "XR_CLICK_SENSITIVITY_RELEASE": "Sensibilidad de liberación de OpenXR",
- "CLICK_FREEZE_TIME_MS": "Tiempo de congelación al hacer clic (ms)",
- "MISC": "Miscelánea",
- "XWAYLAND_BY_DEFAULT": "Ejecutar aplicaciones en modo de compatibilidad por defecto",
- "UPRIGHT_SCREEN_FIX": "Corrección de pantalla vertical",
- "DOUBLE_CURSOR_FIX": "Solución de doble cursor",
- "SCREEN_RENDER_DOWN": "Renderizar pantalla a menor resolución",
- "UPRIGHT_SCREEN_FIX_HELP": "Corrige pantallas en posición vertical en algunos escritorios",
- "DOUBLE_CURSOR_FIX_HELP": "Habilita esto si ves 2 cursores",
- "XR_CLICK_SENSITIVITY_HELP": "Sensibilidad del gatillo analógico",
- "XR_CLICK_SENSITIVITY_RELEASE_HELP": "Debe ser inferior a 'click'",
- "CLICK_FREEZE_TIME_MS_HELP": "Ayuda con la precisión de los dobles clics",
- "LEFT_HANDED_MOUSE_HELP": "Utilice esto si los botones del ratón están intercambiados",
- "BLOCK_GAME_INPUT_HELP": "Bloquea toda la entrada cuando se pasa el cursor sobre un overlay",
- "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "No bloquear la entrada cuando el cursor está sobre la ventana",
- "USE_SKYBOX_HELP": "Mostrar una skybox si no hay una aplicación de escena o passthrough",
- "USE_PASSTHROUGH_HELP": "Permitir passthrough si el entorno de ejecución XR lo admite",
- "SCREEN_RENDER_DOWN_HELP": "Ayuda a reducir el aliasing en pantallas de alta resolución",
- "SETS_ON_WATCH": "Conjuntos en el reloj",
- "TROUBLESHOOTING": "Solución de problemas",
- "CLEAR_SAVED_STATE": "Borrar estado guardado",
- "CLEAR_PIPEWIRE_TOKENS": "Limpiar tokens de PipeWire",
- "DELETE_ALL_CONFIGS": "Borrar configuración",
- "RESTART_SOFTWARE": "Reiniciar software",
- "CLEAR_SAVED_STATE_HELP": "Restablecer sets y posiciones de superposición",
- "CLEAR_PIPEWIRE_TOKENS_HELP": "Solicitar la selección de pantalla al iniciar la próxima vez",
- "DELETE_ALL_CONFIGS_HELP": "Eliminar todos los archivos de configuración de conf.d",
- "RESTART_SOFTWARE_HELP": "Aplicar la configuración que requiere un reinicio",
- "CAPTURE_METHOD": "Captura de pantalla de Wayland",
- "CAPTURE_METHOD_HELP": "Intente cambiar esta opción si\nexperimenta pantallas negras o con fallos",
- "KEYBOARD_MIDDLE_CLICK": "Clic del botón central del teclado",
- "KEYBOARD_MIDDLE_CLICK_HELP": "Modificador para usar al escribir\ncon láser púrpura",
- "OPTION": {
- "AUTO": "Automático",
- "AUTO_HELP": "Copiar pantalla usando la GPU si es compatible,\nde lo contrario, GPU de PipeWire.",
- "PIPEWIRE_HELP": "Captura de GPU rápida,\nestándar en todos los escritorios.",
- "PW_FALLBACK_HELP": "Método lento con alto uso de CPU.\nPruébalo si PipeWire GPU no funciona",
- "SCREENCOPY_GPU_HELP": "Rápido, sin ventanas emergentes de uso compartido de pantalla.\nFunciona en: Hyprland, Niri, River, Sway",
- "SCREENCOPY_HELP": "Lento, sin ventanas emergentes de uso compartido de pantalla.\nFunciona en: Hyprland, Niri, River, Sway",
- "NONE": "Ninguno",
- "HMD_PINCH": "HMD + pellizco",
- "EYE_PINCH": "Ojo + pellizco",
- "EYE_ONLY": "Solo ojo",
- "HMD_ONLY": "Solo HMD"
- },
- "AUTOSTART_APPS": "Aplicaciones a ejecutar al inicio",
- "HANDSFREE_POINTER": "Modo manos libres",
- "HANDSFREE_POINTER_HELP": "Entrada a utilizar cuando no\nestén disponibles los mandos de movimiento.\nPellizco con la izquierda para agarrar, con la derecha para hacer clic.",
- "UI_GRADIENT_INTENSITY": "Intensidad del degradado de la IU",
- "RESET_PLAYSPACE": "Restablecer espacio de juego",
- "RESET_PLAYSPACE_HELP": "Borrar el desplazamiento del espacio de juego.",
- "BLOCK_POSES_ON_KBD_INTERACTION": "Bloquear poses al interactuar con el teclado",
- "BLOCK_POSES_ON_KBD_INTERACTION_HELP": "Bloquea que el juego reciba poses cuando el teclado está sobre él y 'Bloquear entrada del juego' está habilitado",
- "LANGUAGE": "Idioma",
- "REQUIRES_RESTART": "Requiere reinicio",
- "GRID_OPACITY": "Opacidad de la cuadrícula del suelo",
- "GRID_OPACITY_HELP": "Opacidad de la cuadrícula del suelo cuando el skybox está habilitado"
- },
- "HELLO": "¡Hola!",
- "AUDIO": {
- "VOLUME": "Volumen",
- "SETTINGS": "Configuración de audio",
- "AUTO_SWITCH_TO_VR_AUDIO": "Conmutar automáticamente al audio VR",
- "SPEAKERS": "Altavoces",
- "MICROPHONES": "Micrófonos",
- "CARDS": "Tarjetas",
- "SELECT_AUDIO_CARD_PROFILE": "Seleccionar perfil de tarjeta de audio",
- "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "No se encontraron altavoces VR. Actívelos manualmente.",
- "NO_VR_MICROPHONE_SWITCH_MANUALLY": "No se encontró micrófono VR. Actívelo manualmente.",
- "FAILED_TO_SWITCH_MICROPHONE": "No se pudo cambiar el micrófono",
- "MICROPHONE_SET_SUCCESSFULLY": "Micrófono configurado correctamente",
- "SPEAKERS_SET_SUCCESSFULLY": "Altavoces configurados correctamente"
- },
- "ACTIONS": {
- "RECENTER_PLAYSPACE": "Re-centrar espacio de juego"
- },
- "POPUP_ADD_DISPLAY": {
- "RESOLUTION": "Resolución"
- },
- "WIDTH": "Ancho",
- "HEIGHT": "Altura",
- "HIDE": "Ocultar",
- "REMOVE": "Eliminar",
- "SHOW": "Mostrar",
- "FAILED_TO_LAUNCH_APPLICATION": "No se pudo iniciar la aplicación:",
- "APPLICATION_STARTED": "Aplicación iniciada",
- "CLOSE_WINDOW": "Cerrar ventana",
- "GAME_LIST": {
- "NO_GAMES_FOUND": "No se encontraron juegos",
- "RUNNING_GAMES_LIST": "Lista de juegos en ejecución"
- },
- "TERMINATE_PROCESS": "Finalizar proceso",
- "GAME_LAUNCHED": "Juego lanzado",
- "APP_LAUNCHER": {
- "MODE": {
- "NATIVE": "Modo nativo",
- "CAGE": "Modo de compatibilidad (Cage)"
- },
- "RES_TITLE": "Resolución",
- "ASPECT_TITLE": "Aspecto",
- "ASPECT": {
- "WIDE": "Ancho",
- "SEMI_WIDE": "Semi-ancho",
- "SQUARE": "Cuadrado",
- "SEMI_TALL": "Semi alto",
- "TALL": "Alto"
- },
- "POS_TITLE": "Posicionamiento",
- "POS": {
- "FLOATING": "Flotante",
- "ANCHORED": "Anclado",
- "STATIC": "Estático",
- "FLOATING_HELP": "Se mueve independientemente, se recentra al mostrarse.",
- "ANCHORED_HELP": "Se mantiene en su lugar con respecto al marcador central.",
- "STATIC_HELP": "No pertenece a ningún conjunto. No se recentra."
- },
- "AUTOSTART": "Ejecutar automáticamente al inicio",
- "LAUNCH": "Iniciar"
- },
- "DISPLAY_BRIGHTNESS": "Brillo de la pantalla",
- "PROCESS_LIST": "Lista de procesos",
- "REFRESH": "Actualizar",
- "PROCESS": {
- "STOP": "Detener",
- "FORCE_KILL": "Forzar cierre"
- },
- "DEBUG_INFO": "Información de depuración"
-}
\ No newline at end of file
+ "HOME_SCREEN": "Inicio",
+ "MONADO_RUNTIME": "Monado tiempo de ejecución",
+ "APPLICATIONS": "Aplicaciones",
+ "GAMES": "Juegos",
+ "SETTINGS": "Ajustes",
+ "HELLO_USER": "¡Hola, {USER}!",
+ "GENERAL_SETTINGS": "Ajustes generales",
+ "APPLICATION_LAUNCHER": "Lanzador de aplicaciones",
+ "APP_SETTINGS": {
+ "HIDE_USERNAME": "Ocultar nombre de usuario",
+ "OPAQUE_BACKGROUND": "Fondo opaco",
+ "LOOK_AND_FEEL": "Apariencia y estilo",
+ "HIDE_GRAB_HELP": "Ocultar ayuda para agarrar",
+ "ANIMATION_SPEED": "Velocidad de animación de la IU",
+ "ROUND_MULTIPLIER": "Redondeo de bordes de la IU",
+ "USE_SKYBOX": "Activar skybox",
+ "USE_PASSTHROUGH": "Activar passthrough",
+ "CLOCK_12H": "Reloj de 12 horas",
+ "FEATURES": "Funciones",
+ "NOTIFICATIONS_ENABLED": "Habilitar notificaciones",
+ "NOTIFICATIONS_SOUND_ENABLED": "Sonidos de notificación",
+ "KEYBOARD_SOUND_ENABLED": "Sonidos del teclado",
+ "SPACE_DRAG_MULTIPLIER": "Multiplicador de arrastre espacial",
+ "SPACE_DRAG_UNLOCKED": "Permitir arrastre del espacio en todos los ejes",
+ "SPACE_ROTATE_UNLOCKED": "Permitir rotación espacial en todos los ejes",
+ "BLOCK_GAME_INPUT": "Bloquear entrada del juego",
+ "BLOCK_GAME_INPUT_IGNORE_WATCH": "Ignorar watch al bloquear la entrada",
+ "CONTROLS": "Controles",
+ "FOCUS_FOLLOWS_MOUSE_MODE": "El movimiento del ratón en el disparador",
+ "LEFT_HANDED_MOUSE": "Ratón para zurdos",
+ "ALLOW_SLIDING": "Interacción con el stick durante el agarre",
+ "INVERT_SCROLL_DIRECTION_X": "Invertir dirección de desplazamiento horizontal",
+ "INVERT_SCROLL_DIRECTION_Y": "Invertir la dirección del desplazamiento vertical",
+ "SCROLL_SPEED": "Velocidad de desplazamiento",
+ "LONG_PRESS_DURATION": "Duración de la pulsación larga",
+ "POINTER_LERP_FACTOR": "Suavizado del puntero",
+ "CLICK_FREEZE_TIME_MS": "Tiempo de congelación al hacer clic (ms)",
+ "MISC": "Miscelánea",
+ "XWAYLAND_BY_DEFAULT": "Ejecutar aplicaciones en modo de compatibilidad por defecto",
+ "UPRIGHT_SCREEN_FIX": "Corrección de pantalla vertical",
+ "DOUBLE_CURSOR_FIX": "Solución de doble cursor",
+ "SCREEN_RENDER_DOWN": "Renderizar pantalla a menor resolución",
+ "UPRIGHT_SCREEN_FIX_HELP": "Corrige pantallas en posición vertical en algunos escritorios",
+ "DOUBLE_CURSOR_FIX_HELP": "Habilita esto si ves 2 cursores",
+ "CLICK_FREEZE_TIME_MS_HELP": "Ayuda con la precisión de los dobles clics",
+ "LEFT_HANDED_MOUSE_HELP": "Utilice esto si los botones del ratón están intercambiados",
+ "BLOCK_GAME_INPUT_HELP": "Bloquea toda la entrada cuando se pasa el cursor sobre un overlay",
+ "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "No bloquear la entrada cuando el cursor está sobre la ventana",
+ "USE_SKYBOX_HELP": "Mostrar una skybox si no hay una aplicación de escena o passthrough",
+ "USE_PASSTHROUGH_HELP": "Permitir passthrough si el entorno de ejecución XR lo admite",
+ "SCREEN_RENDER_DOWN_HELP": "Ayuda a reducir el aliasing en pantallas de alta resolución",
+ "SETS_ON_WATCH": "Conjuntos en el reloj",
+ "TROUBLESHOOTING": "Solución de problemas",
+ "CLEAR_SAVED_STATE": "Borrar estado guardado",
+ "CLEAR_PIPEWIRE_TOKENS": "Limpiar tokens de PipeWire",
+ "DELETE_ALL_CONFIGS": "Borrar configuración",
+ "RESTART_SOFTWARE": "Reiniciar software",
+ "CLEAR_SAVED_STATE_HELP": "Restablecer sets y posiciones de superposición",
+ "CLEAR_PIPEWIRE_TOKENS_HELP": "Solicitar la selección de pantalla al iniciar la próxima vez",
+ "DELETE_ALL_CONFIGS_HELP": "Eliminar todos los archivos de configuración de conf.d",
+ "RESTART_SOFTWARE_HELP": "Aplicar la configuración que requiere un reinicio",
+ "CAPTURE_METHOD": "Captura de pantalla de Wayland",
+ "CAPTURE_METHOD_HELP": "Intente cambiar esta opción si\nexperimenta pantallas negras o con fallos",
+ "KEYBOARD_MIDDLE_CLICK": "Clic del botón central del teclado",
+ "KEYBOARD_MIDDLE_CLICK_HELP": "Modificador para usar al escribir\ncon láser púrpura",
+ "OPTION": {
+ "AUTO": "Automático",
+ "AUTO_HELP": "Copiar pantalla usando la GPU si es compatible,\nde lo contrario, GPU de PipeWire.",
+ "PIPEWIRE_HELP": "Captura de GPU rápida,\nestándar en todos los escritorios.",
+ "PW_FALLBACK_HELP": "Método lento con alto uso de CPU.\nPruébalo si PipeWire GPU no funciona",
+ "SCREENCOPY_GPU_HELP": "Rápido, sin ventanas emergentes de uso compartido de pantalla.\nFunciona en: Hyprland, Niri, River, Sway",
+ "SCREENCOPY_HELP": "Lento, sin ventanas emergentes de uso compartido de pantalla.\nFunciona en: Hyprland, Niri, River, Sway",
+ "NONE": "Ninguno",
+ "HMD_PINCH": "HMD + pellizco",
+ "EYE_PINCH": "Ojo + pellizco",
+ "NONE_INPUT_HELP": "No emular ratón y teclado.\nNo podrá interactuar con las pantallas.",
+ "UINPUT": "Emulación de dispositivo",
+ "WL_VIRTUAL": "Entrada virtual de Wayland",
+ "WL_VIRTUAL_HELP": "Enviar eventos al compositor de Wayland usando\nzwlr_virtual_pointer y zwp_virtual_keyboard.\nSolo funciona de forma fiable en algunos escritorios.\nNO funciona en KDE, GNOME o COSMIC.",
+ "EYE_ONLY": "Láser ocular",
+ "HMD_ONLY": "Láser del HMD",
+ "NONE_INPUT_CAPTURE_HELP": "No capturar el ratón ni el teclado.\nNo se podrá usar el ratón físico ni el\nteclado en las aplicaciones lanzadas dentro de WayVR.",
+ "UINPUT_HELP": "Utiliza el módulo uinput para emular un dispositivo.\nSe sabe que funciona bien en la mayoría de los escritorios.",
+ "EVDEV_HELP": "Captura los dispositivos de entrada para uso exclusivo.\nTu usuario debe pertenecer al grupo 'input'."
+ },
+ "AUTOSTART_APPS": "Aplicaciones a ejecutar al inicio",
+ "HANDSFREE_POINTER": "Modo manos libres",
+ "HANDSFREE_POINTER_HELP": "Entrada a utilizar cuando no\nestén disponibles los mandos de movimiento.\nPellizco con la izquierda para agarrar, con la derecha para hacer clic.",
+ "UI_GRADIENT_INTENSITY": "Intensidad del degradado de la IU",
+ "RESET_PLAYSPACE": "Restablecer espacio de juego",
+ "RESET_PLAYSPACE_HELP": "Borrar el desplazamiento del espacio de juego.",
+ "BLOCK_POSES_ON_KBD_INTERACTION": "Bloquear poses al interactuar con el teclado",
+ "BLOCK_POSES_ON_KBD_INTERACTION_HELP": "Bloquea que el juego reciba poses cuando el teclado está sobre él y 'Bloquear entrada del juego' está habilitado",
+ "LANGUAGE": "Idioma",
+ "REQUIRES_RESTART": "Requiere reinicio",
+ "GRID_OPACITY": "Opacidad de la cuadrícula del suelo",
+ "GRID_OPACITY_HELP": "Opacidad de la cuadrícula del suelo cuando el skybox está habilitado",
+ "BROWSE_ONLINE_CATALOG": "Explorar catálogo en línea...",
+ "BROWSE_SKYMAPS": "Explorar skymaps",
+ "COLOR_KEYING": "Clave de color",
+ "NO_SKYMAPS_FOUND": "No se encontraron skymaps",
+ "SELECT_VARIANT": "Seleccionar variante",
+ "SHOW_WELCOME_SCREEN": "Mostrar pantalla de bienvenida",
+ "SKYBOX": "Skybox",
+ "SKYMAP_ALREADY_DOWNLOADED": "Esta skymap ya ha sido descargada. Selecciona la acción deseada.",
+ "WATCH_VIEW_ANGLE": "Ángulos de visión del Watch",
+ "WATCH_VIEW_ANGLE_HELP": "Controla cómo se desvanece el Watch",
+ "BINDINGS": {
+ "COMP": {
+ "CLICK": "Click",
+ "FORCE": "Fuerza",
+ "TOUCH": "Tocar",
+ "VALUE": "Valor",
+ "PROXIMITY": "Proximidad",
+ "X_AXIS": "Eje X",
+ "Y_AXIS": "Eje Y"
+ },
+ "TYPE": {
+ "BUMPER": "Bumper",
+ "DPAD_UP": "D-pad arriba",
+ "DPAD_DOWN": "D-pad hacia abajo",
+ "DPAD_LEFT": "D-pad izquierda",
+ "DPAD_RIGHT": "D-pad derecha",
+ "JOYSTICK": "Joystick",
+ "MENU": "Menú",
+ "SHOULDER": "Hombro",
+ "SQUEEZE": "Agarre",
+ "SYSTEM": "Sistema",
+ "THUMBREST": "Thumbrest",
+ "THUMBSTICK": "Stick analógico",
+ "TRACKPAD": "Trackpad",
+ "TRIGGER": "Gatillo",
+ "VIEW": "Ver"
+ },
+ "CLICK": {
+ "ANY": "Cualquiera",
+ "DOUBLE": "Doble toque",
+ "TRIPLE": "Triple toque",
+ "TYPE": "Número de toques"
+ },
+ "ACTION": {
+ "CLICK": "Clic*",
+ "GRAB": "Agarrar*",
+ "ALT_CLICK": "Ejecución de shell personalizada (establecer alt_click en la configuración)",
+ "SHOW_HIDE": "Mostrar, ocultar, recentrar*",
+ "TOGGLE_DASHBOARD": "Alternar dashboard",
+ "SPACE_DRAG": "Arrastre del playspace",
+ "SPACE_ROTATE": "Rotar playspace",
+ "SPACE_RESET": "Reinicio del Playspace",
+ "CLICK_MODIFIER_RIGHT": "Modificador de clic derecho",
+ "CLICK_MODIFIER_MIDDLE": "Modificador de clic central",
+ "MOVE_MOUSE": "Mover ratón (si está desactivado por defecto)",
+ "SCROLL": "Desplazamiento*"
+ },
+ "LEFT": "Izquierda",
+ "RIGHT": "Derecha",
+ "COMPONENT": "Tipo de actuación",
+ "SUBPATH": "Control de actuación",
+ "THRESHOLD": "Activar cuando supere el valor superior\nDesactivar cuando sea inferior al valor inferior"
+ },
+ "ENABLED": "Activado",
+ "INPUT_EMULATION_METHOD": "Método de emulación de entrada",
+ "INPUT_EMULATION_METHOD_HELP": "Prueba a cambiar esto en caso de que la entrada del\nratón o el teclado no se registre.",
+ "INPUT_PROFILES": "Cambiar la configuración de entrada",
+ "INPUT_PROFILES_HELP": "Vinculaciones de entrada del controlador OpenXR",
+ "NOT_SUPPORTED": "No compatible",
+ "ENABLE_WATCH": "Activar watch",
+ "SPACE_DRAG": "Space drag",
+ "SPACE_GRAVITY_DAMPING": "Amortiguación",
+ "SPACE_GRAVITY_DAMPING_HELP": "Resistencia artificial para ralentizar el movimiento. 0.1 - alta resistencia, 1.0 - sin resistencia",
+ "SPACE_GRAVITY_FLING_STRENGTH": "Fuerza de lanzamiento",
+ "SPACE_GRAVITY_FLING_STRENGTH_HELP": "Multiplicador de intensidad de la fuerza de lanzamiento gravitacional tras el space-drag.\n0.0 - sin movimiento alguno, 2.0 - doble intensidad",
+ "SPACE_GRAVITY_GRAVITY": "Gravedad",
+ "SPACE_GRAVITY_GRAVITY_HELP": "Cantidad de fuerza hacia abajo. 0.0 - sin gravedad",
+ "SPACE_GRAVITY_GROUND_FRICTION": "Fricción del suelo",
+ "SPACE_GRAVITY_GROUND_FRICTION_HELP": "Cantidad de fricción que te ralentiza si estás tocando el suelo.\n0.0 - sin fricción (como si fuera hielo), 1.0 - superficie rugosa",
+ "SPACE_GRAVITY_FLOOR_HEIGHT": "Altura del suelo",
+ "SPACE_GRAVITY_FLOOR_HEIGHT_HELP": "La posición Y donde se encuentra el suelo. La gravedad se detiene cuando alcanzas esta altura.",
+ "SAVE": "Guardar",
+ "CANCEL": "Cancelar",
+ "WHISPER": {
+ "NEED_TO_DOWNLOAD_MODEL": "El modelo seleccionado debe ser descargado.\n¿Deseas descargarlo ahora?",
+ "REMOVE_UNUSED_MODELS": "Estás desactivando la función de voz a texto.\n¿Te gustaría eliminar los modelos de Whisper descargados para liberar espacio?"
+ },
+ "WHISPER_MODEL": "Modelo de voz a texto",
+ "WHISPER_MODEL_HELP": "Modelo de Whisper a utilizar.\nLos modelos más grandes producen\nresultados más precisos, pero consumen más VRAM.",
+ "DEFAULT_OVERLAY_SCALE": "Tamaño de la superposición predeterminado",
+ "DEFAULT_OVERLAY_SCALE_HELP": "Genera nuevas capas de superposición con esta escala.",
+ "COLOR_PALETTE": "Paleta de colores",
+ "COLOR_PALETTES": "Paletas de colores",
+ "COLOR_PALETTE_CURRENT": "Tema actualmente activo.",
+ "COLOR_PALETTE_ACTIVATE": "Haz clic para usar este tema.",
+ "COLOR_PALETTE_HELP": "Haz clic para explorar paletas de colores.\nPara crear paletas personalizadas, ¡visita el sitio web!",
+ "COLOR_PALETTE_CUSTOM_URL": "¡Añade tu propio tema personalizado!",
+ "COLOR_PALETTE_CUSTOM_URL2": "Haz clic para abrir el manual web.",
+ "SNAP_ANGLE_DEG": "Ángulo de ajuste de cabeceo y alabeo de la ventana",
+ "SNAP_ANGLE_DEG_HELP": "Las ventanas agarradas se ajustan a este ángulo en los ejes de cabeceo y balanceo.",
+ "SAVE_PLAYSPACE_CENTER": "Guardar centro del playspace",
+ "SAVE_PLAYSPACE_CENTER_HELP": "Usa el playspace actual para el comando de restablecer playspace.",
+ "RESET_PLAYSPACE_CENTER": "Reiniciar centro del playspace",
+ "RESET_PLAYSPACE_CENTER_HELP": "Borra el centro del playspace establecido previamente.",
+ "HANDSFREE_ALT_TAB": "Puntero del selector de aplicaciones",
+ "HANDSFREE_ALT_TAB_HELP": "Mantén presionadas Super+X, apunta a la ventana deseada y luego suelta para cambiar el foco.",
+ "INPUT_CAPTURE_METHOD": "Método de captura de entrada",
+ "POINTER_ACCELERATION": "Aceleración del ratón",
+ "POINTER_ACCELERATION_HELP": "Activado: Aceleración adaptativa del ratón\nDesactivado: Velocidad constante",
+ "POINTER_SPEED": "Velocidad del ratón",
+ "INPUT_CAPTURE_METHOD_HELP": "Permite usar periféricos físicos dentro de WayVR.\n Super+Z: Cambiar la entrada entre WayVR y el escritorio real\n Super+X: Cambiar entre aplicaciones de WayVR",
+ "SPACE_DRAG_AFFECTS_WORLD": "Space-drag mueve las superposiciones"
+ },
+ "HELLO": "¡Hola!",
+ "AUDIO": {
+ "VOLUME": "Volumen",
+ "SETTINGS": "Configuración de audio",
+ "AUTO_SWITCH_TO_VR_AUDIO": "Conmutar automáticamente al audio VR",
+ "SPEAKERS": "Altavoces",
+ "MICROPHONES": "Micrófonos",
+ "CARDS": "Tarjetas",
+ "SELECT_AUDIO_CARD_PROFILE": "Seleccionar perfil de tarjeta de audio",
+ "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "No se encontraron altavoces VR. Actívelos manualmente.",
+ "NO_VR_MICROPHONE_SWITCH_MANUALLY": "No se encontró micrófono VR. Actívelo manualmente.",
+ "FAILED_TO_SWITCH_MICROPHONE": "No se pudo cambiar el micrófono",
+ "MICROPHONE_SET_SUCCESSFULLY": "Micrófono configurado correctamente",
+ "SPEAKERS_SET_SUCCESSFULLY": "Altavoces configurados correctamente"
+ },
+ "ACTIONS": {
+ "RECENTER_PLAYSPACE": "Re-centrar espacio de juego"
+ },
+ "POPUP_ADD_DISPLAY": {
+ "RESOLUTION": "Resolución"
+ },
+ "WIDTH": "Ancho",
+ "HEIGHT": "Altura",
+ "HIDE": "Ocultar",
+ "REMOVE": "Eliminar",
+ "SHOW": "Mostrar",
+ "FAILED_TO_LAUNCH_APPLICATION": "No se pudo iniciar la aplicación:",
+ "APPLICATION_STARTED": "Aplicación iniciada",
+ "CLOSE_WINDOW": "Cerrar ventana",
+ "GAME_LIST": {
+ "NO_GAMES_FOUND": "No se encontraron juegos",
+ "RUNNING_GAMES_LIST": "Lista de juegos en ejecución"
+ },
+ "TERMINATE_PROCESS": "Finalizar proceso",
+ "GAME_LAUNCHED": "Juego lanzado",
+ "APP_LAUNCHER": {
+ "MODE": {
+ "NATIVE": "Modo nativo",
+ "CAGE": "Modo de compatibilidad (Cage)"
+ },
+ "RES_TITLE": "Resolución",
+ "ASPECT_TITLE": "Aspecto",
+ "ASPECT": {
+ "WIDE": "Ancho",
+ "SEMI_WIDE": "Semi-ancho",
+ "SQUARE": "Cuadrado",
+ "SEMI_TALL": "Semi alto",
+ "TALL": "Alto"
+ },
+ "POS_TITLE": "Posicionamiento",
+ "POS": {
+ "FLOATING": "Flotante",
+ "ANCHORED": "Anclado",
+ "STATIC": "Estático",
+ "FLOATING_HELP": "Se mueve independientemente, se recentra al mostrarse.",
+ "ANCHORED_HELP": "Se mantiene en su lugar con respecto al marcador central.",
+ "STATIC_HELP": "No pertenece a ningún conjunto. No se recentra."
+ },
+ "AUTOSTART": "Ejecutar automáticamente al inicio",
+ "LAUNCH": "Iniciar"
+ },
+ "DISPLAY_BRIGHTNESS": "Brillo de la pantalla",
+ "PROCESS_LIST": "Lista de procesos",
+ "REFRESH": "Actualizar",
+ "PROCESS": {
+ "STOP": "Detener",
+ "FORCE_KILL": "Forzar cierre"
+ },
+ "DEBUG_INFO": "Información de depuración",
+ "CREATION_DATE": "Fecha de creación",
+ "DOWNLOADER": "Descargador",
+ "DOWNLOAD_AGAIN": "Descargar de nuevo",
+ "DOWNLOADING_FILE": "Descargando archivo...",
+ "GETTING_STARTED": "Primeros pasos",
+ "MODIFICATION_DATE": "Fecha de modificación",
+ "LOADING": "Cargando...",
+ "APPLY": "Aplicar",
+ "RELOAD_FROM_DISK": "Recargar desde el disco",
+ "TARGET_PATH": "Ruta de destino",
+ "VERSION": "Versión",
+ "DONATE": {
+ "SUPPORT_US": "Apóyanos",
+ "DESCRIPTION": "Somos un pequeño equipo de 2 desarrolladores que creamos WayVR en nuestro tiempo libre. Si disfrutas usando este software, por favor considera apoyarnos; cada donación nos ayuda a seguir adelante.",
+ "BUTTON_TOOLTIP": "Donar vía Open Collective",
+ "CURRENT_SUPPORTERS": "Colaboradores actuales",
+ "THANK_YOU_WAYVR": "¡Gracias de parte del equipo de WayVR!"
+ },
+ "WELCOME": {
+ "ALL_SET": "¡Todo listo!",
+ "BASICS": "Estos conceptos básicos te permitirán empezar a usar WayVR con facilidad.",
+ "FEATURES_DOCUMENTATION": "Hay muchas otras funciones que merece la pena personalizar. Para más información, consulta la documentación en",
+ "FINISH_TUTORIAL": "Finalizar tutorial",
+ "GRAB_BOTH_HANDS": "Agarra el elemento con ambas manos si quieres mover un overlay específico en tu set.",
+ "GRAB_ONE_HAND": "Agárralo con una mano para mover tu set.",
+ "GREETING": "¡Hola!",
+ "GUIDE_INTRO": "Permítenos guiarte en tus primeros pasos.",
+ "LASER_COLORS": "Colores del láser",
+ "LASER_FUNCTIONALITY": "Gran parte de la funcionalidad de WayVR depende del color de láser que se utilice para interactuar con un elemento de la interfaz. ¡No hace falta pulsar estos botones, solo tocarlos!",
+ "LAST_PAGE_INFO": "Este tutorial dejará de aparecer una vez que llegues a la última página.",
+ "LOOK_AT_LEFT_WRIST": "Mira tu muñeca izquierda. Ese es tu watch.",
+ "MIDDLE_CLICK_MODE_PURPLE_LASER": "— Modo de clic central: Láser morado",
+ "MOVING_YOUR_SET": "Moviendo tu set",
+ "NEXT_BUTTON": "Pulsa el botón \"Siguiente\" de abajo para comenzar.",
+ "REGULAR_MODE_BLUE_LASER": "— Modo Regular: Láser azul",
+ "REPOSITION_THIS_WINDOW_BY_GRABBING": "Reposiciona esta ventana usando la acción de agarre de tu controlador.",
+ "RIGHT_CLICK_MODE_ORANGE_LASER": "— Modo de clic derecho: Láser naranja",
+ "THANKS_FOR_INSTALLING": "¡Gracias por instalar WayVR!",
+ "WATCH": "Watch",
+ "WORKING_SET": "Set de trabajo",
+ "DOUBLE_PRESS_TO_TOGGLE": "Presiona dos veces B (en Index) o Y (en Meta) para mostrar, recentrar u ocultar tu set. Pruébalo ahora.",
+ "CENTER_MARKER": "El marcador de centrado es lo que aparecerá frente a ti al recentrar. ¡Coloca las capas alrededor de él!"
+ },
+ "DOWNLOAD": "Descargar",
+ "SAVED_TO_FAVOURITES": "Guardado en favoritos",
+ "ADD_TO_FAVOURITES": "Añadir a favoritos",
+ "ADD_TO_FAVOURITES_HINT": "Guarda el ajuste preestablecido y ánclalo al cajón de aplicaciones",
+ "REMOVE_FROM_FAVOURITES": "Eliminar de favoritos",
+ "EMPTY": "Vacío",
+ "PINNED_APPS": "Aplicaciones ancladas"
+}
diff --git a/dash-frontend/assets/lang/it.json b/dash-frontend/assets/lang/it.json
index fd02f8b0..1eb9b658 100644
--- a/dash-frontend/assets/lang/it.json
+++ b/dash-frontend/assets/lang/it.json
@@ -1,166 +1,331 @@
{
- "ACTIONS": {
- "RECENTER_PLAYSPACE": "Recentra lo spazio di gioco"
- },
- "APP_LAUNCHER": {
- "ASPECT": {
- "SEMI_TALL": "Semi-alto",
- "SEMI_WIDE": "Semi-ampio",
- "SQUARE": "Quadrato",
- "TALL": "Alto",
- "WIDE": "Ampio"
- },
- "ASPECT_TITLE": "Proporzioni",
- "AUTOSTART": "Avvia automaticamente all'avvio",
- "LAUNCH": "Avvia",
- "MODE": {
- "CAGE": "Modalità compatibilità (Cage)",
- "NATIVE": "Modalità nativa"
- },
- "POS": {
- "ANCHORED": "Ancorato",
- "ANCHORED_HELP": "Rimane fermo rispetto al marcatore centrale.",
- "FLOATING": "Fluttuante",
- "FLOATING_HELP": "Si muove in modo indipendente, si recentra quando viene mostrato.",
- "STATIC": "Statico",
- "STATIC_HELP": "Non fa parte di alcun set. Non recentra."
- },
- "POS_TITLE": "Posizionamento",
- "RES_TITLE": "Risoluzione"
- },
- "APP_SETTINGS": {
- "ALLOW_SLIDING": "Interazione tramite stick durante l'afferrare",
- "ANIMATION_SPEED": "Velocità dell'animazione dell'interfaccia utente",
- "BLOCK_GAME_INPUT": "Blocca l'input di gioco",
- "BLOCK_GAME_INPUT_HELP": "Blocca tutti gli input quando il cursore è sopra un overlay",
- "BLOCK_GAME_INPUT_IGNORE_WATCH": "Ignora il Watch quando si blocca l'input",
- "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "Non bloccare l'input quando il watch è evidenziato",
- "CAPTURE_METHOD": "Acquisizione dello schermo Wayland",
- "CAPTURE_METHOD_HELP": "Prova a modificare questa impostazione se riscontri schermate nere o con artefatti.",
- "CLEAR_PIPEWIRE_TOKENS": "Cancella i token PipeWire",
- "CLEAR_PIPEWIRE_TOKENS_HELP": "Richiedi la selezione dello schermo all'avvio successivo",
- "CLEAR_SAVED_STATE": "Cancella stato salvato",
- "CLEAR_SAVED_STATE_HELP": "Ripristina set e posizioni degli overlay",
- "CLICK_FREEZE_TIME_MS": "Tempo di congelamento del click (ms)",
- "CLICK_FREEZE_TIME_MS_HELP": "Aiuta con la precisione dei doppi clic",
- "CLOCK_12H": "Orologio a 12 ore",
- "CONTROLS": "Controlli",
- "DELETE_ALL_CONFIGS": "Elimina configurazione",
- "DELETE_ALL_CONFIGS_HELP": "Rimuovi tutti i file di configurazione da conf.d",
- "DOUBLE_CURSOR_FIX": "Correzione doppio cursore",
- "DOUBLE_CURSOR_FIX_HELP": "Abilita questa opzione se vedi 2 cursori",
- "FEATURES": "Funzionalità",
- "FOCUS_FOLLOWS_MOUSE_MODE": "Movimento del mouse al tocco del grilletto",
- "HIDE_GRAB_HELP": "Nascondi l'aiuto per l'afferrare",
- "HIDE_USERNAME": "Nascondi nome utente",
- "INVERT_SCROLL_DIRECTION_X": "Inverti direzione dello scorrimento orizzontale",
- "INVERT_SCROLL_DIRECTION_Y": "Inverti direzione dello scorrimento verticale",
- "KEYBOARD_MIDDLE_CLICK": "Click centrale del tasto",
- "KEYBOARD_MIDDLE_CLICK_HELP": "Modificatore da usare durante la digitazione\ncon laser viola",
- "KEYBOARD_SOUND_ENABLED": "Suoni della tastiera",
- "LEFT_HANDED_MOUSE": "Mouse per mancini",
- "LEFT_HANDED_MOUSE_HELP": "Usalo se i pulsanti del mouse sono invertiti",
- "LONG_PRESS_DURATION": "Durata pressione prolungata",
- "LOOK_AND_FEEL": "Aspetto",
- "MISC": "Varie",
- "NOTIFICATIONS_ENABLED": "Abilita notifiche",
- "NOTIFICATIONS_SOUND_ENABLED": "Suoni di notifica",
- "OPAQUE_BACKGROUND": "Sfondo opaco",
- "OPTION": {
- "AUTO": "Automatico",
- "AUTO_HELP": "Copia dello schermo tramite GPU se supportata,\naltrimenti tramite GPU PipeWire.",
- "PIPEWIRE_HELP": "Acquisizione GPU veloce,\nstandard su tutti i desktop.",
- "PW_FALLBACK_HELP": "Metodo lento con elevato utilizzo della CPU.\nProva in caso PipeWire GPU non funzioni",
- "SCREENCOPY_GPU_HELP": "Veloce, senza popup di condivisione schermo.\nFunziona su: Hyprland, Niri, River, Sway",
- "SCREENCOPY_HELP": "Lento, nessuna finestra pop-up per la condivisione dello schermo.\nFunziona su: Hyprland, Niri, River, Sway",
- "NONE": "Nessuno",
- "HMD_PINCH": "HMD + pizzico",
- "EYE_PINCH": "Occhio + pizzico",
- "EYE_ONLY": "Solo occhio",
- "HMD_ONLY": "Solo HMD"
- },
- "POINTER_LERP_FACTOR": "Smussamento puntatore",
- "RESTART_SOFTWARE": "Riavvia il software",
- "RESTART_SOFTWARE_HELP": "Applica impostazioni che richiedono un riavvio",
- "ROUND_MULTIPLIER": "Arrotondamento bordi UI",
- "SCREEN_RENDER_DOWN": "Rendering dello schermo a risoluzione inferiore",
- "SCREEN_RENDER_DOWN_HELP": "Aiuta a ridurre l'aliasing su schermi ad alta risoluzione",
- "SCROLL_SPEED": "Velocità di scorrimento",
- "SETS_ON_WATCH": "Set sul Watch",
- "SPACE_DRAG_MULTIPLIER": "Moltiplicatore space-drag",
- "SPACE_DRAG_UNLOCKED": "Consenti lo space-drag su tutti gli assi",
- "SPACE_ROTATE_UNLOCKED": "Consenti la rotazione dello spazio su tutti gli assi",
- "TROUBLESHOOTING": "Risoluzione dei problemi",
- "UPRIGHT_SCREEN_FIX": "Correzione schermo verticale",
- "UPRIGHT_SCREEN_FIX_HELP": "Corregge schermi verticali su alcuni desktop",
- "USE_PASSTHROUGH": "Abilita passthrough",
- "USE_PASSTHROUGH_HELP": "Consenti il passthrough se supportato dal runtime XR",
- "USE_SKYBOX": "Abilita skybox",
- "USE_SKYBOX_HELP": "Mostra uno skybox se non c'è un'app di scena o passthrough",
- "XR_CLICK_SENSITIVITY": "Sensibilità del click XR",
- "XR_CLICK_SENSITIVITY_HELP": "Sensibilità del trigger analogico",
- "XR_CLICK_SENSITIVITY_RELEASE": "Sensibilità di rilascio XR",
- "XR_CLICK_SENSITIVITY_RELEASE_HELP": "Deve essere inferiore al clic",
- "XWAYLAND_BY_DEFAULT": "Esegui le app in modalità Compatibilità per impostazione predefinita",
- "AUTOSTART_APPS": "App da avviare all'avvio",
- "HANDSFREE_POINTER": "Modalità a mani libere",
- "HANDSFREE_POINTER_HELP": "Input da usare quando i\ncontroller di movimento non sono disponibili.\nPizzico sinistro per afferrare, destro per cliccare.",
- "UI_GRADIENT_INTENSITY": "Intensità gradiente dell'interfaccia utente",
- "RESET_PLAYSPACE": "Ripristina playspace",
- "RESET_PLAYSPACE_HELP": "Cancella l'offset dello spazio di gioco.",
- "BLOCK_POSES_ON_KBD_INTERACTION": "Blocca le pose durante l'interazione con la tastiera",
- "BLOCK_POSES_ON_KBD_INTERACTION_HELP": "Impedisce al gioco di ricevere pose quando la tastiera è evidenziata e 'Blocca input di gioco' è abilitato",
- "LANGUAGE": "Lingua",
- "REQUIRES_RESTART": "Richiede riavvio",
- "GRID_OPACITY": "Opacità della griglia del pavimento",
- "GRID_OPACITY_HELP": "Opacità della griglia del pavimento quando lo skybox è abilitato"
- },
- "APPLICATION_LAUNCHER": "Lanciatore applicazioni",
- "APPLICATION_STARTED": "Applicazione avviata",
- "APPLICATIONS": "Applicazioni",
- "AUDIO": {
- "AUTO_SWITCH_TO_VR_AUDIO": "Passa automaticamente all'audio VR",
- "CARDS": "Schede",
- "FAILED_TO_SWITCH_MICROPHONE": "Impossibile cambiare microfono",
- "MICROPHONE_SET_SUCCESSFULLY": "Microfono impostato con successo",
- "MICROPHONES": "Microfoni",
- "NO_VR_MICROPHONE_SWITCH_MANUALLY": "Nessun microfono VR trovato. Attivalo manualmente.",
- "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "Nessun altoparlante VR trovato. Selezionali manualmente.",
- "SELECT_AUDIO_CARD_PROFILE": "Seleziona profilo scheda audio",
- "SETTINGS": "Impostazioni audio",
- "SPEAKERS": "Altoparlanti",
- "SPEAKERS_SET_SUCCESSFULLY": "Altoparlanti impostati correttamente",
- "VOLUME": "Volume"
- },
- "CLOSE_WINDOW": "Chiudi finestra",
- "DISPLAY_BRIGHTNESS": "Luminosità display",
- "FAILED_TO_LAUNCH_APPLICATION": "Impossibile avviare l'applicazione:",
- "GAME_LAUNCHED": "Gioco lanciato",
- "GAME_LIST": {
- "NO_GAMES_FOUND": "Nessun gioco trovato",
- "RUNNING_GAMES_LIST": "Lista dei giochi in esecuzione"
- },
- "GAMES": "Giochi",
- "GENERAL_SETTINGS": "Impostazioni generali",
- "HEIGHT": "Altezza",
- "HELLO": "Ciao!",
- "HELLO_USER": "Ciao, {USER}!",
- "HIDE": "Nascondi",
- "HOME_SCREEN": "Home",
- "MONADO_RUNTIME": "Runtime Monado",
- "POPUP_ADD_DISPLAY": {
- "RESOLUTION": "Risoluzione"
- },
- "REMOVE": "Rimuovi",
- "SETTINGS": "Impostazioni",
- "SHOW": "Mostra",
- "TERMINATE_PROCESS": "Termina processo",
- "WIDTH": "Larghezza",
- "PROCESS_LIST": "Elenco processi",
- "REFRESH": "Aggiorna",
- "PROCESS": {
- "STOP": "Interrompi",
- "FORCE_KILL": "Uccidi forzatamente"
- },
- "DEBUG_INFO": "Informazioni di debug"
-}
\ No newline at end of file
+ "ACTIONS": {
+ "RECENTER_PLAYSPACE": "Recentra lo spazio di gioco"
+ },
+ "APP_LAUNCHER": {
+ "ASPECT": {
+ "SEMI_TALL": "Semi-alto",
+ "SEMI_WIDE": "Semi-ampio",
+ "SQUARE": "Quadrato",
+ "TALL": "Alto",
+ "WIDE": "Ampio"
+ },
+ "ASPECT_TITLE": "Proporzioni",
+ "AUTOSTART": "Avvia automaticamente all'avvio",
+ "LAUNCH": "Avvia",
+ "MODE": {
+ "CAGE": "Modalità compatibilità (Cage)",
+ "NATIVE": "Modalità nativa"
+ },
+ "POS": {
+ "ANCHORED": "Ancorato",
+ "ANCHORED_HELP": "Rimane fermo rispetto al marcatore centrale.",
+ "FLOATING": "Fluttuante",
+ "FLOATING_HELP": "Si muove in modo indipendente, si recentra quando viene mostrato.",
+ "STATIC": "Statico",
+ "STATIC_HELP": "Non fa parte di alcun set. Non recentra."
+ },
+ "POS_TITLE": "Posizionamento",
+ "RES_TITLE": "Risoluzione"
+ },
+ "APP_SETTINGS": {
+ "ALLOW_SLIDING": "Interazione tramite stick durante l'afferrare",
+ "ANIMATION_SPEED": "Velocità dell'animazione dell'interfaccia utente",
+ "BLOCK_GAME_INPUT": "Blocca l'input di gioco",
+ "BLOCK_GAME_INPUT_HELP": "Blocca tutti gli input quando il cursore è sopra un overlay",
+ "BLOCK_GAME_INPUT_IGNORE_WATCH": "Ignora il Watch quando si blocca l'input",
+ "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "Non bloccare l'input quando il watch è evidenziato",
+ "CAPTURE_METHOD": "Acquisizione dello schermo Wayland",
+ "CAPTURE_METHOD_HELP": "Prova a modificare questa impostazione se riscontri schermate nere o con artefatti.",
+ "CLEAR_PIPEWIRE_TOKENS": "Cancella i token PipeWire",
+ "CLEAR_PIPEWIRE_TOKENS_HELP": "Richiedi la selezione dello schermo all'avvio successivo",
+ "CLEAR_SAVED_STATE": "Cancella stato salvato",
+ "CLEAR_SAVED_STATE_HELP": "Ripristina set e posizioni degli overlay",
+ "CLICK_FREEZE_TIME_MS": "Tempo di congelamento del click (ms)",
+ "CLICK_FREEZE_TIME_MS_HELP": "Aiuta con la precisione dei doppi clic",
+ "CLOCK_12H": "Orologio a 12 ore",
+ "CONTROLS": "Controlli",
+ "DELETE_ALL_CONFIGS": "Elimina configurazione",
+ "DELETE_ALL_CONFIGS_HELP": "Rimuovi tutti i file di configurazione da conf.d",
+ "DOUBLE_CURSOR_FIX": "Correzione doppio cursore",
+ "DOUBLE_CURSOR_FIX_HELP": "Abilita questa opzione se vedi 2 cursori",
+ "FEATURES": "Funzionalità",
+ "FOCUS_FOLLOWS_MOUSE_MODE": "Movimento del mouse al tocco del grilletto",
+ "HIDE_GRAB_HELP": "Nascondi l'aiuto per l'afferrare",
+ "HIDE_USERNAME": "Nascondi nome utente",
+ "INVERT_SCROLL_DIRECTION_X": "Inverti direzione dello scorrimento orizzontale",
+ "INVERT_SCROLL_DIRECTION_Y": "Inverti direzione dello scorrimento verticale",
+ "KEYBOARD_MIDDLE_CLICK": "Click centrale del tasto",
+ "KEYBOARD_MIDDLE_CLICK_HELP": "Modificatore da usare durante la digitazione\ncon laser viola",
+ "KEYBOARD_SOUND_ENABLED": "Suoni della tastiera",
+ "LEFT_HANDED_MOUSE": "Mouse per mancini",
+ "LEFT_HANDED_MOUSE_HELP": "Usalo se i pulsanti del mouse sono invertiti",
+ "LONG_PRESS_DURATION": "Durata pressione prolungata",
+ "LOOK_AND_FEEL": "Aspetto",
+ "MISC": "Varie",
+ "NOTIFICATIONS_ENABLED": "Abilita notifiche",
+ "NOTIFICATIONS_SOUND_ENABLED": "Suoni di notifica",
+ "OPAQUE_BACKGROUND": "Sfondo opaco",
+ "OPTION": {
+ "AUTO": "Automatico",
+ "AUTO_HELP": "Copia dello schermo tramite GPU se supportata,\naltrimenti tramite GPU PipeWire.",
+ "PIPEWIRE_HELP": "Acquisizione GPU veloce,\nstandard su tutti i desktop.",
+ "PW_FALLBACK_HELP": "Metodo lento con elevato utilizzo della CPU.\nProva in caso PipeWire GPU non funzioni",
+ "SCREENCOPY_GPU_HELP": "Veloce, senza popup di condivisione schermo.\nFunziona su: Hyprland, Niri, River, Sway",
+ "SCREENCOPY_HELP": "Lento, nessuna finestra pop-up per la condivisione dello schermo.\nFunziona su: Hyprland, Niri, River, Sway",
+ "NONE": "Nessuno",
+ "HMD_PINCH": "HMD + pizzico",
+ "EYE_PINCH": "Occhio + pizzico",
+ "NONE_INPUT_HELP": "Non emulare mouse e tastiera.\nNon sarà possibile interagire con gli schermi.",
+ "UINPUT": "Emulazione dispositivo",
+ "WL_VIRTUAL": "Input virtuale Wayland",
+ "WL_VIRTUAL_HELP": "Invia eventi al compositor Wayland utilizzando\nzwlr_virtual_pointer e zwp_virtual_keyboard.\nFunziona in modo affidabile solo su alcuni desktop.\nNON funziona su KDE, GNOME o COSMIC.",
+ "EYE_ONLY": "Laser oculare",
+ "HMD_ONLY": "Laser HMD",
+ "NONE_INPUT_CAPTURE_HELP": "Non acquisire mouse e tastiera.\nNon sarà possibile utilizzare il mouse fisico o\nla tastiera nelle app lanciate all'interno di WayVR.",
+ "UINPUT_HELP": "Utilizza il modulo uinput per emulare un dispositivo.\nNoto per funzionare bene sulla maggior parte dei desktop.",
+ "EVDEV_HELP": "Acquisisci i dispositivi di input per l'uso esclusivo.\nL'utente deve appartenere al gruppo 'input'."
+ },
+ "POINTER_LERP_FACTOR": "Smussamento puntatore",
+ "RESTART_SOFTWARE": "Riavvia il software",
+ "RESTART_SOFTWARE_HELP": "Applica impostazioni che richiedono un riavvio",
+ "ROUND_MULTIPLIER": "Arrotondamento bordi UI",
+ "SCREEN_RENDER_DOWN": "Rendering dello schermo a risoluzione inferiore",
+ "SCREEN_RENDER_DOWN_HELP": "Aiuta a ridurre l'aliasing su schermi ad alta risoluzione",
+ "SCROLL_SPEED": "Velocità di scorrimento",
+ "SETS_ON_WATCH": "Set sul Watch",
+ "SPACE_DRAG_MULTIPLIER": "Moltiplicatore space-drag",
+ "SPACE_DRAG_UNLOCKED": "Consenti lo space-drag su tutti gli assi",
+ "SPACE_ROTATE_UNLOCKED": "Consenti la rotazione dello spazio su tutti gli assi",
+ "TROUBLESHOOTING": "Risoluzione dei problemi",
+ "UPRIGHT_SCREEN_FIX": "Correzione schermo verticale",
+ "UPRIGHT_SCREEN_FIX_HELP": "Corregge schermi verticali su alcuni desktop",
+ "USE_PASSTHROUGH": "Abilita passthrough",
+ "USE_PASSTHROUGH_HELP": "Consenti il passthrough se supportato dal runtime XR",
+ "USE_SKYBOX": "Abilita skybox",
+ "USE_SKYBOX_HELP": "Mostra uno skybox se non c'è un'app di scena o passthrough",
+ "XWAYLAND_BY_DEFAULT": "Esegui le app in modalità Compatibilità per impostazione predefinita",
+ "AUTOSTART_APPS": "App da avviare all'avvio",
+ "HANDSFREE_POINTER": "Modalità a mani libere",
+ "HANDSFREE_POINTER_HELP": "Input da usare quando i\ncontroller di movimento non sono disponibili.\nPizzico sinistro per afferrare, destro per cliccare.",
+ "UI_GRADIENT_INTENSITY": "Intensità gradiente dell'interfaccia utente",
+ "RESET_PLAYSPACE": "Ripristina playspace",
+ "RESET_PLAYSPACE_HELP": "Cancella l'offset dello spazio di gioco.",
+ "BLOCK_POSES_ON_KBD_INTERACTION": "Blocca le pose durante l'interazione con la tastiera",
+ "BLOCK_POSES_ON_KBD_INTERACTION_HELP": "Impedisce al gioco di ricevere pose quando la tastiera è evidenziata e 'Blocca input di gioco' è abilitato",
+ "LANGUAGE": "Lingua",
+ "REQUIRES_RESTART": "Richiede riavvio",
+ "GRID_OPACITY": "Opacità della griglia del pavimento",
+ "GRID_OPACITY_HELP": "Opacità della griglia del pavimento quando lo skybox è abilitato",
+ "BROWSE_ONLINE_CATALOG": "Sfoglia catalogo online...",
+ "BROWSE_SKYMAPS": "Sfoglia skymap",
+ "COLOR_KEYING": "Keying del colore",
+ "NO_SKYMAPS_FOUND": "Nessuna skymap trovata",
+ "SELECT_VARIANT": "Seleziona variante",
+ "SHOW_WELCOME_SCREEN": "Mostra schermata di benvenuto",
+ "SKYBOX": "Skybox",
+ "SKYMAP_ALREADY_DOWNLOADED": "Questa skymap è già stata scaricata. Seleziona l'azione desiderata.",
+ "WATCH_VIEW_ANGLE": "Angoli di visualizzazione Watch",
+ "WATCH_VIEW_ANGLE_HELP": "Controlla come l'orologio sfuma",
+ "BINDINGS": {
+ "COMP": {
+ "CLICK": "Clic",
+ "FORCE": "Forza",
+ "TOUCH": "Tocco",
+ "VALUE": "Valore",
+ "PROXIMITY": "Prossimità",
+ "X_AXIS": "Asse X",
+ "Y_AXIS": "Asse Y"
+ },
+ "TYPE": {
+ "BUMPER": "Bumper",
+ "DPAD_UP": "D-pad su",
+ "DPAD_DOWN": "D-pad Giù",
+ "DPAD_LEFT": "D-pad Sinistra",
+ "DPAD_RIGHT": "D-pad Destra",
+ "JOYSTICK": "Joystick",
+ "MENU": "Menu",
+ "SHOULDER": "Spalla",
+ "SQUEEZE": "Grip",
+ "SYSTEM": "Sistema",
+ "THUMBREST": "Appoggio del pollice",
+ "THUMBSTICK": "Thumbstick",
+ "TRACKPAD": "Trackpad",
+ "TRIGGER": "Grilletto",
+ "VIEW": "Visualizza"
+ },
+ "CLICK": {
+ "ANY": "Qualsiasi",
+ "DOUBLE": "Doppio tocco",
+ "TRIPLE": "Triplo tocco",
+ "TYPE": "Numero di tocchi"
+ },
+ "ACTION": {
+ "CLICK": "Click*",
+ "GRAB": "Afferra*",
+ "ALT_CLICK": "Esecuzione shell personalizzata (imposta alt_click nella configurazione)",
+ "SHOW_HIDE": "Mostra, nascondi, recentra*",
+ "TOGGLE_DASHBOARD": "Attiva/disattiva dashboard",
+ "SPACE_DRAG": "Trascinamento playspace",
+ "SPACE_ROTATE": "Rotazione playspace",
+ "SPACE_RESET": "Reset playspace",
+ "CLICK_MODIFIER_RIGHT": "Modificatore click destro",
+ "CLICK_MODIFIER_MIDDLE": "Modificatore click centrale",
+ "MOVE_MOUSE": "Muovi mouse (se disattivato di default)",
+ "SCROLL": "Scorrimento*"
+ },
+ "LEFT": "Sinistra",
+ "RIGHT": "Destra",
+ "COMPONENT": "Tipo di attivazione",
+ "SUBPATH": "Controllo di attivazione",
+ "THRESHOLD": "Attiva quando sopra il valore superiore\nDisattiva quando sotto il valore inferiore"
+ },
+ "ENABLED": "Abilitato",
+ "INPUT_EMULATION_METHOD": "Metodo di emulazione input",
+ "INPUT_EMULATION_METHOD_HELP": "Prova a cambiare questa impostazione nel caso in cui l'input del mouse o \ndella tastiera non venga registrato.",
+ "INPUT_PROFILES": "Cambia i binding di input",
+ "INPUT_PROFILES_HELP": "Binding di input del controller OpenXR",
+ "NOT_SUPPORTED": "Non supportato",
+ "ENABLE_WATCH": "Abilita watch",
+ "SPACE_DRAG": "Space drag",
+ "SPACE_GRAVITY_DAMPING": "Smorzamento",
+ "SPACE_GRAVITY_DAMPING_HELP": "Resistenza artificiale per rallentare il movimento. 0.1 - alta resistenza, 1.0 - nessuna resistenza",
+ "SPACE_GRAVITY_FLING_STRENGTH": "Forza del lancio",
+ "SPACE_GRAVITY_FLING_STRENGTH_HELP": "Moltiplicatore dell'intensità della forza di lancio gravitazionale dopo lo space-drag.\n0.0 - nessun movimento, 2.0 - intensità doppia",
+ "SPACE_GRAVITY_GRAVITY": "Gravità",
+ "SPACE_GRAVITY_GRAVITY_HELP": "Quantità di forza verso il basso. 0.0 - nessuna gravità",
+ "SPACE_GRAVITY_GROUND_FRICTION": "Attrito del terreno",
+ "SPACE_GRAVITY_GROUND_FRICTION_HELP": "Quantità di attrito che ti rallenta se tocchi il suolo.\n0.0 - nessuna frizione (proprio come sul ghiaccio), 1.0 - superficie ruvida",
+ "SPACE_GRAVITY_FLOOR_HEIGHT": "Altezza del pavimento",
+ "SPACE_GRAVITY_FLOOR_HEIGHT_HELP": "La posizione Y in cui si trova il pavimento. La gravità si ferma quando raggiungi questa altezza.",
+ "SAVE": "Salva",
+ "CANCEL": "Annulla",
+ "WHISPER": {
+ "NEED_TO_DOWNLOAD_MODEL": "Il modello selezionato deve essere scaricato.\nVuoi scaricarlo adesso?",
+ "REMOVE_UNUSED_MODELS": "Stai disattivando la funzione di sintesi vocale.\nDesideri rimuovere i modelli Whisper scaricati per liberare spazio?"
+ },
+ "WHISPER_MODEL": "Modello di sintesi vocale (speech-to-text)",
+ "WHISPER_MODEL_HELP": "Modello Whisper da utilizzare.\nI modelli più grandi producono risultati\npiù accurati, ma consumano più VRAM.",
+ "DEFAULT_OVERLAY_SCALE": "Dimensioni overlay predefinite",
+ "DEFAULT_OVERLAY_SCALE_HELP": "Genera nuovi overlay con questa scala.",
+ "COLOR_PALETTE": "Tavolozza colori",
+ "COLOR_PALETTES": "Tavolozze colori",
+ "COLOR_PALETTE_CURRENT": "Tema attualmente attivo.",
+ "COLOR_PALETTE_ACTIVATE": "Clicca per usare questo tema.",
+ "COLOR_PALETTE_HELP": "Clicca per sfogliare le palette di colori.\nPer crearne di personalizzate, visita il sito web!",
+ "COLOR_PALETTE_CUSTOM_URL": "Aggiungi il tuo tema personalizzato!",
+ "COLOR_PALETTE_CUSTOM_URL2": "Clicca per aprire il manuale web.",
+ "SNAP_ANGLE_DEG": "Angolo di scatto beccheggio e rollio finestra",
+ "SNAP_ANGLE_DEG_HELP": "Le finestre afferrate si allineano a questo angolo sugli assi di beccheggio e rollio.",
+ "SAVE_PLAYSPACE_CENTER": "Salva centro playspace",
+ "SAVE_PLAYSPACE_CENTER_HELP": "Usa il playspace corrente per il comando di reset del playspace.",
+ "RESET_PLAYSPACE_CENTER": "Ripristina centro playspace",
+ "RESET_PLAYSPACE_CENTER_HELP": "Ripristina il centro del playspace impostato precedentemente.",
+ "HANDSFREE_ALT_TAB": "Mira commutatore app",
+ "HANDSFREE_ALT_TAB_HELP": "Tieni premuto Super+X, punta alla finestra desiderata, poi rilascia per cambiare focus.",
+ "INPUT_CAPTURE_METHOD": "Metodo di acquisizione input",
+ "POINTER_ACCELERATION": "Accelerazione del mouse",
+ "POINTER_ACCELERATION_HELP": "Attivo: Accelerazione adattiva del mouse\nDisattivo: Velocità costante",
+ "POINTER_SPEED": "Velocità mouse",
+ "INPUT_CAPTURE_METHOD_HELP": "Consente l'uso di periferiche fisiche all'interno di WayVR.\n Super+Z: Passa l'input tra WayVR e il desktop reale\n Super+X: Passa tra le app di WayVR",
+ "SPACE_DRAG_AFFECTS_WORLD": "Lo Space-drag sposta gli overlay"
+ },
+ "APPLICATION_LAUNCHER": "Lanciatore applicazioni",
+ "APPLICATION_STARTED": "Applicazione avviata",
+ "APPLICATIONS": "Applicazioni",
+ "AUDIO": {
+ "AUTO_SWITCH_TO_VR_AUDIO": "Passa automaticamente all'audio VR",
+ "CARDS": "Schede",
+ "FAILED_TO_SWITCH_MICROPHONE": "Impossibile cambiare microfono",
+ "MICROPHONE_SET_SUCCESSFULLY": "Microfono impostato con successo",
+ "MICROPHONES": "Microfoni",
+ "NO_VR_MICROPHONE_SWITCH_MANUALLY": "Nessun microfono VR trovato. Attivalo manualmente.",
+ "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "Nessun altoparlante VR trovato. Selezionali manualmente.",
+ "SELECT_AUDIO_CARD_PROFILE": "Seleziona profilo scheda audio",
+ "SETTINGS": "Impostazioni audio",
+ "SPEAKERS": "Altoparlanti",
+ "SPEAKERS_SET_SUCCESSFULLY": "Altoparlanti impostati correttamente",
+ "VOLUME": "Volume"
+ },
+ "CLOSE_WINDOW": "Chiudi finestra",
+ "DISPLAY_BRIGHTNESS": "Luminosità display",
+ "FAILED_TO_LAUNCH_APPLICATION": "Impossibile avviare l'applicazione:",
+ "GAME_LAUNCHED": "Gioco lanciato",
+ "GAME_LIST": {
+ "NO_GAMES_FOUND": "Nessun gioco trovato",
+ "RUNNING_GAMES_LIST": "Lista dei giochi in esecuzione"
+ },
+ "GAMES": "Giochi",
+ "GENERAL_SETTINGS": "Impostazioni generali",
+ "HEIGHT": "Altezza",
+ "HELLO": "Ciao!",
+ "HELLO_USER": "Ciao, {USER}!",
+ "HIDE": "Nascondi",
+ "HOME_SCREEN": "Home",
+ "MONADO_RUNTIME": "Runtime Monado",
+ "POPUP_ADD_DISPLAY": {
+ "RESOLUTION": "Risoluzione"
+ },
+ "REMOVE": "Rimuovi",
+ "SETTINGS": "Impostazioni",
+ "SHOW": "Mostra",
+ "TERMINATE_PROCESS": "Termina processo",
+ "WIDTH": "Larghezza",
+ "PROCESS_LIST": "Elenco processi",
+ "REFRESH": "Aggiorna",
+ "PROCESS": {
+ "STOP": "Interrompi",
+ "FORCE_KILL": "Uccidi forzatamente"
+ },
+ "DEBUG_INFO": "Informazioni di debug",
+ "CREATION_DATE": "Data di creazione",
+ "DOWNLOADER": "Downloader",
+ "DOWNLOAD_AGAIN": "Scarica di nuovo",
+ "DOWNLOADING_FILE": "Download del file in corso...",
+ "GETTING_STARTED": "Inizio rapido",
+ "MODIFICATION_DATE": "Data di modifica",
+ "LOADING": "Caricamento...",
+ "APPLY": "Applica",
+ "RELOAD_FROM_DISK": "Ricarica da disco",
+ "TARGET_PATH": "Percorso di destinazione",
+ "VERSION": "Versione",
+ "DONATE": {
+ "SUPPORT_US": "Sostienici",
+ "DESCRIPTION": "Siamo un piccolo team di 2 sviluppatori che crea WayVR nel tempo libero. Se ti piace usare questo software, considera di supportarci: ogni donazione ci aiuta a continuare.",
+ "BUTTON_TOOLTIP": "Dona tramite Open Collective",
+ "CURRENT_SUPPORTERS": "Sostenitori attuali",
+ "THANK_YOU_WAYVR": "Grazie dal team WayVR!"
+ },
+ "WELCOME": {
+ "ALL_SET": "Sei pronto!",
+ "BASICS": "Queste nozioni di base ti permetteranno di iniziare a usare WayVR con facilità.",
+ "FEATURES_DOCUMENTATION": "Ci sono molte altre funzioni che vale la pena personalizzare. Per ulteriori informazioni, consulta la documentazione all'indirizzo",
+ "FINISH_TUTORIAL": "Termina tutorial",
+ "GRAB_BOTH_HANDS": "Afferralo con entrambe le mani se vuoi spostare un overlay specifico nel tuo set.",
+ "GRAB_ONE_HAND": "Afferralo con una mano per muovere il tuo set.",
+ "GREETING": "Ciao!",
+ "GUIDE_INTRO": "Lascia che ti guidiamo nei tuoi primi passi.",
+ "LASER_COLORS": "Colori Laser",
+ "LASER_FUNCTIONALITY": "Gran parte delle funzionalità in WayVR dipende dal colore del laser utilizzato per interagire con un elemento dell'interfaccia utente. Non è necessario premere questi pulsanti, basta toccarli!",
+ "LAST_PAGE_INFO": "Questo tutorial smetterà di apparire una volta raggiunta l'ultima pagina.",
+ "LOOK_AT_LEFT_WRIST": "Guarda il tuo polso sinistro. È il tuo watch.",
+ "MIDDLE_CLICK_MODE_PURPLE_LASER": "— Modalità click centrale: Laser viola",
+ "MOVING_YOUR_SET": "Spostamento del tuo set",
+ "NEXT_BUTTON": "Premi il pulsante \"Avanti\" qui sotto per iniziare.",
+ "REGULAR_MODE_BLUE_LASER": "— Modalità Standard: Laser blu",
+ "REPOSITION_THIS_WINDOW_BY_GRABBING": "Riposiziona questa finestra usando l'azione grip del tuo controller.",
+ "RIGHT_CLICK_MODE_ORANGE_LASER": "— Modalità tasto destro: Laser arancione",
+ "THANKS_FOR_INSTALLING": "Grazie per aver installato WayVR!",
+ "WATCH": "Watch",
+ "WORKING_SET": "Set di lavoro",
+ "DOUBLE_PRESS_TO_TOGGLE": "Premi due volte B (su Index) o Y (su Meta) per mostrare, ricentrare o nascondere il tuo set. Provalo ora.",
+ "CENTER_MARKER": "Il marker di centraggio è ciò che apparirà davanti a te durante il ricentramento. Posiziona gli overlay intorno ad esso!"
+ },
+ "DOWNLOAD": "Scarica",
+ "SAVED_TO_FAVOURITES": "Salvato nei preferiti",
+ "ADD_TO_FAVOURITES": "Aggiungi ai preferiti",
+ "ADD_TO_FAVOURITES_HINT": "Salva il preset e fissalo al cassetto delle app",
+ "REMOVE_FROM_FAVOURITES": "Rimuovi dai preferiti",
+ "EMPTY": "Vuoto",
+ "PINNED_APPS": "Applicazioni fissate"
+}
diff --git a/dash-frontend/assets/lang/ja.json b/dash-frontend/assets/lang/ja.json
index 92acc7bf..6dbb6ca4 100644
--- a/dash-frontend/assets/lang/ja.json
+++ b/dash-frontend/assets/lang/ja.json
@@ -1,166 +1,331 @@
{
- "HOME_SCREEN": "ホーム",
- "MONADO_RUNTIME": "「Monado」ランタイム",
- "APPLICATIONS": "アプリ",
- "GAMES": "ゲーム",
- "SETTINGS": "設定",
- "HELLO_USER": "こんにちは、{USER}!",
- "GENERAL_SETTINGS": "全般設定",
- "APPLICATION_LAUNCHER": "アプリケーションランチャー",
- "APP_SETTINGS": {
- "HIDE_USERNAME": "ユーザー名を非表示",
- "OPAQUE_BACKGROUND": "不透明な背景",
- "LOOK_AND_FEEL": "外観",
- "HIDE_GRAB_HELP": "グリップ動作中にのヘルプを非表示",
- "ANIMATION_SPEED": "UIアニメーション速度",
- "ROUND_MULTIPLIER": "UI の丸み",
- "USE_SKYBOX": "スカイボックスを有効",
- "USE_PASSTHROUGH": "パススルーを有効",
- "CLOCK_12H": "12時間制",
- "FEATURES": "機能",
- "NOTIFICATIONS_ENABLED": "通知を有効にする",
- "NOTIFICATIONS_SOUND_ENABLED": "通知音",
- "KEYBOARD_SOUND_ENABLED": "キーボード音",
- "SPACE_DRAG_MULTIPLIER": "スペースドラッグ倍率",
- "SPACE_DRAG_UNLOCKED": "全軸のスペースドラッグ",
- "SPACE_ROTATE_UNLOCKED": "全軸のスペース回転",
- "BLOCK_GAME_INPUT": "ゲームの入力をブロック",
- "BLOCK_GAME_INPUT_IGNORE_WATCH": "入力ブロック時に監視を無視",
- "CONTROLS": "コントロール",
- "FOCUS_FOLLOWS_MOUSE_MODE": "トリガータッチでマウス移動",
- "LEFT_HANDED_MOUSE": "左利きマウス",
- "ALLOW_SLIDING": "グリップ動作中にスティックを有効",
- "INVERT_SCROLL_DIRECTION_X": "水平スクロール方向を反転",
- "INVERT_SCROLL_DIRECTION_Y": "垂直スクロール方向を反転",
- "SCROLL_SPEED": "スクロール速度",
- "LONG_PRESS_DURATION": "長押し時間",
- "POINTER_LERP_FACTOR": "ポインターのスムージング",
- "XR_CLICK_SENSITIVITY": "XRクリック感度",
- "XR_CLICK_SENSITIVITY_RELEASE": "XRリリース感度",
- "CLICK_FREEZE_TIME_MS": "クリックで一時停止時間 (ms)",
- "MISC": "その他",
- "XWAYLAND_BY_DEFAULT": "アプリ実行のデフォルトは互換モード",
- "UPRIGHT_SCREEN_FIX": "画面の縦向き修正",
- "DOUBLE_CURSOR_FIX": "ダブルカーソル修正",
- "SCREEN_RENDER_DOWN": "画面の解像度を縮小",
- "UPRIGHT_SCREEN_FIX_HELP": "一部のデスクトップで縦向きの画面を修正",
- "DOUBLE_CURSOR_FIX_HELP": "2つのカーソルが表示される場合は、これを有効にします",
- "XR_CLICK_SENSITIVITY_HELP": "アナログトリガの感度",
- "XR_CLICK_SENSITIVITY_RELEASE_HELP": "クリックより低くする必要があります",
- "CLICK_FREEZE_TIME_MS_HELP": "ダブルクリックの精度向上に役立ちます",
- "LEFT_HANDED_MOUSE_HELP": "マウスボタンが入れ替わっている場合に有効にします",
- "BLOCK_GAME_INPUT_HELP": "オーバーレイ上にマウスカーソルがあるときに入力をブロックします",
- "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "ウォッチがホバーされているときは入力をブロックしない",
- "USE_SKYBOX_HELP": "シーンアプリまたはパススルーがない場合にスカイボックスを表示します",
- "USE_PASSTHROUGH_HELP": "XRランタイムがサポートしていれば、パススルーを有効にします",
- "SCREEN_RENDER_DOWN_HELP": "高解像度スクリーンでのエイリアシングを軽減します",
- "SETS_ON_WATCH": "ウォッチのセット",
- "TROUBLESHOOTING": "トラブルシューティング",
- "CLEAR_SAVED_STATE": "保存された状態をクリア",
- "CLEAR_PIPEWIRE_TOKENS": "PipeWire トークンをクリア",
- "DELETE_ALL_CONFIGS": "設定を消去",
- "RESTART_SOFTWARE": "ソフトウェアを再起動",
- "CLEAR_SAVED_STATE_HELP": "セットとオーバーレイの位置をリセット",
- "CLEAR_PIPEWIRE_TOKENS_HELP": "次の起動時に画面選択のプロンプトを表示",
- "DELETE_ALL_CONFIGS_HELP": "conf.d 内のすべての設定ファイルを削除",
- "RESTART_SOFTWARE_HELP": "再起動が必要な設定を適用",
- "CAPTURE_METHOD": "Waylandスクリーンキャプチャ",
- "CAPTURE_METHOD_HELP": "画面が黒くなる、または乱れる場合は、\nこの設定を変更してみてください。",
- "KEYBOARD_MIDDLE_CLICK": "キーボードの中ボタンクリック",
- "KEYBOARD_MIDDLE_CLICK_HELP": "紫色のレーザーで入力する際の修飾キー",
- "OPTION": {
- "AUTO": "自動",
- "AUTO_HELP": "サポートされている場合はScreenCopy GPU、\nそうでない場合はPipeWire GPU。",
- "PIPEWIRE_HELP": "GPU高速キャプチャ。\nすべてのデスクトップで標準です。",
- "PW_FALLBACK_HELP": "CPU使用量が多い低速な方法です。\nPipeWire GPUが動作しない場合に試してください。",
- "SCREENCOPY_GPU_HELP": "高速で、スクリーン共有ポップアップはありません。\n動作する環境: Hyprland, Niri, River, Sway",
- "SCREENCOPY_HELP": "遅延あり、画面共有ポップアップなし。\n動作する環境: Hyprland, Niri, River, Sway",
- "NONE": "なし",
- "HMD_PINCH": "HMD + ピンチ",
- "EYE_PINCH": "つまんで目を合わせる",
- "EYE_ONLY": "視野のみ",
- "HMD_ONLY": "HMDのみ"
- },
- "AUTOSTART_APPS": "起動時に実行するアプリ",
- "HANDSFREE_POINTER": "ハンズフリーモード",
- "HANDSFREE_POINTER_HELP": "モーションコントローラーが利用できない場合の入力方法。\n左手のピンチは掴み、右手のピンチはクリックです。",
- "UI_GRADIENT_INTENSITY": "UIグラデーションの強さ",
- "RESET_PLAYSPACE": "プレイエリアをリセット",
- "RESET_PLAYSPACE_HELP": "プレイエリアのオフセットをクリアします。",
- "BLOCK_POSES_ON_KBD_INTERACTION": "キーボード操作時のポーズをブロック",
- "BLOCK_POSES_ON_KBD_INTERACTION_HELP": "キーボードがホバーされ、「ゲーム入力をブロック」が有効になっている場合、ゲームがポーズを受信することをブロックします",
- "LANGUAGE": "言語",
- "REQUIRES_RESTART": "再起動が必要です",
- "GRID_OPACITY": "フロアグリッドの不透明度",
- "GRID_OPACITY_HELP": "スカイボックスが有効なときの床グリッドの不透明度"
- },
- "HELLO": "こんにちは!",
- "AUDIO": {
- "VOLUME": "音量",
- "SETTINGS": "オーディオ設定",
- "AUTO_SWITCH_TO_VR_AUDIO": "VRオーディオに自動切り替え",
- "SPEAKERS": "スピーカー",
- "MICROPHONES": "マイク",
- "CARDS": "カード",
- "SELECT_AUDIO_CARD_PROFILE": "オーディオカードプロファイルを選択",
- "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "VRスピーカーが見つかりませんでした。手動で切り替えてください。",
- "NO_VR_MICROPHONE_SWITCH_MANUALLY": "VRマイクが見つかりませんでした。手動で切り替えてください。",
- "FAILED_TO_SWITCH_MICROPHONE": "マイクの切り替えに失敗しました",
- "MICROPHONE_SET_SUCCESSFULLY": "マイクの設定が完了しました",
- "SPEAKERS_SET_SUCCESSFULLY": "スピーカーを設定しました"
- },
- "ACTIONS": {
- "RECENTER_PLAYSPACE": "プレイスペースを再中央"
- },
- "POPUP_ADD_DISPLAY": {
- "RESOLUTION": "解像度"
- },
- "WIDTH": "幅",
- "HEIGHT": "高さ",
- "HIDE": "隠す",
- "REMOVE": "削除",
- "SHOW": "表示",
- "FAILED_TO_LAUNCH_APPLICATION": "アプリケーションの起動に失敗しました:",
- "APPLICATION_STARTED": "アプリケーションが起動しました",
- "CLOSE_WINDOW": "ウィンドウを閉じる",
- "GAME_LIST": {
- "NO_GAMES_FOUND": "ゲームが見つかりませんでした",
- "RUNNING_GAMES_LIST": "実行中のゲーム一覧"
- },
- "TERMINATE_PROCESS": "プロセスを終了する",
- "GAME_LAUNCHED": "ゲームが起動しました",
- "APP_LAUNCHER": {
- "MODE": {
- "NATIVE": "ネイティブモード",
- "CAGE": "互換モード(Cage)"
- },
- "RES_TITLE": "解像度",
- "ASPECT_TITLE": "アスペクト",
- "ASPECT": {
- "WIDE": "ワイド",
- "SEMI_WIDE": "半広角",
- "SQUARE": "正方形",
- "SEMI_TALL": "半縦長",
- "TALL": "縦長"
- },
- "POS_TITLE": "配置",
- "POS": {
- "FLOATING": "フローティング",
- "ANCHORED": "固定",
- "STATIC": "固定",
- "FLOATING_HELP": "独立して移動し、表示時に中央に再配置されます。",
- "ANCHORED_HELP": "中央マーカーに対して固定された位置に留まります。",
- "STATIC_HELP": "どのセットにも属していません。リセンターされません。"
- },
- "AUTOSTART": "起動時に自動実行",
- "LAUNCH": "起動"
- },
- "DISPLAY_BRIGHTNESS": "ディスプレイの明るさ",
- "PROCESS_LIST": "プロセスリスト",
- "REFRESH": "更新",
- "PROCESS": {
- "STOP": "停止",
- "FORCE_KILL": "強制終了"
- },
- "DEBUG_INFO": "デバッグ情報"
-}
\ No newline at end of file
+ "HOME_SCREEN": "ホーム",
+ "MONADO_RUNTIME": "「Monado」ランタイム",
+ "APPLICATIONS": "アプリ",
+ "GAMES": "ゲーム",
+ "SETTINGS": "設定",
+ "HELLO_USER": "こんにちは、{USER}!",
+ "GENERAL_SETTINGS": "全般設定",
+ "APPLICATION_LAUNCHER": "アプリケーションランチャー",
+ "APP_SETTINGS": {
+ "HIDE_USERNAME": "ユーザー名を非表示",
+ "OPAQUE_BACKGROUND": "不透明な背景",
+ "LOOK_AND_FEEL": "外観",
+ "HIDE_GRAB_HELP": "グリップ動作中にのヘルプを非表示",
+ "ANIMATION_SPEED": "UIアニメーション速度",
+ "ROUND_MULTIPLIER": "UI の丸み",
+ "USE_SKYBOX": "スカイボックスを有効",
+ "USE_PASSTHROUGH": "パススルーを有効",
+ "CLOCK_12H": "12時間制",
+ "FEATURES": "機能",
+ "NOTIFICATIONS_ENABLED": "通知を有効にする",
+ "NOTIFICATIONS_SOUND_ENABLED": "通知音",
+ "KEYBOARD_SOUND_ENABLED": "キーボード音",
+ "SPACE_DRAG_MULTIPLIER": "スペースドラッグ倍率",
+ "SPACE_DRAG_UNLOCKED": "全軸のスペースドラッグ",
+ "SPACE_ROTATE_UNLOCKED": "全軸のスペース回転",
+ "BLOCK_GAME_INPUT": "ゲームの入力をブロック",
+ "BLOCK_GAME_INPUT_IGNORE_WATCH": "入力ブロック時に監視を無視",
+ "CONTROLS": "コントロール",
+ "FOCUS_FOLLOWS_MOUSE_MODE": "トリガータッチでマウス移動",
+ "LEFT_HANDED_MOUSE": "左利きマウス",
+ "ALLOW_SLIDING": "グリップ動作中にスティックを有効",
+ "INVERT_SCROLL_DIRECTION_X": "水平スクロール方向を反転",
+ "INVERT_SCROLL_DIRECTION_Y": "垂直スクロール方向を反転",
+ "SCROLL_SPEED": "スクロール速度",
+ "LONG_PRESS_DURATION": "長押し時間",
+ "POINTER_LERP_FACTOR": "ポインターのスムージング",
+ "CLICK_FREEZE_TIME_MS": "クリックで一時停止時間 (ms)",
+ "MISC": "その他",
+ "XWAYLAND_BY_DEFAULT": "アプリ実行のデフォルトは互換モード",
+ "UPRIGHT_SCREEN_FIX": "画面の縦向き修正",
+ "DOUBLE_CURSOR_FIX": "ダブルカーソル修正",
+ "SCREEN_RENDER_DOWN": "画面の解像度を縮小",
+ "UPRIGHT_SCREEN_FIX_HELP": "一部のデスクトップで縦向きの画面を修正",
+ "DOUBLE_CURSOR_FIX_HELP": "2つのカーソルが表示される場合は、これを有効にします",
+ "CLICK_FREEZE_TIME_MS_HELP": "ダブルクリックの精度向上に役立ちます",
+ "LEFT_HANDED_MOUSE_HELP": "マウスボタンが入れ替わっている場合に有効にします",
+ "BLOCK_GAME_INPUT_HELP": "オーバーレイ上にマウスカーソルがあるときに入力をブロックします",
+ "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "ウォッチがホバーされているときは入力をブロックしない",
+ "USE_SKYBOX_HELP": "シーンアプリまたはパススルーがない場合にスカイボックスを表示します",
+ "USE_PASSTHROUGH_HELP": "XRランタイムがサポートしていれば、パススルーを有効にします",
+ "SCREEN_RENDER_DOWN_HELP": "高解像度スクリーンでのエイリアシングを軽減します",
+ "SETS_ON_WATCH": "ウォッチのセット",
+ "TROUBLESHOOTING": "トラブルシューティング",
+ "CLEAR_SAVED_STATE": "保存された状態をクリア",
+ "CLEAR_PIPEWIRE_TOKENS": "PipeWire トークンをクリア",
+ "DELETE_ALL_CONFIGS": "設定を消去",
+ "RESTART_SOFTWARE": "ソフトウェアを再起動",
+ "CLEAR_SAVED_STATE_HELP": "セットとオーバーレイの位置をリセット",
+ "CLEAR_PIPEWIRE_TOKENS_HELP": "次の起動時に画面選択のプロンプトを表示",
+ "DELETE_ALL_CONFIGS_HELP": "conf.d 内のすべての設定ファイルを削除",
+ "RESTART_SOFTWARE_HELP": "再起動が必要な設定を適用",
+ "CAPTURE_METHOD": "Waylandスクリーンキャプチャ",
+ "CAPTURE_METHOD_HELP": "画面が黒くなる、または乱れる場合は、\nこの設定を変更してみてください。",
+ "KEYBOARD_MIDDLE_CLICK": "キーボードの中ボタンクリック",
+ "KEYBOARD_MIDDLE_CLICK_HELP": "紫色のレーザーで入力する際の修飾キー",
+ "OPTION": {
+ "AUTO": "自動",
+ "AUTO_HELP": "サポートされている場合はScreenCopy GPU、\nそうでない場合はPipeWire GPU。",
+ "PIPEWIRE_HELP": "GPU高速キャプチャ。\nすべてのデスクトップで標準です。",
+ "PW_FALLBACK_HELP": "CPU使用量が多い低速な方法です。\nPipeWire GPUが動作しない場合に試してください。",
+ "SCREENCOPY_GPU_HELP": "高速で、スクリーン共有ポップアップはありません。\n動作する環境: Hyprland, Niri, River, Sway",
+ "SCREENCOPY_HELP": "遅延あり、画面共有ポップアップなし。\n動作する環境: Hyprland, Niri, River, Sway",
+ "NONE": "なし",
+ "HMD_PINCH": "HMD + ピンチ",
+ "EYE_PINCH": "つまんで目を合わせる",
+ "NONE_INPUT_HELP": "マウスとキーボードをエミュレートしません。\nディスプレイを操作できなくなります。",
+ "UINPUT": "デバイス・エミュレーション",
+ "WL_VIRTUAL": "Wayland 仮想入力",
+ "WL_VIRTUAL_HELP": "zwlr_virtual_pointer および zwp_virtual_keyboard を使用して、Wayland コンポジタにイベントを送信します。\n一部のデスクトップ環境でのみ、安定して動作します。\nKDE、GNOME、または COSMIC では動作しません。",
+ "EYE_ONLY": "視線レーザー",
+ "HMD_ONLY": "HMDレーザー",
+ "NONE_INPUT_CAPTURE_HELP": "マウスとキーボードをキャプチャしない。\nWayVR内で起動したアプリで物理マウスや\nキーボードを使用できなくなります。",
+ "UINPUT_HELP": "uinputモジュールを使用してデバイスをエミュレートします。\nほとんどのデスクトップでうまく動作することが確認されています。",
+ "EVDEV_HELP": "入力デバイスを排他的に使用するために確保します。\nユーザーがinputグループに属している必要があります。"
+ },
+ "AUTOSTART_APPS": "起動時に実行するアプリ",
+ "HANDSFREE_POINTER": "ハンズフリーモード",
+ "HANDSFREE_POINTER_HELP": "モーションコントローラーが利用できない場合の入力方法。\n左手のピンチは掴み、右手のピンチはクリックです。",
+ "UI_GRADIENT_INTENSITY": "UIグラデーションの強さ",
+ "RESET_PLAYSPACE": "プレイエリアをリセット",
+ "RESET_PLAYSPACE_HELP": "プレイエリアのオフセットをクリアします。",
+ "BLOCK_POSES_ON_KBD_INTERACTION": "キーボード操作時のポーズをブロック",
+ "BLOCK_POSES_ON_KBD_INTERACTION_HELP": "キーボードがホバーされ、「ゲーム入力をブロック」が有効になっている場合、ゲームがポーズを受信することをブロックします",
+ "LANGUAGE": "言語",
+ "REQUIRES_RESTART": "再起動が必要です",
+ "GRID_OPACITY": "フロアグリッドの不透明度",
+ "GRID_OPACITY_HELP": "スカイボックスが有効なときの床グリッドの不透明度",
+ "BROWSE_ONLINE_CATALOG": "オンラインカタログを閲覧...",
+ "BROWSE_SKYMAPS": "Skymapを閲覧",
+ "COLOR_KEYING": "カラーキーイング",
+ "NO_SKYMAPS_FOUND": "スカイマップが見つかりません",
+ "SELECT_VARIANT": "バリアントを選択",
+ "SHOW_WELCOME_SCREEN": "ウェルカムスクリーンを表示する",
+ "SKYBOX": "スカイボックス",
+ "SKYMAP_ALREADY_DOWNLOADED": "このスカイマップは既にダウンロードされています。希望のアクションを選択してください。",
+ "WATCH_VIEW_ANGLE": "Watchの表示角度",
+ "WATCH_VIEW_ANGLE_HELP": "ウォッチのフェードアウト具合を調整する",
+ "BINDINGS": {
+ "COMP": {
+ "CLICK": "クリック",
+ "FORCE": "Force",
+ "TOUCH": "タッチ",
+ "VALUE": "値",
+ "PROXIMITY": "近接度",
+ "X_AXIS": "X軸",
+ "Y_AXIS": "Y軸"
+ },
+ "TYPE": {
+ "BUMPER": "バンパー",
+ "DPAD_UP": "Dパッド上",
+ "DPAD_DOWN": "Dパッド 下",
+ "DPAD_LEFT": "Dパッド左",
+ "DPAD_RIGHT": "Dパッド右",
+ "JOYSTICK": "ジョイスティック",
+ "MENU": "メニュー",
+ "SHOULDER": "ショルダー",
+ "SQUEEZE": "グリップ",
+ "SYSTEM": "システム",
+ "THUMBREST": "サムレスト",
+ "THUMBSTICK": "サムスティック",
+ "TRACKPAD": "トラックパッド",
+ "TRIGGER": "トリガー",
+ "VIEW": "表示"
+ },
+ "CLICK": {
+ "ANY": "任意",
+ "DOUBLE": "ダブルタップ",
+ "TRIPLE": "トリプルタップ",
+ "TYPE": "タップ回数"
+ },
+ "ACTION": {
+ "CLICK": "クリック*",
+ "GRAB": "掴む*",
+ "ALT_CLICK": "カスタムシェル実行 (configでalt_clickを設定)",
+ "SHOW_HIDE": "表示・非表示、再中心化*",
+ "TOGGLE_DASHBOARD": "ダッシュボードの切り替え",
+ "SPACE_DRAG": "スペースドラッグ",
+ "SPACE_ROTATE": "スペース回転",
+ "SPACE_RESET": "スペース リセット",
+ "CLICK_MODIFIER_RIGHT": "右クリック修飾キー",
+ "CLICK_MODIFIER_MIDDLE": "中クリック修飾キー",
+ "MOVE_MOUSE": "マウスを移動 (デフォルトでオフの場合)",
+ "SCROLL": "スクロール*"
+ },
+ "LEFT": "左",
+ "RIGHT": "右",
+ "COMPONENT": "作動タイプ",
+ "SUBPATH": "アクチュエーション制御",
+ "THRESHOLD": "上限値を超えたときに有効化\n下限値を下回ったときに無効化"
+ },
+ "ENABLED": "有効",
+ "INPUT_EMULATION_METHOD": "入力エミュレーション方法",
+ "INPUT_EMULATION_METHOD_HELP": "マウスやキーボードの入力が\n認識されない場合は、ここを変更してみてください。",
+ "INPUT_PROFILES": "入力バインドの変更",
+ "INPUT_PROFILES_HELP": "OpenXRコントローラーの入力バインディング",
+ "NOT_SUPPORTED": "未対応",
+ "ENABLE_WATCH": "ヴォッチを有効にする",
+ "SPACE_DRAG": "スペースムーバー",
+ "SPACE_GRAVITY_DAMPING": "減衰",
+ "SPACE_GRAVITY_DAMPING_HELP": "動きを減速させるための人工的な抵抗です。0.1 - 強い抵抗、1.0 - 抵抗なし",
+ "SPACE_GRAVITY_FLING_STRENGTH": "スリングの強さ",
+ "SPACE_GRAVITY_FLING_STRENGTH_HELP": "Space-drag 後の重力による打ち出し強度の倍率です。\n0.0 - 全く動きません、2.0 - 強度が2倍になります",
+ "SPACE_GRAVITY_GRAVITY": "重力",
+ "SPACE_GRAVITY_GRAVITY_HELP": "下向きの力の強さ。0.0 - 重力なし",
+ "SPACE_GRAVITY_GROUND_FRICTION": "地面の摩擦",
+ "SPACE_GRAVITY_GROUND_FRICTION_HELP": "地面に触れている際に、移動を遅らせる摩擦の強さです。\n0.0 - 摩擦なし(氷の上のような状態)、1.0 - 粗い表面",
+ "SPACE_GRAVITY_FLOOR_HEIGHT": "床の高さ",
+ "SPACE_GRAVITY_FLOOR_HEIGHT_HELP": "床のY座標です。この高さに達すると重力が停止します。",
+ "SAVE": "保存",
+ "CANCEL": "キャンセル",
+ "WHISPER": {
+ "NEED_TO_DOWNLOAD_MODEL": "選択されたモデルをダウンロードする必要があります。\n今すぐダウンロードしますか?",
+ "REMOVE_UNUSED_MODELS": "文字起こし機能をオフにします。\n空き容量を増やすために、ダウンロード済みのモデルファイルを削除しますか?"
+ },
+ "WHISPER_MODEL": "文字起こしモデル",
+ "WHISPER_MODEL_HELP": "使用するWhisperモデル。\nモデルが大きいほど精度は向上しますが、\nVRAMの消費量が増加します。",
+ "DEFAULT_OVERLAY_SCALE": "デフォルトのオーバーレイサイズ",
+ "DEFAULT_OVERLAY_SCALE_HELP": "新しいオーバーレイをこのスケールで生成します。",
+ "COLOR_PALETTE": "カラーパレット",
+ "COLOR_PALETTES": "カラーパレット",
+ "COLOR_PALETTE_CURRENT": "現在有効なテーマ。",
+ "COLOR_PALETTE_ACTIVATE": "クリックしてこのテーマを適用します。",
+ "COLOR_PALETTE_HELP": "クリックしてカラーパレットを選択してください。\nカスタムパレットの作成については、ウェブサイトを参照してください!",
+ "COLOR_PALETTE_CUSTOM_URL": "カスタムテーマを追加しましょう!",
+ "COLOR_PALETTE_CUSTOM_URL2": "クリックしてウェブマニュアルを開く。",
+ "SNAP_ANGLE_DEG": "ウィンドウのピッチ・ロールのスナップ角度",
+ "SNAP_ANGLE_DEG_HELP": "掴んでいるウィンドウが、ピッチ軸とロール軸でこの角度にスナップします。",
+ "SAVE_PLAYSPACE_CENTER": "プレイスペースの中心を保存",
+ "SAVE_PLAYSPACE_CENTER_HELP": "現在のプレイスペースを、プレイスペースのリセットバインディングに使用します。",
+ "RESET_PLAYSPACE_CENTER": "スペースの中心をリセット",
+ "RESET_PLAYSPACE_CENTER_HELP": "スペースセンターをリセットします。",
+ "HANDSFREE_ALT_TAB": "アプリ切り替えの照準",
+ "HANDSFREE_ALT_TAB_HELP": "Super+Xを押し続け、切り替えたいウィンドウに照準を合わせ、離してフォーカスを切り替えます。",
+ "INPUT_CAPTURE_METHOD": "入力キャプチャ方式",
+ "POINTER_ACCELERATION": "マウス加速",
+ "POINTER_ACCELERATION_HELP": "オン: 適応型マウス加速\nオフ: 一定速度",
+ "POINTER_SPEED": "マウス速度",
+ "INPUT_CAPTURE_METHOD_HELP": "WayVR内で物理周辺機器を使用できるようにします。\n Super+Z: WayVRと実際のデスクトップ間で入力を切り替え\n Super+X: WayVRアプリ間で切り替え",
+ "SPACE_DRAG_AFFECTS_WORLD": "スペースドラッグでオーバーレイを移動"
+ },
+ "HELLO": "こんにちは!",
+ "AUDIO": {
+ "VOLUME": "音量",
+ "SETTINGS": "オーディオ設定",
+ "AUTO_SWITCH_TO_VR_AUDIO": "VRオーディオに自動切り替え",
+ "SPEAKERS": "スピーカー",
+ "MICROPHONES": "マイク",
+ "CARDS": "カード",
+ "SELECT_AUDIO_CARD_PROFILE": "オーディオカードプロファイルを選択",
+ "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "VRスピーカーが見つかりませんでした。手動で切り替えてください。",
+ "NO_VR_MICROPHONE_SWITCH_MANUALLY": "VRマイクが見つかりませんでした。手動で切り替えてください。",
+ "FAILED_TO_SWITCH_MICROPHONE": "マイクの切り替えに失敗しました",
+ "MICROPHONE_SET_SUCCESSFULLY": "マイクの設定が完了しました",
+ "SPEAKERS_SET_SUCCESSFULLY": "スピーカーを設定しました"
+ },
+ "ACTIONS": {
+ "RECENTER_PLAYSPACE": "プレイスペースを再中央"
+ },
+ "POPUP_ADD_DISPLAY": {
+ "RESOLUTION": "解像度"
+ },
+ "WIDTH": "幅",
+ "HEIGHT": "高さ",
+ "HIDE": "隠す",
+ "REMOVE": "削除",
+ "SHOW": "表示",
+ "FAILED_TO_LAUNCH_APPLICATION": "アプリケーションの起動に失敗しました:",
+ "APPLICATION_STARTED": "アプリケーションが起動しました",
+ "CLOSE_WINDOW": "ウィンドウを閉じる",
+ "GAME_LIST": {
+ "NO_GAMES_FOUND": "ゲームが見つかりませんでした",
+ "RUNNING_GAMES_LIST": "実行中のゲーム一覧"
+ },
+ "TERMINATE_PROCESS": "プロセスを終了する",
+ "GAME_LAUNCHED": "ゲームが起動しました",
+ "APP_LAUNCHER": {
+ "MODE": {
+ "NATIVE": "ネイティブモード",
+ "CAGE": "互換モード(Cage)"
+ },
+ "RES_TITLE": "解像度",
+ "ASPECT_TITLE": "アスペクト",
+ "ASPECT": {
+ "WIDE": "ワイド",
+ "SEMI_WIDE": "半広角",
+ "SQUARE": "正方形",
+ "SEMI_TALL": "半縦長",
+ "TALL": "縦長"
+ },
+ "POS_TITLE": "配置",
+ "POS": {
+ "FLOATING": "フローティング",
+ "ANCHORED": "固定",
+ "STATIC": "固定",
+ "FLOATING_HELP": "独立して移動し、表示時に中央に再配置されます。",
+ "ANCHORED_HELP": "中央マーカーに対して固定された位置に留まります。",
+ "STATIC_HELP": "どのセットにも属していません。リセンターされません。"
+ },
+ "AUTOSTART": "起動時に自動実行",
+ "LAUNCH": "起動"
+ },
+ "DISPLAY_BRIGHTNESS": "ディスプレイの明るさ",
+ "PROCESS_LIST": "プロセスリスト",
+ "REFRESH": "更新",
+ "PROCESS": {
+ "STOP": "停止",
+ "FORCE_KILL": "強制終了"
+ },
+ "DEBUG_INFO": "デバッグ情報",
+ "CREATION_DATE": "作成日",
+ "DOWNLOADER": "ダウンローダー",
+ "DOWNLOAD_AGAIN": "再ダウンロード",
+ "DOWNLOADING_FILE": "ファイルをダウンロード中...",
+ "GETTING_STARTED": "はじめに",
+ "MODIFICATION_DATE": "更新日",
+ "LOADING": "読み込み中...",
+ "APPLY": "適用",
+ "RELOAD_FROM_DISK": "ディスクからリロード",
+ "TARGET_PATH": "ターゲットパス",
+ "VERSION": "バージョン",
+ "DONATE": {
+ "SUPPORT_US": "私たちを支援する",
+ "DESCRIPTION": "私たちは、空き時間にWayVRを開発している2人の開発者からなる小さなチームです。もしこのソフトウェアを気に入っていただけたなら、ぜひ支援をご検討ください。皆様からの寄付は、開発を継続していくための大きな助けとなります。",
+ "BUTTON_TOOLTIP": "Open Collectiveで寄付する",
+ "CURRENT_SUPPORTERS": "現在のサポーター",
+ "THANK_YOU_WAYVR": "WayVRチーム一同より、感謝を込めて!"
+ },
+ "WELCOME": {
+ "ALL_SET": "準備完了です!",
+ "BASICS": "これらの基本操作を学ぶことで、WayVRを簡単に使い始めることができます。",
+ "FEATURES_DOCUMENTATION": "他にもカスタマイズする価値のある機能がたくさんあります。詳細については、以下のドキュメントを確認してください。",
+ "FINISH_TUTORIAL": "チュートリアルを終了する",
+ "GRAB_BOTH_HANDS": "セット内の特定のオーバーレイを移動させたい場合は、両手で掴んでください。",
+ "GRAB_ONE_HAND": "片手で掴んでセットを移動させます。",
+ "GREETING": "こんにちは!",
+ "GUIDE_INTRO": "最初の手順をご案内します。",
+ "LASER_COLORS": "レーザーの色",
+ "LASER_FUNCTIONALITY": "WayVRの機能の多くは、UI要素を操作する際に使用されるレーザーの色に依存しています。これらのボタンは押す必要はなく、ただ触れるだけで操作できます!",
+ "LAST_PAGE_INFO": "最後のページに到達すると、このチュートリアルは表示されなくなります。",
+ "LOOK_AT_LEFT_WRIST": "左手首を見てください。それがあなたのWatchです。",
+ "MIDDLE_CLICK_MODE_PURPLE_LASER": "— ミドルクリックモード:紫色のレーザー",
+ "MOVING_YOUR_SET": "セットを移動中",
+ "NEXT_BUTTON": "「次へ」ボタンを押して開始してください。",
+ "REGULAR_MODE_BLUE_LASER": "— 通常モード: ブルーレーザー",
+ "REPOSITION_THIS_WINDOW_BY_GRABBING": "コントローラーのグリップアクションを使用して、このウィンドウの位置を再設定します。",
+ "RIGHT_CLICK_MODE_ORANGE_LASER": "— 右クリックモード:オレンジ色のレーザー",
+ "THANKS_FOR_INSTALLING": "WayVRをインストールしていただきありがとうございます!",
+ "WATCH": "Watch",
+ "WORKING_SET": "ワーキングセット",
+ "DOUBLE_PRESS_TO_TOGGLE": "Bボタン(Index)またはYボタン(Meta)を2回押して、セットの表示・中心合わせ・非表示を切り替えてください。今すぐ試してみましょう。",
+ "CENTER_MARKER": "リセンタリング時に目の前に表示されるのがセンターマーカーです。このマーカーを中心にオーバーレイを配置してください!"
+ },
+ "DOWNLOAD": "ダウンロード",
+ "SAVED_TO_FAVOURITES": "お気に入りに保存しました",
+ "ADD_TO_FAVOURITES": "お気に入りに追加",
+ "ADD_TO_FAVOURITES_HINT": "プリセットを保存してアプリドロワーにピン留めします",
+ "REMOVE_FROM_FAVOURITES": "お気に入りから削除",
+ "EMPTY": "空",
+ "PINNED_APPS": "ピン留めされたアプリケーション"
+}
diff --git a/dash-frontend/assets/lang/pl.json b/dash-frontend/assets/lang/pl.json
index 2f5f83fa..aa372bd0 100644
--- a/dash-frontend/assets/lang/pl.json
+++ b/dash-frontend/assets/lang/pl.json
@@ -1,166 +1,331 @@
{
- "ACTIONS": {
- "RECENTER_PLAYSPACE": "Wycentruj przestrzeń"
- },
- "APP_SETTINGS": {
- "HIDE_USERNAME": "Ukryj nazwę użytkownika",
- "OPAQUE_BACKGROUND": "Nieprzezroczyste tło",
- "LOOK_AND_FEEL": "Wygląd i działanie",
- "HIDE_GRAB_HELP": "Ukryj pomoc dotyczącą chwytania",
- "ANIMATION_SPEED": "Prędkość animacji UI",
- "ROUND_MULTIPLIER": "Zaokrąglenie krawędzi UI",
- "USE_SKYBOX": "Włącz niebo",
- "USE_PASSTHROUGH": "Włącz passthrough",
- "CLOCK_12H": "Zegar 12-godzinny",
- "FEATURES": "Funkcje",
- "NOTIFICATIONS_ENABLED": "Włącz powiadomienia",
- "NOTIFICATIONS_SOUND_ENABLED": "Dźwięki powiadomień",
- "KEYBOARD_SOUND_ENABLED": "Dźwięki klawiatury",
- "SPACE_DRAG_MULTIPLIER": "Mnożnik przesuwania przestrzeni",
- "SPACE_DRAG_UNLOCKED": "Pozwól na przesuwanie przestrzeni na wszystkich osiach",
- "SPACE_ROTATE_UNLOCKED": "Pozwól na rotację przestrzeni na wszystkich osiach",
- "BLOCK_GAME_INPUT": "Blokuj input z gry",
- "BLOCK_GAME_INPUT_IGNORE_WATCH": "Nie blokuj inputu gry, gdy zegarek jest używany",
- "CONTROLS": "Sterowanie",
- "FOCUS_FOLLOWS_MOUSE_MODE": "Ruch myszą po dotknięciu spustu",
- "LEFT_HANDED_MOUSE": "Myszka dla leworęcznych",
- "ALLOW_SLIDING": "Interakcja z drążkami podczas chwytania",
- "INVERT_SCROLL_DIRECTION_X": "Odwróć kierunek przewijania w poziomie",
- "INVERT_SCROLL_DIRECTION_Y": "Odwróć kierunek przewijania w pionie",
- "SCROLL_SPEED": "Prędkość przewijania",
- "LONG_PRESS_DURATION": "Czas długiego przytrzymania",
- "POINTER_LERP_FACTOR": "Wygładzanie wskaźnika",
- "XR_CLICK_SENSITIVITY": "Czułość kliknięć XR",
- "XR_CLICK_SENSITIVITY_RELEASE": "Czułość zwalniania XR",
- "CLICK_FREEZE_TIME_MS": "Czas zamrożenia po kliknięciu (ms)",
- "XWAYLAND_BY_DEFAULT": "Uruchamiaj aplikacje domyślnie w trybie kompatybilności",
- "UPRIGHT_SCREEN_FIX": "Naprawa pozycji ekranu",
- "DOUBLE_CURSOR_FIX": "Naprawa podwójnego kursora",
- "SCREEN_RENDER_DOWN": "Renderuj ekran w niższej rozdzielczości",
- "UPRIGHT_SCREEN_FIX_HELP": "Naprawia pionowe ekrany na niektórych komputerach",
- "DOUBLE_CURSOR_FIX_HELP": "Włącz to, jeśli widzisz 2 kursory",
- "XR_CLICK_SENSITIVITY_HELP": "Czułość analogowego spustu",
- "XR_CLICK_SENSITIVITY_RELEASE_HELP": "Musi być niższa niż kliknięcie",
- "CLICK_FREEZE_TIME_MS_HELP": "Pomaga w precyzji podwójnego kliknięcia",
- "LEFT_HANDED_MOUSE_HELP": "Użyj tego, jeśli przyciski myszy są zamienione",
- "BLOCK_GAME_INPUT_HELP": "Blokuje wszystkie dane wejściowe, gdy kursor najedzie na nakładkę",
- "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "Nie blokuj inputu, gdy wskaźnik jest najedzony",
- "USE_SKYBOX_HELP": "Wyświetlaj niebo, jeśli nie ma aplikacji sceny lub passthrough",
- "USE_PASSTHROUGH_HELP": "Pozwól na passthrough, jeśli runtime XR to obsługuje",
- "SCREEN_RENDER_DOWN_HELP": "Pomaga redukować aliasing na ekranach o wysokiej rozdzielczości",
- "SETS_ON_WATCH": "Lista zestawów na zegarku",
- "TROUBLESHOOTING": "Rozwiązywanie problemów",
- "CLEAR_SAVED_STATE": "Wyczyść zapisany stan",
- "CLEAR_PIPEWIRE_TOKENS": "Wyczyść tokeny PipeWire",
- "DELETE_ALL_CONFIGS": "Wyczyść konfigurację",
- "RESTART_SOFTWARE": "Restartuj WayVR",
- "CLEAR_SAVED_STATE_HELP": "Zresetuj zestawy i pozycje nakładek",
- "CLEAR_PIPEWIRE_TOKENS_HELP": "Zapytaj o wybór ekranu przy następnym uruchomieniu",
- "DELETE_ALL_CONFIGS_HELP": "Usuń wszystkie pliki konfiguracyjne z katalogu conf.d",
- "RESTART_SOFTWARE_HELP": "Zastosuj ustawienia wymagające ponownego uruchomienia",
- "CAPTURE_METHOD": "Przechwytywanie ekranu Wayland",
- "CAPTURE_METHOD_HELP": "Spróbuj zmienić tę opcję, jeśli masz\nproblemy z czarnym lub migoczącym ekranem",
- "KEYBOARD_MIDDLE_CLICK": "Środkowy przycisk myszy na klawiaturze",
- "KEYBOARD_MIDDLE_CLICK_HELP": "Modyfikator, który ma zostać użyty podczas pisania\nfioletową wiązką lasera",
- "OPTION": {
- "AUTO": "Automatycznie",
- "AUTO_HELP": "Skopiuj ekran za pomocą GPU, jeśli obsługiwane,\nw przeciwnym razie GPU PipeWire.",
- "PIPEWIRE_HELP": "Szybkie przechwytywanie GPU,\nstandard na wszystkich komputerach.",
- "PW_FALLBACK_HELP": "Powolna metoda z wysokim użyciem procesora.\nWypróbuj w przypadku, gdy PipeWire GPU nie działa",
- "SCREENCOPY_GPU_HELP": "Szybkie działanie, brak wyskakujących okien z informacją o udostępnianiu ekranu.\nDziała na: Hyprland, Niri, River, Sway",
- "SCREENCOPY_HELP": "Wolne, bez wyskakujących okienek udostępniania ekranu.\nDziała na: Hyprland, Niri, River, Sway",
- "NONE": "Brak",
- "HMD_PINCH": "HMD + ściśnięcie placami",
- "EYE_PINCH": "Ściśnięcie palcami + oko",
- "EYE_ONLY": "Tylko oko",
- "HMD_ONLY": "Tylko HMD"
- },
- "AUTOSTART_APPS": "Aplikacje auto-start",
- "HANDSFREE_POINTER": "Tryb bez użycia rąk",
- "HANDSFREE_POINTER_HELP": "Wejście do użycia, gdy kontrolery ruchu\nsą niedostępne. Lewy szczyptak to chwyt,\nprawy to kliknięcie.",
- "UI_GRADIENT_INTENSITY": "Intensywność gradientu UI",
- "RESET_PLAYSPACE": "Zresetuj przestrzeń gry",
- "RESET_PLAYSPACE_HELP": "Wyczyść przesunięcie przestrzeni gry.",
- "BLOCK_POSES_ON_KBD_INTERACTION": "Blokuj pozy podczas interakcji z klawiaturą",
- "BLOCK_POSES_ON_KBD_INTERACTION_HELP": "Blokuje odbieranie póz przez grę, gdy kursor myszy znajduje się nad klawiaturą i włączona jest opcja 'Blokuj dane wejściowe z gry'",
- "LANGUAGE": "Język",
- "REQUIRES_RESTART": "Wymaga restartu",
- "MISC": "Różne",
- "GRID_OPACITY": "Przezroczystość siatki podłogowej",
- "GRID_OPACITY_HELP": "Przezroczystość siatki podłogowej, gdy włączony jest skybox"
- },
- "APPLICATION_LAUNCHER": "Uruchamiacz aplikacji",
- "APPLICATIONS": "Aplikacje",
- "AUDIO": {
- "AUTO_SWITCH_TO_VR_AUDIO": "Automatyczne przełączanie na dźwięk VR",
- "CARDS": "Karty",
- "FAILED_TO_SWITCH_MICROPHONE": "Nie udało się przełączyć mikrofon",
- "MICROPHONE_SET_SUCCESSFULLY": "Mikrofon ustawiono pomyślnie",
- "MICROPHONES": "Mikrofony",
- "NO_VR_MICROPHONE_SWITCH_MANUALLY": "Brak mikrofonu VR. Włącz go ręcznie.",
- "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "Brak głośników VR. Włącz je ręcznie.",
- "SELECT_AUDIO_CARD_PROFILE": "Wybierz profil karty dźwiękowej",
- "SETTINGS": "Ustawienia dźwięku",
- "SPEAKERS": "Głośniki",
- "SPEAKERS_SET_SUCCESSFULLY": "Głośniki ustawiono pomyślnie",
- "VOLUME": "Głośność"
- },
- "GAMES": "Gry",
- "GENERAL_SETTINGS": "Ustawienia ogólne",
- "HEIGHT": "Wysokość",
- "HELLO": "Witaj!",
- "HELLO_USER": "Witaj, {USER}!",
- "HIDE": "Ukryj",
- "HOME_SCREEN": "Ekran główny",
- "MONADO_RUNTIME": "Środowisko Monado",
- "POPUP_ADD_DISPLAY": {
- "RESOLUTION": "Rozdzielczość"
- },
- "REMOVE": "Usuń",
- "SETTINGS": "Ustawienia",
- "SHOW": "Pokaż",
- "WIDTH": "Szerokość",
- "FAILED_TO_LAUNCH_APPLICATION": "Nie udało się uruchomić aplikacji:",
- "APPLICATION_STARTED": "Aplikacja uruchomiona",
- "CLOSE_WINDOW": "Zamknij okno",
- "GAME_LIST": {
- "NO_GAMES_FOUND": "Nie znaleziono gier",
- "RUNNING_GAMES_LIST": "Lista uruchomionych gier"
- },
- "TERMINATE_PROCESS": "Zakończ proces",
- "GAME_LAUNCHED": "Gra uruchomiona",
- "APP_LAUNCHER": {
- "MODE": {
- "NATIVE": "Tryb natywny",
- "CAGE": "Tryb kompatybilności (Cage)"
- },
- "RES_TITLE": "Rozdzielczość",
- "ASPECT_TITLE": "Proporcje",
- "ASPECT": {
- "WIDE": "Szeroki",
- "SEMI_WIDE": "Półszeroki",
- "SQUARE": "Kwadrat",
- "SEMI_TALL": "Pół-wysoki",
- "TALL": "Wysoki"
- },
- "POS_TITLE": "Pozycjonowanie",
- "POS": {
- "FLOATING": "Pływający",
- "ANCHORED": "Przymocowane",
- "STATIC": "Statyczny",
- "FLOATING_HELP": "Porusza się niezależnie, wycentrowuje się po otwarciu.",
- "ANCHORED_HELP": "Pozostaje nieruchoma względem centralnego znacznika.",
- "STATIC_HELP": "Nie należy do żadnego zestawu. Nie wyśrodkowuje."
- },
- "AUTOSTART": "Uruchom automatycznie przy starcie",
- "LAUNCH": "Uruchom"
- },
- "DISPLAY_BRIGHTNESS": "Jasność wyświetlacza",
- "PROCESS_LIST": "Lista procesów",
- "REFRESH": "Odśwież",
- "PROCESS": {
- "STOP": "Zatrzymaj",
- "FORCE_KILL": "Wymuś zakończenie"
- },
- "DEBUG_INFO": "Informacje debugowania"
-}
\ No newline at end of file
+ "ACTIONS": {
+ "RECENTER_PLAYSPACE": "Wycentruj przestrzeń"
+ },
+ "APP_SETTINGS": {
+ "HIDE_USERNAME": "Ukryj nazwę użytkownika",
+ "OPAQUE_BACKGROUND": "Nieprzezroczyste tło",
+ "LOOK_AND_FEEL": "Wygląd i działanie",
+ "HIDE_GRAB_HELP": "Ukryj pomoc dotyczącą chwytania",
+ "ANIMATION_SPEED": "Prędkość animacji UI",
+ "ROUND_MULTIPLIER": "Zaokrąglenie krawędzi UI",
+ "USE_SKYBOX": "Włącz niebo",
+ "USE_PASSTHROUGH": "Włącz passthrough",
+ "CLOCK_12H": "Zegar 12-godzinny",
+ "FEATURES": "Funkcje",
+ "NOTIFICATIONS_ENABLED": "Włącz powiadomienia",
+ "NOTIFICATIONS_SOUND_ENABLED": "Dźwięki powiadomień",
+ "KEYBOARD_SOUND_ENABLED": "Dźwięki klawiatury",
+ "SPACE_DRAG_MULTIPLIER": "Mnożnik przesuwania przestrzeni",
+ "SPACE_DRAG_UNLOCKED": "Pozwól na przesuwanie przestrzeni na wszystkich osiach",
+ "SPACE_ROTATE_UNLOCKED": "Pozwól na rotację przestrzeni na wszystkich osiach",
+ "BLOCK_GAME_INPUT": "Blokuj input z gry",
+ "BLOCK_GAME_INPUT_IGNORE_WATCH": "Nie blokuj inputu gry, gdy zegarek jest używany",
+ "CONTROLS": "Sterowanie",
+ "FOCUS_FOLLOWS_MOUSE_MODE": "Ruch myszą po dotknięciu spustu",
+ "LEFT_HANDED_MOUSE": "Myszka dla leworęcznych",
+ "ALLOW_SLIDING": "Interakcja z drążkami podczas chwytania",
+ "INVERT_SCROLL_DIRECTION_X": "Odwróć kierunek przewijania w poziomie",
+ "INVERT_SCROLL_DIRECTION_Y": "Odwróć kierunek przewijania w pionie",
+ "SCROLL_SPEED": "Prędkość przewijania",
+ "LONG_PRESS_DURATION": "Czas długiego przytrzymania",
+ "POINTER_LERP_FACTOR": "Wygładzanie wskaźnika",
+ "CLICK_FREEZE_TIME_MS": "Czas zamrożenia po kliknięciu (ms)",
+ "XWAYLAND_BY_DEFAULT": "Uruchamiaj aplikacje domyślnie w trybie kompatybilności",
+ "UPRIGHT_SCREEN_FIX": "Naprawa pozycji ekranu",
+ "DOUBLE_CURSOR_FIX": "Naprawa podwójnego kursora",
+ "SCREEN_RENDER_DOWN": "Renderuj ekran w niższej rozdzielczości",
+ "UPRIGHT_SCREEN_FIX_HELP": "Naprawia pionowe ekrany na niektórych komputerach",
+ "DOUBLE_CURSOR_FIX_HELP": "Włącz to, jeśli widzisz 2 kursory",
+ "CLICK_FREEZE_TIME_MS_HELP": "Pomaga w precyzji podwójnego kliknięcia",
+ "LEFT_HANDED_MOUSE_HELP": "Użyj tego, jeśli przyciski myszy są zamienione",
+ "BLOCK_GAME_INPUT_HELP": "Blokuje wszystkie dane wejściowe, gdy kursor najedzie na nakładkę",
+ "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "Nie blokuj inputu, gdy wskaźnik jest najedzony",
+ "USE_SKYBOX_HELP": "Wyświetlaj niebo, jeśli nie ma aplikacji sceny lub passthrough",
+ "USE_PASSTHROUGH_HELP": "Pozwól na passthrough, jeśli runtime XR to obsługuje",
+ "SCREEN_RENDER_DOWN_HELP": "Pomaga redukować aliasing na ekranach o wysokiej rozdzielczości",
+ "ENABLE_WATCH": "Włącz zegarek",
+ "SETS_ON_WATCH": "Lista zestawów na zegarku",
+ "TROUBLESHOOTING": "Rozwiązywanie problemów",
+ "CLEAR_SAVED_STATE": "Wyczyść zapisany stan",
+ "CLEAR_PIPEWIRE_TOKENS": "Wyczyść tokeny PipeWire",
+ "DELETE_ALL_CONFIGS": "Wyczyść konfigurację",
+ "RESTART_SOFTWARE": "Restartuj WayVR",
+ "CLEAR_SAVED_STATE_HELP": "Zresetuj zestawy i pozycje nakładek",
+ "CLEAR_PIPEWIRE_TOKENS_HELP": "Zapytaj o wybór ekranu przy następnym uruchomieniu",
+ "DELETE_ALL_CONFIGS_HELP": "Usuń wszystkie pliki konfiguracyjne z katalogu conf.d",
+ "RESTART_SOFTWARE_HELP": "Zastosuj ustawienia wymagające ponownego uruchomienia",
+ "CAPTURE_METHOD": "Przechwytywanie ekranu Wayland",
+ "CAPTURE_METHOD_HELP": "Spróbuj zmienić tę opcję, jeśli masz\nproblemy z czarnym lub migoczącym ekranem",
+ "KEYBOARD_MIDDLE_CLICK": "Środkowy przycisk myszy na klawiaturze",
+ "KEYBOARD_MIDDLE_CLICK_HELP": "Modyfikator, który ma zostać użyty podczas pisania\nfioletową wiązką lasera",
+ "OPTION": {
+ "AUTO": "Automatycznie",
+ "AUTO_HELP": "Skopiuj ekran za pomocą GPU, jeśli obsługiwane,\nw przeciwnym razie GPU PipeWire.",
+ "PIPEWIRE_HELP": "Szybkie przechwytywanie GPU,\nstandard na wszystkich komputerach.",
+ "PW_FALLBACK_HELP": "Powolna metoda z wysokim użyciem procesora.\nWypróbuj w przypadku, gdy PipeWire GPU nie działa",
+ "SCREENCOPY_GPU_HELP": "Szybkie działanie, brak wyskakujących okien z informacją o udostępnianiu ekranu.\nDziała na: Hyprland, Niri, River, Sway",
+ "SCREENCOPY_HELP": "Wolne, bez wyskakujących okienek udostępniania ekranu.\nDziała na: Hyprland, Niri, River, Sway",
+ "NONE": "Brak",
+ "HMD_PINCH": "HMD + ściśnięcie placami",
+ "EYE_PINCH": "Ściśnięcie palcami + oko",
+ "NONE_INPUT_HELP": "Nie emuluj myszy ani klawiatury.\nBrak możliwości interakcji z ekranami.",
+ "UINPUT": "Emulacja urządzenia",
+ "WL_VIRTUAL": "Wirtualne wejście Wayland",
+ "WL_VIRTUAL_HELP": "Wysyłaj wejście myszki/klawiatury do kompozytora Wayland za pomocą\nzwlr_virtual_pointer i zwp_virtual_keyboard.\nDziała niezawodnie tylko na niektórych pulpitach.\nNIE działa na KDE, GNOME ani COSMIC.",
+ "EYE_ONLY": "Laser oczami",
+ "HMD_ONLY": "Laser HMD",
+ "NONE_INPUT_CAPTURE_HELP": "Nie przechwytuj myszy i klawiatury.\nFizyczna mysz lub klawiatura nie będą\ndostępne w aplikacjach uruchomionych w WayVR.",
+ "UINPUT_HELP": "Używa modułu uinput do emulacji urządzenia.\nSprawdzono, że działa dobrze na większości komputerów stacjonarnych.",
+ "EVDEV_HELP": "Przejmij urządzenia wejściowe do wyłącznego użytku.\nUżytkownik musi należeć do grupy 'input'."
+ },
+ "AUTOSTART_APPS": "Aplikacje auto-start",
+ "HANDSFREE_POINTER": "Tryb bez użycia rąk",
+ "HANDSFREE_POINTER_HELP": "Wejście do użycia, gdy kontrolery ruchu\nsą niedostępne. Lewy szczyptak to chwyt,\nprawy to kliknięcie.",
+ "UI_GRADIENT_INTENSITY": "Intensywność gradientu UI",
+ "RESET_PLAYSPACE": "Zresetuj przestrzeń gry",
+ "RESET_PLAYSPACE_HELP": "Wyczyść przesunięcie przestrzeni gry.",
+ "BLOCK_POSES_ON_KBD_INTERACTION": "Blokuj pozy podczas interakcji z klawiaturą",
+ "BLOCK_POSES_ON_KBD_INTERACTION_HELP": "Blokuje odbieranie póz przez grę, gdy kursor myszy znajduje się nad klawiaturą i włączona jest opcja 'Blokuj dane wejściowe z gry'",
+ "LANGUAGE": "Język",
+ "REQUIRES_RESTART": "Wymaga restartu",
+ "MISC": "Różne",
+ "GRID_OPACITY": "Przezroczystość siatki podłogowej",
+ "GRID_OPACITY_HELP": "Przezroczystość siatki podłogowej, gdy włączony jest skybox",
+ "BROWSE_ONLINE_CATALOG": "Przeglądaj katalog online...",
+ "BROWSE_SKYMAPS": "Przeglądaj skymaps",
+ "COLOR_KEYING": "Kluczowanie kolorem",
+ "NO_SKYMAPS_FOUND": "Nie znaleziono skymap",
+ "SELECT_VARIANT": "Wybierz wariant",
+ "SHOW_WELCOME_SCREEN": "Pokaż ekran powitalny",
+ "SKYBOX": "Skymap",
+ "SKYMAP_ALREADY_DOWNLOADED": "Ta skymapa została już pobrana. Wybierz żądaną akcję.",
+ "WATCH_VIEW_ANGLE": "Kąty widzenia Watch",
+ "WATCH_VIEW_ANGLE_HELP": "Kontroluj, jak zegarek zanika",
+ "BINDINGS": {
+ "COMP": {
+ "CLICK": "Kliknięcie",
+ "FORCE": "Siła",
+ "TOUCH": "Dotyk",
+ "VALUE": "Wartość",
+ "PROXIMITY": "Bliskość",
+ "X_AXIS": "Oś X",
+ "Y_AXIS": "Oś Y"
+ },
+ "TYPE": {
+ "BUMPER": "Bumper",
+ "DPAD_UP": "D-pad w górę",
+ "DPAD_DOWN": "D-pad w dół",
+ "DPAD_LEFT": "D-pad w lewo",
+ "DPAD_RIGHT": "D-pad w prawo",
+ "JOYSTICK": "Joystick",
+ "MENU": "Menu",
+ "SHOULDER": "Boczny przycisk",
+ "SQUEEZE": "Chwyt",
+ "SYSTEM": "System",
+ "THUMBREST": "Thumbrest",
+ "THUMBSTICK": "Thumbstick",
+ "TRACKPAD": "Trackpad",
+ "TRIGGER": "Spust",
+ "VIEW": "Widok"
+ },
+ "CLICK": {
+ "ANY": "Dowolny",
+ "DOUBLE": "Podwójne kliknięcie",
+ "TRIPLE": "Potrójne kliknięcie",
+ "TYPE": "Liczba kliknięć"
+ },
+ "ACTION": {
+ "CLICK": "Kliknięcie*",
+ "GRAB": "Chwyć*",
+ "ALT_CLICK": "Własne polecenie shell exec (ustaw alt_click w konfiguracji)",
+ "SHOW_HIDE": "Pokaż, ukryj, wycentruj ponownie*",
+ "TOGGLE_DASHBOARD": "Przełącz dashboard",
+ "SPACE_DRAG": "Przesuwanie Playspace",
+ "SPACE_ROTATE": "Obrót Playspace",
+ "SPACE_RESET": "Resetowanie playspace",
+ "CLICK_MODIFIER_RIGHT": "Modyfikator prawego kliknięcia",
+ "CLICK_MODIFIER_MIDDLE": "Modyfikator środkowego kliknięcia",
+ "MOVE_MOUSE": "Ruszaj myszą (jeśli domyślnie wyłączone)",
+ "SCROLL": "Przewijanie*"
+ },
+ "LEFT": "Lewy",
+ "RIGHT": "Prawy",
+ "COMPONENT": "Typ aktywacji",
+ "SUBPATH": "Sterowanie aktywacją",
+ "THRESHOLD": "Aktywuj po przekroczeniu górnej wartości\nDezaktywuj po spadku poniżej dolnej wartości"
+ },
+ "ENABLED": "Włączone",
+ "INPUT_EMULATION_METHOD": "Metoda emulacji wejścia",
+ "INPUT_EMULATION_METHOD_HELP": "Spróbuj zmienić tę opcję w przypadku, gdy wejście myszy lub\nklawiatury nie jest rejestrowane.",
+ "INPUT_PROFILES": "Zmień klawiszologię",
+ "INPUT_PROFILES_HELP": "Przypisania przycisków kontrolera OpenXR",
+ "NOT_SUPPORTED": "Nieobsługiwane",
+ "SPACE_DRAG": "Space-drag",
+ "SPACE_GRAVITY_DAMPING": "Spowalnianie",
+ "SPACE_GRAVITY_DAMPING_HELP": "Sztuczne spowalnianie mające na celu zatrzymywanie ruchu po pewnym czasie. 0.1 - wysokie spowolnienie, 1.0 - brak spowolnienia",
+ "SPACE_GRAVITY_FLING_STRENGTH": "Siła wyrzutu",
+ "SPACE_GRAVITY_FLING_STRENGTH_HELP": "Mnożnik intensywności siły grawitacyjnego wyrzutu po użyciu funkcji space-drag.\n0.0 - brak ruchu, 2.0 - podwójna intensywność",
+ "SPACE_GRAVITY_GRAVITY": "Grawitacja",
+ "SPACE_GRAVITY_GRAVITY_HELP": "Wielkość siły działającej w dół. 0.0 - brak grawitacji",
+ "SPACE_GRAVITY_GROUND_FRICTION": "Tarcie podłoża",
+ "SPACE_GRAVITY_GROUND_FRICTION_HELP": "Moc tarcia spowalniającego Cię podczas kontaktu z podłożem.\n0.0 - brak tarcia (jak na lodzie), 1.0 - chropowata powierzchnia",
+ "SPACE_GRAVITY_FLOOR_HEIGHT": "Wysokość podłogi",
+ "SPACE_GRAVITY_FLOOR_HEIGHT_HELP": "Pozycja Y, w której znajduje się podłoga. Grawitacja przestaje działać po osiągnięciu tej wysokości.",
+ "SAVE": "Zapisz",
+ "CANCEL": "Anuluj",
+ "WHISPER": {
+ "NEED_TO_DOWNLOAD_MODEL": "Wybrany model musi zostać pobrany.\nPobrać go teraz?",
+ "REMOVE_UNUSED_MODELS": "Wyłączasz funkcję zamiany mowy na tekst.\nCzy chcesz usunąć pobrane modele Whisper, aby zwolnić miejsce?"
+ },
+ "WHISPER_MODEL": "Model mowy na tekst",
+ "WHISPER_MODEL_HELP": "Model Whisper do wykorzystania.\nWiększe modele dają dokładniejsze\nwyniki, ale zużywają więcej pamięci VRAM.",
+ "DEFAULT_OVERLAY_SCALE": "Domyślny rozmiar nakładki",
+ "DEFAULT_OVERLAY_SCALE_HELP": "Twórz nowe nakładki w tej skali.",
+ "COLOR_PALETTE": "Paleta kolorów",
+ "COLOR_PALETTES": "Palety kolorów",
+ "COLOR_PALETTE_CURRENT": "Obecnie aktywny motyw.",
+ "COLOR_PALETTE_ACTIVATE": "Kliknij, aby użyć tego motywu.",
+ "COLOR_PALETTE_HELP": "Kliknij, aby przeglądać palety kolorów.\nAby stworzyć własne, odwiedź stronę internetową!",
+ "COLOR_PALETTE_CUSTOM_URL": "Dodaj własny motyw!",
+ "COLOR_PALETTE_CUSTOM_URL2": "Kliknij, aby otworzyć instrukcję internetową.",
+ "SNAP_ANGLE_DEG": "Kąt przyciągania pochylenia i przechyłu okna",
+ "SNAP_ANGLE_DEG_HELP": "Chwycone okna przyciągają się do tego kąta na osi pochylenia i obrotu.",
+ "SAVE_PLAYSPACE_CENTER": "Zapisz centrum obszaru gry",
+ "SAVE_PLAYSPACE_CENTER_HELP": "Użyj aktualnego obszaru gry dla przypisania resetowania obszaru gry.",
+ "RESET_PLAYSPACE_CENTER": "Zresetuj środek obszaru gry",
+ "RESET_PLAYSPACE_CENTER_HELP": "Wyczyść poprzednio ustawiony środek obszaru playspace.",
+ "HANDSFREE_ALT_TAB": "Cel przełącznika aplikacji",
+ "HANDSFREE_ALT_TAB_HELP": "Przytrzymaj Super+X, wyceluj w żądane okno, a następnie puść, aby zmienić fokus.",
+ "INPUT_CAPTURE_METHOD": "Metoda przechwytywania wejścia",
+ "POINTER_ACCELERATION": "Akceleracja myszy",
+ "POINTER_ACCELERATION_HELP": "Wł.: Adaptacyjna akceleracja myszy\nWył.: Stała prędkość",
+ "POINTER_SPEED": "Prędkość myszy",
+ "INPUT_CAPTURE_METHOD_HELP": "Umożliwia korzystanie z fizycznych urządzeń peryferyjnych wewnątrz WayVR.\n Super+Z: Przełącz wejście między WayVR a rzeczywistym pulpitem\n Super+X: Przełącz między aplikacjami WayVR",
+ "SPACE_DRAG_AFFECTS_WORLD": "Space-drag przesuwa nakładki"
+ },
+ "APPLICATION_LAUNCHER": "Uruchamiacz aplikacji",
+ "APPLICATIONS": "Aplikacje",
+ "AUDIO": {
+ "AUTO_SWITCH_TO_VR_AUDIO": "Automatyczne przełączanie na dźwięk VR",
+ "CARDS": "Karty",
+ "FAILED_TO_SWITCH_MICROPHONE": "Nie udało się przełączyć mikrofon",
+ "MICROPHONE_SET_SUCCESSFULLY": "Mikrofon ustawiono pomyślnie",
+ "MICROPHONES": "Mikrofony",
+ "NO_VR_MICROPHONE_SWITCH_MANUALLY": "Brak mikrofonu VR. Włącz go ręcznie.",
+ "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "Brak głośników VR. Włącz je ręcznie.",
+ "SELECT_AUDIO_CARD_PROFILE": "Wybierz profil karty dźwiękowej",
+ "SETTINGS": "Ustawienia dźwięku",
+ "SPEAKERS": "Głośniki",
+ "SPEAKERS_SET_SUCCESSFULLY": "Głośniki ustawiono pomyślnie",
+ "VOLUME": "Głośność"
+ },
+ "GAMES": "Gry",
+ "GENERAL_SETTINGS": "Ustawienia ogólne",
+ "HEIGHT": "Wysokość",
+ "HELLO": "Witaj!",
+ "HELLO_USER": "Witaj, {USER}!",
+ "HIDE": "Ukryj",
+ "HOME_SCREEN": "Ekran główny",
+ "MONADO_RUNTIME": "Środowisko Monado",
+ "POPUP_ADD_DISPLAY": {
+ "RESOLUTION": "Rozdzielczość"
+ },
+ "REMOVE": "Usuń",
+ "SETTINGS": "Ustawienia",
+ "SHOW": "Pokaż",
+ "WIDTH": "Szerokość",
+ "FAILED_TO_LAUNCH_APPLICATION": "Nie udało się uruchomić aplikacji:",
+ "APPLICATION_STARTED": "Aplikacja uruchomiona",
+ "CLOSE_WINDOW": "Zamknij okno",
+ "GAME_LIST": {
+ "NO_GAMES_FOUND": "Nie znaleziono gier",
+ "RUNNING_GAMES_LIST": "Lista uruchomionych gier"
+ },
+ "TERMINATE_PROCESS": "Zakończ proces",
+ "GAME_LAUNCHED": "Gra uruchomiona",
+ "APP_LAUNCHER": {
+ "MODE": {
+ "NATIVE": "Tryb natywny",
+ "CAGE": "Tryb kompatybilności (Cage)"
+ },
+ "RES_TITLE": "Rozdzielczość",
+ "ASPECT_TITLE": "Proporcje",
+ "ASPECT": {
+ "WIDE": "Szeroki",
+ "SEMI_WIDE": "Półszeroki",
+ "SQUARE": "Kwadrat",
+ "SEMI_TALL": "Pół-wysoki",
+ "TALL": "Wysoki"
+ },
+ "POS_TITLE": "Pozycjonowanie",
+ "POS": {
+ "FLOATING": "Pływający",
+ "ANCHORED": "Przymocowane",
+ "STATIC": "Statyczny",
+ "FLOATING_HELP": "Porusza się niezależnie, wycentrowuje się po otwarciu.",
+ "ANCHORED_HELP": "Pozostaje nieruchoma względem centralnego znacznika.",
+ "STATIC_HELP": "Nie należy do żadnego zestawu. Nie wyśrodkowuje."
+ },
+ "AUTOSTART": "Uruchom automatycznie przy starcie",
+ "LAUNCH": "Uruchom"
+ },
+ "DISPLAY_BRIGHTNESS": "Jasność wyświetlacza",
+ "PROCESS_LIST": "Lista procesów",
+ "REFRESH": "Odśwież",
+ "PROCESS": {
+ "STOP": "Zatrzymaj",
+ "FORCE_KILL": "Wymuś zakończenie"
+ },
+ "DEBUG_INFO": "Informacje debugowania",
+ "CREATION_DATE": "Data utworzenia",
+ "DOWNLOADER": "Pobieranie",
+ "DOWNLOAD_AGAIN": "Pobierz ponownie",
+ "DOWNLOADING_FILE": "Pobieranie pliku...",
+ "GETTING_STARTED": "Rozpoczęcie",
+ "MODIFICATION_DATE": "Data modyfikacji",
+ "LOADING": "Ładowanie...",
+ "APPLY": "Zastosuj",
+ "RELOAD_FROM_DISK": "Przeładuj z dysku",
+ "TARGET_PATH": "Ścieżka docelowa",
+ "VERSION": "Wersja",
+ "DONATE": {
+ "SUPPORT_US": "Wesprzyj nas",
+ "DESCRIPTION": "Jesteśmy małym, dwuosobowym zespołem programistów, którzy tworzą WayVR w wolnym czasie. Jeśli korzystanie z tego oprogramowania sprawia Ci przyjemność, rozważ wsparcie nas – każda darowizna pomaga nam działać dalej.",
+ "BUTTON_TOOLTIP": "Przekaż darowiznę przez Open Collective",
+ "CURRENT_SUPPORTERS": "Obecni Wspierający",
+ "THANK_YOU_WAYVR": "Dziękujemy od zespołu WayVR!"
+ },
+ "WELCOME": {
+ "ALL_SET": "Wszystko gotowe!",
+ "BASICS": "Te podstawowe informacje pozwolą Ci z łatwością zacząć korzystać z WayVR.",
+ "FEATURES_DOCUMENTATION": "Istnieje wiele innych funkcji, które warto spersonalizować. Aby uzyskać więcej informacji, sprawdź dokumentację pod adresem:",
+ "FINISH_TUTORIAL": "Zakończ samouczek",
+ "GRAB_BOTH_HANDS": "Chwyć to obiema rękami, jeśli chcesz przenieść konkretny overlay ze swojego zestawu.",
+ "GRAB_ONE_HAND": "Chwyć to jedną ręką, aby przemieścić swój zestaw.",
+ "GREETING": "Cześć!",
+ "GUIDE_INTRO": "Pozwól nam przeprowadzić Cię przez Twoje pierwsze kroki.",
+ "LASER_COLORS": "Kolory lasera",
+ "LASER_FUNCTIONALITY": "Wiele funkcji w WayVR zależy od koloru lasera używanego do interakcji z elementami interfejsu użytkownika. Nie musisz naciskać tych przycisków, wystarczy je dotknąć!",
+ "LAST_PAGE_INFO": "Ten samouczek przestanie się pojawiać po dotarciu do ostatniej strony.",
+ "LOOK_AT_LEFT_WRIST": "Spójrz na swój lewy nadgarstek. To jest Twój watch.",
+ "MIDDLE_CLICK_MODE_PURPLE_LASER": "— Tryb środkowego przycisku: Fioletowy laser",
+ "MOVING_YOUR_SET": "Przesuwanie Twojego zestawu",
+ "NEXT_BUTTON": "Naciśnij poniższy przycisk „Dalej”, aby rozpocząć.",
+ "REGULAR_MODE_BLUE_LASER": "— Tryb regularny: Niebieski laser",
+ "REPOSITION_THIS_WINDOW_BY_GRABBING": "Zmień położenie tego okna, używając przycisku chwytu (grip) na kontrolerze.",
+ "RIGHT_CLICK_MODE_ORANGE_LASER": "— Tryb prawego przycisku: Pomarańczowy laser",
+ "THANKS_FOR_INSTALLING": "Dziękujemy za zainstalowanie WayVR!",
+ "WATCH": "Watch",
+ "WORKING_SET": "Aktywny zestaw",
+ "DOUBLE_PRESS_TO_TOGGLE": "Naciśnij dwukrotnie przycisk B (na Index) lub Y (na Meta), aby wyświetlić, wycentrować lub ukryć swój zestaw. Wypróbuj to teraz.",
+ "CENTER_MARKER": "Znacznik środka to punkt, który pojawi się przed Tobą podczas centrowania. Umieść wokół niego nakładki!"
+ },
+ "DOWNLOAD": "Pobierz",
+ "SAVED_TO_FAVOURITES": "Dodano do ulubionych",
+ "ADD_TO_FAVOURITES": "Dodaj do ulubionych",
+ "ADD_TO_FAVOURITES_HINT": "Zapisz ustawienie i przypnij je do szuflady aplikacji",
+ "REMOVE_FROM_FAVOURITES": "Usuń z ulubionych",
+ "EMPTY": "Puste",
+ "PINNED_APPS": "Przypięte aplikacje"
+}
diff --git a/dash-frontend/assets/lang/zh_CN.json b/dash-frontend/assets/lang/zh_CN.json
index 915487e2..a9437312 100644
--- a/dash-frontend/assets/lang/zh_CN.json
+++ b/dash-frontend/assets/lang/zh_CN.json
@@ -1,166 +1,331 @@
{
- "ACTIONS": {
- "RECENTER_PLAYSPACE": "重置游玩区中心"
- },
- "APP_LAUNCHER": {
- "ASPECT": {
- "SEMI_TALL": "略高",
- "SEMI_WIDE": "略宽",
- "SQUARE": "正方形",
- "TALL": "高",
- "WIDE": "宽"
- },
- "ASPECT_TITLE": "比例",
- "AUTOSTART": "启动时自动运行",
- "LAUNCH": "启动",
- "MODE": {
- "CAGE": "兼容模式 (Cage)",
- "NATIVE": "原生模式"
- },
- "POS": {
- "ANCHORED": "锚定",
- "ANCHORED_HELP": "相对于中心标记保持固定。",
- "FLOATING": "悬浮",
- "FLOATING_HELP": "独立移动,显示时自动重置中心。",
- "STATIC": "静态",
- "STATIC_HELP": "不属于任何集合。不会重置中心。"
- },
- "POS_TITLE": "定位",
- "RES_TITLE": "分辨率"
- },
- "APP_SETTINGS": {
- "ALLOW_SLIDING": "抓取时允许摇杆交互",
- "ANIMATION_SPEED": "UI 动画速度",
- "BLOCK_GAME_INPUT": "屏蔽游戏输入",
- "BLOCK_GAME_INPUT_HELP": "悬停在覆盖层上时屏蔽所有输入",
- "BLOCK_GAME_INPUT_IGNORE_WATCH": "屏蔽输入时忽略手表",
- "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "悬停在手表上时不屏蔽输入",
- "CAPTURE_METHOD": "Wayland 屏幕采集",
- "CAPTURE_METHOD_HELP": "如果您遇到黑屏或花屏,请尝试更改此项",
- "CLEAR_PIPEWIRE_TOKENS": "清除 PipeWire 令牌",
- "CLEAR_PIPEWIRE_TOKENS_HELP": "下次启动时提示选择屏幕",
- "CLEAR_SAVED_STATE": "清除保存的状态",
- "CLEAR_SAVED_STATE_HELP": "重置集合与覆盖层位置",
- "CLICK_FREEZE_TIME_MS": "点击冻结时间 (毫秒)",
- "CLICK_FREEZE_TIME_MS_HELP": "有助于提高双击精度",
- "CLOCK_12H": "12 小时制时钟",
- "CONTROLS": "控制",
- "DELETE_ALL_CONFIGS": "擦除配置",
- "DELETE_ALL_CONFIGS_HELP": "从 conf.d 中删除所有配置文件",
- "DOUBLE_CURSOR_FIX": "双光标修复",
- "DOUBLE_CURSOR_FIX_HELP": "如果您看到两个光标,请启用此项",
- "FEATURES": "功能",
- "FOCUS_FOLLOWS_MOUSE_MODE": "触摸扳机时移动鼠标",
- "HIDE_GRAB_HELP": "隐藏抓取帮助",
- "HIDE_USERNAME": "隐藏用户名",
- "INVERT_SCROLL_DIRECTION_X": "反转水平滚动方向",
- "INVERT_SCROLL_DIRECTION_Y": "反转垂直滚动方向",
- "KEYBOARD_MIDDLE_CLICK": "键盘中键点击",
- "KEYBOARD_MIDDLE_CLICK_HELP": "使用紫色激光打字时的修饰键",
- "KEYBOARD_SOUND_ENABLED": "键盘音效",
- "LEFT_HANDED_MOUSE": "左手鼠标",
- "LEFT_HANDED_MOUSE_HELP": "如果鼠标按钮反置,请使用此项",
- "LONG_PRESS_DURATION": "长按持续时间",
- "LOOK_AND_FEEL": "外观与体验",
- "MISC": "杂项",
- "NOTIFICATIONS_ENABLED": "启用通知",
- "NOTIFICATIONS_SOUND_ENABLED": "通知音效",
- "OPAQUE_BACKGROUND": "不透明背景",
- "OPTION": {
- "AUTO": "自动",
- "AUTO_HELP": "如果支持,则使用 ScreenCopy GPU,\n否则使用 PipeWire GPU。",
- "PIPEWIRE_HELP": "快速 GPU 采集,\n所有桌面环境的标准方式。",
- "PW_FALLBACK_HELP": "高 CPU 占用的慢速方法。\n在 PipeWire GPU 不起作用时尝试。",
- "SCREENCOPY_GPU_HELP": "快速,无屏幕共享弹窗。\n支持:Hyprland, Niri, River, Sway",
- "SCREENCOPY_HELP": "慢速,无屏幕共享弹窗。\n支持:Hyprland, Niri, River, Sway",
- "NONE": "无",
- "HMD_PINCH": "HMD + 捏合",
- "EYE_PINCH": "眼睛 + 捏合",
- "EYE_ONLY": "仅眼球",
- "HMD_ONLY": "仅限头显"
- },
- "POINTER_LERP_FACTOR": "指针平滑",
- "RESTART_SOFTWARE": "重启软件",
- "RESTART_SOFTWARE_HELP": "应用需要重启的设置",
- "ROUND_MULTIPLIER": "UI 边缘圆角",
- "SCREEN_RENDER_DOWN": "以较低分辨率渲染屏幕",
- "SCREEN_RENDER_DOWN_HELP": "有助于解决高分辨率屏幕的锯齿问题",
- "SCROLL_SPEED": "滚动速度",
- "SETS_ON_WATCH": "在手表上显示集合",
- "SPACE_DRAG_MULTIPLIER": "空间拖拽倍率",
- "SPACE_DRAG_UNLOCKED": "允许在所有轴上进行空间拖拽",
- "SPACE_ROTATE_UNLOCKED": "允许在所有轴上进行空间旋转",
- "TROUBLESHOOTING": "故障排除",
- "UPRIGHT_SCREEN_FIX": "垂直屏幕修复",
- "UPRIGHT_SCREEN_FIX_HELP": "修复某些桌面上的垂直屏幕问题",
- "USE_PASSTHROUGH": "启用穿透",
- "USE_PASSTHROUGH_HELP": "如果 XR 运行时支持,则允许穿透",
- "USE_SKYBOX": "启用天空盒",
- "USE_SKYBOX_HELP": "如果没有场景应用或穿透,则显示天空盒",
- "XR_CLICK_SENSITIVITY": "XR 点击灵敏度",
- "XR_CLICK_SENSITIVITY_HELP": "模拟扳机灵敏度",
- "XR_CLICK_SENSITIVITY_RELEASE": "XR 释放灵敏度",
- "XR_CLICK_SENSITIVITY_RELEASE_HELP": "必须低于点击灵敏度",
- "XWAYLAND_BY_DEFAULT": "默认以兼容模式运行应用",
- "AUTOSTART_APPS": "开机启动应用",
- "HANDSFREE_POINTER": "免提模式",
- "HANDSFREE_POINTER_HELP": "当运动控制器不可用时使用的输入。\n左手捏合为抓取,右手为点击。",
- "UI_GRADIENT_INTENSITY": "UI 渐变强度",
- "RESET_PLAYSPACE": "重置游戏空间",
- "RESET_PLAYSPACE_HELP": "清除舞台空间偏移。",
- "BLOCK_POSES_ON_KBD_INTERACTION": "与键盘交互时阻止姿势",
- "BLOCK_POSES_ON_KBD_INTERACTION_HELP": "当键盘悬停且启用“阻止游戏输入”时,阻止游戏接收姿势",
- "LANGUAGE": "语言",
- "REQUIRES_RESTART": "需要重启",
- "GRID_OPACITY": "地面网格不透明度",
- "GRID_OPACITY_HELP": "启用天空盒时地板网格的不透明度"
- },
- "APPLICATION_LAUNCHER": "应用启动器",
- "APPLICATION_STARTED": "应用已启动",
- "APPLICATIONS": "应用",
- "AUDIO": {
- "AUTO_SWITCH_TO_VR_AUDIO": "自动切换到 VR 音频",
- "CARDS": "声卡",
- "FAILED_TO_SWITCH_MICROPHONE": "切换麦克风失败",
- "MICROPHONE_SET_SUCCESSFULLY": "麦克风设置成功",
- "MICROPHONES": "麦克风",
- "NO_VR_MICROPHONE_SWITCH_MANUALLY": "未找到 VR 麦克风。请手动切换。",
- "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "未找到 VR 扬声器。请手动切换。",
- "SELECT_AUDIO_CARD_PROFILE": "选择声卡配置",
- "SETTINGS": "音频设置",
- "SPEAKERS": "扬声器",
- "SPEAKERS_SET_SUCCESSFULLY": "扬声器设置成功",
- "VOLUME": "音量"
- },
- "CLOSE_WINDOW": "关闭窗口",
- "DISPLAY_BRIGHTNESS": "显示亮度",
- "FAILED_TO_LAUNCH_APPLICATION": "启动应用失败:",
- "GAME_LAUNCHED": "游戏已启动",
- "GAME_LIST": {
- "NO_GAMES_FOUND": "未找到游戏",
- "RUNNING_GAMES_LIST": "正在运行的游戏列表"
- },
- "GAMES": "游戏",
- "GENERAL_SETTINGS": "通用设置",
- "HEIGHT": "高度",
- "HELLO": "你好!",
- "HELLO_USER": "你好,{USER}!",
- "HIDE": "隐藏",
- "HOME_SCREEN": "主页",
- "MONADO_RUNTIME": "Monado 运行时",
- "POPUP_ADD_DISPLAY": {
- "RESOLUTION": "分辨率"
- },
- "REMOVE": "移除",
- "SETTINGS": "设置",
- "SHOW": "显示",
- "TERMINATE_PROCESS": "终止进程",
- "WIDTH": "宽度",
- "PROCESS_LIST": "进程列表",
- "REFRESH": "刷新",
- "PROCESS": {
- "STOP": "停止",
- "FORCE_KILL": "强制关闭"
- },
- "DEBUG_INFO": "调试信息"
-}
\ No newline at end of file
+ "ACTIONS": {
+ "RECENTER_PLAYSPACE": "重置游玩区中心"
+ },
+ "APP_LAUNCHER": {
+ "ASPECT": {
+ "SEMI_TALL": "略高",
+ "SEMI_WIDE": "略宽",
+ "SQUARE": "正方形",
+ "TALL": "高",
+ "WIDE": "宽"
+ },
+ "ASPECT_TITLE": "比例",
+ "AUTOSTART": "启动时自动运行",
+ "LAUNCH": "启动",
+ "MODE": {
+ "CAGE": "兼容模式 (Cage)",
+ "NATIVE": "原生模式"
+ },
+ "POS": {
+ "ANCHORED": "锚定",
+ "ANCHORED_HELP": "相对于中心标记保持固定。",
+ "FLOATING": "悬浮",
+ "FLOATING_HELP": "独立移动,显示时自动重置中心。",
+ "STATIC": "静态",
+ "STATIC_HELP": "不属于任何集合。不会重置中心。"
+ },
+ "POS_TITLE": "定位",
+ "RES_TITLE": "分辨率"
+ },
+ "APP_SETTINGS": {
+ "ALLOW_SLIDING": "抓取时允许摇杆交互",
+ "ANIMATION_SPEED": "UI 动画速度",
+ "BLOCK_GAME_INPUT": "屏蔽游戏输入",
+ "BLOCK_GAME_INPUT_HELP": "悬停在覆盖层上时屏蔽所有输入",
+ "BLOCK_GAME_INPUT_IGNORE_WATCH": "屏蔽输入时忽略手表",
+ "BLOCK_GAME_INPUT_IGNORE_WATCH_HELP": "悬停在手表上时不屏蔽输入",
+ "CAPTURE_METHOD": "Wayland 屏幕采集",
+ "CAPTURE_METHOD_HELP": "如果您遇到黑屏或花屏,请尝试更改此项",
+ "CLEAR_PIPEWIRE_TOKENS": "清除 PipeWire 令牌",
+ "CLEAR_PIPEWIRE_TOKENS_HELP": "下次启动时提示选择屏幕",
+ "CLEAR_SAVED_STATE": "清除保存的状态",
+ "CLEAR_SAVED_STATE_HELP": "重置集合与覆盖层位置",
+ "CLICK_FREEZE_TIME_MS": "点击冻结时间 (毫秒)",
+ "CLICK_FREEZE_TIME_MS_HELP": "有助于提高双击精度",
+ "CLOCK_12H": "12 小时制时钟",
+ "CONTROLS": "控制",
+ "DELETE_ALL_CONFIGS": "擦除配置",
+ "DELETE_ALL_CONFIGS_HELP": "从 conf.d 中删除所有配置文件",
+ "DOUBLE_CURSOR_FIX": "双光标修复",
+ "DOUBLE_CURSOR_FIX_HELP": "如果您看到两个光标,请启用此项",
+ "FEATURES": "功能",
+ "FOCUS_FOLLOWS_MOUSE_MODE": "触摸扳机时移动鼠标",
+ "HIDE_GRAB_HELP": "隐藏抓取帮助",
+ "HIDE_USERNAME": "隐藏用户名",
+ "INVERT_SCROLL_DIRECTION_X": "反转水平滚动方向",
+ "INVERT_SCROLL_DIRECTION_Y": "反转垂直滚动方向",
+ "KEYBOARD_MIDDLE_CLICK": "键盘中键点击",
+ "KEYBOARD_MIDDLE_CLICK_HELP": "使用紫色激光打字时的修饰键",
+ "KEYBOARD_SOUND_ENABLED": "键盘音效",
+ "LEFT_HANDED_MOUSE": "左手鼠标",
+ "LEFT_HANDED_MOUSE_HELP": "如果鼠标按钮反置,请使用此项",
+ "LONG_PRESS_DURATION": "长按持续时间",
+ "LOOK_AND_FEEL": "外观与体验",
+ "MISC": "杂项",
+ "NOTIFICATIONS_ENABLED": "启用通知",
+ "NOTIFICATIONS_SOUND_ENABLED": "通知音效",
+ "OPAQUE_BACKGROUND": "不透明背景",
+ "OPTION": {
+ "AUTO": "自动",
+ "AUTO_HELP": "如果支持,则使用 ScreenCopy GPU,\n否则使用 PipeWire GPU。",
+ "PIPEWIRE_HELP": "快速 GPU 采集,\n所有桌面环境的标准方式。",
+ "PW_FALLBACK_HELP": "高 CPU 占用的慢速方法。\n在 PipeWire GPU 不起作用时尝试。",
+ "SCREENCOPY_GPU_HELP": "快速,无屏幕共享弹窗。\n支持:Hyprland, Niri, River, Sway",
+ "SCREENCOPY_HELP": "慢速,无屏幕共享弹窗。\n支持:Hyprland, Niri, River, Sway",
+ "NONE": "无",
+ "HMD_PINCH": "HMD + 捏合",
+ "EYE_PINCH": "眼睛 + 捏合",
+ "NONE_INPUT_HELP": "不模拟鼠标和键盘。\n将无法与屏幕进行交互。",
+ "UINPUT": "设备模拟",
+ "WL_VIRTUAL": "Wayland 虚拟输入",
+ "WL_VIRTUAL_HELP": "使用 zwlr_virtual_pointer 和 zwp_virtual_keyboard 向 Wayland 合成器发送事件。\n仅在部分桌面环境下能可靠工作。\n在 KDE、GNOME 或 COSMIC 上无法工作。",
+ "EYE_ONLY": "眼部激光",
+ "HMD_ONLY": "HMD 激光指针",
+ "NONE_INPUT_CAPTURE_HELP": "不捕捉鼠标和键盘。\n在 WayVR 中启动的应用里将无法\n使用物理鼠标或键盘。",
+ "UINPUT_HELP": "使用 uinput 模块来模拟设备。\n已知在大多数桌面环境下运行良好。",
+ "EVDEV_HELP": "独占使用输入设备。\n您的用户必须在 input 组中。"
+ },
+ "POINTER_LERP_FACTOR": "指针平滑",
+ "RESTART_SOFTWARE": "重启软件",
+ "RESTART_SOFTWARE_HELP": "应用需要重启的设置",
+ "ROUND_MULTIPLIER": "UI 边缘圆角",
+ "SCREEN_RENDER_DOWN": "以较低分辨率渲染屏幕",
+ "SCREEN_RENDER_DOWN_HELP": "有助于解决高分辨率屏幕的锯齿问题",
+ "SCROLL_SPEED": "滚动速度",
+ "SETS_ON_WATCH": "在手表上显示集合",
+ "SPACE_DRAG_MULTIPLIER": "空间拖拽倍率",
+ "SPACE_DRAG_UNLOCKED": "允许在所有轴上进行空间拖拽",
+ "SPACE_ROTATE_UNLOCKED": "允许在所有轴上进行空间旋转",
+ "TROUBLESHOOTING": "故障排除",
+ "UPRIGHT_SCREEN_FIX": "垂直屏幕修复",
+ "UPRIGHT_SCREEN_FIX_HELP": "修复某些桌面上的垂直屏幕问题",
+ "USE_PASSTHROUGH": "启用穿透",
+ "USE_PASSTHROUGH_HELP": "如果 XR 运行时支持,则允许穿透",
+ "USE_SKYBOX": "启用天空盒",
+ "USE_SKYBOX_HELP": "如果没有场景应用或穿透,则显示天空盒",
+ "XWAYLAND_BY_DEFAULT": "默认以兼容模式运行应用",
+ "AUTOSTART_APPS": "开机启动应用",
+ "HANDSFREE_POINTER": "免提模式",
+ "HANDSFREE_POINTER_HELP": "当运动控制器不可用时使用的输入。\n左手捏合为抓取,右手为点击。",
+ "UI_GRADIENT_INTENSITY": "UI 渐变强度",
+ "RESET_PLAYSPACE": "重置游戏空间",
+ "RESET_PLAYSPACE_HELP": "清除舞台空间偏移。",
+ "BLOCK_POSES_ON_KBD_INTERACTION": "与键盘交互时阻止姿势",
+ "BLOCK_POSES_ON_KBD_INTERACTION_HELP": "当键盘悬停且启用“阻止游戏输入”时,阻止游戏接收姿势",
+ "LANGUAGE": "语言",
+ "REQUIRES_RESTART": "需要重启",
+ "GRID_OPACITY": "地面网格不透明度",
+ "GRID_OPACITY_HELP": "启用天空盒时地板网格的不透明度",
+ "BROWSE_ONLINE_CATALOG": "浏览在线目录...",
+ "BROWSE_SKYMAPS": "浏览 Skymaps",
+ "COLOR_KEYING": "颜色键控",
+ "NO_SKYMAPS_FOUND": "未找到 Skymaps",
+ "SELECT_VARIANT": "选择变体",
+ "SHOW_WELCOME_SCREEN": "显示欢迎屏幕",
+ "SKYBOX": "Skybox",
+ "SKYMAP_ALREADY_DOWNLOADED": "此 Skymap 已下载。请选择所需操作。",
+ "WATCH_VIEW_ANGLE": "Watch 视角角度",
+ "WATCH_VIEW_ANGLE_HELP": "控制表盘的淡出方式",
+ "BINDINGS": {
+ "COMP": {
+ "CLICK": "点击",
+ "FORCE": "力度",
+ "TOUCH": "触摸",
+ "VALUE": "值",
+ "PROXIMITY": "临近度",
+ "X_AXIS": "X 轴",
+ "Y_AXIS": "Y 轴"
+ },
+ "TYPE": {
+ "BUMPER": "侧键",
+ "DPAD_UP": "方向键上",
+ "DPAD_DOWN": "方向键下",
+ "DPAD_LEFT": "方向键左",
+ "DPAD_RIGHT": "方向键右",
+ "JOYSTICK": "摇杆",
+ "MENU": "菜单",
+ "SHOULDER": "肩键",
+ "SQUEEZE": "抓取",
+ "SYSTEM": "系统",
+ "THUMBREST": "拇指托",
+ "THUMBSTICK": "摇杆",
+ "TRACKPAD": "触控板",
+ "TRIGGER": "扳机键",
+ "VIEW": "视图"
+ },
+ "CLICK": {
+ "ANY": "任意",
+ "DOUBLE": "双击",
+ "TRIPLE": "三击",
+ "TYPE": "点击次数"
+ },
+ "ACTION": {
+ "CLICK": "点击*",
+ "GRAB": "抓取*",
+ "ALT_CLICK": "自定义 Shell 执行 (在配置中设置 alt_click)",
+ "SHOW_HIDE": "显示、隐藏、重新中心化*",
+ "TOGGLE_DASHBOARD": "切换控制面板",
+ "SPACE_DRAG": "Playspace 拖拽",
+ "SPACE_ROTATE": "Playspace 旋转",
+ "SPACE_RESET": "Playspace 重置",
+ "CLICK_MODIFIER_RIGHT": "右键修饰键",
+ "CLICK_MODIFIER_MIDDLE": "中键修饰键",
+ "MOVE_MOUSE": "移动鼠标 (如果默认关闭)",
+ "SCROLL": "滚动*"
+ },
+ "LEFT": "左侧",
+ "RIGHT": "右",
+ "COMPONENT": "触发类型",
+ "SUBPATH": "动作控制",
+ "THRESHOLD": "高于上限值时激活\n低于下限值时停用"
+ },
+ "ENABLED": "已启用",
+ "INPUT_EMULATION_METHOD": "输入仿真方法",
+ "INPUT_EMULATION_METHOD_HELP": "如果鼠标或键盘输入未被识别,请尝试更改此设置。",
+ "INPUT_PROFILES": "更改输入绑定",
+ "INPUT_PROFILES_HELP": "OpenXR 控制器输入绑定",
+ "NOT_SUPPORTED": "不支持",
+ "ENABLE_WATCH": "启用手表",
+ "SPACE_DRAG": "空间拖拽",
+ "SPACE_GRAVITY_DAMPING": "阻尼",
+ "SPACE_GRAVITY_DAMPING_HELP": "用于减缓移动速度的人造阻力。0.1 - 高阻力,1.0 - 无阻力",
+ "SPACE_GRAVITY_FLING_STRENGTH": "投掷力度",
+ "SPACE_GRAVITY_FLING_STRENGTH_HELP": "Space-drag 后的重力发射力强度倍数。\n0.0 - 完全没有位移,2.0 - 双倍强度",
+ "SPACE_GRAVITY_GRAVITY": "重力",
+ "SPACE_GRAVITY_GRAVITY_HELP": "向下作用的力的大小。0.0 - 无重力",
+ "SPACE_GRAVITY_GROUND_FRICTION": "地面摩擦力",
+ "SPACE_GRAVITY_GROUND_FRICTION_HELP": "如果你接触地面时,减慢你移动速度的摩擦力大小。\n0.0 - 无摩擦(就像在冰面上一样),1.0 - 粗糙表面",
+ "SPACE_GRAVITY_FLOOR_HEIGHT": "地面高度",
+ "SPACE_GRAVITY_FLOOR_HEIGHT_HELP": "地面所在 Y 轴位置。达到该高度时重力停止。",
+ "SAVE": "保存",
+ "CANCEL": "取消",
+ "WHISPER": {
+ "NEED_TO_DOWNLOAD_MODEL": "所选模型需要下载。\n现在开始下载吗?",
+ "REMOVE_UNUSED_MODELS": "您正在关闭语音转文本功能。\n是否删除已下载的 Whisper 模型以释放空间?"
+ },
+ "WHISPER_MODEL": "语音转文本模型",
+ "WHISPER_MODEL_HELP": "要使用的 Whisper 模型。\n模型越大,结果越准确,\n但消耗的显存 (VRAM) 越多。",
+ "DEFAULT_OVERLAY_SCALE": "默认叠加层大小",
+ "DEFAULT_OVERLAY_SCALE_HELP": "以该比例生成新的叠加层。",
+ "COLOR_PALETTE": "调色板",
+ "COLOR_PALETTES": "配色方案",
+ "COLOR_PALETTE_CURRENT": "当前激活的主题。",
+ "COLOR_PALETTE_ACTIVATE": "点击以使用此主题。",
+ "COLOR_PALETTE_HELP": "点击浏览配色方案。\n如需创建自定义配色,请参阅网站!",
+ "COLOR_PALETTE_CUSTOM_URL": "添加自定义主题!",
+ "COLOR_PALETTE_CUSTOM_URL2": "点击打开网页版手册。",
+ "SNAP_ANGLE_DEG": "窗口俯仰与翻滚捕捉角度",
+ "SNAP_ANGLE_DEG_HELP": "抓取的窗口在俯仰轴和翻滚轴上将对齐到此角度。",
+ "SAVE_PLAYSPACE_CENTER": "保存 Playspace 中心",
+ "SAVE_PLAYSPACE_CENTER_HELP": "将当前活动空间用于重置活动空间的绑定。",
+ "RESET_PLAYSPACE_CENTER": "重置游玩区域中心",
+ "RESET_PLAYSPACE_CENTER_HELP": "清除之前设置的 Playspace 中心。",
+ "HANDSFREE_ALT_TAB": "应用切换瞄准点",
+ "HANDSFREE_ALT_TAB_HELP": "按住 Super+X,对准目标窗口,然后松开以切换焦点。",
+ "INPUT_CAPTURE_METHOD": "输入捕获方式",
+ "POINTER_ACCELERATION": "鼠标加速",
+ "POINTER_ACCELERATION_HELP": "开启:自适应鼠标加速\n关闭:恒定速度",
+ "POINTER_SPEED": "鼠标速度",
+ "INPUT_CAPTURE_METHOD_HELP": "允许在 WayVR 中使用物理外设。\n Super+Z: 在 WayVR 和真实桌面之间切换输入\n Super+X: 在 WayVR 应用之间切换",
+ "SPACE_DRAG_AFFECTS_WORLD": "空间拖拽移动覆盖层"
+ },
+ "APPLICATION_LAUNCHER": "应用启动器",
+ "APPLICATION_STARTED": "应用已启动",
+ "APPLICATIONS": "应用",
+ "AUDIO": {
+ "AUTO_SWITCH_TO_VR_AUDIO": "自动切换到 VR 音频",
+ "CARDS": "声卡",
+ "FAILED_TO_SWITCH_MICROPHONE": "切换麦克风失败",
+ "MICROPHONE_SET_SUCCESSFULLY": "麦克风设置成功",
+ "MICROPHONES": "麦克风",
+ "NO_VR_MICROPHONE_SWITCH_MANUALLY": "未找到 VR 麦克风。请手动切换。",
+ "NO_VR_SPEAKERS_FOUND_SWITCH_MANUALLY": "未找到 VR 扬声器。请手动切换。",
+ "SELECT_AUDIO_CARD_PROFILE": "选择声卡配置",
+ "SETTINGS": "音频设置",
+ "SPEAKERS": "扬声器",
+ "SPEAKERS_SET_SUCCESSFULLY": "扬声器设置成功",
+ "VOLUME": "音量"
+ },
+ "CLOSE_WINDOW": "关闭窗口",
+ "DISPLAY_BRIGHTNESS": "显示亮度",
+ "FAILED_TO_LAUNCH_APPLICATION": "启动应用失败:",
+ "GAME_LAUNCHED": "游戏已启动",
+ "GAME_LIST": {
+ "NO_GAMES_FOUND": "未找到游戏",
+ "RUNNING_GAMES_LIST": "正在运行的游戏列表"
+ },
+ "GAMES": "游戏",
+ "GENERAL_SETTINGS": "通用设置",
+ "HEIGHT": "高度",
+ "HELLO": "你好!",
+ "HELLO_USER": "你好,{USER}!",
+ "HIDE": "隐藏",
+ "HOME_SCREEN": "主页",
+ "MONADO_RUNTIME": "Monado 运行时",
+ "POPUP_ADD_DISPLAY": {
+ "RESOLUTION": "分辨率"
+ },
+ "REMOVE": "移除",
+ "SETTINGS": "设置",
+ "SHOW": "显示",
+ "TERMINATE_PROCESS": "终止进程",
+ "WIDTH": "宽度",
+ "PROCESS_LIST": "进程列表",
+ "REFRESH": "刷新",
+ "PROCESS": {
+ "STOP": "停止",
+ "FORCE_KILL": "强制关闭"
+ },
+ "DEBUG_INFO": "调试信息",
+ "CREATION_DATE": "创建日期",
+ "DOWNLOADER": "下载器",
+ "DOWNLOAD_AGAIN": "重新下载",
+ "DOWNLOADING_FILE": "正在下载文件...",
+ "GETTING_STARTED": "入门指南",
+ "MODIFICATION_DATE": "修改日期",
+ "LOADING": "正在加载...",
+ "APPLY": "应用",
+ "RELOAD_FROM_DISK": "从磁盘重新加载",
+ "TARGET_PATH": "目标路径",
+ "VERSION": "版本",
+ "DONATE": {
+ "SUPPORT_US": "支持我们",
+ "DESCRIPTION": "我们是一个由 2 名开发者组成的精简团队,在业余时间开发 WayVR。如果您喜欢这款软件,请考虑支持我们 —— 每一次捐赠都能帮助我们继续开发下去。",
+ "BUTTON_TOOLTIP": "通过 Open Collective 捐赠",
+ "CURRENT_SUPPORTERS": "当前支持者",
+ "THANK_YOU_WAYVR": "WayVR 团队向您表示感谢!"
+ },
+ "WELCOME": {
+ "ALL_SET": "你已准备就绪!",
+ "BASICS": "这些基础知识将帮助您轻松开始使用 WayVR。",
+ "FEATURES_DOCUMENTATION": "还有许多其他值得自定义的功能。欲了解更多信息,请查看文档:",
+ "FINISH_TUTORIAL": "完成教程",
+ "GRAB_BOTH_HANDS": "如果你想移动 Set 中的特定叠加层,请用双手抓取。",
+ "GRAB_ONE_HAND": "用一只手抓取即可移动你的 Set。",
+ "GREETING": "你好!",
+ "GUIDE_INTRO": "让我们引导你完成初步设置。",
+ "LASER_COLORS": "激光颜色",
+ "LASER_FUNCTIONALITY": "WayVR 中的许多功能都取决于使用何种颜色的激光来与 UI 元素进行交互。您不需要按下这些按钮,只需触摸它们即可!",
+ "LAST_PAGE_INFO": "一旦你到达最后一页,此教程将不再显示。",
+ "LOOK_AT_LEFT_WRIST": "看向你的左手腕。那就是你的手表。",
+ "MIDDLE_CLICK_MODE_PURPLE_LASER": "— 中键模式:紫色激光",
+ "MOVING_YOUR_SET": "正在移动您的 Set",
+ "NEXT_BUTTON": "按下下方的“下一步”按钮以开始。",
+ "REGULAR_MODE_BLUE_LASER": "— 普通模式:蓝色激光",
+ "REPOSITION_THIS_WINDOW_BY_GRABBING": "使用控制器的抓取操作重新定位此窗口。",
+ "RIGHT_CLICK_MODE_ORANGE_LASER": "— 右键模式:橙色激光",
+ "THANKS_FOR_INSTALLING": "感谢安装 WayVR!",
+ "WATCH": "Watch",
+ "WORKING_SET": "工作集",
+ "DOUBLE_PRESS_TO_TOGGLE": "双击 B 键 (Index) 或 Y 键 (Meta) 以显示、重新居中或隐藏您的集合。现在就试一下吧。",
+ "CENTER_MARKER": "中心标记是重新居中时出现在你面前的标志。请将覆盖层放置在它周围!"
+ },
+ "DOWNLOAD": "下载",
+ "SAVED_TO_FAVOURITES": "已保存至收藏夹",
+ "ADD_TO_FAVOURITES": "添加到收藏",
+ "ADD_TO_FAVOURITES_HINT": "保存预设并将其固定到应用抽屉",
+ "REMOVE_FROM_FAVOURITES": "从收藏中移除",
+ "EMPTY": "空",
+ "PINNED_APPS": "已固定应用程序"
+}
diff --git a/dash-frontend/assets/sound/save.mp3 b/dash-frontend/assets/sound/save.mp3
new file mode 100644
index 00000000..dc365b10
Binary files /dev/null and b/dash-frontend/assets/sound/save.mp3 differ
diff --git a/dash-frontend/assets/video/onboarding_center_marker.ivf b/dash-frontend/assets/video/onboarding_center_marker.ivf
new file mode 100644
index 00000000..300c0be0
Binary files /dev/null and b/dash-frontend/assets/video/onboarding_center_marker.ivf differ
diff --git a/dash-frontend/assets/video/onboarding_double_press.ivf b/dash-frontend/assets/video/onboarding_double_press.ivf
new file mode 100644
index 00000000..724cefc3
Binary files /dev/null and b/dash-frontend/assets/video/onboarding_double_press.ivf differ
diff --git a/dash-frontend/assets/video/onboarding_laser_colors.ivf b/dash-frontend/assets/video/onboarding_laser_colors.ivf
new file mode 100644
index 00000000..750ede45
Binary files /dev/null and b/dash-frontend/assets/video/onboarding_laser_colors.ivf differ
diff --git a/dash-frontend/assets/video/onboarding_watch.ivf b/dash-frontend/assets/video/onboarding_watch.ivf
new file mode 100644
index 00000000..24e8e2ed
Binary files /dev/null and b/dash-frontend/assets/video/onboarding_watch.ivf differ
diff --git a/dash-frontend/src/frontend.rs b/dash-frontend/src/frontend.rs
index 18f1d579..7be4bd61 100644
--- a/dash-frontend/src/frontend.rs
+++ b/dash-frontend/src/frontend.rs
@@ -2,15 +2,18 @@ use std::{path::PathBuf, rc::Rc};
use chrono::Timelike;
use glam::Vec2;
+use strum::EnumCount;
use wgui::{
assets::{AssetPath, AssetProvider},
components::button::ComponentButton,
+ event::{CallbackDataCommon, StyleSetRequest},
font_config::WguiFontConfig,
globals::WguiGlobals,
i18n::Translation,
- layout::{Layout, LayoutParams, LayoutUpdateParams, LayoutUpdateResult, WidgetID},
+ layout::{Layout, LayoutParams, LayoutTask, LayoutUpdateParams, LayoutUpdateResult, WidgetID},
parser::{Fetchable, ParseDocumentParams, ParserState},
renderer_vk::text::custom_glyph::CustomGlyphData,
+ taffy::{self},
task::Tasks,
theme::WguiTheme,
widget::{label::WidgetLabel, rectangle::WidgetRectangle, sprite::WidgetSprite},
@@ -19,16 +22,20 @@ use wgui::{
use wlx_common::{
async_executor::AsyncExecutor,
audio,
- dash_interface::{BoxDashInterface, RecenterMode},
+ dash_interface::{BoxDashInterface, ConfigChangeKind, DashPlayspaceTask},
locale::WayVRLangProvider,
+ palette::load_palette,
timestep::{self, Timestep},
};
use crate::{
assets,
- tab::{Tab, TabType, apps::TabApps, games::TabGames, home::TabHome, monado::TabMonado, settings::TabSettings},
+ tab::{
+ Tab, TabType, apps::TabApps, donate::TabDonate, games::TabGames, home::TabHome, monado::TabMonado,
+ settings::TabSettings, welcome::TabWelcome,
+ },
util::{
- popup_manager::{MountPopupParams, PopupManager, PopupManagerParams},
+ popup_manager::{MountPopupOnceParams, PopupManager, PopupManagerParams},
toast_manager::ToastManager,
},
views,
@@ -56,6 +63,7 @@ pub struct Frontend
{
state: ParserState,
current_tab: Option>>,
+ side_buttons: Vec<(TabType, Rc)>,
pub tasks: FrontendTasks,
@@ -86,14 +94,17 @@ pub struct FrontendUpdateResult {
pub struct InitParams<'a, T> {
pub interface: BoxDashInterface,
pub lang_provider: &'a WayVRLangProvider,
+ pub show_welcome: bool,
pub has_monado: bool,
pub theme: Rc,
+ pub color_palette: &'a str,
}
#[derive(Clone)]
pub enum SoundType {
Startup,
Launch,
+ Save,
}
#[derive(Clone)]
@@ -101,14 +112,16 @@ pub enum FrontendTask {
SetTab(TabType),
RefreshClock,
RefreshBackground,
- MountPopup(MountPopupParams),
+ MountPopupOnce(MountPopupOnceParams),
RefreshPopupManager,
ShowAudioSettings,
UpdateAudioSettingsView,
RecenterPlayspace,
PushToast(Translation),
PlaySound(SoundType),
+ OpenURL(Rc),
HideDashboard,
+ MarkTutorialGraduated,
}
impl Frontend {
@@ -119,6 +132,8 @@ impl Frontend {
let font_binary_regular = assets.load_from_path_gzip("Quicksand-Regular.ttf.gz")?;
let font_binary_light = assets.load_from_path_gzip("Quicksand-Light.ttf.gz")?;
+ let palette = load_palette(params.color_palette);
+
let globals = WguiGlobals::new(
assets,
params.lang_provider,
@@ -129,6 +144,7 @@ impl Frontend {
family_name_monospace: "",
},
PathBuf::new(), //FIXME: pass from somewhere else
+ palette,
)?;
let (layout, state) = wgui::parser::new_layout_from_assets(
@@ -151,7 +167,13 @@ impl Frontend {
let toast_manager = ToastManager::new();
let tasks = FrontendTasks::new();
- tasks.push(FrontendTask::SetTab(TabType::Home));
+
+ let init_tab = if params.show_welcome {
+ TabType::Welcome
+ } else {
+ TabType::Home
+ };
+ tasks.push(FrontendTask::SetTab(init_tab));
let id_label_time = state.get_widget_id("label_time")?;
let id_rect_content = state.get_widget_id("rect_content")?;
@@ -164,6 +186,7 @@ impl Frontend {
layout,
state,
current_tab: None,
+ side_buttons: Vec::with_capacity(TabType::COUNT),
globals,
tasks,
ticks: 0,
@@ -202,6 +225,7 @@ impl Frontend {
let path = match sound_type {
SoundType::Startup => "sound/startup.mp3",
SoundType::Launch => "sound/app_start.mp3",
+ SoundType::Save => "sound/save.mp3",
};
// try loading a custom sound; if one doesn't exist (or it failed to load), use the built-in asset
@@ -279,10 +303,8 @@ impl Frontend {
}
fn update_time(&mut self, data: &mut T) -> anyhow::Result<()> {
- let mut c = self.layout.start_common();
- let mut common = c.common();
-
{
+ let mut common = self.layout.common();
let mut label = common
.state
.widgets
@@ -303,27 +325,20 @@ impl Frontend {
label.set_text(&mut common, Translation::from_raw_text(&text));
}
- c.finish()?;
Ok(())
}
- fn mount_popup(&mut self, params: MountPopupParams, data: &mut T) -> anyhow::Result<()> {
+ fn mount_popup_once(&mut self, params: MountPopupOnceParams, data: &mut T) -> anyhow::Result<()> {
let config = self.interface.general_config(data);
- self.popup_manager.mount_popup(
- self.globals.clone(),
- &mut self.layout,
- self.tasks.clone(),
- params,
- config,
- )?;
+ self
+ .popup_manager
+ .mount_popup_once(&self.globals, &mut self.layout, &self.tasks, params, config)?;
Ok(())
}
fn refresh_popup_manager(&mut self) -> anyhow::Result<()> {
- let mut c = self.layout.start_common();
- self.popup_manager.refresh(c.common().alterables);
- c.finish()?;
+ self.popup_manager.refresh(&mut self.layout.alterables);
Ok(())
}
@@ -345,8 +360,8 @@ impl Frontend {
(0.8666, 0.9333)
};
- rect.params.color.a = alpha1;
- rect.params.color2.a = alpha2;
+ rect.params.color = rect.params.color.with_alpha(alpha1);
+ rect.params.color2 = rect.params.color2.with_alpha(alpha2);
Ok(())
}
@@ -356,7 +371,7 @@ impl Frontend {
FrontendTask::SetTab(tab_type) => self.set_tab(params.data, tab_type)?,
FrontendTask::RefreshClock => self.update_time(params.data)?,
FrontendTask::RefreshBackground => self.update_background(params.data)?,
- FrontendTask::MountPopup(popup_params) => self.mount_popup(popup_params, params.data)?,
+ FrontendTask::MountPopupOnce(popup_params) => self.mount_popup_once(popup_params, params.data)?,
FrontendTask::RefreshPopupManager => self.refresh_popup_manager()?,
FrontendTask::ShowAudioSettings => self.action_show_audio_settings()?,
FrontendTask::UpdateAudioSettingsView => self.action_update_audio_settings()?,
@@ -364,13 +379,14 @@ impl Frontend {
FrontendTask::PushToast(content) => self.toast_manager.push(content),
FrontendTask::PlaySound(sound_type) => self.queue_play_sound(sound_type),
FrontendTask::HideDashboard => self.action_hide_dashboard(params.data),
+ FrontendTask::OpenURL(url) => self.action_open_url(url),
+ FrontendTask::MarkTutorialGraduated => self.action_tutorial_graduated(params.data),
};
Ok(())
}
fn set_tab_title(&mut self, translation: &str, icon: &str) -> anyhow::Result<()> {
- let mut c = self.layout.start_common();
- let mut common = c.common();
+ let mut common = self.layout.common();
{
let mut label = common
@@ -386,12 +402,11 @@ impl Frontend {
.widgets
.cast_as::(self.widgets.id_sprite_titlebar_icon)?;
sprite.set_content(
- &mut common,
+ common.alterables,
Some(CustomGlyphData::from_assets(&self.globals, AssetPath::BuiltIn(icon))?),
);
}
- c.finish()?;
Ok(())
}
@@ -400,26 +415,45 @@ impl Frontend {
let widget_content = self.state.fetch_widget(&self.layout.state, "content")?;
self.layout.remove_children(widget_content.id);
+ let padding = tab_type.get_preferred_padding();
+ self.layout.tasks.push(LayoutTask::SetWidgetStyle(
+ widget_content.id,
+ StyleSetRequest::Padding(taffy::Rect::length(padding)),
+ ));
+
let (tab_translation, icon_path) = match tab_type {
+ TabType::Welcome => ("GETTING_STARTED", "dashboard/welcome.svg"),
TabType::Home => ("HOME_SCREEN", "dashboard/home.svg"),
TabType::Apps => ("APPLICATIONS", "dashboard/apps.svg"),
TabType::Games => ("GAMES", "dashboard/games.svg"),
TabType::Monado => ("MONADO_RUNTIME", "dashboard/monado.svg"),
TabType::Settings => ("SETTINGS", "dashboard/settings.svg"),
+ TabType::Donate => ("DONATE.SUPPORT_US", "dashboard/opencollective.svg"),
};
self.set_tab_title(tab_translation, icon_path)?;
let tab: Box> = match tab_type {
+ TabType::Welcome => Box::new(TabWelcome::new(self, widget_content.id, data)?),
TabType::Home => Box::new(TabHome::new(self, widget_content.id, data)?),
TabType::Apps => Box::new(TabApps::new(self, widget_content.id, data)?),
TabType::Games => Box::new(TabGames::new(self, widget_content.id)?),
TabType::Monado => Box::new(TabMonado::new(self, widget_content.id)?),
TabType::Settings => Box::new(TabSettings::new(self, widget_content.id, data)?),
+ TabType::Donate => Box::new(TabDonate::new(self, widget_content.id, data)?),
};
self.current_tab = Some(tab);
+ let mut common = CallbackDataCommon {
+ state: &self.layout.state,
+ alterables: &mut self.layout.alterables,
+ };
+
+ for (t, btn) in self.side_buttons.iter() {
+ btn.set_sticky_state(&mut common, tab_type == *t);
+ }
+
Ok(())
}
@@ -435,34 +469,29 @@ impl Frontend {
// ################################
// "Home" side button
- self.tasks.handle_button(
- &self.state.fetch_component_as::("btn_side_home")?,
- FrontendTask::SetTab(TabType::Home),
- );
+ let btn = self.state.fetch_component_as::("btn_side_home")?;
+ self.tasks.handle_button(&btn, FrontendTask::SetTab(TabType::Home));
+ self.side_buttons.push((TabType::Home, btn));
// "Apps" side button
- self.tasks.handle_button(
- &self.state.fetch_component_as::("btn_side_apps")?,
- FrontendTask::SetTab(TabType::Apps),
- );
+ let btn = self.state.fetch_component_as::("btn_side_apps")?;
+ self.tasks.handle_button(&btn, FrontendTask::SetTab(TabType::Apps));
+ self.side_buttons.push((TabType::Apps, btn));
// "Games" side button
- self.tasks.handle_button(
- &self.state.fetch_component_as::("btn_side_games")?,
- FrontendTask::SetTab(TabType::Games),
- );
+ let btn = self.state.fetch_component_as::("btn_side_games")?;
+ self.tasks.handle_button(&btn, FrontendTask::SetTab(TabType::Games));
+ self.side_buttons.push((TabType::Games, btn));
// "Monado side button"
- self.tasks.handle_button(
- &self.state.fetch_component_as::("btn_side_monado")?,
- FrontendTask::SetTab(TabType::Monado),
- );
+ let btn = self.state.fetch_component_as::("btn_side_monado")?;
+ self.tasks.handle_button(&btn, FrontendTask::SetTab(TabType::Monado));
+ self.side_buttons.push((TabType::Monado, btn));
// "Settings" side button
- self.tasks.handle_button(
- &self.state.fetch_component_as::("btn_side_settings")?,
- FrontendTask::SetTab(TabType::Settings),
- );
+ let btn = self.state.fetch_component_as::("btn_side_settings")?;
+ self.tasks.handle_button(&btn, FrontendTask::SetTab(TabType::Settings));
+ self.side_buttons.push((TabType::Settings, btn));
// ################################
// BOTTOM BAR BUTTONS
@@ -485,7 +514,6 @@ impl Frontend {
fn action_show_audio_settings(&mut self) -> anyhow::Result<()> {
self.window_audio_settings.open(&mut WguiWindowParams {
- globals: &self.globals,
position: Vec2::new(64.0, 64.0),
layout: &mut self.layout,
extra: WguiWindowParamsExtra {
@@ -525,11 +553,27 @@ impl Frontend {
}
fn action_recenter_playspace(&mut self, data: &mut T) -> anyhow::Result<()> {
- self.interface.recenter_playspace(data, RecenterMode::Recenter)?;
+ self.interface.playspace_task(data, DashPlayspaceTask::Recenter)?;
Ok(())
}
fn action_hide_dashboard(&mut self, data: &mut T) {
self.interface.toggle_dashboard(data);
}
+
+ fn action_tutorial_graduated(&mut self, data: &mut T) {
+ let config = self.interface.general_config(data);
+ config.tutorial_graduated = true;
+ self.interface.config_changed(data, ConfigChangeKind::Other);
+ }
+
+ fn action_open_url(&mut self, url: Rc) {
+ let _ = std::process::Command::new("xdg-open").arg(url.as_ref()).spawn();
+ self
+ .tasks
+ .push(FrontendTask::PushToast(Translation::from_raw_text_string(format!(
+ "Opened URL: {}",
+ url
+ ))));
+ }
}
diff --git a/dash-frontend/src/tab/apps.rs b/dash-frontend/src/tab/apps.rs
index 7e17ff39..6d6e5011 100644
--- a/dash-frontend/src/tab/apps.rs
+++ b/dash-frontend/src/tab/apps.rs
@@ -1,44 +1,41 @@
-use std::{
- cell::RefCell,
- collections::{HashMap, VecDeque},
- marker::PhantomData,
- rc::Rc,
-};
-
+use std::{cell::RefCell, collections::VecDeque, marker::PhantomData, rc::Rc};
use wgui::{
assets::AssetPath,
components::button::{ButtonClickCallback, ComponentButton},
globals::WguiGlobals,
i18n::Translation,
layout::{WidgetID, WidgetPair},
- parser::{Fetchable, ParseDocumentParams, ParserState},
+ parser::{Fetchable, ParseDocumentParams, ParserState, TemplateParams},
task::Tasks,
};
-use wlx_common::desktop_finder::DesktopEntry;
+use wlx_common::{config::PinnedApp, desktop_finder::DesktopEntry};
use crate::{
- frontend::{Frontend, FrontendTask, FrontendTasks},
+ frontend::{Frontend, FrontendTasks},
tab::{Tab, TabType},
- util::popup_manager::{MountPopupParams, PopupHandle},
- views::{self, app_launcher},
+ util::{popup_manager::PopupHolder, wgui_simple},
+ views::{self},
};
-enum Task {
- CloseLauncher,
+struct State {
+ #[allow(dead_code)]
+ parser_state: ParserState,
+ view_launcher: PopupHolder,
}
-struct State {
- view_launcher: Option<(PopupHandle, views::app_launcher::View)>,
+#[derive(Clone)]
+enum Task {
+ RefreshPinnedApps,
}
pub struct TabApps {
- #[allow(dead_code)]
- parser_state: ParserState,
-
state: Rc>,
app_list: AppList,
- tasks: Tasks,
marker: PhantomData,
+
+ pinned_apps_parent: WidgetID,
+
+ tasks: Tasks,
}
impl Tab for TabApps {
@@ -49,25 +46,100 @@ impl Tab for TabApps {
fn update(&mut self, frontend: &mut Frontend, _time_ms: u32, data: &mut T) -> anyhow::Result<()> {
let mut state = self.state.borrow_mut();
+ self.app_list.tick(frontend, &self.tasks, &mut state, &self.state)?;
+
for task in self.tasks.drain() {
match task {
- Task::CloseLauncher => state.view_launcher = None,
+ Task::RefreshPinnedApps => self.refresh_pinned_apps(&mut state, frontend, data)?,
}
}
- self
- .app_list
- .tick(frontend, &self.state, &self.tasks, &mut self.parser_state)?;
+ state
+ .view_launcher
+ .with_view_res(|view| view.update(&mut frontend.interface, data))?;
+ Ok(())
+ }
+}
- if let Some((_, launcher)) = &mut state.view_launcher {
- launcher.update(&mut frontend.interface, data)?;
+fn find_entry_from_app_name<'a>(app_id: &str, entries: &'a [DesktopEntry]) -> Option<&'a DesktopEntry> {
+ entries.iter().find(|&entry| *entry.app_id == *app_id)
+}
+
+impl TabApps {
+ fn refresh_pinned_apps(&self, state: &mut State, frontend: &mut Frontend, data: &mut T) -> anyhow::Result<()> {
+ frontend.layout.remove_children(self.pinned_apps_parent);
+ let globals = frontend.globals.clone();
+
+ let mut stale_entries = Vec::>::new();
+
+ let mut pinned_desktop_entries = Vec::<(PinnedApp, &DesktopEntry)>::new();
+
+ // collect pinned desktop entries
+ {
+ let config = frontend.interface.general_config(data);
+ for pinned_app in &config.pinned_apps {
+ let Some(desktop_entry) = find_entry_from_app_name(&pinned_app.app_id, &self.app_list.all_entries) else {
+ stale_entries.push(pinned_app.app_id.clone());
+ continue;
+ };
+
+ pinned_desktop_entries.push((pinned_app.clone(), desktop_entry));
+ }
+ // cleanup:
+ // remove non-existent app ids from pinned apps
+ config.pinned_apps.retain(|pinned_app| {
+ for app_id in &stale_entries {
+ if *app_id == pinned_app.app_id {
+ return false;
+ }
+ }
+ true
+ });
}
+
+ if pinned_desktop_entries.is_empty() {
+ wgui_simple::create_label(
+ &mut frontend.layout,
+ self.pinned_apps_parent,
+ Translation::from_translation_key("EMPTY"),
+ )?;
+ }
+
+ // mount pinned desktop entries
+ for (pinned_app, desktop_entry) in pinned_desktop_entries {
+ let tooltip_string = format!(
+ "{}\n{}\n{}",
+ pinned_app.compositor_mode.as_ref(),
+ pinned_app.orientation_mode.as_ref(),
+ pinned_app.res_mode.as_ref()
+ );
+
+ let button = mount_entry(
+ frontend,
+ &mut state.parser_state,
+ &doc_params(frontend.globals.clone()),
+ self.pinned_apps_parent,
+ desktop_entry,
+ Some(tooltip_string),
+ )?;
+
+ button.on_click(on_app_click(
+ frontend.tasks.clone(),
+ self.tasks.clone(),
+ globals.clone(),
+ desktop_entry.clone(),
+ self.state.clone(),
+ Some(pinned_app.clone()),
+ ));
+ }
+
Ok(())
}
}
struct AppList {
//data: Vec,
+ all_entries: Vec,
entries_to_mount: VecDeque,
list_parent: WidgetPair,
prev_category_name: String,
@@ -76,43 +148,21 @@ struct AppList {
// called after the user clicks any desktop entry
fn on_app_click(
frontend_tasks: FrontendTasks,
+ tasks: Tasks,
globals: WguiGlobals,
entry: DesktopEntry,
state: Rc>,
- tasks: Tasks,
+ pinned_app: Option,
) -> ButtonClickCallback {
Rc::new(move |_common, _evt| {
- frontend_tasks.push(FrontendTask::MountPopup(MountPopupParams {
- title: Translation::from_raw_text(&entry.app_name),
- on_content: {
- // this is awful
- let state = state.clone();
- let entry = entry.clone();
- let globals = globals.clone();
- let frontend_tasks = frontend_tasks.clone();
- let tasks = tasks.clone();
-
- Rc::new(move |data| {
- let on_launched = {
- let tasks = tasks.clone();
- Box::new(move || tasks.push(Task::CloseLauncher))
- };
-
- let view = app_launcher::View::new(app_launcher::Params {
- entry: entry.clone(),
- globals: &globals,
- layout: data.layout,
- parent_id: data.id_content,
- frontend_tasks: &frontend_tasks,
- config: data.config,
- on_launched,
- })?;
-
- state.borrow_mut().view_launcher = Some((data.handle, view));
- Ok(())
- })
- },
- }));
+ views::app_launcher::mount_popup(
+ frontend_tasks.clone(),
+ globals.clone(),
+ entry.clone(),
+ state.borrow_mut().view_launcher.clone(),
+ tasks.make_callback_box(Task::RefreshPinnedApps),
+ pinned_app.clone(),
+ );
Ok(())
})
}
@@ -128,19 +178,24 @@ fn doc_params(globals: WguiGlobals) -> ParseDocumentParams<'static> {
impl TabApps {
pub fn new(frontend: &mut Frontend, parent_id: WidgetID, data: &mut T) -> anyhow::Result {
let globals = frontend.layout.state.globals.clone();
- let tasks = Tasks::new();
- let state = Rc::new(RefCell::new(State { view_launcher: None }));
-
let parser_state = wgui::parser::parse_from_assets(&doc_params(globals.clone()), &mut frontend.layout, parent_id)?;
- let app_list_parent = parser_state.fetch_widget(&frontend.layout.state, "app_list_parent")?;
- let mut entries_sorted: Vec<_> = frontend
+ let app_list_parent = parser_state.fetch_widget(&frontend.layout.state, "app_list_parent")?;
+ let pinned_apps_parent = parser_state.fetch_widget(&frontend.layout.state, "pinned_apps_parent")?;
+
+ let state = Rc::new(RefCell::new(State {
+ view_launcher: Default::default(),
+ parser_state,
+ }));
+
+ let entries: Vec<_> = frontend
.interface
.desktop_finder(data)
.find_entries()
.into_values()
.collect();
+ let mut entries_sorted = entries.clone();
entries_sorted.sort_by(|a, b| {
let cat_name_a = get_category_name(a);
let cat_name_b = get_category_name(b);
@@ -148,17 +203,21 @@ impl TabApps {
});
let app_list = AppList {
+ all_entries: entries,
entries_to_mount: entries_sorted.drain(..).collect(),
list_parent: app_list_parent,
prev_category_name: String::new(),
};
+ let tasks = Tasks::::new();
+ tasks.push(Task::RefreshPinnedApps);
+
Ok(Self {
app_list,
- parser_state,
state,
tasks,
marker: PhantomData,
+ pinned_apps_parent: pinned_apps_parent.id,
})
}
}
@@ -272,83 +331,93 @@ fn get_category_name(entry: &DesktopEntry) -> &str {
}
}
-impl AppList {
- fn mount_entry(
- &mut self,
- frontend: &mut Frontend,
- parser_state: &mut ParserState,
- doc_params: &ParseDocumentParams,
- entry: &DesktopEntry,
- ) -> anyhow::Result> {
- let category_name = get_category_name(entry);
- if category_name != self.prev_category_name {
- self.prev_category_name = String::from(category_name);
- let mut params = HashMap::, Rc>::new();
- params.insert("text".into(), category_name.into());
+fn mount_entry(
+ frontend: &mut Frontend,
+ parser_state: &mut ParserState,
+ doc_params: &ParseDocumentParams,
+ id_parent: WidgetID,
+ entry: &DesktopEntry,
+ tooltip: Option,
+) -> anyhow::Result> {
+ {
+ let mut params = TemplateParams::new();
- parser_state.realize_template(
- doc_params,
- "CategoryText",
- &mut frontend.layout,
- self.list_parent.id,
- params,
- )?;
- }
+ if let Some(tooltip) = tooltip {
+ params.insert_str("tooltip", tooltip);
+ };
- {
- let mut params = HashMap::new();
+ // entry icon
+ params.insert_rc(
+ "src_ext",
+ entry
+ .icon_path
+ .as_ref()
+ .map_or_else(|| "".into(), |icon_path| icon_path.clone()),
+ );
- // entry icon
- params.insert(
- "src_ext".into(),
- entry
- .icon_path
- .as_ref()
- .map_or_else(|| "".into(), |icon_path| icon_path.clone()),
- );
+ // entry fallback (question mark) icon
+ params.insert(
+ "src",
+ if entry.icon_path.is_none() {
+ "dashboard/terminal.svg"
+ } else {
+ ""
+ },
+ );
+ params.insert("name", &entry.app_name);
- // entry fallback (question mark) icon
- params.insert(
- "src".into(),
- if entry.icon_path.is_none() {
- "dashboard/terminal.svg".into()
- } else {
- "".into()
- },
- );
- params.insert("name".into(), entry.app_name.clone());
+ let data = parser_state.realize_template(doc_params, "AppEntry", &mut frontend.layout, id_parent, params)?;
- let data = parser_state.realize_template(
- doc_params,
- "AppEntry",
- &mut frontend.layout,
- self.list_parent.id,
- params,
- )?;
-
- data.fetch_component_as::("button")
- }
+ data.fetch_component_as::("button")
}
+}
+impl AppList {
fn tick(
&mut self,
frontend: &mut Frontend,
- state: &Rc>,
tasks: &Tasks,
- parser_state: &mut ParserState,
+ state: &mut State,
+ rc_state: &Rc>,
) -> anyhow::Result<()> {
- // load 4 entries for a single frame at most
- for _ in 0..4 {
+ let parser_state = &mut state.parser_state;
+
+ // load 30 entries for a single frame at most
+ for _ in 0..30 {
if let Some(entry) = self.entries_to_mount.pop_front() {
let globals = frontend.layout.state.globals.clone();
- let button = self.mount_entry(frontend, parser_state, &doc_params(globals.clone()), &entry)?;
+
+ let category_name = get_category_name(&entry);
+ if category_name != self.prev_category_name {
+ self.prev_category_name = String::from(category_name);
+ let mut params = TemplateParams::new();
+ params.insert("text", category_name);
+
+ parser_state.realize_template(
+ &doc_params(globals.clone()),
+ "CategoryText",
+ &mut frontend.layout,
+ self.list_parent.id,
+ params,
+ )?;
+ }
+
+ let button = mount_entry(
+ frontend,
+ parser_state,
+ &doc_params(globals.clone()),
+ self.list_parent.id,
+ &entry,
+ None,
+ )?;
button.on_click(on_app_click(
frontend.tasks.clone(),
+ tasks.clone(),
globals.clone(),
entry.clone(),
- state.clone(),
- tasks.clone(),
+ rc_state.clone(),
+ None,
));
} else {
break;
diff --git a/dash-frontend/src/tab/donate.rs b/dash-frontend/src/tab/donate.rs
new file mode 100644
index 00000000..4ab8c0b2
--- /dev/null
+++ b/dash-frontend/src/tab/donate.rs
@@ -0,0 +1,68 @@
+use std::{marker::PhantomData, rc::Rc};
+
+use wgui::{
+ assets::AssetPath,
+ components::button::ComponentButton,
+ globals::WguiGlobals,
+ layout::WidgetID,
+ parser::{Fetchable, ParseDocumentParams, ParserState},
+ task::Tasks,
+};
+
+use crate::{
+ frontend::{Frontend, FrontendTask},
+ tab::{Tab, TabType},
+};
+
+#[derive(Clone)]
+#[allow(clippy::enum_variant_names)]
+enum Task {}
+
+pub struct TabDonate {
+ #[allow(dead_code)]
+ pub state: ParserState,
+ marker: PhantomData,
+ #[allow(dead_code)]
+ tasks: Tasks,
+}
+
+impl Tab for TabDonate {
+ fn get_type(&self) -> TabType {
+ TabType::Donate
+ }
+
+ fn update(&mut self, _frontend: &mut Frontend, _time_ms: u32, _user_data: &mut T) -> anyhow::Result<()> {
+ // for task in self.tasks.drain() {
+ // match task {}
+ // }
+
+ Ok(())
+ }
+}
+
+fn doc_params(globals: &WguiGlobals) -> ParseDocumentParams<'_> {
+ ParseDocumentParams {
+ globals: globals.clone(),
+ path: AssetPath::BuiltIn("gui/tab/donate.xml"),
+ extra: Default::default(),
+ }
+}
+
+impl TabDonate {
+ pub fn new(frontend: &mut Frontend, parent_id: WidgetID, _data: &mut T) -> anyhow::Result {
+ let state = wgui::parser::parse_from_assets(&doc_params(&frontend.globals), &mut frontend.layout, parent_id)?;
+
+ frontend.tasks.handle_button(
+ &state.fetch_component_as::("btn_donate")?,
+ FrontendTask::OpenURL(Rc::from("https://opencollective.com/wayvr-org")),
+ );
+
+ let tasks = Tasks::::new();
+
+ Ok(Self {
+ state,
+ marker: PhantomData,
+ tasks,
+ })
+ }
+}
diff --git a/dash-frontend/src/tab/games.rs b/dash-frontend/src/tab/games.rs
index fcdc3cad..514b7c3e 100644
--- a/dash-frontend/src/tab/games.rs
+++ b/dash-frontend/src/tab/games.rs
@@ -10,7 +10,7 @@ use crate::{
frontend::Frontend,
tab::{Tab, TabType},
util::steam_utils::SteamUtils,
- views::{game_list, running_games_list},
+ views::{ViewTrait, ViewUpdateParams, game_list, running_games_list},
};
pub struct TabGames {
@@ -19,7 +19,6 @@ pub struct TabGames {
view_game_list: game_list::View,
view_running_games_list: running_games_list::View,
- steam_utils: SteamUtils,
marker: PhantomData,
}
@@ -28,10 +27,20 @@ impl Tab for TabGames {
TabType::Games
}
- fn update(&mut self, frontend: &mut Frontend, time_ms: u32, _data: &mut T) -> anyhow::Result<()> {
- self
- .view_game_list
- .update(&mut frontend.layout, &mut self.steam_utils, &frontend.executor)?;
+ fn update(&mut self, frontend: &mut Frontend, time_ms: u32, data: &mut T) -> anyhow::Result<()> {
+ let mut config_change_kind = None;
+
+ self.view_game_list.update(&mut ViewUpdateParams {
+ layout: &mut frontend.layout,
+ executor: &frontend.executor,
+ general_config: frontend.interface.general_config(data),
+ config_change_kind: &mut config_change_kind,
+ })?;
+
+ if let Some(kind) = config_change_kind {
+ frontend.interface.config_changed(data, kind);
+ }
+
self.view_running_games_list.update(&mut frontend.layout, time_ms)?;
Ok(())
}
@@ -54,16 +63,17 @@ impl TabGames {
let game_list_parent = state.get_widget_id("game_list_parent")?;
let id_running_games_list_parent = state.get_widget_id("running_games_list_parent")?;
+ let mut steam_utils = SteamUtils::new()?;
+
let view_game_list = game_list::View::new(game_list::Params {
executor: frontend.executor.clone(),
frontend_tasks: frontend.tasks.clone(),
globals: globals.clone(),
layout: &mut frontend.layout,
parent_id: game_list_parent,
+ steam_utils: &steam_utils,
})?;
- let mut steam_utils = SteamUtils::new()?;
-
let view_running_games_list = running_games_list::View::new(running_games_list::Params {
globals: globals.clone(),
layout: &mut frontend.layout,
@@ -77,7 +87,6 @@ impl TabGames {
view_game_list,
view_running_games_list,
marker: PhantomData,
- steam_utils,
})
}
}
diff --git a/dash-frontend/src/tab/home.rs b/dash-frontend/src/tab/home.rs
index 57e967cd..b6b6a03e 100644
--- a/dash-frontend/src/tab/home.rs
+++ b/dash-frontend/src/tab/home.rs
@@ -59,22 +59,29 @@ impl TabHome {
parent_id,
)?;
- let mut c = frontend.layout.start_common();
- let widget_label = state.fetch_widget(&c.layout.state, "label_hello")?.widget;
- configure_label_hello(&mut c.common(), widget_label, frontend.interface.general_config(data));
+ let widget_label = state.fetch_widget(&frontend.layout.state, "label_hello")?.widget;
+ configure_label_hello(
+ &mut frontend.layout.common(),
+ widget_label,
+ frontend.interface.general_config(data),
+ );
let btn_apps = state.fetch_component_as::("btn_apps")?;
let btn_games = state.fetch_component_as::("btn_games")?;
let btn_monado = state.fetch_component_as::("btn_monado")?;
- //let btn_processes = state.fetch_component_as::("btn_processes")?;
let btn_settings = state.fetch_component_as::("btn_settings")?;
+ let btn_welcome_screen = state.fetch_component_as::("btn_welcome_screen")?;
+ let btn_donate = state.fetch_component_as::("btn_donate")?;
+ let btn_website = state.fetch_component_as::("btn_website")?;
let tasks = &mut frontend.tasks;
tasks.handle_button(&btn_apps, FrontendTask::SetTab(TabType::Apps));
tasks.handle_button(&btn_games, FrontendTask::SetTab(TabType::Games));
tasks.handle_button(&btn_monado, FrontendTask::SetTab(TabType::Monado));
- //tasks.handle_button(&btn_processes, FrontendTask::SetTab(TabType::Processes));
tasks.handle_button(&btn_settings, FrontendTask::SetTab(TabType::Settings));
+ tasks.handle_button(&btn_welcome_screen, FrontendTask::SetTab(TabType::Welcome));
+ tasks.handle_button(&btn_donate, FrontendTask::SetTab(TabType::Donate));
+ tasks.handle_button(&btn_website, FrontendTask::OpenURL("https://wayvr.org".into()));
Ok(Self {
state,
diff --git a/dash-frontend/src/tab/mod.rs b/dash-frontend/src/tab/mod.rs
index 68e7fb03..881084de 100644
--- a/dash-frontend/src/tab/mod.rs
+++ b/dash-frontend/src/tab/mod.rs
@@ -1,18 +1,33 @@
+use strum::EnumCount;
+
use crate::frontend::Frontend;
pub mod apps;
+pub mod donate;
pub mod games;
pub mod home;
pub mod monado;
pub mod settings;
+pub mod welcome;
-#[derive(Clone, Copy, Debug)]
+#[derive(Clone, Copy, Debug, PartialEq, Eq, EnumCount)]
pub enum TabType {
Home,
Apps,
Games,
Monado,
Settings,
+ Welcome,
+ Donate,
+}
+
+impl TabType {
+ pub fn get_preferred_padding(&self) -> f32 {
+ match self {
+ TabType::Welcome | TabType::Donate => 0.0,
+ _ => 16.0,
+ }
+ }
}
pub trait Tab {
diff --git a/dash-frontend/src/tab/monado.rs b/dash-frontend/src/tab/monado.rs
index 0f714306..cac91366 100644
--- a/dash-frontend/src/tab/monado.rs
+++ b/dash-frontend/src/tab/monado.rs
@@ -6,16 +6,20 @@ use wgui::{
bar_graph::{ComponentBarGraph, ValueCell},
button::ComponentButton,
checkbox::ComponentCheckbox,
- slider::ComponentSlider,
+ color_selector::{ColorSelectorChangedCallback, ComponentColorSelector},
+ slider::{ComponentSlider, SliderValueChangedCallback},
tabs::ComponentTabs,
},
drawing::Color,
globals::WguiGlobals,
layout::{Layout, WidgetID},
- parser::{self, Fetchable, ParseDocumentParams, ParserState},
+ parser::{self, Fetchable, ParseDocumentParams, ParserState, TemplateParams},
task::Tasks,
};
-use wlx_common::dash_interface::{self, MonadoDumpSessionFrame};
+use wlx_common::{
+ config::GeneralConfig,
+ dash_interface::{self, ConfigChangeKind, MonadoDumpSessionFrame},
+};
use crate::{
frontend::Frontend,
@@ -24,22 +28,23 @@ use crate::{
#[derive(Clone)]
enum TabNameEnum {
- GeneralSettings,
ProcessList,
+ GeneralSettings,
DebugTimings,
}
impl TabNameEnum {
fn from_string(s: &str) -> Option {
match s {
- "general_settings" => Some(TabNameEnum::GeneralSettings),
"process_list" => Some(TabNameEnum::ProcessList),
+ "general_settings" => Some(TabNameEnum::GeneralSettings),
"debug_timings" => Some(TabNameEnum::DebugTimings),
_ => None,
}
}
}
+#[derive(Clone)]
enum Task {
SetBrightness(f32),
SetTab(TabNameEnum),
@@ -51,6 +56,8 @@ enum Task {
// `DebugTimings` tab
DebugTimingsRefreshSessionList,
DebugTimingsSetSessionId(i64),
+
+ GeneralSettingsChromaUpdate,
}
struct SubtabProcessList {
@@ -62,6 +69,13 @@ struct SubtabProcessList {
struct SubtabGeneralSettings {
#[allow(dead_code)]
state: ParserState,
+
+ slider_keying_curve: Rc,
+ slider_keying_despill: Rc,
+ slider_keying_hue_range: Rc,
+ slider_keying_saturation_range: Rc,
+ slider_keying_value_range: Rc,
+ cs_keying: Rc,
}
struct DebugGraph {
@@ -112,8 +126,8 @@ struct SubtabDebugTimings {
#[allow(clippy::large_enum_variant)]
enum Subtab {
Empty,
- GeneralSettings(SubtabGeneralSettings),
ProcessList(SubtabProcessList),
+ GeneralSettings(SubtabGeneralSettings),
DebugTimings(SubtabDebugTimings),
}
@@ -158,10 +172,22 @@ impl Tab for TabMonado {
tab.set_session_id(&mut frontend.layout, session_id)?;
}
}
+ Task::GeneralSettingsChromaUpdate => {
+ if let Subtab::GeneralSettings(tab) = &mut self.subtab {
+ tab.chroma_update(frontend.interface.general_config(data));
+ frontend
+ .interface
+ .config_changed(data, ConfigChangeKind::EnvironmentBlend);
+ }
+ }
Task::SetBrightness(brightness) => self.set_brightness(frontend, data, brightness),
Task::SetTab(tab) => {
frontend.layout.remove_children(self.id_content);
match tab {
+ TabNameEnum::ProcessList => {
+ self.tasks.push(Task::ProcessListRefresh);
+ self.subtab = Subtab::ProcessList(SubtabProcessList::new(self.id_content, frontend)?)
+ }
TabNameEnum::GeneralSettings => {
self.subtab = Subtab::GeneralSettings(SubtabGeneralSettings::new(
self.id_content,
@@ -170,10 +196,6 @@ impl Tab for TabMonado {
&self.tasks,
)?)
}
- TabNameEnum::ProcessList => {
- self.tasks.push(Task::ProcessListRefresh);
- self.subtab = Subtab::ProcessList(SubtabProcessList::new(self.id_content, frontend)?)
- }
TabNameEnum::DebugTimings => {
self.subtab = Subtab::DebugTimings(SubtabDebugTimings::new(self.id_content, frontend, &self.tasks)?)
}
@@ -184,7 +206,6 @@ impl Tab for TabMonado {
match &mut self.subtab {
Subtab::Empty => {}
- Subtab::GeneralSettings(_) => {}
Subtab::ProcessList(_) => {
// every few seconds
if let Subtab::ProcessList(_) = &self.subtab
@@ -193,6 +214,7 @@ impl Tab for TabMonado {
self.tasks.push(Task::ProcessListRefresh);
}
}
+ Subtab::GeneralSettings(_) => {}
Subtab::DebugTimings(timings) => {
timings.update(&self.tasks, data, frontend)?;
}
@@ -243,6 +265,8 @@ fn yesno(n: bool) -> &'static str {
}
}
+const SLIDER_MULTIPLIER: f32 = 100.0;
+
impl SubtabGeneralSettings {
fn new(
parent_id: WidgetID,
@@ -259,20 +283,91 @@ impl SubtabGeneralSettings {
// get brightness
let slider_brightness = state.fetch_component_as::("slider_brightness")?;
if let Some(brightness) = frontend.interface.monado_brightness_get(data) {
- let mut c = frontend.layout.start_common();
- slider_brightness.set_value(&mut c.common(), brightness * 100.0);
- c.finish()?;
+ slider_brightness.set_value_primary(&mut frontend.layout.common(), brightness * 100.0);
slider_brightness.on_value_changed({
let tasks = tasks.clone();
Box::new(move |_common, e| {
tasks.push(Task::SetBrightness(e.value / 100.0));
- Ok(())
})
});
}
- Ok(Self { state })
+ let config = frontend.interface.general_config(data);
+
+ let cs_keying = state.fetch_component_as::("cs_keying")?;
+ let slider_keying_despill = state.fetch_component_as::("slider_keying_despill")?;
+ let slider_keying_curve = state.fetch_component_as::("slider_keying_curve")?;
+ let slider_keying_hue_range = state.fetch_component_as::("slider_keying_hue_range")?;
+ let slider_keying_saturation_range =
+ state.fetch_component_as::("slider_keying_saturation_range")?;
+ let slider_keying_value_range = state.fetch_component_as::("slider_keying_value_range")?;
+
+ {
+ let mut common = frontend.layout.common();
+
+ // set initial values
+ let (rgb, range_h, range_s, range_v) = config.chroma_key_params.get_rgb_and_hsv_ranges();
+ slider_keying_curve.set_value_primary(&mut common, config.chroma_key_params.curve * SLIDER_MULTIPLIER);
+ slider_keying_despill.set_value_primary(&mut common, config.chroma_key_params.despill * SLIDER_MULTIPLIER);
+ slider_keying_hue_range.set_value_primary(&mut common, range_h * SLIDER_MULTIPLIER);
+ slider_keying_saturation_range.set_value_primary(&mut common, range_s * SLIDER_MULTIPLIER);
+ slider_keying_value_range.set_value_primary(&mut common, range_v * SLIDER_MULTIPLIER);
+ cs_keying.set_color(&mut common, rgb);
+
+ // prepare callbacks
+ fn get_slider_callback(tasks: &Tasks) -> SliderValueChangedCallback {
+ Box::new({
+ let tasks = tasks.clone();
+ move |_, _| {
+ tasks.push(Task::GeneralSettingsChromaUpdate);
+ }
+ })
+ }
+
+ fn get_color_selector_callback(tasks: &Tasks) -> ColorSelectorChangedCallback {
+ Box::new({
+ let tasks = tasks.clone();
+ move |_, _| {
+ tasks.push(Task::GeneralSettingsChromaUpdate);
+ }
+ })
+ }
+ slider_keying_curve.on_value_changed(get_slider_callback(tasks));
+ slider_keying_despill.on_value_changed(get_slider_callback(tasks));
+ slider_keying_hue_range.on_value_changed(get_slider_callback(tasks));
+ slider_keying_saturation_range.on_value_changed(get_slider_callback(tasks));
+ slider_keying_value_range.on_value_changed(get_slider_callback(tasks));
+ cs_keying.on_changed(get_color_selector_callback(tasks));
+ }
+
+ Ok(Self {
+ state,
+ slider_keying_curve,
+ slider_keying_despill,
+ slider_keying_hue_range,
+ slider_keying_saturation_range,
+ slider_keying_value_range,
+ cs_keying,
+ })
+ }
+
+ fn chroma_update(&mut self, config: &mut GeneralConfig) {
+ let val_curve = self.slider_keying_curve.get_value_primary();
+ let val_despill = self.slider_keying_despill.get_value_primary();
+ let val_range_h = self.slider_keying_hue_range.get_value_primary();
+ let val_range_s = self.slider_keying_saturation_range.get_value_primary();
+ let val_range_v = self.slider_keying_value_range.get_value_primary();
+ let val_rgb = self.cs_keying.get_color();
+
+ config.chroma_key_params.despill = val_despill / SLIDER_MULTIPLIER;
+ config.chroma_key_params.curve = val_curve / SLIDER_MULTIPLIER;
+ config.chroma_key_params.update_hsv_range_from_rgb(
+ val_rgb,
+ val_range_h / SLIDER_MULTIPLIER,
+ val_range_s / SLIDER_MULTIPLIER,
+ val_range_v / SLIDER_MULTIPLIER,
+ );
}
}
@@ -288,15 +383,16 @@ fn mount_sessions_list(
layout.remove_children(id_parent);
for (session_id, session) in sessions {
- let mut params = HashMap::new();
+ let mut params = TemplateParams::new();
- params.insert(
- Rc::from("text"),
- Rc::from(format!(
+ params.insert_rc(
+ "text",
+ format!(
"{} (ID {})",
session.resolved_name.as_ref().map_or("Unknown", |s| s.as_str()),
session_id,
- )),
+ )
+ .into(),
);
let data = state.realize_template(
@@ -332,10 +428,10 @@ fn mount_graph(
limits: (f32, f32),
) -> anyhow::Result {
let globals = layout.state.globals.clone();
- let mut params = HashMap::new();
- params.insert(Rc::from("name"), Rc::from(name));
- params.insert(Rc::from("limit_min"), Rc::from(limits.0.to_string()));
- params.insert(Rc::from("limit_max"), Rc::from(limits.1.to_string()));
+ let mut params = TemplateParams::new();
+ params.insert("name", name);
+ params.insert_rc("limit_min", limits.0.to_string().into());
+ params.insert_rc("limit_max", limits.1.to_string().into());
let data = state.realize_template(
&doc_params_tab_debug_timings(&globals),
@@ -557,25 +653,15 @@ impl SubtabProcessList {
client: &dash_interface::MonadoClient,
tasks: &Tasks,
) -> anyhow::Result<()> {
- let mut par = HashMap::, Rc>::new();
- par.insert(
- "checked".into(),
- if client.is_primary {
- Rc::from("1")
- } else {
- Rc::from("0")
- },
- );
- par.insert(
- "name".into(),
- format!("{} (Client ID: {})", client.name, client.id).into(),
- );
- par.insert("flag_active".into(), yesno(client.is_active).into());
- par.insert("flag_focused".into(), yesno(client.is_focused).into());
- par.insert("flag_io_active".into(), yesno(client.is_io_active).into());
- par.insert("flag_overlay".into(), yesno(client.is_overlay).into());
- par.insert("flag_primary".into(), yesno(client.is_primary).into());
- par.insert("flag_visible".into(), yesno(client.is_visible).into());
+ let mut par = TemplateParams::new();
+ par.insert("checked", if client.is_primary { "1" } else { "0" });
+ par.insert_rc("name", format!("{} (Client ID: {})", client.name, client.id).into());
+ par.insert("flag_active", yesno(client.is_active));
+ par.insert("flag_focused", yesno(client.is_focused));
+ par.insert("flag_io_active", yesno(client.is_io_active));
+ par.insert("flag_overlay", yesno(client.is_overlay));
+ par.insert("flag_primary", yesno(client.is_primary));
+ par.insert("flag_visible", yesno(client.is_visible));
let globals = layout.state.globals.clone();
diff --git a/dash-frontend/src/tab/settings/macros.rs b/dash-frontend/src/tab/settings/macros.rs
index 8c761412..9593f806 100644
--- a/dash-frontend/src/tab/settings/macros.rs
+++ b/dash-frontend/src/tab/settings/macros.rs
@@ -1,4 +1,4 @@
-use std::{collections::HashMap, rc::Rc};
+use std::rc::Rc;
use crate::tab::settings::{self, SettingType, Task, horiz_cell, mount_requires_restart};
use wgui::{
@@ -8,7 +8,7 @@ use wgui::{
slider::ComponentSlider,
},
layout::{Layout, WidgetID},
- parser::{Fetchable, ParseDocumentParams, ParserState},
+ parser::{Fetchable, ParseDocumentParams, ParserState, TemplateParams},
task::Tasks,
widget::label::WidgetLabel,
windowing::context_menu,
@@ -24,10 +24,10 @@ pub fn options_category(
let id = mp.idx.to_string();
mp.idx += 1;
- let mut params: HashMap, Rc> = HashMap::new();
- params.insert(Rc::from("translation"), Rc::from(translation));
- params.insert(Rc::from("icon"), Rc::from(icon));
- params.insert(Rc::from("id"), Rc::from(id.as_ref()));
+ let mut params = TemplateParams::new();
+ params.insert("translation", translation);
+ params.insert("icon", icon);
+ params.insert("id", &id);
mp.parser_state
.instantiate_template(mp.doc_params, "SettingsGroupBox", mp.layout, parent, params)?;
@@ -39,20 +39,20 @@ pub fn options_checkbox(mp: &mut MacroParams, parent: WidgetID, setting: Setting
let id = mp.idx.to_string();
mp.idx += 1;
- let mut params: HashMap, Rc> = HashMap::new();
- params.insert(Rc::from("id"), Rc::from(id.as_ref()));
+ let mut params = TemplateParams::new();
+ params.insert("id", &id);
match setting.get_translation() {
- Ok(translation) => params.insert(Rc::from("translation"), translation.into()),
- Err(raw_text) => params.insert(Rc::from("text"), raw_text.into()),
+ Ok(translation) => params.insert("translation", translation),
+ Err(raw_text) => params.insert("text", raw_text),
};
if let Some(tooltip) = setting.get_tooltip() {
- params.insert(Rc::from("tooltip"), Rc::from(tooltip));
+ params.insert("tooltip", tooltip);
}
let checked = if *setting.mut_bool(mp.config) { "1" } else { "0" };
- params.insert(Rc::from("checked"), Rc::from(checked));
+ params.insert("checked", checked);
let id_cell = horiz_cell(mp.layout, parent)?;
@@ -86,23 +86,23 @@ pub fn options_slider_f32(
let id = mp.idx.to_string();
mp.idx += 1;
- let mut params: HashMap, Rc> = HashMap::new();
- params.insert(Rc::from("id"), Rc::from(id.as_ref()));
+ let mut params = TemplateParams::new();
+ params.insert("id", &id);
match setting.get_translation() {
- Ok(translation) => params.insert(Rc::from("translation"), translation.into()),
- Err(raw_text) => params.insert(Rc::from("text"), raw_text.into()),
+ Ok(translation) => params.insert("translation", translation),
+ Err(raw_text) => params.insert("text", raw_text),
};
if let Some(tooltip) = setting.get_tooltip() {
- params.insert(Rc::from("tooltip"), Rc::from(tooltip));
+ params.insert("tooltip", tooltip);
}
let value = setting.mut_f32(mp.config).to_string();
- params.insert(Rc::from("value"), Rc::from(value));
- params.insert(Rc::from("min"), Rc::from(min.to_string()));
- params.insert(Rc::from("max"), Rc::from(max.to_string()));
- params.insert(Rc::from("step"), Rc::from(step.to_string()));
+ params.insert_rc("value", value.into());
+ params.insert_rc("min", min.to_string().into());
+ params.insert_rc("max", max.to_string().into());
+ params.insert_rc("step", step.to_string().into());
let id_cell = horiz_cell(mp.layout, parent)?;
@@ -118,7 +118,62 @@ pub fn options_slider_f32(
let tasks = mp.tasks.clone();
move |_common, e| {
tasks.push(Task::UpdateFloat(setting, e.value));
- Ok(())
+ }
+ }));
+
+ Ok(())
+}
+
+pub fn options_range_f32(
+ mp: &mut MacroParams,
+ parent: WidgetID,
+ setting: SettingType,
+ setting2: SettingType,
+ min: f32,
+ max: f32,
+ step: f32,
+) -> anyhow::Result<()> {
+ let id = mp.idx.to_string();
+ mp.idx += 1;
+
+ let mut params = TemplateParams::new();
+ params.insert("id", &id);
+
+ match setting.get_translation() {
+ Ok(translation) => params.insert("translation", translation),
+ Err(raw_text) => params.insert("text", raw_text),
+ };
+
+ if let Some(tooltip) = setting.get_tooltip() {
+ params.insert("tooltip", tooltip);
+ }
+
+ let value = setting.mut_f32(mp.config).to_string();
+ let value2 = setting2.mut_f32(mp.config).to_string();
+ params.insert_rc("value", value.into());
+ params.insert_rc("value2", value2.into());
+ params.insert_rc("min", min.to_string().into());
+ params.insert_rc("max", max.to_string().into());
+ params.insert_rc("step", step.to_string().into());
+
+ let id_cell = horiz_cell(mp.layout, parent)?;
+
+ mp.parser_state
+ .instantiate_template(mp.doc_params, "RangeSetting", mp.layout, id_cell, params)?;
+
+ if setting.requires_restart() {
+ mount_requires_restart(mp.layout, id_cell)?;
+ }
+
+ let slider = mp.parser_state.fetch_component_as::(&id)?;
+ slider.on_value_changed(Box::new({
+ let tasks = mp.tasks.clone();
+ move |_common, e| {
+ if matches!(e.index, wgui::components::slider::ValueIndex::Primary) {
+ tasks.push(Task::UpdateFloat(setting, e.value));
+ } else {
+ tasks.push(Task::UpdateFloat(setting2, e.value));
+ }
}
}));
@@ -136,25 +191,25 @@ pub fn options_slider_i32(
let id = mp.idx.to_string();
mp.idx += 1;
- let mut params: HashMap, Rc> = HashMap::new();
- params.insert(Rc::from("id"), Rc::from(id.as_ref()));
+ let mut params = TemplateParams::new();
+ params.insert("id", &id);
match setting.get_translation() {
- Ok(translation) => params.insert(Rc::from("translation"), translation.into()),
- Err(raw_text) => params.insert(Rc::from("text"), raw_text.into()),
+ Ok(translation) => params.insert("translation", translation),
+ Err(raw_text) => params.insert("text", raw_text),
};
if let Some(tooltip) = setting.get_tooltip() {
- params.insert(Rc::from("tooltip"), Rc::from(tooltip));
+ params.insert("tooltip", tooltip);
}
let id_cell = horiz_cell(mp.layout, parent)?;
let value = setting.mut_i32(mp.config).to_string();
- params.insert(Rc::from("value"), Rc::from(value));
- params.insert(Rc::from("min"), Rc::from(min.to_string()));
- params.insert(Rc::from("max"), Rc::from(max.to_string()));
- params.insert(Rc::from("step"), Rc::from(step.to_string()));
+ params.insert_rc("value", value.into());
+ params.insert_rc("min", min.to_string().into());
+ params.insert_rc("max", max.to_string().into());
+ params.insert_rc("step", step.to_string().into());
mp.parser_state
.instantiate_template(mp.doc_params, "SliderSetting", mp.layout, id_cell, params)?;
@@ -168,7 +223,6 @@ pub fn options_slider_i32(
let tasks = mp.tasks.clone();
move |_common, e| {
tasks.push(Task::UpdateInt(setting, e.value as i32));
- Ok(())
}
}));
Ok(())
@@ -185,16 +239,16 @@ where
let id = mp.idx.to_string();
mp.idx += 1;
- let mut params: HashMap, Rc> = HashMap::new();
- params.insert(Rc::from("id"), Rc::from(id.as_ref()));
+ let mut params = TemplateParams::new();
+ params.insert("id", &id);
match setting.get_translation() {
- Ok(translation) => params.insert(Rc::from("translation"), translation.into()),
- Err(raw_text) => params.insert(Rc::from("text"), raw_text.into()),
+ Ok(translation) => params.insert("translation", translation),
+ Err(raw_text) => params.insert("text", raw_text),
};
if let Some(tooltip) = setting.get_tooltip() {
- params.insert(Rc::from("tooltip"), Rc::from(tooltip));
+ params.insert("tooltip", tooltip);
}
let id_cell = horiz_cell(mp.layout, parent)?;
@@ -262,10 +316,10 @@ pub fn options_danger_button(
let id = mp.idx.to_string();
mp.idx += 1;
- let mut params: HashMap, Rc> = HashMap::new();
- params.insert(Rc::from("id"), Rc::from(id.as_ref()));
- params.insert(Rc::from("translation"), Rc::from(translation));
- params.insert(Rc::from("icon"), Rc::from(icon));
+ let mut params = TemplateParams::new();
+ params.insert("id", &id);
+ params.insert("translation", translation);
+ params.insert("icon", icon);
mp.parser_state
.instantiate_template(mp.doc_params, "DangerButton", mp.layout, parent, params)?;
@@ -282,6 +336,36 @@ pub fn options_danger_button(
Ok(())
}
+pub fn options_button(
+ mp: &mut MacroParams,
+ parent: WidgetID,
+ translation: &str,
+ icon: &str,
+ task: Task,
+) -> anyhow::Result<()> {
+ let id = mp.idx.to_string();
+ mp.idx += 1;
+
+ let mut params = TemplateParams::new();
+ params.insert("id", &id);
+ params.insert("translation", translation);
+ params.insert("icon", icon);
+
+ mp.parser_state
+ .instantiate_template(mp.doc_params, "ButtonText", mp.layout, parent, params)?;
+
+ let btn = mp.parser_state.fetch_component_as::(&id)?;
+ btn.on_click(Rc::new({
+ let tasks = mp.tasks.clone();
+ move |_common, _e| {
+ tasks.push(task.clone());
+ Ok(())
+ }
+ }));
+
+ Ok(())
+}
+
pub fn options_autostart_app(
mp: &mut MacroParams,
parent: WidgetID,
@@ -291,9 +375,9 @@ pub fn options_autostart_app(
let id = mp.idx.to_string();
mp.idx += 1;
- let mut params: HashMap, Rc> = HashMap::new();
- params.insert(Rc::from("id"), Rc::from(id.as_ref()));
- params.insert(Rc::from("text"), Rc::from(text));
+ let mut params = TemplateParams::new();
+ params.insert("id", &id);
+ params.insert("text", text);
mp.parser_state
.instantiate_template(mp.doc_params, "AutostartApp", mp.layout, parent, params)?;
diff --git a/dash-frontend/src/tab/settings/mod.rs b/dash-frontend/src/tab/settings/mod.rs
index 55eb02a9..bff41c0c 100644
--- a/dash-frontend/src/tab/settings/mod.rs
+++ b/dash-frontend/src/tab/settings/mod.rs
@@ -3,15 +3,15 @@ use std::{marker::PhantomData, rc::Rc, str::FromStr};
use strum::{AsRefStr, EnumProperty, EnumString};
use wgui::{
assets::AssetPath,
+ color::WguiColorName,
components::tabs::ComponentTabs,
- drawing,
- event::{CallbackDataCommon, EventAlterables},
+ event::StyleSetRequest,
globals::WguiGlobals,
i18n::Translation,
layout::{Layout, WidgetID},
log::LogErr,
parser::{Fetchable, ParseDocumentParams, ParserState},
- renderer_vk::text::{FontWeight, TextStyle},
+ renderer_vk::text::{FontWeight, TextStyle, WguiTextShadow},
taffy::{self, prelude::length},
task::Tasks,
widget::{
@@ -20,11 +20,16 @@ use wgui::{
},
windowing::context_menu::{self, Blueprint, ContextMenu, TickResult},
};
-use wlx_common::{config::GeneralConfig, config_io::ConfigRoot, dash_interface::RecenterMode};
+use wlx_common::{
+ config::GeneralConfig,
+ config_io::ConfigRoot,
+ dash_interface::{ConfigChangeKind, DashPlayspaceTask, InterfaceFeats},
+};
use crate::{
- frontend::{Frontend, FrontendTask},
+ frontend::{Frontend, FrontendTask, FrontendTasks},
tab::{Tab, TabType, settings::macros::MacroParams},
+ views::ViewUpdateParams,
};
mod macros;
@@ -33,26 +38,32 @@ mod tab_controls;
mod tab_features;
mod tab_look_and_feel;
mod tab_misc;
+mod tab_skybox;
+mod tab_space_drag;
mod tab_troubleshooting;
#[derive(Clone)]
-enum TabNameEnum {
- LookAndFeel,
- Features,
- Controls,
- Misc,
+pub(crate) enum TabNameEnum {
AutostartApps,
+ Controls,
+ Features,
+ LookAndFeel,
+ Misc,
+ Skybox,
+ SpaceDrag,
Troubleshooting,
}
impl TabNameEnum {
fn from_string(s: &str) -> Option {
match s {
- "look_and_feel" => Some(TabNameEnum::LookAndFeel),
- "features" => Some(TabNameEnum::Features),
- "controls" => Some(TabNameEnum::Controls),
- "misc" => Some(TabNameEnum::Misc),
"autostart_apps" => Some(TabNameEnum::AutostartApps),
+ "controls" => Some(TabNameEnum::Controls),
+ "features" => Some(TabNameEnum::Features),
+ "look_and_feel" => Some(TabNameEnum::LookAndFeel),
+ "misc" => Some(TabNameEnum::Misc),
+ "skybox" => Some(TabNameEnum::Skybox),
+ "space_drag" => Some(TabNameEnum::SpaceDrag),
"troubleshooting" => Some(TabNameEnum::Troubleshooting),
_ => None,
}
@@ -60,19 +71,55 @@ impl TabNameEnum {
}
#[derive(Clone)]
-enum Task {
- UpdateBool(SettingType, bool),
- UpdateFloat(SettingType, f32),
- UpdateInt(SettingType, i32),
- SettingUpdated(SettingType),
- OpenContextMenu(Vec2, Vec),
+pub(crate) enum Task {
ClearPipewireTokens,
ClearSavedState,
DeleteAllConfigs,
- ResetPlayspace,
- RestartSoftware,
+ OpenContextMenu(Vec2, Vec),
RemoveAutostartApp(Rc),
+ ResetPlayspace,
+ ResetPlayspaceCenter,
+ RestartSoftware,
+ SavePlayspaceCenter,
SetTab(TabNameEnum),
+ SettingUpdated(SettingType),
+ UpdateBool(SettingType, bool),
+ UpdateFloat(SettingType, f32),
+ UpdateInt(SettingType, i32),
+}
+
+struct SettingsMountParams<'a> {
+ mp: &'a mut MacroParams<'a>,
+ frontend_tasks: &'a FrontendTasks,
+ id_parent: WidgetID,
+ feats: InterfaceFeats,
+}
+
+struct SettingUpdatedParams<'a> {
+ layout: &'a mut Layout,
+ config: &'a GeneralConfig,
+ setting_type: SettingType,
+}
+
+trait SettingsTab {
+ fn update(&mut self, _par: &mut ViewUpdateParams) -> anyhow::Result<()> {
+ Ok(())
+ }
+
+ fn setting_updated(&mut self, _sup: &mut SettingUpdatedParams) -> anyhow::Result<()> {
+ Ok(())
+ }
+
+ fn context_menu_custom(
+ &mut self,
+ _action: Rc,
+ _config: &mut GeneralConfig,
+ _change_kind: &mut Option,
+ _layout: &mut Layout,
+ _state: &mut ParserState,
+ ) -> anyhow::Result<()> {
+ Ok(())
+ }
}
pub struct TabSettings {
@@ -81,8 +128,11 @@ pub struct TabSettings {
app_button_ids: Vec>,
context_menu: ContextMenu,
+ current_tab: Option>,
+
tasks: Tasks,
marker: PhantomData,
+ frontend_tasks: FrontendTasks,
}
impl Tab for TabSettings {
@@ -91,7 +141,22 @@ impl Tab for TabSettings {
}
fn update(&mut self, frontend: &mut Frontend, _time_ms: u32, data: &mut T) -> anyhow::Result<()> {
- let mut changed = false;
+ if let Some(tab) = &mut self.current_tab {
+ let mut config_change_kind = None;
+
+ tab.update(&mut ViewUpdateParams {
+ layout: &mut frontend.layout,
+ executor: &frontend.executor,
+ general_config: frontend.interface.general_config(data),
+ config_change_kind: &mut config_change_kind,
+ })?;
+
+ if let Some(kind) = config_change_kind {
+ frontend.interface.config_changed(data, kind);
+ }
+ }
+
+ let mut changed = None;
for task in self.tasks.drain() {
match task {
Task::SetTab(tab) => {
@@ -104,7 +169,7 @@ impl Tab for TabSettings {
}
let config = frontend.interface.general_config(data);
*setting.mut_bool(config) = n;
- changed = true;
+ changed = Some(setting.change_kind());
}
Task::UpdateFloat(setting, n) => {
self.tasks.push(Task::SettingUpdated(setting));
@@ -113,7 +178,7 @@ impl Tab for TabSettings {
}
let config = frontend.interface.general_config(data);
*setting.mut_f32(config) = n;
- changed = true;
+ changed = Some(setting.change_kind());
}
Task::UpdateInt(setting, n) => {
self.tasks.push(Task::SettingUpdated(setting));
@@ -122,7 +187,7 @@ impl Tab for TabSettings {
}
let config = frontend.interface.general_config(data);
*setting.mut_i32(config) = n;
- changed = true;
+ changed = Some(setting.change_kind());
}
Task::ClearPipewireTokens => {
let _ = std::fs::remove_file(ConfigRoot::Generic.get_conf_d_path().join("pw_tokens.yaml"))
@@ -137,8 +202,18 @@ impl Tab for TabSettings {
std::fs::remove_dir_all(&path)?;
std::fs::create_dir(&path)?;
}
+ Task::SavePlayspaceCenter => {
+ frontend.interface.playspace_task(data, DashPlayspaceTask::SaveCenter)?;
+ return Ok(());
+ }
+ Task::ResetPlayspaceCenter => {
+ frontend
+ .interface
+ .playspace_task(data, DashPlayspaceTask::ResetCenter)?;
+ return Ok(());
+ }
Task::ResetPlayspace => {
- frontend.interface.recenter_playspace(data, RecenterMode::Reset)?;
+ frontend.interface.playspace_task(data, DashPlayspaceTask::Reset)?;
return Ok(());
}
Task::RestartSoftware => {
@@ -161,50 +236,64 @@ impl Tab for TabSettings {
let config = frontend.interface.general_config(data);
config.autostart_apps.remove(idx);
frontend.layout.remove_widget(widget);
- changed = true;
+ changed = Some(ConfigChangeKind::OverlayConfig);
}
}
- Task::SettingUpdated(setting) => match setting {
- SettingType::UiAnimationSpeed | SettingType::UiGradientIntensity | SettingType::UiRoundMultiplier => {
- // todo: currently, wayvr restart is required to apply these changes (WguiTheme is Rc)
+ Task::SettingUpdated(setting) => {
+ if let Some(tab) = &mut self.current_tab {
+ tab.setting_updated(&mut SettingUpdatedParams {
+ layout: &mut frontend.layout,
+ config: frontend.interface.general_config(data),
+ setting_type: setting,
+ })?;
}
- _ => { /* do nothing */ }
- },
+ match setting {
+ SettingType::UiAnimationSpeed | SettingType::UiGradientIntensity | SettingType::UiRoundMultiplier => {
+ // todo: currently, wayvr restart is required to apply these changes (WguiTheme is Rc)
+ }
+ _ => { /* do nothing */ }
+ }
+ }
}
}
// Dropdown handling
- if let TickResult::Action(name) = self.context_menu.tick(&mut frontend.layout, &mut self.state)?
- && let (Some(setting), Some(id), Some(value), Some(text), Some(translated)) = {
+ if let TickResult::Action(name) = self.context_menu.tick(&mut frontend.layout, &mut self.state)? {
+ if name.starts_with(';')
+ && let Some(tab) = self.current_tab.as_mut()
+ {
+ let config = frontend.interface.general_config(data);
+ let mut change_kind: Option = None;
+ tab.context_menu_custom(name, config, &mut change_kind, &mut frontend.layout, &mut self.state)?;
+ if let Some(change_kind) = change_kind {
+ frontend.interface.config_changed(data, change_kind);
+ }
+ } else if let (Some(setting), Some(id), Some(value), Some(text), Some(translated)) = {
let mut s = name.splitn(5, ';');
(s.next(), s.next(), s.next(), s.next(), s.next())
} {
- let mut label = self
- .state
- .fetch_widget_as::(&frontend.layout.state, &format!("{id}_value"))?;
+ let mut common = frontend.layout.common();
+ let mut label = self
+ .state
+ .fetch_widget_as::(common.state, &format!("{id}_value"))?;
- let mut alterables = EventAlterables::default();
- let mut common = CallbackDataCommon {
- alterables: &mut alterables,
- state: &frontend.layout.state,
- };
+ let translation = Translation {
+ text: text.into(),
+ translated: translated == "1",
+ };
- let translation = Translation {
- text: text.into(),
- translated: translated == "1",
- };
+ label.set_text(&mut common, translation);
- label.set_text(&mut common, translation);
-
- let setting = SettingType::from_str(setting).expect("Invalid Enum string");
- let config = frontend.interface.general_config(data);
- setting.set_enum(config, value);
- changed = true;
+ let setting = SettingType::from_str(setting).expect("Invalid Enum string");
+ let config = frontend.interface.general_config(data);
+ setting.set_enum(config, value);
+ changed = Some(ConfigChangeKind::OverlayConfig);
+ }
}
// Notify overlays of the change
- if changed {
- frontend.interface.config_changed(data);
+ if let Some(changed) = changed {
+ frontend.interface.config_changed(data, changed);
}
Ok(())
@@ -213,8 +302,8 @@ impl Tab for TabSettings {
// Sorted alphabetically
#[allow(clippy::enum_variant_names)]
-#[derive(Clone, Copy, AsRefStr, EnumString)]
-enum SettingType {
+#[derive(Clone, Copy, Eq, PartialEq, AsRefStr, EnumString)]
+pub(crate) enum SettingType {
AllowSliding,
BlockGameInput,
BlockGameInputIgnoreWatch,
@@ -223,10 +312,15 @@ enum SettingType {
ClickFreezeTimeMs,
Clock12h,
DoubleCursorFix,
+ EnableWatch,
FocusFollowsMouseMode,
+ GridOpacity,
+ HandsfreeAltTab,
HandsfreePointer,
HideGrabHelp,
HideUsername,
+ InputCaptureMethod,
+ InputEmulationMethod,
InvertScrollDirectionX,
InvertScrollDirectionY,
KeyboardMiddleClick,
@@ -237,13 +331,24 @@ enum SettingType {
LongPressDuration,
NotificationsEnabled,
NotificationsSoundEnabled,
+ DefaultOverlayScale,
OpaqueBackground,
+ MouseAcceleration,
PointerLerpFactor,
+ MouseSpeed,
ScreenRenderDown,
ScrollSpeed,
+ SnapAngleDeg,
SetsOnWatch,
+ SpaceDragAffectsWorld,
SpaceDragMultiplier,
SpaceDragUnlocked,
+ SpaceGravityDamping,
+ SpaceGravityEnabled,
+ SpaceGravityFlingStrength,
+ SpaceGravityGravity,
+ SpaceGravityGroundFriction,
+ SpaceGravityFloorHeight,
SpaceRotateUnlocked,
UiAnimationSpeed,
UiGradientIntensity,
@@ -251,38 +356,49 @@ enum SettingType {
UprightScreenFix,
UsePassthrough,
UseSkybox,
- GridOpacity,
- XrClickSensitivity,
- XrClickSensitivityRelease,
+ WatchViewAngleMax,
+ WatchViewAngleMin,
XwaylandByDefault,
}
impl SettingType {
+ pub fn change_kind(self) -> ConfigChangeKind {
+ match self {
+ Self::MouseAcceleration | Self::MouseSpeed => ConfigChangeKind::WvrServerConfig,
+ Self::UseSkybox | Self::UsePassthrough => ConfigChangeKind::EnvironmentBlend,
+ _ => ConfigChangeKind::OverlayConfig,
+ }
+ }
+
pub fn mut_bool(self, config: &mut GeneralConfig) -> &mut bool {
match self {
- Self::InvertScrollDirectionX => &mut config.invert_scroll_direction_x,
- Self::InvertScrollDirectionY => &mut config.invert_scroll_direction_y,
- Self::NotificationsEnabled => &mut config.notifications_enabled,
- Self::NotificationsSoundEnabled => &mut config.notifications_sound_enabled,
- Self::KeyboardSoundEnabled => &mut config.keyboard_sound_enabled,
- Self::UprightScreenFix => &mut config.upright_screen_fix,
- Self::DoubleCursorFix => &mut config.double_cursor_fix,
- Self::SetsOnWatch => &mut config.sets_on_watch,
- Self::HideGrabHelp => &mut config.hide_grab_help,
Self::AllowSliding => &mut config.allow_sliding,
- Self::FocusFollowsMouseMode => &mut config.focus_follows_mouse_mode,
- Self::LeftHandedMouse => &mut config.left_handed_mouse,
Self::BlockGameInput => &mut config.block_game_input,
Self::BlockGameInputIgnoreWatch => &mut config.block_game_input_ignore_watch,
Self::BlockPosesOnKbdInteraction => &mut config.block_poses_on_kbd_interaction,
- Self::UseSkybox => &mut config.use_skybox,
- Self::UsePassthrough => &mut config.use_passthrough,
- Self::ScreenRenderDown => &mut config.screen_render_down,
- Self::SpaceDragUnlocked => &mut config.space_drag_unlocked,
- Self::SpaceRotateUnlocked => &mut config.space_rotate_unlocked,
Self::Clock12h => &mut config.clock_12h,
+ Self::DoubleCursorFix => &mut config.double_cursor_fix,
+ Self::EnableWatch => &mut config.enable_watch,
+ Self::FocusFollowsMouseMode => &mut config.focus_follows_mouse_mode,
+ Self::HideGrabHelp => &mut config.hide_grab_help,
Self::HideUsername => &mut config.hide_username,
+ Self::InvertScrollDirectionX => &mut config.invert_scroll_direction_x,
+ Self::InvertScrollDirectionY => &mut config.invert_scroll_direction_y,
+ Self::KeyboardSoundEnabled => &mut config.keyboard_sound_enabled,
+ Self::LeftHandedMouse => &mut config.left_handed_mouse,
+ Self::NotificationsEnabled => &mut config.notifications_enabled,
+ Self::NotificationsSoundEnabled => &mut config.notifications_sound_enabled,
Self::OpaqueBackground => &mut config.opaque_background,
+ Self::MouseAcceleration => &mut config.wvr_mouse_acceleration,
+ Self::ScreenRenderDown => &mut config.screen_render_down,
+ Self::SetsOnWatch => &mut config.sets_on_watch,
+ Self::SpaceDragAffectsWorld => &mut config.space_drag_affects_world,
+ Self::SpaceDragUnlocked => &mut config.space_drag_unlocked,
+ Self::SpaceGravityEnabled => &mut config.space_gravity_enabled,
+ Self::SpaceRotateUnlocked => &mut config.space_rotate_unlocked,
+ Self::UprightScreenFix => &mut config.upright_screen_fix,
+ Self::UsePassthrough => &mut config.use_passthrough,
+ Self::UseSkybox => &mut config.use_skybox,
Self::XwaylandByDefault => &mut config.xwayland_by_default,
Self::KeyboardSwipeToTypeEnabled => &mut config.keyboard_swipe_to_type_enabled,
_ => panic!("Requested bool for non-bool SettingType"),
@@ -291,16 +407,24 @@ impl SettingType {
pub fn mut_f32(self, config: &mut GeneralConfig) -> &mut f32 {
match self {
+ Self::DefaultOverlayScale => &mut config.default_overlay_scale,
+ Self::GridOpacity => &mut config.grid_opacity,
+ Self::LongPressDuration => &mut config.long_press_duration,
+ Self::PointerLerpFactor => &mut config.pointer_lerp_factor,
+ Self::MouseSpeed => &mut config.wvr_mouse_speed,
+ Self::ScrollSpeed => &mut config.scroll_speed,
+ Self::SnapAngleDeg => &mut config.snap_angle_deg,
+ Self::SpaceDragMultiplier => &mut config.space_drag_multiplier,
+ Self::SpaceGravityDamping => &mut config.space_gravity_damping,
+ Self::SpaceGravityFlingStrength => &mut config.space_gravity_fling_strength,
+ Self::SpaceGravityGravity => &mut config.space_gravity_gravity,
+ Self::SpaceGravityGroundFriction => &mut config.space_gravity_ground_friction,
+ Self::SpaceGravityFloorHeight => &mut config.space_gravity_floor_height,
Self::UiAnimationSpeed => &mut config.ui_animation_speed,
Self::UiGradientIntensity => &mut config.ui_gradient_intensity,
Self::UiRoundMultiplier => &mut config.ui_round_multiplier,
- Self::ScrollSpeed => &mut config.scroll_speed,
- Self::LongPressDuration => &mut config.long_press_duration,
- Self::XrClickSensitivity => &mut config.xr_click_sensitivity,
- Self::XrClickSensitivityRelease => &mut config.xr_click_sensitivity_release,
- Self::SpaceDragMultiplier => &mut config.space_drag_multiplier,
- Self::PointerLerpFactor => &mut config.pointer_lerp_factor,
- Self::GridOpacity => &mut config.grid_opacity,
+ Self::WatchViewAngleMax => &mut config.watch_view_angle_max,
+ Self::WatchViewAngleMin => &mut config.watch_view_angle_min,
_ => panic!("Requested f32 for non-f32 SettingType"),
}
}
@@ -317,10 +441,20 @@ impl SettingType {
Self::CaptureMethod => {
config.capture_method = wlx_common::config::CaptureMethod::from_str(value).expect("Invalid enum value!")
}
+ Self::InputCaptureMethod => {
+ config.wvr_input_capture = wlx_common::config::InputCaptureMethod::from_str(value).expect("Invalid enum value!")
+ }
+ Self::InputEmulationMethod => {
+ config.input_emulation_method =
+ wlx_common::config::InputEmulationMethod::from_str(value).expect("Invalid enum value!")
+ }
Self::KeyboardMiddleClick => {
config.keyboard_middle_click_mode =
wlx_common::config::AltModifier::from_str(value).expect("Invalid enum value!")
}
+ Self::HandsfreeAltTab => {
+ config.handsfree_alt_tab = wlx_common::config::HandsfreeAltTab::from_str(value).expect("Invalid enum value!")
+ }
Self::HandsfreePointer => {
config.handsfree_pointer = wlx_common::config::HandsfreePointer::from_str(value).expect("Invalid enum value!")
}
@@ -334,8 +468,11 @@ impl SettingType {
fn get_enum_title(self, config: &mut GeneralConfig) -> Translation {
match self {
Self::CaptureMethod => Self::get_enum_title_inner(config.capture_method),
+ Self::InputCaptureMethod => Self::get_enum_title_inner(config.wvr_input_capture),
+ Self::InputEmulationMethod => Self::get_enum_title_inner(config.input_emulation_method),
Self::KeyboardMiddleClick => Self::get_enum_title_inner(config.keyboard_middle_click_mode),
Self::HandsfreePointer => Self::get_enum_title_inner(config.handsfree_pointer),
+ Self::HandsfreeAltTab => Self::get_enum_title_inner(config.handsfree_alt_tab),
Self::Language => match &config.language {
Some(lang) => Self::get_enum_title_inner(*lang),
None => Translation::from_translation_key("APP_SETTINGS.OPTION.AUTO"),
@@ -373,12 +510,16 @@ impl SettingType {
Self::CaptureMethod => Ok("APP_SETTINGS.CAPTURE_METHOD"),
Self::ClickFreezeTimeMs => Ok("APP_SETTINGS.CLICK_FREEZE_TIME_MS"),
Self::Clock12h => Ok("APP_SETTINGS.CLOCK_12H"),
+ Self::DefaultOverlayScale => Ok("APP_SETTINGS.DEFAULT_OVERLAY_SCALE"),
Self::DoubleCursorFix => Ok("APP_SETTINGS.DOUBLE_CURSOR_FIX"),
Self::FocusFollowsMouseMode => Ok("APP_SETTINGS.FOCUS_FOLLOWS_MOUSE_MODE"),
Self::GridOpacity => Ok("APP_SETTINGS.GRID_OPACITY"),
+ Self::HandsfreeAltTab => Ok("APP_SETTINGS.HANDSFREE_ALT_TAB"),
Self::HandsfreePointer => Ok("APP_SETTINGS.HANDSFREE_POINTER"),
Self::HideGrabHelp => Ok("APP_SETTINGS.HIDE_GRAB_HELP"),
Self::HideUsername => Ok("APP_SETTINGS.HIDE_USERNAME"),
+ Self::InputCaptureMethod => Ok("APP_SETTINGS.INPUT_CAPTURE_METHOD"),
+ Self::InputEmulationMethod => Ok("APP_SETTINGS.INPUT_EMULATION_METHOD"),
Self::InvertScrollDirectionX => Ok("APP_SETTINGS.INVERT_SCROLL_DIRECTION_X"),
Self::InvertScrollDirectionY => Ok("APP_SETTINGS.INVERT_SCROLL_DIRECTION_Y"),
Self::KeyboardMiddleClick => Ok("APP_SETTINGS.KEYBOARD_MIDDLE_CLICK"),
@@ -390,12 +531,23 @@ impl SettingType {
Self::NotificationsEnabled => Ok("APP_SETTINGS.NOTIFICATIONS_ENABLED"),
Self::NotificationsSoundEnabled => Ok("APP_SETTINGS.NOTIFICATIONS_SOUND_ENABLED"),
Self::OpaqueBackground => Ok("APP_SETTINGS.OPAQUE_BACKGROUND"),
+ Self::MouseSpeed => Ok("APP_SETTINGS.POINTER_SPEED"),
+ Self::MouseAcceleration => Ok("APP_SETTINGS.POINTER_ACCELERATION"),
Self::PointerLerpFactor => Ok("APP_SETTINGS.POINTER_LERP_FACTOR"),
Self::ScreenRenderDown => Ok("APP_SETTINGS.SCREEN_RENDER_DOWN"),
Self::ScrollSpeed => Ok("APP_SETTINGS.SCROLL_SPEED"),
+ Self::EnableWatch => Ok("APP_SETTINGS.ENABLE_WATCH"),
Self::SetsOnWatch => Ok("APP_SETTINGS.SETS_ON_WATCH"),
+ Self::SnapAngleDeg => Ok("APP_SETTINGS.SNAP_ANGLE_DEG"),
+ Self::SpaceDragAffectsWorld => Ok("APP_SETTINGS.SPACE_DRAG_AFFECTS_WORLD"),
Self::SpaceDragMultiplier => Ok("APP_SETTINGS.SPACE_DRAG_MULTIPLIER"),
Self::SpaceDragUnlocked => Ok("APP_SETTINGS.SPACE_DRAG_UNLOCKED"),
+ Self::SpaceGravityDamping => Ok("APP_SETTINGS.SPACE_GRAVITY_DAMPING"),
+ Self::SpaceGravityEnabled => Ok("APP_SETTINGS.ENABLED"),
+ Self::SpaceGravityFlingStrength => Ok("APP_SETTINGS.SPACE_GRAVITY_FLING_STRENGTH"),
+ Self::SpaceGravityGravity => Ok("APP_SETTINGS.SPACE_GRAVITY_GRAVITY"),
+ Self::SpaceGravityGroundFriction => Ok("APP_SETTINGS.SPACE_GRAVITY_GROUND_FRICTION"),
+ Self::SpaceGravityFloorHeight => Ok("APP_SETTINGS.SPACE_GRAVITY_FLOOR_HEIGHT"),
Self::SpaceRotateUnlocked => Ok("APP_SETTINGS.SPACE_ROTATE_UNLOCKED"),
Self::UiAnimationSpeed => Ok("APP_SETTINGS.ANIMATION_SPEED"),
Self::UiGradientIntensity => Ok("APP_SETTINGS.UI_GRADIENT_INTENSITY"),
@@ -403,8 +555,8 @@ impl SettingType {
Self::UprightScreenFix => Ok("APP_SETTINGS.UPRIGHT_SCREEN_FIX"),
Self::UsePassthrough => Ok("APP_SETTINGS.USE_PASSTHROUGH"),
Self::UseSkybox => Ok("APP_SETTINGS.USE_SKYBOX"),
- Self::XrClickSensitivity => Ok("APP_SETTINGS.XR_CLICK_SENSITIVITY"),
- Self::XrClickSensitivityRelease => Ok("APP_SETTINGS.XR_CLICK_SENSITIVITY_RELEASE"),
+ Self::WatchViewAngleMax => Ok("APP_SETTINGS.WATCH_VIEW_ANGLE"),
+ Self::WatchViewAngleMin => Ok("APP_SETTINGS.WATCH_VIEW_ANGLE"),
Self::XwaylandByDefault => Ok("APP_SETTINGS.XWAYLAND_BY_DEFAULT"),
}
}
@@ -416,18 +568,29 @@ impl SettingType {
Self::BlockGameInputIgnoreWatch => Some("APP_SETTINGS.BLOCK_GAME_INPUT_IGNORE_WATCH_HELP"),
Self::BlockPosesOnKbdInteraction => Some("APP_SETTINGS.BLOCK_POSES_ON_KBD_INTERACTION_HELP"),
Self::CaptureMethod => Some("APP_SETTINGS.CAPTURE_METHOD_HELP"),
+ Self::DefaultOverlayScale => Some("APP_SETTINGS.DEFAULT_OVERLAY_SCALE_HELP"),
Self::DoubleCursorFix => Some("APP_SETTINGS.DOUBLE_CURSOR_FIX_HELP"),
Self::GridOpacity => Some("APP_SETTINGS.GRID_OPACITY_HELP"),
+ Self::HandsfreeAltTab => Some("APP_SETTINGS.HANDSFREE_ALT_TAB_HELP"),
Self::HandsfreePointer => Some("APP_SETTINGS.HANDSFREE_POINTER_HELP"),
+ Self::InputCaptureMethod => Some("APP_SETTINGS.INPUT_CAPTURE_METHOD_HELP"),
+ Self::InputEmulationMethod => Some("APP_SETTINGS.INPUT_EMULATION_METHOD_HELP"),
Self::KeyboardMiddleClick => Some("APP_SETTINGS.KEYBOARD_MIDDLE_CLICK_HELP"),
Self::KeyboardSwipeToTypeEnabled => Some("APP_SETTINGS.KEYBOARD_SWIPE_TO_TYPE_ENABLED_HELP"),
Self::LeftHandedMouse => Some("APP_SETTINGS.LEFT_HANDED_MOUSE_HELP"),
+ Self::MouseAcceleration => Some("APP_SETTINGS.POINTER_ACCELERATION_HELP"),
Self::ScreenRenderDown => Some("APP_SETTINGS.SCREEN_RENDER_DOWN_HELP"),
+ Self::SnapAngleDeg => Some("APP_SETTINGS.SNAP_ANGLE_DEG_HELP"),
+ Self::SpaceGravityDamping => Some("APP_SETTINGS.SPACE_GRAVITY_DAMPING_HELP"),
+ Self::SpaceGravityFlingStrength => Some("APP_SETTINGS.SPACE_GRAVITY_FLING_STRENGTH_HELP"),
+ Self::SpaceGravityFloorHeight => Some("APP_SETTINGS.SPACE_GRAVITY_FLOOR_HEIGHT_HELP"),
+ Self::SpaceGravityGravity => Some("APP_SETTINGS.SPACE_GRAVITY_GRAVITY_HELP"),
+ Self::SpaceGravityGroundFriction => Some("APP_SETTINGS.SPACE_GRAVITY_GROUND_FRICTION_HELP"),
Self::UprightScreenFix => Some("APP_SETTINGS.UPRIGHT_SCREEN_FIX_HELP"),
Self::UsePassthrough => Some("APP_SETTINGS.USE_PASSTHROUGH_HELP"),
Self::UseSkybox => Some("APP_SETTINGS.USE_SKYBOX_HELP"),
- Self::XrClickSensitivity => Some("APP_SETTINGS.XR_CLICK_SENSITIVITY_HELP"),
- Self::XrClickSensitivityRelease => Some("APP_SETTINGS.XR_CLICK_SENSITIVITY_RELEASE_HELP"),
+ Self::WatchViewAngleMax => Some("APP_SETTINGS.WATCH_VIEW_ANGLE_HELP"),
+ Self::WatchViewAngleMin => Some("APP_SETTINGS.WATCH_VIEW_ANGLE_HELP"),
_ => None,
}
}
@@ -440,9 +603,9 @@ impl SettingType {
| Self::UiGradientIntensity
| Self::UprightScreenFix
| Self::DoubleCursorFix
- | Self::ScreenRenderDown
| Self::Language
| Self::CaptureMethod
+ | Self::InputEmulationMethod
)
}
@@ -456,13 +619,13 @@ impl SettingType {
}
// creates a simple div with horizontal, centered flow
-fn horiz_cell(layout: &mut Layout, parent: WidgetID) -> anyhow::Result {
+pub fn horiz_cell(layout: &mut Layout, parent: WidgetID) -> anyhow::Result {
let (pair, _) = layout.add_child(
parent,
WidgetDiv::create(),
taffy::Style {
flex_direction: taffy::FlexDirection::Row,
- align_items: Some(taffy::AlignItems::Center),
+ align_items: Some(taffy::AlignItems::CENTER),
gap: length(8.0),
..Default::default()
},
@@ -479,11 +642,17 @@ fn mount_requires_restart(layout: &mut Layout, parent: WidgetID) -> anyhow::Resu
content,
style: TextStyle {
wrap: false,
- color: Some(drawing::Color::new(1.0, 0.5, 0.5, 1.0)),
+ color: Some(WguiColorName::Danger.into()),
weight: Some(FontWeight::Bold),
size: Some(10.0),
+ shadow: Some(WguiTextShadow {
+ x: 2.0,
+ y: 2.0,
+ ..Default::default()
+ }),
..Default::default()
},
+ ..Default::default()
},
);
@@ -504,6 +673,9 @@ impl TabSettings {
let root = self.state.get_widget_id("settings_root")?;
frontend.layout.remove_children(root);
let globals = frontend.layout.state.globals.clone();
+ self.current_tab = None;
+
+ let feats = frontend.interface.get_feats(data);
let mut mp = MacroParams {
layout: &mut frontend.layout,
@@ -514,31 +686,47 @@ impl TabSettings {
idx: 9001,
};
+ let settings_mount_params = SettingsMountParams {
+ mp: &mut mp,
+ id_parent: root,
+ frontend_tasks: &self.frontend_tasks,
+ feats,
+ };
+
match name {
TabNameEnum::LookAndFeel => {
- tab_look_and_feel::mount(&mut mp, root)?;
+ self.current_tab = Some(Box::new(tab_look_and_feel::State::mount(settings_mount_params)?));
}
TabNameEnum::Features => {
- tab_features::mount(&mut mp, root)?;
+ self.current_tab = Some(Box::new(tab_features::State::mount(settings_mount_params)?));
+ }
+ TabNameEnum::SpaceDrag => {
+ self.current_tab = Some(Box::new(tab_space_drag::State::mount(settings_mount_params)?));
}
TabNameEnum::Controls => {
- tab_controls::mount(&mut mp, root)?;
+ self.current_tab = Some(Box::new(tab_controls::State::mount(settings_mount_params)?));
}
TabNameEnum::Misc => {
- tab_misc::mount(&mut mp, root)?;
+ self.current_tab = Some(Box::new(tab_misc::State::mount(settings_mount_params)?));
}
TabNameEnum::AutostartApps => {
- tab_autostart_apps::mount(&mut mp, root, &mut self.app_button_ids)?;
+ self.current_tab = Some(Box::new(tab_autostart_apps::State::mount(
+ settings_mount_params,
+ &mut self.app_button_ids,
+ )?));
}
TabNameEnum::Troubleshooting => {
- tab_troubleshooting::mount(&mut mp, root)?;
+ self.current_tab = Some(Box::new(tab_troubleshooting::State::mount(settings_mount_params)?));
+ }
+ TabNameEnum::Skybox => {
+ self.current_tab = Some(Box::new(tab_skybox::State::mount(settings_mount_params)?));
}
}
Ok(())
}
- pub fn new(frontend: &mut Frontend, parent_id: WidgetID, _data: &mut T) -> anyhow::Result {
+ pub fn new(frontend: &mut Frontend, parent_id: WidgetID, data: &mut T) -> anyhow::Result {
let doc_params = ParseDocumentParams {
globals: frontend.layout.state.globals.clone(),
path: AssetPath::BuiltIn("gui/tab/settings.xml"),
@@ -548,6 +736,16 @@ impl TabSettings {
let parser_state = wgui::parser::parse_from_assets(&doc_params, &mut frontend.layout, parent_id)?;
let tasks = Tasks::default();
let tabs = parser_state.fetch_component_as::("tabs")?;
+
+ if !frontend.interface.get_feats(data).openxr {
+ let skybox_btn = tabs.get_tab_button("skybox").unwrap();
+ frontend
+ .layout
+ .common()
+ .alterables
+ .set_style(skybox_btn.get_rect(), StyleSetRequest::Display(taffy::Display::None));
+ }
+
tabs.on_select({
let tasks = tasks.clone();
Rc::new(move |_common, evt| {
@@ -566,6 +764,8 @@ impl TabSettings {
state: parser_state,
marker: PhantomData,
context_menu: ContextMenu::default(),
+ current_tab: None,
+ frontend_tasks: frontend.tasks.clone(),
})
}
}
diff --git a/dash-frontend/src/tab/settings/tab_autostart_apps.rs b/dash-frontend/src/tab/settings/tab_autostart_apps.rs
index 6483fc94..76986f88 100644
--- a/dash-frontend/src/tab/settings/tab_autostart_apps.rs
+++ b/dash-frontend/src/tab/settings/tab_autostart_apps.rs
@@ -1,19 +1,33 @@
use std::rc::Rc;
-use crate::tab::settings::macros::{MacroParams, options_autostart_app, options_category};
-use wgui::layout::WidgetID;
+use crate::tab::settings::{
+ SettingsMountParams, SettingsTab,
+ macros::{options_autostart_app, options_category},
+};
-pub fn mount(mp: &mut MacroParams, parent: WidgetID, app_button_ids: &mut Vec>) -> anyhow::Result<()> {
- *app_button_ids = Vec::new();
+pub struct State {}
- if !mp.config.autostart_apps.is_empty() {
- let c = options_category(mp, parent, "APP_SETTINGS.AUTOSTART_APPS", "dashboard/apps.svg")?;
+impl SettingsTab for State {}
- // todo: prevent clone
- let autostart_apps = mp.config.autostart_apps.clone();
- for app in autostart_apps {
- options_autostart_app(mp, c, &app.name, app_button_ids)?;
+impl State {
+ pub fn mount(par: SettingsMountParams, app_button_ids: &mut Vec>) -> anyhow::Result