Merge branch 'main' into feat/configurable-exclusion-zone

This commit is contained in:
SpeakingPNG
2026-03-08 16:52:52 +01:00
committed by GitHub
130 changed files with 2797 additions and 1591 deletions
+1
View File
@@ -25,6 +25,7 @@ Add screenshots if applicable.
- Distro: [e.g., CachyOS, NixOS, Arch, ...]
- Compositor: [ e.g., Hyprland, Niri, ...]
- Noctalia-shell Version: [e.g., 1.0.0, available in About tab]
- Noctalia QS Version: [e.g., 0.0.4, please check your package manager]
- Monitor resolution: [e.g., 1920x1080]
### Additional Context
+2
View File
@@ -2,6 +2,8 @@
<!-- If this is a color scheme PR, please create it in https://github.com/noctalia-dev/noctalia-colorschemes instead -->
If this PR is not ready for review yet, please mark it as **Draft** until it's good to be reviewed.
## Motivation
Provide a clear and concise explanation of what this PR does and why it is needed.
+6 -6
View File
@@ -9,9 +9,9 @@
"mError": "#D95757",
"mOnError": "#0B0E14",
"mSurface": "#0B0E14",
"mOnSurface": "#BFBDB6",
"mOnSurface": "#D1D1C7",
"mSurfaceVariant": "#1e222a",
"mOnSurfaceVariant": "#636A72",
"mOnSurfaceVariant": "#8E959E",
"mOutline": "#565B66",
"mShadow": "#000000",
"mHover": "#39BAE6",
@@ -37,7 +37,7 @@
"cyan": "#95e6cb",
"white": "#ffffff"
},
"foreground": "#cccac2",
"foreground": "#D1D1C7",
"background": "#1f2430",
"selectionFg": "#1f2430",
"selectionBg": "#409fff",
@@ -55,9 +55,9 @@
"mError": "#E65050",
"mOnError": "#F8F9FA",
"mSurface": "#F8F9FA",
"mOnSurface": "#5C6166",
"mOnSurface": "#42474C",
"mSurfaceVariant": "#E4E6E9",
"mOnSurfaceVariant": "#8A9199",
"mOnSurfaceVariant": "#6E757C",
"mOutline": "#8A9199",
"mShadow": "#F8F9FA",
"mHover": "#55B4D4",
@@ -83,7 +83,7 @@
"cyan": "#4cbf99",
"white": "#d1d1d1"
},
"foreground": "#5c6166",
"foreground": "#42474C",
"background": "#f8f9fa",
"selectionFg": "#f8f9fa",
"selectionBg": "#035bd6",
@@ -4,6 +4,7 @@
"os",
"kernel",
"title",
"board",
"host",
"uptime",
"cpu",
+7 -7
View File
@@ -148,13 +148,13 @@
;; Org mode with hidden asterisks
`(org-level-1 ((t (:foreground ,primary :weight bold :height 1.2))))
`(org-level-2 ((t (:foreground ,primary-container :weight bold :height 1.1))))
`(org-level-3 ((t (:foreground ,secondary :weight bold))))
`(org-level-4 ((t (:foreground ,secondary-container :weight bold))))
`(org-level-5 ((t (:foreground ,tertiary :weight bold))))
`(org-level-6 ((t (:foreground ,tertiary-container :weight bold))))
`(org-level-7 ((t (:foreground ,primary-fixed :weight bold))))
`(org-level-8 ((t (:foreground ,primary-fixed-dim :weight bold))))
`(org-level-2 ((t (:foreground ,secondary :weight bold :height 1.1))))
`(org-level-3 ((t (:foreground ,tertiary :weight bold))))
`(org-level-4 ((t (:foreground ,primary :weight bold))))
`(org-level-5 ((t (:foreground ,secondary :weight bold))))
`(org-level-6 ((t (:foreground ,tertiary :weight bold))))
`(org-level-7 ((t (:foreground ,primary :weight bold))))
`(org-level-8 ((t (:foreground ,secondary :weight bold))))
`(org-document-title ((t (:foreground ,primary :weight bold :height 1.3))))
`(org-document-info ((t (:foreground ,primary-container))))
`(org-todo ((t (:foreground ,err :weight bold))))
+7 -3
View File
@@ -1,4 +1,8 @@
[ColorScheme]
active_colors={{colors.on_background.default.hex}}, {{colors.surface.default.hex}}, #ffffff, #cacaca, #9f9f9f, #b8b8b8, {{colors.on_background.default.hex}}, #ffffff, {{colors.on_surface.default.hex}}, {{colors.background.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary_container.default.hex}}, {{colors.on_primary_container.default.hex}}, {{colors.secondary.default.hex}}, {{colors.primary.default.hex}}, {{colors.surface.default.hex}}, {{colors.surface.default.hex}}, {{colors.surface.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.secondary.default.hex}}
disabled_colors={{colors.on_background.default.hex}}, {{colors.surface.default.hex}}, #ffffff, #cacaca, #9f9f9f, #b8b8b8, {{colors.on_background.default.hex}}, #ffffff, {{colors.on_surface.default.hex}}, {{colors.background.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary_container.default.hex}}, {{colors.on_primary_container.default.hex}}, {{colors.secondary.default.hex}}, {{colors.primary.default.hex}}, {{colors.surface.default.hex}}, {{colors.surface.default.hex}}, {{colors.surface.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.secondary.default.hex}}
inactive_colors={{colors.on_background.default.hex}}, {{colors.surface.default.hex}}, #ffffff, #cacaca, #9f9f9f, #b8b8b8, {{colors.on_background.default.hex}}, #ffffff, {{colors.on_surface.default.hex}}, {{colors.background.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary_container.default.hex}}, {{colors.on_primary_container.default.hex}}, {{colors.secondary.default.hex}}, {{colors.primary.default.hex}}, {{colors.surface.default.hex}}, {{colors.surface.default.hex}}, {{colors.surface.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.secondary.default.hex}}
#https://doc.qt.io/archives/qt-5.15/qpalette.html
#https://doc.qt.io/qt-6/qpalette.html - Qt6 didn't add/delete/change any of the color functions or docs
# functions that correspond to the colors definition location
# windowText,button,light,midlight,dark,mid,text,brightText,buttonText,base,window,shadow,highlight,highlightedText,link,linkVisited,alternateBase,NO_IDEA (just use some sane default),toolTipBase,toolTipText,placeholderText,accent
active_colors={{colors.on_background.default.hex}}, {{colors.surface.default.hex}}, #ffffff, #cacaca, #9f9f9f, #b8b8b8, {{colors.on_background.default.hex}}, #ffffff, {{colors.on_surface.default.hex}}, {{colors.background.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary_container.default.hex}}, {{colors.on_primary_container.default.hex}}, {{colors.secondary.default.hex}}, {{colors.primary.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.surface.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.primary.default.hex}}
disabled_colors={{colors.on_background.default.hex}}, {{colors.surface.default.hex}}, #ffffff, #cacaca, #9f9f9f, #b8b8b8, {{colors.on_background.default.hex}}, #ffffff, {{colors.on_surface.default.hex}}, {{colors.background.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary_container.default.hex}}, {{colors.on_primary_container.default.hex}}, {{colors.secondary.default.hex}}, {{colors.primary.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.surface.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.primary.default.hex}}
inactive_colors={{colors.on_background.default.hex}}, {{colors.surface.default.hex}}, #ffffff, #cacaca, #9f9f9f, #b8b8b8, {{colors.on_background.default.hex}}, #ffffff, {{colors.on_surface.default.hex}}, {{colors.background.default.hex}}, {{colors.background.default.hex}}, {{colors.shadow.default.hex}}, {{colors.primary_container.default.hex}}, {{colors.on_primary_container.default.hex}}, {{colors.secondary.default.hex}}, {{colors.primary.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.surface.default.hex}}, {{colors.surface_variant.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.on_surface.default.hex}}, {{colors.primary.default.hex}}
@@ -0,0 +1,33 @@
# Colors (Noctalia)
[colors.bright]
black = '{{colors.terminal_bright_black.default.hex}}'
blue = '{{colors.terminal_bright_blue.default.hex}}'
cyan = '{{colors.terminal_bright_cyan.default.hex}}'
green = '{{colors.terminal_bright_green.default.hex}}'
magenta = '{{colors.terminal_bright_magenta.default.hex}}'
red = '{{colors.terminal_bright_red.default.hex}}'
white = '{{colors.terminal_bright_white.default.hex}}'
yellow = '{{colors.terminal_bright_yellow.default.hex}}'
[colors.cursor]
cursor = '{{colors.terminal_cursor.default.hex}}'
text = '{{colors.terminal_cursor_text.default.hex}}'
[colors.normal]
black = '{{colors.terminal_normal_black.default.hex}}'
blue = '{{colors.terminal_normal_blue.default.hex}}'
cyan = '{{colors.terminal_normal_cyan.default.hex}}'
green = '{{colors.terminal_normal_green.default.hex}}'
magenta = '{{colors.terminal_normal_magenta.default.hex}}'
red = '{{colors.terminal_normal_red.default.hex}}'
white = '{{colors.terminal_normal_white.default.hex}}'
yellow = '{{colors.terminal_normal_yellow.default.hex}}'
[colors.primary]
background = '{{colors.terminal_background.default.hex}}'
foreground = '{{colors.terminal_foreground.default.hex}}'
[colors.selection]
background = '{{colors.terminal_selection_bg.default.hex}}'
text = '{{colors.terminal_selection_fg.default.hex}}'
+22
View File
@@ -0,0 +1,22 @@
[colors-dark]
foreground={{colors.terminal_foreground.default.hex_stripped}}
background={{colors.terminal_background.default.hex_stripped}}
regular0={{colors.terminal_normal_black.default.hex_stripped}}
regular1={{colors.terminal_normal_red.default.hex_stripped}}
regular2={{colors.terminal_normal_green.default.hex_stripped}}
regular3={{colors.terminal_normal_yellow.default.hex_stripped}}
regular4={{colors.terminal_normal_blue.default.hex_stripped}}
regular5={{colors.terminal_normal_magenta.default.hex_stripped}}
regular6={{colors.terminal_normal_cyan.default.hex_stripped}}
regular7={{colors.terminal_normal_white.default.hex_stripped}}
bright0={{colors.terminal_bright_black.default.hex_stripped}}
bright1={{colors.terminal_bright_red.default.hex_stripped}}
bright2={{colors.terminal_bright_green.default.hex_stripped}}
bright3={{colors.terminal_bright_yellow.default.hex_stripped}}
bright4={{colors.terminal_bright_blue.default.hex_stripped}}
bright5={{colors.terminal_bright_magenta.default.hex_stripped}}
bright6={{colors.terminal_bright_cyan.default.hex_stripped}}
bright7={{colors.terminal_bright_white.default.hex_stripped}}
selection-foreground={{colors.terminal_selection_fg.default.hex_stripped}}
selection-background={{colors.terminal_selection_bg.default.hex_stripped}}
cursor={{colors.terminal_cursor_text.default.hex_stripped}} {{colors.terminal_cursor.default.hex_stripped}}
@@ -0,0 +1,22 @@
palette = 0={{colors.terminal_normal_black.default.hex}}
palette = 1={{colors.terminal_normal_red.default.hex}}
palette = 2={{colors.terminal_normal_green.default.hex}}
palette = 3={{colors.terminal_normal_yellow.default.hex}}
palette = 4={{colors.terminal_normal_blue.default.hex}}
palette = 5={{colors.terminal_normal_magenta.default.hex}}
palette = 6={{colors.terminal_normal_cyan.default.hex}}
palette = 7={{colors.terminal_normal_white.default.hex}}
palette = 8={{colors.terminal_bright_black.default.hex}}
palette = 9={{colors.terminal_bright_red.default.hex}}
palette = 10={{colors.terminal_bright_green.default.hex}}
palette = 11={{colors.terminal_bright_yellow.default.hex}}
palette = 12={{colors.terminal_bright_blue.default.hex}}
palette = 13={{colors.terminal_bright_magenta.default.hex}}
palette = 14={{colors.terminal_bright_cyan.default.hex}}
palette = 15={{colors.terminal_bright_white.default.hex}}
background = {{colors.terminal_background.default.hex}}
foreground = {{colors.terminal_foreground.default.hex}}
cursor-color = {{colors.terminal_cursor.default.hex}}
cursor-text = {{colors.terminal_cursor_text.default.hex}}
selection-background = {{colors.terminal_selection_bg.default.hex}}
selection-foreground = {{colors.terminal_selection_fg.default.hex}}
@@ -0,0 +1,24 @@
color0 {{colors.terminal_normal_black.default.hex}}
color1 {{colors.terminal_normal_red.default.hex}}
color2 {{colors.terminal_normal_green.default.hex}}
color3 {{colors.terminal_normal_yellow.default.hex}}
color4 {{colors.terminal_normal_blue.default.hex}}
color5 {{colors.terminal_normal_magenta.default.hex}}
color6 {{colors.terminal_normal_cyan.default.hex}}
color7 {{colors.terminal_normal_white.default.hex}}
color8 {{colors.terminal_bright_black.default.hex}}
color9 {{colors.terminal_bright_red.default.hex}}
color10 {{colors.terminal_bright_green.default.hex}}
color11 {{colors.terminal_bright_yellow.default.hex}}
color12 {{colors.terminal_bright_blue.default.hex}}
color13 {{colors.terminal_bright_magenta.default.hex}}
color14 {{colors.terminal_bright_cyan.default.hex}}
color15 {{colors.terminal_bright_white.default.hex}}
background {{colors.terminal_background.default.hex}}
selection_foreground {{colors.terminal_cursor_text.default.hex}}
cursor {{colors.terminal_cursor.default.hex}}
cursor_text_color {{colors.terminal_cursor_text.default.hex}}
foreground {{colors.terminal_foreground.default.hex}}
selection_background {{colors.terminal_foreground.default.hex}}
active_border_color {{colors.primary.default.hex}}
inactive_border_color {{colors.secondary.default.hex}}
@@ -0,0 +1,84 @@
[colors]
ansi = [
"{{colors.terminal_normal_black.default.hex}}",
"{{colors.terminal_normal_red.default.hex}}",
"{{colors.terminal_normal_green.default.hex}}",
"{{colors.terminal_normal_yellow.default.hex}}",
"{{colors.terminal_normal_blue.default.hex}}",
"{{colors.terminal_normal_magenta.default.hex}}",
"{{colors.terminal_normal_cyan.default.hex}}",
"{{colors.terminal_normal_white.default.hex}}",
]
background = "{{colors.terminal_background.default.hex}}"
brights = [
"{{colors.terminal_bright_black.default.hex}}",
"{{colors.terminal_bright_red.default.hex}}",
"{{colors.terminal_bright_green.default.hex}}",
"{{colors.terminal_bright_yellow.default.hex}}",
"{{colors.terminal_bright_blue.default.hex}}",
"{{colors.terminal_bright_magenta.default.hex}}",
"{{colors.terminal_bright_cyan.default.hex}}",
"{{colors.terminal_bright_white.default.hex}}",
]
compose_cursor = "{{colors.terminal_cursor.default.hex}}"
cursor_bg = "{{colors.terminal_cursor.default.hex}}"
cursor_border = "{{colors.terminal_cursor.default.hex}}"
cursor_fg = "{{colors.terminal_cursor_text.default.hex}}"
foreground = "{{colors.terminal_foreground.default.hex}}"
scrollbar_thumb = "{{colors.terminal_selection_bg.default.hex}}"
selection_bg = "{{colors.terminal_selection_bg.default.hex}}"
selection_fg = "{{colors.terminal_selection_fg.default.hex}}"
split = "{{colors.terminal_bright_black.default.hex}}"
visual_bell = "{{colors.terminal_normal_black.default.hex}}"
[colors.indexed]
16 = "{{colors.secondary.default.hex}}"
17 = "{{colors.terminal_cursor.default.hex}}"
[colors.tab_bar]
background = "{{colors.terminal_background.default.hex | darken 0.1}}"
inactive_tab_edge = "{{colors.terminal_selection_bg.default.hex}}"
[colors.tab_bar.active_tab]
bg_color = "{{colors.primary.default.hex}}"
fg_color = "{{colors.on_primary.default.hex}}"
intensity = "Normal"
italic = false
strikethrough = false
underline = "None"
[colors.tab_bar.inactive_tab]
bg_color = "{{colors.terminal_background.default.hex | darken 0.05}}"
fg_color = "{{colors.terminal_foreground.default.hex}}"
intensity = "Normal"
italic = false
strikethrough = false
underline = "None"
[colors.tab_bar.inactive_tab_hover]
bg_color = "{{colors.terminal_background.default.hex}}"
fg_color = "{{colors.terminal_foreground.default.hex}}"
intensity = "Normal"
italic = false
strikethrough = false
underline = "None"
[colors.tab_bar.new_tab]
bg_color = "{{colors.terminal_selection_bg.default.hex}}"
fg_color = "{{colors.terminal_foreground.default.hex}}"
intensity = "Normal"
italic = false
strikethrough = false
underline = "None"
[colors.tab_bar.new_tab_hover]
bg_color = "{{colors.terminal_bright_black.default.hex}}"
fg_color = "{{colors.terminal_foreground.default.hex}}"
intensity = "Normal"
italic = false
strikethrough = false
underline = "None"
[metadata]
author = "Noctalia"
name = "Noctalia"
@@ -44,10 +44,6 @@
--zen-primary-color: {{colors.primary.default.hex}} !important;
}
groupbox , moz-card{
background: {{colors.surface_container.default.hex}} !important;
}
button,
groupbox menulist {
background: {{colors.surface_container_high.default.hex}} !important;
+40 -14
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "Wählen Sie die Farbe für den Visualisierer aus.",
"color-name-label": "Füllfarbe",
"height-description": "Benutzerdefinierte Komponentenbreite.",
"hide-when-idle-description": "Wenn aktiviert, wird der Visualizer ausgeblendet, sofern keine Wiedergabe läuft.",
"hide-when-idle-label": "Ausblenden, wenn keine Medien wiedergegeben werden",
"width-description": "Benutzerdefinierte Komponentenbreite."
@@ -293,6 +294,8 @@
"focused-color-label": "Farbe der fokussierten Arbeitsfläche",
"follow-focused-screen-description": "Zeige Arbeitsflächen vom aktuell fokussierten Bildschirm an, statt vom Bildschirm, auf dem sich die Leiste befindet.",
"follow-focused-screen-label": "Fokussiertem Bildschirm folgen",
"font-weight-description": "Visuelles Gewicht für Text im Arbeitsbereich festlegen.",
"font-weight-label": "Schriftstärke",
"grouped-border-opacity-description": "Legen Sie die Deckkraft für Arbeitsflächen-Container-Rahmen fest.",
"grouped-border-opacity-label": "Rahmen-Deckkraft",
"hide-unoccupied-description": "Arbeitsflächen ohne Fenster nicht anzeigen.",
@@ -376,6 +379,7 @@
"add": "Hinzufügen",
"appearance": "Aussehen",
"apply": "Anwenden",
"auto-connect": "Automatisches Verbinden",
"automation": "Automatisierung",
"available": "Verfügbar",
"back": "Zurück",
@@ -426,6 +430,11 @@
"execute": "Ausführen",
"faithful": "Originalgetreu",
"focus": "Fokus",
"font-weight-bold": "Fett",
"font-weight-light": "Leicht",
"font-weight-medium": "Mittel",
"font-weight-regular": "Regulär",
"font-weight-semibold": "Halbfett",
"frequency": "Frequenz",
"gateway": "Gateway",
"general": "Allgemein",
@@ -470,6 +479,7 @@
"panels": "Panels",
"password": "Passwort",
"pause": "Pause",
"performance": "Leistung",
"pin": "Anpinnen",
"play": "Wiedergabe",
"polling": "Abfrageintervall",
@@ -709,6 +719,7 @@
"debug-disabled": "Debug-Modus deaktiviert",
"debug-enabled": "Debug-Modus aktiviert",
"info-copied": "Info in die Zwischenablage kopiert",
"noctalia-available": "Verfügbar:",
"noctalia-desc": "Eine elegante und minimalistische Desktop-Shell, sorgfältig für Wayland entwickelt, gebaut mit Quickshell.",
"noctalia-git-commit": "Git-Commit:",
"noctalia-installed-version": "Installierte Version:",
@@ -721,6 +732,7 @@
"supporters-desc": "Ein riesiges Dankeschön an unseren großartigen Unterstützer!",
"supporters-desc-plural": "Ein riesiges Dankeschön an unsere <b>{count} großartigen</b> Unterstützer!",
"supporters-loading": "Supporter werden geladen...",
"system-board": "Motherboard:",
"system-cpu": "CPU:",
"system-disk": "Festplatte:",
"system-gpu": "GPU:",
@@ -844,14 +856,14 @@
"behavior-middle-click-command-description": "Befehl, der bei Mittelklick ausgeführt wird.",
"behavior-middle-click-command-label": "Mittelklick-Befehl",
"behavior-middle-click-command-placeholder": "niri msg action Übersicht umschalten",
"behavior-middle-click-description": "Wähle, was ein mittlerer Klick auf leeren Bereichen der Leiste bewirkt.",
"behavior-middle-click-description": "Wählen Sie, was ein mittlerer Klick auf leeren Bereichen der Leiste bewirkt.",
"behavior-middle-click-follow-mouse-description": "Öffne das ausgewählte Mittelklick-Panel an der Cursorposition.",
"behavior-middle-click-follow-mouse-label": "Mittelklick folgt Maus",
"behavior-middle-click-label": "Aktion bei Mittelklick auf die Leiste",
"behavior-right-click-command-description": "Befehl, der beim Rechtsklick ausgeführt wird.",
"behavior-right-click-command-label": "Rechtsklick-Befehl",
"behavior-right-click-command-placeholder": "notify-send \"Rechtsklick\"",
"behavior-right-click-description": "Wähle, was ein Rechtsklick auf leere Bereiche der Leiste bewirkt.",
"behavior-right-click-description": "Wählen Sie, was ein Rechtsklick auf leere Bereiche der Leiste bewirkt.",
"behavior-right-click-follow-mouse-description": "Öffne das ausgewählte Rechtsklick-Panel an der Cursorposition.",
"behavior-right-click-follow-mouse-label": "Rechtsklick folgt Maus",
"behavior-right-click-label": "Aktion bei Rechtsklick auf die Leiste",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "Tastenkombinationshinweise bei den Sitzungsoptionen anzeigen.",
"show-keybinds-label": "Tastenkombinationen anzeigen"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Desktop-Widgets sichtbar lassen, während der Noctalia Leistungsmodus aktiviert ist.",
"noctalia-performance-disable-desktop-widgets-label": "Aktiviere Desktop-Widgets im Leistungsmodus",
"noctalia-performance-disable-wallpaper-description": "Halte Desktop-, Übersicht- und Sperrbildschirm-Hintergrundbilder sichtbar, während der Noctalia Leistungsmodus aktiviert ist.",
"noctalia-performance-disable-wallpaper-label": "Hintergrundbild-Rendering im Leistungsmodus aktivieren",
"title": "System"
},
"system-monitor": {
"critical-color-label": "Kritische Farbe",
"custom-highlight-colors-title-label": "Benutzerdefinierte Hervorhebungsfarben",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "Abfrageintervall",
"polling-section-description": "Konfigurieren Sie, wie oft jede Systemmetrik aktualisiert wird.",
"polling-section-label": "Abfrageintervalle",
"threshold-critical": "Kritische Schwelle",
"threshold-warning": "Warnschwelle",
"threshold-critical": "Kritisch",
"threshold-warning": "Warnung",
"thresholds-section-description": "Passe die Warn-/Kritisch-Schwellen und die Abfrageintervalle für jede Systemmetrik an.",
"use-custom-highlight-colors-description": "Wenn deaktiviert, werden die Standard-Hervorhebungsfarben des Themes verwendet.",
"use-custom-highlight-colors-label": "Benutzerdefinierte Hervorhebungsfarben verwenden",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "Animationsgeschwindigkeit",
"animation-speed-reset": "Animationsgeschwindigkeit zurücksetzen",
"appearance-desc": "Visuelle Elemente wie Tooltips, Rahmen und Schatten anpassen.",
"blur-behind-description": "Macht den Bereich hinter Leisten und Panels unscharf mithilfe des Compositor-Blur-Protokolls.",
"blur-behind-label": "Hintergrundunschärfe",
"box-border-description": "Zeige eine Umrandung um Inhaltsbereiche an.",
"box-border-label": "Containerumriss",
"box-border-radius-description": "Passt die Eckenrundung wichtiger Layoutbereiche an, wie z. B. Seitenleisten, Karten und Inhaltsbereiche.",
@@ -1826,8 +1847,8 @@
},
"bluetooth": {
"address-copied": "Adresse in die Zwischenablage kopiert",
"auto-connect-disabled": "Automatische Verbindung deaktiviert",
"auto-connect-enabled": "Automatisch verbinden aktiviert",
"auto-connect-disabled": "Automatisches Verbinden deaktiviert",
"auto-connect-enabled": "Automatisches Verbinden aktiviert",
"auto-connecting": "Verbinde mit {count} Gerät(en)...",
"confirm-code": "Bestätigungscode {value} auf dem anderen Gerät bestätigen.",
"connect-failed": "Verbindung mit dem Gerät fehlgeschlagen",
@@ -1847,6 +1868,10 @@
"unavailable": "Zwischenablageverlauf nicht verfügbar",
"unavailable-desc": "Die 'cliphist' Anwendung ist nicht installiert. Bitte installieren Sie sie, um Zwischenablageverlauf-Features zu nutzen"
},
"custom-command-failed": {
"description": "Befehl fehlgeschlagen: {command}\\nExit-Code: {code}",
"title": "Benutzerdefinierter Befehl fehlgeschlagen"
},
"do-not-disturb": {
"disabled": "'Nicht stören' deaktiviert",
"disabled-desc": "Alle Benachrichtigungen werden angezeigt",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "Widget hinzufügen",
"bluetooth-auto-connect-off": "Auto-Verbindung ist aus — klicken, um zu aktivieren",
"bluetooth-auto-connect-on": "Automatische Verbindung ist an — klicken, um zu deaktivieren",
"auto-connect": "Automatisches Verbinden für dieses Gerät umschalten",
"bluetooth-auto-connect-off": "Automatisches Verbinden deaktiviert",
"bluetooth-auto-connect-on": "Automatisches Verbinden aktiviert",
"bluetooth-devices": "Bluetooth-Geräte",
"brightness-at": "Helligkeit: {brightness}%",
"click-to-start-recording": "Bildschirmrekorder (Aufnahme starten)",
@@ -1999,14 +2025,14 @@
"resolution-label": "Auflösung",
"resolution-mode-label": "Modus",
"solid-color-tooltip": "Einfarbiger Hintergrund",
"sort-date-asc": "Sortiere nach Ältestem zuerst",
"sort-date-desc": "Sortiere nach Neuestem zuerst",
"sort-name-asc": "Sortiere nach Name (A-Z)",
"sort-name-desc": "Sortiere nach Name (Z-A)",
"sort-random": "Sortiere nach Zufall",
"sort-date-asc": "Nach Ältestem zuerst sortieren",
"sort-date-desc": "Nach Neuestem zuerst sortieren",
"sort-name-asc": "Nach Name sortieren (A-Z)",
"sort-name-desc": "Nach Name sortieren (Z-A)",
"sort-random": "Nach Zufall sortieren",
"sorting-date-added": "Hinzugefügt am",
"sorting-favorites": "Favoriten",
"sorting-label": "Sortieren nach",
"sorting-label": "Sortiere nach",
"sorting-relevance": "Relevanz",
"sorting-toplist": "Topliste",
"sorting-views": "Aufrufe",
+33 -7
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "Select the color for the visualizer.",
"color-name-label": "Fill color",
"height-description": "Custom component width.",
"hide-when-idle-description": "When enabled, the visualizer is hidden unless a player is actively playing.",
"hide-when-idle-label": "Hide when no media is playing",
"width-description": "Custom component width."
@@ -60,7 +61,7 @@
"hide-if-not-detected-description": "Hide the widget when no battery is detected on the system.",
"hide-if-not-detected-label": "Hide when not detected",
"low-battery-threshold-label": "Low battery warning threshold",
"show-noctalia-performance-description": "Display the Noctalia Performance Mode toggle inside the battery panel.<br>Disables shadows and animations in Noctalia to reduce resource usage.",
"show-noctalia-performance-description": "Display the Noctalia performance mode toggle inside the battery panel.<br>Disables shadows and animations in Noctalia to reduce resource usage.",
"show-noctalia-performance-label": "Show Noctalia Performance toggle",
"show-power-profile-description": "Display the power profile selection inside the battery panel.",
"show-power-profile-label": "Show power profile controls"
@@ -293,6 +294,8 @@
"focused-color-label": "Focused workspace color",
"follow-focused-screen-description": "Display workspaces from the currently focused screen, rather than the screen where the bar is located.",
"follow-focused-screen-label": "Follow focused screen",
"font-weight-description": "Set the visual weight for text within workspace.",
"font-weight-label": "Font weight",
"grouped-border-opacity-description": "Set the opacity level for workspace container borders.",
"grouped-border-opacity-label": "Border opacity",
"hide-unoccupied-description": "Don't display workspaces without windows.",
@@ -376,6 +379,7 @@
"add": "Add",
"appearance": "Appearance",
"apply": "Apply",
"auto-connect": "Auto-connect",
"automation": "Automation",
"available": "Available",
"back": "Back",
@@ -426,6 +430,11 @@
"execute": "Execute",
"faithful": "Faithful",
"focus": "Focus",
"font-weight-bold": "Bold",
"font-weight-light": "Light",
"font-weight-medium": "Medium",
"font-weight-regular": "Regular",
"font-weight-semibold": "Semi-bold",
"frequency": "Frequency",
"gateway": "Gateway",
"general": "General",
@@ -470,6 +479,7 @@
"panels": "Panels",
"password": "Password",
"pause": "Pause",
"performance": "Performance",
"pin": "Pin",
"play": "Play",
"polling": "Polling",
@@ -709,18 +719,20 @@
"debug-disabled": "Debug mode disabled",
"debug-enabled": "Debug mode enabled",
"info-copied": "Info copied to clipboard",
"noctalia-available": "Available:",
"noctalia-desc": "A sleek and minimal desktop shell thoughtfully crafted for Wayland, built with Quickshell.",
"noctalia-git-commit": "Git commit:",
"noctalia-installed-version": "Installed version:",
"noctalia-latest-version": "Latest version:",
"noctalia-qs-version": "Noctalia QS version:",
"noctalia-title": "Noctalia shell",
"noctalia-title": "Noctalia Shell",
"privacy-policy": "Privacy policy",
"support": "Support us",
"supporter-badge": "Supporter",
"supporters-desc": "A huge thank you to our amazing supporter!",
"supporters-desc-plural": "A huge thank you to our <b>{count} amazing</b> supporters!",
"supporters-loading": "Loading supporters...",
"system-board": "Board:",
"system-cpu": "CPU:",
"system-disk": "Disk:",
"system-gpu": "GPU:",
@@ -1207,10 +1219,10 @@
"noctalia-started-description": "Command to execute when Noctalia has finished loading.",
"noctalia-started-label": "Noctalia started",
"noctalia-started-placeholder": "e.g. notify-send 'Noctalia Loaded'",
"performance-mode-disabled-description": "Command to be executed when Noctalia Performance Mode is disabled.",
"performance-mode-disabled-description": "Command to be executed when Noctalia performance mode is disabled.",
"performance-mode-disabled-label": "Performance mode disabled",
"performance-mode-disabled-placeholder": "e.g. notify-send \"Performance\" \"Mode disabled\"",
"performance-mode-enabled-description": "Command to be executed when Noctalia Performance Mode is enabled.",
"performance-mode-enabled-description": "Command to be executed when Noctalia performance mode is enabled.",
"performance-mode-enabled-label": "Performance mode enabled",
"performance-mode-enabled-placeholder": "e.g., notify-send \"Performance\" \"Mode enabled\"",
"screen-lock-description": "Command to be executed when the screen is locked.",
@@ -1601,6 +1613,13 @@
"show-keybinds-description": "Display keybind hints on session options.",
"show-keybinds-label": "Show keybinds"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Keep desktop widgets visible while Noctalia performance mode is enabled.",
"noctalia-performance-disable-desktop-widgets-label": "Enable desktop widgets in performance mode",
"noctalia-performance-disable-wallpaper-description": "Keep desktop, overview, and lock screen wallpapers visible while Noctalia performance mode is enabled.",
"noctalia-performance-disable-wallpaper-label": "Enable wallpaper rendering in performance mode",
"title": "System"
},
"system-monitor": {
"critical-color-label": "Critical color",
"custom-highlight-colors-title-label": "Custom highlight colors",
@@ -1633,6 +1652,8 @@
"animation-speed-label": "Animation speed",
"animation-speed-reset": "Reset animation speed",
"appearance-desc": "Customize visual elements like tooltips, borders, and shadows.",
"blur-behind-description": "Blurs the area behind bars and panels using the compositor blur protocol.",
"blur-behind-label": "Blur behind",
"box-border-description": "Display an outline around content areas.",
"box-border-label": "Container outline",
"box-border-radius-description": "Adjusts the corner roundness of major layout sections, such as sidebars, cards, and content panels.",
@@ -1849,6 +1870,10 @@
"unavailable": "Clipboard history unavailable",
"unavailable-desc": "The 'cliphist' application is not installed. Please install it to use clipboard history features"
},
"custom-command-failed": {
"description": "Command failed: {command}\nExit code: {code}",
"title": "Custom command failed"
},
"do-not-disturb": {
"disabled": "Do Not Disturb disabled",
"disabled-desc": "Showing all notifications",
@@ -1903,8 +1928,9 @@
},
"tooltips": {
"add-widget": "Add widget",
"bluetooth-auto-connect-off": "Auto-connect is off — click to enable",
"bluetooth-auto-connect-on": "Auto-connect is on — click to disable",
"auto-connect": "Toggle auto-connection for this device",
"bluetooth-auto-connect-off": "Auto-connect is off",
"bluetooth-auto-connect-on": "Auto-connect is on",
"bluetooth-devices": "Bluetooth devices",
"brightness-at": "Brightness: {brightness}%",
"click-to-start-recording": "Screen recorder (start recording)",
@@ -1933,7 +1959,7 @@
"next-media": "Next track",
"next-month": "Next month",
"night-light-not-installed": "Night Light (not available)",
"noctalia-performance-enabled": "Noctalia Performance Mode",
"noctalia-performance-enabled": "Noctalia performance mode",
"open-annotation-tool": "Open with annotation tool",
"open-control-center": "Control center",
"open-notification-history-enable-dnd": "Notification history",
+32 -6
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "Selecciona el color para el visualizador.",
"color-name-label": "Color de relleno",
"height-description": "Ancho de componente personalizado.",
"hide-when-idle-description": "Si está activado, el visualizador se oculta salvo que haya reproducción activa.",
"hide-when-idle-label": "Ocultar cuando no se reproduce",
"width-description": "Ancho del componente personalizado."
@@ -293,6 +294,8 @@
"focused-color-label": "Color del espacio de trabajo enfocado",
"follow-focused-screen-description": "Mostrar espacios de trabajo de la pantalla enfocada, en lugar de la pantalla donde se encuentra la barra.",
"follow-focused-screen-label": "Seguir pantalla enfocada",
"font-weight-description": "Establecer el peso visual para el texto dentro del espacio de trabajo.",
"font-weight-label": "Peso de fuente",
"grouped-border-opacity-description": "Establecer el nivel de opacidad para los bordes del contenedor del espacio de trabajo.",
"grouped-border-opacity-label": "Opacidad del borde",
"hide-unoccupied-description": "No mostrar espacios de trabajo sin ventanas.",
@@ -376,6 +379,7 @@
"add": "Añadir",
"appearance": "Apariencia",
"apply": "Aplicar",
"auto-connect": "Conexión automática",
"automation": "Automatización",
"available": "Disponible",
"back": "Atrás",
@@ -426,6 +430,11 @@
"execute": "Ejecutar",
"faithful": "Fiel",
"focus": "Enfoque",
"font-weight-bold": "Negrita",
"font-weight-light": "Fina",
"font-weight-medium": "Medio",
"font-weight-regular": "Regular",
"font-weight-semibold": "Seminegrita",
"frequency": "Frecuencia",
"gateway": "Puerta de enlace",
"general": "General",
@@ -470,6 +479,7 @@
"panels": "Paneles",
"password": "Contraseña",
"pause": "Pausa",
"performance": "Rendimiento",
"pin": "Anclar",
"play": "Reproducir",
"polling": "Sondeo",
@@ -709,6 +719,7 @@
"debug-disabled": "Modo de depuración deshabilitado",
"debug-enabled": "Modo de depuración activado",
"info-copied": "Información copiada al portapapeles",
"noctalia-available": "Disponible:",
"noctalia-desc": "Un shell de escritorio elegante y minimalista cuidadosamente diseñado para Wayland, construido con Quickshell.",
"noctalia-git-commit": "Commit de Git:",
"noctalia-installed-version": "Versión instalada:",
@@ -721,6 +732,7 @@
"supporters-desc": "¡Un enorme agradecimiento a nuestro increíble colaborador!",
"supporters-desc-plural": "¡Muchísimas gracias a nuestros <b>{count} increíbles</b> seguidores!",
"supporters-loading": "Cargando patrocinadores...",
"system-board": "Placa:",
"system-cpu": "CPU:",
"system-disk": "Disco:",
"system-gpu": "GPU:",
@@ -1205,10 +1217,10 @@
"noctalia-started-description": "Comando para ejecutar cuando Noctalia ha terminado de cargarse.",
"noctalia-started-label": "Noctalia iniciado",
"noctalia-started-placeholder": "p. ej. notify-send 'Noctalia cargado'",
"performance-mode-disabled-description": "Comando a ejecutar cuando se deshabilita el modo de rendimiento de Noctalia.",
"performance-mode-disabled-description": "Comando a ejecutar cuando se deshabilita el modo de rendimiento Noctalia.",
"performance-mode-disabled-label": "Modo de rendimiento deshabilitado",
"performance-mode-disabled-placeholder": "p. ej. notify-send \"Rendimiento\" \"Modo deshabilitado\"",
"performance-mode-enabled-description": "Comando a ejecutar cuando se habilita el modo de rendimiento de Noctalia.",
"performance-mode-enabled-description": "Comando a ejecutar cuando se habilita el modo de rendimiento Noctalia.",
"performance-mode-enabled-label": "Modo de rendimiento habilitado",
"performance-mode-enabled-placeholder": "p. ej. notify-send \"Rendimiento\" \"Modo habilitado\"",
"screen-lock-description": "Comando a ejecutar cuando se bloquea la pantalla.",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "Mostrar sugerencias de atajos de teclado en las opciones de sesión.",
"show-keybinds-label": "Mostrar atajos de teclado"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Mantener los widgets de escritorio visibles mientras el modo de rendimiento Noctalia esté habilitado.",
"noctalia-performance-disable-desktop-widgets-label": "Habilitar widgets de escritorio en modo de rendimiento",
"noctalia-performance-disable-wallpaper-description": "Mantén visibles los fondos de pantalla del escritorio, la vista general y la pantalla de bloqueo mientras el modo de rendimiento Noctalia esté activado.",
"noctalia-performance-disable-wallpaper-label": "Habilitar el renderizado de fondo de pantalla en modo de rendimiento",
"title": "Sistema"
},
"system-monitor": {
"critical-color-label": "Color crítico",
"custom-highlight-colors-title-label": "Colores de resaltado personalizados",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "Intervalo de sondeo",
"polling-section-description": "Configure la frecuencia con la que se actualiza cada métrica del sistema.",
"polling-section-label": "Intervalos de sondeo",
"threshold-critical": "Umbral crítico",
"threshold-warning": "Umbral de advertencia",
"threshold-critical": "Crítico",
"threshold-warning": "Advertencia",
"thresholds-section-description": "Ajusta los umbrales de advertencia/crítico y los intervalos de sondeo para cada métrica del sistema.",
"use-custom-highlight-colors-description": "Cuando está desactivado, se usan los colores de resaltado predeterminados del tema.",
"use-custom-highlight-colors-label": "Usar colores de resaltado personalizados",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "Velocidad de animación",
"animation-speed-reset": "Restablecer la velocidad de la animación",
"appearance-desc": "Personaliza elementos visuales como texto emergente, bordes y sombras.",
"blur-behind-description": "Difumina el área detrás de las barras y los paneles usando el protocolo de desenfoque del compositor.",
"blur-behind-label": "Desenfoque de fondo",
"box-border-description": "Muestra un contorno alrededor de las áreas de contenido.",
"box-border-label": "Contorno del contenedor",
"box-border-radius-description": "Ajusta la redondez de las esquinas de las secciones principales del diseño, como barras laterales, tarjetas y paneles de contenido.",
@@ -1847,6 +1868,10 @@
"unavailable": "Historial del portapapeles no disponible",
"unavailable-desc": "La aplicación 'cliphist' no está instalada. Por favor, instálala para usar las funciones de historial del portapapeles"
},
"custom-command-failed": {
"description": "El comando falló: {command}\\nCódigo de salida: {code}",
"title": "Comando personalizado falló"
},
"do-not-disturb": {
"disabled": "'No molestar' desactivado",
"disabled-desc": "Mostrando todas las notificaciones",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "Añadir widget",
"bluetooth-auto-connect-off": "Conexión automática desactivada — haz clic para activar",
"bluetooth-auto-connect-on": "Conexión automática activada — haz clic para desactivar",
"auto-connect": "Alternar conexión automática para este dispositivo",
"bluetooth-auto-connect-off": "Conexión automática desactivada",
"bluetooth-auto-connect-on": "Conexión automática activada",
"bluetooth-devices": "Dispositivos Bluetooth",
"brightness-at": "Brillo: {brightness}%",
"click-to-start-recording": "Grabadora de pantalla (iniciar grabación)",
+48 -22
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "Sélectionnez la couleur du visualiseur.",
"color-name-label": "Couleur de remplissage",
"height-description": "Largeur de composant personnalisée.",
"hide-when-idle-description": "Si activé, le visualiseur est masqué sauf lorsqu'un lecteur est en lecture.",
"hide-when-idle-label": "Masquer lorsqu'aucun média n'est en lecture",
"width-description": "Largeur personnalisée du composant."
@@ -79,8 +80,8 @@
"horizontal-bar-description": "Astuce : Utilisez \\n pour créer un saut de ligne.",
"horizontal-bar-label": "Barre horizontale",
"preview": "Aperçu",
"tooltip-format-description": "Chaîne de format pour l'info-bulle affichée lors du survol de l'horloge. Laissez vide pour utiliser l'info-bulle par défaut.",
"tooltip-format-label": "Format de l'info-bulle",
"tooltip-format-description": "Chaîne de format pour l'infobulle affichée lors du survol de l'horloge. Laissez vide pour utiliser l'infobulle par défaut.",
"tooltip-format-label": "Format de l'infobulle",
"use-custom-font-description": "Remplacez la police par défaut par une police personnalisée pour l'horloge.",
"use-custom-font-label": "Utiliser une police personnalisée",
"use-monospaced-font-description": "Lorsque cette option est activée, l'horloge utilisera la police monospace.",
@@ -109,8 +110,8 @@
"dynamic-text": "Texte dynamique",
"enable-colorization-description": "Activer la colorisation pour l'icône et le texte du bouton personnalisé, en appliquant les couleurs du thème.",
"enable-colorization-label": "Activer la colorisation",
"general-tooltip-text-description": "Texte personnalisé à afficher dans l'info-bulle du bouton.",
"general-tooltip-text-label": "Texte d'info-bulle personnalisé",
"general-tooltip-text-description": "Texte personnalisé à afficher dans l'infobulle du bouton.",
"general-tooltip-text-label": "Texte d'infobulle personnalisé",
"hide-mode-always-expanded": "Toujours étendu",
"hide-mode-description": "Contrôle la visibilité du widget quand la commande n'a pas de sortie.",
"hide-mode-expand-with-output": "Étendre quand il y a une sortie",
@@ -136,12 +137,12 @@
"right-click-description": "Commande à exécuter quand le bouton est cliqué à droite.",
"right-click-label": "Clic droit",
"right-click-update-text": "Mettre à jour le texte affiché lors d'un clic droit",
"show-exec-tooltip-description": "Afficher les info-bulles avec les détails de la commande (clic gauche/droit/milieu, molette).",
"show-exec-tooltip-description": "Afficher les infobulles avec les détails de la commande (clic gauche/droit/milieu, molette).",
"show-exec-tooltip-label": "Afficher les infobulles de commande",
"show-icon-description": "Bascule la visibilité de l'icône du widget.",
"show-icon-label": "Afficher l'icône",
"show-text-tooltip-description": "Afficher les info-bulles avec la sortie de la commande texte.",
"show-text-tooltip-label": "Afficher les info-bulles de texte dynamiques",
"show-text-tooltip-description": "Afficher les infobulles avec la sortie de la commande texte.",
"show-text-tooltip-label": "Afficher les infobulles de texte dynamiques",
"text-stream-description": "Les lignes diffusées depuis la commande seront affichées sous forme de texte sur le bouton.",
"text-stream-label": "Flux",
"wheel-description": "Commande à exécuter lorsque la molette est utilisée.<br>Utilisez $delta pour le delta de la molette dans la commande.",
@@ -213,7 +214,7 @@
"compact-mode-description": "Afficher les statistiques sous forme de mini-graphiques à barres au lieu de valeurs textuelles. Empêche les décalages de mise en page.",
"compact-mode-label": "Mode compact",
"cpu-cores-description": "Afficher l'utilisation des cœurs du CPU individuellement.",
"cpu-cores-label": "Cœurs de CPU",
"cpu-cores-label": "Cœurs du CPU",
"cpu-frequency-description": "Afficher la vitesse d'horloge actuelle du CPU en GHz.",
"cpu-frequency-label": "Afficher la fréquence du CPU",
"cpu-temperature-description": "Afficher les lectures de température du CPU si disponibles.",
@@ -285,7 +286,7 @@
"workspace": {
"character-count-description": "Nombre de caractères à afficher des noms d'espaces de travail (1-10).",
"character-count-label": "Nombre de caractères",
"empty-color-description": "Définir la couleur d'arrière-plan pour les Workspaces vides.",
"empty-color-description": "Définir la couleur d'arrière-plan pour les espaces de travail vides.",
"empty-color-label": "Couleur d'espace de travail vide",
"enable-scrollwheel-description": "Basculer entre les espaces de travail avec la molette de la souris.",
"enable-scrollwheel-label": "Faites défiler pour changer d'espace de travail",
@@ -293,13 +294,15 @@
"focused-color-label": "Couleur de l'espace de travail sélectionné",
"follow-focused-screen-description": "Afficher les espaces de travail de l'écran actuellement ciblé, plutôt que de l'écran où se trouve la barre.",
"follow-focused-screen-label": "Suivre l'écran ciblé",
"font-weight-description": "Définir le poids visuel du texte dans l'espace de travail.",
"font-weight-label": "Graisse de la police",
"grouped-border-opacity-description": "Définir le niveau d'opacité des bordures des conteneurs d'espace de travail.",
"grouped-border-opacity-label": "Opacité de la bordure",
"hide-unoccupied-description": "Ne pas afficher les espaces de travail sans fenêtres.",
"hide-unoccupied-label": "Masquer les inoccupés",
"label-mode-description": "Choisir comment les étiquettes d'espace de travail sont affichées.",
"label-mode-label": "Mode d'étiquette",
"occupied-color-description": "Définir la couleur d'arrière-plan pour les Workspaces occupés.",
"occupied-color-description": "Définir la couleur d'arrière-plan pour les espaces de travail occupés.",
"occupied-color-label": "Couleur de l'espace de travail occupé",
"pill-size-description": "Ajustez la taille des pilules d'espace de travail (50%-100%).",
"pill-size-label": "Taille de la pilule",
@@ -376,6 +379,7 @@
"add": "Ajouter",
"appearance": "Apparence",
"apply": "Appliquer",
"auto-connect": "Connexion automatique",
"automation": "Automatisation",
"available": "Disponible",
"back": "Retour",
@@ -426,6 +430,11 @@
"execute": "Exécuter",
"faithful": "Fidèle",
"focus": "Concentration",
"font-weight-bold": "Gras",
"font-weight-light": "Légère",
"font-weight-medium": "Moyen",
"font-weight-regular": "Régulier",
"font-weight-semibold": "Semi-gras",
"frequency": "Fréquence",
"gateway": "Passerelle",
"general": "Général",
@@ -470,6 +479,7 @@
"panels": "Panneaux",
"password": "Mot de passe",
"pause": "Pause",
"performance": "Performances",
"pin": "Épingle",
"play": "Lire",
"polling": "Interrogation",
@@ -709,6 +719,7 @@
"debug-disabled": "Mode débogage désactivé",
"debug-enabled": "Mode débogage activé",
"info-copied": "Info copiée dans le presse-papiers",
"noctalia-available": "Disponible :",
"noctalia-desc": "Un shell de bureau élégant et minimaliste, conçu avec soin pour Wayland et bâti avec Quickshell.",
"noctalia-git-commit": "Commit Git :",
"noctalia-installed-version": "Version installée :",
@@ -721,6 +732,7 @@
"supporters-desc": "Un immense merci à notre incroyable soutien !",
"supporters-desc-plural": "Un grand merci à nos <b>{count} incroyables</b> supporters !",
"supporters-loading": "Chargement des contributeurs...",
"system-board": "Carte mère :",
"system-cpu": "Processeur :",
"system-disk": "Disque :",
"system-gpu": "GPU :",
@@ -842,7 +854,7 @@
"appearance-widget-spacing-description": "Ajustez l'espacement entre chaque widget dans la barre.",
"appearance-widget-spacing-label": "Espacement des widgets",
"behavior-middle-click-command-description": "Commande à exécuter au clic du milieu.",
"behavior-middle-click-command-label": "Commande du Clic du Milieu",
"behavior-middle-click-command-label": "Commande du clic du Milieu",
"behavior-middle-click-command-placeholder": "niri msg action basculer l'aperçu",
"behavior-middle-click-description": "Choisissez ce que fait le clic du milieu sur les zones vides de la Barre.",
"behavior-middle-click-follow-mouse-description": "Ouvrir le panneau de clic central sélectionné à la position du curseur.",
@@ -972,8 +984,8 @@
"shortcuts-custom-button-state-checks-command": "Commande à exécuter pour cette vérification d'état",
"shortcuts-custom-button-state-checks-label": "Vérifications d'état",
"shortcuts-custom-button-state-checks-remove": "Supprimer",
"shortcuts-custom-button-tooltip-description": "L'info-bulle à afficher lors du survol du bouton.",
"shortcuts-custom-button-tooltip-label": "Info-bulle",
"shortcuts-custom-button-tooltip-description": "L'infobulle à afficher lors du survol du bouton.",
"shortcuts-custom-button-tooltip-label": "Infobulle",
"shortcuts-title": "Widgets de raccourcis",
"system-monitor-disk-path-description": "Sélectionnez le point de montage du disque que la carte du moniteur système dans le centre de contrôle doit surveiller.",
"system-monitor-disk-path-label": "Chemin du disque du moniteur système",
@@ -1206,7 +1218,7 @@
"noctalia-started-label": "Noctalia démarré",
"noctalia-started-placeholder": "ex : notify-send 'Noctalia chargé'",
"performance-mode-disabled-description": "Commande à exécuter lorsque le mode performance Noctalia est désactivé.",
"performance-mode-disabled-label": "mode performance désactivé",
"performance-mode-disabled-label": "Mode performance désactivé",
"performance-mode-disabled-placeholder": "ex : notify-send \"Performance\" \"Mode désactivé\"",
"performance-mode-enabled-description": "Commande à exécuter lorsque le mode performance Noctalia est activé.",
"performance-mode-enabled-label": "Mode performance activé",
@@ -1255,7 +1267,7 @@
"resume-command-label": "Reprendre la commande",
"screen-off-description": "Secondes d'inactivité avant que les moniteurs ne s'éteignent.",
"screen-off-label": "Éteindre l'écran",
"status-description": "Temps d'inactivité tel que rapporté par le compositor.",
"status-description": "Temps d'inactivité tel que rapporté par le compositeur.",
"status-label": "Temps d'inactivité",
"suspend-description": "Secondes d'inactivité avant que le système ne se suspende.",
"tab-behavior": "Comportement",
@@ -1263,7 +1275,7 @@
"timeouts-description": "Réglez sur 0 pour désactiver une étape. Les délais d'attente sont mis en pause tant que 'Rester éveillé' est actif.",
"timeouts-label": "Délais d'expiration",
"title": "Inactivité",
"unavailable": "La surveillance native de l'inactivité n'est pas disponible sur ce Compositor."
"unavailable": "La surveillance native de l'inactivité n'est pas disponible sur ce compositeur."
},
"indicator": {
"default-value": "Par défaut : {value}",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "Afficher les indices de raccourcis clavier sur les options de session.",
"show-keybinds-label": "Afficher les raccourcis clavier"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Garder les widgets de bureau visibles tant que le mode performance Noctalia est activé.",
"noctalia-performance-disable-desktop-widgets-label": "Activer les widgets de bureau en mode performance",
"noctalia-performance-disable-wallpaper-description": "Gardez les fonds d'écran du bureau, de l'aperçu et de l'écran de verrouillage visibles lorsque le mode performance Noctalia est activé.",
"noctalia-performance-disable-wallpaper-label": "Activer le rendu du fond d'écran en mode performance",
"title": "Système"
},
"system-monitor": {
"critical-color-label": "Couleur critique",
"custom-highlight-colors-title-label": "Couleurs de surbrillance personnalisées",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "Intervalle d'interrogation",
"polling-section-description": "Configurer la fréquence de mise à jour de chaque métrique système.",
"polling-section-label": "Intervalles d'interrogation",
"threshold-critical": "Seuil critique",
"threshold-warning": "Seuil d'alerte",
"threshold-critical": "Critique",
"threshold-warning": "Avertissement",
"thresholds-section-description": "Ajustez les seuils davertissement/critiques et les intervalles dinterrogation pour chaque métrique système.",
"use-custom-highlight-colors-description": "Lorsque cette option est désactivée, les couleurs de surbrillance par défaut du thème sont utilisées.",
"use-custom-highlight-colors-label": "Utiliser des couleurs de surlignage personnalisées",
@@ -1630,7 +1649,9 @@
"animation-speed-description": "Ajuster la vitesse globale de l'animation.",
"animation-speed-label": "Vitesse d'animation",
"animation-speed-reset": "Réinitialiser la vitesse de l'animation",
"appearance-desc": "Personnaliser les éléments visuels tels que les info-bulles, les bordures et les ombres.",
"appearance-desc": "Personnaliser les éléments visuels tels que les infobulles, les bordures et les ombres.",
"blur-behind-description": "Floute la zone derrière les barres et les panneaux en utilisant le protocole de flou du compositeur.",
"blur-behind-label": "Flou d'arrière-plan",
"box-border-description": "Affiche un contour autour des zones de contenu.",
"box-border-label": "Contour du conteneur",
"box-border-radius-description": "Ajuste de l'arrondi des coins des principales sections de la mise en page, telles que les barres latérales, les cartes et les panneaux de contenu.",
@@ -1660,7 +1681,7 @@
"shadows-direction-label": "Direction de lombre",
"shadows-label": "Ombres portées",
"title": "Interface utilisateur",
"tooltips-description": "Activer ou désactiver les info-bulles dans toute l'interface.",
"tooltips-description": "Activer ou désactiver les infobulles dans toute l'interface.",
"tooltips-label": "Afficher les infobulles"
},
"wallpaper": {
@@ -1847,6 +1868,10 @@
"unavailable": "Historique du presse-papiers indisponible",
"unavailable-desc": "L'application 'cliphist' n'est pas installée. Veuillez l'installer pour utiliser les fonctionnalités d'historique du presse-papiers"
},
"custom-command-failed": {
"description": "La commande a échoué : {command}\\nCode de sortie : {code}",
"title": "La commande personnalisée a échoué"
},
"do-not-disturb": {
"disabled": "'Ne pas déranger' désactivé",
"disabled-desc": "Affichage de toutes les notifications",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "Ajouter un widget",
"bluetooth-auto-connect-off": "Connexion automatique désactivée — cliquez pour activer",
"bluetooth-auto-connect-on": "Connexion automatique activée — cliquez pour désactiver",
"auto-connect": "Activer/désactiver la connexion automatique pour cet appareil",
"bluetooth-auto-connect-off": "Connexion automatique désactivée",
"bluetooth-auto-connect-on": "Connexion automatique activée",
"bluetooth-devices": "Appareils Bluetooth",
"brightness-at": "Luminosité : {brightness}%",
"click-to-start-recording": "Enregistreur d'écran (démarrer l'enregistrement)",
+34 -8
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "A vizualizátor színe.",
"color-name-label": "Kitöltési szín",
"height-description": "Egyéni komponensszélesség.",
"hide-when-idle-description": "Ha engedélyezve van, a vizualizátor el van rejtve, kivéve, ha egy lejátszó aktívan játszik.",
"hide-when-idle-label": "Elrejtés, ha nincs média lejátszva",
"width-description": "Egyéni komponens szélessége."
@@ -61,7 +62,7 @@
"hide-if-not-detected-label": "Elrejtés, ha nincs észlelve",
"low-battery-threshold-label": "Alacsony akkumulátor töltöttségi figyelmeztetési küszöb",
"show-noctalia-performance-description": "A Noctalia teljesítménymód kapcsoló megjelenítése az akkumulátor panelen belül.<br>Letiltja az árnyékokat és animációkat a Noctaliaban az erőforrásfelhasználás csökkentése érdekében.",
"show-noctalia-performance-label": "Noctalia teljesítménymód kapcsoló",
"show-noctalia-performance-label": "Noctalia Teljesítmény kapcsoló megjelenítése",
"show-power-profile-description": "Az energiaprofil kiválasztásának megjelenítése az akkumulátor panelen belül.",
"show-power-profile-label": "Energiaprofil vezérlők"
},
@@ -293,6 +294,8 @@
"focused-color-label": "Fókuszált munkaterület színe",
"follow-focused-screen-description": "Munkaterületek megjelenítése az aktuálisan fókuszált képernyőről, nem arról a képernyőről, ahol a sáv található.",
"follow-focused-screen-label": "Fókuszált képernyő követése",
"font-weight-description": "Állítsa be a szöveg vizuális súlyát a munkaterületen belül.",
"font-weight-label": "Betűvastagság",
"grouped-border-opacity-description": "A munkaterület-konténerek szegélyeinek átlátszósági szintjének beállítása.",
"grouped-border-opacity-label": "Szegély átlátszósága",
"hide-unoccupied-description": "Ne jelenítse meg az ablak nélküli munkaterületeket.",
@@ -376,6 +379,7 @@
"add": "Hozzáadás",
"appearance": "Megjelenés",
"apply": "Alkalmazás",
"auto-connect": "Automatikus csatlakozás",
"automation": "Automatizálás",
"available": "Elérhető",
"back": "Vissza",
@@ -426,6 +430,11 @@
"execute": "Végrehajtás",
"faithful": "Hűséges",
"focus": "Fókusz",
"font-weight-bold": "Félkövér",
"font-weight-light": "Vékony",
"font-weight-medium": "Közepes",
"font-weight-regular": "Normál",
"font-weight-semibold": "Félkövér",
"frequency": "Frekvencia",
"gateway": "Átjáró",
"general": "Általános",
@@ -470,6 +479,7 @@
"panels": "Panelek",
"password": "Jelszó",
"pause": "Szünet",
"performance": "Teljesítmény",
"pin": "Rögzítés",
"play": "Lejátszás",
"polling": "Lekérdezés",
@@ -709,6 +719,7 @@
"debug-disabled": "Hibakeresési mód letiltva",
"debug-enabled": "Hibakeresési mód engedélyezve",
"info-copied": "Információ a vágólapra másolva",
"noctalia-available": "Elérhető:",
"noctalia-desc": "Egy elegáns és minimalista asztali felület, Waylandra tervezve, Quickshell-en alapulva.",
"noctalia-git-commit": "Git commit:",
"noctalia-installed-version": "Telepített verzió:",
@@ -721,6 +732,7 @@
"supporters-desc": "Hatalmas köszönet csodálatos támogatóinknak!",
"supporters-desc-plural": "Hatalmas köszönet a <b>{count} csodálatos</b> támogatóinknak!",
"supporters-loading": "Támogatók betöltése...",
"system-board": "Alaplap:",
"system-cpu": "CPU:",
"system-disk": "Lemez:",
"system-gpu": "GPU:",
@@ -1016,7 +1028,7 @@
"media-player-enabled-description": "Médiaplayer widget megjelenítése az asztalon.",
"media-player-enabled-label": "Médiaplayer widget engedélyezése",
"media-player-rounded-corners-description": "Engedélyezi a lekerekített sarkokat a widget szélein.",
"media-player-show-album-art-description": "Mutasd az album borítóját és a számok adatait (cím és előadó).",
"media-player-show-album-art-description": "Az album borítójának és a számok adatainak (cím és előadó) megjelenítése.",
"media-player-show-album-art-label": "Album borító és cím megjelenítése",
"media-player-show-background-description": "Jelenítse meg a média lejátszó widget háttérkonténerét.",
"media-player-show-buttons-description": "Médiavezérlő gombok (lejátszás/szünet, előző, következő) megjelenítése a média lejátszó widgeten.",
@@ -1089,7 +1101,7 @@
"appearance-display-auto-hide": "Automatikus elrejtés",
"appearance-display-description": "A dokk viselkedése.",
"appearance-display-exclusive": "Exkluzív",
"appearance-dock-indicator-description": "Mutass egy kis jelzőt, amikor a dokk rejtve van.",
"appearance-dock-indicator-description": "Egy kis jelző megjelenítése, amikor a dokk rejtve van.",
"appearance-dock-indicator-label": "Dokk jelző",
"appearance-floating-distance-description": "A dokk és a képernyő széle közötti távolság.",
"appearance-floating-distance-label": "Dokk lebegési távolság",
@@ -1311,7 +1323,7 @@
"settings-position-description": "Hol jelenjen meg az indító panel.",
"settings-show-categories-description": "Kategóriafülek megjelenítése az alkalmazások szűréséhez.",
"settings-show-categories-label": "Kategóriák megjelenítése",
"settings-show-icon-background-description": "Ikonok mögött lekerekített téglalap hátteret mutass.",
"settings-show-icon-background-description": "Ikonok mögötti lekerekített téglalap háttér megjelenítése.",
"settings-show-icon-background-label": "Ikon háttér megjelenítése",
"settings-sort-by-usage-description": "Ha engedélyezve van, a gyakran indított alkalmazások jelennek meg először a listán.",
"settings-sort-by-usage-label": "Rendezés gyakoriság szerint",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "Gyorsbillentyű tippek megjelenítése a munkamenet-opcióknál.",
"show-keybinds-label": "Gyorsbillentyűk megjelenítése"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Tartsa láthatóan az asztali widgeteket, amíg a Noctalia teljesítmény mód engedélyezve van.",
"noctalia-performance-disable-desktop-widgets-label": "Engedélyezze az asztali widgeteket teljesítmény módban",
"noctalia-performance-disable-wallpaper-description": "Tartsa láthatóan az asztali, áttekintő és zárolási képernyő háttérképeket, amíg a Noctalia teljesítmény mód engedélyezve van.",
"noctalia-performance-disable-wallpaper-label": "Engedélyezze a háttérkép renderelését teljesítmény módban",
"title": "Rendszer"
},
"system-monitor": {
"critical-color-label": "Kritikus szín",
"custom-highlight-colors-title-label": "Egyéni kiemelőszínek",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "Lekérdezési intervallum",
"polling-section-description": "Milyen gyakran frissüljenek az egyes rendszer metrikák.",
"polling-section-label": "Lekérdezési időközök",
"threshold-critical": "Kritikus küszöb",
"threshold-warning": "Figyelmeztetési küszöb",
"threshold-critical": "Kritikus",
"threshold-warning": "Figyelmeztetés",
"thresholds-section-description": "A figyelmeztetési/kritikus küszöbértékek és a lekérdezési intervallumok minden rendszermutatóhoz.",
"use-custom-highlight-colors-description": "Ha le van tiltva, a téma alapértelmezett kiemelőszínei kerülnek használatra.",
"use-custom-highlight-colors-label": "Egyéni kiemelőszínek használata",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "Animációs sebesség",
"animation-speed-reset": "Animációs sebesség visszaállítása",
"appearance-desc": "Testreszabhatod a vizuális elemeket, például az eszköztippeket, a szegélyeket és az árnyékokat.",
"blur-behind-description": "Elhomályosítja a sávok és panelek mögötti területet a kompozitor elmosási protokolljának használatával.",
"blur-behind-label": "Háttér elmosása",
"box-border-description": "Tartalomterületek köré vázlatot jelenít meg.",
"box-border-label": "Konténer körvonal",
"box-border-radius-description": "A fő elrendezési szakaszok (például oldalsávok, kártyák és tartalompanelek) saroklekerekítése.",
@@ -1847,6 +1868,10 @@
"unavailable": "A vágólapelőzmények nem elérhetők",
"unavailable-desc": "A 'cliphist' alkalmazás nincs telepítve. Telepítsd a vágólapelőzmények funkcióinak használatához"
},
"custom-command-failed": {
"description": "A parancs sikertelen: {command}\\nKilépési kód: {code}",
"title": "Egyéni parancs sikertelen"
},
"do-not-disturb": {
"disabled": "Ne zavarjanak letiltása",
"disabled-desc": "Minden értesítés megjelenítése",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "Widget hozzáadása",
"bluetooth-auto-connect-off": "Az automatikus csatlakozás ki van kapcsolva — kattints az engedélyezéshez",
"bluetooth-auto-connect-on": "Automatikus csatlakozás bekapcsolva — kattintson a kikapcsoláshoz",
"auto-connect": "Automatikus csatlakozás váltása ehhez az eszközhöz",
"bluetooth-auto-connect-off": "Automatikus csatlakozás kikapcsolva",
"bluetooth-auto-connect-on": "Automatikus csatlakozás engedélyezve",
"bluetooth-devices": "Bluetooth eszközök",
"brightness-at": "Fényerő: {brightness}%",
"click-to-start-recording": "Képernyőfelvevő (felvétel indítása)",
+33 -7
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "Seleziona il colore del visualizzatore.",
"color-name-label": "Colore riempimento",
"height-description": "Larghezza componente personalizzata.",
"hide-when-idle-description": "Se attivo, il visualizzatore viene nascosto quando nessun player è in riproduzione.",
"hide-when-idle-label": "Nascondi quando non è in riproduzione nulla",
"width-description": "Larghezza personalizzata del componente."
@@ -60,7 +61,7 @@
"hide-if-not-detected-description": "Nasconde il widget quando non viene rilevata alcuna batteria nel sistema.",
"hide-if-not-detected-label": "Nascondi se non rilevata",
"low-battery-threshold-label": "Soglia avviso batteria scarica",
"show-noctalia-performance-description": "Mostra linterruttore modalità prestazioni Noctalia nel pannello batteria.<br>Disattiva ombre e animazioni in Noctalia per ridurre luso di risorse.",
"show-noctalia-performance-description": "Mostra linterruttore della modalità prestazioni Noctalia nel pannello batteria.<br>Disattiva ombre e animazioni in Noctalia per ridurre luso di risorse.",
"show-noctalia-performance-label": "Mostra interruttore Noctalia Prestazioni",
"show-power-profile-description": "Mostra la selezione del profilo energetico nel pannello batteria.",
"show-power-profile-label": "Mostra controlli profilo energetico"
@@ -293,6 +294,8 @@
"focused-color-label": "Colore workspace focalizzata",
"follow-focused-screen-description": "Mostra workspace dello schermo attualmente focalizzato invece dello schermo dove si trova la barra.",
"follow-focused-screen-label": "Segui schermo focalizzato",
"font-weight-description": "Imposta il peso visivo per il testo all'interno dello spazio di lavoro.",
"font-weight-label": "Peso del carattere",
"grouped-border-opacity-description": "Imposta il livello di opacità dei bordi contenitore workspace.",
"grouped-border-opacity-label": "Opacità bordi",
"hide-unoccupied-description": "Non mostrare workspace senza finestre.",
@@ -376,6 +379,7 @@
"add": "Aggiungi",
"appearance": "Aspetto",
"apply": "Applica",
"auto-connect": "Connessione automatica",
"automation": "Automazione",
"available": "Disponibile",
"back": "Indietro",
@@ -426,6 +430,11 @@
"execute": "Esegui",
"faithful": "Fedele",
"focus": "Messa a fuoco",
"font-weight-bold": "Grassetto",
"font-weight-light": "Sottile",
"font-weight-medium": "Medio",
"font-weight-regular": "Normale",
"font-weight-semibold": "Semibold",
"frequency": "Frequenza",
"gateway": "Gateway",
"general": "Generale",
@@ -470,6 +479,7 @@
"panels": "Pannelli",
"password": "Password",
"pause": "Pausa",
"performance": "Prestazioni",
"pin": "Fissa",
"play": "Riproduci",
"polling": "Interrogazione",
@@ -709,6 +719,7 @@
"debug-disabled": "Modalità debug disattivata",
"debug-enabled": "Modalità debug attivata",
"info-copied": "Info copiate negli appunti",
"noctalia-available": "Disponibile:",
"noctalia-desc": "Una shell desktop elegante e minimale, progettata con cura per Wayland, costruita con Quickshell.",
"noctalia-git-commit": "Commit Git:",
"noctalia-installed-version": "Versione installata:",
@@ -721,6 +732,7 @@
"supporters-desc": "Un enorme grazie al nostro fantastico sostenitore!",
"supporters-desc-plural": "Un enorme grazie ai nostri <b>{count} fantastici</b> sostenitori!",
"supporters-loading": "Caricamento sostenitori...",
"system-board": "Scheda madre:",
"system-cpu": "CPU:",
"system-disk": "Disco:",
"system-gpu": "GPU:",
@@ -1205,10 +1217,10 @@
"noctalia-started-description": "Comando da eseguire quando Noctalia ha finito il caricamento.",
"noctalia-started-label": "Noctalia avviata",
"noctalia-started-placeholder": "es. notify-send 'Noctalia caricata'",
"performance-mode-disabled-description": "Comando da eseguire quando modalità prestazioni Noctalia è disabilitata.",
"performance-mode-disabled-description": "Comando da eseguire quando la modalità prestazioni Noctalia è disabilitata.",
"performance-mode-disabled-label": "Modalità prestazioni disabilitata",
"performance-mode-disabled-placeholder": "es. notify-send \"Prestazioni\" \"Modalità disabilitata\"",
"performance-mode-enabled-description": "Comando da eseguire quando modalità prestazioni Noctalia è abilitata.",
"performance-mode-enabled-description": "Comando da eseguire quando la modalità prestazioni Noctalia è abilitata.",
"performance-mode-enabled-label": "Modalità prestazioni abilitata",
"performance-mode-enabled-placeholder": "es. notify-send \"Prestazioni\" \"Modalità abilitata\"",
"screen-lock-description": "Comando da eseguire quando lo schermo viene bloccato.",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "Mostra suggerimenti scorciatoie nelle opzioni sessione.",
"show-keybinds-label": "Mostra scorciatoie"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Mantenere visibili i widget del desktop mentre la modalità prestazioni Noctalia è abilitato.",
"noctalia-performance-disable-desktop-widgets-label": "Abilita i widget desktop in modalità prestazioni",
"noctalia-performance-disable-wallpaper-description": "Mantieni visibili gli sfondi del desktop, della panoramica e della schermata di blocco mentre la modalità prestazioni Noctalia è abilitato.",
"noctalia-performance-disable-wallpaper-label": "Abilita il rendering dello sfondo in modalità prestazioni",
"title": "Sistema"
},
"system-monitor": {
"critical-color-label": "Colore critico",
"custom-highlight-colors-title-label": "Colori evidenziazione personalizzati",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "Intervallo polling",
"polling-section-description": "Configura la frequenza di aggiornamento di ogni metrica di sistema.",
"polling-section-label": "Intervalli polling",
"threshold-critical": "Soglia critica",
"threshold-warning": "Soglia avviso",
"threshold-critical": "Critico",
"threshold-warning": "Avviso",
"thresholds-section-description": "Regola soglie avviso/critiche per ogni metrica di sistema.",
"use-custom-highlight-colors-description": "Quando disattivato, vengono usati i colori evidenziazione predefiniti del tema.",
"use-custom-highlight-colors-label": "Usa colori evidenziazione personalizzati",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "Velocità animazione",
"animation-speed-reset": "Reimposta velocità animazione",
"appearance-desc": "Personalizza elementi visivi come tooltip, bordi e ombre.",
"blur-behind-description": "Sfoca l'area dietro le barre e i pannelli utilizzando il protocollo di sfocatura del compositore.",
"blur-behind-label": "Sfocatura dello sfondo",
"box-border-description": "Mostra un contorno attorno alle aree contenuto.",
"box-border-label": "Contorno contenitore",
"box-border-radius-description": "Regola larrotondamento degli angoli delle principali sezioni layout, come sidebar, schede e pannelli contenuto.",
@@ -1847,6 +1868,10 @@
"unavailable": "Clipboard history unavailable",
"unavailable-desc": "The 'cliphist' application is not installed. Please install it to use clipboard history features"
},
"custom-command-failed": {
"description": "Comando fallito: {command}\\nCodice di uscita: {code}",
"title": "Comando personalizzato fallito"
},
"do-not-disturb": {
"disabled": "'Non disturbare' disattivato",
"disabled-desc": "Showing all notifications",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "Aggiungi widget",
"bluetooth-auto-connect-off": "Connessione automatica disattivata — clicca per abilitare",
"bluetooth-auto-connect-on": "Connessione automatica attiva — clicca per disabilitare",
"auto-connect": "Attiva/disattiva la connessione automatica per questo dispositivo",
"bluetooth-auto-connect-off": "Connessione automatica disattivata",
"bluetooth-auto-connect-on": "Connessione automatica attiva",
"bluetooth-devices": "Dispositivi Bluetooth",
"brightness-at": "Luminosità: {brightness}%",
"click-to-start-recording": "Registratore schermo (avvia registrazione)",
+30 -4
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "ビジュアライザーの色を選択します。",
"color-name-label": "塗りつぶし色",
"height-description": "カスタムコンポーネントの幅。",
"hide-when-idle-description": "有効にすると、再生中のプレーヤーがない場合にビジュアライザーを隠します。",
"hide-when-idle-label": "メディア停止時は隠す",
"width-description": "コンポーネントの幅をカスタム設定します。"
@@ -293,6 +294,8 @@
"focused-color-label": "フォーカスされたワークスペースの色",
"follow-focused-screen-description": "バーが配置されている画面ではなく、現在フォーカスされている画面のワークスペースを表示します。",
"follow-focused-screen-label": "フォーカス中の画面に追従",
"font-weight-description": "ワークスペース内のテキストの視覚的ウェイトを設定します。",
"font-weight-label": "フォントの太さ",
"grouped-border-opacity-description": "ワークスペースコンテナのボーダーの不透明度を設定します。",
"grouped-border-opacity-label": "境界線の不透明度",
"hide-unoccupied-description": "ウィンドウがないワークスペースを表示しません。",
@@ -376,6 +379,7 @@
"add": "追加",
"appearance": "外観",
"apply": "適用",
"auto-connect": "自動接続",
"automation": "自動化",
"available": "利用可能",
"back": "戻る",
@@ -426,6 +430,11 @@
"execute": "実行",
"faithful": "忠実",
"focus": "集中",
"font-weight-bold": "太字",
"font-weight-light": "ライト",
"font-weight-medium": "中",
"font-weight-regular": "標準",
"font-weight-semibold": "セミボールド",
"frequency": "頻度",
"gateway": "ゲートウェイ",
"general": "一般",
@@ -470,6 +479,7 @@
"panels": "パネル",
"password": "パスワード",
"pause": "一時停止",
"performance": "パフォーマンス",
"pin": "ピン留め",
"play": "再生",
"polling": "ポーリング",
@@ -709,6 +719,7 @@
"debug-disabled": "デバッグモードが無効になりました",
"debug-enabled": "デバッグモードが有効です",
"info-copied": "クリップボードにコピーしました",
"noctalia-available": "利用可能:",
"noctalia-desc": "Wayland のために丁寧に作り込まれた、Quickshell 製の洗練されたミニマルなデスクトップシェル。",
"noctalia-git-commit": "Git コミット:",
"noctalia-installed-version": "現在のバージョン:",
@@ -721,6 +732,7 @@
"supporters-desc": "素晴らしいサポーターに心からの感謝を!",
"supporters-desc-plural": "<b>{count}名の素晴らしい</b>サポーターの皆様に心より感謝いたします!",
"supporters-loading": "サポーターを読み込み中...",
"system-board": "マザーボード:",
"system-cpu": "CPU",
"system-disk": "ディスク:",
"system-gpu": "GPU",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "セッションオプションにキーバインドのヒントを表示する。",
"show-keybinds-label": "キーバインドを表示"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Noctalia パフォーマンスモードが有効な間、デスクトップウィジェットを表示したままにする。",
"noctalia-performance-disable-desktop-widgets-label": "パフォーマンスモードでデスクトップウィジェットを有効にする",
"noctalia-performance-disable-wallpaper-description": "Noctalia パフォーマンスモードが有効な間、デスクトップ、概要、ロック画面の壁紙を表示したままにします。",
"noctalia-performance-disable-wallpaper-label": "パフォーマンスモードで壁紙のレンダリングを有効にする",
"title": "システム"
},
"system-monitor": {
"critical-color-label": "危険時の色",
"custom-highlight-colors-title-label": "カスタムハイライト色",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "ポーリング間隔",
"polling-section-description": "各システムメトリクスの更新頻度を設定します。",
"polling-section-label": "ポーリング間隔",
"threshold-critical": "危険閾値",
"threshold-warning": "警告閾値",
"threshold-critical": "重大",
"threshold-warning": "警告",
"thresholds-section-description": "各システムメトリックの警告/危険しきい値とポーリング間隔を調整します。",
"use-custom-highlight-colors-description": "無効にすると、テーマのデフォルト強調色が使用されます。",
"use-custom-highlight-colors-label": "カスタム強調色を使用する",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "アニメーション速度",
"animation-speed-reset": "アニメーション速度をリセット",
"appearance-desc": "ツールチップ、境界線、影などの視覚要素をカスタマイズします。",
"blur-behind-description": "バーとパネルの背後の領域を、コンポジターのぼかしプロトコルを使用してぼかします。",
"blur-behind-label": "背景ぼかし",
"box-border-description": "コンテンツ領域の周りにアウトラインを表示します。",
"box-border-label": "コンテナの輪郭",
"box-border-radius-description": "サイドバー、カード、コンテンツパネルなど、主要なレイアウト部分の角の丸みを調整します。",
@@ -1847,6 +1868,10 @@
"unavailable": "クリップボード履歴を利用できません",
"unavailable-desc": "cliphist がインストールされていません。クリップボード履歴機能を使用するにはインストールしてください"
},
"custom-command-failed": {
"description": "コマンドが失敗しました: {command}\\n終了コード: {code}",
"title": "カスタムコマンドが失敗しました"
},
"do-not-disturb": {
"disabled": "おやすみモードを無効化",
"disabled-desc": "すべての通知を表示します",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "ウィジェットを追加",
"bluetooth-auto-connect-off": "自動接続はオフです — クリックして有効にする",
"bluetooth-auto-connect-on": "自動接続がオンです — クリックして無効にする",
"auto-connect": "このデバイスの自動接続を切り替える",
"bluetooth-auto-connect-off": "自動接続が無効です",
"bluetooth-auto-connect-on": "自動接続が有効です",
"bluetooth-devices": "Bluetooth デバイス",
"brightness-at": "画面の明るさ:{brightness}%",
"click-to-start-recording": "画面録画(録画開始)",
+30 -4
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "비주얼라이저의 색상을 선택합니다.",
"color-name-label": "색으로 채우기",
"height-description": "사용자 지정 구성 요소 너비.",
"hide-when-idle-description": "활성화하면 재생기가 재생 중이지 않을 때 비주얼라이저를 숨깁니다.",
"hide-when-idle-label": "미디어 재생 중이 아닐 때 숨기기",
"width-description": "구성 요소의 너비를 사용자 지정합니다."
@@ -293,6 +294,8 @@
"focused-color-label": "포커스된 작업 공간 색상",
"follow-focused-screen-description": "바가 위치한 화면 대신 현재 포커스된 화면의 작업 공간을 표시합니다.",
"follow-focused-screen-label": "포커스된 화면 따르기",
"font-weight-description": "작업 공간 내 텍스트의 시각적 가중치를 설정합니다.",
"font-weight-label": "글꼴 두께",
"grouped-border-opacity-description": "작업 공간 컨테이너 테두리의 불투명도 수준을 설정합니다.",
"grouped-border-opacity-label": "테두리 불투명도",
"hide-unoccupied-description": "창이 없는 작업 공간을 표시하지 않습니다.",
@@ -376,6 +379,7 @@
"add": "추가",
"appearance": "모양",
"apply": "적용",
"auto-connect": "자동 연결",
"automation": "자동화",
"available": "사용 가능",
"back": "뒤로",
@@ -426,6 +430,11 @@
"execute": "실행",
"faithful": "충실하게",
"focus": "포커스",
"font-weight-bold": "굵게",
"font-weight-light": "라이트",
"font-weight-medium": "중간",
"font-weight-regular": "보통",
"font-weight-semibold": "세미볼드",
"frequency": "빈도",
"gateway": "게이트웨이",
"general": "일반",
@@ -470,6 +479,7 @@
"panels": "패널",
"password": "비밀번호",
"pause": "일시 정지",
"performance": "성능",
"pin": "고정",
"play": "재생",
"polling": "폴링",
@@ -709,6 +719,7 @@
"debug-disabled": "디버그 모드 비활성화됨",
"debug-enabled": "디버그 모드 활성화됨",
"info-copied": "정보가 클립보드에 복사됨",
"noctalia-available": "사용 가능:",
"noctalia-desc": "Wayland를 위해 세심하게 제작된 매끄럽고 미니멀한 데스크톱 셸로, Quickshell로 빌드되었습니다.",
"noctalia-git-commit": "Git 커밋:",
"noctalia-installed-version": "설치된 버전:",
@@ -721,6 +732,7 @@
"supporters-desc": "멋진 후원자분께 진심으로 감사드립니다!",
"supporters-desc-plural": "저희의 <b>{count}명의 멋진</b> 후원자분들께 진심으로 감사드립니다!",
"supporters-loading": "후원자 불러오는 중...",
"system-board": "메인보드:",
"system-cpu": "CPU:",
"system-disk": "디스크:",
"system-gpu": "GPU:",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "세션 옵션에 키 바인딩 힌트를 표시합니다.",
"show-keybinds-label": "단축키 표시"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Noctalia 성능 모드가 활성화된 동안 데스크톱 위젯을 계속 표시합니다.",
"noctalia-performance-disable-desktop-widgets-label": "성능 모드에서 데스크톱 위젯 활성화",
"noctalia-performance-disable-wallpaper-description": "Noctalia 성능 모드가 활성화된 동안 데스크톱, 개요, 잠금 화면 배경화면을 계속 표시합니다.",
"noctalia-performance-disable-wallpaper-label": "성능 모드에서 배경화면 렌더링 활성화",
"title": "시스템"
},
"system-monitor": {
"critical-color-label": "위험 색상",
"custom-highlight-colors-title-label": "사용자 지정 강조 색상",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "폴링 간격",
"polling-section-description": "각 시스템 값을 갱신하는 빈도를 정합니다.",
"polling-section-label": "폴링 간격",
"threshold-critical": "위험 임계값",
"threshold-warning": "경고 임계값",
"threshold-critical": "심각",
"threshold-warning": "경고",
"thresholds-section-description": "각 시스템 값에 대한 경고/위험 임계값을 조정합니다.",
"use-custom-highlight-colors-description": "비활성화하면 테마 기본 강조 색상이 사용됩니다.",
"use-custom-highlight-colors-label": "사용자 지정 강조 색상 사용",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "애니메이션 속도",
"animation-speed-reset": "애니메이션 속도 초기화",
"appearance-desc": "툴팁, 테두리, 그림자와 같은 시각적 요소를 사용자 지정합니다.",
"blur-behind-description": "컴포지터 블러 프로토콜을 사용하여 바와 패널 뒤 영역을 흐리게 처리합니다.",
"blur-behind-label": "배경 흐림",
"box-border-description": "콘텐츠 영역 주위에 윤곽선을 표시합니다.",
"box-border-label": "컨테이너 윤곽선",
"box-border-radius-description": "사이드바, 카드, 콘텐츠 패널과 같은 주요 레이아웃 섹션의 모서리 둥글기를 조정합니다.",
@@ -1847,6 +1868,10 @@
"unavailable": "클립보드 기록 사용 불가",
"unavailable-desc": "'cliphist' 애플리케이션이 설치되어 있지 않습니다. 클립보드 기록 기능을 사용하려면 설치하세요"
},
"custom-command-failed": {
"description": "명령 실패: {command}\\n종료 코드: {code}",
"title": "사용자 지정 명령 실패"
},
"do-not-disturb": {
"disabled": "방해 금지 모드 비활성화됨",
"disabled-desc": "모든 알림 표시 중",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "위젯 추가",
"bluetooth-auto-connect-off": "자동 연결이 꺼져 있습니다 — 클릭하여 활성화",
"bluetooth-auto-connect-on": "자동 연결 켜짐 — 클릭하여 비활성화",
"auto-connect": "이 장치의 자동 연결 토글",
"bluetooth-auto-connect-off": "자동 연결 비활성화",
"bluetooth-auto-connect-on": "자동 연결 활성화됨",
"bluetooth-devices": "블루투스 장치",
"brightness-at": "밝기: {brightness}%",
"click-to-start-recording": "화면 녹화 (녹화 시작)",
+2 -2
View File
@@ -60,7 +60,7 @@
"hide-if-not-detected-label": "Dema ku neyê dîtin veşêre",
"low-battery-threshold-label": "Asta hişyariya betarî ya kêm",
"show-noctalia-performance-description": "Guhêrbarê awaya performansê ya Noctalia di hundirê destgeha betariyê de nîşan bide.<br>Sî û anîmasyonan di Noctalia de neçalak dike da ku bikaranîna çavkaniyan kêm bike.",
"show-noctalia-performance-label": "Guhêrbarê performansa Noctalia nîşan bide",
"show-noctalia-performance-label": "Guhêrbarê Performansa Noctalia nîşan bide",
"show-power-profile-description": "Hilbijartina profîla hêzê di hundirê destgeha betariyê de nîşan bide.",
"show-power-profile-label": "Kontrolên profîla hêzê nîşan bide"
},
@@ -1614,7 +1614,7 @@
"noctalia-performance": {
"disabled": "Rewşa performansê hat betalkirin",
"enabled": "Rewşa performansê çalak bû",
"label": "Performansa Noctalîa"
"label": "Performansa Noctalia"
},
"power-profile": {
"changed": "Profîla hêzê hate guhertin",
+30 -4
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "Selecteer de kleur voor de visualizer.",
"color-name-label": "Vulkleur",
"height-description": "Aangepaste componentbreedte.",
"hide-when-idle-description": "Indien ingeschakeld wordt de visualizer verborgen, tenzij een speler actief afspeelt.",
"hide-when-idle-label": "Verbergen wanneer geen media speelt",
"width-description": "Aangepaste componentbreedte."
@@ -293,6 +294,8 @@
"focused-color-label": "Kleur van de gefocuste Workspace",
"follow-focused-screen-description": "Werkruimten weergeven van het momenteel gefocuste scherm, in plaats van het scherm waar de balk zich bevindt.",
"follow-focused-screen-label": "Gefocust scherm volgen",
"font-weight-description": "Stel het visuele gewicht in voor tekst binnen de werkruimte.",
"font-weight-label": "Lettertypegewicht",
"grouped-border-opacity-description": "Stel het dekkingsniveau in voor de randen van de werkruimtecontainer.",
"grouped-border-opacity-label": "Randdekking",
"hide-unoccupied-description": "Werkruimten zonder vensters niet weergeven.",
@@ -376,6 +379,7 @@
"add": "Toevoegen",
"appearance": "Uiterlijk",
"apply": "Toepassen",
"auto-connect": "Automatisch verbinden",
"automation": "Automatisering",
"available": "Beschikbaar",
"back": "Terug",
@@ -426,6 +430,11 @@
"execute": "Uitvoeren",
"faithful": "Getrouw",
"focus": "Focus",
"font-weight-bold": "Vet",
"font-weight-light": "Licht",
"font-weight-medium": "Medium",
"font-weight-regular": "Normaal",
"font-weight-semibold": "Semi-vet",
"frequency": "Frequentie",
"gateway": "Poort",
"general": "Algemeen",
@@ -470,6 +479,7 @@
"panels": "Panelen",
"password": "Wachtwoord",
"pause": "Pauze",
"performance": "Prestaties",
"pin": "Vastmaken",
"play": "Afspelen",
"polling": "Polling",
@@ -709,6 +719,7 @@
"debug-disabled": "Foutopsporingsmodus uitgeschakeld",
"debug-enabled": "Foutopsporingsmodus ingeschakeld",
"info-copied": "Info gekopieerd naar klembord",
"noctalia-available": "Beschikbaar:",
"noctalia-desc": "Een strakke en minimale desktopshell, met zorg gemaakt voor Wayland en gebouwd met Quickshell.",
"noctalia-git-commit": "Git commit:",
"noctalia-installed-version": "Geïnstalleerde versie:",
@@ -721,6 +732,7 @@
"supporters-desc": "Een enorme dank aan onze geweldige supporter!",
"supporters-desc-plural": "Enorm bedankt aan onze <b>{count} geweldige</b> supporters!",
"supporters-loading": "Donateurs laden...",
"system-board": "Moederbord:",
"system-cpu": "CPU:",
"system-disk": "Schijf:",
"system-gpu": "GPU:",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "Toon toetscombinatiehints bij sessie-opties.",
"show-keybinds-label": "Toetsencombinaties weergeven"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Houd desktopwidgets zichtbaar terwijl de Noctalia prestatiemodus is ingeschakeld.",
"noctalia-performance-disable-desktop-widgets-label": "Desktopwidgets inschakelen in prestatiemodus",
"noctalia-performance-disable-wallpaper-description": "Houd bureaublad-, overzicht- en vergrendelschermachtergronden zichtbaar terwijl de Noctalia prestatiemodus is ingeschakeld.",
"noctalia-performance-disable-wallpaper-label": "Achtergrondweergave inschakelen in prestatiemodus",
"title": "Systeem"
},
"system-monitor": {
"critical-color-label": "Kritische kleur",
"custom-highlight-colors-title-label": "Aangepaste markeerkleuren",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "Peilingsinterval",
"polling-section-description": "Configureer hoe vaak elke systeemmetriek wordt bijgewerkt.",
"polling-section-label": "Peilingsintervallen",
"threshold-critical": "Kritische drempel",
"threshold-warning": "Waarschuwingsdrempel",
"threshold-critical": "Kritiek",
"threshold-warning": "Waarschuwing",
"thresholds-section-description": "Pas de waarschuwing/kritieke drempels en de pollingsintervallen voor elke systeemmetriek aan.",
"use-custom-highlight-colors-description": "Indien uitgeschakeld, worden de standaard markeerkleuren van het thema gebruikt.",
"use-custom-highlight-colors-label": "Gebruik aangepaste markeerkleuren",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "Animatiesnelheid",
"animation-speed-reset": "Animatiesnelheid resetten",
"appearance-desc": "Pas visuele elementen aan, zoals tooltips, randen en schaduwen.",
"blur-behind-description": "Vervaagt het gebied achter balken en panelen met behulp van het compositor-blurprotocol.",
"blur-behind-label": "Achtergrond vervagen",
"box-border-description": "Toon een omlijning rond inhoudsgebieden.",
"box-border-label": "Containeromtrek",
"box-border-radius-description": "Past de hoekronding aan van belangrijke lay-outsecties, zoals zijbalken, kaarten en inhoudspanelen.",
@@ -1847,6 +1868,10 @@
"unavailable": "Klembordgeschiedenis niet beschikbaar",
"unavailable-desc": "De toepassing 'cliphist' is niet geïnstalleerd. Installeer deze om functies voor klembordgeschiedenis te gebruiken"
},
"custom-command-failed": {
"description": "Commando mislukt: {command}\\nExitcode: {code}",
"title": "Aangepaste opdracht mislukt"
},
"do-not-disturb": {
"disabled": "'Niet storen' uitgeschakeld",
"disabled-desc": "Alle meldingen worden weergegeven",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "Widget toevoegen",
"bluetooth-auto-connect-off": "Automatisch verbinden is uitgeschakeld — klik om in te schakelen",
"bluetooth-auto-connect-on": "Automatisch verbinden is aan — klik om uit te schakelen",
"auto-connect": "Automatisch verbinden voor dit apparaat in-/uitschakelen",
"bluetooth-auto-connect-off": "Automatisch verbinden uitgeschakeld",
"bluetooth-auto-connect-on": "Automatisch verbinden ingeschakeld",
"bluetooth-devices": "Bluetooth-apparaten",
"brightness-at": "Helderheid: {brightness}%",
"click-to-start-recording": "Schermrecorder (opname starten)",
+1 -1
View File
@@ -60,7 +60,7 @@
"hide-if-not-detected-label": "Gøym når ikkje funnen",
"low-battery-threshold-label": "Varslingsterskel for lågt batterinivå",
"show-noctalia-performance-description": "Viser ytingsmodusbrytaren for Noctalia i batterifanen.<br>Slår av skuggar og animasjonar i Noctalia for å minka ressursbruk.",
"show-noctalia-performance-label": "Vis ytingsmodusbrytaren for Noctalia",
"show-noctalia-performance-label": "Vis Noctalia Yting-brytaren",
"show-power-profile-description": "Viser veljaren for energiprofil i batterifanen.",
"show-power-profile-label": "Vis kontrollane for energiprofil"
},
+31 -5
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "Wybierz kolor dla wizualizatora.",
"color-name-label": "Kolor wypełnienia",
"height-description": "Niestandardowa szerokość komponentu.",
"hide-when-idle-description": "Gdy włączone, wizualizator jest ukryty, chyba że odtwarzacz jest aktywny.",
"hide-when-idle-label": "Ukryj, gdy nic nie jest odtwarzane",
"width-description": "Niestandardowa szerokość komponentu."
@@ -61,7 +62,7 @@
"hide-if-not-detected-label": "Ukryj się, jeśli nie wykryto",
"low-battery-threshold-label": "Próg ostrzegania o niskim poziomie baterii",
"show-noctalia-performance-description": "Wyświetl przełącznik trybu wydajności Noctalia w panelu baterii.<br>Wyłącza cienie i animacje w Noctalia, aby zmniejszyć zużycie zasobów.",
"show-noctalia-performance-label": "Pokaż przełącznik wydajności Noctalia",
"show-noctalia-performance-label": "Pokaż przełącznik Wydajności Noctalia",
"show-power-profile-description": "Wyświetl wybór profilu zasilania w panelu baterii.",
"show-power-profile-label": "Pokaż kontrolki profilu zasilania"
},
@@ -293,6 +294,8 @@
"focused-color-label": "Kolor aktywnego obszaru roboczego",
"follow-focused-screen-description": "Wyświetl obszary robocze z aktualnie aktywnego ekranu, zamiast ekranu, na którym znajduje się pasek.",
"follow-focused-screen-label": "Podążaj za skupionym ekranem",
"font-weight-description": "Ustaw wizualną wagę tekstu w obszarze roboczym.",
"font-weight-label": "Grubość czcionki",
"grouped-border-opacity-description": "Ustaw poziom krycia dla obramowań kontenerów obszaru roboczego.",
"grouped-border-opacity-label": "Krycie obramowania",
"hide-unoccupied-description": "Nie wyświetlaj obszarów roboczych bez okien.",
@@ -376,6 +379,7 @@
"add": "Dodaj",
"appearance": "Wygląd",
"apply": "Zastosuj",
"auto-connect": "Automatyczne łączenie",
"automation": "Automatyzacja",
"available": "Dostępne",
"back": "Powrót",
@@ -426,6 +430,11 @@
"execute": "Wykonaj",
"faithful": "Wierny",
"focus": "Skupienie",
"font-weight-bold": "Pogrubienie",
"font-weight-light": "Cienka",
"font-weight-medium": "Średni",
"font-weight-regular": "Zwykły",
"font-weight-semibold": "Półgruby",
"frequency": "Częstotliwość",
"gateway": "Brama",
"general": "Ogólne",
@@ -470,6 +479,7 @@
"panels": "Panele",
"password": "Hasło",
"pause": "Pauza",
"performance": "Wydajność",
"pin": "Przypnij",
"play": "Odtwórz",
"polling": "Odpytywanie",
@@ -709,6 +719,7 @@
"debug-disabled": "Tryb debugowania wyłączony",
"debug-enabled": "Tryb debugowania włączony",
"info-copied": "Informacje skopiowane do schowka",
"noctalia-available": "Dostępne:",
"noctalia-desc": "Elegancka i minimalistyczna powłoka pulpitu stworzona dla Wayland, zbudowana w Quickshell.",
"noctalia-git-commit": "Git commit:",
"noctalia-installed-version": "Zainstalowana wersja:",
@@ -721,6 +732,7 @@
"supporters-desc": "Ogromne podziękowania dla naszego wspaniałego wspierającego!",
"supporters-desc-plural": "Ogromne podziękowania dla naszych <b>{count} wspaniałych</b> wspierających!",
"supporters-loading": "Ładowanie wspierających...",
"system-board": "Płyta główna:",
"system-cpu": "Procesor:",
"system-disk": "Dysk:",
"system-gpu": "GPU:",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "Wyświetl podpowiedzi skrótów klawiszowych w opcjach sesji.",
"show-keybinds-label": "Pokaż skróty klawiszowe"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Zachowaj widoczność widżetów pulpitu, gdy tryb wydajności Noctalia jest włączony.",
"noctalia-performance-disable-desktop-widgets-label": "Włącz widżety pulpitu w trybie wydajności",
"noctalia-performance-disable-wallpaper-description": "Zachowaj widoczne tapety pulpitu, przeglądu i ekranu blokady, gdy tryb wydajności Noctalia jest włączony.",
"noctalia-performance-disable-wallpaper-label": "Włącz renderowanie tapety w trybie wydajności",
"title": "System"
},
"system-monitor": {
"critical-color-label": "Kolor krytyczny",
"custom-highlight-colors-title-label": "Własne kolory podświetlenia",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "Interwał odświeżania",
"polling-section-description": "Skonfiguruj, jak często każda metryka systemowa jest aktualizowana.",
"polling-section-label": "Interwały odpytywania",
"threshold-critical": "Próg krytyczny",
"threshold-warning": "Próg ostrzegawczy",
"threshold-critical": "Krytyczny",
"threshold-warning": "Ostrzeżenie",
"thresholds-section-description": "Dostosuj progi ostrzegawcze/krytyczne oraz interwały odświeżania dla każdej metryki systemu.",
"use-custom-highlight-colors-description": "Gdy wyłączone, używane są domyślne kolory podświetlenia motywu.",
"use-custom-highlight-colors-label": "Użyj własnych kolorów podświetlenia",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "Prędkość animacji",
"animation-speed-reset": "Resetuj prędkość animacji",
"appearance-desc": "Dostosuj elementy wizualne, takie jak podpowiedzi, obramowania i cienie.",
"blur-behind-description": "Rozmywa obszar za paskami i panelami, używając protokołu rozmycia kompozytora.",
"blur-behind-label": "Rozmycie tła",
"box-border-description": "Wyświetla obrys wokół obszarów zawartości.",
"box-border-label": "Obrys kontenera",
"box-border-radius-description": "Dostosowuje zaokrąglenie narożników głównych sekcji układu, takich jak paski boczne, karty i panele treści.",
@@ -1847,6 +1868,10 @@
"unavailable": "Historia schowka niedostępna",
"unavailable-desc": "Aplikacja 'cliphist' nie jest zainstalowana. Zainstaluj ją, aby korzystać z historii schowka"
},
"custom-command-failed": {
"description": "Polecenie nie powiodło się: {command}\\nKod wyjścia: {code}",
"title": "Niestandardowe polecenie nie powiodło się"
},
"do-not-disturb": {
"disabled": "Nie przeszkadzać wyłączone",
"disabled-desc": "Pokazywanie wszystkich powiadomień",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "Dodaj widżet",
"bluetooth-auto-connect-off": "Automatyczne łączenie jest wyłączone — kliknij, aby włączyć",
"bluetooth-auto-connect-on": "Automatyczne łączenie włączone — kliknij, aby wyłączyć",
"auto-connect": "Przełącz automatyczne łączenie dla tego urządzenia",
"bluetooth-auto-connect-off": "Automatyczne łączenie wyłączone",
"bluetooth-auto-connect-on": "Automatyczne łączenie włączone",
"bluetooth-devices": "Urządzenia Bluetooth",
"brightness-at": "Jasność: {brightness}%",
"click-to-start-recording": "Nagrywanie ekranu (start)",
+30 -4
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "Selecione a cor para o visualizador.",
"color-name-label": "Cor de preenchimento",
"height-description": "Largura de componente personalizada.",
"hide-when-idle-description": "Quando ativado, o visualizador fica oculto a menos que haja reprodução ativa.",
"hide-when-idle-label": "Ocultar quando não houver reprodução",
"width-description": "Largura do componente personalizado."
@@ -293,6 +294,8 @@
"focused-color-label": "Cor do workspace focado",
"follow-focused-screen-description": "Exibir áreas de trabalho da tela atualmente em foco, em vez da tela onde a barra está localizada.",
"follow-focused-screen-label": "Seguir tela em foco",
"font-weight-description": "Definir o peso visual para o texto na área de trabalho.",
"font-weight-label": "Peso da fonte",
"grouped-border-opacity-description": "Definir o nível de opacidade para as bordas do contêiner do espaço de trabalho.",
"grouped-border-opacity-label": "Opacidade da borda",
"hide-unoccupied-description": "Não exibir áreas de trabalho sem janelas.",
@@ -376,6 +379,7 @@
"add": "Adicionar",
"appearance": "Aparência",
"apply": "Aplicar",
"auto-connect": "Conexão automática",
"automation": "Automação",
"available": "Disponível",
"back": "Voltar",
@@ -426,6 +430,11 @@
"execute": "Executar",
"faithful": "Fiel",
"focus": "Foco",
"font-weight-bold": "Negrito",
"font-weight-light": "Leve",
"font-weight-medium": "Médio",
"font-weight-regular": "Regular",
"font-weight-semibold": "Seminegrito",
"frequency": "Frequência",
"gateway": "Porta de entrada",
"general": "Geral",
@@ -470,6 +479,7 @@
"panels": "Painéis",
"password": "Senha",
"pause": "Pausar",
"performance": "Desempenho",
"pin": "Fixar",
"play": "Reproduzir",
"polling": "Sondagem",
@@ -709,6 +719,7 @@
"debug-disabled": "Modo de depuração desativado",
"debug-enabled": "Modo de depuração ativado",
"info-copied": "Informação copiada para a área de transferência",
"noctalia-available": "Disponível:",
"noctalia-desc": "Um shell de desktop elegante e minimalista, cuidadosamente criado para Wayland, construído com Quickshell.",
"noctalia-git-commit": "Commit Git:",
"noctalia-installed-version": "Versão instalada:",
@@ -721,6 +732,7 @@
"supporters-desc": "Um enorme obrigado ao nosso incrível apoiador!",
"supporters-desc-plural": "Um enorme obrigado aos nossos <b>{count} incríveis</b> apoiadores!",
"supporters-loading": "Carregando apoiadores...",
"system-board": "Placa-mãe:",
"system-cpu": "CPU:",
"system-disk": "Disco:",
"system-gpu": "GPU:",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "Exibir dicas de atalhos de teclado nas opções de sessão.",
"show-keybinds-label": "Mostrar atalhos de teclado"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Manter os widgets da área de trabalho visíveis enquanto o modo de desempenho Noctalia estiver ativado.",
"noctalia-performance-disable-desktop-widgets-label": "Ativar widgets de ambiente de trabalho no modo de desempenho",
"noctalia-performance-disable-wallpaper-description": "Mantenha os papéis de parede da área de trabalho, da visão geral e da tela de bloqueio visíveis enquanto o modo de desempenho Noctalia estiver ativado.",
"noctalia-performance-disable-wallpaper-label": "Ativar renderização de papel de parede no modo de desempenho",
"title": "Sistema"
},
"system-monitor": {
"critical-color-label": "Cor crítica",
"custom-highlight-colors-title-label": "Cores de destaque personalizadas",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "Intervalo de pesquisa",
"polling-section-description": "Configure a frequência com que cada métrica do sistema é atualizada.",
"polling-section-label": "Intervalos de pesquisa",
"threshold-critical": "Limiar crítico",
"threshold-warning": "Limite de alerta",
"threshold-critical": "Crítico",
"threshold-warning": "Aviso",
"thresholds-section-description": "Ajuste os limites de aviso/crítico e os intervalos de consulta para cada métrica do sistema.",
"use-custom-highlight-colors-description": "Quando desativado, são usadas as cores de destaque padrão do tema.",
"use-custom-highlight-colors-label": "Usar cores de destaque personalizadas",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "Velocidade da animação",
"animation-speed-reset": "Redefinir velocidade da animação",
"appearance-desc": "Personalize elementos visuais como dicas de ferramentas, bordas e sombras.",
"blur-behind-description": "Desfoca a área atrás das barras e painéis usando o protocolo de desfoque do compositor.",
"blur-behind-label": "Desfoque de fundo",
"box-border-description": "Exibe um contorno ao redor das áreas de conteúdo.",
"box-border-label": "Contorno do recipiente",
"box-border-radius-description": "Ajusta o arredondamento dos cantos das principais seções do layout, como barras laterais, cards e painéis de conteúdo.",
@@ -1847,6 +1868,10 @@
"unavailable": "Histórico da área de transferência indisponível",
"unavailable-desc": "O aplicativo 'cliphist' não está instalado. Por favor, instale-o para usar os recursos do histórico da área de transferência"
},
"custom-command-failed": {
"description": "Comando falhou: {command}\\nCódigo de saída: {code}",
"title": "Comando personalizado falhou"
},
"do-not-disturb": {
"disabled": "'Não perturbe' desativado",
"disabled-desc": "Mostrando todas as notificações",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "Adicionar widget",
"bluetooth-auto-connect-off": "Conexão automática desativada — clique para ativar",
"bluetooth-auto-connect-on": "Conexão automática ativada — clique para desativar",
"auto-connect": "Alternar conexão automática para este dispositivo",
"bluetooth-auto-connect-off": "Conexão automática desativada",
"bluetooth-auto-connect-on": "Conexão automática ativada",
"bluetooth-devices": "Dispositivos Bluetooth",
"brightness-at": "Brilho: {brightness}%",
"click-to-start-recording": "Gravador de tela (iniciar gravação)",
+30 -4
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "Выберите цвет для визуализатора.",
"color-name-label": "Цвет заливки",
"height-description": "Пользовательская ширина компонента.",
"hide-when-idle-description": "Если включено, визуализатор скрыт, пока плеер не начнёт воспроизведение.",
"hide-when-idle-label": "Скрывать, когда медиа не воспроизводится",
"width-description": "Пользовательская ширина компонента."
@@ -293,6 +294,8 @@
"focused-color-label": "Цвет активного рабочего пространства",
"follow-focused-screen-description": "Отображать рабочие пространства с текущего активного экрана, а не с экрана, на котором расположена панель.",
"follow-focused-screen-label": "Следовать за активным экраном",
"font-weight-description": "Установить визуальный вес текста в рабочем пространстве.",
"font-weight-label": "Толщина шрифта",
"grouped-border-opacity-description": "Установить уровень прозрачности для границ контейнера рабочей области.",
"grouped-border-opacity-label": "Прозрачность границы",
"hide-unoccupied-description": "Не отображать рабочие пространства без окон.",
@@ -376,6 +379,7 @@
"add": "Добавить",
"appearance": "Внешний вид",
"apply": "Применить",
"auto-connect": "Автоматическое подключение",
"automation": "Автоматизация",
"available": "Доступно",
"back": "Назад",
@@ -426,6 +430,11 @@
"execute": "Выполнить",
"faithful": "Верный",
"focus": "Фокус",
"font-weight-bold": "Жирный",
"font-weight-light": "Тонкий",
"font-weight-medium": "Средний",
"font-weight-regular": "Обычный",
"font-weight-semibold": "Полужирный",
"frequency": "Частота",
"gateway": "Шлюз",
"general": "Общее",
@@ -470,6 +479,7 @@
"panels": "Панели",
"password": "Пароль",
"pause": "Пауза",
"performance": "Производительность",
"pin": "Закрепить",
"play": "Воспроизвести",
"polling": "Опрашивание",
@@ -709,6 +719,7 @@
"debug-disabled": "Режим отладки отключен",
"debug-enabled": "Режим отладки включен",
"info-copied": "Информация скопирована в буфер обмена",
"noctalia-available": "Доступно:",
"noctalia-desc": "Изящная и минималистичная оболочка рабочего стола, тщательно разработанная для Wayland, созданная с помощью Quickshell.",
"noctalia-git-commit": "Git коммит:",
"noctalia-installed-version": "Установленная версия:",
@@ -721,6 +732,7 @@
"supporters-desc": "Огромное спасибо нашему замечательному стороннику!",
"supporters-desc-plural": "Огромное спасибо нашим <b>{count} замечательным</b> сторонникам!",
"supporters-loading": "Загрузка спонсоров...",
"system-board": "Материнская плата:",
"system-cpu": "ЦП:",
"system-disk": "Диск:",
"system-gpu": "Графический процессор",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "Отображать подсказки по горячим клавишам в параметрах сеанса.",
"show-keybinds-label": "Показать сочетания клавиш"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Оставлять виджеты рабочего стола видимыми, пока режим производительности Noctalia включен.",
"noctalia-performance-disable-desktop-widgets-label": "Включить виджеты рабочего стола в режиме производительности",
"noctalia-performance-disable-wallpaper-description": "Сохраняйте видимыми обои рабочего стола, обзора и экрана блокировки, пока режим производительности Noctalia включен.",
"noctalia-performance-disable-wallpaper-label": "Включить рендеринг обоев в режиме производительности",
"title": "Система"
},
"system-monitor": {
"critical-color-label": "Критический цвет",
"custom-highlight-colors-title-label": "Пользовательские цвета выделения",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "Интервал опроса",
"polling-section-description": "Настройте частоту обновления каждой системной метрики.",
"polling-section-label": "Интервалы опроса",
"threshold-critical": "Критический порог",
"threshold-warning": "Предупредительный порог",
"threshold-critical": "Критический",
"threshold-warning": "Предупреждение",
"thresholds-section-description": "Настройте пороги предупреждения/критические пороги и интервалы опроса для каждой системной метрики.",
"use-custom-highlight-colors-description": "Если отключено, используются цвета выделения по умолчанию темы.",
"use-custom-highlight-colors-label": "Использовать пользовательские цвета выделения",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "Скорость анимации",
"animation-speed-reset": "Сбросить скорость анимации",
"appearance-desc": "Настройте визуальные элементы, такие как всплывающие подсказки, границы и тени.",
"blur-behind-description": "Размывает область за панелями и всплывающими окнами, используя протокол размытия композитора.",
"blur-behind-label": "Размытие фона",
"box-border-description": "Отображает контур вокруг областей содержимого.",
"box-border-label": "Контур контейнера",
"box-border-radius-description": "Настраивает скругление углов основных разделов макета, таких как боковые панели, карточки и панели контента.",
@@ -1847,6 +1868,10 @@
"unavailable": "История буфера обмена недоступна",
"unavailable-desc": "Приложение 'cliphist' не установлено. Пожалуйста, установите его, чтобы использовать функции истории буфера обмена"
},
"custom-command-failed": {
"description": "Команда не выполнена: {command}\\nКод выхода: {code}",
"title": "Пользовательская команда не выполнена"
},
"do-not-disturb": {
"disabled": "Режим 'Не беспокоить' отключен",
"disabled-desc": "Отображаются все уведомления",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "Добавить виджет",
"bluetooth-auto-connect-off": "Автоподключение отключено — нажмите, чтобы включить",
"bluetooth-auto-connect-on": "Автоподключение включено — нажмите, чтобы отключить",
"auto-connect": "Переключить автоподключение для этого устройства",
"bluetooth-auto-connect-off": "Автоподключение отключено",
"bluetooth-auto-connect-on": "Автоподключение включено",
"bluetooth-devices": "Устройства Bluetooth",
"brightness-at": "Яркость: {brightness}%",
"click-to-start-recording": "Запись экрана (начать запись)",
+30 -4
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "Välj färg för visualiseraren.",
"color-name-label": "Fyllningsfärg",
"height-description": "Anpassad komponentbredd.",
"hide-when-idle-description": "När denna funktion är aktiverad döljs visualiseraren om ingen spelare är aktiv.",
"hide-when-idle-label": "Dölj när ingen media spelas upp",
"width-description": "Anpassad komponentbredd."
@@ -293,6 +294,8 @@
"focused-color-label": "Fokuserad arbetsområdesfärg",
"follow-focused-screen-description": "Visa arbetsområden från den skärm som för närvarande är fokuserad, snarare än den skärm där fältet finns.",
"follow-focused-screen-label": "Följ fokuserad skärm",
"font-weight-description": "Ställ in den visuella vikten för text inom arbetsytan.",
"font-weight-label": "Teckensnittsvikt",
"grouped-border-opacity-description": "Ställ in opacitetsnivån för arbetsytans behållargränser.",
"grouped-border-opacity-label": "Ramopacitet",
"hide-unoccupied-description": "Visa inte arbetsytor utan fönster.",
@@ -376,6 +379,7 @@
"add": "Lägg till",
"appearance": "Utseende",
"apply": "Tillämpa",
"auto-connect": "Automatisk anslutning",
"automation": "Automation",
"available": "Tillgänglig",
"back": "Tillbaka",
@@ -426,6 +430,11 @@
"execute": "Exekvera",
"faithful": "Trogen",
"focus": "Fokus",
"font-weight-bold": "Fet",
"font-weight-light": "Lätt",
"font-weight-medium": "Mellan",
"font-weight-regular": "Vanlig",
"font-weight-semibold": "Halvfet",
"frequency": "Frekvens",
"gateway": "Gateway",
"general": "Allmänt",
@@ -470,6 +479,7 @@
"panels": "Paneler",
"password": "Lösenord",
"pause": "Paus",
"performance": "Prestanda",
"pin": "Fäst",
"play": "Spela upp",
"polling": "Pollning",
@@ -709,6 +719,7 @@
"debug-disabled": "Felsökningsläge inaktiverat",
"debug-enabled": "Felsökningsläge aktiverat",
"info-copied": "Info kopierad till urklipp",
"noctalia-available": "Tillgänglig:",
"noctalia-desc": "Ett elegant och minimalistiskt skrivbordsskal som är noggrant utformat för Wayland och byggt med Quickshell.",
"noctalia-git-commit": "Git-commit:",
"noctalia-installed-version": "Installerad version:",
@@ -721,6 +732,7 @@
"supporters-desc": "Ett stort tack till vår fantastiska supporter!",
"supporters-desc-plural": "Ett stort tack till våra <b>{count} fantastiska</b> supportrar!",
"supporters-loading": "Laddar supportrar...",
"system-board": "Moderkort:",
"system-cpu": "CPU:",
"system-disk": "Disk:",
"system-gpu": "GPU:",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "Visa kortkommando-tips på sessionsalternativ.",
"show-keybinds-label": "Visa kortkommandon"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Håll skrivbordswidgets synliga medan Noctalia prestandaläget är aktiverat.",
"noctalia-performance-disable-desktop-widgets-label": "Aktivera skrivbordswidgetar i prestandaläge",
"noctalia-performance-disable-wallpaper-description": "Behåll skrivbords-, översikts- och låsskärmsbakgrundsbilder synliga när Noctalia prestandaläget är aktiverat.",
"noctalia-performance-disable-wallpaper-label": "Aktivera bakgrundsbildsåtergivning i prestandaläge",
"title": "System"
},
"system-monitor": {
"critical-color-label": "Kritisk färg",
"custom-highlight-colors-title-label": "Anpassade markeringsfärger",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "Pollningsintervall",
"polling-section-description": "Konfigurera hur ofta varje systemmetrik uppdateras.",
"polling-section-label": "Pollningsintervall",
"threshold-critical": "Kritisk tröskel",
"threshold-warning": "Varningsgräns",
"threshold-critical": "Kritisk",
"threshold-warning": "Varning",
"thresholds-section-description": "Justera varnings-/kritiska trösklar för varje systemmetrik.",
"use-custom-highlight-colors-description": "När denna funktion är inaktiverad används standardfärgerna för markeringar. ",
"use-custom-highlight-colors-label": "Använd anpassade markeringsfärger",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "Animationshastighet",
"animation-speed-reset": "Återställ animationshastighet",
"appearance-desc": "Anpassa visuella element som verktygstips, kantlinjer och skuggor.",
"blur-behind-description": "Suddar ut området bakom fält och paneler med hjälp av kompositorns suddighetsprotokoll.",
"blur-behind-label": "Bakgrundsoskärpa",
"box-border-description": "Visa en kontur runt innehållsområden.",
"box-border-label": "Behållarkontur",
"box-border-radius-description": "Justerar hörnrundningen för större layoutsektioner, såsom sidofält, kort och innehållspaneler.",
@@ -1847,6 +1868,10 @@
"unavailable": "Urklippshistorik otillgänglig",
"unavailable-desc": "Applikationen 'cliphist' är inte installerad. Installera den för att kunna använda klippbordshistorikfunktionerna"
},
"custom-command-failed": {
"description": "Kommando misslyckades: {command}\\nAvslutningskod: {code}",
"title": "Anpassat kommando misslyckades"
},
"do-not-disturb": {
"disabled": "'Stör inte' inaktiverat",
"disabled-desc": "Visar alla aviseringar",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "Lägg till widget",
"bluetooth-auto-connect-off": "Automatisk anslutning är avstängd — klicka för att aktivera",
"bluetooth-auto-connect-on": "Automatisk anslutning är på — klicka för att inaktivera",
"auto-connect": "Växla automatisk anslutning för denna enhet",
"bluetooth-auto-connect-off": "Automatisk anslutning inaktiverad",
"bluetooth-auto-connect-on": "Automatisk anslutning aktiverad",
"bluetooth-devices": "Bluetooth-enheter",
"brightness-at": "Ljusstyrka: {brightness}%",
"click-to-start-recording": "Skärminspelare (starta inspelning)",
+30 -4
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "Görselleştirici için renk seçin.",
"color-name-label": "Dolgu rengi",
"height-description": "Özel bileşen genişliği.",
"hide-when-idle-description": "Etkinleştirildiğinde, çalar aktif bir şekilde çalmadığı sürece görselleştirici gizlidir.",
"hide-when-idle-label": "Boşken gizle",
"width-description": "Özel bileşen genişliği."
@@ -293,6 +294,8 @@
"focused-color-label": "Odaklanılan çalışma alanı rengi",
"follow-focused-screen-description": "Çubuğun bulunduğu ekran yerine, şu anda odaklanmış ekrandaki çalışma alanlarını göster.",
"follow-focused-screen-label": "Odaklanmış ekranı takip et",
"font-weight-description": "Çalışma alanı içindeki metin için görsel ağırlığı ayarlayın.",
"font-weight-label": "Yazı tipi ağırlığı",
"grouped-border-opacity-description": "Çalışma alanı kapsayıcı kenarlıklarının opaklık düzeyini ayarlayın.",
"grouped-border-opacity-label": "Kenarlık opaklığı",
"hide-unoccupied-description": "Penceresi olmayan çalışma alanlarını gösterme.",
@@ -376,6 +379,7 @@
"add": "Ekle",
"appearance": "Görünüm",
"apply": "Uygula",
"auto-connect": "Otomatik bağlan",
"automation": "Otomasyon",
"available": "Mevcut",
"back": "Geri",
@@ -426,6 +430,11 @@
"execute": "Yürüt",
"faithful": "Sadık",
"focus": "Odaklanma",
"font-weight-bold": "Kalın",
"font-weight-light": "İnce",
"font-weight-medium": "Orta",
"font-weight-regular": "Normal",
"font-weight-semibold": "Yarı kalın",
"frequency": "Sıklık",
"gateway": "Geçit",
"general": "Genel",
@@ -470,6 +479,7 @@
"panels": "Paneller",
"password": "Şifre",
"pause": "Duraklat",
"performance": "Performans",
"pin": "Sabitle",
"play": "Oynat",
"polling": "Yoklama",
@@ -709,6 +719,7 @@
"debug-disabled": "Hata ayıklama modu devre dışı bırakıldı",
"debug-enabled": "Hata ayıklama modu etkinleştirildi",
"info-copied": "Bilgi panoya kopyalandı",
"noctalia-available": "Mevcut:",
"noctalia-desc": "Wayland için düşünülmüş, Quickshell ile inşa edilmiş şık ve minimal masaüstü kabuğu.",
"noctalia-git-commit": "Git commit:",
"noctalia-installed-version": "Yüklü sürüm:",
@@ -721,6 +732,7 @@
"supporters-desc": "Harika destekçimize kocaman bir teşekkür!",
"supporters-desc-plural": "<b>{count} harika</b> destekçimize kocaman teşekkürler!",
"supporters-loading": "Destekçiler yükleniyor...",
"system-board": "Anakart:",
"system-cpu": "İşlemci:",
"system-disk": "Disk:",
"system-gpu": "GPU:",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "Oturum seçeneklerinde tuş kombinasyonu ipuçlarını görüntüle.",
"show-keybinds-label": "Klavye kısayollarını göster"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Noctalia performans modu etkinleştirildiğinde masaüstü widget'larını görünür tut.",
"noctalia-performance-disable-desktop-widgets-label": "Performans modunda masaüstü widget'larını etkinleştir",
"noctalia-performance-disable-wallpaper-description": "Noctalia performans modu etkinleştirildiğinde masaüstü, genel bakış ve kilit ekranı duvar kağıtlarını görünür tutun.",
"noctalia-performance-disable-wallpaper-label": "Performans modunda duvar kağıdı oluşturmayı etkinleştir",
"title": "Sistem"
},
"system-monitor": {
"critical-color-label": "Kritik renk",
"custom-highlight-colors-title-label": "Özel vurgulama renkleri",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "Yoklama aralığı",
"polling-section-description": "Her bir sistem metriğinin ne sıklıkta güncelleneceğini yapılandırın.",
"polling-section-label": "Yoklama aralıkları",
"threshold-critical": "Kritik eşik",
"threshold-warning": "Uyarı eşiği",
"threshold-critical": "Kritik",
"threshold-warning": "Uyarı",
"thresholds-section-description": "Her sistem ölçüsü için uyarı/kritik eşiklerini ve yoklama aralıklarını ayarlayın.",
"use-custom-highlight-colors-description": "Devre dışı bırakıldığında, tema varsayılan vurgulama renkleri kullanılır.",
"use-custom-highlight-colors-label": "Özel vurgulama renklerini kullan",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "Animasyon hızı",
"animation-speed-reset": "Animasyon hızını sıfırla",
"appearance-desc": "Araç ipuçları, kenarlıklar ve gölgeler gibi görsel öğeleri özelleştirin.",
"blur-behind-description": "Çubukların ve panellerin arkasındaki alanı kompozitör bulanıklık protokolünü kullanarak bulanıklaştırır.",
"blur-behind-label": "Arka plan bulanıklığı",
"box-border-description": "İçerik alanlarının etrafında bir çerçeve görüntüler.",
"box-border-label": "Konteyner ana hattı",
"box-border-radius-description": "Kenar çubukları, kartlar ve içerik panelleri gibi ana düzen bölümlerinin köşe yuvarlaklığını ayarlar.",
@@ -1847,6 +1868,10 @@
"unavailable": "Panoya geçmişi kullanılamıyor",
"unavailable-desc": "'cliphist' uygulaması kurulu değil. Lütfen panoya geçmişi özelliklerini kullanmak için kurun"
},
"custom-command-failed": {
"description": "Komut başarısız oldu: {command}\\nÇıkış kodu: {code}",
"title": "Özel komut başarısız oldu"
},
"do-not-disturb": {
"disabled": "'Rahatsız etme' devre dışı",
"disabled-desc": "Tüm bildirimler gösteriliyor",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "Araç takımı ekle",
"bluetooth-auto-connect-off": "Otomatik bağlantı kapalı — etkinleştirmek için tıklayın",
"bluetooth-auto-connect-on": "Otomatik bağlantı açık — devre dışı bırakmak için tıklayın",
"auto-connect": "Bu cihaz için otomatik bağlanmayı aç/kapa",
"bluetooth-auto-connect-off": "Otomatik bağlanma kapalı",
"bluetooth-auto-connect-on": "Otomatik bağlanma açık",
"bluetooth-devices": "Bluetooth cihazları",
"brightness-at": "Parlaklık: %{brightness}",
"click-to-start-recording": "Ekran kaydedici (kaydı başlat)",
+30 -4
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "Вибрати колір для візуалізатора.",
"color-name-label": "Колір заповнення",
"height-description": "Користувацька ширина компонента.",
"hide-when-idle-description": "Коли увімкнено, візуалізатор приховано, якщо плеєр активно не відтворює.",
"hide-when-idle-label": "Приховати, коли медіа не відтворюється",
"width-description": "Власна ширина компонента."
@@ -293,6 +294,8 @@
"focused-color-label": "Колір сфокусованого робочого столу",
"follow-focused-screen-description": "Відображати робочі простори з поточного активного екрана, а не з екрана, на якому розташована панель.",
"follow-focused-screen-label": "Слідувати за активним екраном",
"font-weight-description": "Встановити візуальну вагу тексту в робочому просторі.",
"font-weight-label": "Товщина шрифту",
"grouped-border-opacity-description": "Встановити рівень непрозорості для меж контейнерів робочої області.",
"grouped-border-opacity-label": "Прозорість межі",
"hide-unoccupied-description": "Не відображати робочі простори без вікон.",
@@ -376,6 +379,7 @@
"add": "Додати",
"appearance": "Зовнішній вигляд",
"apply": "Подати заявку",
"auto-connect": "Автоматичне підключення",
"automation": "Автоматизація",
"available": "Доступний",
"back": "Назад",
@@ -426,6 +430,11 @@
"execute": "Виконати",
"faithful": "Вірний",
"focus": "Зосередженість",
"font-weight-bold": "Жирний",
"font-weight-light": "Тонкий",
"font-weight-medium": "Середній",
"font-weight-regular": "Звичайний",
"font-weight-semibold": "Напівжирний",
"frequency": "Частота",
"gateway": "Шлюз",
"general": "Загальне",
@@ -470,6 +479,7 @@
"panels": "Панелі",
"password": "Пароль",
"pause": "Пауза",
"performance": "Продуктивність",
"pin": "Закріпити",
"play": "Відтворити",
"polling": "Опитування",
@@ -709,6 +719,7 @@
"debug-disabled": "Режим налагодження вимкнено",
"debug-enabled": "Режим налагодження увімкнено",
"info-copied": "Інформацію скопійовано до буфера обміну",
"noctalia-available": "Доступно:",
"noctalia-desc": "Елегантна та мінімалістична оболонка робочого столу, ретельно створена для Wayland, побудована на Quickshell.",
"noctalia-git-commit": "Git коміт:",
"noctalia-installed-version": "Встановлена версія:",
@@ -721,6 +732,7 @@
"supporters-desc": "Величезне дякую нашому чудовому прихильнику!",
"supporters-desc-plural": "Величезна подяка нашим <b>{count} чудовим</b> прихильникам!",
"supporters-loading": "Завантаження прихильників...",
"system-board": "Материнська плата:",
"system-cpu": "ЦП:",
"system-disk": "Диск:",
"system-gpu": "GPU:",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "Показувати підказки щодо комбінацій клавіш у параметрах сеансу.",
"show-keybinds-label": "Показати комбінації клавіш"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "Залишати віджети робочого столу видимими, поки режим продуктивності Noctalia увімкнено.",
"noctalia-performance-disable-desktop-widgets-label": "Увімкнути віджети робочого столу в режимі продуктивності",
"noctalia-performance-disable-wallpaper-description": "Залишайте шпалери робочого столу, огляду та екрана блокування видимими, коли режим продуктивності Noctalia увімкнено.",
"noctalia-performance-disable-wallpaper-label": "Увімкнути відтворення шпалер у режимі продуктивності",
"title": "Система"
},
"system-monitor": {
"critical-color-label": "Критичний колір",
"custom-highlight-colors-title-label": "Власні кольори підсвічування",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "Інтервал опитування",
"polling-section-description": "Налаштуйте, як часто оновлюється кожна системна метрика.",
"polling-section-label": "Інтервали опитування",
"threshold-critical": "Критичний поріг",
"threshold-warning": "Порогове значення попередження",
"threshold-critical": "Критичний",
"threshold-warning": "Попередження",
"thresholds-section-description": "Налаштуйте пороги попередження/критичні пороги та інтервали опитування для кожного системного показника.",
"use-custom-highlight-colors-description": "Якщо вимкнено, використовуються кольори підсвічування за замовчуванням теми.",
"use-custom-highlight-colors-label": "Використовувати власні кольори підсвічування",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "Швидкість анімації",
"animation-speed-reset": "Скинути швидкість анімації",
"appearance-desc": "Налаштовуйте візуальні елементи, такі як підказки, рамки та тіні.",
"blur-behind-description": "Розмиває область за панелями та спливаючими вікнами, використовуючи протокол розмиття композитора.",
"blur-behind-label": "Розмиття фону",
"box-border-description": "Відображає контур навколо областей вмісту.",
"box-border-label": "Контур контейнера",
"box-border-radius-description": "Налаштовує заокруглення кутів основних розділів макета, таких як бічні панелі, картки та панелі контенту.",
@@ -1847,6 +1868,10 @@
"unavailable": "Історія буфера обміну недоступна",
"unavailable-desc": "Застосунок 'cliphist' не встановлений. Будь ласка, встановіть його для використання функцій історії буфера обміну"
},
"custom-command-failed": {
"description": "Команда не виконана: {command}\\nКод виходу: {code}",
"title": "Користувацька команда не виконана"
},
"do-not-disturb": {
"disabled": "'Не турбувати' вимкнено",
"disabled-desc": "Показ усіх сповіщень",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "Додати віджет",
"bluetooth-auto-connect-off": "Автоматичне підключення вимкнено — натисніть, щоб увімкнути",
"bluetooth-auto-connect-on": "Автопідключення увімкнено — натисніть, щоб вимкнути",
"auto-connect": "Перемкнути автопідключення для цього пристрою",
"bluetooth-auto-connect-off": "Автоматичне підключення вимкнено",
"bluetooth-auto-connect-on": "Автоматичне підключення увімкнено",
"bluetooth-devices": "Пристрої Bluetooth",
"brightness-at": "Яскравість: {brightness}%",
"click-to-start-recording": "Запис екрана (почати запис)",
+30 -4
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "选择可视化工具的颜色。",
"color-name-label": "填充颜色",
"height-description": "自定义组件宽度。",
"hide-when-idle-description": "启用后,除非正在播放媒体,否则隐藏可视化显示。",
"hide-when-idle-label": "无媒体播放时隐藏",
"width-description": "自定义组件的宽度。"
@@ -293,6 +294,8 @@
"focused-color-label": "聚焦工作区颜色",
"follow-focused-screen-description": "显示当前焦点屏幕的工作区,而不是任务栏所在屏幕的工作区。",
"follow-focused-screen-label": "跟随焦点屏幕",
"font-weight-description": "设置工作区内文本的视觉权重。",
"font-weight-label": "字体粗细",
"grouped-border-opacity-description": "设置工作区容器边框的不透明度级别。",
"grouped-border-opacity-label": "边框不透明度",
"hide-unoccupied-description": "不显示没有窗口的工作区。",
@@ -376,6 +379,7 @@
"add": "添加",
"appearance": "外观",
"apply": "应用",
"auto-connect": "自动连接",
"automation": "自动化",
"available": "可用",
"back": "返回",
@@ -426,6 +430,11 @@
"execute": "执行",
"faithful": "忠实",
"focus": "专注",
"font-weight-bold": "粗体",
"font-weight-light": "细",
"font-weight-medium": "中",
"font-weight-regular": "常规",
"font-weight-semibold": "半粗体",
"frequency": "频率",
"gateway": "网关",
"general": "通用",
@@ -470,6 +479,7 @@
"panels": "面板",
"password": "密码",
"pause": "暂停",
"performance": "性能",
"pin": "固定",
"play": "播放",
"polling": "数据轮询",
@@ -709,6 +719,7 @@
"debug-disabled": "调试模式已禁用",
"debug-enabled": "调试模式已启用",
"info-copied": "信息已复制到剪贴板",
"noctalia-available": "可用:",
"noctalia-desc": "一款为 Wayland 精心打造的时尚简约桌面 shell,基于 Quickshell 构建。",
"noctalia-git-commit": "Git 提交:",
"noctalia-installed-version": "已安装版本:",
@@ -721,6 +732,7 @@
"supporters-desc": "非常感谢我们出色的支持者!",
"supporters-desc-plural": "非常感谢我们的<b>{count}位出色</b>支持者!",
"supporters-loading": "正在加载支持者...",
"system-board": "主板:",
"system-cpu": "中央处理器:",
"system-disk": "磁盘:",
"system-gpu": "图形处理器:",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "在会话选项上显示快捷键提示。",
"show-keybinds-label": "显示快捷键"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "在 Noctalia 性能模式启用时保持桌面小部件可见。",
"noctalia-performance-disable-desktop-widgets-label": "在性能模式下启用桌面小部件",
"noctalia-performance-disable-wallpaper-description": "在启用 Noctalia 性能模式时,保持桌面、概览和锁屏壁纸可见。",
"noctalia-performance-disable-wallpaper-label": "在性能模式下启用壁纸渲染",
"title": "系统"
},
"system-monitor": {
"critical-color-label": "严重颜色",
"custom-highlight-colors-title-label": "自定义高亮颜色",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "轮询间隔",
"polling-section-description": "配置每个系统指标的更新频率。",
"polling-section-label": "轮询间隔",
"threshold-critical": "临界阈值",
"threshold-warning": "警告阈值",
"threshold-critical": "严重",
"threshold-warning": "警告",
"thresholds-section-description": "为每个系统指标调整警告/严重阈值和轮询间隔。",
"use-custom-highlight-colors-description": "禁用时将使用主题默认高亮颜色。",
"use-custom-highlight-colors-label": "使用自定义高亮颜色",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "动画速度",
"animation-speed-reset": "重置动画速度",
"appearance-desc": "自定义视觉元素,如提示信息、边框和阴影。",
"blur-behind-description": "使用合成器模糊协议,模糊栏和面板后面的区域。",
"blur-behind-label": "背景模糊",
"box-border-description": "显示内容区域周围的轮廓。",
"box-border-label": "容器轮廓",
"box-border-radius-description": "调整主要布局部分(如侧边栏、卡片和内容面板)的圆角程度。",
@@ -1847,6 +1868,10 @@
"unavailable": "剪贴板历史记录不可用",
"unavailable-desc": "未安装 'cliphist' 应用程序。请安装它以使用剪贴板历史记录功能"
},
"custom-command-failed": {
"description": "命令失败: {command}\\n退出代码: {code}",
"title": "自定义命令失败"
},
"do-not-disturb": {
"disabled": "'勿扰模式'已禁用",
"disabled-desc": "显示所有通知",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "添加小部件",
"bluetooth-auto-connect-off": "自动连接已关闭 — 点击启用",
"bluetooth-auto-connect-on": "自动连接已开启 — 点击禁用",
"auto-connect": "切换此设备的自动连接",
"bluetooth-auto-connect-off": "自动连接已禁用",
"bluetooth-auto-connect-on": "自动连接已启用",
"bluetooth-devices": "蓝牙设备",
"brightness-at": "亮度:{brightness}%",
"click-to-start-recording": "屏幕录制器(开始录制)",
+30 -4
View File
@@ -41,6 +41,7 @@
"audio-visualizer": {
"color-name-description": "選取視覺效果的顏色",
"color-name-label": "填充顏色",
"height-description": "自訂元件寬度。",
"hide-when-idle-description": "當啟用時, 如果沒有正在播放的媒體就隱藏視覺效果",
"hide-when-idle-label": "無任何媒體播放時隱藏",
"width-description": "自訂部件寬度"
@@ -293,6 +294,8 @@
"focused-color-label": "聚焦的工作區顏色",
"follow-focused-screen-description": "顯示正在聚焦的螢幕所擁有的工作區, 而不是工具列所在的螢幕擁有的工作區",
"follow-focused-screen-label": "跟隨焦點所在的螢幕",
"font-weight-description": "設定工作區內文字的視覺權重。",
"font-weight-label": "字體粗細",
"grouped-border-opacity-description": "設定工作區邊框的不透明度",
"grouped-border-opacity-label": "邊框不透明度",
"hide-unoccupied-description": "如果工作區沒有任何視窗則不要顯示",
@@ -376,6 +379,7 @@
"add": "新增",
"appearance": "外觀",
"apply": "套用",
"auto-connect": "自動連線",
"automation": "自動化",
"available": "可用",
"back": "返回",
@@ -426,6 +430,11 @@
"execute": "執行",
"faithful": "忠實",
"focus": "關注",
"font-weight-bold": "粗體",
"font-weight-light": "細",
"font-weight-medium": "中",
"font-weight-regular": "一般",
"font-weight-semibold": "半粗體",
"frequency": "頻率",
"gateway": "網路閘道",
"general": "一般",
@@ -470,6 +479,7 @@
"panels": "面板",
"password": "密碼",
"pause": "暫停",
"performance": "效能",
"pin": "釘選",
"play": "播放",
"polling": "輪詢",
@@ -709,6 +719,7 @@
"debug-disabled": "偵錯模式已停用",
"debug-enabled": "偵錯模式已啟用",
"info-copied": "資訊已複製至剪貼簿",
"noctalia-available": "可用:",
"noctalia-desc": "一個為 Wayland 精心打造, 兼具簡潔及流暢的桌面介面, 使用 Quickshell 建置",
"noctalia-git-commit": "Git commit:",
"noctalia-installed-version": "安裝版本:",
@@ -721,6 +732,7 @@
"supporters-desc": "非常感謝我們出色的支持者!",
"supporters-desc-plural": "非常感謝我們的<b>{count}位出色</b>支持者!",
"supporters-loading": "正在載入支持者...",
"system-board": "主機板:",
"system-cpu": "CPU:",
"system-disk": "磁碟:",
"system-gpu": "GPU:",
@@ -1599,6 +1611,13 @@
"show-keybinds-description": "在工作階段選項上顯示快捷鍵提示。",
"show-keybinds-label": "顯示快捷鍵"
},
"system": {
"noctalia-performance-disable-desktop-widgets-description": "當 Noctalia 效能模式啟用時保持桌面小工具可見。",
"noctalia-performance-disable-desktop-widgets-label": "在效能模式下啟用桌面小工具",
"noctalia-performance-disable-wallpaper-description": "在啟用 Noctalia 效能模式時,保持桌面、概覽和鎖定畫面桌布可見。",
"noctalia-performance-disable-wallpaper-label": "在效能模式下啟用桌布渲染",
"title": "系統"
},
"system-monitor": {
"critical-color-label": "危急顏色",
"custom-highlight-colors-title-label": "自訂突出色",
@@ -1615,8 +1634,8 @@
"polling-interval-label": "輪詢間隔",
"polling-section-description": "設定該多久更新一次系統計量值",
"polling-section-label": "輪詢間隔",
"threshold-critical": "危急門檻",
"threshold-warning": "警告門檻",
"threshold-critical": "嚴重",
"threshold-warning": "警告",
"thresholds-section-description": "調整每個系統量測值的警告/危急門檻",
"use-custom-highlight-colors-description": "當停用時, 將會使用主題預設的突出色",
"use-custom-highlight-colors-label": "使用自訂的突出色",
@@ -1631,6 +1650,8 @@
"animation-speed-label": "動畫速度",
"animation-speed-reset": "重設動畫速度",
"appearance-desc": "自訂視覺元素, 如提示框, 邊框及陰影",
"blur-behind-description": "使用合成器模糊協定,模糊欄位和面板後方的區域。",
"blur-behind-label": "背景模糊",
"box-border-description": "在內容區塊的外圍顯示外框",
"box-border-label": "頁面容器外框",
"box-border-radius-description": "調整主要版面區塊(例如側邊欄、卡片與內容面板)的圓角弧度。",
@@ -1847,6 +1868,10 @@
"unavailable": "無法使用剪貼簿歷史",
"unavailable-desc": "尚未安裝 cliphist 套件, 要使用剪貼簿歷史請安裝套件"
},
"custom-command-failed": {
"description": "指令失敗: {command}\\n結束代碼: {code}",
"title": "自訂指令失敗"
},
"do-not-disturb": {
"disabled": "勿擾模式已停用",
"disabled-desc": "顯示所有通知",
@@ -1901,8 +1926,9 @@
},
"tooltips": {
"add-widget": "新增小工具",
"bluetooth-auto-connect-off": "自動連線已關閉 — 點擊以啟用",
"bluetooth-auto-connect-on": "自動連線已開啟 — 點擊以停用",
"auto-connect": "切換此裝置的自動連線",
"bluetooth-auto-connect-off": "自動連線已停用",
"bluetooth-auto-connect-on": "自動連線已啟用",
"bluetooth-devices": "藍牙裝置",
"brightness-at": "亮度: {brightness}%",
"click-to-start-recording": "螢幕錄影 (開始錄製)",
+10 -4
View File
@@ -71,14 +71,14 @@
]
},
"mouseWheelAction": "none",
"reverseScroll": false,
"mouseWheelWrap": true,
"middleClickAction": "none",
"middleClickFollowMouse": false,
"middleClickCommand": "",
"rightClickAction": "controlCenter",
"rightClickFollowMouse": true,
"rightClickCommand": "",
"reverseScroll": false,
"mouseWheelWrap": true,
"screenOverrides": []
},
"general": {
@@ -100,6 +100,7 @@
"showHibernateOnLockScreen": false,
"enableLockScreenMediaControls": false,
"enableShadows": true,
"enableBlurBehind": true,
"shadowDirection": "bottom_right",
"shadowOffsetX": 2,
"shadowOffsetY": 3,
@@ -332,6 +333,10 @@
"criticalColor": "",
"externalMonitor": "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor"
},
"noctaliaPerformance": {
"disableWallpaper": true,
"disableDesktopWidgets": true
},
"dock": {
"enabled": true,
"position": "bottom",
@@ -370,7 +375,8 @@
"wifiDetailsViewMode": "grid",
"bluetoothDetailsViewMode": "grid",
"bluetoothHideUnnamedDevices": false,
"disableDiscoverability": false
"disableDiscoverability": false,
"bluetoothAutoConnect": true
},
"sessionMenu": {
"enableCountdown": true,
@@ -465,7 +471,7 @@
"audio": {
"volumeStep": 5,
"volumeOverdrive": false,
"cavaFrameRate": 30,
"spectrumFrameRate": 30,
"visualizerType": "linear",
"mprisBlacklist": [],
"preferredPlayer": "",
+33 -6
View File
@@ -1904,27 +1904,45 @@
"descriptionKey": "panels.system-monitor.enable-dgpu-monitoring-description",
"widget": "NToggle",
"tab": 18,
"tabLabel": "system-monitor.title",
"tabLabel": "panels.system.title",
"subTab": 0,
"subTabLabel": "common.general"
"subTabLabel": "system-monitor.title"
},
{
"labelKey": "panels.system-monitor.use-custom-highlight-colors-label",
"descriptionKey": "panels.system-monitor.use-custom-highlight-colors-description",
"widget": "NToggle",
"tab": 18,
"tabLabel": "system-monitor.title",
"tabLabel": "panels.system.title",
"subTab": 0,
"subTabLabel": "common.general"
"subTabLabel": "system-monitor.title"
},
{
"labelKey": "panels.system-monitor.external-monitor-label",
"descriptionKey": "panels.system-monitor.external-monitor-description",
"widget": "NTextInput",
"tab": 18,
"tabLabel": "system-monitor.title",
"tabLabel": "panels.system.title",
"subTab": 0,
"subTabLabel": "common.general"
"subTabLabel": "system-monitor.title"
},
{
"labelKey": "panels.system.noctalia-performance-disable-wallpaper-label",
"descriptionKey": "panels.system.noctalia-performance-disable-wallpaper-description",
"widget": "NToggle",
"tab": 18,
"tabLabel": "panels.system.title",
"subTab": 2,
"subTabLabel": "common.performance"
},
{
"labelKey": "panels.system.noctalia-performance-disable-desktop-widgets-label",
"descriptionKey": "panels.system.noctalia-performance-disable-desktop-widgets-description",
"widget": "NToggle",
"tab": 18,
"tabLabel": "panels.system.title",
"subTab": 2,
"subTabLabel": "common.performance"
},
{
"labelKey": "panels.user-interface.tooltips-label",
@@ -1953,6 +1971,15 @@
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.user-interface.blur-behind-label",
"descriptionKey": "panels.user-interface.blur-behind-description",
"widget": "NToggle",
"tab": 1,
"tabLabel": "panels.user-interface.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.user-interface.shadows-direction-label",
"descriptionKey": "panels.user-interface.shadows-direction-description",
+11 -1
View File
@@ -225,7 +225,8 @@
"occupiedColor": "secondary",
"emptyColor": "secondary",
"showBadge": true,
"pillSize": 0.6
"pillSize": 0.6,
"fontWeight": "bold"
},
"Volume": {
"displayMode": "onhover",
@@ -278,6 +279,15 @@
"statType": "CPU",
"diskPath": "/",
"layout": "bottom"
},
"AudioVisualizer": {
"showBackground": true,
"roundedCorners": true,
"width": 320,
"height": 72,
"visualizerType": "linear",
"hideWhenIdle": false,
"colorName": "primary"
}
}
}
+20
View File
@@ -0,0 +1,20 @@
import QtQuick
import Quickshell
QtObject {
id: root
function migrate(adapter, logger, rawJson) {
logger.i("Settings", "Migrating settings to v56 (Color Scheme Migration)");
const scriptPath = Quickshell.shellDir + "/Scripts/python/src/theming/migrate-colorschemes.py";
const configDir = Quickshell.env("NOCTALIA_CONFIG_DIR") || (Quickshell.env("XDG_CONFIG_HOME") || Quickshell.env("HOME") + "/.config") + "/noctalia";
logger.i("Settings", `Running color scheme migration script: ${scriptPath} with configDir: ${configDir}`);
// Run the migration script detached
Quickshell.execDetached(["python3", scriptPath, configDir]);
return true;
}
}
+16
View File
@@ -0,0 +1,16 @@
import QtQuick
QtObject {
id: root
function migrate(adapter, logger, rawJson) {
logger.i("Settings", "Migrating settings to v57 (cavaFrameRate -> spectrumFrameRate)");
if (rawJson && rawJson.audio && rawJson.audio.cavaFrameRate !== undefined) {
adapter.audio.spectrumFrameRate = rawJson.audio.cavaFrameRate;
logger.i("Settings", "Migrated cavaFrameRate:", rawJson.audio.cavaFrameRate, "-> spectrumFrameRate");
}
return true;
}
}
+5 -1
View File
@@ -27,7 +27,9 @@ QtObject {
50: migration50Component,
53: migration53Component,
54: migration54Component,
55: migration55Component
55: migration55Component,
56: migration56Component,
57: migration57Component
})
// Migration components
@@ -52,4 +54,6 @@ QtObject {
property Component migration53Component: Migration53 {}
property Component migration54Component: Migration54 {}
property Component migration55Component: Migration55 {}
property Component migration56Component: Migration56 {}
property Component migration57Component: Migration57 {}
}
+9 -2
View File
@@ -25,7 +25,7 @@ Singleton {
- Default cache directory: ~/.cache/noctalia
*/
readonly property alias data: adapter // Used to access via Settings.data.xxx.yyy
readonly property int settingsVersion: 55
readonly property int settingsVersion: 57
property bool isDebug: Quickshell.env("NOCTALIA_DEBUG") === "1"
readonly property string shellName: "noctalia"
readonly property string configDir: Quickshell.env("NOCTALIA_CONFIG_DIR") || (Quickshell.env("XDG_CONFIG_HOME") || Quickshell.env("HOME") + "/.config") + "/" + shellName + "/"
@@ -291,6 +291,7 @@ Singleton {
property bool showHibernateOnLockScreen: false
property bool enableLockScreenMediaControls: false
property bool enableShadows: true
property bool enableBlurBehind: true
property string shadowDirection: "bottom_right"
property int shadowOffsetX: 2
property int shadowOffsetY: 3
@@ -530,6 +531,12 @@ Singleton {
property string externalMonitor: "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor"
}
// performance
property JsonObject noctaliaPerformance: JsonObject {
property bool disableWallpaper: true
property bool disableDesktopWidgets: true
}
// dock
property JsonObject dock: JsonObject {
property bool enabled: true
@@ -671,7 +678,7 @@ Singleton {
property JsonObject audio: JsonObject {
property int volumeStep: 5
property bool volumeOverdrive: false
property int cavaFrameRate: 30
property int spectrumFrameRate: 30
property string visualizerType: "linear"
property list<string> mprisBlacklist: []
property string preferredPlayer: ""
+1 -1
View File
@@ -14,7 +14,7 @@ Variants {
required property ShellScreen modelData
active: modelData && Settings.data.wallpaper.enabled && !PowerProfileService.noctaliaPerformanceMode
active: modelData && Settings.data.wallpaper.enabled && (!PowerProfileService.noctaliaPerformanceMode || !Settings.data.noctaliaPerformance.disableWallpaper)
sourceComponent: PanelWindow {
id: root
+1 -1
View File
@@ -8,7 +8,7 @@ import qs.Services.Power
import qs.Services.UI
Loader {
active: CompositorService.isNiri && Settings.data.wallpaper.enabled && Settings.data.wallpaper.overviewEnabled && !PowerProfileService.noctaliaPerformanceMode
active: CompositorService.isNiri && Settings.data.wallpaper.enabled && Settings.data.wallpaper.overviewEnabled && (!PowerProfileService.noctaliaPerformanceMode || !Settings.data.noctaliaPerformance.disableWallpaper)
sourceComponent: Variants {
model: Quickshell.screens
+2 -1
View File
@@ -14,6 +14,7 @@ Item {
required property real capsuleHeight
required property real barHeight
required property string labelMode
required property int fontWeight
required property int characterCount
required property real textRatio
required property bool showLabelsOnlyWhenOccupied
@@ -119,7 +120,7 @@ Item {
pointSize: (isVertical ? pillContainer.pillWidth : pillContainer.pillHeight) * textRatio
applyUiScale: false
font.capitalization: Font.AllUppercase
font.weight: Style.fontWeightBold
font.weight: fontWeight
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.Wrap
+8 -8
View File
@@ -45,20 +45,20 @@ Item {
readonly property bool shouldShow: (currentVisualizerType !== "" && currentVisualizerType !== "none") && (!hideWhenIdle || MediaService.isPlaying)
// Register/unregister with CavaService based on visibility
readonly property string cavaComponentId: "bar:audiovisualizer:" + root.screen.name + ":" + root.section + ":" + root.sectionWidgetIndex
// Register/unregister with SpectrumService based on visibility
readonly property string spectrumComponentId: "bar:audiovisualizer:" + root.screen.name + ":" + root.section + ":" + root.sectionWidgetIndex
onShouldShowChanged: {
if (root.shouldShow) {
CavaService.registerComponent(root.cavaComponentId);
SpectrumService.registerComponent(root.spectrumComponentId);
} else {
CavaService.unregisterComponent(root.cavaComponentId);
SpectrumService.unregisterComponent(root.spectrumComponentId);
}
}
Component.onDestruction: {
if (root.shouldShow) {
CavaService.unregisterComponent(root.cavaComponentId);
SpectrumService.unregisterComponent(root.spectrumComponentId);
}
}
@@ -177,7 +177,7 @@ Item {
id: linearComponent
NLinearSpectrum {
anchors.fill: parent
values: CavaService.values
values: SpectrumService.values
fillColor: root.fillColor
showMinimumSignal: true
vertical: root.isVerticalBar
@@ -189,7 +189,7 @@ Item {
id: mirroredComponent
NMirroredSpectrum {
anchors.fill: parent
values: CavaService.values
values: SpectrumService.values
fillColor: root.fillColor
showMinimumSignal: true
vertical: root.isVerticalBar
@@ -200,7 +200,7 @@ Item {
id: waveComponent
NWaveSpectrum {
anchors.fill: parent
values: CavaService.values
values: SpectrumService.values
fillColor: root.fillColor
showMinimumSignal: true
vertical: root.isVerticalBar
+1 -1
View File
@@ -80,7 +80,7 @@ Item {
}
let rateText = BatteryService.getRateText(selectedDevice);
if (rateText) {
if (!isPluggedIn && rateText) {
const colonIdx = rateText.indexOf(":");
if (colonIdx >= 0) {
rows.push([rateText.substring(0, colonIdx).trim(), rateText.substring(colonIdx + 1).trim()]);
+10 -17
View File
@@ -46,11 +46,16 @@ Item {
implicitWidth: pill.width
implicitHeight: pill.height
// Track the brightness monitor reactively; explicitly update on screen/monitors changes
property var brightnessMonitor: null
function updateMonitor() {
brightnessMonitor = BrightnessService.getMonitorForScreen(screen) || null;
// Track the brightness monitor reactively via declarative binding so it
// updates atomically when monitors change, avoiding a transient undefined
// state that occurs when Monitor QtObjects are destroyed before the
// imperative updateMonitor() call would run.
property var brightnessMonitor: {
var _ = BrightnessService.monitors; // reactive dependency
var __ = BrightnessService.ddcMonitors; // reactive dependency
if (!screen)
return null;
return BrightnessService.getMonitorForScreen(screen) ?? null;
}
function getControllableMonitorCount() {
@@ -63,18 +68,6 @@ Item {
return count;
}
onScreenChanged: updateMonitor()
Connections {
target: BrightnessService
function onMonitorsChanged() {
root.updateMonitor();
}
function onDdcMonitorsChanged() {
root.updateMonitor();
}
}
visible: brightnessMonitor !== null
opacity: brightnessMonitor !== null ? 1.0 : 0.0
+17 -13
View File
@@ -73,27 +73,31 @@ Item {
return showArtistFirst ? (artist ? `${artist} - ${track}` : track) : (artist ? `${track} - ${artist}` : track);
}
// CavaService registration for visualizer
readonly property string cavaComponentId: "bar:mediamini:" + root.screen?.name + ":" + root.section + ":" + root.sectionWidgetIndex
readonly property bool needsCava: root.showVisualizer && root.visualizerType !== "" && root.visualizerType !== "none"
// SpectrumService registration for visualizer
readonly property string spectrumComponentId: "bar:mediamini:" + root.screen?.name + ":" + root.section + ":" + root.sectionWidgetIndex
readonly property bool needsSpectrum: root.showVisualizer && root.visualizerType !== "" && root.visualizerType !== "none" && !root.isHidden
Layout.preferredHeight: isVertical ? -1 : Style.getBarHeightForScreen(screenName)
Layout.preferredWidth: isVertical ? Style.getBarHeightForScreen(screenName) : -1
Layout.fillHeight: false
Layout.fillWidth: false
onNeedsCavaChanged: {
if (root.needsCava) {
CavaService.registerComponent(root.cavaComponentId);
onNeedsSpectrumChanged: {
if (root.needsSpectrum) {
SpectrumService.registerComponent(root.spectrumComponentId);
} else {
CavaService.unregisterComponent(root.cavaComponentId);
SpectrumService.unregisterComponent(root.spectrumComponentId);
}
}
Component.onCompleted: {
if (root.needsSpectrum) {
SpectrumService.registerComponent(root.spectrumComponentId);
}
}
Component.onDestruction: {
if (root.needsCava) {
CavaService.unregisterComponent(root.cavaComponentId);
}
SpectrumService.unregisterComponent(root.spectrumComponentId);
}
// Layout
@@ -416,7 +420,7 @@ Item {
NLinearSpectrum {
width: parent.width - Style.marginS
height: 20
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.4
barPosition: root.barPosition
@@ -428,7 +432,7 @@ Item {
NMirroredSpectrum {
width: parent.width - Style.marginS
height: parent.height - Style.marginS
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.4
}
@@ -439,7 +443,7 @@ Item {
NWaveSpectrum {
width: parent.width - Style.marginS
height: parent.height - Style.marginS
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.4
}
+1 -1
View File
@@ -175,7 +175,7 @@ Item {
PanelService.closeContextMenu(screen);
if (action === "sysmon-settings") {
SettingsPanelService.openToTab(SettingsPanel.Tab.SystemMonitor, 0, screen);
SettingsPanelService.openToTab(SettingsPanel.Tab.System, 0, screen);
} else if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
}
+18 -3
View File
@@ -44,6 +44,19 @@ Item {
readonly property string labelMode: (widgetSettings.labelMode !== undefined) ? widgetSettings.labelMode : widgetMetadata.labelMode
readonly property bool hasLabel: (labelMode !== "none")
readonly property string fontWeight: {
var fontWeightSetting = (widgetSettings.fontWeight !== undefined) ? widgetSettings.fontWeight : widgetMetadata.fontWeight;
if (fontWeightSetting === "regular")
return Style.fontWeightRegular;
if (fontWeightSetting === "medium")
return Style.fontWeightMedium;
if (fontWeightSetting === "semibold")
return Style.fontWeightSemiBold;
if (fontWeightSetting === "bold")
return Style.fontWeightBold;
return Style.fontWeightBold;
}
readonly property bool hideUnoccupied: (widgetSettings.hideUnoccupied !== undefined) ? widgetSettings.hideUnoccupied : widgetMetadata.hideUnoccupied
readonly property bool followFocusedScreen: (widgetSettings.followFocusedScreen !== undefined) ? widgetSettings.followFocusedScreen : widgetMetadata.followFocusedScreen
readonly property int characterCount: isVertical ? 2 : ((widgetSettings.characterCount !== undefined) ? widgetSettings.characterCount : widgetMetadata.characterCount)
@@ -555,6 +568,7 @@ Item {
capsuleHeight: root.capsuleHeight
barHeight: root.barHeight
labelMode: root.labelMode
fontWeight: root.fontWeight
characterCount: root.characterCount
textRatio: root.textRatio
showLabelsOnlyWhenOccupied: root.showLabelsOnlyWhenOccupied
@@ -589,6 +603,7 @@ Item {
capsuleHeight: root.capsuleHeight
barHeight: root.barHeight
labelMode: root.labelMode
fontWeight: root.fontWeight
characterCount: root.characterCount
textRatio: root.textRatio
showLabelsOnlyWhenOccupied: root.showLabelsOnlyWhenOccupied
@@ -661,8 +676,8 @@ Item {
MouseArea {
anchors.fill: parent
hoverEnabled: true
enabled: !groupedContainer.hasWindows
cursorShape: enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
enabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
preventStealing: true
onPressed: mouse => {
@@ -853,7 +868,7 @@ Item {
family: Settings.data.ui.fontFixed
font {
pointSize: barFontSize * 0.75
weight: Style.fontWeightBold
weight: fontWeight
capitalization: Font.AllUppercase
}
applyUiScale: false
+13 -13
View File
@@ -15,26 +15,26 @@ NBox {
// Track whether we have an active media player
readonly property bool hasActivePlayer: MediaService.currentPlayer && MediaService.canPlay
// CavaService registration for visualizer
readonly property bool needsCava: Settings.data.audio.visualizerType !== "" && Settings.data.audio.visualizerType !== "none"
// SpectrumService registration for visualizer
readonly property bool needsSpectrum: Settings.data.audio.visualizerType !== "" && Settings.data.audio.visualizerType !== "none"
onNeedsCavaChanged: {
if (root.needsCava) {
CavaService.registerComponent("mediacard");
onNeedsSpectrumChanged: {
if (root.needsSpectrum) {
SpectrumService.registerComponent("mediacard");
} else {
CavaService.unregisterComponent("mediacard");
SpectrumService.unregisterComponent("mediacard");
}
}
Component.onCompleted: {
if (root.needsCava) {
CavaService.registerComponent("mediacard");
if (root.needsSpectrum) {
SpectrumService.registerComponent("mediacard");
}
updateCachedWallpaper();
}
Component.onDestruction: {
CavaService.unregisterComponent("mediacard");
SpectrumService.unregisterComponent("mediacard");
}
property string wallpaper: WallpaperService.getWallpaper(screen.name)
@@ -157,7 +157,7 @@ NBox {
id: linearComponent
NLinearSpectrum {
anchors.fill: parent
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.8
}
@@ -167,7 +167,7 @@ NBox {
id: mirroredComponent
NMirroredSpectrum {
anchors.fill: parent
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.8
}
@@ -177,7 +177,7 @@ NBox {
id: waveComponent
NWaveSpectrum {
anchors.fill: parent
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.8
}
@@ -268,7 +268,7 @@ NBox {
// No media player detected - centered disc icon
NIcon {
anchors.centerIn: parent
visible: !root.hasActivePlayer && CavaService.isIdle
visible: !root.hasActivePlayer && SpectrumService.isIdle
icon: "disc"
pointSize: Style.fontSizeXXXL * 3
color: Color.mOnSurfaceVariant
+1 -1
View File
@@ -51,7 +51,7 @@ Variants {
// Only create PanelWindow if enabled AND (screen has widgets OR in edit mode)
// During compositor overview, show widgets only when overviewEnabled is true.
active: modelData && Settings.data.desktopWidgets.enabled && (screenWidgets.length > 0 || DesktopWidgetRegistry.editMode) && (!CompositorService.overviewActive || Settings.data.desktopWidgets.overviewEnabled) && !PowerProfileService.noctaliaPerformanceMode && !PanelService.lockScreen?.active
active: modelData && Settings.data.desktopWidgets.enabled && (screenWidgets.length > 0 || DesktopWidgetRegistry.editMode) && (!CompositorService.overviewActive || Settings.data.desktopWidgets.overviewEnabled) && (!PowerProfileService.noctaliaPerformanceMode || !Settings.data.noctaliaPerformance.disableDesktopWidgets) && !PanelService.lockScreen?.active
sourceComponent: PanelWindow {
id: window
@@ -302,7 +302,7 @@ Item {
if (DesktopWidgetRegistry.isPluginWidget(widgetId)) {
var pluginId = widgetId.replace("plugin:", "");
var manifest = PluginRegistry.getPluginManifest(pluginId);
hasSettings = manifest && manifest.entryPoints && manifest.entryPoints.settings;
hasSettings = manifest && manifest.entryPoints && (manifest.entryPoints.settings || manifest.entryPoints.desktopWidgetSettings);
} else {
hasSettings = DesktopWidgetRegistry.widgetSettingsMap[widgetId] !== undefined;
}
@@ -0,0 +1,116 @@
import QtQuick
import QtQuick.Effects
import Quickshell
import qs.Commons
import qs.Modules.DesktopWidgets
import qs.Services.Media
import qs.Services.UI
import qs.Widgets
import qs.Widgets.AudioSpectrum
DraggableDesktopWidget {
id: root
defaultY: 280
readonly property var widgetMetadata: DesktopWidgetRegistry.widgetMetadata["AudioVisualizer"]
readonly property int visualizerWidth: (widgetData && widgetData.width !== undefined) ? widgetData.width : (widgetMetadata?.width ?? 320)
readonly property int visualizerHeight: (widgetData && widgetData.height !== undefined) ? widgetData.height : (widgetMetadata?.height ?? 72)
readonly property string visualizerType: (widgetData && widgetData.visualizerType !== undefined) ? widgetData.visualizerType : (widgetMetadata?.visualizerType ?? "linear")
readonly property bool hideWhenIdle: (widgetData && widgetData.hideWhenIdle !== undefined) ? widgetData.hideWhenIdle : (widgetMetadata?.hideWhenIdle ?? false)
readonly property string colorName: (widgetData && widgetData.colorName !== undefined) ? widgetData.colorName : (widgetMetadata?.colorName ?? "primary")
readonly property color fillColor: Color.resolveColorKey(colorName)
readonly property bool shouldShow: visualizerType !== "" && visualizerType !== "none" && (!hideWhenIdle || MediaService.isPlaying)
readonly property bool isHidden: !shouldShow
readonly property bool shouldRegisterSpectrum: shouldShow
// Keep widget visible in edit mode so users can move/configure it
visible: !root.isHidden || DesktopWidgetRegistry.editMode
readonly property string spectrumComponentId: "desktop:audiovisualizer:" + (root.screen ? root.screen.name : "unknown") + ":" + root.widgetIndex
onShouldRegisterSpectrumChanged: {
if (root.shouldRegisterSpectrum) {
SpectrumService.registerComponent(root.spectrumComponentId);
} else {
SpectrumService.unregisterComponent(root.spectrumComponentId);
}
}
Component.onCompleted: {
if (root.shouldRegisterSpectrum) {
SpectrumService.registerComponent(root.spectrumComponentId);
}
}
Component.onDestruction: {
SpectrumService.unregisterComponent(root.spectrumComponentId);
}
implicitWidth: Math.round(visualizerWidth * widgetScale)
implicitHeight: Math.round(visualizerHeight * widgetScale)
width: implicitWidth
height: implicitHeight
Rectangle {
id: visualizerMask
anchors.fill: parent
color: "transparent"
radius: root.roundedCorners ? Math.min(Math.round(Style.radiusL * root.widgetScale), Style.radiusL, width / 2, height / 2) : 0
clip: true
Loader {
id: visualizerLoader
anchors.fill: parent
anchors.margins: root.showBackground ? Math.round(Style.marginXS * root.widgetScale) : 0
active: root.shouldShow
asynchronous: true
sourceComponent: {
switch (root.visualizerType) {
case "linear":
return linearComponent;
case "mirrored":
return mirroredComponent;
case "wave":
return waveComponent;
default:
return null;
}
}
}
}
Component {
id: linearComponent
NLinearSpectrum {
anchors.fill: parent
values: SpectrumService.values
fillColor: root.fillColor
showMinimumSignal: true
}
}
Component {
id: mirroredComponent
NMirroredSpectrum {
anchors.fill: parent
values: SpectrumService.values
fillColor: root.fillColor
showMinimumSignal: true
}
}
Component {
id: waveComponent
NWaveSpectrum {
anchors.fill: parent
values: SpectrumService.values
fillColor: root.fillColor
showMinimumSignal: true
}
}
}
@@ -32,25 +32,26 @@ DraggableDesktopWidget {
readonly property bool isHidden: (shouldHideIdle || shouldHideEmpty) && !DesktopWidgetRegistry.editMode
visible: !isHidden
// CavaService registration for visualizer
readonly property string cavaComponentId: "desktopmediaplayer:" + (root.screen ? root.screen.name : "unknown")
// SpectrumService registration for visualizer
readonly property string spectrumComponentId: "desktopmediaplayer:" + (root.screen ? root.screen.name : "unknown")
readonly property bool needsSpectrum: root.shouldShowVisualizer && !root.isHidden
onShouldShowVisualizerChanged: {
if (root.shouldShowVisualizer) {
CavaService.registerComponent(root.cavaComponentId);
onNeedsSpectrumChanged: {
if (root.needsSpectrum) {
SpectrumService.registerComponent(root.spectrumComponentId);
} else {
CavaService.unregisterComponent(root.cavaComponentId);
SpectrumService.unregisterComponent(root.spectrumComponentId);
}
}
Component.onCompleted: {
if (root.shouldShowVisualizer) {
CavaService.registerComponent(root.cavaComponentId);
if (root.needsSpectrum) {
SpectrumService.registerComponent(root.spectrumComponentId);
}
}
Component.onDestruction: {
CavaService.unregisterComponent(root.cavaComponentId);
SpectrumService.unregisterComponent(root.spectrumComponentId);
}
readonly property bool showPrev: hasPlayer && MediaService.canGoPrevious
@@ -81,7 +82,7 @@ DraggableDesktopWidget {
anchors.bottomMargin: 0
z: 0
clip: true
active: shouldShowVisualizer
active: needsSpectrum
layer.enabled: true
layer.smooth: true
layer.effect: MultiEffect {
@@ -113,7 +114,7 @@ DraggableDesktopWidget {
id: linearComponent
NLinearSpectrum {
anchors.fill: parent
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.5
}
@@ -123,7 +124,7 @@ DraggableDesktopWidget {
id: mirroredComponent
NMirroredSpectrum {
anchors.fill: parent
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.5
}
@@ -133,7 +134,7 @@ DraggableDesktopWidget {
id: waveComponent
NWaveSpectrum {
anchors.fill: parent
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.5
}
@@ -198,7 +198,9 @@ DraggableDesktopWidget {
color2: root.color2
fill: true
updateInterval: root.graphUpdateInterval
strokeWidth: 1.5 * Style.uiScaleRatio * root.widgetScale
animateScale: root.statType === "Network"
antialiasing: 0.5 * root.widgetScale
}
}
+13 -11
View File
@@ -17,13 +17,13 @@ Loader {
active: false
// Track if the visualizer should be shown (lockscreen active + media playing + non-compact mode)
readonly property bool needsCava: root.active && !Settings.data.general.compactLockScreen && Settings.data.audio.visualizerType !== "" && Settings.data.audio.visualizerType !== "none"
readonly property bool needsSpectrum: root.active && !Settings.data.general.compactLockScreen && Settings.data.audio.visualizerType !== "" && Settings.data.audio.visualizerType !== "none"
onActiveChanged: {
if (root.active && root.needsCava) {
CavaService.registerComponent("lockscreen");
if (root.active && root.needsSpectrum) {
SpectrumService.registerComponent("lockscreen");
} else {
CavaService.unregisterComponent("lockscreen");
SpectrumService.unregisterComponent("lockscreen");
}
if (root.active) {
@@ -33,11 +33,11 @@ Loader {
}
}
onNeedsCavaChanged: {
if (root.needsCava) {
CavaService.registerComponent("lockscreen");
onNeedsSpectrumChanged: {
if (root.needsSpectrum) {
SpectrumService.registerComponent("lockscreen");
} else {
CavaService.unregisterComponent("lockscreen");
SpectrumService.unregisterComponent("lockscreen");
}
}
@@ -47,7 +47,7 @@ Loader {
}
Component.onDestruction: {
CavaService.unregisterComponent("lockscreen");
SpectrumService.unregisterComponent("lockscreen");
LockKeysService.unregisterComponent("lockscreen");
}
@@ -125,8 +125,10 @@ Loader {
anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.NoButton
onPositionChanged: {
if (passwordInput) {
onEntered: {
// Avoid repeatedly forcing focus on every mouse move.
// This can churn text-input surface state during monitor/suspend transitions.
if (passwordInput && !passwordInput.activeFocus) {
passwordInput.forceActiveFocus();
}
}
+1 -1
View File
@@ -111,7 +111,7 @@ Item {
Image {
id: lockBgImage
visible: source !== "" && Settings.data.wallpaper.enabled && !Settings.data.wallpaper.useSolidColor && !PowerProfileService.noctaliaPerformanceMode
visible: source !== "" && Settings.data.wallpaper.enabled && !Settings.data.wallpaper.useSolidColor && (!PowerProfileService.noctaliaPerformanceMode || !Settings.data.noctaliaPerformance.disableWallpaper)
anchors.fill: parent
fillMode: Image.PreserveAspectCrop
source: resolvedWallpaperPath
+3 -3
View File
@@ -268,7 +268,7 @@ Item {
z: 0
sourceComponent: NLinearSpectrum {
anchors.fill: parent
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.4
}
@@ -281,7 +281,7 @@ Item {
z: 0
sourceComponent: NMirroredSpectrum {
anchors.fill: parent
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.4
}
@@ -294,7 +294,7 @@ Item {
z: 0
sourceComponent: NWaveSpectrum {
anchors.fill: parent
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.4
}
@@ -103,6 +103,10 @@ ShapePath {
readonly property real blMultY: bar ? ShapeCornerHelper.getMultY(bar.bottomLeftCornerState) : 1
readonly property real blRadius: bar ? getCornerRadius(bar.bottomLeftCornerState) : 0
// True when the bar path has valid, non-degenerate geometry to render.
// Mirrors PanelBackground.isRenderable prevents CurveRenderer crash on zero-area paths.
readonly property bool isRenderable: bar !== null && shouldShow && (isFramed ? (screenWidth > 0 && screenHeight > 0) : (barWidth > 0 && barHeight > 0))
// Extend bar background beyond screen edges where both adjacent corners are flat,
// to prevent CurveRenderer antialiasing artifacts on screen-flush edges
readonly property real screenEdgeOvershoot: 2
@@ -124,160 +128,147 @@ ShapePath {
// ShapePath configuration
strokeWidth: -1 // No stroke, fill only
fillColor: Qt.rgba(backgroundColor.r, backgroundColor.g, backgroundColor.b, backgroundColor.a * opacityFactor)
fillColor: isRenderable ? Qt.rgba(backgroundColor.r, backgroundColor.g, backgroundColor.b, backgroundColor.a * opacityFactor) : "transparent"
fillRule: isFramed ? ShapePath.OddEvenFill : ShapePath.WindingFill
// Starting position
// In framed mode, we start at (0,0) to draw the screen rectangle first
startX: isFramed ? 0 : (barMappedPos.x + leftEdgeOvs + tlRadius * tlMultX)
startY: isFramed ? 0 : (barMappedPos.y + topEdgeOvs)
// Starting position falls back to off-screen (-1,-1) when not renderable so that
// all subsequent path elements form a valid non-degenerate 1×1 off-screen square,
// preventing CurveRenderer triangulation crashes on zero-area or bare-moveto paths.
startX: isRenderable ? (isFramed ? 0 : (barMappedPos.x + leftEdgeOvs + tlRadius * tlMultX)) : -1
startY: isRenderable ? (isFramed ? 0 : (barMappedPos.y + topEdgeOvs)) : -1
// ========== PATH DEFINITION ==========
// 1. Main Bar / Outer Screen Rectangle
// When !isRenderable all elements use fallback coordinates forming a valid 1×1
// off-screen square ((-1,-1)(0,-1)(0,0)(-1,0)(-1,-1)) so CurveRenderer
// never receives a zero-area or bare-moveto path.
PathLine {
x: {
if (!root.shouldShow)
return 0;
if (root.isFramed)
return root.screenWidth;
return root.barMappedPos.x + root.barWidth + root.rightEdgeOvs - root.trRadius * root.trMultX;
}
y: root.isFramed ? 0 : (root.barMappedPos.y + root.topEdgeOvs)
x: root.isRenderable ? (root.isFramed ? root.screenWidth : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs - root.trRadius * root.trMultX)) : 0
y: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.y + root.topEdgeOvs)) : -1
}
// Bar top-right corner (only if not framed)
PathArc {
x: root.isFramed ? (root.shouldShow ? root.screenWidth : 0) : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs)
y: root.isFramed ? 0 : (root.barMappedPos.y + root.topEdgeOvs + root.trRadius * root.trMultY)
radiusX: root.isFramed ? 0 : root.trRadius
radiusY: root.isFramed ? 0 : root.trRadius
x: root.isRenderable ? (root.isFramed ? root.screenWidth : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs)) : 0
y: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.y + root.topEdgeOvs + root.trRadius * root.trMultY)) : -1
radiusX: root.isRenderable ? (root.isFramed ? 0 : root.trRadius) : 0
radiusY: root.isRenderable ? (root.isFramed ? 0 : root.trRadius) : 0
direction: ShapeCornerHelper.getArcDirection(root.trMultX, root.trMultY)
}
PathLine {
x: root.isFramed ? (root.shouldShow ? root.screenWidth : 0) : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs)
y: {
if (!root.shouldShow)
return 0;
if (root.isFramed)
return root.screenHeight;
return root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs - root.brRadius * root.brMultY;
}
x: root.isRenderable ? (root.isFramed ? root.screenWidth : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs)) : 0
y: root.isRenderable ? (root.isFramed ? root.screenHeight : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs - root.brRadius * root.brMultY)) : 0
}
// Bar bottom-right corner (only if not framed)
PathArc {
x: root.isFramed ? (root.shouldShow ? root.screenWidth : 0) : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs - root.brRadius * root.brMultX)
y: root.isFramed ? (root.shouldShow ? root.screenHeight : 0) : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs)
radiusX: root.isFramed ? 0 : root.brRadius
radiusY: root.isFramed ? 0 : root.brRadius
x: root.isRenderable ? (root.isFramed ? root.screenWidth : (root.barMappedPos.x + root.barWidth + root.rightEdgeOvs - root.brRadius * root.brMultX)) : 0
y: root.isRenderable ? (root.isFramed ? root.screenHeight : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs)) : 0
radiusX: root.isRenderable ? (root.isFramed ? 0 : root.brRadius) : 0
radiusY: root.isRenderable ? (root.isFramed ? 0 : root.brRadius) : 0
direction: ShapeCornerHelper.getArcDirection(root.brMultX, root.brMultY)
}
PathLine {
x: {
if (!root.shouldShow)
return 0;
if (root.isFramed)
return 0;
return root.barMappedPos.x + root.leftEdgeOvs + root.blRadius * root.blMultX;
}
y: root.isFramed ? (root.shouldShow ? root.screenHeight : 0) : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs)
x: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.x + root.leftEdgeOvs + root.blRadius * root.blMultX)) : -1
y: root.isRenderable ? (root.isFramed ? root.screenHeight : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs)) : 0
}
// Bar bottom-left corner (only if not framed)
PathArc {
x: root.isFramed ? 0 : (root.barMappedPos.x + root.leftEdgeOvs)
y: root.isFramed ? (root.shouldShow ? root.screenHeight : 0) : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs - root.blRadius * root.blMultY)
radiusX: root.isFramed ? 0 : root.blRadius
radiusY: root.isFramed ? 0 : root.blRadius
x: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.x + root.leftEdgeOvs)) : -1
y: root.isRenderable ? (root.isFramed ? root.screenHeight : (root.barMappedPos.y + root.barHeight + root.bottomEdgeOvs - root.blRadius * root.blMultY)) : 0
radiusX: root.isRenderable ? (root.isFramed ? 0 : root.blRadius) : 0
radiusY: root.isRenderable ? (root.isFramed ? 0 : root.blRadius) : 0
direction: ShapeCornerHelper.getArcDirection(root.blMultX, root.blMultY)
}
PathLine {
x: root.isFramed ? 0 : (root.barMappedPos.x + root.leftEdgeOvs)
y: {
if (!root.shouldShow)
return 0;
if (root.isFramed)
return 0;
return root.barMappedPos.y + root.topEdgeOvs + root.tlRadius * root.tlMultY;
}
x: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.x + root.leftEdgeOvs)) : -1
y: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.y + root.topEdgeOvs + root.tlRadius * root.tlMultY)) : -1
}
// Bar top-left corner (only if not framed, back to start)
PathArc {
x: root.isFramed ? 0 : (root.barMappedPos.x + root.leftEdgeOvs + root.tlRadius * root.tlMultX)
y: root.isFramed ? 0 : (root.barMappedPos.y + root.topEdgeOvs)
radiusX: root.isFramed ? 0 : root.tlRadius
radiusY: root.isFramed ? 0 : root.tlRadius
x: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.x + root.leftEdgeOvs + root.tlRadius * root.tlMultX)) : -1
y: root.isRenderable ? (root.isFramed ? 0 : (root.barMappedPos.y + root.topEdgeOvs)) : -1
radiusX: root.isRenderable ? (root.isFramed ? 0 : root.tlRadius) : 0
radiusY: root.isRenderable ? (root.isFramed ? 0 : root.tlRadius) : 0
direction: ShapeCornerHelper.getArcDirection(root.tlMultX, root.tlMultY)
}
// 2. Inner Hole for Framed Mode (Clockwise)
// When !isFramed, draws a tiny 1x1 rectangle inside the bar as a non-degenerate WindingFill
// no-op to prevent a zero-area degenerate subpath crashing qTriangulate.
// Note: an exact duplicate of the outer path cannot be used here because Qt's CurveRenderer
// has issues with exactly coincident subpaths, causing the fill to not render on some systems.
// When !isRenderable, falls back to a valid 1×1 off-screen square at (-3,-3)(-2,-2).
readonly property real _nhX: barMappedPos.x + barWidth / 2
readonly property real _nhY: barMappedPos.y + barHeight / 2
PathMove {
x: (root.isFramed && root.shouldShow) ? (root.holeX + root.frameRadius) : root.startX
y: (root.isFramed && root.shouldShow) ? root.holeY : root.startY
x: root.isRenderable ? (root.isFramed ? (root.holeX + root.frameRadius) : root._nhX) : -3
y: root.isRenderable ? (root.isFramed ? root.holeY : root._nhY) : -3
}
// Top edge
PathLine {
x: (root.isFramed && root.shouldShow) ? (root.holeX + root.holeWidth - root.frameRadius) : ((root.isFramed && root.shouldShow) ? (root.holeX + root.frameRadius) : root.startX)
y: (root.isFramed && root.shouldShow) ? root.holeY : ((root.isFramed && root.shouldShow) ? root.holeY : root.startY)
x: root.isRenderable ? (root.isFramed ? (root.holeX + root.holeWidth - root.frameRadius) : (root._nhX + 1)) : -2
y: root.isRenderable ? (root.isFramed ? root.holeY : root._nhY) : -3
}
// Top-right corner
PathArc {
x: (root.isFramed && root.shouldShow) ? (root.holeX + root.holeWidth) : ((root.isFramed && root.shouldShow) ? (root.holeX + root.holeWidth - root.frameRadius) : root.startX)
y: (root.isFramed && root.shouldShow) ? (root.holeY + root.frameRadius) : ((root.isFramed && root.shouldShow) ? root.holeY : root.startY)
radiusX: (root.isFramed && root.shouldShow) ? root.frameRadius : 0
radiusY: (root.isFramed && root.shouldShow) ? root.frameRadius : 0
x: root.isRenderable ? (root.isFramed ? (root.holeX + root.holeWidth) : (root._nhX + 1)) : -2
y: root.isRenderable ? (root.isFramed ? (root.holeY + root.frameRadius) : root._nhY) : -3
radiusX: root.isRenderable ? (root.isFramed ? root.frameRadius : 0) : 0
radiusY: root.isRenderable ? (root.isFramed ? root.frameRadius : 0) : 0
direction: PathArc.Clockwise
}
// Right edge
PathLine {
x: (root.isFramed && root.shouldShow) ? (root.holeX + root.holeWidth) : root.startX
y: (root.isFramed && root.shouldShow) ? (root.holeY + root.holeHeight - root.frameRadius) : root.startY
x: root.isRenderable ? (root.isFramed ? (root.holeX + root.holeWidth) : (root._nhX + 1)) : -2
y: root.isRenderable ? (root.isFramed ? (root.holeY + root.holeHeight - root.frameRadius) : (root._nhY + 1)) : -2
}
// Bottom-right corner
PathArc {
x: (root.isFramed && root.shouldShow) ? (root.holeX + root.holeWidth - root.frameRadius) : root.startX
y: (root.isFramed && root.shouldShow) ? (root.holeY + root.holeHeight) : root.startY
radiusX: (root.isFramed && root.shouldShow) ? root.frameRadius : 0
radiusY: (root.isFramed && root.shouldShow) ? root.frameRadius : 0
x: root.isRenderable ? (root.isFramed ? (root.holeX + root.holeWidth - root.frameRadius) : (root._nhX + 1)) : -2
y: root.isRenderable ? (root.isFramed ? (root.holeY + root.holeHeight) : (root._nhY + 1)) : -2
radiusX: root.isRenderable ? (root.isFramed ? root.frameRadius : 0) : 0
radiusY: root.isRenderable ? (root.isFramed ? root.frameRadius : 0) : 0
direction: PathArc.Clockwise
}
// Bottom edge
PathLine {
x: (root.isFramed && root.shouldShow) ? (root.holeX + root.frameRadius) : root.startX
y: (root.isFramed && root.shouldShow) ? (root.holeY + root.holeHeight) : root.startY
x: root.isRenderable ? (root.isFramed ? (root.holeX + root.frameRadius) : root._nhX) : -3
y: root.isRenderable ? (root.isFramed ? (root.holeY + root.holeHeight) : (root._nhY + 1)) : -2
}
// Bottom-left corner
PathArc {
x: (root.isFramed && root.shouldShow) ? root.holeX : root.startX
y: (root.isFramed && root.shouldShow) ? (root.holeY + root.holeHeight - root.frameRadius) : root.startY
radiusX: (root.isFramed && root.shouldShow) ? root.frameRadius : 0
radiusY: (root.isFramed && root.shouldShow) ? root.frameRadius : 0
x: root.isRenderable ? (root.isFramed ? root.holeX : root._nhX) : -3
y: root.isRenderable ? (root.isFramed ? (root.holeY + root.holeHeight - root.frameRadius) : (root._nhY + 1)) : -2
radiusX: root.isRenderable ? (root.isFramed ? root.frameRadius : 0) : 0
radiusY: root.isRenderable ? (root.isFramed ? root.frameRadius : 0) : 0
direction: PathArc.Clockwise
}
// Left edge
PathLine {
x: (root.isFramed && root.shouldShow) ? root.holeX : root.startX
y: (root.isFramed && root.shouldShow) ? (root.holeY + root.frameRadius) : root.startY
x: root.isRenderable ? (root.isFramed ? root.holeX : root._nhX) : -3
y: root.isRenderable ? (root.isFramed ? (root.holeY + root.frameRadius) : root._nhY) : -3
}
// Top-left corner (back to start)
PathArc {
x: (root.isFramed && root.shouldShow) ? (root.holeX + root.frameRadius) : root.startX
y: (root.isFramed && root.shouldShow) ? root.holeY : root.startY
radiusX: (root.isFramed && root.shouldShow) ? root.frameRadius : 0
radiusY: (root.isFramed && root.shouldShow) ? root.frameRadius : 0
x: root.isRenderable ? (root.isFramed ? (root.holeX + root.frameRadius) : root._nhX) : -3
y: root.isRenderable ? (root.isFramed ? root.holeY : root._nhY) : -3
radiusX: root.isRenderable ? (root.isFramed ? root.frameRadius : 0) : 0
radiusY: root.isRenderable ? (root.isFramed ? root.frameRadius : 0) : 0
direction: PathArc.Clockwise
}
}
@@ -53,6 +53,7 @@ ShapePath {
readonly property real panelY: panelBg ? panelBg.y : 0
readonly property real panelWidth: panelBg ? panelBg.width : 0
readonly property real panelHeight: panelBg ? panelBg.height : 0
readonly property bool isRenderable: assignedPanel && panelBg && panelWidth > 0 && panelHeight > 0
// Flatten corners if panel is too small
readonly property bool shouldFlatten: panelBg ? ShapeCornerHelper.shouldFlatten(panelWidth, panelHeight, radius) : false
@@ -87,11 +88,11 @@ ShapePath {
// ShapePath configuration
strokeWidth: -1 // No stroke, fill only
// Starting position (top-left corner, after the arc)
startX: panelX + tlRadius * tlMultX
startY: panelY
// Start point - use tiny off-screen non-degenerate fallback when not renderable.
startX: isRenderable ? (panelX + tlRadius * tlMultX) : -1
startY: isRenderable ? panelY : -1
fillColor: effectiveBackgroundColor
fillColor: isRenderable ? effectiveBackgroundColor : "transparent"
// ========== PATH DEFINITION ==========
// Draws a rectangle with potentially inverted corners
@@ -99,61 +100,61 @@ ShapePath {
// Top edge (moving right)
PathLine {
relativeX: root.panelWidth - root.tlRadius * root.tlMultX - root.trRadius * root.trMultX
relativeX: root.isRenderable ? (root.panelWidth - root.tlRadius * root.tlMultX - root.trRadius * root.trMultX) : 1
relativeY: 0
}
// Top-right corner arc
PathArc {
relativeX: root.trRadius * root.trMultX
relativeY: root.trRadius * root.trMultY
radiusX: root.trRadius
radiusY: root.trRadius
relativeX: root.isRenderable ? (root.trRadius * root.trMultX) : 0
relativeY: root.isRenderable ? (root.trRadius * root.trMultY) : 0
radiusX: root.isRenderable ? root.trRadius : 0
radiusY: root.isRenderable ? root.trRadius : 0
direction: ShapeCornerHelper.getArcDirection(root.trMultX, root.trMultY)
}
// Right edge (moving down)
PathLine {
relativeX: 0
relativeY: root.panelHeight - root.trRadius * root.trMultY - root.brRadius * root.brMultY
relativeY: root.isRenderable ? (root.panelHeight - root.trRadius * root.trMultY - root.brRadius * root.brMultY) : 1
}
// Bottom-right corner arc
PathArc {
relativeX: -root.brRadius * root.brMultX
relativeY: root.brRadius * root.brMultY
radiusX: root.brRadius
radiusY: root.brRadius
relativeX: root.isRenderable ? (-root.brRadius * root.brMultX) : 0
relativeY: root.isRenderable ? (root.brRadius * root.brMultY) : 0
radiusX: root.isRenderable ? root.brRadius : 0
radiusY: root.isRenderable ? root.brRadius : 0
direction: ShapeCornerHelper.getArcDirection(root.brMultX, root.brMultY)
}
// Bottom edge (moving left)
PathLine {
relativeX: -(root.panelWidth - root.brRadius * root.brMultX - root.blRadius * root.blMultX)
relativeX: root.isRenderable ? (-(root.panelWidth - root.brRadius * root.brMultX - root.blRadius * root.blMultX)) : -1
relativeY: 0
}
// Bottom-left corner arc
PathArc {
relativeX: -root.blRadius * root.blMultX
relativeY: -root.blRadius * root.blMultY
radiusX: root.blRadius
radiusY: root.blRadius
relativeX: root.isRenderable ? (-root.blRadius * root.blMultX) : 0
relativeY: root.isRenderable ? (-root.blRadius * root.blMultY) : 0
radiusX: root.isRenderable ? root.blRadius : 0
radiusY: root.isRenderable ? root.blRadius : 0
direction: ShapeCornerHelper.getArcDirection(root.blMultX, root.blMultY)
}
// Left edge (moving up) - closes the path back to start
PathLine {
relativeX: 0
relativeY: -(root.panelHeight - root.blRadius * root.blMultY - root.tlRadius * root.tlMultY)
relativeY: root.isRenderable ? (-(root.panelHeight - root.blRadius * root.blMultY - root.tlRadius * root.tlMultY)) : -1
}
// Top-left corner arc (back to start)
PathArc {
relativeX: root.tlRadius * root.tlMultX
relativeY: -root.tlRadius * root.tlMultY
radiusX: root.tlRadius
radiusY: root.tlRadius
relativeX: root.isRenderable ? (root.tlRadius * root.tlMultX) : 0
relativeY: root.isRenderable ? (-root.tlRadius * root.tlMultY) : 0
radiusX: root.isRenderable ? root.tlRadius : 0
radiusY: root.isRenderable ? root.tlRadius : 0
direction: ShapeCornerHelper.getArcDirection(root.tlMultX, root.tlMultY)
}
}
+9 -7
View File
@@ -203,7 +203,9 @@ PanelWindow {
}
// Blur behind the bar and open panels attached to PanelWindow (required by BackgroundEffect API)
BackgroundEffect.blurRegion: Region {
BackgroundEffect.blurRegion: Settings.data.general.enableBlurBehind ? blurRegion : null
Region {
id: blurRegion
// Non-framed bar (simple/floating): single rectangle with bar corner states
Region {
x: (!barPlaceholder.isFramed && root.barShouldShow && !barPlaceholder.isHidden) ? barPlaceholder.x : 0
@@ -460,14 +462,14 @@ PanelWindow {
// Use screen dimensions directly
x: {
if (barPosition === "right")
return screen.width - barHeight - barMarginH;
return (screen?.width ?? 0) - barHeight - barMarginH;
if (isFramed && !barIsVertical)
return frameThickness;
return barMarginH;
}
y: {
if (barPosition === "bottom")
return screen.height - barHeight - barMarginV;
return (screen?.height ?? 0) - barHeight - barMarginV;
if (isFramed && barIsVertical)
return frameThickness;
return barMarginV;
@@ -477,16 +479,16 @@ PanelWindow {
return barHeight;
}
if (isFramed)
return screen.width - frameThickness * 2;
return screen.width - barMarginH * 2;
return (screen?.width ?? 0) - frameThickness * 2;
return (screen?.width ?? 0) - barMarginH * 2;
}
height: {
if (!barIsVertical) {
return barHeight;
}
if (isFramed)
return screen.height - frameThickness * 2;
return screen.height - barMarginV * 2;
return (screen?.height ?? 0) - frameThickness * 2;
return (screen?.height ?? 0) - barMarginV * 2;
}
// Corner states (same as Bar.qml)
+1
View File
@@ -26,6 +26,7 @@ Item {
anchors.fill: parent
preferredRendererType: Shape.CurveRenderer
enabled: false // Disable mouse input
visible: cornersPath.cornerRadius > 0 && width > 0 && height > 0
ShapePath {
id: cornersPath
+32 -27
View File
@@ -163,11 +163,41 @@ Item {
// Reset to default - fixes panel being stuck in one position
root.useButtonPosition = false;
// Calculate the bar window's position on screen based on bar settings
// The BarContentWindow uses anchors + margins, so we need to compute its origin
var barWindowX = 0;
var barWindowY = 0;
var screenWidth = root.screen?.width || 0;
var screenHeight = root.screen?.height || 0;
if (root.barPosition === "right") {
barWindowX = screenWidth - root.barMarginH - root.barHeight;
} else if (root.barPosition === "left") {
barWindowX = root.barMarginH;
} else if (root.isFramed) {
barWindowX = root.frameThickness;
} else {
// Horizontal floating bars: BarContentWindow has margins.left = barMarginH
barWindowX = root.barMarginH;
}
if (root.barPosition === "bottom") {
barWindowY = screenHeight - root.barMarginV - root.barHeight;
} else if (root.barPosition === "top") {
barWindowY = root.barMarginV;
} else if (root.isFramed) {
barWindowY = root.frameThickness;
} else {
// Vertical floating bars: BarContentWindow has margins.top = barMarginV
barWindowY = root.barMarginV;
}
if (!buttonItem && buttonName) {
// Check if buttonName is actually a point object (click coordinates)
if (typeof buttonName === "object" && buttonName.x !== undefined && buttonName.y !== undefined) {
root.buttonItem = null;
root.buttonPosition = buttonName;
// Click coordinates are in BarContentWindow-local space, offset to screen space
root.buttonPosition = Qt.point(barWindowX + buttonName.x, barWindowY + buttonName.y);
root.buttonWidth = 0;
root.buttonHeight = 0;
root.useButtonPosition = true;
@@ -181,34 +211,9 @@ Item {
if (buttonItem && typeof buttonItem.mapToItem === "function") {
try {
root.buttonItem = buttonItem;
// Map button position within its window
// Map button position within its window (BarContentWindow-local coordinates)
var buttonLocal = buttonItem.mapToItem(null, 0, 0);
// Calculate the bar window's position on screen based on bar settings
// The BarContentWindow uses anchors, so we need to compute its position
var barWindowX = 0;
var barWindowY = 0;
var screenWidth = root.screen?.width || 0;
var screenHeight = root.screen?.height || 0;
if (root.barPosition === "right") {
barWindowX = screenWidth - root.barMarginH - root.barHeight;
} else if (root.barPosition === "left") {
barWindowX = root.barMarginH;
} else if (root.isFramed) {
barWindowX = root.frameThickness;
}
// For top/bottom bars, barWindowX stays 0 (full width window) unless framed
if (root.barPosition === "bottom") {
barWindowY = screenHeight - root.barMarginV - root.barHeight;
} else if (root.barPosition === "top") {
barWindowY = root.barMarginV;
} else if (root.isFramed) {
barWindowY = root.frameThickness;
}
// For left/right bars, barWindowY stays 0 (full height window) unless framed
root.buttonPosition = Qt.point(barWindowX + buttonLocal.x, barWindowY + buttonLocal.y);
root.buttonWidth = buttonItem.width;
root.buttonHeight = buttonItem.height;
+9 -2
View File
@@ -11,8 +11,15 @@ import qs.Widgets
// Simple notification popup - displays multiple notifications
Variants {
// If no notification display activated in settings, then show them all
model: Quickshell.screens.filter(screen => (Settings.data.notifications.monitors.includes(screen.name) || (Settings.data.notifications.monitors.length === 0)))
model: {
const screens = Quickshell.screens.filter(screen => Settings.data.notifications.monitors.includes(screen.name));
// Empty list can mean two things :
// - No (visible) notification display activated in settings
// - One or more (not visible) displays are activated but unplugged
// In both cases we fallback to show notification on all screens
return screens.length === 0 ? Quickshell.screens : screens;
}
delegate: Loader {
id: root
+15
View File
@@ -35,6 +35,7 @@ Variants {
property int currentOSDType: -1 // OSD.Type enum value, -1 means none
property bool startupComplete: false
property real currentBrightness: 0
property bool suppressInputOSD: false
// Lock Key States
property string lastLockKeyChanged: "" // "caps", "num", "scroll", or ""
@@ -258,11 +259,15 @@ Variants {
}
function onInputVolumeChanged() {
if (suppressInputOSD)
return;
if (AudioService.hasInput)
showOSD(OSD.Type.InputVolume);
}
function onInputMutedChanged() {
if (suppressInputOSD)
return;
if (!AudioService.hasInput)
return;
if (AudioService.consumeInputOSDSuppression())
@@ -272,6 +277,8 @@ Variants {
// Refresh OSD when device changes to ensure correct volume is displayed
function onSinkChanged() {
suppressInputOSD = true;
inputSuppressionTimer.restart();
// If volume OSD is currently showing, refresh it to show new device's volume
if (root.currentOSDType === OSD.Type.Volume) {
Qt.callLater(() => {
@@ -344,6 +351,14 @@ Variants {
}
}
// Timer to reset the input volume OSD suppression
Timer {
id: inputSuppressionTimer
interval: 300
repeat: false
onTriggered: root.suppressInputOSD = false
}
Component.onDestruction: {
LockKeysService.unregisterComponent("osd:" + (modelData?.name || "unknown"));
if (typeof BrightnessService !== "undefined" && BrightnessService.monitors) {
@@ -218,6 +218,10 @@ SmartPanel {
Layout.preferredHeight: outputColumn.implicitHeight + Style.margin2M
property var brightnessMonitor: BrightnessService.getMonitorForScreen(modelData)
readonly property real compositorScale: {
const info = CompositorService.displayScales[modelData.name];
return (info && info.scale) ? info.scale : 1.0;
}
ColumnLayout {
id: outputColumn
@@ -231,7 +235,6 @@ SmartPanel {
label: modelData.name || "Unknown"
labelColor: Color.mPrimary
description: {
const compositorScale = CompositorService.getDisplayScale(modelData.name);
I18n.tr("system.monitor-description", {
"model": modelData.model,
"width": modelData.width * compositorScale,
+17 -13
View File
@@ -88,11 +88,20 @@ SmartPanel {
}
// Preview Panel (external) - uses provider's preview component
NDropShadow {
source: previewBox
anchors.fill: previewBox
autoPaddingEnabled: true
visible: previewBox.visible
z: previewBox.z - 1
}
NBox {
id: previewBox
visible: root.previewActive
width: root.previewPanelWidth
height: Math.round(400 * Style.uiScaleRatio)
forceOpaque: true // no blur for now
x: root.panelAnchorRight ? -(root.previewPanelWidth + Style.marginM) : ui.width + Style.marginM
y: {
var view = launcherCore.resultsView;
@@ -150,20 +159,15 @@ SmartPanel {
}
// Core launcher (state, providers, UI)
NBox {
LauncherCore {
id: launcherCore
anchors.fill: parent
anchors.margins: Style.marginL
LauncherCore {
id: launcherCore
anchors.fill: parent
screen: root.screen
isOpen: root.isPanelOpen
onRequestClose: root.close()
// Defer so the signal emission completes before SmartPanel
// sets isPanelOpen=false and the contentLoader destroys us.
onRequestCloseImmediately: Qt.callLater(root.closeImmediately)
}
screen: root.screen
isOpen: root.isPanelOpen
onRequestClose: root.close()
// Defer so the signal emission completes before SmartPanel
// sets isPanelOpen=false and the contentLoader destroys us.
onRequestCloseImmediately: Qt.callLater(root.closeImmediately)
}
// Update preview when selection changes
+31 -31
View File
@@ -7,7 +7,6 @@ import Quickshell.Widgets
import "Providers"
import qs.Commons
import qs.Services.Keyboard
import qs.Services.Noctalia
import qs.Services.UI
import qs.Widgets
@@ -160,6 +159,12 @@ Rectangle {
}
}
onSearchTextChanged: {
if (isOpen) {
updateResults();
}
}
function onOpened() {
ignoreMouseHover = true;
globalMouseInitialized = false;
@@ -189,11 +194,6 @@ Rectangle {
}
}
onSearchTextChanged: {
if (isOpen)
updateResults();
}
function close() {
requestClose();
}
@@ -227,30 +227,23 @@ Rectangle {
var idx = providers.indexOf(pluginProviderInstances[existingId]);
if (idx >= 0)
providers.splice(idx, 1);
pluginProviderInstances[existingId].destroy();
delete pluginProviderInstances[existingId];
Logger.d("Launcher", "Removed plugin provider:", existingId);
changed = true;
}
}
// Add new providers
// Adopt persistent instances from the registry
for (var i = 0; i < registeredIds.length; i++) {
var providerId = registeredIds[i];
if (!pluginProviderInstances[providerId]) {
var component = LauncherProviderRegistry.getProviderComponent(providerId);
var pluginId = providerId.substring(7); // Remove "plugin:" prefix
var pluginApi = PluginService.getPluginAPI(pluginId);
if (component && pluginApi) {
var instance = component.createObject(root, {
pluginApi: pluginApi
});
if (instance) {
pluginProviderInstances[providerId] = instance;
registerProvider(instance);
Logger.d("Launcher", "Registered plugin provider:", providerId);
changed = true;
}
var instance = LauncherProviderRegistry.getProviderInstance(providerId);
if (instance) {
pluginProviderInstances[providerId] = instance;
providers.push(instance);
instance.launcher = root;
Logger.d("Launcher", "Adopted plugin provider:", providerId);
changed = true;
}
}
}
@@ -547,7 +540,9 @@ Rectangle {
if (showProviderCategories) {
var cats = providerCategories;
var idx = cats.indexOf(currentProvider.selectedCategory);
currentProvider.selectCategory(cats[(idx + 1) % cats.length]);
var nextIdx = (idx + 1) % cats.length;
currentProvider.selectCategory(cats[nextIdx]);
categoryTabs.currentIndex = nextIdx;
} else {
selectNextWrapped();
}
@@ -557,7 +552,9 @@ Rectangle {
if (showProviderCategories) {
var cats2 = providerCategories;
var idx2 = cats2.indexOf(currentProvider.selectedCategory);
currentProvider.selectCategory(cats2[((idx2 - 1) % cats2.length + cats2.length) % cats2.length]);
var prevIdx = ((idx2 - 1) % cats2.length + cats2.length) % cats2.length;
currentProvider.selectCategory(cats2[prevIdx]);
categoryTabs.currentIndex = prevIdx;
} else {
selectPreviousWrapped();
}
@@ -787,7 +784,7 @@ Rectangle {
horizontalPolicy: ScrollBar.AlwaysOff
verticalPolicy: ScrollBar.AlwaysOff
reserveScrollbarSpace: false
gradientColor: Color.mSurfaceVariant
gradientColor: Settings.data.ui.panelBackgroundOpacity < 1 ? "transparent" : Color.mSurfaceVariant
wheelScrollMultiplier: 4.0
width: parent.width
@@ -810,6 +807,12 @@ Rectangle {
property bool isSelected: (!root.ignoreMouseHover && mouseArea.containsMouse) || (index === root.selectedIndex)
width: resultsList.availableWidth
implicitHeight: root.entryHeight
clip: true
color: entry.isSelected ? Color.mHover : Color.mSurface
forceOpaque: entry.isSelected
// Prepare item when it becomes visible (e.g., decode images)
Component.onCompleted: {
var provider = modelData.provider;
@@ -818,11 +821,6 @@ Rectangle {
}
}
width: resultsList.availableWidth
implicitHeight: root.entryHeight
clip: true
color: entry.isSelected ? Color.mHover : Color.mSurface
Behavior on color {
ColorAnimation {
duration: Style.animationFast
@@ -1090,6 +1088,7 @@ Rectangle {
NBox {
anchors.fill: parent
color: Color.mSurfaceVariant
forceOpaque: true
Layout.fillWidth: true
Layout.fillHeight: true
@@ -1135,7 +1134,7 @@ Rectangle {
}
}
// --------------------------
// // --------------------------
// GRID VIEW
Component {
id: gridViewComponent
@@ -1145,7 +1144,7 @@ Rectangle {
horizontalPolicy: ScrollBar.AlwaysOff
verticalPolicy: ScrollBar.AlwaysOff
reserveScrollbarSpace: false
gradientColor: Color.mSurfaceVariant
gradientColor: Settings.data.ui.panelBackgroundOpacity < 1 ? "transparent" : Color.mSurfaceVariant
wheelScrollMultiplier: 4.0
trackedSelectionIndex: root.selectedIndex
@@ -1215,6 +1214,7 @@ Rectangle {
anchors.fill: parent
anchors.margins: Style.marginXXS
color: gridEntryContainer.isSelected ? Color.mHover : Color.mSurface
forceOpaque: gridEntryContainer.isSelected
Behavior on color {
ColorAnimation {
@@ -40,6 +40,31 @@ Variants {
WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.exclusionMode: ExclusionMode.Ignore
BackgroundEffect.blurRegion: Settings.data.general.enableBlurBehind ? launcherBlurRegion : null
Region {
id: launcherBlurRegion
Region {
x: Math.round(launcherPanel.x)
y: Math.round(launcherPanel.y)
width: Math.round(launcherPanel.width)
height: Math.round(launcherPanel.height)
radius: Style.radiusL
topLeftCorner: launcherPanel.topLeftCornerState
topRightCorner: launcherPanel.topRightCornerState
bottomLeftCorner: launcherPanel.bottomLeftCornerState
bottomRightCorner: launcherPanel.bottomRightCornerState
}
Region {
x: Math.round(previewBox.visible ? previewBox.x : 0)
y: Math.round(previewBox.visible ? previewBox.y : 0)
width: Math.round(previewBox.visible ? previewBox.width : 0)
height: Math.round(previewBox.visible ? previewBox.height : 0)
radius: Style.radiusL
}
}
// Positioning logic (respects settings but doesn't attach to bar)
readonly property string barPosition: Settings.data.bar.position
readonly property bool barIsVertical: barPosition === "left" || barPosition === "right"
@@ -198,6 +223,7 @@ Variants {
y: -radius
width: launcherPanel.width + radius * 2
height: launcherPanel.height + radius * 2
visible: panelW > 0 && panelH > 0
opacity: launcherPanel.opacity
layer.enabled: true
@@ -229,7 +255,7 @@ Variants {
ShapePath {
strokeWidth: -1
fillColor: Color.mSurfaceVariant
fillColor: Qt.alpha(Color.mSurfaceVariant, Settings.data.ui.panelBackgroundOpacity)
// Offset by radius to account for Shape's extended bounds
startX: panelShape.radius + panelShape.radius * panelShape.tlMultX
@@ -311,83 +337,88 @@ Variants {
Component.onCompleted: PanelService.overlayLauncherCore = launcherCore
Component.onDestruction: PanelService.overlayLauncherCore = null
}
}
// Preview Panel - clipboard preview positioned outside panel bounds
NDropShadow {
source: previewBox
anchors.fill: previewBox
autoPaddingEnabled: true
visible: previewBox.visible
// Preview Panel - positioned as sibling of launcherPanel to avoid shadow bleed
NDropShadow {
source: previewBox
anchors.fill: previewBox
autoPaddingEnabled: true
visible: previewBox.visible
z: previewBox.z - 1
}
NBox {
id: previewBox
visible: launcherWindow.previewActive
width: launcherWindow.previewPanelWidth
height: Math.round(400 * Style.uiScaleRatio)
forceOpaque: true
x: {
if (panelPosition.endsWith("_right"))
return launcherPanel.x - launcherWindow.previewPanelWidth - Style.marginM;
return launcherPanel.x + launcherPanel.width + Style.marginM;
}
y: {
var view = launcherCore.resultsView;
if (!view)
return launcherPanel.y + Style.marginL;
var row = launcherCore.isGridView ? Math.floor(launcherCore.selectedIndex / launcherCore.gridColumns) : launcherCore.selectedIndex;
var gridCellSize = Math.floor((launcherWindow.listPanelWidth - (2 * Style.marginXS) - ((launcherCore.targetGridColumns - 1) * Style.marginS)) / launcherCore.targetGridColumns);
var itemHeight = launcherCore.isGridView ? (gridCellSize + Style.marginXXS) : (launcherCore.entryHeight + (view.spacing || 0));
var yPos = row * itemHeight - (view.contentY || 0);
var mapped = view.mapToItem(launcherWindow.contentItem, 0, yPos);
return Math.max(launcherPanel.y + Style.marginL, Math.min(mapped.y, launcherPanel.y + launcherPanel.height - previewBox.height - Style.marginL));
}
NBox {
id: previewBox
visible: launcherWindow.previewActive
width: launcherWindow.previewPanelWidth
height: Math.round(400 * Style.uiScaleRatio)
x: panelPosition.endsWith("_right") ? -(launcherWindow.previewPanelWidth + Style.marginM) : launcherPanel.width + Style.marginM
y: {
var view = launcherCore.resultsView;
if (!view)
return Style.marginL;
var row = launcherCore.isGridView ? Math.floor(launcherCore.selectedIndex / launcherCore.gridColumns) : launcherCore.selectedIndex;
var gridCellSize = Math.floor((launcherWindow.listPanelWidth - (2 * Style.marginXS) - ((launcherCore.targetGridColumns - 1) * Style.marginS)) / launcherCore.targetGridColumns);
var itemHeight = launcherCore.isGridView ? (gridCellSize + Style.marginXXS) : (launcherCore.entryHeight + (view.spacing || 0));
var yPos = row * itemHeight - (view.contentY || 0);
var mapped = view.mapToItem(launcherPanel, 0, yPos);
return Math.max(Style.marginL, Math.min(mapped.y, launcherPanel.height - previewBox.height - Style.marginL));
opacity: visible ? 1.0 : 0.0
Behavior on opacity {
NumberAnimation {
duration: Style.animationFast
}
z: -1
}
Behavior on y {
NumberAnimation {
duration: Style.animationFast
easing.type: Easing.OutCubic
}
}
opacity: visible ? 1.0 : 0.0
Behavior on opacity {
NumberAnimation {
duration: Style.animationFast
}
}
Behavior on y {
NumberAnimation {
duration: Style.animationFast
easing.type: Easing.OutCubic
}
}
Loader {
id: previewLoader
anchors.fill: parent
active: launcherWindow.previewActive
source: {
if (!active)
return "";
var provider = launcherCore.activeProvider;
if (provider && provider.previewComponentPath)
return provider.previewComponentPath;
Loader {
id: previewLoader
anchors.fill: parent
active: launcherWindow.previewActive
source: {
if (!active)
return "";
}
var provider = launcherCore.activeProvider;
if (provider && provider.previewComponentPath)
return provider.previewComponentPath;
return "";
}
onLoaded: updatePreviewItem()
onItemChanged: updatePreviewItem()
onLoaded: updatePreviewItem()
onItemChanged: updatePreviewItem()
function updatePreviewItem() {
if (!item || launcherCore.selectedIndex < 0 || !launcherCore.results[launcherCore.selectedIndex])
return;
var provider = launcherCore.activeProvider;
if (provider && provider.getPreviewData) {
item.currentItem = provider.getPreviewData(launcherCore.results[launcherCore.selectedIndex]);
} else {
item.currentItem = launcherCore.results[launcherCore.selectedIndex];
}
function updatePreviewItem() {
if (!item || launcherCore.selectedIndex < 0 || !launcherCore.results[launcherCore.selectedIndex])
return;
var provider = launcherCore.activeProvider;
if (provider && provider.getPreviewData) {
item.currentItem = provider.getPreviewData(launcherCore.results[launcherCore.selectedIndex]);
} else {
item.currentItem = launcherCore.results[launcherCore.selectedIndex];
}
}
}
}
// Update preview when selection changes
Connections {
target: launcherCore
function onSelectedIndexChanged() {
if (previewLoader.item)
previewLoader.updatePreviewItem();
}
// Update preview when selection changes
Connections {
target: launcherCore
function onSelectedIndexChanged() {
if (previewLoader.item)
previewLoader.updatePreviewItem();
}
}
}
@@ -153,45 +153,42 @@ Item {
if (launcher)
launcher.close();
// Execute via Qt.callLater, but reference only singletons
// (root may be destroyed after launcher.close() unloads the panel)
Qt.callLater(() => {
executeAction(action);
switch (action) {
case "lock":
if (PanelService.lockScreen && !PanelService.lockScreen.active) {
PanelService.lockScreen.active = true;
}
break;
case "suspend":
if (Settings.data.general.lockOnSuspend) {
CompositorService.lockAndSuspend();
} else {
CompositorService.suspend();
}
break;
case "hibernate":
CompositorService.hibernate();
break;
case "reboot":
CompositorService.reboot();
break;
case "rebootToUefi":
CompositorService.rebootToUefi();
break;
case "userspaceReboot":
CompositorService.userspaceReboot();
break;
case "logout":
CompositorService.logout();
break;
case "shutdown":
CompositorService.shutdown();
break;
}
});
};
}
function executeAction(action) {
// Default behavior or custom command handled by CompositorService
switch (action) {
case "lock":
if (PanelService.lockScreen && !PanelService.lockScreen.active) {
PanelService.lockScreen.active = true;
}
break;
case "suspend":
if (Settings.data.general.lockOnSuspend) {
CompositorService.lockAndSuspend();
} else {
CompositorService.suspend();
}
break;
case "hibernate":
CompositorService.hibernate();
break;
case "reboot":
CompositorService.reboot();
break;
case "rebootToUefi":
CompositorService.rebootToUefi();
break;
case "userspaceReboot":
CompositorService.userspaceReboot();
break;
case "logout":
CompositorService.logout();
break;
case "shutdown":
CompositorService.shutdown();
break;
}
}
}
+13 -13
View File
@@ -49,24 +49,24 @@ SmartPanel {
readonly property bool isSideBySide: root.compactMode && root.showAlbumArt
readonly property bool needsCava: root.showVisualizer && root.visualizerType !== "" && root.visualizerType !== "none" && root.isPanelOpen
readonly property bool needsSpectrum: root.showVisualizer && root.visualizerType !== "" && root.visualizerType !== "none" && root.isPanelOpen
onNeedsCavaChanged: {
if (root.needsCava) {
CavaService.registerComponent("mediaplayerpanel");
onNeedsSpectrumChanged: {
if (root.needsSpectrum) {
SpectrumService.registerComponent("mediaplayerpanel");
} else {
CavaService.unregisterComponent("mediaplayerpanel");
SpectrumService.unregisterComponent("mediaplayerpanel");
}
}
Component.onCompleted: {
if (root.needsCava) {
CavaService.registerComponent("mediaplayerpanel");
if (root.needsSpectrum) {
SpectrumService.registerComponent("mediaplayerpanel");
}
}
Component.onDestruction: {
CavaService.unregisterComponent("mediaplayerpanel");
SpectrumService.unregisterComponent("mediaplayerpanel");
}
panelContent: Item {
@@ -238,7 +238,7 @@ SmartPanel {
Loader {
anchors.fill: parent
z: 0
active: !!(root.needsCava && !root.showAlbumArt)
active: !!(root.needsSpectrum && !root.showAlbumArt)
sourceComponent: visualizerSource
}
@@ -276,7 +276,7 @@ SmartPanel {
anchors.fill: parent
anchors.margins: Style.marginS
z: 2
active: !!(root.needsCava && root.showAlbumArt)
active: !!(root.needsSpectrum && root.showAlbumArt)
sourceComponent: visualizerSource
}
}
@@ -492,7 +492,7 @@ SmartPanel {
NLinearSpectrum {
width: parent.width - Style.marginS
height: 20
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.4
barPosition: Settings.getBarPositionForScreen(root.screen?.name)
@@ -504,7 +504,7 @@ SmartPanel {
NMirroredSpectrum {
width: parent.width - Style.marginS
height: parent.height - Style.marginS
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.4
}
@@ -515,7 +515,7 @@ SmartPanel {
NWaveSpectrum {
width: parent.width - Style.marginS
height: parent.height - Style.marginS
values: CavaService.values
values: SpectrumService.values
fillColor: Color.mPrimary
opacity: 0.4
}
@@ -33,6 +33,7 @@ ColumnLayout {
property string valueEmptyColor: widgetData.emptyColor !== undefined ? widgetData.emptyColor : widgetMetadata.emptyColor
property bool valueShowBadge: widgetData.showBadge !== undefined ? widgetData.showBadge : widgetMetadata.showBadge
property real valuePillSize: widgetData.pillSize !== undefined ? widgetData.pillSize : widgetMetadata.pillSize
property string valueFontWeight: widgetData.fontWeight !== undefined ? widgetData.fontWeight : widgetMetadata.fontWeight
function saveSettings() {
var settings = Object.assign({}, widgetData || {});
@@ -52,6 +53,7 @@ ColumnLayout {
settings.emptyColor = valueEmptyColor;
settings.showBadge = valueShowBadge;
settings.pillSize = valuePillSize;
settings.fontWeight = valueFontWeight;
settingsChanged(settings);
}
@@ -115,6 +117,36 @@ ColumnLayout {
visible: !valueShowApplications
}
NComboBox {
id: fontWeightCombo
label: I18n.tr("bar.workspace.font-weight-label")
description: I18n.tr("bar.workspace.font-weight-description")
model: [
{
"key": "regular",
"name": I18n.tr("common.font-weight-regular")
},
{
"key": "medium",
"name": I18n.tr("common.font-weight-medium")
},
{
"key": "semibold",
"name": I18n.tr("common.font-weight-semibold")
},
{
"key": "bold",
"name": I18n.tr("common.font-weight-bold")
},
]
currentKey: widgetData.fontWeight || widgetMetadata.fontWeight
onSelected: key => {
valueFontWeight = key;
saveSettings();
}
minimumWidth: 200
}
NToggle {
label: I18n.tr("bar.workspace.hide-unoccupied-label")
description: I18n.tr("bar.workspace.hide-unoccupied-description")
@@ -154,6 +154,12 @@ Popup {
saveTimer.start();
}
}
function onSettingsSaved(newSettings) {
if (newSettings) {
root.updateWidgetSettings(root.sectionId, root.widgetIndex, newSettings);
}
}
}
function saveAndClose() {
@@ -172,19 +178,42 @@ Popup {
var pluginId = widgetId.replace("plugin:", "");
var manifest = PluginRegistry.getPluginManifest(pluginId);
if (!manifest || !manifest.entryPoints || !manifest.entryPoints.settings) {
Logger.w("DesktopWidgetSettingsDialog", "Plugin does not have settings:", pluginId);
return;
}
var pluginDir = PluginRegistry.getPluginDir(pluginId);
var settingsPath = "file://" + pluginDir + "/" + manifest.entryPoints.settings;
var loadVersion = PluginRegistry.pluginLoadVersions[pluginId] || 0;
var api = PluginService.getPluginAPI(pluginId);
settingsLoader.setSource(settingsPath + "?v=" + loadVersion, {
"pluginApi": api
});
var settingsPath;
if (manifest && manifest.entryPoints && manifest.entryPoints.desktopWidgetSettings) {
settingsPath = "file://" + pluginDir + "/" + manifest.entryPoints.desktopWidgetSettings;
var widgetSettings = {};
widgetSettings.data = widgetData || {};
widgetSettings.metadata = DesktopWidgetRegistry.widgetMetadata[widgetId] || {};
widgetSettings.save = function () {
var newSettings = Object.assign({}, widgetSettings.data);
root.settingsCache = newSettings;
saveTimer.start();
};
settingsLoader.setSource(settingsPath + "?v=" + loadVersion, {
"pluginApi": api,
"widgetSettings": widgetSettings
});
} else {
Logger.w("DesktopWidgetSettingsDialog", "Plugin does not have desktop widget settings:", pluginId);
// Fallback to the plugin settings
if (manifest && manifest.entryPoints && manifest.entryPoints.settings) {
settingsPath = "file://" + pluginDir + "/" + manifest.entryPoints.settings;
settingsLoader.setSource(settingsPath + "?v=" + loadVersion, {
"pluginApi": api
});
} else {
Logger.w("DesktopWidgetSettingsDialog", "Plugin does not have settings:", pluginId);
}
}
return;
}
@@ -0,0 +1,154 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import qs.Commons
import qs.Widgets
ColumnLayout {
id: root
spacing: Style.marginM
property var widgetData: null
property var widgetMetadata: null
signal settingsChanged(var settings)
property int valueWidth: widgetData.width !== undefined ? widgetData.width : widgetMetadata.width
property int valueHeight: widgetData.height !== undefined ? widgetData.height : widgetMetadata.height
property string valueVisualizerType: widgetData.visualizerType !== undefined ? widgetData.visualizerType : widgetMetadata.visualizerType
property string valueColorName: widgetData.colorName !== undefined ? widgetData.colorName : widgetMetadata.colorName
property bool valueHideWhenIdle: widgetData.hideWhenIdle !== undefined ? widgetData.hideWhenIdle : widgetMetadata.hideWhenIdle
property bool valueShowBackground: widgetData.showBackground !== undefined ? widgetData.showBackground : widgetMetadata.showBackground
property bool valueRoundedCorners: widgetData.roundedCorners !== undefined ? widgetData.roundedCorners : widgetMetadata.roundedCorners
function saveSettings() {
var settings = Object.assign({}, widgetData || {});
settings.width = valueWidth;
settings.height = valueHeight;
settings.visualizerType = valueVisualizerType;
settings.colorName = valueColorName;
settings.hideWhenIdle = valueHideWhenIdle;
settings.showBackground = valueShowBackground;
settings.roundedCorners = valueRoundedCorners;
settingsChanged(settings);
}
NTextInput {
id: widthInput
Layout.fillWidth: true
label: I18n.tr("common.width")
description: I18n.tr("bar.audio-visualizer.width-description")
text: String(valueWidth)
placeholderText: I18n.tr("placeholders.enter-width-pixels")
inputMethodHints: Qt.ImhDigitsOnly
onEditingFinished: {
const parsed = parseInt(text);
if (!isNaN(parsed) && parsed > 0) {
valueWidth = parsed;
saveSettings();
} else {
text = String(valueWidth);
}
}
defaultValue: String(widgetMetadata.width)
}
NTextInput {
id: heightInput
Layout.fillWidth: true
label: I18n.tr("common.height")
description: I18n.tr("bar.audio-visualizer.height-description")
text: String(valueHeight)
placeholderText: I18n.tr("placeholders.enter-width-pixels")
inputMethodHints: Qt.ImhDigitsOnly
onEditingFinished: {
const parsed = parseInt(text);
if (!isNaN(parsed) && parsed > 0) {
valueHeight = parsed;
saveSettings();
} else {
text = String(valueHeight);
}
}
defaultValue: String(widgetMetadata.height)
}
NComboBox {
Layout.fillWidth: true
label: I18n.tr("panels.audio.visualizer-type-label")
description: I18n.tr("panels.desktop-widgets.media-player-visualizer-type-description")
model: [
{
"key": "linear",
"name": I18n.tr("options.visualizer-types.linear")
},
{
"key": "mirrored",
"name": I18n.tr("options.visualizer-types.mirrored")
},
{
"key": "wave",
"name": I18n.tr("options.visualizer-types.wave")
}
]
currentKey: valueVisualizerType
onSelected: key => {
valueVisualizerType = key;
saveSettings();
}
defaultValue: widgetMetadata.visualizerType
}
NColorChoice {
Layout.fillWidth: true
label: I18n.tr("bar.audio-visualizer.color-name-label")
description: I18n.tr("bar.audio-visualizer.color-name-description")
currentKey: valueColorName
onSelected: key => {
valueColorName = key;
saveSettings();
}
defaultValue: widgetMetadata.colorName
}
NToggle {
Layout.fillWidth: true
label: I18n.tr("bar.audio-visualizer.hide-when-idle-label")
description: I18n.tr("bar.audio-visualizer.hide-when-idle-description")
checked: valueHideWhenIdle
onToggled: checked => {
valueHideWhenIdle = checked;
saveSettings();
}
defaultValue: widgetMetadata.hideWhenIdle
}
NDivider {
Layout.fillWidth: true
}
NToggle {
Layout.fillWidth: true
label: I18n.tr("panels.desktop-widgets.clock-show-background-label")
description: I18n.tr("panels.desktop-widgets.media-player-show-background-description")
checked: valueShowBackground
onToggled: checked => {
valueShowBackground = checked;
saveSettings();
}
defaultValue: widgetMetadata.showBackground
}
NToggle {
Layout.fillWidth: true
visible: valueShowBackground
label: I18n.tr("panels.desktop-widgets.clock-rounded-corners-label")
description: I18n.tr("panels.desktop-widgets.media-player-rounded-corners-description")
checked: valueRoundedCorners
onToggled: checked => {
valueRoundedCorners = checked;
saveSettings();
}
defaultValue: widgetMetadata.roundedCorners
}
}
+3 -2
View File
@@ -624,8 +624,8 @@ Item {
"source": regionTab
},
{
"id": SettingsPanel.Tab.SystemMonitor,
"label": "system-monitor.title",
"id": SettingsPanel.Tab.System,
"label": "panels.system.title",
"icon": "settings-system-monitor",
"source": systemMonitorTab
},
@@ -1264,6 +1264,7 @@ Item {
anchors.fill: parent
horizontalPolicy: ScrollBar.AlwaysOff
verticalPolicy: ScrollBar.AsNeeded
showScrollbarWhenScrollable: true
leftPadding: Style.marginL
topPadding: Style.marginL
bottomPadding: Style.marginL
+1 -1
View File
@@ -89,7 +89,7 @@ SmartPanel {
Notifications,
Plugins,
SessionMenu,
SystemMonitor,
System,
UserInterface,
Wallpaper
}
@@ -32,22 +32,34 @@ ColumnLayout {
property string currentVersion: UpdateService.currentVersion
property string commitInfo: ""
property string qsVersion: ""
property string qsRevision: ""
readonly property bool isGitVersion: root.currentVersion.endsWith("-git")
readonly property int gigaB: (1024 * 1024 * 1024)
readonly property int gigaD: (1000 * 1000 * 1000)
// Update status: compare versions (strip -git suffix for comparison)
readonly property string installedBase: root.currentVersion.replace("-git", "")
// Update status: compare versions
readonly property bool updateAvailable: {
if (!root.latestVersion || !root.installedBase)
if (!root.latestVersion || !root.currentVersion || root.latestVersion === I18n.tr("common.unknown"))
return false;
return root.latestVersion !== root.installedBase && !root.isGitVersion;
return UpdateService.compareVersions(root.latestVersion, root.currentVersion) > 0 && !root.isGitVersion;
}
readonly property bool isUpToDate: {
if (!root.latestVersion || !root.installedBase)
if (!root.latestVersion || !root.currentVersion || root.latestVersion === I18n.tr("common.unknown"))
return false;
return root.latestVersion === root.installedBase;
return UpdateService.compareVersions(root.latestVersion, root.currentVersion) <= 0;
}
readonly property bool qsUpdateAvailable: {
if (!GitHubService.latestQSVersion || !root.qsVersion || GitHubService.latestQSVersion === I18n.tr("common.unknown"))
return false;
return UpdateService.compareVersions(GitHubService.latestQSVersion, root.qsVersion) > 0;
}
readonly property bool qsIsUpToDate: {
if (!GitHubService.latestQSVersion || !root.qsVersion || GitHubService.latestQSVersion === I18n.tr("common.unknown"))
return false;
return UpdateService.compareVersions(GitHubService.latestQSVersion, root.qsVersion) <= 0;
}
// System info properties
@@ -116,15 +128,21 @@ ColumnLayout {
}
function copyInfoToClipboard() {
let info = "Noctalia Shell\n";
info += "==============\n";
info += "Installed version: " + root.currentVersion + "\n";
let info = "Noctalia Shell: " + root.currentVersion;
if (root.isGitVersion && root.commitInfo) {
info += "Git commit: " + root.commitInfo + "\n";
info += " (" + root.commitInfo + ")";
}
info += "\n";
if (root.qsVersion) {
info += "noctalia-qs version: " + root.qsVersion + "\n";
let qsV = root.qsVersion.startsWith("v") ? root.qsVersion : "v" + root.qsVersion;
info += "Noctalia QS: " + qsV;
if (root.qsRevision) {
info += " (" + root.qsRevision + ")";
}
info += "\n";
}
info += "\nSystem Information\n";
info += "==================\n";
if (root.systemInfo) {
@@ -132,6 +150,7 @@ ColumnLayout {
const kernel = root.getModule("Kernel");
const title = root.getModule("Title");
const product = root.getModule("Host");
const board = root.getModule("Board");
const cpu = root.getModule("CPU");
const gpu = root.getModule("GPU");
const mem = root.getModule("Memory");
@@ -140,6 +159,7 @@ ColumnLayout {
info += "Kernel: " + (kernel?.result?.release || "N/A") + "\n";
info += "Host: " + (title?.result?.hostName || "N/A") + "\n";
info += "Product: " + (product?.result?.name || "N/A") + "\n";
info += "Board: " + (board?.result?.name || "N/A") + "\n";
info += "CPU: " + (cpu?.result?.cpu || "N/A") + "\n";
if (gpu?.result && Array.isArray(gpu.result) && gpu.result.length > 0) {
info += "GPU: " + gpu.result.map(g => g.name || "Unknown").join(", ") + "\n";
@@ -190,90 +210,11 @@ ColumnLayout {
Logger.d("VersionSubTab", "Component.onCompleted - Could not extract commit from NixOS path, trying fallback");
}
}
fetchGitCommit();
return;
} else {
// On non-NixOS systems, check for pacman first.
whichPacmanProcess.running = true;
return;
}
fetchGitCommit();
}
}
Timer {
id: gitFallbackTimer
interval: 500
running: false
onTriggered: {
if (!root.commitInfo) {
fetchGitCommit();
}
}
}
Process {
id: whichPacmanProcess
command: ["sh", "-c", "command -v pacman"]
running: false
onExited: function (exitCode) {
if (exitCode === 0) {
Logger.d("VersionSubTab", "whichPacmanProcess - pacman found, starting query");
pacmanProcess.running = true;
gitFallbackTimer.start();
} else {
Logger.d("VersionSubTab", "whichPacmanProcess - pacman not found, falling back to git");
fetchGitCommit();
}
}
}
Process {
id: pacmanProcess
command: ["pacman", "-Q", "noctalia-shell-git"]
running: false
onStarted: {
gitFallbackTimer.stop();
}
onExited: function (exitCode) {
gitFallbackTimer.stop();
Logger.d("VersionSubTab", "pacmanProcess - Process exited with code:", exitCode);
if (exitCode === 0) {
var output = stdout.text.trim();
Logger.d("VersionSubTab", "pacmanProcess - Output:", output);
var match = output.match(/noctalia-shell-git\s+(.+)/);
if (match && match[1]) {
// For Arch packages, the version format might be like: 3.4.0.r112.g3f00bec8-1
// Extract just the commit hash part if it exists
var version = match[1];
var commitMatch = version.match(/\.g([0-9a-f]{7,})/i);
if (commitMatch && commitMatch[1]) {
// Show short hash (first 7 characters)
root.commitInfo = commitMatch[1].substring(0, 7);
Logger.d("VersionSubTab", "pacmanProcess - Set commitInfo from Arch package:", root.commitInfo);
return; // Successfully got commit hash from Arch package
} else {
// If no commit hash in version format, still try git repo
Logger.d("VersionSubTab", "pacmanProcess - No commit hash in version, trying git");
fetchGitCommit();
}
} else {
// Unexpected output format, try git
Logger.d("VersionSubTab", "pacmanProcess - Unexpected output format, trying git");
fetchGitCommit();
}
} else {
// If not on Arch, try to get git commit from repository
Logger.d("VersionSubTab", "pacmanProcess - Package not found, trying git");
fetchGitCommit();
}
}
stdout: StdioCollector {}
stderr: StdioCollector {}
}
function fetchGitCommit() {
var shellDir = Quickshell.shellDir || "";
Logger.d("VersionSubTab", "fetchGitCommit - shellDir:", shellDir);
@@ -319,9 +260,10 @@ ColumnLayout {
var output = stdout.text.trim();
// Format: "noctalia-qs 0.3.0, revision abc12345, distributed by: ..."
// Only set if this is actually noctalia-qs; leave empty for upstream quickshell
var match = output.match(/noctalia-qs\s+(\S+),\s+revision\s+([0-9a-f]+)/i);
var match = output.match(/noctalia-qs\s+(\S+),\s+revision\s*([0-9a-f]*)/i);
if (match) {
root.qsVersion = match[1] + " (" + match[2] + ")";
root.qsVersion = match[1];
root.qsRevision = match[2];
}
}
}
@@ -432,8 +374,7 @@ ColumnLayout {
ColumnLayout {
NHeader {
label: I18n.tr("panels.about.noctalia-title")
// description: I18n.tr("panels.about.noctalia-desc")
label: "Noctalia Shell"
}
// Versions
@@ -442,20 +383,9 @@ ColumnLayout {
rowSpacing: Style.marginXS
columnSpacing: Style.marginM
// Installed Version (Shell)
NText {
text: I18n.tr("panels.about.noctalia-latest-version")
color: Color.mOnSurfaceVariant
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
NText {
text: root.latestVersion
color: Color.mOnSurface
font.weight: Style.fontWeightBold
}
NText {
text: I18n.tr("panels.about.noctalia-installed-version")
text: "Noctalia Shell:"
color: Color.mOnSurfaceVariant
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
@@ -469,6 +399,34 @@ ColumnLayout {
font.weight: Style.fontWeightBold
}
// Git commit in parentheses
NText {
id: commitText
visible: root.isGitVersion
text: "(" + (root.commitInfo || I18n.tr("common.loading")) + ")"
color: commitMouseArea.containsMouse ? Color.mPrimary : Color.mOnSurfaceVariant
pointSize: Style.fontSizeXS
font.underline: commitMouseArea.containsMouse && root.commitInfo
MouseArea {
id: commitMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: root.commitInfo ? Qt.PointingHandCursor : Qt.ArrowCursor
onEntered: {
if (root.commitInfo) {
TooltipService.show(commitText, I18n.tr("panels.about.view-commit"));
}
}
onExited: TooltipService.hide()
onClicked: {
if (root.commitInfo) {
Quickshell.execDetached(["xdg-open", "https://github.com/noctalia-dev/noctalia-shell/commit/" + root.commitInfo]);
}
}
}
}
// Update status indicator
NIcon {
id: upToDateIcon
@@ -501,54 +459,113 @@ ColumnLayout {
}
}
// Latest Version (Shell)
NText {
visible: root.isGitVersion
text: I18n.tr("panels.about.noctalia-git-commit")
visible: root.updateAvailable
text: I18n.tr("panels.about.noctalia-available")
color: Color.mOnSurfaceVariant
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
// Clickable git commit
NText {
id: commitText
visible: root.isGitVersion
text: root.commitInfo || I18n.tr("common.loading")
color: root.commitInfo ? Color.mPrimary : Color.mOnSurface
pointSize: Style.fontSizeXS
font.underline: commitMouseArea.containsMouse && root.commitInfo
visible: root.updateAvailable
text: root.latestVersion
color: Color.mOnSurface
font.weight: Style.fontWeightBold
}
MouseArea {
id: commitMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: root.commitInfo ? Qt.PointingHandCursor : Qt.ArrowCursor
onEntered: {
if (root.commitInfo) {
TooltipService.show(commitText, I18n.tr("panels.about.view-commit"));
// Divider-like spacing
Item {
visible: root.qsUpdateAvailable || root.updateAvailable
Layout.columnSpan: 2
Layout.preferredHeight: Style.marginXS
}
// Quickshell Version
NText {
visible: root.qsVersion !== ""
text: "Noctalia QS:"
color: Color.mOnSurfaceVariant
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
RowLayout {
visible: root.qsVersion !== ""
spacing: Style.marginS
NText {
text: root.qsVersion.startsWith("v") ? root.qsVersion : "v" + root.qsVersion
color: Color.mOnSurface
font.weight: Style.fontWeightBold
}
// Git revision in parentheses
NText {
id: qsRevisionText
visible: root.qsRevision !== ""
text: "(" + root.qsRevision + ")"
color: qsRevisionMouseArea.containsMouse ? Color.mPrimary : Color.mOnSurfaceVariant
pointSize: Style.fontSizeXS
font.underline: qsRevisionMouseArea.containsMouse
MouseArea {
id: qsRevisionMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onEntered: TooltipService.show(qsRevisionText, I18n.tr("panels.about.view-commit"))
onExited: TooltipService.hide()
onClicked: {
Quickshell.execDetached(["xdg-open", "https://github.com/noctalia-dev/noctalia-qs/commit/" + root.qsRevision]);
}
}
onExited: TooltipService.hide()
onClicked: {
if (root.commitInfo) {
Quickshell.execDetached(["xdg-open", "https://github.com/noctalia-dev/noctalia-shell/commit/" + root.commitInfo]);
}
}
// Update status indicator
NIcon {
id: qsUpToDateIcon
visible: root.qsIsUpToDate
icon: "circle-check"
pointSize: Style.fontSizeM
color: Color.mPrimary
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: TooltipService.show(qsUpToDateIcon, I18n.tr("panels.about.up-to-date"))
onExited: TooltipService.hide()
}
}
NIcon {
id: qsUpdateAvailableIcon
visible: root.qsUpdateAvailable
icon: "arrow-up-circle"
pointSize: Style.fontSizeS
color: Color.mPrimary
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: TooltipService.show(qsUpdateAvailableIcon, I18n.tr("panels.about.update-available"))
onExited: TooltipService.hide()
}
}
}
// Latest Quickshell Version
NText {
visible: root.qsVersion !== ""
text: I18n.tr("panels.about.noctalia-qs-version")
visible: root.qsUpdateAvailable
text: I18n.tr("panels.about.noctalia-available")
color: Color.mOnSurfaceVariant
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
NText {
visible: root.qsVersion !== ""
text: root.qsVersion
visible: root.qsUpdateAvailable
text: GitHubService.latestQSVersion
color: Color.mOnSurface
font.weight: Style.fontWeightBold
pointSize: Style.fontSizeXS
}
}
}
@@ -705,6 +722,23 @@ ColumnLayout {
wrapMode: Text.Wrap
}
// Board name
NText {
text: I18n.tr("panels.about.system-board")
color: Color.mOnSurfaceVariant
pointSize: sysInfo.textSize
}
NText {
text: {
const title = root.getModule("Board");
return title?.result?.name || "N/A";
}
color: Color.mOnSurface
pointSize: sysInfo.textSize
Layout.fillWidth: true
wrapMode: Text.Wrap
}
// Uptime
NText {
text: I18n.tr("panels.about.system-uptime")
@@ -82,8 +82,8 @@ ColumnLayout {
})
}
]
currentKey: Settings.data.audio.cavaFrameRate
defaultValue: Settings.getDefaultValue("audio.cavaFrameRate")
onSelected: key => Settings.data.audio.cavaFrameRate = key
currentKey: Settings.data.audio.spectrumFrameRate
defaultValue: Settings.getDefaultValue("audio.spectrumFrameRate")
onSelected: key => Settings.data.audio.spectrumFrameRate = key
}
}
@@ -315,7 +315,7 @@ ColumnLayout {
Layout.fillWidth: true
label: I18n.tr("panels.bar.appearance-margins-vertical")
from: 0
to: 18
to: 500
stepSize: 1
showReset: true
value: Settings.data.bar.marginVertical
@@ -328,7 +328,7 @@ ColumnLayout {
Layout.fillWidth: true
label: I18n.tr("panels.bar.appearance-margins-horizontal")
from: 0
to: 18
to: 500
stepSize: 1
showReset: true
value: Settings.data.bar.marginHorizontal
@@ -33,6 +33,10 @@ ColumnLayout {
required property var modelData
readonly property string screenName: modelData.name || "Unknown"
readonly property real compositorScale: {
const info = CompositorService.displayScales[screenName];
return (info && info.scale) ? info.scale : 1.0;
}
readonly property bool barEnabled: (Settings.data.bar.monitors || []).indexOf(screenName) !== -1
readonly property bool hasOverride: Settings.hasScreenOverride(screenName)
@@ -67,12 +71,11 @@ ColumnLayout {
NText {
text: {
const compositorScale = CompositorService.getDisplayScale(monitorCard.screenName);
return I18n.tr("system.monitor-description", {
"model": monitorCard.modelData.model || I18n.tr("common.unknown"),
"width": Math.round(monitorCard.modelData.width * compositorScale),
"height": Math.round(monitorCard.modelData.height * compositorScale),
"scale": compositorScale
"width": Math.round(monitorCard.modelData.width * monitorCard.compositorScale),
"height": Math.round(monitorCard.modelData.height * monitorCard.compositorScale),
"scale": monitorCard.compositorScale
});
}
pointSize: Style.fontSizeS
@@ -47,6 +47,18 @@ ColumnLayout {
paths.push(app.outputs[k].path);
}
path = paths.join("\n");
} else if (app.id === "emacs") {
// Emacs clients are detected dynamically by ProgramCheckerService
var emacsClients = ProgramCheckerService.availableEmacsClients;
if (emacsClients && emacsClients.length > 0) {
var emacsPaths = [];
for (var k = 0; k < emacsClients.length; k++) {
emacsPaths.push(emacsClients[k].path);
}
path = emacsPaths.join("\n");
} else {
path = I18n.tr("panels.color-scheme.templates-none-detected");
}
} else if (app.clients && app.clients.length > 0) {
var validClients = [];
for (var k = 0; k < app.clients.length; k++) {
@@ -553,10 +553,13 @@ Item {
columnSpacing: Style.marginM
rowSpacing: Style.marginXS
// --- Item 1: Signal Strength ---
RowLayout {
Layout.fillWidth: true
Layout.preferredWidth: 1
spacing: Style.marginXS
Layout.row: detailsGrid ? 0 : 0
Layout.column: 0
NIcon {
icon: BluetoothService.getSignalIcon(modelData)
pointSize: Style.fontSizeXS
@@ -569,9 +572,13 @@ Item {
Layout.fillWidth: true
}
}
// --- Item 2: Battery ---
RowLayout {
Layout.fillWidth: true
Layout.preferredWidth: 1
Layout.row: detailsGrid ? 0 : 1
Layout.column: detailsGrid ? 1 : 0
spacing: Style.marginXS
NIcon {
icon: {
@@ -591,8 +598,12 @@ Item {
Layout.fillWidth: true
}
}
// --- Item 3: Pair state ---
RowLayout {
Layout.fillWidth: true
Layout.preferredWidth: 1
Layout.row: detailsGrid ? 1 : 2
Layout.column: 0
spacing: Style.marginXS
NIcon {
icon: "link"
@@ -606,8 +617,12 @@ Item {
Layout.fillWidth: true
}
}
// --- Item 4: Trust state ---
RowLayout {
Layout.fillWidth: true
Layout.preferredWidth: 1
Layout.row: detailsGrid ? 1 : 3
Layout.column: detailsGrid ? 1 : 0
spacing: Style.marginXS
NIcon {
icon: "shield-check"
@@ -621,9 +636,12 @@ Item {
Layout.fillWidth: true
}
}
// --- Item 5: Address ---
RowLayout {
Layout.fillWidth: true
Layout.columnSpan: infoColumn.columns === 2 ? 2 : 1
Layout.preferredWidth: 1
Layout.row: detailsGrid ? 2 : 4
Layout.column: 0
spacing: Style.marginXS
NIcon {
icon: "hash"
@@ -637,6 +655,39 @@ Item {
Layout.fillWidth: true
}
}
// --- Item 6: Auto-connect ---
RowLayout {
Layout.fillWidth: true
Layout.preferredWidth: 1
Layout.row: detailsGrid ? 2 : 5
Layout.column: detailsGrid ? 1 : 0
spacing: Style.marginXS
visible: Settings.data.network.bluetoothAutoConnect
NIcon {
icon: BluetoothService.getDeviceAutoConnect(modelData.address) ? "repeat" : "repeat-off"
pointSize: Style.fontSizeXS
color: BluetoothService.getDeviceAutoConnect(modelData.address) ? Color.mPrimary : Color.mOnSurface
Layout.alignment: Qt.AlignVCenter
}
NText {
text: I18n.tr("common.auto-connect")
pointSize: Style.fontSizeXS
color: BluetoothService.getDeviceAutoConnect(modelData.address) ? Color.mOnSurface : Color.mOnSurfaceVariant
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
MouseArea {
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onEntered: TooltipService.show(parent, BluetoothService.getDeviceAutoConnect(modelData.address) ? I18n.tr("tooltips.bluetooth-auto-connect-on") : I18n.tr("tooltips.bluetooth-auto-connect-off"))
onExited: TooltipService.hide()
onClicked: BluetoothService.setDeviceAutoConnect(modelData, !BluetoothService.getDeviceAutoConnect(modelData.address))
}
}
}
}
}
}
@@ -80,11 +80,14 @@ ColumnLayout {
NSectionEditor {
required property var modelData
readonly property real compositorScale: {
const info = CompositorService.displayScales[modelData.name];
return (info && info.scale) ? info.scale : 1.0;
}
Layout.fillWidth: true
sectionName: modelData.name
sectionSubtitle: {
var compositorScale = CompositorService.getDisplayScale(modelData.name);
// Format scale to 2 decimal places to prevent overly long text
var formattedScale = compositorScale.toFixed(2);
return "(" + modelData.width + "x" + modelData.height + " @ " + formattedScale + "x)";
@@ -266,6 +269,9 @@ ColumnLayout {
} else if (widgetId === "MediaPlayer") {
newWidget.x = 100;
newWidget.y = 200;
} else if (widgetId === "AudioVisualizer") {
newWidget.x = 120;
newWidget.y = 280;
} else if (widgetId === "Weather") {
newWidget.x = 100;
newWidget.y = 300;
@@ -107,8 +107,11 @@ ColumnLayout {
NText {
Layout.fillWidth: true
readonly property real compositorScale: {
const info = CompositorService.displayScales[modelData.name];
return (info && info.scale) ? info.scale : 1.0;
}
text: {
const compositorScale = CompositorService.getDisplayScale(modelData.name);
I18n.tr("system.monitor-description", {
"model": modelData.model,
"width": modelData.width * compositorScale,
@@ -35,9 +35,12 @@ ColumnLayout {
model: Quickshell.screens || []
delegate: NCheckbox {
Layout.fillWidth: true
readonly property real compositorScale: {
const info = CompositorService.displayScales[modelData.name];
return (info && info.scale) ? info.scale : 1.0;
}
label: modelData.name || "Unknown"
description: {
const compositorScale = CompositorService.getDisplayScale(modelData.name);
I18n.tr("system.monitor-description", {
"model": modelData.model,
"width": modelData.width * compositorScale,
@@ -35,9 +35,12 @@ ColumnLayout {
model: Quickshell.screens || []
delegate: NCheckbox {
Layout.fillWidth: true
readonly property real compositorScale: {
const info = CompositorService.displayScales[modelData.name];
return (info && info.scale) ? info.scale : 1.0;
}
label: modelData.name || "Unknown"
description: {
const compositorScale = CompositorService.getDisplayScale(modelData.name);
I18n.tr("system.monitor-description", {
"model": modelData.model,
"width": modelData.width * compositorScale,
@@ -122,9 +122,12 @@ ColumnLayout {
model: Quickshell.screens || []
delegate: NCheckbox {
Layout.fillWidth: true
readonly property real compositorScale: {
const info = CompositorService.displayScales[modelData.name];
return (info && info.scale) ? info.scale : 1.0;
}
label: modelData.name || I18n.tr("common.unknown")
description: {
const compositorScale = CompositorService.getDisplayScale(modelData.name);
I18n.tr("system.monitor-description", {
"model": modelData.model,
"width": modelData.width * compositorScale,
@@ -114,9 +114,12 @@ ColumnLayout {
model: Quickshell.screens || []
delegate: NCheckbox {
Layout.fillWidth: true
readonly property real compositorScale: {
const info = CompositorService.displayScales[modelData.name];
return (info && info.scale) ? info.scale : 1.0;
}
label: modelData.name || I18n.tr("common.unknown")
description: {
const compositorScale = CompositorService.getDisplayScale(modelData.name);
I18n.tr("system.monitor-description", {
"model": modelData.model,
"width": modelData.width * compositorScale,
@@ -65,15 +65,42 @@ ColumnLayout {
function saveEntries() {
var toSave = [];
var enabledNumber = 1;
for (var i = 0; i < entriesModel.length; i++) {
var keybind = entriesModel[i].keybind || "";
if (entriesModel[i].enabled) {
// For enabled entries with numeric or empty keybinds, assign sequential number
if (keybind === "" || /^\d+$/.test(keybind)) {
keybind = String(enabledNumber);
}
enabledNumber++;
} else {
// For disabled entries with numeric keybinds, clear them
if (/^\d+$/.test(keybind)) {
keybind = "";
}
}
toSave.push({
"action": entriesModel[i].id,
"enabled": entriesModel[i].enabled,
"countdownEnabled": entriesModel[i].countdownEnabled !== undefined ? entriesModel[i].countdownEnabled : true,
"command": entriesModel[i].command || "",
"keybind": entriesModel[i].keybind || ""
"keybind": keybind
});
}
// Update local model with renumbered keybinds
var newModel = [];
for (var i = 0; i < entriesModel.length; i++) {
newModel.push(Object.assign({}, entriesModel[i], {
"keybind": toSave[i].keybind
}));
}
entriesModel = newModel;
Settings.data.sessionMenu.powerOptions = toSave;
}
@@ -0,0 +1,29 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import qs.Commons
import qs.Widgets
ColumnLayout {
id: root
spacing: Style.marginL
Layout.fillWidth: true
NToggle {
Layout.fillWidth: true
label: I18n.tr("panels.system.noctalia-performance-disable-wallpaper-label")
description: I18n.tr("panels.system.noctalia-performance-disable-wallpaper-description")
checked: !Settings.data.noctaliaPerformance.disableWallpaper
defaultValue: !Settings.getDefaultValue("noctaliaPerformance.disableWallpaper")
onToggled: checked => Settings.data.noctaliaPerformance.disableWallpaper = !checked
}
NToggle {
Layout.fillWidth: true
label: I18n.tr("panels.system.noctalia-performance-disable-desktop-widgets-label")
description: I18n.tr("panels.system.noctalia-performance-disable-desktop-widgets-description")
checked: !Settings.data.noctaliaPerformance.disableDesktopWidgets
defaultValue: !Settings.getDefaultValue("noctaliaPerformance.disableDesktopWidgets")
onToggled: checked => Settings.data.noctaliaPerformance.disableDesktopWidgets = !checked
}
}
@@ -18,7 +18,7 @@ ColumnLayout {
currentIndex: tabView.currentIndex
NTabButton {
text: I18n.tr("common.general")
text: I18n.tr("system-monitor.title")
tabIndex: 0
checked: subTabBar.currentIndex === 0
}
@@ -27,6 +27,11 @@ ColumnLayout {
tabIndex: 1
checked: subTabBar.currentIndex === 1
}
NTabButton {
text: I18n.tr("common.performance")
tabIndex: 2
checked: subTabBar.currentIndex === 2
}
}
Item {
@@ -42,5 +47,6 @@ ColumnLayout {
screen: root.screen
}
ThresholdsSubTab {}
PerformanceSubTab {}
}
}
@@ -33,6 +33,14 @@ ColumnLayout {
onToggled: checked => Settings.data.general.enableShadows = checked
}
NToggle {
label: I18n.tr("panels.user-interface.blur-behind-label")
description: I18n.tr("panels.user-interface.blur-behind-description")
checked: Settings.data.general.enableBlurBehind
defaultValue: Settings.getDefaultValue("general.enableBlurBehind")
onToggled: checked => Settings.data.general.enableBlurBehind = checked
}
NComboBox {
visible: Settings.data.general.enableShadows
label: I18n.tr("panels.user-interface.shadows-direction-label")
+4 -1
View File
@@ -177,10 +177,13 @@ ColumnLayout {
model: Quickshell.screens || []
delegate: NCheckbox {
Layout.fillWidth: true
readonly property real compositorScale: {
const info = CompositorService.displayScales[modelData.name];
return (info && info.scale) ? info.scale : 1.0;
}
label: modelData.name || "Unknown"
visible: Settings.data.dock.enabled
description: {
const compositorScale = CompositorService.getDisplayScale(modelData.name);
I18n.tr("system.monitor-description", {
"model": modelData.model,
"width": modelData.width * compositorScale,
@@ -136,6 +136,7 @@ SmartPanel {
maxValue2: Math.max(SystemStatService.cpuTempHistoryMax + 5, 1)
color: Color.mPrimary
color2: Color.mSecondary
strokeWidth: 1.5 * Style.uiScaleRatio
fill: true
fillOpacity: 0.15
updateInterval: SystemStatService.cpuUsageIntervalMs
@@ -189,6 +190,7 @@ SmartPanel {
minValue: 0
maxValue: 100
color: Color.mPrimary
strokeWidth: 1.5 * Style.uiScaleRatio
fill: true
fillOpacity: 0.15
updateInterval: SystemStatService.memIntervalMs
@@ -260,6 +262,7 @@ SmartPanel {
maxValue2: SystemStatService.txMaxSpeed
color: Color.mPrimary
color2: Color.mSecondary
strokeWidth: 1.5 * Style.uiScaleRatio
fill: true
fillOpacity: 0.15
updateInterval: SystemStatService.networkIntervalMs
+12 -9
View File
@@ -19,7 +19,8 @@ Item {
signal hidden
readonly property int notificationWidth: Math.round(440 * Style.uiScaleRatio)
readonly property bool isCompact: Settings.data.notifications?.density === "compact"
readonly property int notificationWidth: Math.round((isCompact ? 320 : 440) * Style.uiScaleRatio)
readonly property int shadowPadding: Style.shadowBlurMax + Style.marginL
width: notificationWidth + shadowPadding * 2
@@ -282,11 +283,11 @@ Item {
RowLayout {
id: contentLayout
anchors.fill: background
anchors.topMargin: Style.marginM
anchors.bottomMargin: Style.marginM
anchors.leftMargin: Style.margin2M
anchors.rightMargin: Style.margin2M
spacing: Style.marginL
anchors.topMargin: isCompact ? Style.marginS : Style.marginM
anchors.bottomMargin: isCompact ? Style.marginS : Style.marginM
anchors.leftMargin: isCompact ? Style.marginM : Style.margin2M
anchors.rightMargin: isCompact ? Style.marginM : Style.margin2M
spacing: isCompact ? Style.marginM : Style.marginL
// Icon
NIcon {
@@ -309,7 +310,7 @@ Item {
return Color.mOnSurface;
}
}
pointSize: Style.fontSizeXXL * 1.5
pointSize: isCompact ? Style.fontSizeXL : Style.fontSizeXXL * 1.5
Layout.alignment: Qt.AlignVCenter
}
@@ -323,7 +324,7 @@ Item {
Layout.fillWidth: true
text: root.title
color: Color.mOnSurface
pointSize: Style.fontSizeL
pointSize: isCompact ? Style.fontSizeM : Style.fontSizeL
font.weight: Style.fontWeightBold
wrapMode: Text.WordWrap
visible: text.length > 0
@@ -333,8 +334,10 @@ Item {
Layout.fillWidth: true
text: root.description
color: Color.mOnSurface
pointSize: Style.fontSizeM
pointSize: isCompact ? Style.fontSizeS : Style.fontSizeM
wrapMode: Text.WordWrap
maximumLineCount: isCompact ? 2 : 20
elide: isCompact ? Text.ElideRight : Text.ElideNone
visible: text.length > 0
}
+1 -1
View File
@@ -1,4 +1,4 @@
# Noctalia shell
# Noctalia Shell
**_quiet by design_**
+1 -1
View File
@@ -241,7 +241,7 @@ cava)
# Reload cava if it's running, but only if it's not using stdin config
if pgrep -f cava >/dev/null; then
# Check if Cava is running with -p /dev/stdin (managed by CavaService)
# Check if Cava is running with -p /dev/stdin (standalone cava)
if ! pgrep -af cava | grep -q -- "-p.*stdin"; then
pkill -USR1 cava
fi
+16 -6
View File
@@ -48,14 +48,16 @@ def safe_get_time(ical_time):
except:
return None, False
def add_event(summary, calendar_name, start_ts, end_ts, location="", description="", all_day=False):
def add_event(summary, calendar_name, start_ts, end_ts, location="", description="", all_day=False, calendar_uid="", uid=""):
all_events.append({
'calendar': calendar_name,
'summary': summary,
'start': start_ts,
'end': end_ts,
'location': location,
'description': description
'description': description,
'calendar_uid': calendar_uid,
'uid': uid
})
registry = EDataServer.SourceRegistry.new_sync(None)
@@ -69,7 +71,7 @@ for source in sources:
print(f"\nProcessing calendar: {calendar_name}", file=sys.stderr)
try:
client = ECal.Client.connect_sync(source, ECal.ClientSourceType.EVENTS, 30, None)
client = ECal.Client.connect_sync(source, ECal.ClientSourceType.EVENTS, 5, None)
start_dt = datetime.fromtimestamp(start_time)
end_dt = datetime.fromtimestamp(end_time)
@@ -101,15 +103,21 @@ for source in sources:
summary = getattr(obj, "get_summary", lambda: "(No title)")()
dtstart = getattr(obj, "get_dtstart", lambda: None)()
dtend = getattr(obj, "get_dtend", lambda: None)()
location = getattr(obj, "get_location", lambda: "")() or ""
description = getattr(obj, "get_description", lambda: "")() or ""
start_ts, all_day = safe_get_time(dtstart)
end_ts, _ = safe_get_time(dtend)
if start_ts:
if end_ts is None:
end_ts = start_ts + 3600
add_event(summary, calendar_name, start_ts, end_ts)
event_uid = getattr(obj, "get_uid", lambda: "")() or ""
add_event(summary, calendar_name, start_ts, end_ts, location, description,
calendar_uid=source.get_uid(), uid=event_uid)
continue
summary = getattr(comp, "get_summary", lambda: "(No title)")()
location = getattr(comp, "get_location", lambda: "")() or ""
description = getattr(comp, "get_description", lambda: "")() or ""
dtstart = getattr(comp, "get_dtstart", lambda: None)()
dtend = getattr(comp, "get_dtend", lambda: None)()
start_ts, all_day = safe_get_time(dtstart)
@@ -138,7 +146,8 @@ for source in sources:
# --- normal event ---
if not rrule_prop and not rdates:
add_event(summary, calendar_name, start_ts, end_ts)
add_event(summary, calendar_name, start_ts, end_ts, location, description,
calendar_uid=source.get_uid(), uid=comp.get_uid() or "")
continue
# --- recurrent events ---
@@ -221,7 +230,8 @@ for source in sources:
# --- add occurences to all_events ---
for occ_start, occ_end in occurrences:
add_event(summary, calendar_name, occ_start, occ_end)
add_event(summary, calendar_name, occ_start, occ_end, location, description,
calendar_uid=source.get_uid(), uid=comp.get_uid() or "")
except Exception as e:
+2 -5
View File
@@ -18,8 +18,7 @@ from .palette import extract_palette
from .quantizer import extract_source_color, source_color_to_rgb
from .theme import generate_theme
from .renderer import TemplateRenderer
from .scheme import expand_predefined_scheme
from .terminal import TerminalColors, TerminalGenerator
from .scheme import expand_predefined_scheme, inject_terminal_colors
__all__ = [
# Color
@@ -55,7 +54,5 @@ __all__ = [
"TemplateRenderer",
# Scheme
"expand_predefined_scheme",
# Terminal
"TerminalColors",
"TerminalGenerator",
"inject_terminal_colors",
]
@@ -509,6 +509,13 @@ class TemplateRenderer:
base = parts[0].strip()
filters = [p.strip() for p in parts[1:]]
# Handle {{mode}} tag - resolves to current theme mode
if base == "mode":
result_str = self.default_mode
for filter_str in filters:
result_str = self._apply_string_or_color_filter(result_str, filter_str, expr)
return result_str
# Try scope resolution first
resolved = self._resolve_from_scope(base, scope)
if resolved is not None:
+41
View File
@@ -308,3 +308,44 @@ def expand_predefined_scheme(scheme_data: dict[str, str], mode: ThemeMode) -> di
"background": background.to_hex(),
"on_background": on_background.to_hex(),
}
def inject_terminal_colors(result: dict[str, str], scheme_mode_data: dict) -> dict[str, str]:
"""Flatten scheme's terminal section into template-ready color keys.
Adds keys like terminal_foreground, terminal_normal_black, terminal_bright_red, etc.
so predefined terminal templates can reference them as
{{colors.terminal_foreground.default.hex_stripped}}.
Args:
result: Expanded color palette dict to augment.
scheme_mode_data: Raw scheme JSON mode data (e.g., scheme_data["dark"]).
Returns:
The same result dict with terminal_ keys added.
"""
terminal = scheme_mode_data.get("terminal")
if not terminal:
return result
# Map of JSON keys to flattened key names
direct_keys = {
"foreground": "terminal_foreground",
"background": "terminal_background",
"cursor": "terminal_cursor",
"cursorText": "terminal_cursor_text",
"selectionFg": "terminal_selection_fg",
"selectionBg": "terminal_selection_bg",
}
for json_key, flat_key in direct_keys.items():
if json_key in terminal:
result[flat_key] = terminal[json_key]
# ANSI normal/bright color groups
for group in ("normal", "bright"):
if group in terminal:
for name, hex_val in terminal[group].items():
result[f"terminal_{group}_{name}"] = hex_val
return result
-320
View File
@@ -1,320 +0,0 @@
"""
Terminal theme generation for multiple terminal emulators.
Generates native theme files from a unified terminal color schema.
Supports: foot, ghostty, kitty, alacritty, wezterm
"""
from __future__ import annotations
from dataclasses import dataclass
def darken_hex(color: str, percent: float) -> str:
"""Darken a hex color by a percentage (0-100)."""
hex_color = color.lstrip("#")
r = int(hex_color[0:2], 16)
g = int(hex_color[2:4], 16)
b = int(hex_color[4:6], 16)
factor = 1 - (percent / 100)
r = max(0, int(r * factor))
g = max(0, int(g * factor))
b = max(0, int(b * factor))
return f"#{r:02x}{g:02x}{b:02x}"
@dataclass
class TerminalColors:
"""Terminal color scheme data."""
# Base colors (from JSON)
foreground: str
background: str
cursor: str
cursor_text: str
selection_fg: str
selection_bg: str
normal: dict[str, str] # black, red, green, yellow, blue, magenta, cyan, white
bright: dict[str, str] # same keys
# WezTerm extended colors (always derived)
compose_cursor: str
scrollbar_thumb: str
split: str
visual_bell: str
indexed: dict[int, str]
tab_bar: dict
# Kitty border colors
active_border: str
inactive_border: str
@classmethod
def from_dict(cls, data: dict, scheme: dict) -> "TerminalColors":
"""Create TerminalColors with auto-derived WezTerm extended colors.
Args:
data: Terminal color data (foreground, background, cursor, normal, bright, etc.)
scheme: Scheme UI colors (mPrimary, mOnPrimary, mSecondary)
"""
# Base colors
foreground = data["foreground"]
background = data["background"]
cursor = data.get("cursor", foreground)
cursor_text = data.get("cursorText", background)
selection_fg = data.get("selectionFg", foreground)
selection_bg = data.get("selectionBg", "#585b70")
normal = data["normal"]
bright = data["bright"]
# Scheme accent colors
m_primary = scheme.get("mPrimary", cursor)
m_on_primary = scheme.get("mOnPrimary", cursor_text)
m_secondary = scheme.get("mSecondary", normal["yellow"])
m_surface_variant = scheme.get("mSurfaceVariant", selection_bg)
return cls(
foreground=foreground,
background=background,
cursor=cursor,
cursor_text=cursor_text,
selection_fg=selection_fg,
selection_bg=selection_bg,
normal=normal,
bright=bright,
# Derived WezTerm colors
compose_cursor=cursor,
scrollbar_thumb=selection_bg,
split=bright["black"],
visual_bell=normal["black"],
indexed={16: m_secondary, 17: cursor},
tab_bar={
"background": darken_hex(background, 10),
"inactiveTabEdge": selection_bg,
"activeTab": {"bg": m_primary, "fg": m_on_primary},
"inactiveTab": {"bg": darken_hex(background, 5), "fg": foreground},
"inactiveTabHover": {"bg": background, "fg": foreground},
"newTab": {"bg": selection_bg, "fg": foreground},
"newTabHover": {"bg": bright["black"], "fg": foreground},
},
# Kitty border colors
active_border=m_primary,
inactive_border=m_secondary
)
# Color name to index mapping for ANSI colors
COLOR_ORDER = ["black", "red", "green", "yellow", "blue", "magenta", "cyan", "white"]
class TerminalGenerator:
"""Generate terminal themes in native formats."""
def __init__(self, colors: TerminalColors):
self.colors = colors
def _strip_hash(self, color: str) -> str:
"""Remove # prefix from hex color."""
return color.lstrip("#")
def _ensure_hash(self, color: str) -> str:
"""Ensure # prefix on hex color."""
return color if color.startswith("#") else f"#{color}"
def generate_foot(self) -> str:
"""Generate foot terminal theme (INI format, no # prefix)."""
c = self.colors
lines = ["[colors-dark]"]
# Primary colors
lines.append(f"foreground={self._strip_hash(c.foreground)}")
lines.append(f"background={self._strip_hash(c.background)}")
# Normal colors (regular0-7)
for i, name in enumerate(COLOR_ORDER):
lines.append(f"regular{i}={self._strip_hash(c.normal[name])}")
# Bright colors (bright0-7)
for i, name in enumerate(COLOR_ORDER):
lines.append(f"bright{i}={self._strip_hash(c.bright[name])}")
# Selection
lines.append(f"selection-foreground={self._strip_hash(c.selection_fg)}")
lines.append(f"selection-background={self._strip_hash(c.selection_bg)}")
# Cursor (format: bg fg)
lines.append(
f"cursor={self._strip_hash(c.cursor_text)} {self._strip_hash(c.cursor)}"
)
return "\n".join(lines) + "\n"
def generate_ghostty(self) -> str:
"""Generate ghostty theme (key=value with palette indices)."""
c = self.colors
lines = []
# Palette (0-7 normal, 8-15 bright)
for i, name in enumerate(COLOR_ORDER):
lines.append(f"palette = {i}={self._ensure_hash(c.normal[name])}")
for i, name in enumerate(COLOR_ORDER):
lines.append(f"palette = {i + 8}={self._ensure_hash(c.bright[name])}")
# Primary colors
lines.append(f"background = {self._ensure_hash(c.background)}")
lines.append(f"foreground = {self._ensure_hash(c.foreground)}")
# Cursor
lines.append(f"cursor-color = {self._ensure_hash(c.cursor)}")
lines.append(f"cursor-text = {self._ensure_hash(c.cursor_text)}")
# Selection
lines.append(f"selection-background = {self._ensure_hash(c.selection_bg)}")
lines.append(f"selection-foreground = {self._ensure_hash(c.selection_fg)}")
return "\n".join(lines) + "\n"
def generate_kitty(self) -> str:
"""Generate kitty theme (key value pairs with # prefix)."""
c = self.colors
lines = []
# Colors 0-15
for i, name in enumerate(COLOR_ORDER):
lines.append(f"color{i} {self._ensure_hash(c.normal[name])}")
for i, name in enumerate(COLOR_ORDER):
lines.append(f"color{i + 8} {self._ensure_hash(c.bright[name])}")
# Primary colors
lines.append(f"background {self._ensure_hash(c.background)}")
lines.append(f"selection_foreground {self._ensure_hash(c.cursor_text)}")
lines.append(f"cursor {self._ensure_hash(c.cursor)}")
lines.append(f"cursor_text_color {self._ensure_hash(c.cursor_text)}")
lines.append(f"foreground {self._ensure_hash(c.foreground)}")
lines.append(f"selection_background {self._ensure_hash(c.foreground)}")
lines.append(f"active_border_color {self._ensure_hash(c.active_border)}")
lines.append(f"inactive_border_color {self._ensure_hash(c.inactive_border)}")
return "\n".join(lines) + "\n"
def generate_alacritty(self) -> str:
"""Generate alacritty theme (TOML format)."""
c = self.colors
lines = ["# Colors (Noctalia)", ""]
# Bright colors
lines.append("[colors.bright]")
for name in sorted(COLOR_ORDER):
lines.append(f"{name} = '{self._ensure_hash(c.bright[name])}'")
lines.append("")
# Cursor
lines.append("[colors.cursor]")
lines.append(f"cursor = '{self._ensure_hash(c.cursor)}'")
lines.append(f"text = '{self._ensure_hash(c.cursor_text)}'")
lines.append("")
# Normal colors
lines.append("[colors.normal]")
for name in sorted(COLOR_ORDER):
lines.append(f"{name} = '{self._ensure_hash(c.normal[name])}'")
lines.append("")
# Primary
lines.append("[colors.primary]")
lines.append(f"background = '{self._ensure_hash(c.background)}'")
lines.append(f"foreground = '{self._ensure_hash(c.foreground)}'")
lines.append("")
# Selection
lines.append("[colors.selection]")
lines.append(f"background = '{self._ensure_hash(c.selection_bg)}'")
lines.append(f"text = '{self._ensure_hash(c.selection_fg)}'")
return "\n".join(lines) + "\n"
def generate_wezterm(self) -> str:
"""Generate wezterm theme (full TOML with metadata)."""
c = self.colors
tb = c.tab_bar
lines = ["[colors]"]
# Ansi colors array
lines.append("ansi = [")
for name in COLOR_ORDER:
lines.append(f' "{self._ensure_hash(c.normal[name])}",')
lines.append("]")
lines.append(f'background = "{self._ensure_hash(c.background)}"')
# Brights array
lines.append("brights = [")
for name in COLOR_ORDER:
lines.append(f' "{self._ensure_hash(c.bright[name])}",')
lines.append("]")
# Extended colors
lines.append(f'compose_cursor = "{self._ensure_hash(c.compose_cursor)}"')
lines.append(f'cursor_bg = "{self._ensure_hash(c.cursor)}"')
lines.append(f'cursor_border = "{self._ensure_hash(c.cursor)}"')
lines.append(f'cursor_fg = "{self._ensure_hash(c.cursor_text)}"')
lines.append(f'foreground = "{self._ensure_hash(c.foreground)}"')
lines.append(f'scrollbar_thumb = "{self._ensure_hash(c.scrollbar_thumb)}"')
lines.append(f'selection_bg = "{self._ensure_hash(c.selection_bg)}"')
lines.append(f'selection_fg = "{self._ensure_hash(c.selection_fg)}"')
lines.append(f'split = "{self._ensure_hash(c.split)}"')
lines.append(f'visual_bell = "{self._ensure_hash(c.visual_bell)}"')
# Indexed colors
lines.append("")
lines.append("[colors.indexed]")
for idx, color in sorted(c.indexed.items()):
lines.append(f'{idx} = "{self._ensure_hash(color)}"')
# Tab bar
lines.append("")
lines.append("[colors.tab_bar]")
lines.append(f'background = "{self._ensure_hash(tb["background"])}"')
lines.append(f'inactive_tab_edge = "{self._ensure_hash(tb["inactiveTabEdge"])}"')
for section, key in [
("activeTab", "active_tab"),
("inactiveTab", "inactive_tab"),
("inactiveTabHover", "inactive_tab_hover"),
("newTab", "new_tab"),
("newTabHover", "new_tab_hover"),
]:
lines.append("")
lines.append(f"[colors.tab_bar.{key}]")
lines.append(f'bg_color = "{self._ensure_hash(tb[section]["bg"])}"')
lines.append(f'fg_color = "{self._ensure_hash(tb[section]["fg"])}"')
lines.append('intensity = "Normal"')
lines.append("italic = false")
lines.append("strikethrough = false")
lines.append('underline = "None"')
# Metadata
lines.append("")
lines.append("[metadata]")
lines.append('author = "Noctalia"')
lines.append('name = "Noctalia"')
return "\n".join(lines) + "\n"
def generate(self, terminal_id: str) -> str:
"""Generate theme for specified terminal."""
generators = {
"foot": self.generate_foot,
"ghostty": self.generate_ghostty,
"kitty": self.generate_kitty,
"alacritty": self.generate_alacritty,
"wezterm": self.generate_wezterm,
}
if terminal_id not in generators:
raise ValueError(f"Unknown terminal: {terminal_id}")
return generators[terminal_id]()

Some files were not shown because too many files have changed in this diff Show More