Merge branch 'main' into feat/diskdetails

This commit is contained in:
thmoee
2026-02-02 16:22:11 +01:00
144 changed files with 7914 additions and 2343 deletions
+1
View File
@@ -1 +1,2 @@
buy_me_a_coffee: noctalia
ko_fi: noctaliadev
+51 -5
View File
@@ -205,16 +205,16 @@ body {
[class*="checkboxOption"]:hover [class*="checkboxIndicator"] {
background-color: color-mix(in srgb, var(--accent-1) 20%, transparent) !important;
border-color: var(--accent-1) !important;
border-color: var(--accent-3) !important;
}
[class*="checkboxOption"][data-selected] [class*="checkboxIndicator"] {
background-color: var(--accent-1) !important;
border-color: var(--accent-1) !important;
border-color: var(--accent-3) !important;
}
[class*="checkboxOption"][data-selected]:hover [class*="checkboxIndicator"] {
background-color: var(--accent-3) !important;
background-color: var(--accent-1) !important;
border-color: var(--accent-3) !important;
}
@@ -247,7 +247,7 @@ body {
/* Inner dot (selected) */
[class*="innerDotRadio"] {
fill: var(--accent-1) !important; /* contrast dot */
fill: var(--accent-3) !important; /* contrast dot */
opacity: 0; /* hidden by default */
transition: opacity 0.2s ease;
}
@@ -281,7 +281,7 @@ body {
[class*="checkboxOption"][data-selected="true"] [class*="checkStroke"],
[class*="checkboxOption"][data-selected="true"] [class*="dot"] {
color: var(--accent-1) !important; /* checkmark/dot color */
color: var(--accent-3) !important; /* checkmark color */
}
/* Hover effect for selected checkbox */
@@ -322,3 +322,49 @@ body {
color: var(--text-1) !important;
font-weight: 700;
}
/* Fix polls visibility */
[class*="pollContainer_"] [class*="selected__"] [class*="radioForeground_"] {
fill: var(--accent-3) !important;
}
[class*="pollContainer_"] [class*="selected__"] {
border: 2px solid var(--active) !important;
}
[class*="votedStyles_"] [class*="votePercentageBar_"] {
background-color: var(--active-2) !important;
opacity: 0.5;
}
[class*="pollContainer_"] [class*="answerSelectionIcon_"] circle {
fill: var(--accent-3) !important;
}
[class*="pollContainer_"] [class*="votedStyles_"] [class*="answerSelectionIcon_"] path {
fill: var(--bg-1) !important;
}
[class*="pollContainer_"] [class*="answer__"]:not([class*="votedStyles_"]) [class*="answerSelectionIcon_"] path {
fill: var(--accent-1) !important;
}
[class*="pollContainer_"] [class*="votesData_"] {
color: var(--text-2) !important;
}
[class*="pollContainer_"] [class*="votedStyles_"] [class*="answerInner_"] {
border: 2px solid var(--active) !important;
}
/* Invite to server button override*/
[class*="inviteButton_"] svg path,
[class*="actionIcon_"] path[d^="M14.5 8a3 3 0"] {
fill: var(--accent-1) !important;
color: var(--accent-1) !important;
}
[class*="inviteButton_"]:hover svg path {
fill: var(--accent-3) !important;
color: var(--accent-3) !important;
}
+19
View File
@@ -0,0 +1,19 @@
## Colours - Based on Material Design 3 Palette
set $primary #{{colors.primary.default.hex_stripped}}
set $on_primary #{{colors.on_primary.default.hex_stripped}}
set $secondary #{{colors.secondary.default.hex_stripped}}
set $tertiary #{{colors.tertiary.default.hex_stripped}}
set $error #{{colors.error.default.hex_stripped}}
set $surface #{{colors.surface.default.hex_stripped}}
set $on_surface #{{colors.on_surface.default.hex_stripped}}
set $on_surface_variant #{{colors.on_surface_variant.default.hex_stripped}}
set $outline #{{colors.outline.default.hex_stripped}}
## Window Colours
# class border backgr. text indicator child_border
client.focused $primary $surface $on_surface $secondary $primary
client.focused_inactive $outline $surface $on_surface_variant $outline $outline
client.unfocused $outline $surface $on_surface_variant $outline $outline
client.urgent $error $surface $on_surface $error $error
client.placeholder $surface $surface $on_surface_variant $surface $surface
client.background $surface
+2
View File
@@ -21,4 +21,6 @@ background {{colors.surface.default.hex}}
foreground {{colors.on_surface.default.hex}}
selection_foreground {{colors.on_surface_variant.default.hex}}
selection_background {{colors.surface_variant.default.hex}}
active_border_color {{colors.primary.default.hex}}
inactive_border_color {{colors.surface_variant.default.hex}}
url_color {{colors.primary.default.hex}}
+47 -23
View File
@@ -181,10 +181,10 @@
"hide-widget-when-zero-label": "Symbol bei keinen Benachrichtigungen ausblenden",
"hide-widget-when-zero-unread-description": "Benachrichtigungssymbol ausblenden, wenn keine ungelesenen Benachrichtigungen vorhanden sind.",
"hide-widget-when-zero-unread-label": "Symbol bei keinen ungelesenen Benachrichtigungen ausblenden",
"show-unread-badge-description": "Badge mit der Anzahl ungelesener Benachrichtigungen anzeigen.",
"show-unread-badge-label": "Badge für ungelesene Nachrichten anzeigen",
"show-unread-badge-description": "Abzeichen mit der Anzahl ungelesener Benachrichtigungen anzeigen.",
"show-unread-badge-label": "Ungelesen-Abzeichen anzeigen",
"unread-badge-color-description": "Wähle die Farbe für das Abzeichen ungelesener Benachrichtigungen.",
"unread-badge-color-label": "Farbe des ungelesenen Abzeichens"
"unread-badge-color-label": "Farbe des Ungelesen-Abzeichens"
},
"section-editor": {
"placeholder": "Widget auswählen...",
@@ -230,8 +230,8 @@
"icon-scale-label": "Symbolskalierung",
"max-width-description": "Maximale Breite der Taskleiste als Prozentsatz der Bildschirmbreite.",
"max-width-label": "Maximale Breite",
"only-active-workspaces-description": "Zeige nur Apps von aktiven Arbeitsbereichen.",
"only-active-workspaces-label": "Nur von aktiven Arbeitsbereichen",
"only-active-workspaces-description": "Zeige nur Apps von aktiven Arbeitsflächen.",
"only-active-workspaces-label": "Nur von aktiven Arbeitsflächen",
"only-same-monitor-description": "Zeige nur Apps von dem Monitor an, auf dem sich die Leiste befindet.",
"only-same-monitor-label": "Nur vom selben Monitor",
"show-pinned-apps-description": "Angeheftete Apps aus dem Dock in der Taskleiste anzeigen.",
@@ -258,31 +258,31 @@
"display-mode-label": "Anzeigemodus"
},
"workspace": {
"character-count-description": "Anzahl der Zeichen, die von Arbeitsbereichsnamen angezeigt werden (1-10).",
"character-count-description": "Anzahl der Zeichen, die von Arbeitsflächennamen angezeigt werden (1-10).",
"character-count-label": "Zeichenanzahl",
"empty-color-description": "Lege die Hintergrundfarbe für leere Workspaces fest.",
"empty-color-label": "Farbe für leere Workspace",
"enable-scrollwheel-description": "Zwischen Arbeitsbereichen mit dem Mausrad wechseln.",
"enable-scrollwheel-label": "Zum Wechseln der Arbeitsbereiche scrollen",
"focused-color-description": "Lege die Hintergrundfarbe für den fokussierten Workspace fest.",
"focused-color-label": "Farbe des fokussierten Workspace",
"follow-focused-screen-description": "Zeige Arbeitsbereiche vom aktuell fokussierten Bildschirm an, statt vom Bildschirm, auf dem sich die Leiste befindet.",
"empty-color-description": "Lege die Hintergrundfarbe für leere Arbeitsflächen fest.",
"empty-color-label": "Farbe für leere Arbeitsflächen",
"enable-scrollwheel-description": "Zwischen Arbeitsflächen mit dem Mausrad wechseln.",
"enable-scrollwheel-label": "Zum Wechseln der Arbeitsflächen scrollen",
"focused-color-description": "Lege die Hintergrundfarbe für die fokussierte Arbeitsfläche fest.",
"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",
"grouped-border-opacity-description": "Legen Sie die Deckkraft für Workspace-Container-Rahmen fest.",
"grouped-border-opacity-description": "Legen Sie die Deckkraft für Arbeitsflächen-Container-Rahmen fest.",
"grouped-border-opacity-label": "Rahmen-Deckkraft",
"hide-unoccupied-description": "Arbeitsbereiche ohne Fenster nicht anzeigen.",
"hide-unoccupied-description": "Arbeitsflächen ohne Fenster nicht anzeigen.",
"hide-unoccupied-label": "Unbesetzte ausblenden",
"label-mode-description": "Wählen Sie, wie Arbeitsbereichs-Beschriftungen angezeigt werden.",
"label-mode-description": "Wählen Sie, wie Arbeitsflächen-Beschriftungen angezeigt werden.",
"label-mode-label": "Beschriftungsmodus",
"occupied-color-description": "Lege die Hintergrundfarbe für belegte Workspaces fest.",
"occupied-color-description": "Lege die Hintergrundfarbe für belegte Arbeitsflächen fest.",
"occupied-color-label": "Farbe für belegte Arbeitsfläche",
"reverse-scrolling-description": "Die Richtung des Arbeitsbereichswechsels beim Scrollen umkehren.",
"reverse-scrolling-description": "Die Richtung des Arbeitsflächenwechsels beim Scrollen umkehren.",
"reverse-scrolling-label": "Scrollen umkehren",
"show-applications-description": "Anwendungssymbole in jedem Arbeitsbereich anzeigen.",
"show-applications-description": "Anwendungssymbole in jeder Arbeitsfläche anzeigen.",
"show-applications-label": "Anwendungen anzeigen",
"show-badge-description": "Zeige die Arbeitsbereichsnummern-Plakette im gruppierten Modus an.",
"show-badge-label": "Workspace-Badge anzeigen",
"show-labels-only-when-occupied-description": "Arbeitsbereichsbezeichnungen nur anzeigen, wenn sie Fenster enthalten.",
"show-badge-description": "Zeige die Arbeitsflächennummer als Abzeichen im gruppierten Modus an.",
"show-badge-label": "Arbeitsflächen-Abzeichen anzeigen",
"show-labels-only-when-occupied-description": "Arbeitsflächenbezeichnungen nur anzeigen, wenn sie Fenster enthalten.",
"show-labels-only-when-occupied-label": "Beschriftungen nur anzeigen, wenn belegt",
"unfocused-icons-opacity-description": "Transparenzgrad für nicht fokussierte App-Symbole festlegen.",
"unfocused-icons-opacity-label": "Deckkraft unscharfer Symbole"
@@ -493,6 +493,7 @@
"week": "Woche",
"widgets": "Widgets",
"width": "Breite",
"windows": "Fenster",
"yes": "Ja"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "Beim Hover"
},
"hide-modes": {
"auto-hide": "Automatisch ausblenden",
"hidden": "Ausblenden, wenn leer",
"idle": "Ausblenden, wenn inaktiv",
"transparent": "Transparent, wenn leer",
@@ -563,7 +565,9 @@
"emoji-loading": "Lade Emojis...",
"emoji-loading-description": "Bitte warten",
"emoji-no-recent": "Noch keine kürzlich verwendeten Emojis",
"emoji-search-description": "Emojis suchen und kopieren"
"emoji-search-description": "Emojis suchen und kopieren",
"settings-search-description": "Suchen und zu den Einstellungen navigieren",
"windows-search-description": "Offene Fenster suchen und fokussieren"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "Standard",
"density-mini": "Mini",
"density-spacious": "Geräumig",
"display-mode-always-visible": "Immer sichtbar",
"type-floating": "Schwebend",
"type-framed": "Gerahmt",
"type-simple": "Einfach"
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "Lautstärke-Übersteuerung erlauben"
},
"bar": {
"appearance-auto-hide-delay-description": "Zeit, bis die Bar ausgeblendet wird, nachdem die Maus sie verlassen hat.",
"appearance-auto-hide-delay-label": "Ausblende-Verzögerung",
"appearance-auto-hide-exclusive-note": "Hinweis: Die exklusive Zone wird automatisch deaktiviert, wenn Auto-Hide aktiv ist.",
"appearance-auto-show-delay-description": "Zeit, bevor die Bar angezeigt wird, wenn die Maus den Rand betritt.",
"appearance-auto-show-delay-label": "Anzeigeverzögerung",
"appearance-background-opacity-description": "Legen Sie die Hintergrundtransparenz speziell für die Leiste fest.",
"appearance-background-opacity-label": "Leisten-Hintergrundtransparenz",
"appearance-capsule-opacity-description": "Deckkraft der Widget-Hintergründe festlegen, wenn Kapsel angezeigt wird.",
@@ -728,6 +738,8 @@
"appearance-density-description": "Innenabstand der Statusleiste für kompaktes oder geräumiges Aussehen anpassen.",
"appearance-density-label": "Statusleistendichte",
"appearance-desc": "Erscheinungsbild und Position der Statusleiste anpassen.",
"appearance-display-mode-description": "Wählen Sie, wann die Leiste sichtbar ist",
"appearance-display-mode-label": "Anzeigemodus",
"appearance-floating-description": "Statusleiste als schwebende 'Pille' anzeigen.",
"appearance-floating-label": "Schwebende Statusleiste",
"appearance-frame-radius": "Innenradius",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "Tasten anzeigen",
"media-player-show-visualizer-description": "Audiovisualisierungs-Overlay anzeigen.",
"media-player-visualizer-type-description": "Wählen Sie einen Visualisierungstyp für den Hintergrund des Desktop-Medienplayers.",
"system-stat-layout-bottom": "Unten",
"system-stat-layout-description": "Wählen Sie, wie die Legende relativ zum Diagramm angezeigt wird.",
"system-stat-layout-label": "Layout",
"system-stat-layout-side": "Seite",
"system-stat-rounded-corners-description": "Abgerundete Ecken für den Widget-Hintergrund verwenden.",
"system-stat-rounded-corners-label": "Abgerundete Ecken",
"system-stat-show-background-description": "Zeige den Hintergrundbehälter für das Systemstatistik-Widget.",
"system-stat-show-background-label": "Hintergrund anzeigen",
"system-stat-stat-type-description": "Wähle, welche Systemstatistik angezeigt werden soll.",
"system-stat-stat-type-label": "Statistiktyp",
"title": "Desktop-Widgets",
"weather-enabled-description": "Zeige ein Wetter-Widget auf dem Desktop an.",
"weather-enabled-label": "Wetter-Widget aktivieren",
@@ -1067,6 +1089,8 @@
"settings-desc": "Verhalten und Erscheinungsbild des Starters anpassen.",
"settings-enable-settings-search-description": "Einstellungen in den Suchergebnissen des Launchers anzeigen.",
"settings-enable-settings-search-label": "Einstellungen-Suche aktivieren",
"settings-enable-windows-search-description": "Aktive Fenster suchen und fokussieren.",
"settings-enable-windows-search-label": "Fenstersuche aktivieren",
"settings-grid-view-description": "Elemente in einem Raster statt in einer Liste anzeigen.",
"settings-icon-mode-description": "Verwende native System-Icons anstelle von Tabler-Icons.",
"settings-icon-mode-label": "Native Icons verwenden",
+27 -2
View File
@@ -493,6 +493,7 @@
"week": "Week",
"widgets": "Widgets",
"width": "Width",
"windows": "Windows",
"yes": "Yes"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "On hover"
},
"hide-modes": {
"auto-hide": "Auto-hide",
"hidden": "Hide when empty",
"idle": "Hide when idle",
"transparent": "Transparent when empty",
@@ -563,7 +565,9 @@
"emoji-loading": "Loading emojis...",
"emoji-loading-description": "Please wait",
"emoji-no-recent": "No recent emojis yet",
"emoji-search-description": "Search and copy emojis"
"emoji-search-description": "Search and copy emojis",
"settings-search-description": "Search and navigate to settings",
"windows-search-description": "Search and focus open windows"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "Default",
"density-mini": "Mini",
"density-spacious": "Spacious",
"display-mode-always-visible": "Always Visible",
"type-floating": "Floating",
"type-framed": "Framed",
"type-simple": "Simple"
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "Allow volume overdrive"
},
"bar": {
"appearance-auto-hide-delay-description": "Time before bar hides after mouse leaves",
"appearance-auto-hide-delay-label": "Hide Delay",
"appearance-auto-hide-exclusive-note": "Note: Exclusive zone is automatically disabled when auto-hide is active",
"appearance-auto-show-delay-description": "Time before bar shows when mouse enters edge",
"appearance-auto-show-delay-label": "Show Delay",
"appearance-background-opacity-description": "Set the background opacity specifically for the bar.",
"appearance-background-opacity-label": "Bar background opacity",
"appearance-capsule-opacity-description": "Set the opacity level for widget backgrounds when capsule is shown.",
@@ -728,6 +738,8 @@
"appearance-density-description": "Adjust the bar's padding for a compact or spacious look.",
"appearance-density-label": "Bar density",
"appearance-desc": "Customize the bar's appearance and position.",
"appearance-display-mode-description": "Choose when the bar is visible",
"appearance-display-mode-label": "Display Mode",
"appearance-floating-description": "Display the bar as a floating 'pill'.",
"appearance-floating-label": "Floating bar",
"appearance-frame-radius": "Inner Radius",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "Show buttons",
"media-player-show-visualizer-description": "Show the audio visualizer overlay.",
"media-player-visualizer-type-description": "Choose a visualization type.",
"system-stat-layout-bottom": "Bottom",
"system-stat-layout-description": "Choose how the legend is displayed relative to the graph.",
"system-stat-layout-label": "Layout",
"system-stat-layout-side": "Side",
"system-stat-rounded-corners-description": "Use rounded corners for the widget background.",
"system-stat-rounded-corners-label": "Rounded corners",
"system-stat-show-background-description": "Show the background container for the system stat widget.",
"system-stat-show-background-label": "Show background",
"system-stat-stat-type-description": "Choose which system statistic to display.",
"system-stat-stat-type-label": "Statistic Type",
"title": "Desktop Widgets",
"weather-enabled-description": "Show a weather widget on the desktop.",
"weather-enabled-label": "Enable weather widget",
@@ -1045,7 +1067,7 @@
"clipboard-desc": "Access and manage your clipboard history from the launcher.",
"execute-desc": "Configure how applications are launched.",
"execute-title": "Execution",
"settings-annotation-tool-description": "Command to run when clicking the annotate button in clipboard history, The image will be piped to this command.",
"settings-annotation-tool-description": "Command to run when clicking the annotate button in clipboard history. The image will be piped to this command.",
"settings-annotation-tool-label": "Annotation tool",
"settings-annotation-tool-placeholder": "e.g. 'gradia', 'satty -f -'",
"settings-auto-paste-description": "Automatically paste the selected clipboard item. Requires wtype.",
@@ -1067,6 +1089,8 @@
"settings-desc": "Customize the launcher's behavior and appearance.",
"settings-enable-settings-search-description": "Show settings results when searching in the launcher.",
"settings-enable-settings-search-label": "Enable settings search",
"settings-enable-windows-search-description": "Search and focus active windows.",
"settings-enable-windows-search-label": "Enable windows search",
"settings-grid-view-description": "Display items in a grid layout instead of a list.",
"settings-icon-mode-description": "Use native system icons instead of Tabler icons.",
"settings-icon-mode-label": "Use native icons",
@@ -1253,6 +1277,7 @@
"hot-reload-description": "Automatically reload plugins when their files change. Useful for plugin development.",
"hot-reload-label": "Hot reload (dev mode)",
"hot-reloaded": "Reloaded plugin: {name}",
"translations-reloaded": "Reloaded translations: {name}",
"install-error": "Failed to install: {error}",
"install-incompatible": "{plugin} requires Noctalia v{version} or higher",
"install-success": "Successfully installed {plugin}",
+78 -54
View File
@@ -493,6 +493,7 @@
"week": "Semana",
"widgets": "Widgets",
"width": "Ancho",
"windows": "Ventanas",
"yes": "Sí"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "Al pasar por encima"
},
"hide-modes": {
"auto-hide": "Ocultación Automática",
"hidden": "Ocultar cuando esté vacío",
"idle": "Ocultar cuando esté inactivo",
"transparent": "Transparente cuando esté vacío",
@@ -563,7 +565,9 @@
"emoji-loading": "Cargando emojis...",
"emoji-loading-description": "Por favor espera",
"emoji-no-recent": "No hay emojis recientes",
"emoji-search-description": "Buscar y copiar emojis"
"emoji-search-description": "Buscar y copiar emojis",
"settings-search-description": "Buscar en los ajustes",
"windows-search-description": "Buscar y enfocar ventanas abiertas"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "Predeterminada",
"density-mini": "Mini",
"density-spacious": "Espaciosa",
"display-mode-always-visible": "Siempre visible",
"type-floating": "Flotante",
"type-framed": "Con marco",
"type-simple": "Simple"
@@ -611,7 +616,7 @@
"frame-rates-fps": "{fps} FPS",
"scrolling-modes": {
"always": "Desplazar siempre",
"hover": "Desplazar al pasar",
"hover": "Desplazar al posar el puntero",
"never": "No desplazar nunca"
},
"session-menu-grid-layout": {
@@ -654,9 +659,9 @@
"system-cpu": "CPU:",
"system-disk": "Disco:",
"system-gpu": "GPU:",
"system-host": "Anfitrión:",
"system-host": "Host:",
"system-install-hint": "Instala fastfetch para ver la información del sistema",
"system-kernel": "Núcleo:",
"system-kernel": "Kernel:",
"system-loading": "Cargando información del sistema...",
"system-memory": "Memoria:",
"system-monitor": "Monitor:",
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "Permitir sobreamplificación de volumen"
},
"bar": {
"appearance-auto-hide-delay-description": "Tiempo que tarda la barra en ocultarse cuando se aparta el ratón",
"appearance-auto-hide-delay-label": "Demora de Ocultación",
"appearance-auto-hide-exclusive-note": "Nota: La zona exclusiva se desactiva automáticamente cuando la ocultación automática está activa",
"appearance-auto-show-delay-description": "Tiempo que tarda la barra en mostrarse cuando el ratón llega al borde",
"appearance-auto-show-delay-label": "Demora de Despliegue",
"appearance-background-opacity-description": "Establece la opacidad del fondo específicamente para la barra.",
"appearance-background-opacity-label": "Opacidad del fondo de la barra",
"appearance-capsule-opacity-description": "Establecer el nivel de opacidad para los fondos de los widgets cuando se muestra la cápsula.",
@@ -728,6 +738,8 @@
"appearance-density-description": "Ajusta el relleno de la barra para un aspecto compacto o espacioso.",
"appearance-density-label": "Densidad de la barra",
"appearance-desc": "Personaliza la apariencia y posición de la barra.",
"appearance-display-mode-description": "Elige cuando será visible la barra",
"appearance-display-mode-label": "Modo de Visualización",
"appearance-floating-description": "Muestra la barra como una 'píldora' flotante.",
"appearance-floating-label": "Barra flotante",
"appearance-frame-radius": "Radio interno",
@@ -777,7 +789,7 @@
"dark-mode-mode-label": "Programación del modo oscuro",
"dark-mode-mode-manual": "Manual",
"dark-mode-mode-off": "Apagado",
"dark-mode-switch-description": "Cambia a un tema más oscuro para una visualización más fácil por la noche.",
"dark-mode-switch-description": "Cambia a un tema más oscuro para una visualización más cómoda por la noche.",
"delete-error-description": "Error al eliminar {scheme}",
"delete-error-title": "Error al eliminar",
"delete-success-description": "{scheme} eliminado correctamente",
@@ -796,7 +808,7 @@
"download-fetching": "Obteniendo esquemas de colores disponibles...",
"download-success-description": "{scheme} descargado correctamente",
"download-success-title": "Esquema de colores descargado",
"download-title": "Descargar esquemas de colores",
"download-title": "Descargar Esquemas de Color",
"method-description": {
"content": "Esquema de Material Design con extracción de color de alta fidelidad que coincide estrechamente con los colores reales del contenido de origen.",
"faithful": "Intenta mantenerse cerca del color original mientras genera una paleta armoniosa.",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "Mostrar botones",
"media-player-show-visualizer-description": "Mostrar la superposición del visualizador de audio.",
"media-player-visualizer-type-description": "Elige un tipo de visualización para el fondo del reproductor multimedia de escritorio.",
"system-stat-layout-bottom": "Abajo",
"system-stat-layout-description": "Elige cómo se muestra la leyenda en relación con el gráfico.",
"system-stat-layout-label": "Diseño",
"system-stat-layout-side": "Lado",
"system-stat-rounded-corners-description": "Usar esquinas redondeadas para el fondo del widget.",
"system-stat-rounded-corners-label": "Esquinas Redondeadas",
"system-stat-show-background-description": "Mostrar el contenedor de fondo para el widget de estadísticas del sistema.",
"system-stat-show-background-label": "Mostrar fondo",
"system-stat-stat-type-description": "Elige qué estadística del sistema mostrar.",
"system-stat-stat-type-label": "Tipo de Estadística",
"title": "Widgets de escritorio",
"weather-enabled-description": "Mostrar un widget del clima en el escritorio.",
"weather-enabled-label": "Activar widget del clima",
@@ -923,7 +945,7 @@
"night-light-manual-schedule-select-start": "Seleccionar hora de inicio",
"night-light-manual-schedule-select-stop": "Seleccionar hora de finalización",
"night-light-manual-schedule-sunrise": "Hora del amanecer",
"night-light-manual-schedule-sunset": "Hora del atardecer",
"night-light-manual-schedule-sunset": "Hora del anochecer",
"night-light-temperature-day": "Día",
"night-light-temperature-day-description": "Controla la temperatura durante el día.",
"night-light-temperature-description": "Establece la calidez del color para la noche y el día.",
@@ -939,9 +961,9 @@
"appearance-colorize-icons-description": "Aplicar colores del tema a los iconos de aplicaciones del dock (solo aplicaciones no enfocadas).",
"appearance-colorize-icons-label": "Colorear iconos",
"appearance-dead-opacity-description": "Ajustar la opacidad de los iconos de las aplicaciones que no están en ejecución.",
"appearance-dead-opacity-label": "Opacidad muerta",
"appearance-dead-opacity-label": "Opacidad inactivas",
"appearance-desc": "Personaliza el comportamiento y la apariencia del dock.",
"appearance-display-auto-hide": "Ocultar automáticamente",
"appearance-display-auto-hide": "Ocultar autom.",
"appearance-display-description": "Elige cómo se comporta el dock.",
"appearance-display-exclusive": "Exclusivo",
"appearance-floating-distance-description": "Ajusta la distancia de flotación desde el borde de la pantalla.",
@@ -1026,9 +1048,9 @@
"session-label": "Fin de la sesión",
"session-placeholder": "p. ej., notify-send \"Session\" \"$1\"",
"system-hooks-desc": "Configura comandos para que se ejecuten cuando ocurran eventos del sistema.",
"system-hooks-enable-description": "Activa o desactiva todos los comandos de hooks.",
"system-hooks-enable-description": "Activa o desactiva todos los comandos hook.",
"system-hooks-enable-label": "Activar hooks",
"system-hooks-title": "Ganchos del sistema",
"system-hooks-title": "Hooks del sistema",
"theme-changed-description": "Comando a ejecutar cuando el tema cambia entre modo oscuro y claro.",
"theme-changed-label": "Tema cambiado",
"theme-changed-placeholder": "ej., notify-send \"Tema\" \"Cambiado\"",
@@ -1057,7 +1079,7 @@
"settings-clipboard-history-description": "Accede a los elementos copiados anteriormente desde el lanzador.",
"settings-clipboard-history-label": "Activar historial del portapapeles",
"settings-clipboard-watch-image-description": "Cadena de comando completa pasada a wl-paste para cambios de imagen. (requiere reinicio)",
"settings-clipboard-watch-image-label": "Comando de Vigilancia de Imágenes",
"settings-clipboard-watch-image-label": "Comando de vigilancia de imágenes",
"settings-clipboard-watch-text-description": "Cadena de comando completa pasada a wl-paste para cambios de texto. (requiere reinicio)",
"settings-clipboard-watch-text-label": "Comando de vigilancia de texto",
"settings-custom-launch-prefix-description": "Prefijar comandos con un lanzador personalizado (ej. 'runapp' para integración con systemd).",
@@ -1067,6 +1089,8 @@
"settings-desc": "Personaliza el comportamiento y la apariencia del lanzador.",
"settings-enable-settings-search-description": "Mostrar los resultados de configuración al buscar en el Launcher.",
"settings-enable-settings-search-label": "Activar la búsqueda en la configuración",
"settings-enable-windows-search-description": "Buscar y enfocar ventanas activas.",
"settings-enable-windows-search-label": "Habilitar búsqueda de ventanas",
"settings-grid-view-description": "Mostrar elementos en una cuadrícula en lugar de una lista.",
"settings-icon-mode-description": "Usa iconos nativos del sistema en lugar de iconos Tabler.",
"settings-icon-mode-label": "Usar iconos nativos",
@@ -1079,7 +1103,7 @@
"settings-show-icon-background-label": "Mostrar fondo del icono",
"settings-sort-by-usage-description": "Cuando está activado, las aplicaciones más utilizadas aparecen primero en la lista.",
"settings-sort-by-usage-label": "Ordenar por más usados",
"settings-terminal-command-description": "Comando para iniciar un terminal. Por ejemplo, 'kitty -e' o 'gnome-terminal --'.",
"settings-terminal-command-description": "Comando para iniciar el terminal. Por ejemplo, 'kitty -e' o 'gnome-terminal --'.",
"settings-terminal-command-label": "Comando de terminal",
"settings-use-app2unit-description": "Usa un método de lanzamiento alternativo para gestionar mejor los procesos de las aplicaciones y prevenir problemas.",
"settings-use-app2unit-label": "Usar App2Unit para lanzar aplicaciones",
@@ -1091,7 +1115,7 @@
"calendar-header-label": "Encabezado del calendario",
"calendar-month-label": "Mes del calendario",
"date-time-12hour-format-description": "Muestra la hora en formato de 12 horas en la pantalla de bloqueo y el calendario. El reloj de la barra tiene su propia configuración.",
"date-time-12hour-format-label": "Utilice el formato de hora de 12 horas",
"date-time-12hour-format-label": "Utiliza el formato de 12 horas",
"date-time-desc": "Personaliza cómo aparecen la fecha y la hora.",
"date-time-first-day-of-week-automatic": "Automático (usar la configuración regional del sistema)",
"date-time-first-day-of-week-description": "Elige qué día empieza la semana en el calendario.",
@@ -1133,8 +1157,8 @@
"lock-on-suspend-label": "Bloquear al suspender",
"show-hibernate-description": "Mostrar la opción 'hibernar' en los controles de energía.",
"show-hibernate-label": "Mostrar hibernar",
"show-session-buttons-description": "Permitir el acceso a la configuración de energía desde la pantalla de bloqueo.",
"show-session-buttons-label": "Controles de energía",
"show-session-buttons-description": "Permitir el acceso a las opciones de sesión desde la pantalla de bloqueo.",
"show-session-buttons-label": "Opciones de sesión",
"title": "Pantalla de bloqueo"
},
"network": {
@@ -1210,7 +1234,7 @@
"always-on-top-description": "Mostrar OSD por encima de ventanas de pantalla completa y otras capas.",
"always-on-top-label": "Siempre encima",
"background-opacity-description": "Controls the transparency of the OSD background.",
"background-opacity-label": "Background opacity",
"background-opacity-label": "Opacidad del fondo",
"description": "Configura indicadores superpuestos como volumen y brillo.",
"duration-auto-hide-description": "Ajusta el tiempo antes de que el OSD desaparezca.",
"duration-auto-hide-label": "Ocultar después de",
@@ -1308,7 +1332,7 @@
"entries-desc": "Personalizar qué acciones de energía aparecen en el menú de sesión y en qué orden.",
"entries-title": "Acciones de energía",
"entry-settings-command-description": "Comando personalizado para ejecutar para esta acción. Dejar vacío para usar el comando del sistema predeterminado.",
"entry-settings-command-placeholder": "systemctl poweroff",
"entry-settings-command-placeholder": "p.ej., systemctl poweroff",
"entry-settings-default-command-lock": "Pantalla de bloqueo interna (sin comando)",
"entry-settings-default-command-logout": "Cierre de sesión interno (sin comando)",
"entry-settings-default-info-description": "Si no se especifica un comando personalizado, se utilizará el comando predeterminado del sistema.",
@@ -1368,13 +1392,13 @@
"control-border-radius-reset": "Restablecer el radio de entrada",
"desc": "Personaliza la apariencia, el ambiente y el comportamiento de la interfaz.",
"dim-desktop-description": "Atenuar el escritorio cuando los paneles o menús estén abiertos.",
"dim-desktop-label": "Dim escritorio",
"dim-desktop-label": "Atenuar escritorio",
"dimmer-opacity-description": "Define el nivel de opacidad para el atenuado del escritorio.",
"dimmer-opacity-label": "Opacidad del escritorio atenuado",
"dimmer-opacity-reset": "Restablecer la opacidad del escritorio atenuado",
"panel-background-opacity-description": "Establecer la opacidad del fondo para todos los paneles (barra, lanzador, ajustes, etc...).",
"panel-background-opacity-label": "Opacidad de fondo del panel",
"panels-attached-to-bar-description": "Los paneles se fijan a la barra y a los bordes de la pantalla, creando una apariencia impecable con elegantes esquinas invertidas.",
"panel-background-opacity-label": "Opacidad del fondo del panel",
"panels-attached-to-bar-description": "Los paneles se fijan a la barra y a los bordes de la pantalla, creando una apariencia integrada con elegantes esquinas invertidas.",
"panels-attached-to-bar-label": "Ajustar paneles a los bordes",
"panels-overlay-description": "Garantiza que los paneles y la barra permanezcan visibles, incluso sobre aplicaciones en pantalla completa.",
"panels-overlay-label": "Mantener paneles y barra en la parte superior",
@@ -1395,11 +1419,11 @@
"automation-change-mode-alphabetical": "Alfabético",
"automation-change-mode-description": "Elija cómo se seleccionan los fondos de pantalla al cambiar automáticamente.",
"automation-change-mode-label": "Modo de cambio",
"automation-custom-interval-description": "Ingresa el tiempo como HH:MM (ej., 01:30).",
"automation-custom-interval-description": "Introduce el tiempo en formato HH:MM (p.ej., 01:30).",
"automation-custom-interval-label": "Intervalo personalizado",
"automation-interval-description": "Con qué frecuencia cambiar los fondos de pantalla automáticamente.",
"automation-interval-label": "Intervalo del fondo de pantalla",
"automation-random-wallpaper-description": "Programa cambios aleatorios de fondo de pantalla a intervalos regulares.",
"automation-random-wallpaper-description": "Programa cambios aleatorios del fondo de pantalla a intervalos regulares.",
"automation-scheduled-change-description": "Cambiar automáticamente los fondos de pantalla a intervalos regulares.",
"automation-scheduled-change-label": "Cambio programado",
"look-feel-edge-smoothness-description": "Aplica un efecto suave y difuminado al borde de las transiciones.",
@@ -1436,18 +1460,18 @@
"settings-view-mode-label": "Modo de visualización",
"view-mode-browse": "Explorar directorios",
"view-mode-cycle-tooltip": "Modo de visualización: {mode} (clic para cambiar)",
"view-mode-recursive": "Subdirectorios aplanados",
"view-mode-recursive": "Incluir subdirectorios",
"view-mode-single": "Directorio raíz"
}
},
"placeholders": {
"command-example": "echo \"Hola, mundo\"",
"enter-command": "Ingresa el comando a ejecutar (aplicación o script personalizado)",
"enter-ipc-identifier": "Introduzca un identificador único para los comandos IPC",
"enter-path": "Ingrese la ruta...",
"enter-text-to-collapse": "por ejemplo, 'no se está reproduciendo nada'. Usa /regex/ para patrones.",
"enter-tooltip": "Introducir información sobre herramientas",
"enter-width-pixels": "Ingresa el ancho en píxeles",
"enter-command": "Introduce el comando a ejecutar (aplicación o script personalizado)",
"enter-ipc-identifier": "Introduce un identificador único para los comandos IPC",
"enter-path": "Introduce la ruta...",
"enter-text-to-collapse": "p.ej., 'no se está reproduciendo nada'. Usa /regex/ para patrones.",
"enter-tooltip": "Introduce tooltip",
"enter-width-pixels": "Introduce el ancho en píxeles",
"search": "Buscar...",
"search-icons": "ej., noctalia, niri, battery, cloud",
"search-launcher": "Buscar entradas... o usa > para comandos",
@@ -1479,7 +1503,7 @@
"setup": {
"all-done": "¡Listo!",
"appearance": {
"subheader": "Elige el Dark Mode y las fuentes de color (Wallpaper o predefinidas)."
"subheader": "Elige el Modo Oscuro y las fuentes de color (Wallpaper o predefinidas)."
},
"customize": {
"header": "Personaliza tu experiencia",
@@ -1487,14 +1511,14 @@
},
"skip-setup": "Omitir la configuración",
"telemetry-wizard-done": "¡Entendido!",
"telemetry-wizard-note": "Tienes el control: activa o desactiva esto cuando quieras en los Ajustes",
"telemetry-wizard-note": "Tienes el control activa o desactiva esto cuando quieras en los Ajustes",
"telemetry-wizard-subtitle": "Hemos añadido analíticas anónimas para ayudar a mejorar Noctalia",
"telemetry-wizard-title": "Actualización de privacidad",
"wallpaper": {
"choose-dir": "Elige un directorio que contenga tus fondos",
"choose-dir": "Elige un directorio que contenga tus fondos de pantalla",
"dir-browse": "Seleccionar carpeta",
"dir-description": "Elige la carpeta que contiene tus fondos.",
"dir-label": "Directorio de fondos",
"dir-description": "Elige la carpeta que contiene tus fondos de pantalla.",
"dir-label": "Directorio de fondos de pantalla",
"dir-select-title": "Seleccionar carpeta de fondos",
"header": "Elige tu fondo",
"no-dir": "No se seleccionó un directorio de fondos",
@@ -1504,7 +1528,7 @@
"select-prompt": "Selecciona un fondo abajo",
"subheader": "Define el ambiente con un bonito fondo."
},
"welcome-note": "Solo algunos conceptos básicos para empezar: todas las opciones están en configuración",
"welcome-note": "Solo algunos ajustes básicos para empezar las opciones al completo están en configuración",
"welcome-subtitle": "Hagamos que tu escritorio sea único",
"welcome-title": "¡Bienvenido a Noctalia!"
},
@@ -1528,7 +1552,7 @@
"disk": "Disco",
"download-speed": "Velocidad de descarga",
"gpu-temp": "Temperatura de GPU",
"load-average": "Carga prom.",
"load-average": "Carga media",
"title": "Monitor del sistema",
"upload-speed": "Velocidad de subida"
},
@@ -1551,8 +1575,8 @@
"display-code": "Introduce el código {value} en el otro dispositivo.",
"forget-failed": "Error al olvidar el dispositivo",
"pair-failed": "Error al emparejar el dispositivo",
"passkey-required": "Se requiere una clave de acceso del dispositivo.",
"pincode-required": "Se requiere el código PIN del dispositivo.",
"passkey-required": "El dispositivo requiere una clave de acceso.",
"pincode-required": "El dispositivo requiere código PIN.",
"state-change-failed": "Error al cambiar el estado de Bluetooth"
},
"clipboard": {
@@ -1588,7 +1612,7 @@
},
"power-profile": {
"changed": "Perfil de energía cambiado",
"profile-name": "{profile"
"profile-name": "{profile}"
},
"theming-processor-failed": {
"desc-generic": "Se encontró un error al procesar las plantillas",
@@ -1648,7 +1672,7 @@
"open-settings": "Configuración",
"open-tray-dropdown": "Bandeja del sistema",
"output-muted": "Alternar silencio de salida",
"power-profile": "{profile} perfil de energía",
"power-profile": "Perfil de energía {profile}",
"previous-media": "Pista anterior",
"previous-month": "Mes anterior",
"refresh-devices": "Actualizar dispositivos",
@@ -1658,8 +1682,8 @@
"search-close": "Cerrar búsqueda",
"session-menu": "Menú de sesión",
"show-all-devices": "Mostrar todos los dispositivos",
"switch-to-dark-mode": "Modo oscuro",
"switch-to-light-mode": "Modo claro",
"switch-to-dark-mode": "Modo Oscuro",
"switch-to-light-mode": "Modo Claro",
"unmute": "Activar el audio",
"up": "Directorio superior",
"volume-at": "Volumen de salida: {volume}%",
@@ -1668,7 +1692,7 @@
"wallpaper": {
"browse": {
"empty-directory": "Este directorio está vacío.",
"go-root": "Ir a la raíz del fondo de pantalla",
"go-root": "Ir a la carpeta raíz de fondos de pantalla",
"go-up": "Ir a la carpeta superior",
"go-up-hint": "Usa el botón de atrás para navegar hacia arriba."
},
@@ -1711,7 +1735,7 @@
"sorting-favorites": "Favoritos",
"sorting-label": "Ordenar por",
"sorting-relevance": "Relevancia",
"sorting-toplist": "Lista superior",
"sorting-toplist": "Mejores",
"sorting-views": "Visualizaciones",
"source-label": "Fuente",
"source-wallhaven": "Wallhaven",
@@ -1769,7 +1793,7 @@
"minute-leading-zero": "Minuto con cero inicial (00-59)",
"minute-no-leading-zero": "Minuto sin cero inicial (0-59)",
"month-abbreviated": "Nombre del mes abreviado",
"month-full": "Nombre completo del mes",
"month-full": "Nombre del mes completo",
"month-number-leading-zero": "Mes como número con cero inicial (01-12)",
"month-number-no-zero": "Mes como número sin cero inicial (1-12)",
"second-leading-zero": "Segundo con cero inicial (00-59)",
@@ -1782,15 +1806,15 @@
"item": "elemento",
"items": "elementos",
"search-placeholder": "Buscar archivos y carpetas...",
"select-current": "Seleccionar actual",
"select-file": "Seleccionar archivo",
"select-folder": "Seleccionar carpeta",
"select-current": "Seleccionar Actual",
"select-file": "Seleccionar Archivo",
"select-folder": "Seleccionar Carpeta",
"selected": "Seleccionado:",
"title": "Selector de archivos"
"title": "Selector de Archivos"
},
"file-picker-title": "Seleccionar un archivo",
"icon-picker": {
"title": "Selector de iconos"
"title": "Selector de Iconos"
},
"tooltip-placeholder": "Marcador de posición"
},
@@ -1815,7 +1839,7 @@
"known-networks": "Redes conocidas",
"link-speed": "Velocidad de enlace",
"no-ethernet-devices": "No se detectaron dispositivos Ethernet",
"no-networks": "No se encontraron redes",
"no-networks": "No se encontraron redes Wi-Fi",
"saved": "Guardado",
"scan-again": "Escanear de nuevo",
"searching": "Buscando redes cercanas...",
@@ -1823,9 +1847,9 @@
},
"signal": {
"excellent": "Excelente",
"fair": "Regular",
"fair": "Razonable",
"good": "Bueno",
"poor": "Débil"
"poor": "Pobre"
}
}
}
+26 -2
View File
@@ -354,7 +354,7 @@
"actions": "Actions",
"add": "Ajouter",
"appearance": "Apparence",
"apply": "Postuler",
"apply": "Appliquer",
"automation": "Automatisation",
"available": "Disponible",
"back": "Retour",
@@ -493,6 +493,7 @@
"week": "Semaine",
"widgets": "Widgets",
"width": "Largeur",
"windows": "Fenêtres",
"yes": "Oui"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "Au survol"
},
"hide-modes": {
"auto-hide": "Masquer automatiquement ",
"hidden": "Masquer quand vide",
"idle": "Masquer quand inactif",
"transparent": "Transparent quand vide",
@@ -563,7 +565,9 @@
"emoji-loading": "Chargement des émojis...",
"emoji-loading-description": "Veuillez patienter",
"emoji-no-recent": "Aucun emoji récent pour le moment",
"emoji-search-description": "Rechercher et copier des émojis"
"emoji-search-description": "Rechercher et copier des émojis",
"settings-search-description": "Trouvez et explorez les paramètres",
"windows-search-description": "Rechercher et focaliser les fenêtres ouvertes"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "Défaut",
"density-mini": "Mini",
"density-spacious": "Spacieux",
"display-mode-always-visible": "Toujours Visible",
"type-floating": "Flottante",
"type-framed": "Encadrée",
"type-simple": "Simple"
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "Autoriser le dépassement du volume"
},
"bar": {
"appearance-auto-hide-delay-description": "Délai avant que la barre ne se masque après le départ de la souris",
"appearance-auto-hide-delay-label": "Délai de masquage ",
"appearance-auto-hide-exclusive-note": "Remarque : La zone exclusive est automatiquement désactivée lorsque le masquage automatique est actif",
"appearance-auto-show-delay-description": "Délai avant que la barre ne saffiche lorsque la souris entre en bordure",
"appearance-auto-show-delay-label": "Délai dapparition ",
"appearance-background-opacity-description": "Définir l'opacité de l'arrière-plan spécifiquement pour la barre.",
"appearance-background-opacity-label": "Opacité de l'arrière-plan de la barre",
"appearance-capsule-opacity-description": "Définir le niveau d'opacité des arrière-plans des widgets quand la capsule est affichée.",
@@ -728,6 +738,8 @@
"appearance-density-description": "Ajustez le remplissage de la barre pour un aspect compact ou spacieux.",
"appearance-density-label": "Densité de la barre",
"appearance-desc": "Personnalisez l'apparence et la position de la barre.",
"appearance-display-mode-description": "Choisir quand la barre est visible ",
"appearance-display-mode-label": "Mode daffichage ",
"appearance-floating-description": "Afficher la barre sous forme de 'pilule' flottante.",
"appearance-floating-label": "Barre flottante",
"appearance-frame-radius": "Rayon interne",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "Afficher les boutons",
"media-player-show-visualizer-description": "Afficher la superposition de l'visualiseur audio.",
"media-player-visualizer-type-description": "Choisissez un type de visualisation pour l'arrière-plan du lecteur multimédia de bureau.",
"system-stat-layout-bottom": "Bas",
"system-stat-layout-description": "Choisissez comment la légende est affichée par rapport au graphique.",
"system-stat-layout-label": "Disposition",
"system-stat-layout-side": "Côté",
"system-stat-rounded-corners-description": "Utiliser des coins arrondis pour l'arrière-plan du widget.",
"system-stat-rounded-corners-label": "Coins Arrondis",
"system-stat-show-background-description": "Afficher le conteneur d'arrière-plan pour le widget de statistiques système.",
"system-stat-show-background-label": "Afficher l'arrière-plan",
"system-stat-stat-type-description": "Choisis quelle statistique système afficher.",
"system-stat-stat-type-label": "Type de Statistique",
"title": "Widgets de bureau",
"weather-enabled-description": "Afficher un widget météo sur le bureau.",
"weather-enabled-label": "Activer le widget météo",
@@ -1067,6 +1089,8 @@
"settings-desc": "Personnalisez le comportement et l'apparence du lanceur.",
"settings-enable-settings-search-description": "Afficher les résultats des paramètres lors de la recherche dans le lanceur.",
"settings-enable-settings-search-label": "Activer la recherche dans les paramètres",
"settings-enable-windows-search-description": "Rechercher et focaliser les fenêtres actives.",
"settings-enable-windows-search-label": "Activer la recherche de fenêtres",
"settings-grid-view-description": "Afficher les éléments dans une grille au lieu d'une liste.",
"settings-icon-mode-description": "Utiliser les icônes natives du système au lieu des icônes Tabler.",
"settings-icon-mode-label": "Utiliser les icônes natives",
+1 -25
View File
@@ -1,29 +1,5 @@
{
"bar": {
"workspace": {
"empty-color-description": "खाली कार्यस्थानों के लिए पृष्ठभूमि रंग सेट करें।",
"empty-color-label": "खाली कार्यस्थान रंग",
"focused-color-description": "फोकस गरिएको कार्यक्षेत्रको लागि पृष्ठभूमि रङ सेट गर्नुहोस्।",
"focused-color-label": "फोकस किए गए कार्यक्षेत्र का रंग",
"occupied-color-description": "काम में लिए गए कार्यस्थानों के लिए पृष्ठभूमि रंग सेट करें।",
"occupied-color-label": "अधिकृत कार्यक्षेत्र रंग",
"show-badge-description": "समूहीकृत मोड में कार्यस्थान संख्या बैज दिखाएँ।",
"show-badge-label": "कार्यस्थान बैज देखाउनुहोस्"
}
},
"common": {
"on-surface": "सतह पर",
"primary": "प्राइमरी",
"secondary": "माध्यमिक",
"tertiary": "तृतीयक"
},
"panels": {
"lock-screen": {
"auto-start-auth-description": "उदाहरण के लिए, बिना किसी कुंजी प्रेस या बटन क्लिक की आवश्यकता के स्वचालित रूप से फिंगरप्रिंट प्रमाणीकरण शुरू करता है।",
"auto-start-auth-label": "स्वतः प्रमाणन शुरू करें"
}
},
"toast": {
"donation-opened": "दान पृष्ठ आपके ब्राउज़र में खुला"
"donation-opened": ""
}
}
+25 -1
View File
@@ -493,6 +493,7 @@
"week": "Hét",
"widgets": "Widgetek",
"width": "Szélesség",
"windows": "Ablakok",
"yes": "Igen"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "Rámutatáskor"
},
"hide-modes": {
"auto-hide": "Automatikus elrejtés",
"hidden": "Elrejtés, ha üres",
"idle": "Elrejtés, ha tétlen",
"transparent": "Átlátszó, ha üres",
@@ -563,7 +565,9 @@
"emoji-loading": "Emojik betöltése...",
"emoji-loading-description": "Kis türelmet",
"emoji-no-recent": "Nincsenek még legutóbbi emojik",
"emoji-search-description": "Emojik keresése és másolása"
"emoji-search-description": "Emojik keresése és másolása",
"settings-search-description": "Keresés és navigálás a beállításokhoz",
"windows-search-description": "Nyitott ablakok keresése és fókuszálása"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "Alapértelmezett",
"density-mini": "Mini",
"density-spacious": "Tágas",
"display-mode-always-visible": "Mindig látható",
"type-floating": "Lebegő",
"type-framed": "Keretes",
"type-simple": "Egyszerű"
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "Hangerő túllépésének engedélyezése"
},
"bar": {
"appearance-auto-hide-delay-description": "Idő, amíg a Bar elrejtőzik, miután az egér elhagyja.",
"appearance-auto-hide-delay-label": "Elrejtési késleltetés",
"appearance-auto-hide-exclusive-note": "Megjegyzés: Az exkluzív zóna automatikusan letiltásra kerül, ha az automatikus elrejtés aktív.",
"appearance-auto-show-delay-description": "Idő, mielőtt a sáv megjelenik, ha az egér a szélre kerül.",
"appearance-auto-show-delay-label": "Megjelenítési Késleltetés",
"appearance-background-opacity-description": "Állítsa be a sáv háttér átlátszóságát.",
"appearance-background-opacity-label": "Sáv háttér átlátszósága",
"appearance-capsule-opacity-description": "Beállítja a widget hátterének átlátszósági szintjét, amikor a kapszula megjelenik.",
@@ -728,6 +738,8 @@
"appearance-density-description": "Beállítja a sáv belső margóit a kompakt vagy tágas megjelenés érdekében.",
"appearance-density-label": "Sáv sűrűsége",
"appearance-desc": "A sáv megjelenésének és pozíciójának testreszabása.",
"appearance-display-mode-description": "Válassza ki, mikor látható a sáv.",
"appearance-display-mode-label": "Kijelző mód",
"appearance-floating-description": "Megjeleníti a sávot lebegő „pirulaként”.",
"appearance-floating-label": "Lebegő sáv",
"appearance-frame-radius": "Belső sugár",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "Gombok megjelenítése",
"media-player-show-visualizer-description": "Audiovizuális megjelenítő fedvény megjelenítése.",
"media-player-visualizer-type-description": "Válasszon vizualizációs típust az asztali média lejátszó hátteréhez.",
"system-stat-layout-bottom": "Lent",
"system-stat-layout-description": "Válassza ki, hogyan jelenjen meg a jelmagyarázat a grafikonhoz képest.",
"system-stat-layout-label": "Elrendezés",
"system-stat-layout-side": "Oldal",
"system-stat-rounded-corners-description": "Lekerekített sarkok használata a widget hátteréhez.",
"system-stat-rounded-corners-label": "Lekerekített Sarkok",
"system-stat-show-background-description": "Mutassa a háttérkonténert a rendszerstatisztika Widgethez.",
"system-stat-show-background-label": "Háttér megjelenítése",
"system-stat-stat-type-description": "Válaszd ki, melyik rendszerstatisztikát jelenítsd meg.",
"system-stat-stat-type-label": "Statisztika Típusa",
"title": "Asztali Widgetek",
"weather-enabled-description": "Időjárás widget megjelenítése az asztalon.",
"weather-enabled-label": "Időjárás widget engedélyezése",
@@ -1067,6 +1089,8 @@
"settings-desc": "Az indító viselkedésének és megjelenésének testreszabása.",
"settings-enable-settings-search-description": "Beállítások megjelenítése a találatok között az indítón belül.",
"settings-enable-settings-search-label": "Beállítások keresésének engedélyezése",
"settings-enable-windows-search-description": "Aktív ablakok keresése és fókuszálása.",
"settings-enable-windows-search-label": "Ablakkeresés engedélyezése",
"settings-grid-view-description": "Elemek megjelenítése rács elrendezésben lista helyett.",
"settings-icon-mode-description": "Használjon natív rendszerikonokat a Tabler ikonok helyett.",
"settings-icon-mode-label": "Natív ikonok használata",
+25 -1
View File
@@ -493,6 +493,7 @@
"week": "週",
"widgets": "ウィジェット",
"width": "幅",
"windows": "ウィンドウ",
"yes": "はい"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "マウスオーバー時"
},
"hide-modes": {
"auto-hide": "自動非表示",
"hidden": "空の場合に非表示",
"idle": "アイドル時に非表示",
"transparent": "空の時は透明",
@@ -563,7 +565,9 @@
"emoji-loading": "絵文字を読み込み中...",
"emoji-loading-description": "お待ちください",
"emoji-no-recent": "まだ最近使った絵文字はありません",
"emoji-search-description": "絵文字を検索してコピー"
"emoji-search-description": "絵文字を検索してコピー",
"settings-search-description": "設定を検索して移動",
"windows-search-description": "開いているウィンドウを検索してフォーカスする"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "標準",
"density-mini": "ミニ",
"density-spacious": "広々とした",
"display-mode-always-visible": "常に表示",
"type-floating": "フローティング",
"type-framed": "フレーム",
"type-simple": "シンプル"
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "100%以上の音量を許可"
},
"bar": {
"appearance-auto-hide-delay-description": "マウスカーソルがBarから離れた後、Barが非表示になるまでの時間",
"appearance-auto-hide-delay-label": "非表示遅延",
"appearance-auto-hide-exclusive-note": "注: 自動非表示が有効な場合、排他ゾーンは自動的に無効になります。",
"appearance-auto-show-delay-description": "マウスが端に到達したときにバーが表示されるまでの時間。",
"appearance-auto-show-delay-label": "表示遅延",
"appearance-background-opacity-description": "バーの背景の不透明度を特に設定します。",
"appearance-background-opacity-label": "バーの背景の不透明度",
"appearance-capsule-opacity-description": "カプセル表示時のウィジェット背景の不透明度を設定します。",
@@ -728,6 +738,8 @@
"appearance-density-description": "バーの余白を調整し、コンパクトまたはゆったりとした外観にします。",
"appearance-density-label": "バーの密度",
"appearance-desc": "バーの外観や位置をカスタマイズします。",
"appearance-display-mode-description": "バーの表示タイミングを選択してください",
"appearance-display-mode-label": "表示モード",
"appearance-floating-description": "バーを浮かせて、カプセル型で表示します。",
"appearance-floating-label": "フローティングバー",
"appearance-frame-radius": "内側の半径",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "ボタンを表示",
"media-player-show-visualizer-description": "オーディオビジュアライザーのオーバーレイを表示する。",
"media-player-visualizer-type-description": "デスクトップメディアプレーヤーの背景に使用するビジュアライザーの種類を選択します。",
"system-stat-layout-bottom": "下",
"system-stat-layout-description": "凡例がグラフに対してどのように表示されるかを選択します。",
"system-stat-layout-label": "レイアウト",
"system-stat-layout-side": "側",
"system-stat-rounded-corners-description": "ウィジェットの背景に丸い角を使用する。",
"system-stat-rounded-corners-label": "角丸",
"system-stat-show-background-description": "システム統計ウィジェットの背景コンテナを表示します。",
"system-stat-show-background-label": "背景を表示",
"system-stat-stat-type-description": "表示するシステム統計を選択してください。",
"system-stat-stat-type-label": "統計の種類",
"title": "デスクトップウィジェット",
"weather-enabled-description": "デスクトップに天気ウィジェットを表示します。",
"weather-enabled-label": "天気ウィジェットを有効化",
@@ -1067,6 +1089,8 @@
"settings-desc": "ランチャーの挙動と外観をカスタマイズします。",
"settings-enable-settings-search-description": "ランチャーで検索する際に設定結果を表示する。",
"settings-enable-settings-search-label": "設定検索を有効にする",
"settings-enable-windows-search-description": "アクティブなウィンドウを検索してフォーカスします。",
"settings-enable-windows-search-label": "ウィンドウ検索を有効にする",
"settings-grid-view-description": "リスト形式の代わりに、グリッド(格子状)レイアウトで項目を表示します。",
"settings-icon-mode-description": "Tablerアイコンではなく、ネイティブのシステムアイコンを使用します。",
"settings-icon-mode-label": "ネイティブアイコンを使用",
+54 -30
View File
@@ -370,7 +370,7 @@
"clear": "지우기",
"clipboard": "클립보드",
"close": "닫기",
"color-muted": "음소거",
"color-muted": "차분하게",
"colors": "색상",
"command": "명령",
"connect": "연결",
@@ -395,7 +395,7 @@
"enabled": "활성화됨",
"events": "일정",
"execute": "실행",
"faithful": "Faithful",
"faithful": "충실하게",
"focus": "포커스",
"frequency": "빈도",
"gateway": "게이트웨이",
@@ -483,7 +483,7 @@
"update": "업데이트",
"upload": "업로드",
"version": "버전",
"vibrant": "생기 있게",
"vibrant": "선명하게",
"visualizer": "비주얼라이저",
"volume": "볼륨",
"volumes": "볼륨",
@@ -493,6 +493,7 @@
"week": "주",
"widgets": "위젯",
"width": "너비",
"windows": "창",
"yes": "예"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "마우스 오버 시"
},
"hide-modes": {
"auto-hide": "자동 숨기기",
"hidden": "비어 있을 때 숨기기",
"idle": "유휴 상태일 때 숨기기",
"transparent": "비어 있을 때 투명하게",
@@ -563,7 +565,9 @@
"emoji-loading": "이모티콘 로딩 중...",
"emoji-loading-description": "잠시만 기다려 주세요",
"emoji-no-recent": "최근 이모티콘이 없습니다",
"emoji-search-description": "이모티콘 검색 및 복사"
"emoji-search-description": "이모티콘 검색 및 복사",
"settings-search-description": "설정 검색 및 이동",
"windows-search-description": "열려 있는 창 검색 및 포커스"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "기본",
"density-mini": "미니",
"density-spacious": "넓게",
"display-mode-always-visible": "항상 표시",
"type-floating": "플로팅",
"type-framed": "프레임",
"type-simple": "심플"
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "볼륨 오버드라이브 허용"
},
"bar": {
"appearance-auto-hide-delay-description": "마우스가 Bar를 벗어난 후 Bar가 숨겨지기까지의 시간",
"appearance-auto-hide-delay-label": "숨기기 지연",
"appearance-auto-hide-exclusive-note": "참고: 자동 숨기기가 활성화되면 전용 영역이 자동으로 비활성화됩니다.",
"appearance-auto-show-delay-description": "마우스가 가장자리에 진입할 때 바가 표시되기까지의 시간.",
"appearance-auto-show-delay-label": "표시 지연",
"appearance-background-opacity-description": "바에 대해서만 별도로 배경 불투명도를 설정합니다.",
"appearance-background-opacity-label": "바 배경 불투명도",
"appearance-capsule-opacity-description": "캡슐이 표시될 때 위젯 배경의 불투명도 수준을 설정합니다.",
@@ -728,6 +738,8 @@
"appearance-density-description": "컴팩트하거나 넓은 모양을 위해 바의 패딩을 조정합니다.",
"appearance-density-label": "바 밀도",
"appearance-desc": "바의 모양과 위치를 사용자 지정합니다.",
"appearance-display-mode-description": "바가 언제 표시될지 선택하세요.",
"appearance-display-mode-label": "디스플레이 모드",
"appearance-floating-description": "바를 플로팅 '알약' 형태로 표시합니다.",
"appearance-floating-label": "플로팅 바",
"appearance-frame-radius": "내부 반경",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "버튼 표시",
"media-player-show-visualizer-description": "오디오 비주얼라이저 오버레이를 표시합니다.",
"media-player-visualizer-type-description": "비주얼라이저 유형을 선택하세요.",
"system-stat-layout-bottom": "아래",
"system-stat-layout-description": "범례가 그래프에 상대적으로 어떻게 표시되는지 선택합니다.",
"system-stat-layout-label": "레이아웃",
"system-stat-layout-side": "측면",
"system-stat-rounded-corners-description": "위젯 배경에 둥근 모서리를 사용합니다.",
"system-stat-rounded-corners-label": "둥근 모서리",
"system-stat-show-background-description": "시스템 통계 위젯의 배경 컨테이너를 표시합니다.",
"system-stat-show-background-label": "배경 표시",
"system-stat-stat-type-description": "표시할 시스템 통계를 선택하세요.",
"system-stat-stat-type-label": "통계 유형",
"title": "바탕 화면 위젯",
"weather-enabled-description": "바탕 화면에 날씨 위젯을 표시합니다.",
"weather-enabled-label": "날씨 위젯 활성화",
@@ -913,8 +935,8 @@
"monitors-title": "모니터별 설정",
"night-light-auto-schedule-description": "<i>{location}</i>의 일몰 및 일출 시간을 기준으로 함 — 권장됨.",
"night-light-auto-schedule-label": "자동 일정",
"night-light-desc": "청색광 방출을 줄여 수면을 돕고 눈의 피로를 줄입니다.",
"night-light-enable-description": "청색광 방출을 줄이기 위해 따뜻한 색상 필터를 적용합니다.",
"night-light-desc": "청색광(블루 라이트) 방출을 줄여 수면을 돕고 눈의 피로를 줄입니다.",
"night-light-enable-description": "청색광(블루 라이트) 방출을 줄이기 위해 따뜻한 색상 필터를 적용합니다.",
"night-light-enable-label": "야간 조명 활성화",
"night-light-force-activation-description": "일정을 무시하고 야간 필터를 즉시 적용합니다.",
"night-light-force-activation-label": "강제 활성화",
@@ -1067,6 +1089,8 @@
"settings-desc": "런처의 동작과 모양을 사용자 지정합니다.",
"settings-enable-settings-search-description": "런처에서 검색할 때 설정 결과를 표시합니다.",
"settings-enable-settings-search-label": "설정 검색 활성화",
"settings-enable-windows-search-description": "활성 창을 검색하고 포커스합니다.",
"settings-enable-windows-search-label": "창 검색 활성화",
"settings-grid-view-description": "항목을 목록 대신 그리드 레이아웃으로 표시합니다.",
"settings-icon-mode-description": "Tabler 아이콘 대신 기본 시스템 아이콘을 사용합니다.",
"settings-icon-mode-label": "기본 아이콘 사용",
@@ -1145,24 +1169,24 @@
"wifi-description": "무선 네트워크를 관리합니다 (NetworkManager 필요)."
},
"notifications": {
"duration-critical-urgency-description": "긴급 중요도 알림이 표시되는 시간입니다.",
"duration-critical-urgency-label": "긴급 중요도",
"duration-desc": "중요도 수준에 따라 알림이 표시되는 시간을 구성합니다.",
"duration-low-urgency-description": "낮음 중요도 알림이 표시되는 시간입니다.",
"duration-low-urgency-label": "낮음 중요도",
"duration-normal-urgency-description": "보통 중요도 알림이 표시되는 시간입니다.",
"duration-normal-urgency-label": "보통 중요도",
"duration-critical-urgency-description": "긴급 레벨의 알림이 표시되는 시간입니다.",
"duration-critical-urgency-label": "중요도 긴급",
"duration-desc": "중요도에 따라 알림이 표시되는 시간을 구성합니다.",
"duration-low-urgency-description": "낮은 레벨의 알림이 표시되는 시간입니다.",
"duration-low-urgency-label": "중요도 낮음",
"duration-normal-urgency-description": "보통 레벨의 알림이 표시되는 시간입니다.",
"duration-normal-urgency-label": "중요도 보통",
"duration-reset": "시간 제한 초기화",
"duration-respect-expire-description": "알림에 설정된 만료 시간을 사용합니다.",
"duration-respect-expire-label": "만료 시간 준수",
"duration-title": "알림 지속 시간",
"history-critical-urgency-description": "긴급 중요도 알림을 기록에 저장합니다.",
"history-critical-urgency-label": "긴급 중요도 기록 저장",
"history-desc": "중요도 수준에 따라 기록에 저장할 알림을 제어합니다.",
"history-low-urgency-description": "낮음 중요도 알림을 기록에 저장합니다.",
"history-low-urgency-label": "낮음 중요도 기록 저장",
"history-normal-urgency-description": "보통 중요도 알림을 기록에 저장합니다.",
"history-normal-urgency-label": "보통 중요도 기록 저장",
"history-critical-urgency-description": "긴급 레벨의 알림을 기록에 저장합니다.",
"history-critical-urgency-label": "중요도 긴급 기록 저장",
"history-desc": "레벨 수준에 따라 기록에 저장할 알림을 제어합니다.",
"history-low-urgency-description": "낮은 레벨의 알림을 기록에 저장합니다.",
"history-low-urgency-label": "중요도 낮음 기록 저장",
"history-normal-urgency-description": "보통 레벨의 알림을 기록에 저장합니다.",
"history-normal-urgency-label": "중요도 보통 기록 저장",
"media-toast-description": "미디어 재생 상태가 변경될 때 토스트를 표시합니다.",
"media-toast-label": "미디어",
"monitors-desc": "특정 모니터에 알림을 표시합니다. 선택하지 않으면 모든 모니터에 표시됩니다.",
@@ -1180,23 +1204,23 @@
"sounds-excluded-apps-label": "제외된 애플리케이션",
"sounds-excluded-apps-placeholder": "discord,firefox,chrome,chromium,edge",
"sounds-files-critical-description": "긴급 레벨의 알림에 재생할 소리 파일 경로입니다.",
"sounds-files-critical-label": "긴급 레벨 소리",
"sounds-files-critical-select-title": "긴급 레벨 소리 파일 선택",
"sounds-files-desc": "다양한 알림 레벨 수준에 대해 사용자 지정 소리 파일을 구성합니다.",
"sounds-files-critical-label": "긴급 레벨의 알림 소리",
"sounds-files-critical-select-title": "긴급 레벨의 알림 소리 파일 선택",
"sounds-files-desc": "다양한 알림 수준에 대해 사용자 지정 소리 파일을 구성합니다.",
"sounds-files-low-description": "낮은 레벨의 알림에 재생할 소리 파일 경로입니다.",
"sounds-files-low-label": "낮 레벨 소리",
"sounds-files-low-select-title": "낮 레벨 소리 파일 선택",
"sounds-files-low-label": "낮 레벨의 알림 소리",
"sounds-files-low-select-title": "낮 레벨의 알림 소리 파일 선택",
"sounds-files-normal-description": "보통 레벨의 알림에 재생할 소리 파일 경로입니다.",
"sounds-files-normal-label": "보통 레벨 소리",
"sounds-files-normal-select-title": "보통 레벨 소리 파일 선택",
"sounds-files-normal-label": "보통 레벨의 알림 소리",
"sounds-files-normal-select-title": "보통 레벨의 알림 소리 파일 선택",
"sounds-files-placeholder": "소리 파일 경로 입력",
"sounds-files-select-file": "소리 파일 선택",
"sounds-files-title": "소리 파일",
"sounds-files-unified-description": "알림에 재생할 소리 파일 경로입니다.",
"sounds-files-unified-label": "알림 소리",
"sounds-files-unified-select-title": "알림 소리 파일 선택",
"sounds-separate-description": "낮음, 보통, 긴급 레벨 알림에 대해 서로 다른 소리 파일을 사용합니다.",
"sounds-separate-label": "레벨별 다른 소리 사용",
"sounds-separate-description": "중요도 낮음, 보통, 긴급 알림에 대해 서로 다른 소리 파일을 사용합니다.",
"sounds-separate-label": "중요도 별로 다른 소리 사용",
"sounds-title": "소리 설정",
"sounds-unavailable-description": "알림 소리를 활성화하려면 Qt6 Multimedia를 설치하세요.",
"sounds-unavailable-label": "알림 소리 사용 불가",
@@ -1401,7 +1425,7 @@
"automation-interval-label": "배경화면 간격",
"automation-random-wallpaper-description": "정기적인 간격으로 랜덤 배경화면 변경을 예약합니다.",
"automation-scheduled-change-description": "정기적인 간격으로 배경화면을 자동으로 변경합니다.",
"automation-scheduled-change-label": "예약된 변경",
"automation-scheduled-change-label": "자동 변경",
"look-feel-edge-smoothness-description": "전환 가장자리에 부드러운 페더링 효과를 적용합니다.",
"look-feel-edge-smoothness-label": "전환 가장자리 부드럽게",
"look-feel-fill-color-description": "배경화면 뒤에 나타날 수 있는 채우기 색상을 선택하세요.",
+201 -177
View File
@@ -4,26 +4,26 @@
"close-app": "{app} bigire",
"connect-vpn": "Bi {name} ve girê bide",
"cycle-visualizer": "Dîmenkerê çerxê",
"disable-bluetooth": "Bluetooth neçalak bike",
"disable-bluetooth": "Bluetooth çalak neke",
"disable-dnd": "'Dengê dernexîne' çalak neke",
"disable-wifi": "Wi-Fi çalak neke",
"disconnect-vpn": "Girêdanê bi {name} re qut bike",
"enable-bluetooth": "Bluetooth çalak bike",
"enable-dnd": "'Dengê dernexîne' çalak bike",
"enable-wifi": "Wi-Fi çalak bike",
"launcher-settings": "Mîhengên destpêkerê",
"lower-to-bottom": "Daxistin bo binî",
"launcher-settings": "Sazkariyên destpêkarê",
"lower-to-bottom": "Bo jêr daxîne",
"open-calendar": "Salnameyê veke",
"open-display-settings": "Sazkariyên dîmenderê",
"open-launcher": "Destpêkarê veke",
"open-settings": "Sazkariyan veke",
"raise-to-top": "Serê jorîn bilind bike",
"random-wallpaper": "Wêneyê dîwarê rasthatî",
"run-custom-command": "Fermana xwerû bimeşîne",
"raise-to-top": "Bo jor bilind bike",
"random-wallpaper": "Wêneyê dîwêrê rastehatî",
"run-custom-command": "Fermana kesane bixebtîne",
"show-active-only": "Tenê yên çalak nîşan bide",
"show-all": "Hemûyan nîşan bide",
"toggle-mute": "Guherandin bêdeng bike",
"widget-settings": "Sazkariyên alavê"
"toggle-mute": "Guhertîna bêdengkirinê",
"widget-settings": "Sazkariyên sepanokê"
},
"authentication": {
"error": "Şaşetiya rastkirinê",
@@ -32,7 +32,7 @@
"bar": {
"active-window": {
"colorize-icons-description": "Rengên rûkarê li ser îkona çarçoveya çalak bisepîne.",
"hide-mode-description": "Dema ku çarçove neçalak be, kontrol dike ka alav çawa tev digere.",
"hide-mode-description": "Dema ku çarçove neçalak be, kontrol dike ka sepanok çawa tev digere.",
"scrolling-mode-description": "Dema ku şemitandina nivîsê ji bo sernavên çarçoveyên ên dirêj çalak e, kontrol bike.",
"show-app-icon-description": "Îkona sepanê li kêleka sernavê çarçoveyê nîşan bide.",
"show-app-icon-label": "Îkona sepanê nîşan bide"
@@ -45,17 +45,17 @@
"width-description": "Ferehiya pêkhateya kesane."
},
"battery": {
"device-default": "Kesane (Amûra nîşandanê)",
"device-default": "Berdest (Amûra dîmenderê)",
"device-description": "Ka kîjan amûrê betarî hilbijêre ku were nîşandan.",
"device-label": "Amûrê betarî",
"hide-if-idle-description": "Dema ku pîl ne tê barkirin an valakirin, widgetê veşêre.",
"hide-if-idle-description": "Dema ku betarî neyê tijîkirin an valakirin, sepanokê veşêre.",
"hide-if-idle-label": "Dema de bêkar veşêre",
"hide-if-not-detected-description": "Dema pîl li ser pergalê neyê dîtin, widgetê veşêre.",
"hide-if-not-detected-label": "Veşêre eger nehat dîtin",
"hide-if-not-detected-description": "Dema betarî li ser pergalê neyê dîtin, sepanokê veşêre.",
"hide-if-not-detected-label": "Veşêre ku bêkar be",
"low-battery-threshold-description": "Dema ku betarî ji vê rêjeyê kêmtir bibe, hişyariyekê nîşan bide.",
"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 vedike da ku karanîna çavkaniyan kêm bike.",
"show-noctalia-performance-label": "Guhbarê performansa Noctalia nîşan bide",
"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-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"
},
@@ -102,7 +102,7 @@
"enable-colorization-description": "Rengînkirinê ji bo îkona bişkoka xwerû û nivîsê çalak bike, rengên temayê bi kar bîne.",
"enable-colorization-label": "Rengînkirin çalak bike",
"hide-mode-always-expanded": "Her tim berfireh kirin",
"hide-mode-description": "Kontrola xuyabûna widgetê dema ku ferman encamek tune.",
"hide-mode-description": "Dema ku ferman tune be, dîtina sepanokê kontrol dike.",
"hide-mode-expand-with-output": "Berfireh bike dema ku derket hebe",
"hide-mode-label": "Hêşartin modê",
"hide-mode-max-transparent": "Herî zêde berfirehkirî lê şefaf",
@@ -157,7 +157,7 @@
"compact-mode-description": "Çalak bike sêwirandinek ku cih digire ji bo panelê lîstikvanê medyayê.",
"compact-mode-label": "ڕێگای کورتکراوە",
"hide-mode-description": "Kontrola ku widget çawa tevdigere dema ku tu medya nayê lîstin.",
"max-width-description": "Mezinahiya herî zêde ya horizontî ya widgetê diyar dike. Widget dê bi naveroka kurt re were kurtkirin.",
"max-width-description": "Mezinahiya herî mezin a asoyî ya sepanokê saz dike. Sepanok wê bi naveroka kurt re were biçûkkirin.",
"no-active-player": "Bê lîstikvanê çalak",
"panel-section-description": "Xuyakirina xuyabûn û reftarên panelê lîstikvanê medyayê.",
"panel-section-label": "Panelê lîstikvanê medyayê",
@@ -188,7 +188,7 @@
},
"section-editor": {
"placeholder": "Widgetekek hilbijêre ku lê zêde bike...",
"search-placeholder": "Amûra lêgerînê..."
"search-placeholder": "Sepanokê bigere..."
},
"spacer": {
"width-description": "Firehiya firehiyê bi pîkselan."
@@ -196,13 +196,13 @@
"system-monitor": {
"compact-mode-description": "Statîstîkan wekî şîroveya barên piçûk nîşan bide li şûna nirxên nivîskî. Pêşî li guhertina layoutê digire.",
"compact-mode-label": "Rewşa Kompakt",
"cpu-temperature-description": "Germahiya CPUyê heke hebe nîşan bide.",
"cpu-temperature-label": "Germa CPUyê",
"cpu-temperature-description": "Germahiya YKN ku hebe nîşan bide.",
"cpu-temperature-label": "Germahiya YKN",
"cpu-usage-description": "Rêjeya bikaranîna CPU ya niha nîşan bide.",
"cpu-usage-label": "Bikaranîna CPUyê",
"cpu-usage-label": "Bikaranîna YKN",
"disk-path-description": "Hilbijêre kîjan xala çiyayê dîskê were şopandin.",
"disk-path-label": "Rêya dîskê",
"gpu-temperature-description": "Germahiya GPUyê, eger hebe, nîşan bide.",
"gpu-temperature-description": "Germahiya YKG ku hebe, nîşan bide.",
"load-average-description": "Barkirina navîn a pergalê nîşan bide.",
"load-average-label": "Barkirina navîn",
"memory-percentage-description": "Bîranînê wekî rêjeyekê nîşan bide, ne wekî nirxên mutleq.",
@@ -224,7 +224,7 @@
},
"taskbar": {
"colorize-icons-description": "Rengên temayê li îkonên taskbarê bicîh bike.",
"hide-mode-description": "Kontrol dike ka widget çawa tevdigere dema ku pencereyên lihevhatî tune ne.",
"hide-mode-description": "Dema ku çarçoveyên lihevhatî tune bin, sepanok çawa tev digere kontrol dike",
"hide-mode-label": "Moda veşartinê",
"icon-scale-description": "Pîvana îkonên taskbarê destnîşan dike.",
"icon-scale-label": "Pîvandina îkonan",
@@ -237,7 +237,7 @@
"show-pinned-apps-description": "Nîşandana sepanên pêçandî yên ji dockê di taskbarê de.",
"show-pinned-apps-label": "Nîşandan sepanên pêçandî",
"show-title-description": "Sernavên pencereyê di taskbarê de nîşan bide.",
"show-title-description-disabled": "ئەرکبارێ ستوونی پشتەڤانییا نیشاندان تایتڵان ناکەت.",
"show-title-description-disabled": "Darika erkê ya stûnî nîşandana sernavan piştgirî nake.",
"show-title-label": "Navê pêşandanê",
"smart-width-description": "Bi awayekî otomatîkî firehiya têketinê li gorî hejmara têketinan eyar bike.",
"smart-width-label": "Firehiya berz",
@@ -246,7 +246,7 @@
"title-width-reset-tooltip": "Firehiya firehiya sernavê"
},
"tray": {
"colorize-icons-description": "رەنگێن تەڤنێ ب نیشانێن ترەیێ بکار بینە.",
"colorize-icons-description": "Rengên rûkarê li ser îkonên devera agahiyê bisepîne.",
"colorize-icons-label": "Îkonan rengîn bike",
"drawer-enabled-description": "Dema ku çalak be, hêmanên trayê yên nehatine pin kirin di panelek dolabê de têne xuyang kirin.<br>Dema ku neçalak be, hemî hêmanên trayê inline têne xuyang kirin.",
"drawer-enabled-label": "Çalak bike dolabê",
@@ -277,7 +277,7 @@
"occupied-color-description": "Rengê paşxaneyê ji bo Workspaceên dagirkirî destnîşan bike.",
"occupied-color-label": "Rengê qada xebatê ya dagirkirî",
"reverse-scrolling-description": "Dema ku hûn digerînin, rêgeha guhertina cîhê kar berevajî bike.",
"reverse-scrolling-label": "گەڕاندنەوەی گەڕان",
"reverse-scrolling-label": "Şemitandinê berevajî bike",
"show-applications-description": "Nîşaneyên sepanan di hundirê her cîhê xebatê de nîşan bide.",
"show-applications-label": "Nîşan sepanan bide",
"show-badge-description": "Di moda komkirî de nîşana jimareya cîhê kar nîşan bide.",
@@ -289,7 +289,7 @@
}
},
"battery": {
"battery-health": "Rewşa Pîlê",
"battery-health": "Rewşa betariyê",
"battery-level": "Asta bataryayê",
"capacity-level": "Kapasîte: {level}",
"charging-rate": "Rêjeya barkirinê: {rate} W",
@@ -313,21 +313,21 @@
"enable-message": "Bo dîtina amûrên heyî Bluetooth çalak bike.",
"known-devices": "Amûrên naskirî",
"no-devices": "Amûr tune ne",
"paired-devices": "ghhdhd",
"paired-devices": "Amûrên hevgirtî",
"pairing-mode": "Piştrast bike ku cîhaza te di moda cotbûnê de ye.",
"scanning": "Lêgerîna cîhazan...",
"signal-text-excellent": "Nîşan: Baş e gelek",
"signal-text-fair": "Nîşan: Adil",
"signal-text-fair": "Nîşan: Bihêz e",
"signal-text-good": "Nîşan: Baş e",
"signal-text-poor": "Nîşan: Qels",
"signal-text-poor": "Nîşan: Lawaz e",
"signal-text-unknown": "Nîşan: Nenas",
"signal-text-very-poor": "Nîşan: Gelekî qels"
"signal-text-very-poor": "Nîşan: Gelekî lawaz e"
}
},
"changelog": {
"error": {
"fetch-failed": "Agahiyên guhertinê barkirin pêkan nebû. Ji kerema xwe re paşê dîsa biceribîne.",
"rate-limit": "Rêjeya GitHubê derbas bû. Ji kerema xwe di nav çend deqîqeyan de dîsa biceribîne."
"fetch-failed": "Nikare daneyên têketinê guhertinê bar bike. Paşê dîsa biceribîne.",
"rate-limit": "Rêjeya GitHub derbas bû. Di nav çend xulekanan de dîsa biceribîne."
},
"panel": {
"buttons-discord": "Têkeve Discorda me",
@@ -346,7 +346,7 @@
"colors": {
"error": "Çewtî",
"on-surface": "Li ser rûyê",
"primary": "Seretayî",
"primary": "Sereke",
"secondary": "Duyemîn",
"tertiary": "Sêyemîn"
},
@@ -358,16 +358,16 @@
"automation": "Xweserî",
"available": "Berdest",
"back": "Paş",
"battery": "Bataryayî",
"battery": "Betarî",
"bluetooth": "Bluetooth",
"brightness": "Ronahî",
"browse": "Gerîn",
"browse": "Bigere",
"calendar": "Salname",
"calendar-panel": "Panelê salnameyê",
"calendar-panel": "Destgeha salnameyê",
"cancel": "Têk bibe",
"cards": "Kartên",
"charging": "Barkirin",
"clear": "Paqqij bike",
"clear": "Pak bike",
"clipboard": "Klîpbir",
"close": "Bigire",
"color-muted": "Bêdengkirî",
@@ -401,28 +401,28 @@
"gateway": "Dergeh",
"general": "Giştî",
"height": "Bilindî",
"hibernate": "Xewnê",
"hibernate": "Bicemdîne",
"history": "Dîrok",
"icon": "Îkon",
"idle": "Betal",
"info": "Agahî",
"input": "Têkevin",
"info": "Zanyarî",
"input": "Têketin",
"install": "Sazkirin",
"installed": "Sazkirî",
"interface": "Navrû",
"internet": "Înternet",
"language": "Ziman",
"loading": "بارکردن...",
"loading": "Tê barkirin...",
"local": "Herêmî",
"location": "Cih",
"lock": "Giredan",
"lock": "Kilît bike",
"logout": "Derkeve",
"look": "Xuyanî",
"media": "Medya",
"media-player": "Lîstikvanê medyayê",
"memory": "Bîr",
"monitors": "Çavdêr",
"network": "Tor",
"monitors": "Dîmender",
"network": "Tor",
"next": "Dûmahî",
"night-light": "Ronahiya şevê",
"no": "Na",
@@ -433,7 +433,7 @@
"notifications": "Agahdarî",
"official": "Fermî",
"on-surface": "Li ser rûyê erdê",
"output": "Derket",
"output": "Deran",
"pair": "Hevpar",
"paired": "Hevpar bûyî",
"pairing": "Hevberkirin...",
@@ -447,7 +447,7 @@
"previous": "Berê",
"primary": "Serekî",
"random": "Bêserûber",
"reboot": "Restart",
"reboot": "Ji nû dest pê bike",
"refresh": "Nûkirin",
"required": "(pêwîst)",
"reset": "Vegerandin",
@@ -486,13 +486,14 @@
"vibrant": "Geş",
"visualizer": "Dîmender",
"volume": "Hêjmar",
"volumes": "Cild",
"volumes": "Deng",
"wallpaper": "Dîwarê xuyanî",
"weather": "Hewa",
"weather-loading": "Rewşa bayê tê barkirin...",
"week": "Hefte",
"widgets": "Amûr",
"widgets": "Sepanok",
"width": "Firehî",
"windows": "Çarçove",
"yes": "Erê"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "Li ser mişkê"
},
"hide-modes": {
"auto-hide": "Xweber veşêre",
"hidden": "Veşêre dema vala be",
"idle": "Dema bêkar veşêre",
"transparent": "Dema vala zelal e",
@@ -543,8 +545,8 @@
"webbrowser": "Geroka tevnê"
},
"providers": {
"applications": "Serlêdan",
"calculator": "Hesabker",
"applications": "Sepan",
"calculator": "Jimarkar",
"calculator-deprecated": "Fermana >calc hatiye betalkirin û dê di demeke nêz de were rakirin. Ji kerema xwe rasterast di lêgerînê de îfadeyên matematîkê binivîse.",
"calculator-description": "Hesabker — nirxandina îfadeyên matematîkî",
"calculator-enter-expression": "Têketineke matematîkî binivîse",
@@ -563,7 +565,9 @@
"emoji-loading": "Îmojî tên barkriin...",
"emoji-loading-description": "Tika raweste",
"emoji-no-recent": "Hîna emojiyên dawî tune ne",
"emoji-search-description": "Lêgerîn û kopîkirina emojiyan"
"emoji-search-description": "Lêgerîn û kopîkirina emojiyan",
"settings-search-description": "Li sazkariyan bigere",
"windows-search-description": "Pencereyên vekirî bigere û bîne pêş"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "Berdest",
"density-mini": "Piçûk",
"density-spacious": "Berfireh",
"display-mode-always-visible": "Her dem dîtbar",
"type-floating": "Herikbar",
"type-framed": "Çarçovekirî",
"type-simple": "Sade"
@@ -642,7 +647,7 @@
"changelog": "Dîroka guhertinan bibîne",
"contributors-desc": "Silav ji {count} beşkdarên me yên <b>gewre</b> re!",
"contributors-description-plural": "Spas ji {count} beşdarên me yên <b>ecêb</b>!",
"copy-info": "Agahî kopî bike",
"copy-info": "Zanyariyan jê bigire",
"info-copied": "Agahî li clipboardê hat kopîkirin",
"noctalia-desc": "Şêlekek sermaseyê ya spehî û mînîmal ku bi baldarî ji bo Waylandê hatiye çêkirin, bi Quickshellê hatiye avakirin.",
"noctalia-git-commit": "Pêşkêşkirina Git:",
@@ -651,30 +656,30 @@
"noctalia-title": "Noctalia qalik",
"privacy-policy": "Siyaseta nepenîtiyê",
"support": "Piştgiriya me bike",
"system-cpu": "CPU:",
"system-cpu": "YKN:",
"system-disk": "Dîsk:",
"system-gpu": "GPU:",
"system-gpu": "YKG:",
"system-host": "Mêvan:",
"system-install-hint": "Fastfetch saz bike da ku agahiyên pergalê bibîne",
"system-kernel": "Kernel:",
"system-loading": "Agahiyên pergalê bar dikin...",
"system-memory": "Bîr:",
"system-monitor": "Çavdêr:",
"system-monitor": "Dîmender:",
"system-not-installed": "fastfetch nehatiye sazkirin",
"system-os": "OS: OS",
"system-packages": "Pakkêtan:",
"system-os": "PX:",
"system-packages": "Pakêt:",
"system-product": "Berhem:",
"system-title": "Agahiyên Sîstemê",
"system-uptime": "Demdirêjî:",
"system-wm": "WM: WM:",
"system-title": "Zanyariyên pergalê",
"system-uptime": "Dema xebitandinê:",
"system-wm": ":",
"telemetry-data-copied": "Daneyên telemetriyê hatin kopîkirin bo clipboardê",
"telemetry-desc": "Bi parvekirina agahdariya sîstema anonîm (çareseriya ekranê, berhevkar, belavkirin) alîkariya pêşxistina Noctalia bikin. Carekê di destpêkê de tê şandin, şopandin tune, dane piştî 30 rojan bixweber têne jêbirin.",
"telemetry-enabled": "Agahiyên pergalê yên nenas bişîne",
"telemetry-show-data": "Dîtina daneyan",
"telemetry-title": "Nepênî",
"telemetry-title": "Taybetî",
"title": "Derbar",
"up-to-date": "Tu ye!",
"update-available": "Nûvekirin heye",
"up-to-date": "Tu rojane ye!",
"update-available": "Rojanekirin heye",
"view-commit": "Li ser GitHubê guhertinê bibîne"
},
"audio": {
@@ -721,19 +726,26 @@
"volumes-volume-overdrive-label": "Destûra zêdekirina deng"
},
"bar": {
"appearance-auto-hide-delay-description": "Demê ku berî darik were veşartin piştî mişîk diçe",
"appearance-auto-hide-delay-label": "Derengbûnê veşêre",
"appearance-auto-hide-exclusive-note": "Nîşe: Dema ku Veşartina xweber çalak be qada taybet tê neçalakkirin",
"appearance-auto-show-delay-description": "Demê berî ku darik tê nîşandan dema mîşk dikeve qiraxê",
"appearance-auto-show-delay-label": "Derengbûnê nîşan bide",
"appearance-background-opacity-description": "Şeffafiya paşxanê bi taybetî ji bo barî destnîşan bike.",
"appearance-background-opacity-label": "ڕوونیی پاشبنەمای بارەکە",
"appearance-capsule-opacity-description": "Dema kapsul xuya dibe, asta zelalbûna paşxaneyên widgetê diyar bike.",
"appearance-capsule-opacity-label": "Ronahiya kapsulê",
"appearance-background-opacity-label": "Zelaliya paşrûyê darikê",
"appearance-capsule-opacity-description": "Dema kapsul xuya dibe, asta zelalbûna paşrûyên sepanokê saz dike.",
"appearance-capsule-opacity-label": "Zelaliya kapsulê",
"appearance-density-description": "Pêdivî ye ku pêlava barê were sererast kirin ji bo xuyangek berbiçav an fireh.",
"appearance-density-label": "Çalyî bar",
"appearance-desc": "Xuyakirina xuyabûn û pozîsyona bar.",
"appearance-display-mode-description": "Hilbijêre ka kengî bila darik were xuyakirin",
"appearance-display-mode-label": "Awaya nîşandanê",
"appearance-floating-description": "Bariş wekî 'heb'eke herikbar nîşan bide.",
"appearance-floating-label": "Barê avjen",
"appearance-frame-radius": "Nîvçapa Hundirîn",
"appearance-frame-settings-description": "Stûrahiya çarçoveyê û nîvçapa goşeyê hundirîn sererast bike",
"appearance-frame-settings-label": "Mîhengên Çarçoveyê",
"appearance-frame-thickness": "Stûrahî",
"appearance-frame-settings-label": "Sazkariyên Çarçoveyê",
"appearance-frame-thickness": "Qalindî",
"appearance-hide-on-overview-description": "Dema ku pêşdîtina berhevker çalak be, bar veşêre û panelan bigire.",
"appearance-hide-on-overview-label": "Li ser dîtinê bar veşêre",
"appearance-margins-description": "Marginên dora bara herikbar eyar bike.",
@@ -744,19 +756,19 @@
"appearance-outer-corners-label": "Goşeyên derve",
"appearance-position-description": "Cihê ku bar li ser ekranê deyne hilbijêre.",
"appearance-position-label": "Cihê darikê",
"appearance-show-capsule-description": "Pxaneyên widgetê nîşan bide.",
"appearance-show-capsule-description": "prûyên sepanokê nîşan bide.",
"appearance-show-capsule-label": "Pêşkêşkirina kapsulê",
"appearance-show-outline-description": "Dîwarê xuya li dora her widgetê nîşan dide.",
"appearance-show-outline-label": "Nîşandan xêzên widgetê",
"appearance-show-outline-label": "Xêzên sepanokê nîşan bide",
"appearance-type-description": "Stîla darikê hilbijêre: Sade, Herikbar an Çarçovekirî",
"appearance-type-label": "Cureyê Darikê",
"appearance-type-label": "Cûreya darikê",
"appearance-use-separate-opacity-description": "Destûrê bide ku ji bo paşxaneya bar nirxek opakbûna cuda were bikaranîn.",
"appearance-use-separate-opacity-label": "Şefafiya bara cuda bikar bîne",
"monitor-configure-widgets": "Widgetan saz bike",
"monitor-configure-widgets": "Sepanokan saz bike",
"monitor-override-settings": "Mîhengên gerdûnî betal bike",
"monitor-override-settings-description": "Ji bo vî monitorê mîhengên xwerû bikar bîne.",
"monitor-reset-all": "Hemûyan vegerîne",
"monitor-widgets-title": "Konfigurasyona Widgetê - {monitor}",
"monitor-widgets-title": "Rêkxistina sepanokê- {monitor}",
"monitors-desc": "Nîşan bide bar li ser monitorên taybet. Eger tu kes neyê hilbijartin, ew ê bi awayekî xwerû hemûyan nîşan bide.",
"monitors-desc-new": "Mîheng bike ka kîjan çavdêr Barê nîşan didin û mîhengên ji bo her çavdêrekê xwerû bike.",
"monitors-title": "Dîmender",
@@ -766,9 +778,9 @@
"tray-blacklist-placeholder": "nm-applet, Fcitx*",
"tray-pin-application": "Sepanê bi dar bixe",
"tray-unpin-application": "Sepanê bi dar nexe",
"use-global-widgets": "Widgetên gerdûnî bikar bîne",
"widgets-desc": "Pêçikên amûran kaş bike da ku rêza wan biguherî. Ji bo veguhestina amûran di navbera beşan de an rakirina wan, menuya rast-klîk bikar bîne.",
"widgets-title": "Cihkirina widgetan"
"use-global-widgets": "Sepanokên gerdûnî bi kar bîne",
"widgets-desc": "sepanokan kaş bike da ku rêza wan biguherî. Ji bo livandinê sepanokan di navbera beşan de yan rakirina wan, menuya rast-tikandin bi kar bîne.",
"widgets-title": "Bicihkirina sepanokan"
},
"color-scheme": {
"color-source-use-wallpaper-colors-description": "Ji dîwarê xwe şemayên rengan çêbike. Rengan bixweber derdixe da ku temayek hevgirtî biafirîne.",
@@ -810,7 +822,7 @@
"predefined-desc": "Ji berhevokek şemayên rengan ên pêşdiyarkirî hilbijêrin.",
"predefined-generate-templates-label": "Şablonan ji bo şemayên pêşdiyarkirî çêbike",
"predefined-title": "Şemayên rengan ên pêşdiyarkirî",
"templates-desc": "ڕەنگان بخە سەر ئەپڵیکەیشنێن دەرەکی.",
"templates-desc": "Rengan li ser sepanên derveyî bisepîne.",
"templates-filter-description": "Şablonên ji kategoriyek taybet nîşan bide.",
"templates-filter-label": "Li gorî kategoriyê parzûn bike",
"templates-misc-description": "Şablonên xwe biafirîne.",
@@ -847,22 +859,22 @@
"shortcuts-custom-button-state-checks-remove": "Rake",
"shortcuts-custom-button-tooltip-description": "Serişteya ku dema mişk li ser bişkokê be tê nîşandan.",
"shortcuts-custom-button-tooltip-label": "Serpêhatî",
"shortcuts-title": "Kurtebirên widgetê",
"shortcuts-title": "Kurteriyên sepanokan",
"system-monitor-disk-path-description": "Hilbijêre kîjan xala çiyayê dîskê karta çavdêriya pergalê ya di navenda kontrolê de divê çavdêriyê bike.",
"system-monitor-disk-path-label": "Rêya dîska çavdêriya pergalê",
"title": "Navenda kontrolê"
},
"desktop-widgets": {
"clock-enabled-description": "Widêgetek demjimêrê li ser sermaseyê nîşan bide.",
"clock-enabled-label": "Widgetê demjimêrê çalak bike",
"clock-enabled-description": "Sepanokeke demjimêrê li ser sermaseyê nîşan bide.",
"clock-enabled-label": "Sepanoka demjimêrê çalak bike",
"clock-format-label": "Format",
"clock-height-description": "Bilindahiya widgeta demjimêrê bi pixelan.",
"clock-height-description": "Bilindahiya sepanokê demjimêrê bi pixelan.",
"clock-height-label": "Bilindî",
"clock-minimal-mode-description": "Dîmeneke demjimêrê ya herî kêm bi dem û dîrokê.",
"clock-minimal-mode-description": "Dîmendereke demjimêrê ya herî kêm bi dem û dîrokê bi kar bîne.",
"clock-minimal-mode-label": "Moda herî kêm",
"clock-rounded-corners-description": "Goşeyên dor ji bo paşxaneya widgetê bikar bîne.",
"clock-rounded-corners-label": "Goşeyên giloverkirî",
"clock-show-background-description": "Paşxaneya konteynera widgeta demjimêrê nîşan bide.",
"clock-rounded-corners-description": "Quncikên gilover ji bo paşrûyê sepanokê bi kar bîne.",
"clock-rounded-corners-label": "Quncikên gilover",
"clock-show-background-description": "Paşya konteynera sepanoka demjimêrê nîşan bide.",
"clock-show-background-label": "Paşrûyê nîşan bide",
"clock-show-date-description": "Dîroka îro li jêr demjimêrê nîşan bide.",
"clock-show-date-label": "Dîrokê nîşan bide",
@@ -874,31 +886,41 @@
"clock-style-digital": "Jimarî",
"clock-style-label": "Şêwaza demjimêrê",
"clock-style-minimal": "Kêmtirîn",
"clock-width-description": "Ferehiya alava demjimêrê bi pîkselan.",
"edit-mode-button-label": "Bike rewşena sererastkirinê",
"edit-mode-controls-explanation": "Klîka çepê & kaş bike: Wîdgetê biguhezîne an mezinahîya wê biguherîne.\nKlîka rastê: Vebijarkên menuya kontekstê veke.",
"edit-mode-description": "Moda guhertinê çalak bike da ku alavên sermaseyê bilivînî û ji nû ve bicih bikî . Dema ku çalak be, alav xêzek kaşkirinê nîşan dide û dikare ji nû ve were bicihkirin.",
"clock-width-description": "Ferehiya sepanoka demjimêrê bi pîkselan.",
"edit-mode-button-label": "Têkeve awaya guhertinê",
"edit-mode-controls-explanation": "Çep-bitikîne & kaş bike: Sepanokê bilivîne yan mezinahiya wê biguherîne. Rast-bitikîne: Vebijêrkên menuya naverokê veke.",
"edit-mode-description": "Awaya guhertinê çalak bike da ku sepanokên sermaseyê bilivînî û ji nû ve bicih bikî . Dema ku çalak be, sepanok xêzek kaşkirinê nîşan dide û dikare ji nû ve were bicihkirin.",
"edit-mode-exit-button": "Ji awaya guhertinê derkeve",
"edit-mode-grid-snap-label": "Girêdana torê",
"edit-mode-label": "ڕێگای دەستکاریکردن",
"enabled-description": "Alavên sermaseyê bi tevahî çalak an neçalak bike.",
"enabled-label": "Alavên sermaseyê çalak bike",
"general-desc": "Widgetên ku li ser sermaseya te xuya dibin saz bike.",
"general-title": "Alavên sermaseyê",
"media-player-enabled-description": "Pêşangeha widgetek lîstikvanê medyayê li ser sermaseyê.",
"media-player-enabled-label": "Widgeta lîstikvanê medyayê çalak bike",
"media-player-rounded-corners-description": "Goşeyên çargoşeyî li keviyên widgetê çalak bike.",
"media-player-show-album-art-description": "Wêneyê bergê albûmê û agahiyên stranê (nav û hunermend) nîşan bide.",
"edit-mode-label": "Awaya guhertinê",
"enabled-description": "Sepanokên sermaseyê bi tevahî çalak an neçalak bike.",
"enabled-label": "Sepanokên sermaseyê çalak bike",
"general-desc": "Sepanokên ku li ser sermaseya te xuya dibin birêkxistin bike.",
"general-title": "Sepanokên sermaseyê",
"media-player-enabled-description": "Sepanokê lîstikvanê medyayê li ser sermaseyê nîşan bide.",
"media-player-enabled-label": "Sepanokê lîstikvanê medyayê çalak bike",
"media-player-rounded-corners-description": "Quncikê giolver li ser qiraxên sepanokê çalak bike.",
"media-player-show-album-art-description": "Wêneyê bergê elbumê û zanyariyên stranê (nav û hunermend) nîşan bide.",
"media-player-show-album-art-label": "Wêneyê bergê û sernavê nîşan bide",
"media-player-show-background-description": "Show the background container for the media player widget.",
"media-player-show-buttons-description": "Bişkokên kontrola medyayê (lîstin/rawestandin, pêş, paş) li ser alavê lîstikvana medyayê nîşan bide.",
"media-player-show-background-description": "Konteynerê paşrûyê nîşan bide.",
"media-player-show-buttons-description": "Bişkokên kontrola medyayê (lîstin/rawestandin, pêş, paş) nîşan bide.",
"media-player-show-buttons-label": "Bişkokan nîşan bide",
"media-player-show-visualizer-description": "Vîdyoyê dîtbarîkerê dengî nîşan bide.",
"media-player-visualizer-type-description": "Choose a visualization type for the desktop media player background.",
"title": "Alavên sermaseyê",
"weather-enabled-description": "Widjeyekî hewayê li ser sermaseyê nîşan bide.",
"weather-enabled-label": "Widgeta hewayê çalak bike",
"weather-show-background-description": "Konteynera paşxanê ya widgeta hewayê nîşan bide."
"media-player-show-visualizer-description": "overlayê dîtbarîkarê dengî nîşan bide.",
"media-player-visualizer-type-description": "Cûreyeke dîtbariyê hilbijêre.",
"system-stat-layout-bottom": "Bişkok",
"system-stat-layout-description": "Choose how the legend is displayed relative to the graph.",
"system-stat-layout-label": "Şêwaz",
"system-stat-layout-side": "Kêlek",
"system-stat-rounded-corners-description": "Quncikên girover ji bo paşrûya sepanokê bi kar bîne.",
"system-stat-rounded-corners-label": "Quncikên gilover",
"system-stat-show-background-description": "Ji bo sepanokê amara pergalê konteynerê paşrûyê nîşan bide.",
"system-stat-show-background-label": "Paşrûyê nîşan bide",
"system-stat-stat-type-description": "Hilbijêre kîjan amara pergalê bila were nîşandan.",
"system-stat-stat-type-label": "Cûreya amarî",
"title": "Sepanokên sermaseyê",
"weather-enabled-description": "Sepanokê rewşa bayê li ser sermaseyê nîşan bide.",
"weather-enabled-label": "Sepanokê rewşa bayê çalak bike",
"weather-show-background-description": "Konteynera paşrûyê ya sepanokê rewşa bayê nîşan bide."
},
"display": {
"monitors-brightness-step-description": "Pîvana gava guhertinên ronahiyê (tekerê mişkê û kurteriyên klavyeyê) eyar bike.",
@@ -907,11 +929,11 @@
"monitors-brightness-unavailable-generic": "Kontrola ronahiyê ji bo vê dîmêrê berdest nîne.",
"monitors-desc": "Guherandinên ronahiya mîhengên ji bo her dîmenderê.",
"monitors-enforce-minimum-description": "Çareseriya pirsgirêka ku ronahiya paş di hin dîmendêran de di ronahiya %0 de bi temamî dimire.",
"monitors-enforce-minimum-label": "Bi zor ronahiyê (1%) ferz bike",
"monitors-external-brightness-description": "DDCUtil پشتگیری چالاک بکە بۆ کۆنتڕۆڵکردنی ڕووناکی لەسەر شاشەی دەرەکی لە ڕێگەی پڕۆتۆکۆڵی DDC/CI.",
"monitors-enforce-minimum-label": "Bi zorê ronahiyê (1%) bide sepandin",
"monitors-external-brightness-description": "Piştgiriya DDCUtil ji bo kontrolkirina ronîbûnê li ser dîmenderên derveyî bi riya protokola DDC/CI çalak bike.",
"monitors-external-brightness-label": "Piştgiriya ronahiya derve",
"monitors-title": "Pêşdîtinên per-monitor",
"night-light-auto-schedule-description": "به‌پێی کاتی خۆرئاوابوون و خۆرهه‌ڵاتن له‌ <i>{location}</i> — پێشنیارکراوه‌.",
"monitors-title": "Sazkariyê bo her dîmender",
"night-light-auto-schedule-description": "Li gorî dema rojavabûn û rohilatbûna rojê li <i>{cih}</i> — pêşniyarkirî.",
"night-light-auto-schedule-label": "Bernamekirina otomatîk",
"night-light-desc": "Kêmkirina belavbûna ronahiya şîn ji bo ku hûn çêtir razên û zexta çavan kêm bikin.",
"night-light-enable-description": "Fîltreyeke rengê germ bikar bîne da ku belavbûna ronahiya şîn kêm bike.",
@@ -945,8 +967,8 @@
"appearance-display-description": "Hilbijêre ka bender çawa tev digere.",
"appearance-display-exclusive": "Taybet",
"appearance-floating-distance-description": "Dûrahiya di navbera benderê û qiraxa dîmenderê de saz bike.",
"appearance-floating-distance-label": "Dûriya herikînê ya dokê",
"appearance-hide-show-speed-description": "Lezgehîna bileziya anîmasyona veşartin/derxistina dokê sererast bike.",
"appearance-floating-distance-label": "Dûrahiya herikînê ya benderê",
"appearance-hide-show-speed-description": "Lezbûna anîmasyona veşartin/nîşandan a benderê biguherîne.",
"appearance-hide-show-speed-label": "Lezê nîşan bide/veşêre",
"appearance-icon-size-description": "Mezinahiya giştî ya dockê sererast bike.",
"appearance-icon-size-label": "Mezinahiya benderê",
@@ -954,7 +976,7 @@
"appearance-inactive-indicators-label": "Nîşaneyên xebatê",
"appearance-pinned-static-description": "Her gav îkonên sepanên pêvekirî bi rêza statîk ber bi çepê ve bikişîne.",
"appearance-pinned-static-label": "Serîlêdanên sabîtkirî yên statîk",
"appearance-position-description": "Cihê ku dok li ser ekranê xuya dike hilbijêre.",
"appearance-position-description": "Cihê ku bender li ser dîmenderêê xuya dibe hilbijêre.",
"appearance-position-label": "Rewş",
"enabled-description": "Nîşan bide an jî bi tevahî dokê veşêre.",
"enabled-label": "Dock çalak bike",
@@ -962,7 +984,7 @@
"monitors-only-same-monitor-description": "Tenê sepanên ji çavdêriya ku dock lê ye nîşan bide.",
"monitors-only-same-monitor-label": "Tenê sepanên ji heman monitorê",
"monitors-title": "Pêşangeha çavdêriyê",
"title": "Dok"
"title": "Bender"
},
"general": {
"copy-settings": "Mîhengan kopî bike",
@@ -1045,7 +1067,7 @@
"clipboard-desc": "Gihîştin û dîroka clipboardê xwe ji destpêkerê birêve bibin.",
"execute-desc": "Vê vesaz bike ka sepan çawa tên destpêkirin.",
"execute-title": "Cîbicîkirin",
"settings-annotation-tool-description": "Fermana ku dema tikandina bişkoka şîrovekirinê di dîroka clipboardê de were xebitandin, Wêne dê ji vê fermanê re were şandin.",
"settings-annotation-tool-description": "Fermana ku dema tikandina bişkoka şîrovekirinê de di dîroka clipboardê de were xebitandin. Wêne dê bi rêya pipe’ê were şandin nav vê fermanê.",
"settings-annotation-tool-label": "Amûra şîrovekirinê",
"settings-annotation-tool-placeholder": "nîş. 'gradia', 'satty -f -'",
"settings-auto-paste-description": "Bi otomatîkî tişta clipboardê ya hilbijartî bişîne. Wtype hewce dike.",
@@ -1056,17 +1078,19 @@
"settings-clip-wrap-text-label": "Pêça nivîsa clipboardê",
"settings-clipboard-history-description": "Gihîştina tiştên ku berê hatine kopîkirin ji destpêkerê.",
"settings-clipboard-history-label": "Dîroka clipboardê çalak bike",
"settings-clipboard-watch-image-description": "ڕستەی فەرمانی تەواو کە بۆ wl-paste تێدەپەڕێنرێت بۆ گۆڕانکارییەکانی وێنە. (پێویستی بە دووبارە دەستپێکردنەوە هەیە)",
"settings-clipboard-watch-image-label": "فەرمانی چاودێریکردنی وێنە",
"settings-clipboard-watch-text-description": "تەواوی زنجیرەی فەرمان کە بۆ wl-paste تێپەڕێنراوە بۆ گۆڕانکارییەکانی دەق. (پێویستی بە دووبارە دەستپێکردنەوە هەیە)",
"settings-clipboard-watch-text-label": "فەرمانی چاودێری دەق",
"settings-clipboard-watch-image-description": "Ji bo guhertinên wêneyê, rêza fermanê ya tevahî ji wl-paste re hat şandin. (ji nû ve destpêkirinê pêwist dike)",
"settings-clipboard-watch-image-label": "Fermana temaşekirina wêneyê",
"settings-clipboard-watch-text-description": "Ji bo guhertinên nivîsê, rêza fermanê ya tevahî ji wl-paste re hat şandin. (ji nû ve destpêkirinê pêwist dike)",
"settings-clipboard-watch-text-label": "Fermana çavdêriya nivîsê",
"settings-custom-launch-prefix-description": "Fermanên pêşgiran bi destpêkerek xwerû pêşda bikin (mînak, 'runapp' ji bo entegrasyona systemd).",
"settings-custom-launch-prefix-enabled-description": "Bi awayekî xwerû destpêkê ji bo destpêkirina sepanan bikar bîne li şûna rêbaza standard.",
"settings-custom-launch-prefix-enabled-label": "Pêşgira destpêkirinê ya xwerû çalak bike",
"settings-custom-launch-prefix-label": "Pêşgira destpêkirinê ya xwerû",
"settings-custom-launch-prefix-label": "Pêşgira destpêkirinê ya kesane",
"settings-desc": "Xweşikbûn û xuyabûna destpêkerê xweş bike.",
"settings-enable-settings-search-description": "Dema ku di nav destpêker de digerî, encamên mîhengan nîşan bide.",
"settings-enable-settings-search-label": "Lêgerîna mîhengan çalak bike",
"settings-enable-windows-search-description": "Li çarçoveyên çalak bigere û balê bide ser.",
"settings-enable-windows-search-label": "Lêgerînê çarçoveyê çalak bike",
"settings-grid-view-description": "Tiştan di şêweya grîdê de nîşan bide, ne di lîsteyê de.",
"settings-icon-mode-description": "Îkonên pergalê yên xwemalî li şûna îkonên Tabler bikar bîne.",
"settings-icon-mode-label": "Îkonên xwecihî bikar bîne",
@@ -1103,12 +1127,12 @@
"date-time-use-analog-label": "Demjimêrê bi şêwaza analog bi kar bîne",
"date-time-week-numbers-description": "Hefteya salê (mînak, hefteya 38) di salnameyê de nîşan bide.",
"date-time-week-numbers-label": "Jimarên hefteyê nîşan bide",
"location-desc": "Ji bo wergirtina hewayeke rast û bernameya Ronahiya Şevê, cîhê xwe diyar bike.",
"location-desc": "Ji bo wergirtina rewşa bayê û bernamekirina ronahiya şevê ya rast, cihê xwe saz bike.",
"location-search-description": "b.m., Toronto, ",
"location-search-label": "Ji bo cihekî bigere",
"location-search-placeholder": "Navê cihê têxîne",
"location-title": "Cihê te",
"weather-desc": "Yekîneya germahiya xweya bijarte hilbijêrin.",
"weather-desc": "Yekîneya germahiya xwe ya bijarte hilbijêre.",
"weather-enabled-description": "Agahiyên hewayê li seranserê navbeynê nîşan bide û daneyên hewayê bîne. Dema ku neçalak be, dê hemû hêmanên hewayê werin veşartin û dê tu daxwazên torê neyên kirin.",
"weather-enabled-label": "Çalak bike hewayê",
"weather-fahrenheit-description": "Germahiya bi Fahrenheit nîşan bide, ne bi Celsius.",
@@ -1127,7 +1151,7 @@
"allow-password-with-fprintd-label": "Rêdan bi têketina şîfreyê bi fprintd",
"auto-start-auth-description": "mînak, otomatîkî dest bi rastkirina tiliyê dike bêyî ku pêdivî bi pêlkeyek an klîkek hebe.",
"auto-start-auth-label": "Destpêkirina otomatîkî ya rastkirinê",
"compact-lockscreen-description": "Tenê inputa têketinê û kontrolên pergalê nîşan bide, widgetên hewayê û medyayê veşêre.",
"compact-lockscreen-description": "Tenê têketina ketanê û kontrolên pergalê nîşan bide, sepanokên rewşa bayê û medyayê veşêre.",
"compact-lockscreen-label": "Kilîta ekrana berhevkirî",
"lock-on-suspend-description": "Dema ku pergal tê rawestandin, ekranê bixweber kilît bike.",
"lock-on-suspend-label": "Li ser rawestandinê kilît bike",
@@ -1159,9 +1183,9 @@
"history-critical-urgency-description": "Agahiyên girîng ên pêşîn li dîrokê tomar bike.",
"history-critical-urgency-label": "Dema awarte ya krîtîk tomar bike",
"history-desc": "Kontrol bike kaîdî notîfîkasyonên ku li gorî asta lezgîniya wan di dîrokê de têne hilanîn.",
"history-low-urgency-description": "ڕاگەیاندنە گرنگی نزمەکان بۆ مێژوو هەڵبگرە.",
"history-low-urgency-description": "Agahdariyên bi girîngiya nizm di dîrokê de tomar bike.",
"history-low-urgency-label": "Dîroka lezgîniya kêm tomar bike",
"history-normal-urgency-description": "Agahiyên pêşîniya normal di dîrokê de tomar bike.",
"history-normal-urgency-description": "Agahdariyên pêşîniya normal di dîrokê de tomar bike.",
"history-normal-urgency-label": "Dîroka lezgîniya normal tomar bike",
"media-toast-description": "Dema rewşa lêdana medyayê biguhere, toastekê nîşan bide.",
"media-toast-label": "Medya",
@@ -1210,7 +1234,7 @@
"always-on-top-description": "OSD li ser pencereyên tev-ekran û qatên din nîşan bide.",
"always-on-top-label": "Her tim li ser",
"background-opacity-description": "Kontrola zelalbûna paşxaneya OSD.",
"background-opacity-label": "ڕوونیی پاشبنەما",
"background-opacity-label": "Zelaliya paşrûya destgehê",
"description": "Mîhengên nîşanderên ser-ekranê yên wekî pêşandanên deng û ronahiyê saz bike.",
"duration-auto-hide-description": "Dema berî windabûna OSD biguherîne.",
"duration-auto-hide-label": "Piştî otomatîk veşêre",
@@ -1239,7 +1263,7 @@
"types-volume-label": "Hêjmara derketinê"
},
"plugins": {
"available-description": "گەڕان بکە و پڵەگینەکان لە سەرچاوە ڕێکخراوەکان دابمەزرێنە.",
"available-description": "Pêvekên ji çavkaniyên rêkxistî bigere û saz bike",
"available-label": "Pêvekên berdest",
"available-no-plugins-description": "Çavkaniyên pêvekê xwe kontrol bikin an lîsteyê nû bikin.",
"available-no-plugins-label": "Tiştên pêvek tune ne",
@@ -1247,7 +1271,7 @@
"collision-custom-version-exists": "Guhertoyeke taybet a ji \"{source}\" berê hatiye sazkirin",
"collision-official-version-exists": "Guhertoya fermî ya vê pêvekê berê hatiye sazkirin",
"filter-downloaded": "Daxistî",
"filter-not-downloaded": "Nehatiye Dakêşandin",
"filter-not-downloaded": "Nehatiye daxistin",
"filter-tags-description": "Parzûna pêvekên bi kategoriya an rewşa daxistinê",
"filter-tags-label": "Tagan",
"hot-reload-description": "Bi guhertina pelên wan, bixweber pêvekên xwe ji nû ve bar bike. Ji bo pêşxistina pêvekan bikêr e.",
@@ -1312,7 +1336,7 @@
"entry-settings-default-command-lock": "Kilîta hundirîn a ekranê (bê ferman)",
"entry-settings-default-command-logout": "Derketina navxweyî (bê ferman)",
"entry-settings-default-info-description": "Heke fermana xwerû neyê diyarkirin, fermana pergalê ya xwerû dê were bikar anîn.",
"entry-settings-default-info-label": "Fermana xwerû",
"entry-settings-default-info-label": "Fermana berdest",
"entry-settings-title": "Vexîne {entry}",
"entry-settings-tooltip": "Fermanê vesazkirinê",
"general-desc": "Maneja reftar û xuyabûna panelê menûya rûniştinê.",
@@ -1331,13 +1355,13 @@
"custom-highlight-colors-title-label": "Rengên ronîkirina xwerû",
"disk-section-label": "Bikaranîna dîskê",
"disk-available-label": "Dîsk berdest e",
"enable-dgpu-monitoring-description": "Hişyarî: Ev dê GPUya weya veqetandî (NVIDIA/AMD) hişyar bike, ku dibe ku bandorek girîng li ser jiyana pîlê li ser laptopên bi grafîkên hîbrîd bike.",
"enable-dgpu-monitoring-label": "Çavdêriya GPU'ya veqetandî çalak bike",
"enable-dgpu-monitoring-description": "Hişyarî: Ev dê YKG a te ya veqetandî (NVIDIA/AMD) hişyar bike, ku dibe ku bandorek girîng li ser jiyana pîlê li ser laptopên bi grafîkên hîbrîd bike.",
"enable-dgpu-monitoring-label": "Çavdêriya YKG veqetandî çalak bike",
"external-monitor-description": "Fermanî an rêya sepanê binivîse ku dema sepana monitora pergala derveyî çalak dike were xebitandin.",
"external-monitor-label": "Fermana monitora pergala derveyî",
"external-monitor-placeholder": "çavkanî || navendamisyonê || jdsîstemonîtor || statîstîkênbingehîn || navenda-çavdêriya-sîstemê || gnome-sîstem-monitor || plasma-sîstemmonitor || mate-sîstem-monitor || ukui-sîstem-monitor || deepin-sîstem-monitor || pantheon-sîstem-monitor",
"general-desc": "Sazkirina reftar û xuyabûna çavdêriya pergalê.",
"gpu-section-label": "Germahiya GPU",
"gpu-section-label": "Germahiya YKG",
"highlight-colors-section-label": "Rengên ronîkirinê",
"polling-interval-label": "Navbera anketê",
"polling-section-description": "Mîheng bike ku her pîvana pergalê çiqas caran were nûkirin.",
@@ -1373,7 +1397,7 @@
"dimmer-opacity-label": "Şefafiya sermaseyê sermaseyê kêmkirî",
"dimmer-opacity-reset": "Vekirina zelalbûna sermaseya tarîkirî",
"panel-background-opacity-description": "Zelalbûna paşrûyê ji bo hemû destgehan (darik, destpêker, sazkarî, hwd...) saz bike.",
"panel-background-opacity-label": "Şeffafiya paşxaneya panelê",
"panel-background-opacity-label": "Zelaliya paşrûyê destgehê",
"panels-attached-to-bar-description": "Panelên bi qiraxên bar û ekranê ve têne kilît kirin, bi goşeyên berevajîkirî yên şêwekar xuyangek bêkêmasî diafirînin.",
"panels-attached-to-bar-label": "Panêlan bi kêlekê ve bişkînin",
"panels-overlay-description": "Pişkin dike ku panel û bar, heta ser sepanên tev-ekran jî, xuya bimînin.",
@@ -1404,7 +1428,7 @@
"automation-scheduled-change-label": "Guherîna plansazkirî",
"look-feel-edge-smoothness-description": "Bandora bo bandorê perîşan û nerm li keviya veguherînan dike.",
"look-feel-edge-smoothness-label": "Nermkirina keviya derbasbûnê",
"look-feel-fill-color-description": "ڕەنگێکی پڕ بکەرەوە هەڵبژێرە کە ڕەنگە لە پشت وێنەی سەر دیوارەوە دەربکەوێت.",
"look-feel-fill-color-description": "Rengê dagirtinê hilbijêre ku dibe ku li pişt wêneyê dîwêr xuya bibe",
"look-feel-fill-mode-description": "Hilbijêre ka divê wêne çawa were pîvandin da ku bi çareseriya çavdêriya te re têkildar be.",
"look-feel-fill-mode-label": "Moda dagirtinê",
"look-feel-title": "Binêre û hîs bike",
@@ -1441,7 +1465,7 @@
}
},
"placeholders": {
"command-example": "echo \"Silav cîhan\"",
"command-example": "echo \"Silav cihan\"",
"enter-command": "Fermana ku bê tetbîqkirin binivîse (sepan an nivîsara taybet)",
"enter-ipc-identifier": "Ji bo fermanên IPC nasnameyek yekta binivîse",
"enter-path": "Rêya binivîse...",
@@ -1450,15 +1474,15 @@
"enter-width-pixels": "Firehiya bi pîxel binivîse",
"search": "Bigere...",
"search-icons": "b.m., noctalia, niri, betarî, ewr",
"search-launcher": "Li navnîşan bigere... an ji bo fermanan > bikar bîne",
"search-launcher": "Li navan bigere... an ji bo fermanan > bi kar bîne",
"search-wallhaven": "Lêgerîn li Wallhaven...",
"search-wallpapers": "Binivîse da ku dîwêran parzûn bikî..."
},
"positions": {
"bottom": "Jêr",
"bottom-center": "Jêr navend",
"bottom-left": "Binê çepê",
"bottom-right": "ڕاستی خوارەوە",
"bottom-left": "Jêr çepê",
"bottom-right": "Jêr rastê",
"center": "Navend",
"center-left": "Navend çep",
"center-right": "Navend rast",
@@ -1472,12 +1496,12 @@
"top-right": "Rastê jor"
},
"session-menu": {
"action-in-seconds": "{action} di {seconds} çirke de...",
"action-in-seconds": "di {seconds} çirke de {action} ...",
"cancel-timer": "Demjimêr betal bike",
"title": "Menuya danişînê"
},
"setup": {
"all-done": "Hemû Temam!",
"all-done": "Qediya!",
"appearance": {
"subheader": "Dark Mode û çavkaniyên rengan hilbijêre (Wallpaper an pêşdiyarkirî)."
},
@@ -1513,9 +1537,9 @@
"disk-usage": "%{percent}",
"location-display": "{nav} ({koordinat})",
"monitor-description": "{model} ({width}x{height} @ {scale}x)",
"no-media-player-detected": "ئامێرێکی میدیایی نەدۆزرایەوە",
"no-media-player-detected": "Tu lîstikvanen medyayê nehatin dîtin",
"scaling-percentage": "%{percentage}",
"signal-strength": "%{nîşan}",
"signal-strength": "%{signal}",
"unknown-app": "Sepanek nenas",
"uptime": "Dema xebitandinê: {uptime}",
"user-requested": "Daxwaza bikarhêner",
@@ -1523,37 +1547,37 @@
"widget-settings-title": "Sazkariyên {widget}"
},
"system-monitor": {
"cpu-temp": "Germa CPU",
"cpu-usage": "Bikaranîna CPU",
"cpu-temp": "Germahiya YKN",
"cpu-usage": "Bikaranîna YKN",
"disk": "Dîsk",
"download-speed": "Leza daxistinê",
"gpu-temp": "Germa GPU",
"gpu-temp": "Germahiya YKG",
"load-average": "Bar navîn",
"title": "Çavdêriya sîstemê",
"title": "Çavdêriya pergalê",
"upload-speed": "Leza barkirinê"
},
"toast": {
"airplane-mode": {
"title": "Rewşa balafirê"
"title": "Awaya balafirê"
},
"battery": {
"low": "Pîl kêm e",
"low-desc": "Pîl li ser %{percent} e. Ji kerema xwe şarjê girêde"
"low-desc": "Betarî li ser %{percent} e. Tijîkarê girê bide"
},
"bluetooth": {
"address-copied": "Navnîşan li clipboardê hate kopîkirin",
"confirm-code": "Koda {value} li ser amûra din piştrast bike.",
"connect-failed": "Têk çû girêdan bi cîhazê re",
"disconnect-failed": "Têkçûn di qutkirina ji cîhazê de",
"discoverable-change-failed": "ڕا گۆڕینی باری دۆزراوە نەکرا",
"discoverable-disabled": "Dîtbar neçalak kirin",
"discoverable-enabled": "Hêzdar kirin",
"discoverable-change-failed": "Guhertina rewşa dîtşbar têk çû",
"discoverable-disabled": "Dîtbarî hat neçalakkirin",
"discoverable-enabled": "Dîtbarî hat neçalakkirin",
"display-code": "Koda {value} li ser amûra din binivîse.",
"forget-failed": "Têk çû ku amûr were jibîrkirin",
"pair-failed": "Cîhaz bi hev ve nehat girêdan",
"passkey-required": "Pêdivî bi şîfreya amûrê heye.",
"passkey-required": "Pêdivî bi borînpeyvê amûrê heye.",
"pincode-required": "Koda PIN ji hêla cîhazê ve tê xwestin.",
"state-change-failed": "فشل گوهارتنا حاله‌تا بلوتوثێ"
"state-change-failed": "Guhertina rewşa Bluetooth têk çû"
},
"clipboard": {
"long-text": "Teksta dirêj",
@@ -1570,7 +1594,7 @@
"internet-limited": "Pêwendîdar bê înternetê",
"keyboard-layout": {
"changed": "Şêwaza kilîtdankê bo {layout} hat guhertin",
"title": "Klavyeya"
"title": "Kilîtdank"
},
"missing-control-center": {
"description": "Kurteya kontrolê ji barê hatiye rakirin. Ji bo ku hûn dîsa ji barê bigihîjinê, hûn ê hewce ne ku kurteyê ji nû ve zêde bikin. Her weha hûn dikarin bi rast-klîkkirina li ser barê jî vekin",
@@ -1591,7 +1615,7 @@
"profile-name": "{profîl}"
},
"theming-processor-failed": {
"desc-generic": "Çewtiyek di dema pêvajoykirina şablonan de rû da",
"desc-generic": "Şaşetiyek di dema pêvajoykirina şablonan de rû da",
"title": "Pêvajoya şablonê têk çû"
},
"vpn": {
@@ -1606,14 +1630,14 @@
"wifi": {
"connected": "Bi '{ssid}' ve hat girêdan",
"connection-failed": "Girêdan têk çû",
"connection-timeout": "Demja girêdanê bi dawî bû",
"connection-timeout": "Dema girêdanê qediya",
"disconnected": "Ji '{ssid}' qut bû",
"incorrect-password": "Borînpeyva şaş",
"incorrect-password": "Borînpeyva şaş e",
"network-not-found": "Tor nehat dîtin"
}
},
"tooltips": {
"add-widget": "Widget zêde bike",
"add-widget": "Sepanokê tevlî bike",
"bluetooth-devices": "Amûrên Bluetooth",
"brightness-at": "Ronahî: {brightness}%",
"click-to-start-recording": "Tomarkarê dîmenderê (dest bi tomarkirinê bike)",
@@ -1634,8 +1658,8 @@
"list-view": "Dîtina lîsteyê",
"manage-vpn": "Girêdanên VPN",
"manage-wifi": "Wi-Fi",
"max-widgets-reached": "Hejmara herî zêde ya widgetan hate bidestxistin",
"microphone-volume-at": "Hêjmara mîkrofonê: {volume}%",
"max-widgets-reached": "Jimara herî pir a sepanokan hat gihîştin",
"microphone-volume-at": "Dengê mîkrofonê: {volume}%",
"move-to-section": "Here'ke {section} here",
"mute": "Bêdeng bike",
"next-media": "Strana pêş",
@@ -1688,7 +1712,7 @@
"apikey-placeholder": "API Key-a Wallhavenê xwe binivîse",
"apply-all-monitors-description": "Wêneyê dîwêrê ya hilbijartî li ser hemû dîmenderan bisepîne.",
"apply-all-monitors-label": "Li ser hemû dîmenderan bisepîne",
"categories-anime": "ئەنیمێ",
"categories-anime": "Anîme",
"categories-label": "Beş",
"categories-people": "Mirov",
"order-asc": "Berjor",
@@ -1699,7 +1723,7 @@
"purity-sfw": "SFW",
"purity-sketchy": "Sketchy",
"ratios-all-portrait": "Hemû portre",
"ratios-all-wide": "Hemû fireh",
"ratios-all-wide": "Hemû fereh",
"ratios-any": "Her",
"ratios-label": "Rêjeya aliyê",
"resolution-atleast": "Herî kêm",
@@ -1760,8 +1784,8 @@
"common-us-date": "Awaya demê ya DYE",
"common-weekday-date": "Roja hefteyê bi demê",
"common-weekday-month-day": "Rojên hefteyê, meh û roj",
"day-abbreviated": "Navê rojê yê kurtkirî",
"day-full": "Navê rojê yê tevahî",
"day-abbreviated": "Navê rojê ya kurtkirî",
"day-full": "Navê rojê ya tevahî",
"day-leading-zero": "Roj bi sifira destpêkê (01-31)",
"day-no-leading-zero": "Roj bê sifira destpêkê (1-31)",
"hour-leading-zero": "Demjimêr bi sifira destpêkê (00-23) — 24-awaya demjimêrê",
@@ -1774,21 +1798,21 @@
"month-number-no-zero": "Meh wekî jimarek bê sifira destpêkê (1-12)",
"second-leading-zero": "Çirke bi sifira destpêkê (00-59)",
"second-no-leading-zero": "Çirke bê sifira destpêkê (0-59)",
"timezone-abbreviation": "Kurteya herêma demjimêrê",
"timezone-abbreviation": "Kurteriya herêma demê",
"year-four-digit": "Sal wekî çar-jimar",
"year-two-digit": "Sal wekî du-jimar (00-99)"
},
"file-picker": {
"item": "babet",
"items": "babetên",
"item": "hêman",
"items": "hêman",
"search-placeholder": "Li pel û peldankan bigere...",
"select-current": "A heyî hilbijêre",
"select-file": "Pelê hilbijêre",
"select-folder": "Peldankê hilbijêre",
"selected": "Hûn bijartî:",
"selected": "Hilbijartî:",
"title": "Hilbijêrê pelê"
},
"file-picker-title": "Pelê hilbijêre",
"file-picker-title": "Pelekê hilbijêre",
"icon-picker": {
"title": "Hilbijêrê îkonê"
},
@@ -1797,17 +1821,17 @@
"wifi": {
"panel": {
"action-required": "Çalakî pêwîst e",
"available-interfaces": "Navên berdest",
"available-interfaces": "Navrûyên heyî",
"available-networks": "Torên heyî",
"disabled": "WiFi neçalak e",
"disconnecting": "Tê qutkirin...",
"dns": "DNS",
"enable-message": "WiFi çalak bike da ku torên heyî bibîne.",
"enable-message": "WiFi çalak bike da ku torên heyî bibînî.",
"enter-password": "Borînpeyva WiFi têxîne...",
"forget": "Ji bîr bike",
"forget-network": "Vê torê ji bîr bike",
"forgetting": "Tê jibîrkirin...",
"interface": "Dîmendera torê",
"interface": "Navrûya torê",
"internet-connected": "Înternet hat girêdan",
"internet-limited": "Înternet tune ye",
"internet-status": "Rewşa înternetê",
@@ -1822,10 +1846,10 @@
"title": "Wi-Fi"
},
"signal": {
"excellent": "Bawer be",
"fair": "Adil",
"good": "Baş",
"poor": "Zəif"
"excellent": "Bihêz e",
"fair": "Navîn e",
"good": "Baş e",
"poor": "Lawaz e"
}
}
}
+25 -1
View File
@@ -493,6 +493,7 @@
"week": "Week",
"widgets": "Widgets",
"width": "Breedte",
"windows": "Vensters",
"yes": "Ja"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "Bij hover"
},
"hide-modes": {
"auto-hide": "Automatisch verbergen",
"hidden": "Verbergen indien leeg",
"idle": "Verbergen indien inactief",
"transparent": "Transparant wanneer leeg",
@@ -563,7 +565,9 @@
"emoji-loading": "Emoji's laden...",
"emoji-loading-description": "Even geduld",
"emoji-no-recent": "Nog geen recente emoji's",
"emoji-search-description": "Zoek en kopieer emoji's"
"emoji-search-description": "Zoek en kopieer emoji's",
"settings-search-description": "Zoeken en navigeren naar instellingen",
"windows-search-description": "Zoek en focus open vensters"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "Standaard",
"density-mini": "Mini",
"density-spacious": "Ruim",
"display-mode-always-visible": "Altijd zichtbaar",
"type-floating": "Zwevend",
"type-framed": "Omkaderd",
"type-simple": "Eenvoudig"
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "Volume-overdrive toestaan"
},
"bar": {
"appearance-auto-hide-delay-description": "Tijd voordat de Bar verdwijnt nadat de muis deze verlaat.",
"appearance-auto-hide-delay-label": "Verbergvertraging",
"appearance-auto-hide-exclusive-note": "Opmerking: De exclusieve zone wordt automatisch uitgeschakeld wanneer automatisch verbergen actief is.",
"appearance-auto-show-delay-description": "Tijd voordat de balk verschijnt wanneer de muis de rand bereikt.",
"appearance-auto-show-delay-label": "Toonvertraging",
"appearance-background-opacity-description": "Stel de achtergronddoorzichtigheid specifiek in voor de balk.",
"appearance-background-opacity-label": "Balk achtergronddoorzichtigheid",
"appearance-capsule-opacity-description": "Stel het doorzichtigheidsniveau in voor widget-achtergronden wanneer capsule wordt getoond.",
@@ -728,6 +738,8 @@
"appearance-density-description": "Pas de opvulling van de balk aan voor een compacte of ruime uitstraling.",
"appearance-density-label": "Balkdichtheid",
"appearance-desc": "Pas de uitstraling en positie van de balk aan.",
"appearance-display-mode-description": "Kies wanneer de balk zichtbaar is",
"appearance-display-mode-label": "Weergavemodus",
"appearance-floating-description": "Toon de balk weer als een zwevende 'pil'.",
"appearance-floating-label": "Zwevende balk",
"appearance-frame-radius": "Binnenradius",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "Knoppen weergeven",
"media-player-show-visualizer-description": "Toon de audio-visualisatie overlay.",
"media-player-visualizer-type-description": "Kies een visualisatietype voor de achtergrond van de desktop mediaplayer.",
"system-stat-layout-bottom": "Onder",
"system-stat-layout-description": "Kies hoe de legenda wordt weergegeven ten opzichte van de grafiek.",
"system-stat-layout-label": "Indeling",
"system-stat-layout-side": "Zijde",
"system-stat-rounded-corners-description": "Afgeronde hoeken gebruiken voor de widget-achtergrond.",
"system-stat-rounded-corners-label": "Afgeronde Hoeken",
"system-stat-show-background-description": "Toon de achtergrondcontainer voor de systeemstatistieken-widget.",
"system-stat-show-background-label": "Achtergrond weergeven",
"system-stat-stat-type-description": "Kies welke systeemstatistiek weer te geven.",
"system-stat-stat-type-label": "Statistiektype",
"title": "Desktopwidgets",
"weather-enabled-description": "Toon een weerwidget op het bureaublad.",
"weather-enabled-label": "Weerwidget inschakelen",
@@ -1067,6 +1089,8 @@
"settings-desc": "Pas het gedrag en uiterlijk van de launcher aan.",
"settings-enable-settings-search-description": "Toon instellingen in de zoekresultaten van de Launcher.",
"settings-enable-settings-search-label": "Instellingen zoeken inschakelen",
"settings-enable-windows-search-description": "Actieve vensters zoeken en focussen.",
"settings-enable-windows-search-label": "Vensterzoekfunctie inschakelen",
"settings-grid-view-description": "Items in een raster weergeven in plaats van een lijst.",
"settings-icon-mode-description": "Gebruik native systeemiconen in plaats van Tabler-iconen.",
"settings-icon-mode-label": "Gebruik native iconen",
+670 -10
View File
@@ -489,6 +489,7 @@
"week": "Veke",
"widgets": "Miniprogram",
"width": "Breidde",
"windows": "Vindauge",
"yes": "Ja"
},
"control-center": {
@@ -508,6 +509,7 @@
"on-hover": "Ved sviv"
},
"hide-modes": {
"auto-hide": "Automatisk gøyming",
"hidden": "Gøym når tom",
"idle": "Gøym når inaktiv",
"transparent": "Gjennomsynleg når tom",
@@ -559,7 +561,9 @@
"emoji-loading": "Lastar inn emojiar...",
"emoji-loading-description": "Vent litt",
"emoji-no-recent": "Ingen nylege emojiar enno",
"emoji-search-description": "Leita i og kopiera emojiar"
"emoji-search-description": "Leita i og kopiera emojiar",
"settings-search-description": "Søk og naviger til innstillingar",
"windows-search-description": "Søk og fokuser opne vindauge"
}
},
"lock-screen": {
@@ -595,7 +599,11 @@
"density-compact": "Tett",
"density-default": "Standard",
"density-mini": "Ørliten",
"density-spacious": "Romsleg"
"density-spacious": "Romsleg",
"display-mode-always-visible": "Alltid synleg",
"type-floating": "Flytande",
"type-framed": "I ramme",
"type-simple": "Endefram"
},
"control-center": {
"quick-settings-style-classic": "Klassisk",
@@ -694,7 +702,7 @@
"media-scrolling-title-description": "Slå på varig blading for lange mediatitlar.",
"media-scrolling-title-label": "Bladande tittel",
"media-title": "Mediaavspelarar",
"on-middle-clicked-description": "Kommando som køyr når knappen er midtklikka.",
"on-middle-clicked-description": "Kommando som køyrer når knappen er midtklikka.",
"panel-applications-empty": "Ingen applikasjonar spelar av ljod no",
"title": "Ljod",
"visualizer-type-description": "Vel visualiseringstypen når ein spelar av media.",
@@ -713,25 +721,611 @@
"volumes-volume-overdrive-description": "Tillèt at ljodstyrke kan gå over 100%. Ikkje alltid støtta av maskinvare.",
"volumes-volume-overdrive-label": "Tillat overdrift på ljodstyrke"
},
"bar": {
"appearance-auto-hide-delay-description": "Tid før Bar-en skjuler seg etter at musa forlèt den.",
"appearance-auto-hide-delay-label": "Skjulingsforsinking",
"appearance-auto-hide-exclusive-note": "Merk: Eksklusiv sone blir automatisk deaktivert når auto-skjul er aktivt.",
"appearance-auto-show-delay-description": "Tid før baren viser seg når musa kjem til kanten.",
"appearance-auto-show-delay-label": "Visingsforsinking",
"appearance-capsule-opacity-description": "Set kor ugjennomsynlege bakgrunnen er for miniprogram når ilåta er på skjermen.",
"appearance-density-description": "Fastset utfylling på lina for å gjera henne tett eller romsleg.",
"appearance-display-mode-description": "Vel når baren er synleg",
"appearance-display-mode-label": "Visningsmodus",
"appearance-show-capsule-description": "Vis bakgrunn for miniprogram.",
"appearance-show-outline-label": "Vis grenser på miniprogram",
"monitor-configure-widgets": "Set opp miniprogram",
"monitor-widgets-title": "Miniprogramoppsett - {monitor}",
"use-global-widgets": "Bruk globale miniprogram",
"widgets-desc": "Drag miniprogram for å endra på rekkjefylgjd. Bruk høgreklikksmenyen for å senda miniprogram andre stader eller sletta dei.",
"widgets-title": "Miniprogramplassering"
},
"color-scheme": {
"color-source-use-wallpaper-colors-description": "Lagar fargeskala frå bakgrunnsbiletet ditt. Vel fargar automatisk for å skapa ein samanhengande skala.",
"color-source-use-wallpaper-colors-label": "Bruk bakgrunnsfargar",
"wallpaper-method-description": "Vel måten Noctalia lagar fargeskala på.",
"wallpaper-method-label": "Fargeskala lagingsmåte",
"wallpaper-monitor-source-description": "Vel kva for skjerm Noctalia ser på for å velja bakgrunnsfargar.",
"wallpaper-monitor-source-label": "Kjelde for fargeval"
},
"control-center": {
"shortcuts-title": "Miniprogramsnarvegar",
"system-monitor-disk-path-description": "Vel kva for diskmonteringspunkt systemvaktskortet i kontrollsenteret skal vakta.",
"system-monitor-disk-path-label": "Systemvakt filbane"
},
"desktop-widgets": {
"clock-enabled-description": "Vis ei klokkeminiprogram på skrivebordet.",
"clock-enabled-label": "Slå på klokka",
"clock-format-label": "Format",
"clock-height-description": "Høgd på klokkeprogrammet i piksel",
"clock-height-label": "Høgd",
"clock-minimal-mode-description": "Bruk endefram klokkevisning med tid og dato.",
"clock-minimal-mode-label": "Endefram-modus",
"clock-rounded-corners-description": "Bruk avrunda hyrne for bakgrunnen til miniprogrammet.",
"clock-rounded-corners-label": "Avrunda hyrne",
"clock-show-background-description": "Vis bakgrunnsilåta for klokkeprogrammet.",
"clock-show-background-label": "Vis bakgrunn",
"clock-show-date-description": "Vis datoen i dag under tida.",
"clock-show-date-label": "Vis dato",
"clock-show-seconds-description": "Vis sekund i tida.",
"clock-show-seconds-label": "Vis sekund",
"clock-style-analog": "Analog",
"clock-style-binary": "Binær",
"clock-style-description": "Vel klokkevisning.",
"clock-style-digital": "Digital",
"clock-style-label": "Klokkestil",
"clock-style-minimal": "Endefram",
"clock-width-description": "Breidde på klokkeprogrammet i piksel",
"edit-mode-button-label": "Endringsmodus",
"edit-mode-controls-explanation": "Venstreklikk & drag: Flytt eller endra storleik. Høgreklikk: opna val for samanhengsmenyen.",
"edit-mode-description": "Slå på endringsmodus for å flytta på skrivebordsminiprogram. Når dette er på, viser miniprogram ei grense og dei kan flyttast på.",
"edit-mode-exit-button": "Kom ut av endringsmodus",
"edit-mode-grid-snap-label": "Snap til rutenett",
"edit-mode-label": "Endringsmodus",
"enabled-description": "Slå av/på skrivebordsminiprogram heilt.",
"enabled-label": "Slå på skrivebordsminiprogram",
"general-desc": "Styr miniprogram som står på skrivebordet ditt.",
"general-title": "Skrivebordsminiprogram",
"media-player-enabled-description": "Vis mediaavspelar på skrivebordet.",
"media-player-enabled-label": "Slå på mediaminiprogram",
"media-player-rounded-corners-description": "Slå på avrunda hyrne på miniprogramsrendene.",
"media-player-show-album-art-description": "Vis albumkunst og spordata (tittel og artist).",
"media-player-show-album-art-label": "Vis albumkunst og tittel",
"media-player-show-background-description": "Vis bakgrunnsilåta.",
"media-player-show-buttons-description": "Vis mediakontrollane (spel/pause, førre, neste).",
"media-player-show-buttons-label": "Vis knappar",
"media-player-show-visualizer-description": "Vis overlegg for ljodvisualiseraren.",
"media-player-visualizer-type-description": "Vel visualiseringstype.",
"system-stat-rounded-corners-description": "Bruk avrunda hyrne for bakgrunnsbilete til miniprogrammet.",
"system-stat-rounded-corners-label": "Avrunda Hjørne",
"system-stat-show-background-description": "Viser bakgrunnsilåt til miniprogrammet for systemstatistikk.",
"system-stat-show-background-label": "Vis bakgrunn",
"system-stat-stat-type-description": "Vel kva for systemstatistikk som skal visast.",
"system-stat-stat-type-label": "Statistikktype",
"title": "Skrivebordsminiprogram",
"weather-enabled-description": "Viser miniprogram for vêr på skrivebordet.",
"weather-enabled-label": "Slå på miniprogram for vêr",
"weather-show-background-description": "Viser bakgrunnsilåt for miniprogrammet for vêr."
},
"general": {
"launch-setup-wizard": "Oppsetthjelpar"
},
"hooks": {
"info-parameters-description": "Bakgrunnskrok: $1 = bakgrunnsbane, $2 = skjermnamn<br>• Tema brytarkrok: $1 = sann/usann (Mørkemodus-status)<br>• Skjermopplåsings-/ulåsingskrokar: Ingen parametrar<br>• Ytingsmoduskrokar: Ingen parametrar<br>• Øktskrok: $1 = handling (Slå av/starta å nyo)",
"system-hooks-desc": "Set opp kommandoar som køyrer når systemhendingar skjer.",
"system-hooks-enable-description": "Slår av eller på krokkommandoar.",
"system-hooks-enable-label": "Slå på krokar",
"system-hooks-title": "Systemkrokar",
"wallpaper-changed-description": "Kommando som køyrer når bakgrunnsbiletet endrar.",
"wallpaper-changed-label": "Bakgrunnsbiletet endra",
"wallpaper-changed-placeholder": "t.d. notify-send \"Bakgrunnsbilete\" \"Endra\""
},
"indicator": {
"system-default": "Systemstandard"
},
"launcher": {
"clipboard-desc": "Sjå og styra utklippsboka di frå programveljaren.",
"settings-clipboard-watch-image-description": "Heil kommandostreng sendt til wl-paste for bildeendringar. (krev omstart)",
"settings-clipboard-watch-image-label": "Biletovervakingskommando",
"settings-clipboard-watch-text-description": "Fullstendig kommandostreng sendt til wl-paste for tekstendringer. (krever omstart)",
"settings-clipboard-watch-text-label": "Tekstovervakingskommando"
"execute-desc": "Styrer korleis applikasjonar er køyrde",
"execute-title": "Køyring",
"settings-annotation-tool-description": "Kommando som køyrer når ein klikkar på merknadsknappen i utklippsboka. Biletet vert sendt med røyr til denne kommandoen.",
"settings-annotation-tool-label": "Merknadsverktøy",
"settings-annotation-tool-placeholder": "t.d. 'gradia', 'satty -f -'",
"settings-auto-paste-description": "Limar inn det valde utklippet automatisk. Krev wtype.",
"settings-auto-paste-label": "Automatisk liming",
"settings-clip-preview-description": "Viser førebilete av utklippsinnhaldet når ein nyttar >clip kommandoen.",
"settings-clip-preview-label": "Slå på klippførebilete",
"settings-clip-wrap-text-description": "Bryt tekst i utklippsboka heller enn å korta han av.",
"settings-clip-wrap-text-label": "Tekstbryting i utklipp",
"settings-clipboard-history-description": "Sjå ting som var kopiert tidlegare i programveljaren.",
"settings-clipboard-history-label": "Slå på utklippsboka",
"settings-clipboard-watch-image-description": "Heile kommandostreng send til wl-paste for bileteendringar. (krev omstart)",
"settings-clipboard-watch-image-label": "Biletvaktskommando",
"settings-clipboard-watch-text-description": "Heile kommandostreng send til wl-paste for tekstendringar. (krev omstart)",
"settings-clipboard-watch-text-label": "Tekstvaktskommando",
"settings-custom-launch-prefix-description": "Førefester kommandoar med eigendefinert programveljar (t.d. 'runapp' for systemd-integrering).",
"settings-custom-launch-prefix-enabled-description": "Brukar eigendefinert førefeste for å starta applikasjonar heller enn standardmåten.",
"settings-custom-launch-prefix-enabled-label": "Slå på eigendefinert startførefeste",
"settings-custom-launch-prefix-label": "Eigendefinert startførefeste",
"settings-desc": "Vel korleis programveljaren ser ut og kva det gjer.",
"settings-enable-settings-search-description": "Viser innstillingar når ein leitar i programveljaren.",
"settings-enable-settings-search-label": "Søk i innstillingar",
"settings-enable-windows-search-description": "Søk og fokuser aktive vindauge.",
"settings-enable-windows-search-label": "Aktiver vindaugssøk",
"settings-grid-view-description": "Viser utfall i rutenett heller enn som liste.",
"settings-icon-mode-description": "Brukar heimlege systemikon heller enn Tabler-ikon.",
"settings-icon-mode-label": "Bruk heimlege ikon",
"settings-ignore-mouse-input-description": "Slå av musekontakt og rullehjul i programveljaren.",
"settings-ignore-mouse-input-label": "Ikkje vyrd musekontakt",
"settings-position-description": "Vel kvar programveljarpanelet opnar seg.",
"settings-show-categories-description": "Viser kategorifanar for å granska applikasjonar",
"settings-show-categories-label": "Vis kategori",
"settings-show-icon-background-description": "Viser ein avrunda firkant som bakgrunn bak ikon.",
"settings-show-icon-background-label": "Vis ikonbakgrunn",
"settings-sort-by-usage-description": "Når dette er på, står dei appane du brukar mest fyrst på lista.",
"settings-sort-by-usage-label": "Sortera ved bruk",
"settings-terminal-command-description": "Kommando som køyrer frå terminal. T.d. 'kitty -e' eller 'gnome-terminal --'.",
"settings-terminal-command-label": "Terminalkommando",
"settings-use-app2unit-description": "Brukar annan oppstartsmåte for å betre kunna ordna app-prosessar og for å hindra feil.",
"settings-use-app2unit-label": "Bruk App2Unit for å køyra applikasjonar",
"title": "Programveljar"
},
"location": {
"date-time-first-day-of-week-automatic": "Automatisk (bruk systemlokal)",
"location-desc": "Få vêr og natteljosplanleggjing ved å segja kvar du er.",
"weather-desc": "Vel temperatureininga du vil sjå.",
"weather-enabled-description": "Vis vêrdata gjennom grensesnittet og henta vêrdata. Når dette er avslege, gøymer alle vêrobjekt seg og Noctalia skal ikkje spørja etter dei på nettverket.",
"weather-enabled-label": "Slå på vêr",
"weather-fahrenheit-description": "Vis temperatur i Fahrenheit heller enn Celsius.",
"weather-fahrenheit-label": "Vis temperatur i Fahrenheit (°F)",
"weather-hide-city-description": "Gøym bynamnet på vêrvisningar gjennom grensesnittet.",
"weather-hide-city-label": "Gøym bynamn",
"weather-hide-timezone-description": "Gøym tidssone på vêrvisningar gjennom grensesnittet.",
"weather-hide-timezone-label": "Gøym tidssone",
"weather-show-effects-description": "Vis fleire synlege effektar (som regn, snø, lyn) på vêrkortet.",
"weather-show-effects-label": "Vis vêreffektar",
"weather-show-in-calendar-description": "Vis det daglege vêrvarselet rett i kalenderen.",
"weather-show-in-calendar-label": "Vis vêr i kalenderen"
},
"lock-screen": {
"allow-password-with-fprintd-description": "Når fprintd (fingeravtrykkautentisering) er aktiv, lar dette alternativet deg framleis logge inn med passordet ditt i staden for eit fingeravtrykk.",
"allow-password-with-fprintd-label": "Tillat passordpålogging med fprintd",
"auto-start-auth-description": "t.d. startar automatisk fingeravtrykksautentisering utan å krevje eit tastetrykk eller eit knappetrykk.",
"auto-start-auth-label": "Autostart autentisering"
"auto-start-auth-label": "Autostart autentisering",
"compact-lockscreen-description": "Viser berre inndata for å logga inn og systemkontrollar, gøymer miniprogramma for vêr og media.",
"compact-lockscreen-label": "Endefram låseskjerm",
"lock-on-suspend-description": "Låser skjermen automatisk når ein suspenderer systemet.",
"lock-on-suspend-label": "Lås på suspendering",
"show-hibernate-description": "Viser 'Set i full dvale' i straumkontrollane.",
"show-hibernate-label": "Vis full dvale",
"show-session-buttons-description": "Tillèt at ein kann bruka straumkontrollane frå låseskjermen.",
"show-session-buttons-label": "Straumkontrollar",
"title": "Låseskjerm"
},
"network": {
"wifi-description": "Styr trådlause nettverk (krev NetworkManager)."
},
"notifications": {
"media-toast-description": "Viser skjermvarsel når det er ei endring i mediaavspelingsstatus.",
"media-toast-label": "Media",
"sounds-excluded-apps-description": "Ikkje spel av varselljoden for visse applikasjonar som har eigne ljodar.",
"toast-desc": "Vel varseloppførsel og utsjånad.",
"toast-keyboard-description": "Viser skjermvarsel når knappefjøloppsett er endra.",
"toast-keyboard-label": "Knappefjøloppsett"
},
"session-menu": {
"countdown-duration-description": "Fastset kor lenge nedteljinga varar før straumhandlingar køyrer.",
"countdown-duration-label": "Nedteljing",
"enable-countdown-description": "Viser nedteljing før straumhandlingar køyrer.",
"enable-countdown-label": "Slå på nedteljing",
"entries-desc": "Vel kva for straumhandlingar står i øktsmenyen og rekkjefylgja dei står i.",
"entries-title": "Straumhandlingar",
"entry-settings-command-description": "Eigendefinert kommando som køyrer med denne handlinga. Haldt tom for å bruka systemstandarden.",
"entry-settings-command-placeholder": "t.d. systemctl poweroff",
"entry-settings-default-command-lock": "Intern låseskjerm (ingen kommando)",
"entry-settings-default-command-logout": "Intern utlogging (ingen kommando)",
"entry-settings-default-info-description": "Dersom du ikkje ha definert ein kommando, køyrer systemstandarden.",
"entry-settings-default-info-label": "Standardkommando",
"entry-settings-title": "Set opp {entry}",
"entry-settings-tooltip": "Set opp kommando",
"general-desc": "Set opp korleis øktsmenyen ser ut og kva det gjer.",
"large-buttons-layout-description": "Vel korleis knappar viser seg på øktsmenyen.",
"large-buttons-layout-label": "Oppsett med store knappar",
"large-buttons-style-description": "Viser øktsmenyen med store knappar i rutenett.",
"large-buttons-style-label": "Stil med store knappar",
"position-description": "Vel kvar øktsmenyen opnar seg på skjermen når du opnar han.",
"show-header-description": "Viser tittel og stengeknapp øvst på øktsmenyen.",
"show-header-label": "Vis topptekst",
"show-number-labels-description": "Viser taletikettar (1-2-3-4...) på knappar og slår på talsnarvegar for å velja fort.",
"show-number-labels-label": "Vis taletikettar"
},
"system-monitor": {
"critical-color-label": "Kritisk farge",
"custom-highlight-colors-title-label": "Eigendefinerte uthevingsfargar",
"disk-section-label": "Diskbruk",
"enable-dgpu-monitoring-description": "Åtvaring: Dette vekkjer det diskrete skjermkortet ditt (NVIDIA/AMD), som kan ha stor påverknad på batterilivet på berande datamaskiner med hypridgrafikk.",
"enable-dgpu-monitoring-label": "Slå på vakt for diskret skjermkort",
"external-monitor-description": "Skriv inn kommandoen eller applikasjonbanen som køyrer når du slår på eksterne systemvaktapplikasjonar",
"external-monitor-label": "Ekstern systemvaktkommando",
"external-monitor-placeholder": "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor",
"general-desc": "Set opp korleis systemvakta ser ut og oppfører seg.",
"gpu-section-label": "Skjermkorttemperatur",
"highlight-colors-section-label": "Uthevingsfargar",
"polling-interval-label": "Spørjingsintervall",
"polling-section-description": "Set opp kor ofte kvart systemmål vert oppdatert",
"polling-section-label": "Spørjingsintervall",
"threshold-critical": "Kritisk terskel",
"threshold-warning": "Åtvaringsterskel",
"thresholds-section-description": "Endra åtvarings-/kritiske tersklar for kvart systemmål.",
"use-custom-highlight-colors-description": "Når dette er avslege, brukar systemvakta uthevingsfargen frå temaet.",
"use-custom-highlight-colors-label": "Bruk eigendefinerte uthevingsfargar",
"warning-color-label": "Åtvaringsfarge"
},
"user-interface": {
"appearance-desc": "Måta til synlege objekt som hjelpetekst, grenser og skuggar.",
"panel-background-opacity-description": "Set kor ugjennomsynleg bakgrunnen er for alle panel (oppgåvelina, programveljar, innstillingar osb.).",
"tooltips-description": "Slå på eller av hjelpetekst gjennom brukargrensesnittet",
"tooltips-label": "Vis hjelpetekst"
},
"wallpaper": {
"automation-change-mode-alphabetical": "Alfabetisk",
"automation-change-mode-description": "Vel korleis Noctalia vel bakgrunnsbilete når dei endrar automatisk.",
"automation-change-mode-label": "Endringsmodus",
"automation-custom-interval-description": "Skriv inn tid som TT:MM (t.d. 01:30).",
"automation-custom-interval-label": "Eigendefinert tidsrom",
"automation-interval-description": "Kor ofte bakgrunnsbiletet endrar seg automatisk.",
"automation-interval-label": "Endringstidsrom",
"automation-random-wallpaper-description": "Planlegg tilfellelege endringar på bakgrunnsbilete jamleg.",
"automation-scheduled-change-description": "Endrar bakgrunnsbilete automatisk og jamleg.",
"automation-scheduled-change-label": "Planlagd endring",
"look-feel-edge-smoothness-description": "Når biletet endrar seg får rendene ein mjuk, fjørvoren effekt.",
"look-feel-edge-smoothness-label": "Mykna endringsrand",
"look-feel-fill-color-description": "Vel fyllfarge som kan visast bak bakgrunnsbiletet.",
"look-feel-fill-mode-description": "Vel korleis biletet skal skalerast for å høva skjermoppløysinga di.",
"look-feel-fill-mode-label": "Fyllmodus",
"look-feel-title": "Utsjånad",
"look-feel-transition-duration-description": "Kor lenge endringsanimasjonane tek i sekund.",
"look-feel-transition-duration-label": "Endringstid",
"look-feel-transition-type-description": "Animasjonstype når bakgrunnsbiletet endrar seg.",
"look-feel-transition-type-label": "Endringstype",
"settings-desc": "Styr korleis bakgrunnsbiletet vert handsama og viste.",
"settings-enable-management-description": "Styr bakgrunnsbilete med Noctalia. Slå av dersom du vil heller bruka eit anna program.",
"settings-enable-management-label": "Slå på bakgrunnshandsaming",
"settings-enable-overview-description": "Gjev oversynsskjermen eit uskarpt og dempa bakgrunnsbilete.",
"settings-enable-overview-label": "Slå på oversynsbilete",
"settings-folder-description": "Filbane til mappa der du har bakgrunnsbileta dine.",
"settings-folder-label": "Bakgrunnsbiletemappe",
"settings-hide-wallpaper-filenames-tooltip-hide": "Gøym filnamn",
"settings-hide-wallpaper-filenames-tooltip-show": "Vis filnamn",
"settings-monitor-specific-description": "Fastset ulike biletemapper for kvar skjerm.",
"settings-monitor-specific-label": "Skjermvise mapper",
"settings-monitor-specific-tooltip": "Vakta bakgrunnsbiletemappa",
"settings-recursive-search-description": "Leit etter bakgrunnsbilete i underordna mapper i biletemappa òg.",
"settings-recursive-search-label": "Leit i underordna mapper",
"settings-select-monitor-folder": "Vel bakgrunnsbiletemappe for skjerm",
"settings-selector-description": "Vel bakgrunnsbilete.",
"settings-selector-position-description": "Vel kvar bileteveljarpanelet skal visast.",
"settings-show-hidden-files-tooltip-hide": "Gøym gøymde filer",
"settings-show-hidden-files-tooltip-show": "Vis gøymde filer",
"settings-title": "Innstillingar for bakgrunnsbilete",
"settings-view-mode-description": "Vel korleis bakgrunnsbilete skal visast frå mappa di.",
"settings-view-mode-label": "Visningsmodus",
"view-mode-browse": "Søk i mapper",
"view-mode-cycle-tooltip": "Visningsmodus: {mode} (klikk for å endra)",
"view-mode-recursive": "Flate undermapper",
"view-mode-single": "Rotmappe"
}
},
"placeholders": {
"command-example": "echo \"Hei, verd\"",
"enter-command": "Skriv inn kommando som skal køyra (app eller eigendefinert skript)",
"enter-ipc-identifier": "Skriv inn unik identifikator for IPC kommandoar",
"enter-path": "Skriv inn filbane...",
"enter-text-to-collapse": "t.d. 'ingenting spelar av. Bruk /regex/ til mønster.",
"enter-tooltip": "Skriv inn hjelpetekst",
"enter-width-pixels": "Skriv inn breidde i piksel",
"search": "Søk...",
"search-icons": "t.d. noctalia, niri, battery, cloud",
"search-launcher": "Søk i treff... eller bruk > for kommandoar",
"search-wallhaven": "Leit på Wallhaven...",
"search-wallpapers": "Skriv for å filtrera bakgrunnsbilete..."
},
"positions": {
"bottom": "Nedst",
"bottom-center": "Nede i midten",
"bottom-left": "Nede til venstre",
"bottom-right": "Nede til høgre",
"center": "I midten",
"center-left": "I midten til venstre",
"center-right": "I midten til høgre",
"close-to-bar": "Attmed lineknappen",
"follow-bar": "Fylg oppgåvelina",
"left": "Venstre",
"right": "Høgre",
"top": "Øvst",
"top-center": "Øvst i midten",
"top-left": "Øvst til venstre",
"top-right": "Øvst til høgre"
},
"session-menu": {
"action-in-seconds": "{action} i {seconds} sekund...",
"cancel-timer": "Avbryt nedteljing",
"title": "Øktsmeny"
},
"setup": {
"all-done": "Ferdig!",
"appearance": {
"subheader": "Vel Mørkmodus og fargekjelder (Bakgrunnsbilete eller eigendefinert)."
},
"customize": {
"header": "Skreddersy opplevinga di",
"subheader": "Endra kvar oppgåvelina er, tettleik, skalering og meir."
},
"skip-setup": "Hopp over oppsett",
"telemetry-wizard-done": "Skjønar!",
"telemetry-wizard-note": "Du har kontroll - slå dette av eller på når som helst i Innstillingar",
"telemetry-wizard-subtitle": "Vi har lagt til anonyme analytikk for å hjelpa gjera Noctalia betre.",
"telemetry-wizard-title": "Oppdatering om personvern",
"wallpaper": {
"choose-dir": "Vel ei mappe som har bakgrunnsbileta dine i seg",
"dir-browse": "Søk etter bakgrunnsmappe",
"dir-description": "Vel mappa som har bakgrunnsbileta dine i seg.",
"dir-label": "Bakgrunnsmappe",
"dir-select-title": "Vel bakgrunnsmappe",
"header": "Vel bakgrunnsbiletet ditt",
"no-dir": "Inga bakgrunnsmappe vald",
"no-valid": "Fann ikkje gilde biletefiler i: {dir}",
"none-in-dir": "Fann ikkje bakgrunnsbilete i mappa",
"preview-error": "Kunne ikkje lasta inn biletet",
"select-prompt": "Vel bakgrunnsbilete under",
"subheader": "Måta til stemninga med eit fagert bakgrunnsbilete."
},
"welcome-note": "Berre nokre lette ting for å få deg opp og gåande - alle vala finn du i innstillingane.",
"welcome-subtitle": "Lat oss gjera skrivebordet ditt",
"welcome-title": "Velkomen åt Noctalia!"
},
"system": {
"cpu-temperature": "{temp} °C",
"disk-usage": "{percent} %",
"location-display": "{name} ({coordinates})",
"monitor-description": "{model} ({width}x{height} @ {scale}x)",
"no-media-player-detected": "Ingen mediaavspelar funnen",
"scaling-percentage": "{percentage} %",
"signal-strength": "{signal} %",
"unknown-app": "Ukjend app",
"uptime": "Oppetid: {uptime}",
"user-requested": "Brukaretterspurd",
"welcome-back": "Velkomen attende,",
"widget-settings-title": "{widget}innstillingar"
},
"system-monitor": {
"cpu-temp": "Prosessortemperatur",
"cpu-usage": "Prosessorbruk",
"disk": "Disk",
"download-speed": "Nedlastingsfart",
"gpu-temp": "Skjermkorttemperatur",
"load-average": "Lastingssnitt",
"title": "Systemvakt",
"upload-speed": "Opplastingsfart"
},
"toast": {
"donation-opened": "Donasjonsside opna i nettlesaren din"
"airplane-mode": {
"title": "Flymodus"
},
"battery": {
"low": "Lågt batteri",
"low-desc": "Batterinivået er {percent} %. Du bør kopla til ladaren."
},
"bluetooth": {
"address-copied": "Adresse kopiert til utklippstavla",
"confirm-code": "Stadfest koden {value} på hi eininga.",
"connect-failed": "Mislukka tilkopling",
"disconnect-failed": "Mislukka fråkopling",
"discoverable-change-failed": "Kunne ikkje endra oppdagingstilstand",
"discoverable-disabled": "Ikkje finnande",
"discoverable-enabled": "Finnande",
"display-code": "Skriv inn koden {value} på hi eininga.",
"forget-failed": "Kunne ikkje gløyma eininga",
"pair-failed": "Kunne ikkje kopla til eininga",
"passkey-required": "Eininga krev passord.",
"pincode-required": "Eininga krev PIN-kode.",
"state-change-failed": "Kunne ikkje endra Bluetoothstatus"
},
"clipboard": {
"long-text": "Lang tekst",
"unavailable": "Utklippsboka ikkje tilgjengeleg",
"unavailable-desc": "'cliphist' er ikkje installert. Du må installera han for å kunne bruka utklippsboka."
},
"do-not-disturb": {
"disabled": "\"Ikkje forstyrr\" av",
"disabled-desc": "Viser alle varsel",
"enabled": "\"Ikkje forstyrr\" på",
"enabled-desc": "Du finn desse varsla i historikken din"
},
"donation-opened": "Donasjonsside opna i nettlesaren din",
"internet-limited": "Kopla til utan internett",
"keyboard-layout": {
"changed": "Oppsett endra til {layout}",
"title": "Knappefjøl"
},
"missing-control-center": {
"description": "Miniprogrammet for kontrollsenteret er ikkje lenger på oppgåvelina. For å få tilgang frå oppgåvelina, må du leggja det til att. Du kan opna det ved å høgreklikka på oppgåvelina òg.",
"label": "Siste miniprogram for kontrollsenter sletta"
},
"night-light": {
"forced": "Tvinga aktivering",
"normal": "Vanleg modus",
"not-installed": "wlsunset ikkje installert"
},
"noctalia-performance": {
"disabled": "Ytingsmodus av",
"enabled": "Ytingsmodus på",
"label": "Noctalia Yting"
},
"power-profile": {
"changed": "Straumprofil endra",
"profile-name": "{profile}"
},
"theming-processor-failed": {
"desc-generic": "Noctalia støytte på ein feil medan det handsama malar",
"title": "Malhandsaming mislukka"
},
"vpn": {
"connected": "Kopla til '{name}'",
"disconnected": "Kopla frå '{name}'"
},
"wallpaper-colors": {
"disabled": "Bakgrunnsfargar av",
"enabled": "Bakgrunnsfargar på",
"label": "Bakgrunnsfargar"
},
"wifi": {
"connected": "Kopla til '{ssid}'",
"connection-failed": "Kopling mislukka",
"connection-timeout": "Tidsavbrot med kopling",
"disconnected": "Kopla frå '{ssid}'",
"incorrect-password": "Gale passord",
"network-not-found": "Nettverk ikkje funne"
}
},
"tooltips": {
"add-widget": "Legg til miniprogram",
"bluetooth-devices": "Bluetooth-einingar",
"brightness-at": "Ljosstyrke: {brightness} %",
"click-to-start-recording": "Skjermopptak (start opptak)",
"click-to-stop-recording": "Skjermopptak (stogg opptak)",
"collapse": "Gøym sidestolpen",
"copy-address": "Kopier adresse",
"delete-notification": "Slett varsel",
"do-not-disturb-enabled": "Ikkje forstyrr",
"expand": "Brett ut sidestolpen",
"forget-network": "Gløym nettverk",
"grid-view": "Rutenett",
"hidden-files-hide": "Gøymde filer",
"hide-unnamed-devices": "Gøym einingar utan namn",
"home": "Heimemappe",
"input-muted": "Slå av/på ljod i inngang",
"keep-awake": "Haldt vaken",
"keyboard-layout": "{layout} knappefjøloppsett",
"list-view": "Liste",
"manage-vpn": "VPN-tilkoplingar",
"manage-wifi": "Wi-Fi",
"max-widgets-reached": "Øvre grense på miniprogramm nådd",
"microphone-volume-at": "Ljodstyrke på mikrofon: {volume} %",
"move-to-section": "Flytt til {section}",
"mute": "Slå av ljod",
"next-media": "Neste song",
"next-month": "Neste månad",
"night-light-not-installed": "Natteljos (ikkje tilgjengeleg)",
"noctalia-performance-enabled": "Noctalia Ytingsmodus",
"open-annotation-tool": "Opna med merknadsverktøyet",
"open-control-center": "Kontrollsenter",
"open-notification-history-enable-dnd": "Varselhistorikk",
"open-settings": "Innstillingar",
"open-tray-dropdown": "Systemkorg",
"output-muted": "Slå av/på ljod i utgang",
"power-profile": "{profile} straumprofil",
"previous-media": "Førre song",
"previous-month": "Førre månad",
"refresh-devices": "Last inn einingar å nyo",
"refresh-wallhaven": "Last inn Wallhaven-utfall å nyo",
"refresh-wallpaper-list": "Last inn bakgrunnslista å nyo",
"remove-widget": "Slett miniprogram",
"search-close": "Steng søk",
"session-menu": "Øktsmeny",
"show-all-devices": "Vis alle einingar",
"switch-to-dark-mode": "Mørkmodus",
"switch-to-light-mode": "Ljosmodus",
"unmute": "Slå på ljod",
"up": "Overordna mappe",
"volume-at": "Ljod i utgang: {volume} %",
"wallpaper-selector": "Bakgrunnsveljar"
},
"wallpaper": {
"browse": {
"empty-directory": "Denne mappa er tom.",
"go-root": "Gå til bakgrunnsbileterota",
"go-up": "Gå til overordna mappe",
"go-up-hint": "Bruk \"attende\"-knappen for å gå opp eitt nivå."
},
"configure-directory": "Styr bakgrunnsbiletemappa med bilete.",
"fill-modes": {
"crop": "Skjer av (Fyll)",
"fit": "Måta til (Haldt)",
"repeat": "Tak opp att (Flislegg)",
"stretch": "Tøyg"
},
"no-match": "Ingen treff.",
"no-wallpaper": "Ingen bakgrunnsbilete funne.",
"panel": {
"apikey-help": "Ein API-lykel krevst for å få tilgang til NSFW-innhald",
"apikey-label": "API-lykel",
"apikey-managed-by-env": "Styrt med NOCTALIA_WALLHAVEN_API_KEY miljøvariabel.",
"apikey-placeholder": "Skriv inn API-lyklen din for Wallhaven",
"apply-all-monitors-description": "Gjev det valde bakgrunnsbiletet til alle skjermar.",
"apply-all-monitors-label": "Gjev til alle skjermar.",
"categories-anime": "Anime",
"categories-label": "Kategoriar",
"categories-people": "Folk",
"order-asc": "Oppover",
"order-desc": "Nedover",
"order-label": "Rekkjefylgd",
"purity-label": "Innhaldsfilter",
"purity-nsfw": "NSFW",
"purity-sfw": "SFW",
"purity-sketchy": "På randa",
"ratios-all-portrait": "Alle ståande",
"ratios-all-wide": "Alle breide",
"ratios-any": "Kva som helst",
"ratios-label": "Sidetilhøve",
"resolution-atleast": "I minsto",
"resolution-exact": "Nøye",
"resolution-label": "Oppløysing",
"resolution-mode-label": "Modus",
"solid-color-tooltip": "Einsfarga bakgrunn",
"sorting-date-added": "Dato lagt til",
"sorting-favorites": "Favorittar",
"sorting-label": "Sorter ved",
"sorting-relevance": "Relevans",
"sorting-toplist": "Toppliste",
"sorting-views": "Visningar",
"source-label": "Kjelde",
"source-wallhaven": "Wallhaven",
"title": "Wallhaven-veljar",
"wallhaven-settings-title": "Wallhaven-innstillingar"
},
"transitions": {
"disc": "Disk",
"fade": "Bleikna",
"stripes": "Striper",
"wipe": "Viska"
},
"try-different-search": "Prøv å søkja noko anna.",
"wallhaven": {
"loading": "Lastar inn bakgrunnsbilete...",
"no-results": "Fann ingen bakgrunnsbilete. Prøv å søkja noko anna.",
"page": "{current} av {total}"
}
},
"weather": {
"clear-sky": "Klår himmel",
"drizzle": "Yr",
"fog": "Skodde",
"mainly-clear": "For det meste klår",
"overcast": "Skyete",
"partly-cloudy": "Nokre fåe skyer",
"rain-showers": "Regnskurer",
"snow": "Snø",
"thunderstorm": "Storm"
},
"widgets": {
"color-picker": {
"palette-description": "Vel frå mange ulike fargar.",
"palette-label": "Palett",
"palette-theme-colors": "Kjapp tilgang til fargeskalaen for temaet ditt.",
"title": "Fargeveljar"
},
"datetime-tokens": {
"ampm-lowercase": "am/pm med småe bokstavar",
"ampm-uppercase": "AM/PM med store bokstavar",
"common-12hour-time-minutes": "Tid i 12-timar med minutt",
"common-24hour-time-minutes": "Tid i 24-timar med minutt",
"common-24hour-time-seconds": "Tid i 24-timar med sekund",
@@ -739,7 +1333,73 @@
"common-iso-date": "ISO datoformat",
"common-us-date": "Amerikansk datoformat",
"common-weekday-date": "Vekedag med dato",
"common-weekday-month-day": "Vekedag, månad og dag"
"common-weekday-month-day": "Vekedag, månad og dag",
"day-abbreviated": "Forkorta dagsnamn",
"day-full": "Fullt dagsnamn",
"day-leading-zero": "Dag med null føre (01-31)",
"day-no-leading-zero": "Dag utan null føre (1-31)",
"hour-leading-zero": "Time med null føre (00-23) — 24t-format",
"hour-no-leading-zero": "Time utan null føre (0-23) — 24t-format",
"minute-leading-zero": "Minutt med null føre (00-59)",
"minute-no-leading-zero": "Minutt utan null føre (0-59)",
"month-abbreviated": "Forkorta månadsnamn",
"month-full": "Fullt månadsnamn",
"month-number-leading-zero": "Månad som tal med null føre (01-12)",
"month-number-no-zero": "Månad som tal utan null føre (1-12)",
"second-leading-zero": "Sekund med null føre (00-59)",
"second-no-leading-zero": "Sekund utan null føre (0-59)",
"timezone-abbreviation": "Forkorta tidssone",
"year-four-digit": "År som tal med fire siffer",
"year-two-digit": "År som tal med to siffer (00-99)"
},
"file-picker": {
"item": "objekt",
"items": "objekt",
"search-placeholder": "Leita i filer og mapper...",
"select-current": "Vel noverande",
"select-file": "Vel fil",
"select-folder": "Vel mappe",
"selected": "Valt:",
"title": "Filveljar"
},
"file-picker-title": "Vel ei fil",
"icon-picker": {
"title": "Ikonveljar"
},
"tooltip-placeholder": "Plasshaldar"
},
"wifi": {
"panel": {
"action-required": "Krev handling",
"available-interfaces": "Tilgjengelege grensesnitt",
"available-networks": "Tilgjengelege nettverk",
"disabled": "Wi-Fi er slege av",
"disconnecting": "Koplar frå...",
"dns": "DNS",
"enable-message": "Slå på Wi-Fi for å sjå tilgjengelege nettverk.",
"enter-password": "Skriv inn Wi-Fi-passord...",
"forget": "Gløym",
"forget-network": "Gløym dette nettverket",
"forgetting": "Gløymer...",
"interface": "Nettverkgrensesnitt",
"internet-connected": "Kopla til internettet",
"internet-limited": "Ikkje kopla til internettet",
"internet-status": "Internettstatus",
"ipv4": "IPv4",
"known-networks": "Kjende nettverk",
"link-speed": "Lenkjefart",
"no-ethernet-devices": "Ingen etherneteiningar funne",
"no-networks": "Ingen Wi-Fi-nettverk funne",
"saved": "Lagra",
"scan-again": "Leit atter",
"searching": "Søkjer etter nettverk...",
"title": "Wi-Fi"
},
"signal": {
"excellent": "Framifrå",
"fair": "Grei",
"good": "God",
"poor": "Dåleg"
}
}
}
+25 -1
View File
@@ -493,6 +493,7 @@
"week": "Tydzień",
"widgets": "Widżety",
"width": "Szerokość",
"windows": "Okna",
"yes": "Tak"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "Po najechaniu kursorem"
},
"hide-modes": {
"auto-hide": "Automatyczne ukrywanie",
"hidden": "Ukryj, gdy puste",
"idle": "Ukryj, gdy bezczynny",
"transparent": "Przezroczysty, gdy pusty",
@@ -563,7 +565,9 @@
"emoji-loading": "Ładowanie emoji...",
"emoji-loading-description": "Proszę czekać",
"emoji-no-recent": "Brak ostatnich emoji",
"emoji-search-description": "Szukaj i kopiuj emoji"
"emoji-search-description": "Szukaj i kopiuj emoji",
"settings-search-description": "Szukaj i przejdź do ustawień",
"windows-search-description": "Wyszukaj i aktywuj otwarte okna"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "Domyślny",
"density-mini": "Mini",
"density-spacious": "Przestronny",
"display-mode-always-visible": "Zawsze widoczne",
"type-floating": "Pływający",
"type-framed": "Obramowany",
"type-simple": "Prosty"
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "Zezwalaj na wzmocnienie głośności (overdrive)"
},
"bar": {
"appearance-auto-hide-delay-description": "Czas, po którym Bar zniknie po opuszczeniu go przez mysz.",
"appearance-auto-hide-delay-label": "Opóźnienie ukrywania",
"appearance-auto-hide-exclusive-note": "Uwaga: Strefa wyłączna jest automatycznie wyłączana, gdy autoukrywanie jest aktywne.",
"appearance-auto-show-delay-description": "Czas, zanim pasek pojawi się, gdy mysz wejdzie na krawędź.",
"appearance-auto-show-delay-label": "Opóźnienie Wyświetlania",
"appearance-background-opacity-description": "Ustaw przezroczystość tła konkretnie dla paska.",
"appearance-background-opacity-label": "Krycie tła paska",
"appearance-capsule-opacity-description": "Ustaw poziom przezroczystości tła widżetów, gdy kapsuła jest widoczna.",
@@ -728,6 +738,8 @@
"appearance-density-description": "Dostosuj odstępy paska dla kompaktowego lub przestronnego wyglądu.",
"appearance-density-label": "Zagęszczenie paska",
"appearance-desc": "Dostosuj wygląd i pozycję paska.",
"appearance-display-mode-description": "Wybierz, kiedy pasek jest widoczny",
"appearance-display-mode-label": "Tryb Wyświetlania",
"appearance-floating-description": "Wyświetl pasek jako pływającą 'pigułkę'.",
"appearance-floating-label": "Pływający pasek",
"appearance-frame-radius": "Promień wewnętrzny",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "Pokaż przyciski",
"media-player-show-visualizer-description": "Pokaż nakładkę wizualizatora audio.",
"media-player-visualizer-type-description": "Wybierz typ wizualizacji dla tła odtwarzacza pulpitu.",
"system-stat-layout-bottom": "Dół",
"system-stat-layout-description": "Wybierz, jak legenda jest wyświetlana względem wykresu.",
"system-stat-layout-label": "Układ",
"system-stat-layout-side": "Strona",
"system-stat-rounded-corners-description": "Użyj zaokrąglonych rogów dla tła widżetu.",
"system-stat-rounded-corners-label": "Zaokrąglone Narożniki",
"system-stat-show-background-description": "Pokaż kontener tła dla widżetu statystyk systemowych.",
"system-stat-show-background-label": "Pokaż tło",
"system-stat-stat-type-description": "Wybierz, którą statystykę systemową wyświetlić.",
"system-stat-stat-type-label": "Typ Statystyki",
"title": "Widżety pulpitu",
"weather-enabled-description": "Pokaż widżet pogody na pulpicie.",
"weather-enabled-label": "Włącz widżet pogody",
@@ -1067,6 +1089,8 @@
"settings-desc": "Dostosuj zachowanie i wygląd launchera.",
"settings-enable-settings-search-description": "Wyświetlaj wyniki ustawień podczas wyszukiwania w Launcherze.",
"settings-enable-settings-search-label": "Włącz wyszukiwanie w ustawieniach",
"settings-enable-windows-search-description": "Wyszukaj i skup aktywne okna.",
"settings-enable-windows-search-label": "Włącz wyszukiwanie okien",
"settings-grid-view-description": "Wyświetlaj elementy w układzie siatki zamiast listy.",
"settings-icon-mode-description": "Używaj natywnych ikon systemowych zamiast ikon Tabler.",
"settings-icon-mode-label": "Używaj natywnych ikon",
+25 -1
View File
@@ -493,6 +493,7 @@
"week": "Semana",
"widgets": "Widgets",
"width": "Largura",
"windows": "Janelas",
"yes": "Sim"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "Ao passar"
},
"hide-modes": {
"auto-hide": "Ocultar automaticamente",
"hidden": "Ocultar quando vazio",
"idle": "Ocultar quando inativo",
"transparent": "Transparente quando vazio",
@@ -563,7 +565,9 @@
"emoji-loading": "Carregando emojis...",
"emoji-loading-description": "Por favor, aguarde",
"emoji-no-recent": "Ainda não há emojis recentes",
"emoji-search-description": "Buscar e copiar emojis"
"emoji-search-description": "Buscar e copiar emojis",
"settings-search-description": "Pesquisar e navegar para as configurações",
"windows-search-description": "Pesquisar e focar janelas abertas"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "Padrão",
"density-mini": "Mini",
"density-spacious": "Espaçoso(a)",
"display-mode-always-visible": "Sempre Visível",
"type-floating": "Flutuante",
"type-framed": "Emoldurada",
"type-simple": "Simples"
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "Permitir volume acima de 100%"
},
"bar": {
"appearance-auto-hide-delay-description": "Tempo até a Bar se ocultar depois que o rato a deixa.",
"appearance-auto-hide-delay-label": "Atraso para Ocultar",
"appearance-auto-hide-exclusive-note": "Nota: A zona exclusiva é automaticamente desativada quando o auto-ocultar está ativo.",
"appearance-auto-show-delay-description": "Tempo até a barra aparecer quando o mouse entra na borda.",
"appearance-auto-show-delay-label": "Atraso de Exibição",
"appearance-background-opacity-description": "Defina a opacidade do fundo especificamente para a barra.",
"appearance-background-opacity-label": "Opacidade do fundo da barra",
"appearance-capsule-opacity-description": "Define o nível de opacidade para fundos dos widgets quando a cápsula é mostrada.",
@@ -728,6 +738,8 @@
"appearance-density-description": "Ajuste o preenchimento da barra para um visual compacto ou espaçoso.",
"appearance-density-label": "Densidade da barra",
"appearance-desc": "Personalize a aparência e a posição da barra.",
"appearance-display-mode-description": "Escolha quando a barra está visível",
"appearance-display-mode-label": "Modo de Exibição",
"appearance-floating-description": "Exibe a barra como uma 'pílula' flutuante.",
"appearance-floating-label": "Barra flutuante",
"appearance-frame-radius": "Raio Interno",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "Mostrar botões",
"media-player-show-visualizer-description": "Mostrar a sobreposição do visualizador de áudio.",
"media-player-visualizer-type-description": "Escolha um tipo de visualização para o fundo do reprodutor de mídia na área de trabalho.",
"system-stat-layout-bottom": "Inferior",
"system-stat-layout-description": "Escolha como a legenda é exibida em relação ao gráfico.",
"system-stat-layout-label": "Layout",
"system-stat-layout-side": "Lado",
"system-stat-rounded-corners-description": "Usar cantos arredondados para o fundo do widget.",
"system-stat-rounded-corners-label": "Cantos Arredondados",
"system-stat-show-background-description": "Mostrar o contêiner de fundo para o widget de estatísticas do sistema.",
"system-stat-show-background-label": "Mostrar plano de fundo",
"system-stat-stat-type-description": "Escolhe qual estatística do sistema exibir.",
"system-stat-stat-type-label": "Tipo de Estatística",
"title": "Widgets da área de trabalho",
"weather-enabled-description": "Mostrar um widget de clima na área de trabalho.",
"weather-enabled-label": "Ativar widget de clima",
@@ -1067,6 +1089,8 @@
"settings-desc": "Personalize o comportamento e a aparência do lançador.",
"settings-enable-settings-search-description": "Mostrar os resultados das configurações ao pesquisar no Launcher.",
"settings-enable-settings-search-label": "Ativar pesquisa nas configurações",
"settings-enable-windows-search-description": "Pesquisar e focar janelas ativas.",
"settings-enable-windows-search-label": "Ativar pesquisa de janelas",
"settings-grid-view-description": "Exibir itens em uma grade em vez de uma lista.",
"settings-icon-mode-description": "Use ícones nativos do sistema em vez de ícones Tabler.",
"settings-icon-mode-label": "Usar ícones nativos",
+29 -5
View File
@@ -493,6 +493,7 @@
"week": "Неделя",
"widgets": "Виджеты",
"width": "Ширина",
"windows": "Окна ",
"yes": "Да"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "При наведении"
},
"hide-modes": {
"auto-hide": "Автоматическое скрытие",
"hidden": "Скрывать, когда пусто",
"idle": "Скрывать в режиме простоя",
"transparent": "Прозрачный, когда пустой",
@@ -563,7 +565,9 @@
"emoji-loading": "Загрузка эмодзи...",
"emoji-loading-description": "Пожалуйста, подождите",
"emoji-no-recent": "Недавних эмодзи пока нет",
"emoji-search-description": "Поиск и копирование эмодзи"
"emoji-search-description": "Поиск и копирование эмодзи",
"settings-search-description": "Поиск и переход к настройкам",
"windows-search-description": "Поиск и фокусировка открытых окон"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "По умолчанию",
"density-mini": "Мини",
"density-spacious": "Просторный",
"display-mode-always-visible": "Всегда видны",
"type-floating": "Плавающий",
"type-framed": "В рамке",
"type-simple": "Простой"
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "Разрешить перегрузку громкости"
},
"bar": {
"appearance-auto-hide-delay-description": "Время, через которое Bar скроется после того, как курсор мыши покинет его.",
"appearance-auto-hide-delay-label": "Задержка скрытия",
"appearance-auto-hide-exclusive-note": "Примечание: Эксклюзивная зона автоматически отключается, когда автоскрытие активно.",
"appearance-auto-show-delay-description": "Время до появления панели, когда мышь входит в край.",
"appearance-auto-show-delay-label": "Задержка отображения",
"appearance-background-opacity-description": "Установите прозрачность фона специально для панели.",
"appearance-background-opacity-label": "Прозрачность фона бара",
"appearance-capsule-opacity-description": "Установить уровень непрозрачности для фона виджетов, когда капсула отображается.",
@@ -728,6 +738,8 @@
"appearance-density-description": "Настройка отступов панели для компактного или просторного вида.",
"appearance-density-label": "Плотность панели",
"appearance-desc": "Настройка внешнего вида и положения панели.",
"appearance-display-mode-description": "Выберите, когда панель видна",
"appearance-display-mode-label": "Режим Отображение",
"appearance-floating-description": "Отображает панель как плавающую 'таблетку'.",
"appearance-floating-label": "Плавающая панель",
"appearance-frame-radius": "Внутренний радиус",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "Показать кнопки",
"media-player-show-visualizer-description": "Показать наложение аудиовизуализатора.",
"media-player-visualizer-type-description": "Выберите тип визуализации для фона медиаплеера.",
"system-stat-layout-bottom": "Низ",
"system-stat-layout-description": "Выберите, как отображается легенда относительно графика.",
"system-stat-layout-label": "Макет",
"system-stat-layout-side": "Сторона",
"system-stat-rounded-corners-description": "Использовать скругленные углы для фона виджета.",
"system-stat-rounded-corners-label": "Скругленные Углы",
"system-stat-show-background-description": "Показать фоновый контейнер для виджета системной статистики.",
"system-stat-show-background-label": "Показать фон",
"system-stat-stat-type-description": "Выберите, какую системную статистику отображать.",
"system-stat-stat-type-label": "Тип Статистики",
"title": "Настольные виджеты",
"weather-enabled-description": "Показать погодный виджет на рабочем столе.",
"weather-enabled-label": "Включить виджет погоды",
@@ -1042,7 +1064,7 @@
"system-default": "По умолчанию"
},
"launcher": {
"clipboard-desc": "Получайте доступ к истории буфера обмена и управляйте ею из панели запуска.",
"clipboard-desc": "Получайте доступ к истории буфера обмена и управляйте ею из лаунчера.",
"execute-desc": "Настройте способ запуска приложений.",
"execute-title": "Исполнение",
"settings-annotation-tool-description": "Команда для запуска при нажатии кнопки аннотирования в истории буфера обмена. Изображение будет передано в эту команду.",
@@ -1065,14 +1087,16 @@
"settings-custom-launch-prefix-enabled-label": "Включить пользовательский префикс запуска",
"settings-custom-launch-prefix-label": "Пользовательский префикс запуска",
"settings-desc": "Настройка поведения и внешнего вида запуска.",
"settings-enable-settings-search-description": "Показывать результаты настроек при поиске в Launcher.",
"settings-enable-settings-search-description": "Показывать результаты настроек при поиске в лаунчере.",
"settings-enable-settings-search-label": "Включить поиск в настройках",
"settings-enable-windows-search-description": "Поиск и фокусировка активных окон.",
"settings-enable-windows-search-label": "Включить поиск окон",
"settings-grid-view-description": "Показывать элементы в виде сетки вместо списка.",
"settings-icon-mode-description": "Использовать нативные системные иконки вместо иконок Tabler.",
"settings-icon-mode-label": "Использовать нативные иконки",
"settings-ignore-mouse-input-description": "Отключить взаимодействие с мышью и колесом прокрутки в лаунчере.",
"settings-ignore-mouse-input-label": "Игнорировать ввод мыши",
"settings-position-description": "Выберите, где появляется панель запуска.",
"settings-position-description": "Выберите, где появляется панель лаунчера.",
"settings-show-categories-description": "Показывать вкладки категорий для фильтрации приложений.",
"settings-show-categories-label": "Показывать категории",
"settings-show-icon-background-description": "Показывать закруглённый прямоугольник в качестве фона для иконок.",
@@ -1083,7 +1107,7 @@
"settings-terminal-command-label": "Команда терминала",
"settings-use-app2unit-description": "Использует альтернативный метод запуска для лучшего управления процессами приложений и предотвращения проблем.",
"settings-use-app2unit-label": "Использовать App2Unit для запуска приложений",
"title": "Запуск"
"title": "Лаунчер"
},
"location": {
"calendar-cards-desc": "Организуйте и включайте/выключайте карточки в панели календаря.",
+25 -1
View File
@@ -493,6 +493,7 @@
"week": "Vecka",
"widgets": "Widgetar",
"width": "Bredd",
"windows": "Fönster",
"yes": "Ja"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "Vid muspekning"
},
"hide-modes": {
"auto-hide": "Dölj automatiskt",
"hidden": "Dölj när tom",
"idle": "Dölj när inaktiv",
"transparent": "Transparent när tom",
@@ -563,7 +565,9 @@
"emoji-loading": "Läser in emojis...",
"emoji-loading-description": "Vänta",
"emoji-no-recent": "Inga nya emojis ännu",
"emoji-search-description": "Sök och kopiera emojis"
"emoji-search-description": "Sök och kopiera emojis",
"settings-search-description": "Sök och navigera till inställningar",
"windows-search-description": "Sök och fokusera öppna fönster"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "Standard",
"density-mini": "Mini",
"density-spacious": "Rymlig",
"display-mode-always-visible": "Alltid synlig",
"type-floating": "Flytande",
"type-framed": "Inramad",
"type-simple": "Enkel"
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "Tillåt volymöverstyrning"
},
"bar": {
"appearance-auto-hide-delay-description": "Tid innan Bar döljs efter att musen lämnar den.",
"appearance-auto-hide-delay-label": "Dölj fördröjning",
"appearance-auto-hide-exclusive-note": "Obs: Exklusiv zon inaktiveras automatiskt när automatisk döljning är aktiv.",
"appearance-auto-show-delay-description": "Tid innan fältet visas när musen når kanten.",
"appearance-auto-show-delay-label": "Visningsfördröjning",
"appearance-background-opacity-description": "Ställ in bakgrundens opacitet specifikt för fältet.",
"appearance-background-opacity-label": "Fältets bakgrundsopacitet",
"appearance-capsule-opacity-description": "Ställ in opacitetsnivån för widgetbakgrunder när kapseln visas.",
@@ -728,6 +738,8 @@
"appearance-density-description": "Justera stapelns avstånd för ett kompakt eller rymligt utseende.",
"appearance-density-label": "Stapeldensitet",
"appearance-desc": "Anpassa stapelns utseende och position.",
"appearance-display-mode-description": "Välj när listen är synlig",
"appearance-display-mode-label": "Visningsläge",
"appearance-floating-description": "Visa stapeln som en flytande \"piller\".",
"appearance-floating-label": "Flytande stapel",
"appearance-frame-radius": "Inre radie",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "Visa knappar",
"media-player-show-visualizer-description": "Visa ljudvisualiseringsöverlägget.",
"media-player-visualizer-type-description": "Välj en visualiseringstyp.",
"system-stat-layout-bottom": "Botten",
"system-stat-layout-description": "Välj hur förklaringen visas i förhållande till diagrammet.",
"system-stat-layout-label": "Layout",
"system-stat-layout-side": "Sida",
"system-stat-rounded-corners-description": "Använd rundade hörn för widgetbakgrunden.",
"system-stat-rounded-corners-label": "Rundade Hörn",
"system-stat-show-background-description": "Visa bakgrundsbehållaren för systemstatistik-widgeten.",
"system-stat-show-background-label": "Visa bakgrund",
"system-stat-stat-type-description": "Välj vilken systemstatistik som ska visas.",
"system-stat-stat-type-label": "Statistiktyp",
"title": "Skrivbordswidgetar",
"weather-enabled-description": "Visa en väderwidget på skrivbordet.",
"weather-enabled-label": "Aktivera väderwidget",
@@ -1067,6 +1089,8 @@
"settings-desc": "Anpassa startprogrammets beteende och utseende.",
"settings-enable-settings-search-description": "Visa inställningsresultat vid sökning i startprogrammet.",
"settings-enable-settings-search-label": "Aktivera inställningssökning",
"settings-enable-windows-search-description": "Sök och fokusera aktiva fönster.",
"settings-enable-windows-search-label": "Aktivera fönstersökning",
"settings-grid-view-description": "Visa objekt i ett rutnät istället för en lista.",
"settings-icon-mode-description": "Använd inbyggda systemikoner istället för Tabler-ikoner.",
"settings-icon-mode-label": "Använd inbyggda ikoner",
+25 -1
View File
@@ -493,6 +493,7 @@
"week": "Hafta",
"widgets": "Araçlar",
"width": "Genişlik",
"windows": "Pencereler",
"yes": "Evet"
},
"control-center": {
@@ -512,6 +513,7 @@
"on-hover": "Üzerine gelindiğinde"
},
"hide-modes": {
"auto-hide": "Otomatik gizleme",
"hidden": "Boş olduğunda gizle",
"idle": "Boşta kalınca gizle",
"transparent": "Boşken şeffaf",
@@ -563,7 +565,9 @@
"emoji-loading": "Emojiler yükleniyor...",
"emoji-loading-description": "Lütfen bekleyin",
"emoji-no-recent": "Henüz yeni emoji yok",
"emoji-search-description": "Emoji arama ve kopyalama"
"emoji-search-description": "Emoji arama ve kopyalama",
"settings-search-description": "Ayarları ara ve git",
"windows-search-description": "Açık pencereleri ara ve odakla"
}
},
"lock-screen": {
@@ -600,6 +604,7 @@
"density-default": "Varsayılan",
"density-mini": "Ufak",
"density-spacious": "Geniş",
"display-mode-always-visible": "Her Zaman Görünür",
"type-floating": "Yüzen",
"type-framed": "Çerçeveli",
"type-simple": "Basit"
@@ -721,6 +726,11 @@
"volumes-volume-overdrive-label": "Ses aşımına izin ver"
},
"bar": {
"appearance-auto-hide-delay-description": "Fare ayrıldıktan sonra Bar'ın gizlenmeden önceki süre.",
"appearance-auto-hide-delay-label": "Gizleme Gecikmesi",
"appearance-auto-hide-exclusive-note": "Not: Otomatik gizleme etkin olduğunda özel bölge otomatik olarak devre dışı bırakılır.",
"appearance-auto-show-delay-description": "Fare kenara girdiğinde çubuğun görünmesinden önceki süre.",
"appearance-auto-show-delay-label": "Gösterme Gecikmesi",
"appearance-background-opacity-description": "Çubuğun arka plan opaklığını özel olarak ayarlayın.",
"appearance-background-opacity-label": "Çubuk arka plan opaklığı",
"appearance-capsule-opacity-description": "Kapsül gösterildiğinde araç takımı arka planlarının saydamlık seviyesini ayarla.",
@@ -728,6 +738,8 @@
"appearance-density-description": "Sıkı veya geniş bir görünüm için araç çubuğu dolgusunu ayarlayın.",
"appearance-density-label": "Araç Çubuğu yoğunluğu",
"appearance-desc": "Araç çubuğunun görünümünü ve konumunu özelleştirin.",
"appearance-display-mode-description": "Çubuğun ne zaman görünür olacağını seçin",
"appearance-display-mode-label": "Görüntü Modu",
"appearance-floating-description": "Araç çubuğunu yüzen bir 'kapsül' olarak görüntüler. Not: Bu, ekran köşelerini kenarlara taşıyacaktır.",
"appearance-floating-label": "Yüzen araç çubuğu",
"appearance-frame-radius": "İç Yarıçap",
@@ -895,6 +907,16 @@
"media-player-show-buttons-label": "Düğmeleri göster",
"media-player-show-visualizer-description": "Ses görselleştirici katmanını göster.",
"media-player-visualizer-type-description": "Masaüstü medya oynatıcı arka planı için bir görselleştirme türü seçin.",
"system-stat-layout-bottom": "Alt",
"system-stat-layout-description": "Efsanenin grafiğe göre nasıl görüntüleneceğini seçin.",
"system-stat-layout-label": "Düzen",
"system-stat-layout-side": "Taraf",
"system-stat-rounded-corners-description": "Widget arka planı için yuvarlatılmış köşeler kullan.",
"system-stat-rounded-corners-label": "Yuvarlatılmış Köşeler",
"system-stat-show-background-description": "Sistem istatistik Widget'ı için arka plan kapsayıcısını göster.",
"system-stat-show-background-label": "Arka planı göster",
"system-stat-stat-type-description": "Hangi sistem istatistiğini görüntüleyeceğini seç.",
"system-stat-stat-type-label": "İstatistik Türü",
"title": "Masaüstü araçları",
"weather-enabled-description": "Masaüstünde bir hava durumu aracı göster.",
"weather-enabled-label": "Hava durumu araç kutusunu etkinleştir",
@@ -1067,6 +1089,8 @@
"settings-desc": "Başlatıcının davranışını ve görünümünü özelleştirin.",
"settings-enable-settings-search-description": "Başlatıcıda arama yaparken ayarlar sonuçlarını göster.",
"settings-enable-settings-search-label": "Ayarlar aramasını etkinleştir",
"settings-enable-windows-search-description": "Etkin pencereleri ara ve odakla.",
"settings-enable-windows-search-label": "Pencere aramasını etkinleştir",
"settings-grid-view-description": "Öğeleri liste yerine ızgara düzeninde görüntüle.",
"settings-icon-mode-description": "Tabler simgeleri yerine yerel sistem simgelerini kullanın.",
"settings-icon-mode-label": "Yerel simgeleri kullan",
+26 -2
View File
@@ -489,6 +489,7 @@
"week": "Тиждень",
"widgets": "Віджети",
"width": "Ширина",
"windows": "Вікна",
"yes": "Так"
},
"control-center": {
@@ -508,6 +509,7 @@
"on-hover": "При наведенні"
},
"hide-modes": {
"auto-hide": "Автоматичне приховування",
"hidden": "Приховувати, коли порожньо",
"idle": "Приховувати, коли неактивний",
"transparent": "Прозорий, коли порожній",
@@ -559,7 +561,9 @@
"emoji-loading": "Завантаження емодзі...",
"emoji-loading-description": "Зачекайте, будь ласка",
"emoji-no-recent": "Немає нещодавніх емодзі",
"emoji-search-description": "Пошук і копіювання емодзі"
"emoji-search-description": "Пошук і копіювання емодзі",
"settings-search-description": "Пошук та перехід до налаштувань",
"windows-search-description": "Пошук і фокусування відкритих вікон"
}
},
"lock-screen": {
@@ -596,6 +600,7 @@
"density-default": "Стандартний",
"density-mini": "Міні",
"density-spacious": "Просторий",
"display-mode-always-visible": "Завжди видимий",
"type-floating": "Плаваючий",
"type-framed": "У рамці",
"type-simple": "Простий"
@@ -717,6 +722,11 @@
"volumes-volume-overdrive-label": "Гучність понад 100%"
},
"bar": {
"appearance-auto-hide-delay-description": "Час, через який Bar сховається після того, як курсор миші залишить його.",
"appearance-auto-hide-delay-label": "Затримка приховування",
"appearance-auto-hide-exclusive-note": "Примітка: Ексклюзивна зона автоматично вимикається, коли автоприховування активне.",
"appearance-auto-show-delay-description": "Час до появи панелі, коли миша входить у край.",
"appearance-auto-show-delay-label": "Затримка відображення",
"appearance-background-opacity-description": "Встановити прозорість фону спеціально для панелі.",
"appearance-background-opacity-label": "Прозорість фону панелі",
"appearance-capsule-opacity-description": "Встановити рівень непрозорості для фону віджетів, коли показано капсулу.",
@@ -724,6 +734,8 @@
"appearance-density-description": "Налаштуйте відступи панелі для компактного або просторого вигляду.",
"appearance-density-label": "Щільність панелі",
"appearance-desc": "Налаштуйте зовнішній вигляд та положення панелі.",
"appearance-display-mode-description": "Виберіть, коли панель видима",
"appearance-display-mode-label": "Режим відображення",
"appearance-floating-description": "Відображати панель як плаваючу 'капсулу'. Примітка: Це перемістить кути екрана до країв.",
"appearance-floating-label": "Плаваюча панель (Острівець)",
"appearance-frame-radius": "Внутрішній радіус",
@@ -891,6 +903,16 @@
"media-player-show-buttons-label": "Показати кнопки",
"media-player-show-visualizer-description": "Показати накладання аудіовізуалізатора.",
"media-player-visualizer-type-description": "Оберіть тип візуалізації для фону медіаплеєра на робочому столі.",
"system-stat-layout-bottom": "Низ",
"system-stat-layout-description": "Виберіть, як відображається легенда відносно графіка.",
"system-stat-layout-label": "Макет",
"system-stat-layout-side": "Сторона",
"system-stat-rounded-corners-description": "Використовувати заокруглені кути для фону віджета.",
"system-stat-rounded-corners-label": "Закруглені Кути",
"system-stat-show-background-description": "Показати фоновий контейнер для віджета системної статистики.",
"system-stat-show-background-label": "Показати фон",
"system-stat-stat-type-description": "Виберіть, яку системну статистику відображати.",
"system-stat-stat-type-label": "Тип Статистики",
"title": "Настільні віджети",
"weather-enabled-description": "Показувати погодний віджет на робочому столі.",
"weather-enabled-label": "Увімкнути віджет погоди",
@@ -1041,7 +1063,7 @@
"clipboard-desc": "Отримуйте доступ до історії буфера обміну та керуйте нею з панелі запуску.",
"execute-desc": "Налаштуйте спосіб запуску програм.",
"execute-title": "Виконання",
"settings-annotation-tool-description": "Команда для запуску при натисканні кнопки анотування в історії буфера обміну, зображення буде передано в цю команду.",
"settings-annotation-tool-description": "Команда для запуску при натисканні кнопки анотування в історії буфера обміну. Зображення буде передано в цю команду.",
"settings-annotation-tool-label": "Інструмент анотацій",
"settings-annotation-tool-placeholder": "напр. 'gradia', 'satty -f -'",
"settings-auto-paste-description": "Автоматично вставити вибраний елемент з буфера обміну. Потребує wtype.",
@@ -1063,6 +1085,8 @@
"settings-desc": "Налаштуйте поведінку та зовнішній вигляд лаунчера.",
"settings-enable-settings-search-description": "Показувати результати налаштувань під час пошуку в Launcher.",
"settings-enable-settings-search-label": "Увімкнути пошук у налаштуваннях",
"settings-enable-windows-search-description": "Шукати та фокусувати активні вікна.",
"settings-enable-windows-search-label": "Увімкнути пошук вікон",
"settings-grid-view-description": "Показувати елементи у вигляді сітки замість списку.",
"settings-icon-mode-description": "Використовувати нативні системні іконки замість іконок Tabler.",
"settings-icon-mode-label": "Використовувати нативні іконки",
+30 -6
View File
@@ -48,19 +48,19 @@
"device-default": "默认(显示设备)",
"device-description": "选择要显示的电池设备。",
"device-label": "电池设备",
"hide-if-idle-description": "当电池充电或放电,隐藏小部件。",
"hide-if-idle-description": "当电池空闲时(没有充电或放电电流时),隐藏小部件。",
"hide-if-idle-label": "空闲时隐藏",
"hide-if-not-detected-description": "当系统未检测到电池时,隐藏该小部件。",
"hide-if-not-detected-label": "未检测到电池时隐藏",
"hide-if-not-detected-label": "未检测到电池时隐藏该小部件",
"low-battery-threshold-description": "当电量低于此百分比时显示警告。",
"low-battery-threshold-label": "低电量警告阈值",
"show-noctalia-performance-description": "在电池面板中显示 Noctalia 性能模式切换。<br>禁用 Noctalia 中的阴影和动画减少资源使用。",
"show-noctalia-performance-label": "显示 Noctalia 性能模式切换",
"show-noctalia-performance-description": "在电池面板中显示 Noctalia 性能模式开关。<br>该模式通过禁用 Noctalia 中的阴影和动画减少性能开销。",
"show-noctalia-performance-label": "显示 Noctalia 性能模式开关",
"show-power-profile-description": "在电池面板中显示电源配置文件选项。",
"show-power-profile-label": "显示电源配置文件控件"
},
"clock": {
"clock-display-description": "通过从下面的列表添加标记来自定义时钟显示。要使用 12 小时制,必须包含 'AP' 标记。",
"clock-display-description": "通过从下面的列表添加标记来自定义时钟样式。要使用 12 小时制,必须包含 'AP' 标记。",
"clock-display-label": "时钟显示",
"custom-font-description": "自定义时钟使用的字体。",
"custom-font-label": "自定义字体",
@@ -489,6 +489,7 @@
"week": "周",
"widgets": "小部件",
"width": "宽度",
"windows": "窗口",
"yes": "是"
},
"control-center": {
@@ -508,6 +509,7 @@
"on-hover": "悬停时"
},
"hide-modes": {
"auto-hide": "自动隐藏",
"hidden": "当为空时隐藏",
"idle": "空闲时隐藏",
"transparent": "空时透明",
@@ -559,7 +561,9 @@
"emoji-loading": "正在加载表情符号...",
"emoji-loading-description": "请稍候",
"emoji-no-recent": "尚无最近使用的表情符号",
"emoji-search-description": "搜索和复制表情符号"
"emoji-search-description": "搜索和复制表情符号",
"settings-search-description": "搜索并前往设置",
"windows-search-description": "搜索并聚焦打开的窗口"
}
},
"lock-screen": {
@@ -596,6 +600,7 @@
"density-default": "默认",
"density-mini": "迷你",
"density-spacious": "宽敞",
"display-mode-always-visible": "始终可见",
"type-floating": "悬浮",
"type-framed": "边框",
"type-simple": "简约"
@@ -717,6 +722,11 @@
"volumes-volume-overdrive-label": "允许音量过载"
},
"bar": {
"appearance-auto-hide-delay-description": "鼠标离开后Bar隐藏所需时间",
"appearance-auto-hide-delay-label": "隐藏延迟",
"appearance-auto-hide-exclusive-note": "注意: 当自动隐藏处于活动状态时,专属区域会自动禁用。",
"appearance-auto-show-delay-description": "鼠标进入边缘时,栏显示前的延迟时间。",
"appearance-auto-show-delay-label": "显示延迟",
"appearance-background-opacity-description": "为状态栏设置背景不透明度。",
"appearance-background-opacity-label": "状态栏背景不透明度",
"appearance-capsule-opacity-description": "设置显示胶囊时小部件背景的不透明度。",
@@ -724,6 +734,8 @@
"appearance-density-description": "调整状态栏的内边距以获得紧凑或宽松的外观。",
"appearance-density-label": "状态栏密度",
"appearance-desc": "自定义状态栏的外观和位置。",
"appearance-display-mode-description": "选择栏何时可见",
"appearance-display-mode-label": "显示模式",
"appearance-floating-description": "将状态栏显示为浮动的“药丸”形状。",
"appearance-floating-label": "浮动状态栏",
"appearance-frame-radius": "内圆角",
@@ -891,6 +903,16 @@
"media-player-show-buttons-label": "显示按钮",
"media-player-show-visualizer-description": "显示音频可视化叠加层。",
"media-player-visualizer-type-description": "选择桌面媒体播放器的背景可视化类型。",
"system-stat-layout-bottom": "底部",
"system-stat-layout-description": "选择图例相对于图表的显示方式。",
"system-stat-layout-label": "布局",
"system-stat-layout-side": "边",
"system-stat-rounded-corners-description": "小组件背景使用圆角。",
"system-stat-rounded-corners-label": "圆角",
"system-stat-show-background-description": "显示系统统计小部件的背景容器。",
"system-stat-show-background-label": "显示背景",
"system-stat-stat-type-description": "选择要显示的系统统计信息。",
"system-stat-stat-type-label": "统计类型",
"title": "桌面小部件",
"weather-enabled-description": "在桌面上显示天气小部件。",
"weather-enabled-label": "启用天气小部件",
@@ -1063,6 +1085,8 @@
"settings-desc": "自定义启动器的行为和外观。",
"settings-enable-settings-search-description": "在启动器中搜索时显示设置结果。",
"settings-enable-settings-search-label": "启用设置搜索",
"settings-enable-windows-search-description": "搜索并聚焦活动窗口。",
"settings-enable-windows-search-label": "启用窗口搜索",
"settings-grid-view-description": "以网格布局而非列表显示项目。",
"settings-icon-mode-description": "使用本地系统图标而不是 Tabler 图标。",
"settings-icon-mode-label": "使用本地图标",
+26 -2
View File
@@ -489,6 +489,7 @@
"week": "週",
"widgets": "小工具",
"width": "寬度",
"windows": "視窗",
"yes": "是"
},
"control-center": {
@@ -508,6 +509,7 @@
"on-hover": "游標移過時"
},
"hide-modes": {
"auto-hide": "自動隱藏",
"hidden": "空白時隱藏",
"idle": "閒置時隱藏",
"transparent": "空白時變透明",
@@ -559,7 +561,9 @@
"emoji-loading": "載入表情符號...",
"emoji-loading-description": "請稍候",
"emoji-no-recent": "還沒有最近使用的表情符號",
"emoji-search-description": "搜尋和複製表情符號"
"emoji-search-description": "搜尋和複製表情符號",
"settings-search-description": "搜尋並前往設定",
"windows-search-description": "搜尋並聚焦開啟的視窗"
}
},
"lock-screen": {
@@ -596,6 +600,7 @@
"density-default": "預設",
"density-mini": "迷你",
"density-spacious": "寬敞",
"display-mode-always-visible": "永遠可見",
"type-floating": "懸浮",
"type-framed": "邊框",
"type-simple": "簡約"
@@ -717,6 +722,11 @@
"volumes-volume-overdrive-label": "允許音量過載"
},
"bar": {
"appearance-auto-hide-delay-description": "滑鼠離開後Bar隱藏所需時間",
"appearance-auto-hide-delay-label": "隱藏延遲",
"appearance-auto-hide-exclusive-note": "注意: 當自動隱藏處於活動狀態時,專屬區域會自動禁用。",
"appearance-auto-show-delay-description": "滑鼠進入邊緣時,欄顯示前的延遲時間。",
"appearance-auto-show-delay-label": "顯示延遲",
"appearance-background-opacity-description": "設定工具列背景的不透明度",
"appearance-background-opacity-label": "工具列背景不透明度",
"appearance-capsule-opacity-description": "設定當啟用顯示小容器時小工具的背景不透明度",
@@ -724,6 +734,8 @@
"appearance-density-description": "調整工具列的內部間距來做出緊湊或寬敞的外觀",
"appearance-density-label": "工具列密度",
"appearance-desc": "自訂工具列的外觀及位置",
"appearance-display-mode-description": "選擇列何時可見",
"appearance-display-mode-label": "顯示模式",
"appearance-floating-description": "將工具列以懸浮的圓弧長條狀顯示",
"appearance-floating-label": "懸浮工具列",
"appearance-frame-radius": "內圓角",
@@ -891,6 +903,16 @@
"media-player-show-buttons-label": "顯示按鈕",
"media-player-show-visualizer-description": "顯示視覺效果",
"media-player-visualizer-type-description": "選擇視覺效果的樣式",
"system-stat-layout-bottom": "底部",
"system-stat-layout-description": "選擇圖例相對於圖表的顯示方式。",
"system-stat-layout-label": "佈局",
"system-stat-layout-side": "邊",
"system-stat-rounded-corners-description": "小工具背景使用圓角。",
"system-stat-rounded-corners-label": "圓角",
"system-stat-show-background-description": "顯示系統統計小工具的背景容器。",
"system-stat-show-background-label": "顯示背景",
"system-stat-stat-type-description": "選擇要顯示的系統統計資訊。",
"system-stat-stat-type-label": "統計類型",
"title": "桌面小工具",
"weather-enabled-description": "在桌面顯示一個天氣小工具",
"weather-enabled-label": "啟用天氣小工具",
@@ -1041,7 +1063,7 @@
"clipboard-desc": "在啟動器存取及整理你的剪貼簿歷史",
"execute-desc": "設定應用程式該如何啟動",
"execute-title": "執行",
"settings-annotation-tool-description": "點擊剪貼簿歷史記錄中的註記按鈕時要執行的命令圖片將會透過管線傳送至此命令。",
"settings-annotation-tool-description": "點擊剪貼簿歷史記錄中的註記按鈕時要執行的命令圖片將會透過管線傳送至此命令。",
"settings-annotation-tool-label": "註記工具",
"settings-annotation-tool-placeholder": "例如: gradia', 'satty -f -'",
"settings-auto-paste-description": "自動貼上選取的剪貼簿項目, 需要 wtype 套件",
@@ -1063,6 +1085,8 @@
"settings-desc": "自訂啟動器的外觀及行為",
"settings-enable-settings-search-description": "在啟動器中搜尋時顯示設定結果。",
"settings-enable-settings-search-label": "啟用設定搜尋",
"settings-enable-windows-search-description": "搜尋並聚焦作用中視窗。",
"settings-enable-windows-search-label": "啟用視窗搜尋",
"settings-grid-view-description": "將項目以方格排列而不是列表顯示",
"settings-icon-mode-description": "使用系統原生的圖示而不是自 Tabler 圖示包帶入",
"settings-icon-mode-label": "使用原生圖示",
+11 -8
View File
@@ -16,8 +16,10 @@
"frameThickness": 8,
"frameRadius": 12,
"outerCorners": true,
"exclusive": true,
"hideOnOverview": false,
"displayMode": "always_visible",
"autoHideDelay": 500,
"autoShowDelay": 150,
"widgets": {
"left": [
{
@@ -169,7 +171,8 @@
"wallhavenApiKey": "",
"wallhavenResolutionMode": "atleast",
"wallhavenResolutionWidth": "",
"wallhavenResolutionHeight": ""
"wallhavenResolutionHeight": "",
"sortOrder": "name"
},
"appLauncher": {
"enableClipboardHistory": false,
@@ -190,6 +193,7 @@
"iconMode": "tabler",
"showIconBackground": false,
"enableSettingsSearch": true,
"enableWindowsSearch": true,
"ignoreMouseInput": false,
"screenshotAnnotationTool": ""
},
@@ -268,13 +272,12 @@
"diskCriticalThreshold": 90,
"diskAvailWarningThreshold": 20,
"diskAvailCriticalThreshold": 10,
"cpuPollingInterval": 3000,
"tempPollingInterval": 3000,
"cpuPollingInterval": 1000,
"gpuPollingInterval": 3000,
"enableDgpuMonitoring": false,
"memPollingInterval": 3000,
"memPollingInterval": 1000,
"diskPollingInterval": 30000,
"networkPollingInterval": 3000,
"networkPollingInterval": 1000,
"loadAvgPollingInterval": 3000,
"useCustomColors": false,
"warningColor": "",
@@ -310,8 +313,8 @@
"countdownDuration": 10000,
"position": "center",
"showHeader": true,
"largeButtonsStyle": false,
"largeButtonsLayout": "grid",
"largeButtonsStyle": true,
"largeButtonsLayout": "single-row",
"showNumberLabels": true,
"powerOptions": [
{
+42 -6
View File
@@ -143,6 +143,24 @@
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-type-label",
"descriptionKey": "panels.bar.appearance-type-description",
"widget": "NComboBox",
"tab": 4,
"tabLabel": "panels.bar.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-display-mode-label",
"descriptionKey": "panels.bar.appearance-display-mode-description",
"widget": "NComboBox",
"tab": 4,
"tabLabel": "panels.bar.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-use-separate-opacity-label",
"descriptionKey": "panels.bar.appearance-use-separate-opacity-description",
@@ -189,9 +207,9 @@
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-type-label",
"descriptionKey": "panels.bar.appearance-type-description",
"widget": "NComboBox",
"labelKey": "panels.bar.appearance-hide-on-overview-label",
"descriptionKey": "panels.bar.appearance-hide-on-overview-description",
"widget": "NToggle",
"tab": 4,
"tabLabel": "panels.bar.title",
"subTab": 0,
@@ -261,9 +279,18 @@
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-hide-on-overview-label",
"descriptionKey": "panels.bar.appearance-hide-on-overview-description",
"widget": "NToggle",
"labelKey": "panels.bar.appearance-auto-hide-delay-label",
"descriptionKey": "panels.bar.appearance-auto-hide-delay-description",
"widget": "NValueSlider",
"tab": 4,
"tabLabel": "panels.bar.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-auto-show-delay-label",
"descriptionKey": "panels.bar.appearance-auto-show-delay-description",
"widget": "NValueSlider",
"tab": 4,
"tabLabel": "panels.bar.title",
"subTab": 0,
@@ -830,6 +857,15 @@
"subTab": 0,
"subTabLabel": "common.general"
},
{
"labelKey": "panels.launcher.settings-enable-windows-search-label",
"descriptionKey": "panels.launcher.settings-enable-windows-search-description",
"widget": "NToggle",
"tab": 8,
"tabLabel": "panels.launcher.title",
"subTab": 0,
"subTabLabel": "common.general"
},
{
"labelKey": "panels.launcher.settings-ignore-mouse-input-label",
"descriptionKey": "panels.launcher.settings-ignore-mouse-input-description",
+17 -3
View File
@@ -16,7 +16,7 @@
"Battery": {
"displayMode": "onhover",
"warningThreshold": 30,
"deviceNativePath": "",
"deviceNativePath": "__default__",
"showPowerProfiles": false,
"showNoctaliaPerformance": false,
"hideIfNotDetected": true,
@@ -115,7 +115,8 @@
"NotificationHistory": {
"showUnreadBadge": true,
"hideWhenZero": false,
"hideWhenZeroUnread": false
"hideWhenZeroUnread": false,
"unreadBadgeColor": "primary"
},
"SessionMenu": {
"colorName": "error"
@@ -128,6 +129,7 @@
"usePrimaryColor": false,
"useMonospaceFont": true,
"showCpuUsage": true,
"showCpuFreq": false,
"showCpuTemp": true,
"showGpuTemp": false,
"showLoadAverage": false,
@@ -179,7 +181,12 @@
"unfocusedIconsOpacity": 1,
"groupedBorderOpacity": 1,
"enableScrollWheel": true,
"iconScale": 0.8
"iconScale": 0.8,
"focusedColor": "primary",
"occupiedColor": "secondary",
"emptyColor": "secondary",
"showBadge": true,
"reverseScroll": false
},
"Volume": {
"displayMode": "onhover",
@@ -216,6 +223,13 @@
},
"Weather": {
"showBackground": true
},
"SystemStat": {
"showBackground": true,
"statType": "CPU",
"diskPath": "/",
"roundedCorners": true,
"layout": "bottom"
}
}
}
+28
View File
@@ -0,0 +1,28 @@
import QtQuick
import Quickshell
QtObject {
id: root
function migrate(adapter, logger, rawJson) {
logger.i("Migration47", "Removing network_stats.json cache and updating polling intervals");
// Remove the network_stats.json cache file (no longer used - autoscaling from history now)
const shellName = "noctalia";
const cacheDir = Quickshell.env("NOCTALIA_CACHE_DIR") || (Quickshell.env("XDG_CACHE_HOME") || Quickshell.env("HOME") + "/.cache") + "/" + shellName + "/";
const networkStatsFile = cacheDir + "network_stats.json";
Quickshell.execDetached(["rm", "-f", networkStatsFile]);
// Update polling intervals to 1000ms for smoother graphs (only if currently slower)
if (adapter.systemMonitor.cpuPollingInterval > 1000)
adapter.systemMonitor.cpuPollingInterval = 1000;
if (adapter.systemMonitor.memPollingInterval > 1000)
adapter.systemMonitor.memPollingInterval = 1000;
if (adapter.systemMonitor.networkPollingInterval > 1000)
adapter.systemMonitor.networkPollingInterval = 1000;
logger.d("Migration47", "Removed network_stats.json and adjusted polling intervals");
return true;
}
}
+3 -1
View File
@@ -20,7 +20,8 @@ QtObject {
43: migration43Component,
44: migration44Component,
45: migration45Component,
46: migration46Component
46: migration46Component,
47: migration47Component
})
// Migration components
@@ -38,4 +39,5 @@ QtObject {
property Component migration44Component: Migration44 {}
property Component migration45Component: Migration45 {}
property Component migration46Component: Migration46 {}
property Component migration47Component: Migration47 {}
}
+16 -12
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: 46
readonly property int settingsVersion: 47
readonly 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 + "/"
@@ -194,12 +194,14 @@ Singleton {
// Bar outer corners (inverted/concave corners at bar edges when not floating)
property bool outerCorners: true
// Reserves space with compositor
property bool exclusive: true
// Hide bar/panels when compositor overview is active
property bool hideOnOverview: false
// Auto-hide settings
property string displayMode: "always_visible" // "always_visible", "auto_hide"
property int autoHideDelay: 500 // ms before hiding after mouse leaves
property int autoShowDelay: 150 // ms before showing when mouse enters
// Widget configuration for modular bar system
property JsonObject widgets
widgets: JsonObject {
@@ -370,7 +372,9 @@ Singleton {
property string wallhavenApiKey: ""
property string wallhavenResolutionMode: "atleast" // "atleast" or "exact"
property string wallhavenResolutionWidth: ""
property string wallhavenResolutionHeight: ""
property string sortOrder: "name" // "name", "name_desc", "date", "date_desc"
}
// applauncher
@@ -395,6 +399,7 @@ Singleton {
property string iconMode: "tabler"
property bool showIconBackground: false
property bool enableSettingsSearch: true
property bool enableWindowsSearch: true
property bool ignoreMouseInput: false
property string screenshotAnnotationTool: ""
}
@@ -479,13 +484,12 @@ Singleton {
property int diskCriticalThreshold: 90
property int diskAvailWarningThreshold: 20
property int diskAvailCriticalThreshold: 10
property int cpuPollingInterval: 3000
property int tempPollingInterval: 3000
property int cpuPollingInterval: 1000
property int gpuPollingInterval: 3000
property bool enableDgpuMonitoring: false // Opt-in: reading dGPU sysfs/nvidia-smi wakes it from D3cold, draining battery
property int memPollingInterval: 3000
property int memPollingInterval: 1000
property int diskPollingInterval: 30000
property int networkPollingInterval: 3000
property int networkPollingInterval: 1000
property int loadAvgPollingInterval: 3000
property bool useCustomColors: false
property string warningColor: ""
@@ -528,8 +532,8 @@ Singleton {
property int countdownDuration: 10000
property string position: "center"
property bool showHeader: true
property bool largeButtonsStyle: false
property string largeButtonsLayout: "grid"
property bool largeButtonsStyle: true
property string largeButtonsLayout: "single-row"
property bool showNumberLabels: true
property list<var> powerOptions: [
{
@@ -1113,7 +1117,7 @@ Singleton {
// Delete deprecated user settings from the wiget
for (const k of Object.keys(widget)) {
if (k === "id" || k === "allowUserSettings") {
if (k === "id") {
continue;
}
if (!keys.includes(k)) {
@@ -1124,7 +1128,7 @@ Singleton {
// Inject missing default setting (metaData) from BarWidgetRegistry
for (var i = 0; i < keys.length; i++) {
const k = keys[i];
if (k === "id" || k === "allowUserSettings") {
if (k === "id") {
continue;
}
+15
View File
@@ -11,6 +11,12 @@ Singleton {
// Current date
property var now: new Date()
// Unix timestamp of the last update
property real _lastUpdateTs: Date.now()
// Signal emitted when a significant time jump is detected (e.g. system resume)
signal resumed
// Returns a Unix Timestamp (in seconds)
readonly property int timestamp: {
return Math.floor(root.now / 1000);
@@ -34,6 +40,15 @@ Singleton {
triggeredOnStart: false
onTriggered: {
var newTime = new Date();
var currentTs = newTime.getTime();
// Detect time jump (e.g. system resume) - threshold: 5 seconds
if (currentTs - root._lastUpdateTs > 5000) {
Logger.i("Time", "Time jump detected (" + Math.round((currentTs - root._lastUpdateTs) / 1000) + "s) - likely system resume");
root.resumed();
}
root._lastUpdateTs = currentTs;
root.now = newTime;
// Update timer if running
+111 -35
View File
@@ -74,9 +74,79 @@ Item {
readonly property real capsuleHeight: Style.getCapsuleHeightForDensity(barDensity, barHeight)
readonly property real barFontSize: Style.getBarFontSizeForDensity(barHeight, capsuleHeight, barIsVertical)
// Bar widgets (per-screen)
// Bar widgets (per-screen) - initial configuration
// Note: Updates are handled via Connections to BarService.widgetsRevisionChanged
readonly property var barWidgets: Settings.getBarWidgetsForScreen(screen?.name)
// Stable ListModels for each section - prevents Repeater recreation on settings changes
property ListModel leftWidgetsModel: ListModel {}
property ListModel centerWidgetsModel: ListModel {}
property ListModel rightWidgetsModel: ListModel {}
// Sync a ListModel with widget data, preserving delegates when only settings change
function syncWidgetModel(model, newWidgets) {
var validWidgets = filterValidWidgets(newWidgets);
// Build list of current IDs in model
var currentIds = [];
for (var i = 0; i < model.count; i++) {
currentIds.push(model.get(i).id);
}
// Build list of new IDs
var newIds = validWidgets.map(w => w.id);
// Check if structure changed (different IDs or order)
var structureChanged = currentIds.length !== newIds.length;
if (!structureChanged) {
for (var i = 0; i < currentIds.length; i++) {
if (currentIds[i] !== newIds[i]) {
structureChanged = true;
break;
}
}
}
Logger.d("Bar", "syncWidgetModel:", currentIds.join("|"), "→", newIds.join("|"), "changed:", structureChanged);
if (structureChanged) {
// Rebuild model - IDs changed
model.clear();
for (var i = 0; i < validWidgets.length; i++) {
model.append(validWidgets[i]);
}
}
// If structure didn't change, delegates are preserved and will read fresh settings
}
// Sync models when widget revision changes
// Note: We use Connections instead of onBarWidgetsChanged because getBarWidgetsForScreen
// returns the same object reference (Settings.data.bar.widgets) even when content changes,
// so QML won't detect the change via property binding.
Connections {
target: BarService
function onWidgetsRevisionChanged() {
Logger.d("Bar", "onWidgetsRevisionChanged, revision:", BarService.widgetsRevision, "screen:", root.screen?.name);
var widgets = Settings.getBarWidgetsForScreen(root.screen?.name);
if (widgets) {
root.syncWidgetModel(root.leftWidgetsModel, widgets.left);
root.syncWidgetModel(root.centerWidgetsModel, widgets.center);
root.syncWidgetModel(root.rightWidgetsModel, widgets.right);
}
}
}
// Initialize models
Component.onCompleted: {
Logger.d("Bar", "Bar Component.onCompleted for screen:", screen?.name);
var widgets = Settings.getBarWidgetsForScreen(screen?.name);
if (widgets) {
syncWidgetModel(leftWidgetsModel, widgets.left);
syncWidgetModel(centerWidgetsModel, widgets.center);
syncWidgetModel(rightWidgetsModel, widgets.right);
}
}
// Fill the parent (the Loader)
anchors.fill: parent
@@ -266,26 +336,29 @@ Item {
onClicked: root.triggerLastWidgetInSection("right")
}
// Calculate margin to center widgets vertically within the bar height
readonly property real verticalBarMargin: Math.round((root.barHeight - root.capsuleHeight) / 2)
// Top section (left widgets)
ColumnLayout {
x: Style.pixelAlignCenter(parent.width, width)
anchors.top: parent.top
anchors.topMargin: Style.marginS
anchors.topMargin: verticalBarMargin
spacing: Style.marginS
Repeater {
model: root.filterValidWidgets(root.barWidgets.left)
model: root.leftWidgetsModel
delegate: BarWidgetLoader {
required property var modelData
required property var model
required property int index
widgetId: modelData.id || ""
widgetId: model.id || ""
widgetScreen: root.screen
widgetProps: ({
"widgetId": modelData.id,
"widgetId": model.id,
"section": "left",
"sectionWidgetIndex": index,
"sectionWidgetsCount": root.barWidgets.left.length
"sectionWidgetsCount": root.leftWidgetsModel.count
})
Layout.alignment: Qt.AlignHCenter
}
@@ -299,18 +372,18 @@ Item {
spacing: Style.marginS
Repeater {
model: root.filterValidWidgets(root.barWidgets.center)
model: root.centerWidgetsModel
delegate: BarWidgetLoader {
required property var modelData
required property var model
required property int index
widgetId: modelData.id || ""
widgetId: model.id || ""
widgetScreen: root.screen
widgetProps: ({
"widgetId": modelData.id,
"widgetId": model.id,
"section": "center",
"sectionWidgetIndex": index,
"sectionWidgetsCount": root.barWidgets.center.length
"sectionWidgetsCount": root.centerWidgetsModel.count
})
Layout.alignment: Qt.AlignHCenter
}
@@ -321,22 +394,22 @@ Item {
ColumnLayout {
x: Style.pixelAlignCenter(parent.width, width)
anchors.bottom: parent.bottom
anchors.bottomMargin: Style.marginS
anchors.bottomMargin: verticalBarMargin
spacing: Style.marginS
Repeater {
model: root.filterValidWidgets(root.barWidgets.right)
model: root.rightWidgetsModel
delegate: BarWidgetLoader {
required property var modelData
required property var model
required property int index
widgetId: modelData.id || ""
widgetId: model.id || ""
widgetScreen: root.screen
widgetProps: ({
"widgetId": modelData.id,
"widgetId": model.id,
"section": "right",
"sectionWidgetIndex": index,
"sectionWidgetsCount": root.barWidgets.right.length
"sectionWidgetsCount": root.rightWidgetsModel.count
})
Layout.alignment: Qt.AlignHCenter
}
@@ -370,28 +443,31 @@ Item {
onClicked: root.triggerLastWidgetInSection("right")
}
// Calculate margin to center widgets horizontally within the bar height
readonly property real horizontalBarMargin: Math.round((root.barHeight - root.capsuleHeight) / 2)
// Left Section
RowLayout {
id: leftSection
objectName: "leftSection"
anchors.left: parent.left
anchors.leftMargin: Style.marginS
anchors.leftMargin: horizontalBarMargin
y: Style.pixelAlignCenter(parent.height, height)
spacing: Style.marginS
Repeater {
model: root.filterValidWidgets(root.barWidgets.left)
model: root.leftWidgetsModel
delegate: BarWidgetLoader {
required property var modelData
required property var model
required property int index
widgetId: modelData.id || ""
widgetId: model.id || ""
widgetScreen: root.screen
widgetProps: ({
"widgetId": modelData.id,
"widgetId": model.id,
"section": "left",
"sectionWidgetIndex": index,
"sectionWidgetsCount": root.barWidgets.left.length
"sectionWidgetsCount": root.leftWidgetsModel.count
})
Layout.alignment: Qt.AlignVCenter
}
@@ -407,18 +483,18 @@ Item {
spacing: Style.marginS
Repeater {
model: root.filterValidWidgets(root.barWidgets.center)
model: root.centerWidgetsModel
delegate: BarWidgetLoader {
required property var modelData
required property var model
required property int index
widgetId: modelData.id || ""
widgetId: model.id || ""
widgetScreen: root.screen
widgetProps: ({
"widgetId": modelData.id,
"widgetId": model.id,
"section": "center",
"sectionWidgetIndex": index,
"sectionWidgetsCount": root.barWidgets.center.length
"sectionWidgetsCount": root.centerWidgetsModel.count
})
Layout.alignment: Qt.AlignVCenter
}
@@ -430,23 +506,23 @@ Item {
id: rightSection
objectName: "rightSection"
anchors.right: parent.right
anchors.rightMargin: Style.marginS
anchors.rightMargin: horizontalBarMargin
y: Style.pixelAlignCenter(parent.height, height)
spacing: Style.marginS
Repeater {
model: root.filterValidWidgets(root.barWidgets.right)
model: root.rightWidgetsModel
delegate: BarWidgetLoader {
required property var modelData
required property var model
required property int index
widgetId: modelData.id || ""
widgetId: model.id || ""
widgetScreen: root.screen
widgetProps: ({
"widgetId": modelData.id,
"widgetId": model.id,
"section": "right",
"sectionWidgetIndex": index,
"sectionWidgetsCount": root.barWidgets.right.length
"sectionWidgetsCount": root.rightWidgetsModel.count
})
Layout.alignment: Qt.AlignVCenter
}
+2 -4
View File
@@ -12,8 +12,6 @@ import qs.Commons
PanelWindow {
id: root
property bool exclusive: Settings.data.bar.exclusive !== undefined ? Settings.data.bar.exclusive : false
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property bool barIsVertical: barPosition === "left" || barPosition === "right"
readonly property bool barFloating: Settings.data.bar.floating || false
@@ -29,7 +27,7 @@ PanelWindow {
// Wayland layer shell configuration
WlrLayershell.layer: WlrLayer.Top
WlrLayershell.namespace: "noctalia-bar-exclusion-" + (screen?.name || "unknown")
WlrLayershell.exclusionMode: exclusive ? ExclusionMode.Auto : ExclusionMode.Ignore
WlrLayershell.exclusionMode: ExclusionMode.Auto
// Anchor based on bar position
anchors {
@@ -67,7 +65,7 @@ PanelWindow {
Component.onCompleted: {
Logger.d("BarExclusionZone", "Created for screen:", screen?.name);
Logger.d("BarExclusionZone", " Position:", barPosition, "Exclusive:", exclusive, "Floating:", barFloating);
Logger.d("BarExclusionZone", " Position:", barPosition, "Floating:", barFloating);
Logger.d("BarExclusionZone", " Anchors - top:", anchors.top, "bottom:", anchors.bottom, "left:", anchors.left, "right:", anchors.right);
Logger.d("BarExclusionZone", " Size:", width, "x", height, "implicitWidth:", implicitWidth, "implicitHeight:", implicitHeight);
}
+11 -7
View File
@@ -86,10 +86,10 @@ PopupWindow {
if (menuRight > screenRight && menuLeft < screenRight) {
// Clipping on right edge - shift left
const overflow = menuRight - screenRight;
return baseX - overflow - Style.marginM;
return baseX - overflow - Style.marginS;
} else if (menuLeft < 0 && menuRight > 0) {
// Clipping on left edge - shift right
return baseX - menuLeft + Style.marginM;
return baseX - menuLeft + Style.marginS;
}
return baseX;
@@ -110,7 +110,11 @@ PopupWindow {
if (shouldApplyBottomBarLogic) {
// For bottom bar from the bar itself, position menu above the anchor with margin
baseY = -(implicitHeight + Style.marginL + 2);
baseY = -(implicitHeight + Style.marginS);
} else if (barPosition === "top" && !isSubMenu && anchorY >= 0) {
// For top bar: position menu below bar with margin
const barHeight = Style.getBarHeightForScreen(root.screen?.name);
baseY = barHeight + Style.marginS;
}
// Use a robust way to get screen coordinates
@@ -128,25 +132,25 @@ PopupWindow {
// Calculate the screen Y of the menu top
// Use a small guess for height if implicitHeight is 0 to avoid covering the bar on the first frame
const effectiveHeight = implicitHeight > 0 ? implicitHeight : 200;
const effectiveBaseY = shouldApplyBottomBarLogic ? -(effectiveHeight + Style.marginL + 2) : baseY;
const effectiveBaseY = shouldApplyBottomBarLogic ? -(effectiveHeight + Style.marginS) : baseY;
const menuScreenY = windowYOnScreen + posInWindow.y + effectiveBaseY;
const menuBottom = menuScreenY + (implicitHeight > 0 ? implicitHeight : effectiveHeight);
const screenHeight = screen ? screen.height : 1080;
// Adjust the final baseY (the actual value returned to anchor.rect.y)
let finalBaseY = shouldApplyBottomBarLogic ? -(implicitHeight + Style.marginL + 2) : baseY;
let finalBaseY = shouldApplyBottomBarLogic ? -(implicitHeight + Style.marginS) : baseY;
// Adjust if menu would clip off the bottom
if (menuBottom > screenHeight) {
const overflow = menuBottom - screenHeight;
finalBaseY -= (overflow + Style.marginM);
finalBaseY -= (overflow + Style.marginS);
}
// Adjust if menu would clip off the top
// menuScreenY < 0 means it's above the screen edge
if (menuScreenY < 0) {
finalBaseY -= (menuScreenY - Style.marginM);
finalBaseY -= (menuScreenY - Style.marginS);
}
return finalBaseY;
+3 -1
View File
@@ -112,7 +112,7 @@ Item {
Loader {
active: (labelMode !== "none") && (!showLabelsOnlyWhenOccupied || workspace.isOccupied || workspace.isFocused)
anchors.centerIn: parent
anchors.fill: parent
sourceComponent: Component {
NText {
text: {
@@ -137,6 +137,8 @@ Item {
applyUiScale: false
font.capitalization: Font.AllUppercase
font.weight: Style.fontWeightBold
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.Wrap
color: {
if (pillMouseArea.containsMouse)
+1 -1
View File
@@ -195,7 +195,7 @@ Item {
x: isVerticalBar ? Style.pixelAlignCenter(parent.width, width) : 0
y: isVerticalBar ? 0 : Style.pixelAlignCenter(parent.height, height)
width: isVerticalBar ? ((!hasFocusedWindow) && hideMode === "hidden" ? 0 : verticalSize) : ((!hasFocusedWindow) && (hideMode === "hidden") ? 0 : dynamicWidth)
height: isVerticalBar ? ((!hasFocusedWindow) && hideMode === "hidden" ? 0 : verticalSize) : barHeight
height: isVerticalBar ? ((!hasFocusedWindow) && hideMode === "hidden" ? 0 : verticalSize) : capsuleHeight
radius: Style.radiusM
color: Style.capsuleColor
border.color: Style.capsuleBorderColor
+64 -62
View File
@@ -40,10 +40,9 @@ Item {
readonly property real warningThreshold: widgetSettings.warningThreshold !== undefined ? widgetSettings.warningThreshold : widgetMetadata.warningThreshold
readonly property bool hideIfNotDetected: widgetSettings.hideIfNotDetected !== undefined ? widgetSettings.hideIfNotDetected : widgetMetadata.hideIfNotDetected
readonly property bool hideIfIdle: widgetSettings.hideIfIdle !== undefined ? widgetSettings.hideIfIdle : widgetMetadata.hideIfIdle
// Only show low battery warning if device is ready (prevents false positive during initialization)
readonly property bool isLowBattery: isReady && (!isCharging && !isPluggedIn) && percent <= warningThreshold
// Visibility: show if hideIfNotDetected is false, or if battery is ready (after initialization)
// Visibility: show if hideIfNotDetected is false, or if battery is ready
readonly property bool shouldShow: !hideIfNotDetected || (isReady && (hideIfIdle ? (!isCharging && !isPluggedIn) : true))
// Test mode
@@ -51,29 +50,33 @@ Item {
readonly property int testPercent: 35
readonly property bool testCharging: false
readonly property bool testPluggedIn: false
readonly property string deviceNativePath: widgetSettings.deviceNativePath || ""
readonly property var device: BatteryService.resolveDevice(deviceNativePath)
readonly property var battery: device && !BatteryService.isBluetoothDevice(device) ? device : null
readonly property var bluetoothDevice: device && BatteryService.isBluetoothDevice(device) ? device : null
readonly property bool hasBluetoothBattery: BatteryService.isBluetoothDevice(device)
readonly property string deviceNativePath: widgetSettings.deviceNativePath !== undefined ? widgetSettings.deviceNativePath : widgetMetadata.deviceNativePath
readonly property var selectedBattery: BatteryService.findUPowerDevice(deviceNativePath)
readonly property var selectedBluetoothDevice: BatteryService.findBluetoothDevice(deviceNativePath)
readonly property var selectedDevice: {
if (BatteryService.isDevicePresent(selectedBluetoothDevice)) {
return selectedBluetoothDevice;
}
if (BatteryService.isDevicePresent(selectedBattery)) {
return selectedBattery;
}
return null;
}
readonly property bool isReady: testMode ? true : (BatteryService.ready && BatteryService.isDeviceReady(device))
readonly property real percent: testMode ? testPercent : (isReady ? BatteryService.getPercentage(device) : 0)
readonly property bool isCharging: testMode ? testCharging : (isReady ? BatteryService.isCharging(device) : false)
readonly property bool isPluggedIn: testMode ? testPluggedIn : (isReady ? BatteryService.isPluggedIn(device) : false)
// Check if selected device is actually present/connected
readonly property bool isPresent: testMode ? true : BatteryService.isDevicePresent(selectedDevice)
readonly property bool isReady: testMode ? true : BatteryService.isDeviceReady(selectedDevice)
readonly property real percent: testMode ? testPercent : (isReady ? Math.round(BatteryService.getPercentage(selectedDevice)) : -1)
readonly property bool isCharging: testMode ? testCharging : (isReady ? BatteryService.isCharging(selectedDevice) : false)
readonly property bool isPluggedIn: testMode ? testPluggedIn : (isReady ? BatteryService.isPluggedIn(selectedDevice) : false)
property bool hasNotifiedLowBattery: false
visible: shouldShow
opacity: shouldShow ? 1.0 : 0.0
readonly property bool isDevicePresent: {
if (testMode)
return true;
return BatteryService.isDevicePresent(device);
}
implicitWidth: pill.width
implicitHeight: pill.height
@@ -82,39 +85,31 @@ Item {
hasNotifiedLowBattery = true;
ToastService.showWarning(I18n.tr("toast.battery.low"), I18n.tr("toast.battery.low-desc", {
"percent": Math.round(currentPercent)
}));
}), "battery-exclamation");
} else if (hasNotifiedLowBattery && (charging || pluggedIn || currentPercent > warningThreshold + 5)) {
hasNotifiedLowBattery = false;
}
}
function getCurrentPercent() {
return BatteryService.getPercentage(device);
}
Connections {
target: battery
target: selectedDevice?.type === UPowerDeviceType.Battery ? selectedDevice : null
function onPercentageChanged() {
if (battery) {
maybeNotify(getCurrentPercent(), isCharging, isPluggedIn, isReady);
}
maybeNotify(BatteryService.getPercentage(selectedDevice), isCharging, isPluggedIn, isReady);
}
function onStateChanged() {
if (battery) {
if (isCharging || isPluggedIn) {
hasNotifiedLowBattery = false;
}
maybeNotify(getCurrentPercent(), isCharging, isPluggedIn, isReady);
if (isCharging || isPluggedIn) {
hasNotifiedLowBattery = false;
}
maybeNotify(BatteryService.getPercentage(selectedDevice), isCharging, isPluggedIn, isReady);
}
}
Connections {
target: bluetoothDevice
target: selectedDevice?.batteryAvailable ? selectedDevice : null
function onBatteryChanged() {
if (BatteryService.isDeviceReady(bluetoothDevice)) {
maybeNotify(BatteryService.getPercentage(bluetoothDevice), BatteryService.isCharging(bluetoothDevice), BatteryService.isPluggedIn(bluetoothDevice), true);
}
maybeNotify(BatteryService.getPercentage(selectedDevice), isCharging, isPluggedIn, isReady);
}
}
@@ -141,7 +136,6 @@ Item {
BarPill {
id: pill
screen: root.screen
oppositeDirection: BarService.getPillDirection(root)
icon: testMode ? BatteryService.getIcon(testPercent, testCharging, testPluggedIn, true) : BatteryService.getIcon(percent, isCharging, isPluggedIn, isReady)
@@ -149,47 +143,55 @@ Item {
suffix: "%"
autoHide: false
forceOpen: isReady && displayMode === "alwaysShow"
forceClose: displayMode === "alwaysHide" || (BatteryService.ready && !isReady)
customBackgroundColor: !BatteryService.ready ? "transparent" : (isCharging ? Color.mPrimary : (isLowBattery ? Color.mError : "transparent"))
customTextIconColor: !BatteryService.ready ? "transparent" : (isCharging ? Color.mOnPrimary : (isLowBattery ? Color.mOnError : "transparent"))
forceClose: displayMode === "alwaysHide" || !isReady
customBackgroundColor: isCharging ? Color.mPrimary : (isLowBattery ? Color.mError : "transparent")
customTextIconColor: isCharging ? Color.mOnPrimary : (isLowBattery ? Color.mOnError : "transparent")
tooltipText: {
let lines = [];
if (testMode) {
lines.push(`Time left: ${Time.formatVagueHumanReadableDuration(12345)}.`);
lines.push("Time left: " + Time.formatVagueHumanReadableDuration(12345));
return lines.join("\n");
}
if (!isReady || !isDevicePresent) {
if (!isReady || !isPresent) {
return I18n.tr("battery.no-battery-detected");
}
if (battery) {
if (!isPluggedIn && battery.timeToEmpty > 0) {
lines.push(I18n.tr("battery.time-left", {
"time": Time.formatVagueHumanReadableDuration(battery.timeToEmpty)
}));
const isInternal = selectedDevice.type === UPowerDeviceType.Battery && BatteryService.isLaptopBattery;
if (isInternal) {
let timeText = BatteryService.getTimeRemainingText(selectedDevice);
if (timeText && timeText !== I18n.tr("common.idle") && timeText !== I18n.tr("battery.no-battery-detected") && timeText !== I18n.tr("battery.plugged-in")) {
lines.push(timeText);
}
if (!isPluggedIn && battery.timeToFull > 0) {
lines.push(I18n.tr("battery.time-until-full", {
"time": Time.formatVagueHumanReadableDuration(battery.timeToFull)
}));
let rateText = BatteryService.getRateText(selectedDevice);
if (rateText) {
lines.push(rateText);
}
if (battery.changeRate !== undefined) {
const rate = Math.abs(battery.changeRate);
if (isPluggedIn) {
lines.push(I18n.tr("battery.plugged-in"));
} else if (isCharging) {
lines.push(I18n.tr("battery.charging-rate", {
"rate": rate.toFixed(2)
}));
} else {
lines.push(I18n.tr("battery.discharging-rate", {
"rate": rate.toFixed(2)
}));
} else if (selectedDevice) {
// External / Peripheral Device (Phone, Keyboard, Mouse, Gamepad, Headphone etc.)
let name = BatteryService.getDeviceName(selectedDevice);
let pct = Math.round(percent);
lines.push(name + ": " + pct + suffix);
}
// If we are showing the main laptop battery, append external devices
if (isInternal) {
var external = BatteryService.externalBatteries;
if (external.length > 0) {
if (lines.length > 0)
lines.push(""); // Separator
for (var j = 0; j < external.length; j++) {
var dev = external[j];
var dName = BatteryService.getDeviceName(dev);
var dPct = Math.round(BatteryService.getPercentage(dev));
lines.push(dName + ": " + dPct + suffix);
}
}
}
return lines.join("\n");
}
onClicked: PanelService.getPanel("batteryPanel", screen)?.toggle(this)
onRightClicked: {
PanelService.showContextMenu(contextMenu, pill, screen);
+14 -6
View File
@@ -37,11 +37,19 @@ NIconButton {
readonly property bool hideWhenZeroUnread: (widgetSettings.hideWhenZeroUnread !== undefined) ? widgetSettings.hideWhenZeroUnread : widgetMetadata.hideWhenZeroUnread
readonly property string unreadBadgeColor: (widgetSettings.unreadBadgeColor !== undefined) ? widgetSettings.unreadBadgeColor : (widgetMetadata.unreadBadgeColor || "primary")
readonly property var colorMap: {
"primary": Color.mPrimary,
"secondary": Color.mSecondary,
"tertiary": Color.mTertiary,
"onSurface": Color.mOnSurface
function getColor(colorKey) {
switch (colorKey) {
case "primary":
return Color.mPrimary;
case "secondary":
return Color.mSecondary;
case "tertiary":
return Color.mTertiary;
case "onSurface":
return Color.mOnSurface;
default:
return Color.mPrimary;
}
}
function computeUnreadCount() {
@@ -130,7 +138,7 @@ NIconButton {
height: 7
width: height
radius: Style.radiusXS
color: root.colorMap[root.unreadBadgeColor] || Color.mError
color: root.hovering ? Color.mOnHover : (root.getColor(root.unreadBadgeColor) || Color.mError)
border.color: Color.mSurface
border.width: Style.borderS
visible: count > 0
+86 -14
View File
@@ -43,6 +43,7 @@ Item {
readonly property bool usePrimaryColor: widgetSettings.usePrimaryColor !== undefined ? widgetSettings.usePrimaryColor : widgetMetadata.usePrimaryColor
readonly property bool useMonospaceFont: widgetSettings.useMonospaceFont !== undefined ? widgetSettings.useMonospaceFont : widgetMetadata.useMonospaceFont
readonly property bool showCpuUsage: (widgetSettings.showCpuUsage !== undefined) ? widgetSettings.showCpuUsage : widgetMetadata.showCpuUsage
readonly property bool showCpuFreq: (widgetSettings.showCpuFreq !== undefined) ? widgetSettings.showCpuFreq : widgetMetadata.showCpuFreq
readonly property bool showCpuTemp: (widgetSettings.showCpuTemp !== undefined) ? widgetSettings.showCpuTemp : widgetMetadata.showCpuTemp
readonly property bool showGpuTemp: (widgetSettings.showGpuTemp !== undefined) ? widgetSettings.showGpuTemp : widgetMetadata.showGpuTemp
readonly property bool showMemoryUsage: (widgetSettings.showMemoryUsage !== undefined) ? widgetSettings.showMemoryUsage : widgetMetadata.showMemoryUsage
@@ -74,46 +75,49 @@ Item {
}
// Build comprehensive tooltip text with all stats
function buildTooltipText() {
let lines = [];
function buildTooltipContent() {
let rows = [];
// CPU
lines.push(`${I18n.tr("system-monitor.cpu-usage")}: ${Math.round(SystemStatService.cpuUsage)}%`);
rows.push([I18n.tr("system-monitor.cpu-usage"), `${Math.round(SystemStatService.cpuUsage)}% (${SystemStatService.cpuFreq})`]);
if (SystemStatService.cpuTemp > 0) {
lines.push(`${I18n.tr("system-monitor.cpu-temp")}: ${Math.round(SystemStatService.cpuTemp)}°C`);
rows.push([I18n.tr("system-monitor.cpu-temp"), `${Math.round(SystemStatService.cpuTemp)}°C`]);
}
// GPU (if available)
if (SystemStatService.gpuAvailable) {
lines.push(`${I18n.tr("system-monitor.gpu-temp")}: ${Math.round(SystemStatService.gpuTemp)}°C`);
rows.push([I18n.tr("system-monitor.gpu-temp"), `${Math.round(SystemStatService.gpuTemp)}°C`]);
}
// Load Average
if (SystemStatService.loadAvg1 >= 0) {
lines.push(`${I18n.tr("system-monitor.load-average")}: ${SystemStatService.loadAvg1.toFixed(2)} · ${SystemStatService.loadAvg5.toFixed(2)} · ${SystemStatService.loadAvg15.toFixed(2)}`);
rows.push([I18n.tr("system-monitor.load-average"), `${SystemStatService.loadAvg1.toFixed(2)} · ${SystemStatService.loadAvg5.toFixed(2)} · ${SystemStatService.loadAvg15.toFixed(2)}`]);
}
// Memory
lines.push(`${I18n.tr("common.memory")}: ${Math.round(SystemStatService.memPercent)}% (${SystemStatService.formatGigabytes(SystemStatService.memGb).replace(/[^0-9.]/g, "") + " GB"})`);
rows.push([I18n.tr("common.memory"), `${Math.round(SystemStatService.memPercent)}% (${SystemStatService.formatMemoryGb(SystemStatService.memGb).replace(/[^0-9.]/g, "") + " GB"})`]);
// Swap (if available)
if (SystemStatService.swapTotalGb > 0) {
lines.push(`${I18n.tr("bar.system-monitor.swap-usage-label")}: ${Math.round(SystemStatService.swapPercent)}% (${SystemStatService.formatGigabytes(SystemStatService.swapGb).replace(/[^0-9.]/g, "") + " GB"})`);
rows.push([I18n.tr("bar.system-monitor.swap-usage-label"), `${Math.round(SystemStatService.swapPercent)}% (${SystemStatService.formatMemoryGb(SystemStatService.swapGb).replace(/[^0-9.]/g, "") + " GB"})`]);
}
// Network
lines.push(`${I18n.tr("system-monitor.download-speed")}: ${SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s");
lines.push(`${I18n.tr("system-monitor.upload-speed")}: ${SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s");
rows.push([I18n.tr("system-monitor.download-speed"), `${SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s"]);
rows.push([I18n.tr("system-monitor.upload-speed"), `${SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s"]);
// Disk
const diskPercent = SystemStatService.diskPercents[diskPath];
if (diskPercent !== undefined) {
const usedGb = SystemStatService.diskUsedGb[diskPath] || 0;
const sizeGb = SystemStatService.diskSizeGb[diskPath] || 0;
lines.push(`${I18n.tr("system-monitor.disk")}: ${usedGb.toFixed(1)} GB / ${sizeGb.toFixed(1)} GB (${diskPercent}%)`);
const availGb = SystemStatService.diskAvailGb[diskPath] || 0;
rows.push([I18n.tr("system-monitor.disk"), `${diskPercent}% (${usedGb.toFixed(1)} / ${sizeGb.toFixed(1)} GB)`]);
rows.push([I18n.tr("common.available"), `${availGb.toFixed(1)} GB`]);
}
return lines.join("\n");
return rows;
}
readonly property color textColor: usePrimaryColor ? Color.mPrimary : Color.mOnSurface
@@ -282,6 +286,74 @@ Item {
}
}
// CPU Frequency Component
Item {
id: cpuFreqContainer
implicitWidth: cpuFreqContent.implicitWidth
implicitHeight: cpuFreqContent.implicitHeight
Layout.preferredWidth: isVertical ? root.width : implicitWidth
Layout.preferredHeight: compactMode ? implicitHeight : capsuleHeight
Layout.alignment: isVertical ? Qt.AlignHCenter : Qt.AlignVCenter
visible: showCpuFreq && (!isVertical || compactMode)
GridLayout {
id: cpuFreqContent
anchors.centerIn: parent
flow: (isVertical && !compactMode) ? GridLayout.TopToBottom : GridLayout.LeftToRight
rows: (isVertical && !compactMode) ? 2 : 1
columns: (isVertical && !compactMode) ? 1 : 2
rowSpacing: Style.marginXXS
columnSpacing: compactMode ? 3 : Style.marginXS
Item {
Layout.preferredWidth: iconSize
Layout.preferredHeight: (compactMode || isVertical) ? iconSize : capsuleHeight
Layout.alignment: Qt.AlignCenter
Layout.row: (isVertical && !compactMode) ? 1 : 0
Layout.column: 0
NIcon {
icon: "cpu-usage"
pointSize: iconSize
applyUiScale: false
x: Style.pixelAlignCenter(parent.width, width)
y: Style.pixelAlignCenter(parent.height, contentHeight)
color: Color.mOnSurface
}
}
// Text mode
NText {
visible: !compactMode
text: SystemStatService.cpuFreq.replace(" ", "")
family: fontFamily
pointSize: barFontSize
applyUiScale: false
Layout.alignment: Qt.AlignCenter
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: textColor
Layout.row: isVertical ? 0 : 0
Layout.column: isVertical ? 0 : 1
}
// Compact mode
Loader {
active: compactMode
visible: compactMode
sourceComponent: miniGaugeComponent
Layout.alignment: Qt.AlignCenter
Layout.row: 0
Layout.column: 1
onLoaded: {
item.ratio = Qt.binding(() => SystemStatService.cpuFreqRatio);
item.statColor = Qt.binding(() => Color.mPrimary);
}
}
}
}
// CPU Temperature Component
Item {
id: cpuTempContainer
@@ -845,7 +917,7 @@ Item {
}
}
onEntered: {
TooltipService.show(root, buildTooltipText(), BarService.getTooltipDirection(root.screen?.name));
TooltipService.show(root, buildTooltipContent(), BarService.getTooltipDirection(root.screen?.name));
tooltipRefreshTimer.start();
}
onExited: {
@@ -860,7 +932,7 @@ Item {
repeat: true
onTriggered: {
if (tooltipArea.containsMouse) {
TooltipService.updateText(buildTooltipText());
TooltipService.updateText(buildTooltipContent());
}
}
}
+6 -5
View File
@@ -395,9 +395,9 @@ Item {
Logger.d("Taskbar", "Executing terminal app manually: " + app.name);
const terminal = Settings.data.appLauncher.terminalCommand.split(" ");
const command = terminal.concat(app.command);
Quickshell.execDetached(command);
CompositorService.spawn(command);
} else if (app.command && app.command.length > 0) {
Quickshell.execDetached(app.command);
CompositorService.spawn(app.command);
} else if (app.execute) {
app.execute();
} else {
@@ -607,7 +607,7 @@ Item {
return Math.round(calculatedWidth);
}
readonly property real contentHeight: visible ? (isVerticalBar ? Math.round(taskbarLayout.implicitHeight + Style.marginS * 2) : barHeight) : 0
readonly property real contentHeight: visible ? (isVerticalBar ? Math.round(taskbarLayout.implicitHeight + Style.marginS * 2) : capsuleHeight) : 0
implicitWidth: contentWidth
implicitHeight: contentHeight
@@ -786,7 +786,7 @@ Item {
visible: shouldShowTitle
anchors.centerIn: parent
width: parent.width
height: root.barHeight
height: root.capsuleHeight
color: titleBgColor
radius: Style.radiusM
@@ -985,6 +985,7 @@ Item {
// Set the model directly
contextMenu.model = items;
PanelService.showContextMenu(contextMenu, item, screen);
// Anchor to root (stable) but center horizontally on the clicked item
PanelService.showContextMenu(contextMenu, root, screen, item);
}
}
+23 -20
View File
@@ -289,11 +289,13 @@ Item {
}
// Content dimensions for implicit sizing
readonly property real capsuleWidth: isVertical ? capsuleHeight : Math.round(trayFlow.implicitWidth)
readonly property real capsuleContentHeight: isVertical ? Math.round(trayFlow.implicitHeight) : capsuleHeight
readonly property int visibleItemCount: (root.drawerEnabled && dropdownItems.length > 0 ? 1 : 0) + filteredItems.length
readonly property real capsulePadding: 0
readonly property real capsuleWidth: isVertical ? capsuleHeight : Math.round(trayFlow.implicitWidth + capsulePadding * 2)
readonly property real capsuleContentHeight: isVertical ? Math.round(trayFlow.implicitHeight + capsulePadding * 2) : capsuleHeight
implicitWidth: isVertical ? barHeight : Math.round(trayFlow.implicitWidth)
implicitHeight: isVertical ? Math.round(trayFlow.implicitHeight) : barHeight
implicitWidth: isVertical ? barHeight : Math.round(trayFlow.implicitWidth + capsulePadding * 2)
implicitHeight: isVertical ? Math.round(trayFlow.implicitHeight + capsulePadding * 2) : barHeight
visible: filteredItems.length > 0 || dropdownItems.length > 0
opacity: (filteredItems.length > 0 || dropdownItems.length > 0) ? 1.0 : 0.0
@@ -312,12 +314,11 @@ Item {
Flow {
id: trayFlow
spacing: Style.marginXS
spacing: 0
flow: isVertical ? Flow.TopToBottom : Flow.LeftToRight
// Position at edge for full click area
x: isVertical ? 0 : 0
y: isVertical ? 0 : 0
// Position centered in capsule
anchors.centerIn: visualCapsule
// Drawer opener (before items if opposite direction)
NIconButton {
@@ -429,10 +430,23 @@ Item {
}
MouseArea {
id: itemMouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
onContainsMouseChanged: {
if (containsMouse) {
if (popupMenuWindow) {
popupMenuWindow.close();
}
root.hoveredItemIndex = trayDelegate.index;
TooltipService.show(tooltipAnchor, modelData.tooltipTitle || modelData.name || modelData.id || "Tray Item", BarService.getTooltipDirection(root.screen?.name));
} else if (root.hoveredItemIndex === trayDelegate.index) {
root.hoveredItemIndex = -1;
TooltipService.hide(tooltipAnchor);
}
}
onClicked: mouse => {
if (!modelData) {
return;
@@ -485,7 +499,7 @@ Item {
} else {
// For horizontal bars: center horizontally and position below visual area
menuX = (tooltipAnchor.width / 2) - (trayMenu.item.implicitWidth / 2);
menuY = tooltipAnchor.height + Style.marginL;
menuY = tooltipAnchor.height + Style.marginS;
}
PanelService.showTrayMenu(root.screen, modelData, trayMenu.item, tooltipAnchor, menuX, menuY, root.section, root.sectionWidgetIndex);
@@ -498,17 +512,6 @@ Item {
}
}
}
onEntered: {
if (popupMenuWindow) {
popupMenuWindow.close();
}
root.hoveredItemIndex = trayDelegate.index;
TooltipService.show(tooltipAnchor, modelData.tooltipTitle || modelData.name || modelData.id || "Tray Item", BarService.getTooltipDirection(root.screen?.name));
}
onExited: {
root.hoveredItemIndex = -1;
TooltipService.hide();
}
}
}
}
+4 -2
View File
@@ -297,7 +297,8 @@ Item {
const screenName = screen.name.toLowerCase();
for (var i = 0; i < CompositorService.workspaces.count; i++) {
const ws = CompositorService.workspaces.get(i);
const matchesScreen = (followFocusedScreen && ws.output.toLowerCase() == focusedOutput) || (!followFocusedScreen && ws.output.toLowerCase() == screenName);
// For global workspaces (e.g., LabWC), show all workspaces on all screens
const matchesScreen = CompositorService.globalWorkspaces || (followFocusedScreen && ws.output.toLowerCase() == focusedOutput) || (!followFocusedScreen && ws.output.toLowerCase() == screenName);
if (!matchesScreen)
continue;
@@ -913,6 +914,7 @@ Item {
}
function openGroupedContextMenu(item) {
PanelService.showContextMenu(contextMenu, item, screen);
// Anchor to root (stable) but center horizontally on the clicked item
PanelService.showContextMenu(contextMenu, root, screen, item);
}
}
+1
View File
@@ -294,6 +294,7 @@ NBox {
shadowOpacity: 0.9
shadowHorizontalOffset: 0
shadowVerticalOffset: 0
shadowColor: Settings.data.colorSchemes.darkMode ? "black" : "white"
}
ColumnLayout {
+1 -3
View File
@@ -83,9 +83,7 @@ Variants {
var metadata = DesktopWidgetRegistry.widgetMetadata[widgetId];
if (metadata) {
Object.keys(metadata).forEach(function (key) {
if (key !== "allowUserSettings") {
newWidget[key] = metadata[key];
}
newWidget[key] = metadata[key];
});
}
@@ -117,23 +117,7 @@ Item {
if (widgetIndex < 0 || !screen || !screen.name) {
return;
}
var monitorWidgets = Settings.data.desktopWidgets.monitorWidgets || [];
var newMonitorWidgets = monitorWidgets.slice();
for (var i = 0; i < newMonitorWidgets.length; i++) {
if (newMonitorWidgets[i].name === screen.name) {
var widgets = (newMonitorWidgets[i].widgets || []).slice();
if (widgetIndex < widgets.length) {
widgets[widgetIndex] = Object.assign({}, widgets[widgetIndex], properties);
newMonitorWidgets[i] = Object.assign({}, newMonitorWidgets[i], {
"widgets": widgets
});
Settings.data.desktopWidgets.monitorWidgets = newMonitorWidgets;
}
break;
}
}
DesktopWidgetRegistry.updateWidgetData(screen.name, widgetIndex, properties);
}
function removeWidget() {
@@ -208,79 +192,7 @@ Item {
}
function openWidgetSettings() {
if (!widgetData || !widgetData.id || !screen) {
return;
}
var widgetId = widgetData.id;
var hasSettings = false;
// Check if widget has settings
if (DesktopWidgetRegistry.isPluginWidget(widgetId)) {
var pluginId = widgetId.replace("plugin:", "");
var manifest = PluginRegistry.getPluginManifest(pluginId);
if (manifest && manifest.entryPoints && manifest.entryPoints.settings) {
hasSettings = true;
}
} else {
hasSettings = DesktopWidgetRegistry.widgetSettingsMap[widgetId] !== undefined;
}
if (!hasSettings) {
Logger.w("DraggableDesktopWidget", "Widget does not have settings:", widgetId);
return;
}
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (!popupMenuWindow) {
Logger.e("DraggableDesktopWidget", "No popup menu window found for screen");
return;
}
// Hide the dynamic context menu (popup window stays open for the dialog)
if (popupMenuWindow.hideDynamicMenu) {
popupMenuWindow.hideDynamicMenu();
}
var component = Qt.createComponent(Quickshell.shellDir + "/Modules/Panels/Settings/DesktopWidgets/DesktopWidgetSettingsDialog.qml");
function instantiateAndOpen() {
var dialog = component.createObject(popupMenuWindow.dialogParent, {
"widgetIndex": widgetIndex,
"widgetData": widgetData,
"widgetId": widgetId,
"sectionId": screen.name
});
if (dialog) {
dialog.updateWidgetSettings.connect((sec, idx, settings) => {
root.updateWidgetData(settings);
});
popupMenuWindow.hasDialog = true;
dialog.closed.connect(() => {
popupMenuWindow.hasDialog = false;
popupMenuWindow.close();
dialog.destroy();
});
dialog.open();
} else {
Logger.e("DraggableDesktopWidget", "Failed to create widget settings dialog");
}
}
if (component.status === Component.Ready) {
instantiateAndOpen();
} else if (component.status === Component.Error) {
Logger.e("DraggableDesktopWidget", "Error loading settings dialog component:", component.errorString());
} else {
component.statusChanged.connect(() => {
if (component.status === Component.Ready) {
instantiateAndOpen();
} else if (component.status === Component.Error) {
Logger.e("DraggableDesktopWidget", "Error loading settings dialog component:", component.errorString());
}
});
}
DesktopWidgetRegistry.openWidgetSettings(screen, widgetIndex, widgetData.id, widgetData);
}
function handleContextMenuAction(action) {
@@ -82,12 +82,10 @@ DraggableDesktopWidget {
z: 0
clip: true
active: shouldShowVisualizer
layer.enabled: root.roundedCorners
layer.enabled: true
layer.smooth: true
layer.effect: MultiEffect {
maskEnabled: true
maskThresholdMin: 0.95
maskSpreadAtMin: 0.15
maskEnabled: root.roundedCorners
maskSource: ShaderEffectSource {
sourceItem: Rectangle {
width: root.width - Math.round(Style.marginXS * widgetScale) * 2
@@ -117,7 +115,7 @@ DraggableDesktopWidget {
anchors.fill: parent
values: CavaService.values
fillColor: Color.mPrimary
opacity: 1.0
opacity: 0.5
}
}
@@ -127,7 +125,7 @@ DraggableDesktopWidget {
anchors.fill: parent
values: CavaService.values
fillColor: Color.mPrimary
opacity: 1.0
opacity: 0.5
}
}
@@ -137,7 +135,7 @@ DraggableDesktopWidget {
anchors.fill: parent
values: CavaService.values
fillColor: Color.mPrimary
opacity: 1.0
opacity: 0.5
}
}
}
@@ -0,0 +1,276 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import qs.Commons
import qs.Modules.DesktopWidgets
import qs.Services.System
import qs.Services.UI
import qs.Widgets
DraggableDesktopWidget {
id: root
// Widget settings
readonly property var widgetMetadata: DesktopWidgetRegistry.widgetMetadata["SystemStat"]
readonly property string statType: (widgetData && widgetData.statType !== undefined) ? widgetData.statType : (widgetMetadata.statType !== undefined ? widgetMetadata.statType : "CPU")
readonly property string diskPath: (widgetData && widgetData.diskPath !== undefined) ? widgetData.diskPath : "/"
readonly property color color: (widgetData && widgetData.color !== undefined) ? widgetData.color : Color.mPrimary
readonly property string layout: (widgetData && widgetData.layout !== undefined) ? widgetData.layout : (widgetMetadata.layout !== undefined ? widgetMetadata.layout : "side")
// Legend items model - each item has: text, color, icon (optional), bold (optional), opacity (optional), elide (optional)
readonly property var legendItems: {
switch (root.statType) {
case "CPU":
return [
{
icon: "cpu-usage",
text: Math.round(SystemStatService.cpuUsage) + "%",
color: root.color
},
{
text: "cpu-usage",
text: SystemStatService.cpuFreq,
color: root.color,
opacity: 0.8
},
{
icon: "cpu-temperature",
text: SystemStatService.cpuTemp + "°C",
color: Color.mError
}
];
case "GPU":
return [
{
icon: "gpu-temperature",
text: Math.round(SystemStatService.gpuTemp) + "°C",
color: root.color
}
];
case "Memory":
return [
{
icon: "memory",
text: Math.round(SystemStatService.memPercent) + "%",
color: root.color
}
];
case "Disk":
var items = [
{
icon: "storage",
text: Math.round(SystemStatService.diskPercents[root.diskPath] || 0) + "%",
color: root.color
}
];
if (root.diskPath !== "/") {
items.push({
text: root.diskPath,
color: root.color,
opacity: 0.8,
elide: true
});
}
return items;
case "Network":
return [
{
icon: "download-speed",
text: SystemStatService.formatSpeed(SystemStatService.rxSpeed),
color: root.color
},
{
icon: "upload-speed",
text: SystemStatService.formatSpeed(SystemStatService.txSpeed),
color: Color.mError
}
];
default:
return [];
}
}
// History from service
readonly property var history: {
switch (root.statType) {
case "CPU":
return SystemStatService.cpuHistory;
case "GPU":
return SystemStatService.gpuTempHistory;
case "Memory":
return SystemStatService.memHistory;
case "Disk":
return SystemStatService.diskHistories[root.diskPath] || [];
case "Network":
return SystemStatService.rxSpeedHistory;
default:
return [];
}
}
// Secondary history (CPU temp for CPU, Tx for Network)
readonly property var history2: {
switch (root.statType) {
case "CPU":
return SystemStatService.cpuTempHistory;
case "Network":
return SystemStatService.txSpeedHistory;
default:
return [];
}
}
// Graph min/max values
readonly property real graphMinValue: root.statType === "GPU" ? SystemStatService.gpuTempHistoryMin : 0
readonly property real graphMaxValue: {
switch (root.statType) {
case "CPU":
return Math.max(SystemStatService.cpuHistoryMax, 1);
case "GPU":
return Math.max(SystemStatService.gpuTempHistoryMax, 1);
case "Memory":
return Math.max(SystemStatService.memHistoryMax, 1);
case "Network":
return Math.max(SystemStatService.rxMaxSpeed, 1);
default:
return 100;
}
}
readonly property real graphMinValue2: {
switch (root.statType) {
case "CPU":
return SystemStatService.cpuTempHistoryMin;
default:
return graphMinValue;
}
}
readonly property real graphMaxValue2: {
switch (root.statType) {
case "CPU":
return Math.max(SystemStatService.cpuTempHistoryMax, 1);
case "Network":
return Math.max(SystemStatService.txMaxSpeed, 1);
default:
return graphMaxValue;
}
}
implicitWidth: Math.round(240 * widgetScale)
implicitHeight: Math.round(120 * widgetScale)
width: implicitWidth
height: implicitHeight
// Graph component (shared between layouts)
Component {
id: graphComponent
NGraph {
values: root.history
values2: root.history2
minValue: root.graphMinValue
maxValue: root.graphMaxValue
minValue2: root.graphMinValue2
maxValue2: root.graphMaxValue2
color: root.color
color2: Color.mError
fill: true
}
}
// Side layout: icon + legend on left, graph on right
RowLayout {
anchors.fill: parent
anchors.margins: Math.round(Style.marginL * widgetScale)
spacing: Math.round(Style.marginL * widgetScale)
visible: root.layout === "side"
ColumnLayout {
Layout.alignment: Qt.AlignVCenter
Layout.fillHeight: true
Layout.preferredWidth: Math.round(64 * widgetScale)
spacing: Style.marginXS * root.widgetScale
Repeater {
model: root.legendItems
delegate: RowLayout {
Layout.alignment: Qt.AlignHCenter
spacing: Math.round(Style.marginXXS * root.widgetScale)
NIcon {
visible: !!modelData.icon
icon: modelData.icon || ""
color: modelData.color
pointSize: Style.fontSizeS * root.widgetScale
opacity: modelData.opacity !== undefined ? modelData.opacity : 1.0
}
NText {
text: modelData.text
color: modelData.color
pointSize: Style.fontSizeS * root.widgetScale
font.family: Settings.data.ui.fontFixed
font.weight: modelData.bold ? Style.fontWeightBold : Style.fontWeightRegular
opacity: modelData.opacity !== undefined ? modelData.opacity : 1.0
elide: modelData.elide ? Text.ElideMiddle : Text.ElideNone
Layout.maximumWidth: modelData.elide ? Math.round(56 * root.widgetScale) : -1
horizontalAlignment: Text.AlignHCenter
}
}
}
}
Loader {
Layout.fillWidth: true
Layout.fillHeight: true
sourceComponent: graphComponent
}
}
// Bottom layout: full-width graph, horizontal legend at bottom
ColumnLayout {
anchors.fill: parent
anchors.margins: Math.round(Style.marginL * widgetScale)
spacing: Math.round(Style.marginS * widgetScale)
visible: root.layout === "bottom"
Loader {
Layout.fillWidth: true
Layout.fillHeight: true
sourceComponent: graphComponent
}
RowLayout {
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter
spacing: Math.round(Style.marginM * widgetScale)
Repeater {
model: root.legendItems
delegate: RowLayout {
Layout.alignment: Qt.AlignVCenter
spacing: Math.round(Style.marginXXS * root.widgetScale)
NIcon {
Layout.alignment: Qt.AlignVCenter
visible: !!modelData.icon
icon: modelData.icon || ""
color: modelData.color
pointSize: Style.fontSizeS * root.widgetScale
opacity: modelData.opacity !== undefined ? modelData.opacity : 1.0
}
NText {
Layout.alignment: Qt.AlignVCenter
text: modelData.text
color: modelData.color
pointSize: Style.fontSizeS * root.widgetScale
font.family: Settings.data.ui.fontFixed
font.weight: modelData.bold ? Style.fontWeightBold : Style.fontWeightRegular
opacity: modelData.opacity !== undefined ? modelData.opacity : 1.0
elide: modelData.elide ? Text.ElideMiddle : Text.ElideNone
Layout.maximumWidth: modelData.elide ? Math.round(56 * root.widgetScale) : -1
}
}
}
}
}
}
+74 -20
View File
@@ -6,6 +6,7 @@ import Quickshell
import Quickshell.Wayland
import Quickshell.Widgets
import qs.Commons
import qs.Services.Compositor
import qs.Services.System
import qs.Services.UI
import qs.Widgets
@@ -77,6 +78,8 @@ Loader {
readonly property int peekHeight: 1
readonly property int iconSize: Math.round(12 + 24 * (Settings.data.dock.size ?? 1))
readonly property int floatingMargin: Settings.data.dock.floatingRatio * Style.marginL
readonly property int maxWidth: modelData ? modelData.width * 0.8 : 1000
readonly property int maxHeight: modelData ? modelData.height * 0.8 : 1000
// Dock position properties
readonly property string dockPosition: Settings.data.dock.position
@@ -531,8 +534,8 @@ Loader {
WlrLayershell.namespace: "noctalia-dock-" + (screen?.name || "unknown")
WlrLayershell.exclusionMode: exclusive ? ExclusionMode.Auto : ExclusionMode.Ignore
implicitWidth: Math.round(dockContainerWrapper.width + (root.isVertical ? 0 : Style.marginXL * 6))
implicitHeight: Math.round(dockContainerWrapper.height)
implicitWidth: dockContainerWrapper.width
implicitHeight: dockContainerWrapper.height
// Position based on dock setting
anchors.top: dockPosition === "top"
@@ -595,8 +598,8 @@ Loader {
Rectangle {
id: dockContainer
// For vertical dock, swap width and height logic
width: isVertical ? Math.round(iconSize * 1.5) : dockLayout.implicitWidth + Style.marginXL
height: isVertical ? dockLayout.implicitHeight + Style.marginXL : Math.round(iconSize * 1.5)
width: isVertical ? Math.round(iconSize * 1.5) : Math.min(dockLayout.implicitWidth + Style.marginXL, root.maxWidth)
height: isVertical ? Math.min(dockLayout.implicitHeight + Style.marginXL, root.maxHeight) : Math.round(iconSize * 1.5)
color: Qt.alpha(Color.mSurface, Settings.data.dock.backgroundOpacity)
// Anchor based on padding to achieve centering shift
@@ -643,12 +646,48 @@ Loader {
}
}
Item {
Flickable {
id: dock
// Swap dimensions based on orientation
width: isVertical ? parent.width - (Style.marginXL) : dockLayout.implicitWidth
height: isVertical ? dockLayout.implicitHeight : parent.height - (Style.marginXL)
// Use parent dimensions more directly to avoid clipping
width: isVertical ? parent.width : Math.min(dockLayout.implicitWidth, parent.width - Style.marginXL)
height: !isVertical ? parent.height : Math.min(dockLayout.implicitHeight, parent.height - Style.marginXL)
contentWidth: dockLayout.implicitWidth
contentHeight: dockLayout.implicitHeight
anchors.centerIn: parent
clip: true
flickableDirection: isVertical ? Flickable.VerticalFlick : Flickable.HorizontalFlick
// Keep interactive dependent on overflow
interactive: isVertical ? contentHeight > height : contentWidth > width
// Centering margins
contentX: isVertical && contentWidth < width ? (contentWidth - width) / 2 : 0
contentY: !isVertical && contentHeight < height ? (contentHeight - height) / 2 : 0
WheelHandler {
acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
onWheel: event => {
var delta = (event.angleDelta.y !== 0) ? event.angleDelta.y : event.angleDelta.x;
if (root.isVertical) {
dock.contentY = Math.max(-dock.topMargin, Math.min(dock.contentHeight - dock.height + dock.bottomMargin, dock.contentY - delta));
} else {
// For horizontal dock, we want to scroll contentX with BOTH x and y wheels
var hDelta = (event.angleDelta.x !== 0) ? event.angleDelta.x : event.angleDelta.y;
dock.contentX = Math.max(-dock.leftMargin, Math.min(dock.contentWidth - dock.width + dock.rightMargin, dock.contentX - hDelta));
}
event.accepted = true;
}
}
ScrollBar.horizontal: ScrollBar {
visible: !isVertical && dock.interactive
policy: ScrollBar.AsNeeded
}
ScrollBar.vertical: ScrollBar {
visible: isVertical && dock.interactive
policy: ScrollBar.AsNeeded
}
function getAppIcon(appData): string {
if (!appData || !appData.appId)
@@ -663,15 +702,19 @@ Loader {
rows: isVertical ? -1 : 1
rowSpacing: Style.marginS
columnSpacing: Style.marginS
anchors.centerIn: parent
// Ensure the layout takes its full implicit size
width: implicitWidth
height: implicitHeight
Repeater {
model: dockApps
delegate: Item {
id: appButton
Layout.preferredWidth: iconSize
Layout.preferredHeight: iconSize
readonly property real indicatorMargin: Math.max(3, Math.round(iconSize * 0.18))
Layout.preferredWidth: isVertical ? iconSize + indicatorMargin * 2 : iconSize
Layout.preferredHeight: isVertical ? iconSize : iconSize + indicatorMargin * 2
Layout.alignment: Qt.AlignCenter
property bool isActive: modelData.toplevel && ToplevelManager.activeToplevel && ToplevelManager.activeToplevel === modelData.toplevel
@@ -909,7 +952,6 @@ Loader {
// Only allow left-click dragging via axis control
drag.target: iconContainer
drag.axis: (pressedButtons & Qt.LeftButton) ? (root.isVertical ? Drag.YAxis : Drag.XAxis) : Drag.None
preventStealing: true
onPressed: {
var p1 = appButton.mapFromItem(dockContainer, 0, 0);
@@ -1012,13 +1054,12 @@ Loader {
} else {
// Fallback logic when app2unit is not used
if (app.runInTerminal) {
// If app.execute() fails for terminal apps, we handle it manually.
Logger.d("Dock", "Executing terminal app manually: " + app.name);
const terminal = Settings.data.appLauncher.terminalCommand.split(" ");
const command = terminal.concat(app.command);
Quickshell.execDetached(command);
CompositorService.spawn(command);
} else if (app.command && app.command.length > 0) {
Quickshell.execDetached(app.command);
CompositorService.spawn(app.command);
} else if (app.execute) {
app.execute();
} else {
@@ -1030,15 +1071,28 @@ Loader {
}
}
// Active indicator - always below the icon
// Active indicator - positioned at the edge of the delegate area
Rectangle {
visible: Settings.data.dock.inactiveIndicators ? isRunning : isActive
width: iconSize * 0.2
height: iconSize * 0.1
width: isVertical ? indicatorMargin * 0.6 : iconSize * 0.2
height: isVertical ? iconSize * 0.2 : indicatorMargin * 0.6
color: Color.mPrimary
radius: Style.radiusXS
anchors.top: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
// Anchor to the edge facing the screen center
anchors.bottom: !isVertical && dockPosition === "bottom" ? parent.bottom : undefined
anchors.top: !isVertical && dockPosition === "top" ? parent.top : undefined
anchors.left: isVertical && dockPosition === "left" ? parent.left : undefined
anchors.right: isVertical && dockPosition === "right" ? parent.right : undefined
anchors.horizontalCenter: isVertical ? undefined : parent.horizontalCenter
anchors.verticalCenter: isVertical ? parent.verticalCenter : undefined
// Offset slightly from the edge
anchors.bottomMargin: !isVertical && dockPosition === "bottom" ? 2 : 0
anchors.topMargin: !isVertical && dockPosition === "top" ? 2 : 0
anchors.leftMargin: isVertical && dockPosition === "left" ? 2 : 0
anchors.rightMargin: isVertical && dockPosition === "right" ? 2 : 0
}
}
}
+2 -2
View File
@@ -78,11 +78,11 @@ Loader {
Item {
id: batteryIndicator
property bool isReady: BatteryService.ready && BatteryService.batteryReady
property bool isReady: BatteryService.batteryReady
property real percent: BatteryService.batteryPercentage
property bool charging: BatteryService.batteryCharging
property bool pluggedIn: BatteryService.batteryPluggedIn
property bool batteryVisible: isReady && percent >= 0 && BatteryService.hasAnyBattery()
property bool batteryVisible: isReady && BatteryService.hasAnyBattery()
}
Item {
+3
View File
@@ -102,9 +102,12 @@ Rectangle {
"fr": "dddd d MMMM",
"hu": "dddd, MMMM d.",
"ja": "yyyy年M月d日 dddd",
"ko": "yyyy년 M월 d일 dddd",
"ku": "dddd, dê MMMM",
"nl": "dddd d MMMM",
"nn": "dddd d. MMMM",
"pt": "dddd, d 'de' MMMM",
"sv": "dddd d MMMM",
"zh": "yyyy年M月d日 dddd"
};
var dateString = I18n.locale.toString(Time.now, formats[lang] || "dddd, d MMMM");
+33 -1
View File
@@ -75,6 +75,32 @@ Variants {
}
}
// BarTriggerZone - thin invisible zone to reveal hidden bar
// Always loaded when auto-hide is enabled (it's just 1px, no performance impact)
Loader {
active: {
if (!parent.windowLoaded || !parent.shouldBeActive)
return false;
if (!BarService.effectivelyVisible)
return false;
if (Settings.data.bar.displayMode !== "auto_hide")
return false;
// Check if bar is configured for this screen
var monitors = Settings.data.bar.monitors || [];
return monitors.length === 0 || monitors.includes(modelData?.name);
}
asynchronous: false
sourceComponent: BarTriggerZone {
screen: modelData
}
onLoaded: {
Logger.d("AllScreens", "BarTriggerZone created for", modelData?.name);
}
}
// BarExclusionZone - created after MainScreen has fully loaded
// Disabled when bar is hidden or not configured for this screen
Repeater {
@@ -102,9 +128,15 @@ Variants {
}
// PopupMenuWindow - reusable popup window for both tray menus and context menus
// Disabled when bar is hidden or not configured for this screen
// Active when bar is visible on this screen, OR when desktop widgets edit mode is active
Loader {
active: {
// Desktop widgets edit mode needs popup window on ALL screens
if (DesktopWidgetRegistry.editMode && Settings.data.desktopWidgets.enabled) {
return true;
}
// Normal bar-based condition
if (!parent.windowLoaded || !parent.shouldBeActive || !BarService.effectivelyVisible)
return false;
@@ -103,9 +103,20 @@ ShapePath {
readonly property real blMultY: bar ? ShapeCornerHelper.getMultY(bar.bottomLeftCornerState) : 1
readonly property real blRadius: bar ? getCornerRadius(bar.bottomLeftCornerState) : 0
// Auto-hide opacity factor for background fade
property real opacityFactor: (bar && bar.isHidden) ? 0 : 1
Behavior on opacityFactor {
enabled: bar && bar.autoHide
NumberAnimation {
duration: Style.animationFast
easing.type: Easing.OutQuad
}
}
// ShapePath configuration
strokeWidth: -1 // No stroke, fill only
fillColor: backgroundColor
fillColor: Qt.rgba(backgroundColor.r, backgroundColor.g, backgroundColor.b, backgroundColor.a * opacityFactor)
fillRule: isFramed ? ShapePath.OddEvenFill : ShapePath.WindingFill
// Starting position
+177 -3
View File
@@ -20,6 +20,9 @@ PanelWindow {
// Note: screen property is inherited from PanelWindow and should be set by parent
color: "transparent" // Transparent - background is in MainScreen below
// Make window pass-through when content is unloaded
visible: contentLoaded
Component.onCompleted: {
Logger.d("BarContentWindow", "Bar content window created for screen:", barWindow.screen?.name);
}
@@ -39,6 +42,100 @@ PanelWindow {
readonly property real barMarginV: Math.ceil(barFloating ? Settings.data.bar.marginVertical : 0)
readonly property real barHeight: Style.getBarHeightForScreen(barWindow.screen?.name)
// Auto-hide properties
readonly property bool autoHide: Settings.data.bar.displayMode === "auto_hide"
readonly property int hideDelay: Settings.data.bar.autoHideDelay || 500
readonly property int showDelay: Settings.data.bar.autoShowDelay || 100
property bool isHidden: false
// Hover tracking
property bool barHovered: false
// Check if any panel is open on this screen
readonly property bool panelOpen: PanelService.openedPanel !== null
// Timer for delayed hide
Timer {
id: hideTimer
interval: barWindow.hideDelay
onTriggered: {
if (barWindow.autoHide && !barWindow.barHovered && !barWindow.panelOpen && !BarService.popupOpen) {
BarService.setScreenHidden(barWindow.screen?.name, true);
}
}
}
// Timer for delayed show
Timer {
id: showTimer
interval: barWindow.showDelay
onTriggered: {
// Only show if still hovered (via trigger zone or bar itself)
if (barWindow.autoHide && BarService.isBarHovered(barWindow.screen?.name)) {
BarService.setScreenHidden(barWindow.screen?.name, false);
}
}
}
// React to auto-hide state changes from BarService
Connections {
target: BarService
function onBarAutoHideStateChanged(screenName, hidden) {
Logger.d("BarContentWindow", "onBarAutoHideStateChanged:", screenName, hidden, "my screen:", barWindow.screen?.name);
if (screenName === barWindow.screen?.name) {
barWindow.isHidden = hidden;
}
}
function onBarHoverStateChanged(screenName, hovered) {
if (screenName === barWindow.screen?.name && barWindow.autoHide) {
if (hovered) {
hideTimer.stop();
// If bar is already visible, no need to delay
if (!barWindow.isHidden) {
showTimer.stop();
} else {
// Bar is hidden, use show delay
showTimer.restart();
}
} else if (!barWindow.barHovered && !barWindow.panelOpen) {
showTimer.stop();
hideTimer.restart();
}
}
}
}
// Don't hide when panel is open
onPanelOpenChanged: {
if (panelOpen && autoHide) {
hideTimer.stop();
BarService.setScreenHidden(barWindow.screen?.name, false);
} else if (!panelOpen && autoHide && !barHovered) {
hideTimer.restart();
}
}
// React to popup menu closing
Connections {
target: BarService
function onPopupOpenChanged() {
if (!BarService.popupOpen && barWindow.autoHide && !barWindow.barHovered && !barWindow.panelOpen) {
hideTimer.restart();
}
}
}
// React to displayMode changes
onAutoHideChanged: {
if (!autoHide) {
// Show bar when auto-hide is disabled
hideTimer.stop();
showTimer.stop();
barWindow.isHidden = false;
}
// When auto-hide is enabled, don't immediately hide - wait for mouse to leave
}
// Anchor to the bar's edge
anchors {
top: barPosition === "top" || barIsVertical
@@ -47,6 +144,35 @@ PanelWindow {
right: barPosition === "right" || !barIsVertical
}
// Track if content should be loaded (stays true during fade-out animation)
property bool contentLoaded: !isHidden
// Timer to delay unload until after fade animation
Timer {
id: unloadTimer
interval: Style.animationFast + 50
onTriggered: {
// Only unload if still hidden AND not about to show (prevents unload/reload race)
if (barWindow.isHidden && !showTimer.running) {
// Clear hover state before unloading to prevent issues during destruction
barWindow.barHovered = false;
barWindow.contentLoaded = false;
}
}
}
// When hidden changes, handle load/unload
onIsHiddenChanged: {
if (isHidden) {
// Start fade out, then unload after animation
unloadTimer.restart();
} else {
// Load immediately when showing
unloadTimer.stop();
contentLoaded = true;
}
}
// Handle floating margins and framed mode offsets
margins {
top: (barPosition === "top") ? barMarginV : (isFramed ? frameThickness : barMarginV)
@@ -59,9 +185,57 @@ PanelWindow {
implicitWidth: barIsVertical ? barHeight : barWindow.screen.width
implicitHeight: barIsVertical ? barWindow.screen.height : barHeight
// Bar content - just the widgets, no background
Bar {
// Bar content loader - unloads when hidden to prevent input
Loader {
id: barLoader
anchors.fill: parent
screen: barWindow.screen
active: barWindow.contentLoaded
sourceComponent: Item {
anchors.fill: parent
// Fade animation
opacity: barWindow.isHidden ? 0 : 1
Behavior on opacity {
enabled: barWindow.autoHide
NumberAnimation {
duration: Style.animationFast
easing.type: Easing.OutQuad
}
}
Bar {
id: barContent
anchors.fill: parent
screen: barWindow.screen
// Hover detection using HoverHandler (doesn't block child hover events)
HoverHandler {
id: hoverHandler
onHoveredChanged: {
if (hovered) {
barWindow.barHovered = true;
BarService.setScreenHovered(barWindow.screen?.name, true);
if (barWindow.autoHide) {
hideTimer.stop();
showTimer.restart();
}
} else {
// Skip if already hidden (being destroyed)
if (barWindow.isHidden)
return;
barWindow.barHovered = false;
BarService.setScreenHovered(barWindow.screen?.name, false);
if (barWindow.autoHide && !barWindow.panelOpen) {
showTimer.stop();
hideTimer.restart();
}
}
}
}
}
}
}
}
+3 -2
View File
@@ -17,7 +17,7 @@ PanelWindow {
property string edge: Settings.getBarPositionForScreen(screen?.name)
property real thickness: (edge === Settings.getBarPositionForScreen(screen?.name)) ? Style.getBarHeightForScreen(screen?.name) : (Settings.data.bar.frameThickness ?? 12)
readonly property bool exclusive: Settings.data.bar.exclusive
readonly property bool autoHide: Settings.data.bar.displayMode === "auto_hide"
readonly property bool barFloating: Settings.data.bar.floating || false
readonly property real barMarginH: (barFloating && edge === Settings.getBarPositionForScreen(screen?.name)) ? Math.ceil(Settings.data.bar.marginHorizontal) : 0
readonly property real barMarginV: (barFloating && edge === Settings.getBarPositionForScreen(screen?.name)) ? Math.ceil(Settings.data.bar.marginVertical) : 0
@@ -31,7 +31,8 @@ PanelWindow {
// Wayland layer shell configuration
WlrLayershell.layer: WlrLayer.Top
WlrLayershell.namespace: "noctalia-bar-exclusion-" + edge + "-" + (screen?.name || "unknown")
WlrLayershell.exclusionMode: exclusive ? ExclusionMode.Auto : ExclusionMode.Ignore
// When auto-hide is enabled, never reserve space
WlrLayershell.exclusionMode: autoHide ? ExclusionMode.Ignore : ExclusionMode.Auto
// Anchor based on specified edge
anchors {
+66
View File
@@ -0,0 +1,66 @@
import QtQuick
import Quickshell
import Quickshell.Wayland
import qs.Commons
import qs.Services.UI
/**
* BarTriggerZone - Thin invisible window at screen edge to reveal hidden bar
*
* This window is only active when the bar is in auto-hide mode and hidden.
* When the mouse enters this zone, it triggers the bar to show.
*/
PanelWindow {
id: root
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property bool barIsVertical: barPosition === "left" || barPosition === "right"
readonly property int triggerSize: 1
// Track if component is being destroyed to prevent signals during cleanup
property bool isBeingDestroyed: false
Component.onDestruction: isBeingDestroyed = true
// Invisible trigger zone
color: "transparent"
focusable: false
WlrLayershell.namespace: "noctalia-bar-trigger-" + (screen?.name || "unknown")
WlrLayershell.layer: WlrLayer.Top
WlrLayershell.exclusionMode: ExclusionMode.Ignore
// Anchor to bar's edge
anchors {
top: barPosition === "top" || barIsVertical
bottom: barPosition === "bottom" || barIsVertical
left: barPosition === "left" || !barIsVertical
right: barPosition === "right" || !barIsVertical
}
// Size based on orientation - thin strip at edge
implicitWidth: barIsVertical ? triggerSize : 0
implicitHeight: !barIsVertical ? triggerSize : 0
MouseArea {
id: triggerArea
anchors.fill: parent
hoverEnabled: true
onEntered: {
if (root.isBeingDestroyed)
return;
// Signal hover - BarContentWindow will handle the show delay
BarService.setScreenHovered(root.screen?.name, true);
}
onExited: {
if (root.isBeingDestroyed)
return;
BarService.setScreenHovered(root.screen?.name, false);
}
}
Component.onCompleted: {
Logger.d("BarTriggerZone", "Created for screen:", screen?.name);
}
}
+13
View File
@@ -375,6 +375,19 @@ PanelWindow {
readonly property real barMarginV: barFloating ? Math.floor(Settings.data.bar.marginVertical) : 0
readonly property real barHeight: Style.getBarHeightForScreen(screen?.name)
// Auto-hide properties (read by AllBackgrounds for background fade)
readonly property bool autoHide: Settings.data.bar.displayMode === "auto_hide"
property bool isHidden: false
Connections {
target: BarService
function onBarAutoHideStateChanged(screenName, hidden) {
if (screenName === barPlaceholder.screen?.name) {
barPlaceholder.isHidden = hidden;
}
}
}
// Expose bar dimensions directly on this Item for BarBackground
// Use screen dimensions directly
x: {
+2
View File
@@ -85,6 +85,7 @@ PanelWindow {
function open() {
visible = true;
BarService.popupOpen = true;
}
// Show a context menu (temporarily replaces TrayMenu as content)
@@ -126,6 +127,7 @@ PanelWindow {
function close() {
visible = false;
BarService.popupOpen = false;
// Call close/hide method on current content
if (contentItem) {
if (typeof contentItem.hideMenu === "function") {
+12 -1
View File
@@ -180,7 +180,9 @@ Variants {
root.currentBrightness = newBrightness;
// Don't show OSD if brightness panel is open
var brightnessPanel = PanelService.getPanel("brightnessPanel", root.modelData);
if (brightnessPanel && brightnessPanel.isPanelOpen) {
var controlCenterPanel = PanelService.getPanel("controlCenterPanel", root.modelData);
if ((brightnessPanel && brightnessPanel.isPanelOpen) || (controlCenterPanel && controlCenterPanel.isPanelOpen)) {
return;
}
showOSD(OSD.Type.Brightness);
@@ -205,6 +207,15 @@ Variants {
if (!isTypeEnabled(type))
return;
// Suppress Audio OSD if Audio Panel or Control Center is open
if (type === OSD.Type.Volume || type === OSD.Type.InputVolume) {
var audioPanel = PanelService.getPanel("audioPanel", root.modelData);
var controlCenterPanel = PanelService.getPanel("controlCenterPanel", root.modelData);
if ((audioPanel && audioPanel.isPanelOpen) || (controlCenterPanel && controlCenterPanel.isPanelOpen)) {
return;
}
}
currentOSDType = type;
if (!root.active) {
+1 -124
View File
@@ -146,130 +146,7 @@ SmartPanel {
// Find application streams that are actually playing audio (connected to default sink)
// Use linkGroups to find nodes connected to the default audio sink
// Note: We need to use link IDs since source/target properties require binding
readonly property var appStreams: {
if (!Pipewire.ready || !AudioService.sink) {
return [];
}
var defaultSink = AudioService.sink;
var defaultSinkId = defaultSink.id;
var connectedStreamIds = {};
var connectedStreams = [];
// Use PwNodeLinkTracker to get properly bound link groups
if (!sinkLinkTracker.linkGroups) {
return [];
}
// Check if linkGroups is an array or ObjectModel
var linkGroupsCount = 0;
if (sinkLinkTracker.linkGroups.length !== undefined) {
linkGroupsCount = sinkLinkTracker.linkGroups.length;
} else if (sinkLinkTracker.linkGroups.count !== undefined) {
linkGroupsCount = sinkLinkTracker.linkGroups.count;
} else {
return [];
}
if (linkGroupsCount === 0) {
return [];
}
// Collect intermediate node IDs that are connected to the sink
var intermediateNodeIds = {};
// Process link groups from sinkLinkTracker
var nodesToCheck = [];
for (var i = 0; i < linkGroupsCount; i++) {
var linkGroup;
if (sinkLinkTracker.linkGroups.get) {
linkGroup = sinkLinkTracker.linkGroups.get(i);
} else {
linkGroup = sinkLinkTracker.linkGroups[i];
}
if (!linkGroup || !linkGroup.source) {
continue;
}
var sourceNode = linkGroup.source;
// If it's a stream node, add it directly
if (sourceNode.isStream && sourceNode.audio) {
if (!connectedStreamIds[sourceNode.id]) {
connectedStreamIds[sourceNode.id] = true;
connectedStreams.push(sourceNode);
}
} else {
// Not a stream - this is an intermediate node, track it
intermediateNodeIds[sourceNode.id] = true;
nodesToCheck.push(sourceNode);
}
}
// If we found intermediate nodes, we need to find streams connected to them
// Since Pipewire.linkGroups is not directly accessible, we'll use a heuristic:
// When intermediate nodes are present, include all active stream nodes
// (reasonable assumption: if audio is playing, streams are connected)
if (nodesToCheck.length > 0 || connectedStreams.length === 0) {
try {
// Get all nodes from Pipewire
var allNodes = [];
if (Pipewire.nodes) {
if (Pipewire.nodes.count !== undefined) {
var nodeCount = Pipewire.nodes.count;
for (var n = 0; n < nodeCount; n++) {
var node;
if (Pipewire.nodes.get) {
node = Pipewire.nodes.get(n);
} else {
node = Pipewire.nodes[n];
}
if (node)
allNodes.push(node);
}
} else if (Pipewire.nodes.values) {
allNodes = Pipewire.nodes.values;
}
}
// Find all stream nodes
for (var j = 0; j < allNodes.length; j++) {
var node = allNodes[j];
if (!node || !node.isStream || !node.audio) {
continue;
}
var streamId = node.id;
if (connectedStreamIds[streamId]) {
continue; // Already added
}
// When intermediate nodes are present, include all stream nodes
// This is a reasonable heuristic since if audio is playing, they're likely connected
if (Object.keys(intermediateNodeIds).length > 0) {
connectedStreamIds[streamId] = true;
connectedStreams.push(node);
} else if (connectedStreams.length === 0) {
// Fallback: if no streams found yet, include as fallback
connectedStreamIds[streamId] = true;
connectedStreams.push(node);
}
}
} catch (e)
// Error finding stream nodes - continue with what we have
{}
}
return connectedStreams;
}
// Track links to the default sink using PwNodeLinkTracker (properly binds links)
PwNodeLinkTracker {
id: sinkLinkTracker
node: AudioService.sink
}
readonly property var appStreams: AudioService.appStreams
// Use implicitHeight from content + margins to avoid binding loops
property real contentPreferredHeight: mainColumn.implicitHeight + Style.marginL * 2
+62 -30
View File
@@ -25,43 +25,75 @@ SmartPanel {
id: panelContent
property real contentPreferredHeight: mainLayout.implicitHeight + Style.marginL * 2
// Get device selection from Battery widget settings (check right section first, then any Battery widget)
function getBatteryDevicePath() {
var widget = BarService.lookupWidget("Battery");
if (widget !== undefined && widget.deviceNativePath !== undefined) {
return widget.deviceNativePath;
readonly property string deviceNativePath: resolveWidgetSetting("deviceNativePath", "__default__")
readonly property var selectedBattery: BatteryService.findUPowerDevice(deviceNativePath)
readonly property var selectedBluetoothDevice: BatteryService.findBluetoothDevice(deviceNativePath)
readonly property var selectedDevice: {
if (BatteryService.isDevicePresent(selectedBluetoothDevice)) {
return selectedBluetoothDevice;
}
return "";
if (BatteryService.isDevicePresent(selectedBattery)) {
return selectedBattery;
}
return null;
}
readonly property string deviceNativePath: getBatteryDevicePath()
// Use the centralized helper to find the specific device or fallback to primary
readonly property var selectedDevice: BatteryService.resolveDevice(deviceNativePath)
// Check if selected device is actually present/connected
readonly property bool isDevicePresent: BatteryService.isDevicePresent(selectedDevice)
readonly property bool isPresent: BatteryService.isDevicePresent(selectedDevice)
readonly property bool isReady: BatteryService.isDeviceReady(selectedDevice)
readonly property int percent: isReady ? Math.round(BatteryService.getPercentage(selectedDevice)) : -1
readonly property bool isCharging: BatteryService.isCharging(selectedDevice)
readonly property bool isPluggedIn: BatteryService.isPluggedIn(selectedDevice)
readonly property bool isLaptopBattery: selectedDevice && !BatteryService.isBluetoothDevice(selectedDevice)
readonly property bool healthAvailable: (isReady && isLaptopBattery && selectedDevice.healthSupported) || (isLaptopBattery && BatteryService.healthAvailable)
readonly property int healthPercent: (isReady && isLaptopBattery && selectedDevice.healthSupported) ? Math.round(selectedDevice.healthPercentage) : BatteryService.healthPercent
readonly property bool isCharging: isReady ? BatteryService.isCharging(selectedDevice) : false
readonly property bool isPluggedIn: isReady ? BatteryService.isPluggedIn(selectedDevice) : false
readonly property bool healthAvailable: (isReady && selectedBattery && selectedBattery.healthSupported) || (selectedBattery && BatteryService.healthAvailable)
readonly property int healthPercent: (isReady && selectedBattery && selectedBattery.healthSupported) ? Math.round(selectedBattery.healthPercentage) : BatteryService.healthPercent
readonly property string deviceName: BatteryService.getDeviceName(selectedDevice)
readonly property string panelTitle: deviceName ? `${I18n.tr("common.battery")} - ${deviceName}` : I18n.tr("common.battery")
readonly property string panelTitle: deviceName ? `${deviceName}` : I18n.tr("common.battery")
// Use the centralized list of all devices
readonly property var allDevices: BatteryService.devices
readonly property var allDevices: {
var list = [];
var seenPaths = new Set();
readonly property var laptopBatteries: BatteryService.laptopBatteries
readonly property var otherDevices: BatteryService.externalBatteries
// Add UPower batteries
if (UPower.devices) {
var upowerArray = UPower.devices.values || [];
for (var i = 0; i < upowerArray.length; i++) {
var d = upowerArray[i];
if (BatteryService.isDevicePresent(d) && d.type === UPowerDeviceType.Battery) {
if (d.nativePath && !seenPaths.has(d.nativePath)) {
list.push(d);
seenPaths.add(d.nativePath);
}
}
}
}
// Add Bluetooth batteries
if (BluetoothService.devices) {
var btArray = BluetoothService.devices.values || [];
for (var j = 0; j < btArray.length; j++) {
var btd = btArray[j];
if (BatteryService.isDevicePresent(btd) && btd.batteryAvailable) {
// Bluetooth devices use address as unique ID
if (btd.address && !seenPaths.has(btd.address)) {
list.push(btd);
seenPaths.add(btd.address);
}
}
}
}
// Fallback: if no specific batteries found but display device is a battery, use it
if (list.length === 0 && UPower.displayDevice && UPower.displayDevice.type === UPowerDeviceType.Battery && BatteryService.isDevicePresent(UPower.displayDevice)) {
list.push(UPower.displayDevice);
}
return list;
}
readonly property var laptopBatteries: allDevices.filter(d => !BatteryService.isBluetoothDevice(d))
readonly property var otherDevices: allDevices.filter(d => BatteryService.isBluetoothDevice(d))
readonly property string timeText: BatteryService.getTimeRemainingText(selectedDevice)
readonly property string iconName: BatteryService.getIcon(percent, isCharging, isPluggedIn, isReady)
property var batteryWidgetInstance: BarService.lookupWidget("Battery", screen ? screen.name : null)
@@ -147,7 +179,7 @@ SmartPanel {
}
NText {
text: timeText
text: BatteryService.getTimeRemainingText(selectedDevice)
pointSize: Style.fontSizeS
color: Color.mOnSurfaceVariant
wrapMode: Text.Wrap
@@ -242,7 +274,7 @@ SmartPanel {
ColumnLayout {
Layout.fillWidth: true
spacing: Style.marginS
visible: modelData.healthSupported || (modelData === BatteryService.primaryDevice && BatteryService.healthAvailable)
visible: modelData.healthSupported || (modelData === selectedBattery && BatteryService.healthAvailable)
RowLayout {
Layout.fillWidth: true
spacing: Style.marginS
@@ -273,14 +305,14 @@ SmartPanel {
height: parent.height
radius: parent.radius
width: {
var h = modelData.healthSupported ? modelData.healthPercentage : (modelData === BatteryService.primaryDevice ? BatteryService.healthPercent : 0);
var h = modelData.healthSupported ? modelData.healthPercentage : (modelData === selectedBattery ? BatteryService.healthPercent : 0);
if (h <= 0)
return 0;
var ratio = Math.max(0, Math.min(1, h / 100));
return parent.width * ratio;
}
color: {
var h = modelData.healthSupported ? modelData.healthPercentage : (modelData === BatteryService.primaryDevice ? BatteryService.healthPercent : 0);
var h = modelData.healthSupported ? modelData.healthPercentage : (modelData === selectedBattery ? BatteryService.healthPercent : 0);
return h >= 80 ? Color.mPrimary : (h >= 50 ? Color.mTertiary : Color.mError);
}
}
@@ -289,7 +321,7 @@ SmartPanel {
Layout.preferredWidth: 40 * Style.uiScaleRatio
horizontalAlignment: Text.AlignRight
readonly property int h: modelData.healthSupported ? Math.round(modelData.healthPercentage) : (modelData === BatteryService.primaryDevice ? BatteryService.healthPercent : -1)
readonly property int h: modelData.healthSupported ? Math.round(modelData.healthPercentage) : (modelData === selectedBattery ? BatteryService.healthPercent : -1)
text: h >= 0 ? `${h}%` : "--"
color: Color.mOnSurface
pointSize: Style.fontSizeS
@@ -5,7 +5,6 @@ import Quickshell
import qs.Commons
import qs.Modules.Cards
import qs.Modules.MainScreen
import qs.Services.Hardware
import qs.Services.Media
import qs.Services.UI
import qs.Widgets
@@ -81,12 +80,6 @@ SmartPanel {
onOpened: {
MediaService.autoSwitchingPaused = true;
// Refresh DDC brightness from monitors (one-time on QS open)
BrightnessService.monitors.forEach(m => {
if (m.isDdc) {
m.refreshBrightnessFromSystem();
}
});
}
onClosed: {
+49 -19
View File
@@ -179,9 +179,8 @@ SmartPanel {
readonly property int gridContentWidth: listPanelWidth - (2 * Style.marginXS)
readonly property int gridCellSize: Math.floor((gridContentWidth - ((targetGridColumns - 1) * Style.marginS)) / targetGridColumns)
// Actual columns that fit in the GridView
// This gets updated dynamically by the GridView when its actual width is known
property int gridColumns: 5
// Actual columns in the GridView - tracks targetGridColumns
readonly property int gridColumns: targetGridColumns
// Listen for plugin provider registry changes
Connections {
@@ -763,6 +762,14 @@ SmartPanel {
}
}
WindowsProvider {
id: windowsProvider
Component.onCompleted: {
registerProvider(this);
Logger.d("Launcher", "Registered: WindowsProvider");
}
}
// ---------------------------------------------------
panelContent: Rectangle {
id: ui
@@ -775,7 +782,7 @@ SmartPanel {
visible: root.previewActive
width: root.previewPanelWidth
height: Math.round(400 * Style.uiScaleRatio)
x: ui.width + Style.marginM
x: root.panelAnchorRight ? -(root.previewPanelWidth + Style.marginM) : ui.width + Style.marginM
y: {
if (!resultsViewLoader.item)
return Style.marginL;
@@ -1196,6 +1203,24 @@ SmartPanel {
color: Color.mOnSurfaceVariant
}
}
// Badge icon overlay (generic indicator for any provider)
Rectangle {
visible: !!modelData.badgeIcon
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.margins: 2
width: height
height: Style.fontSizeM + Style.marginXS
color: Color.mSurfaceVariant
radius: Style.radiusXXS
NIcon {
anchors.centerIn: parent
icon: modelData.badgeIcon || ""
pointSize: Style.fontSizeS
color: Color.mOnSurfaceVariant
}
}
}
// Text content
@@ -1351,8 +1376,9 @@ SmartPanel {
horizontalPolicy: ScrollBar.AlwaysOff
verticalPolicy: ScrollBar.AlwaysOff
reserveScrollbarSpace: false
gradientColor: "transparent" //Color.mSurface
gradientColor: Color.mSurface
wheelScrollMultiplier: 4.0
trackedSelectionIndex: root.selectedIndex
width: parent.width
height: parent.height
@@ -1375,20 +1401,6 @@ SmartPanel {
focus: false
interactive: !Settings.data.appLauncher.ignoreMouseInput
Component.onCompleted: {
// Initialize gridColumns when grid view is created
updateGridColumns();
}
function updateGridColumns() {
// Since cellWidth = width / targetGridColumns, the number of columns is always targetGridColumns
root.gridColumns = root.targetGridColumns;
}
onWidthChanged: {
updateGridColumns();
}
// Completely disable GridView key handling
Keys.enabled: false
@@ -1573,6 +1585,24 @@ SmartPanel {
font.weight: Style.fontWeightBold
color: modelData.displayString ? Color.mOnSurface : Color.mOnPrimary
}
// Badge icon overlay (generic indicator for any provider)
Rectangle {
visible: !!modelData.badgeIcon
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.margins: 2
width: height
height: Style.fontSizeM + Style.marginXS
color: Color.mSurfaceVariant
radius: Style.radiusXXS
NIcon {
anchors.centerIn: parent
icon: modelData.badgeIcon || ""
pointSize: Style.fontSizeS
color: Color.mOnSurfaceVariant
}
}
}
// Text content (hidden when hideLabel is true)
@@ -2,6 +2,7 @@ import QtQuick
import Quickshell
import Quickshell.Io
import qs.Commons
import qs.Services.Compositor
import qs.Services.System
Item {
@@ -580,13 +581,12 @@ Item {
} else {
// Fallback logic when app2unit is not used
if (app.runInTerminal) {
// If app.execute() fails for terminal apps, we handle it manually.
Logger.d("ApplicationsProvider", "Executing terminal app manually: " + app.name);
const terminal = Settings.data.appLauncher.terminalCommand.split(" ");
const command = terminal.concat(app.command);
Quickshell.execDetached(command);
CompositorService.spawn(command);
} else if (app.command && app.command.length > 0) {
Quickshell.execDetached(app.command);
CompositorService.spawn(app.command);
} else if (app.execute) {
app.execute();
} else {
@@ -23,6 +23,7 @@ Item {
readonly property string emptyBrowsingMessage: selectedCategory === "recent" ? I18n.tr("launcher.providers.emoji-no-recent") : ""
property var categoryIcons: ({
"all": "apps",
"recent": "clock",
"people": "user",
"animals": "paw",
@@ -35,10 +36,11 @@ Item {
"flags": "flag"
})
property var categories: ["recent", "people", "animals", "nature", "food", "activity", "travel", "objects", "symbols", "flags"]
property var categories: ["all", "recent", "people", "animals", "nature", "food", "activity", "travel", "objects", "symbols", "flags"]
function getCategoryName(category) {
const names = {
"all": I18n.tr("launcher.categories.all"),
"recent": I18n.tr("launcher.categories.emoji-recent"),
"people": I18n.tr("launcher.categories.emoji-people"),
"animals": I18n.tr("launcher.categories.emoji-animals"),
@@ -121,16 +123,14 @@ Item {
}
var query = searchText.slice(6).trim();
var emojis = [];
if (query === "") {
showsCategories = true;
var emojis = EmojiService.getEmojisByCategory(selectedCategory);
return emojis.map(formatEmojiEntry);
if (query !== "" || selectedCategory === "all") {
emojis = EmojiService.search(query);
} else {
showsCategories = false;
var emojis = EmojiService.search(query);
return emojis.map(formatEmojiEntry);
emojis = EmojiService.getEmojisByCategory(selectedCategory);
}
return emojis.map(formatEmojiEntry);
}
// Format an emoji entry for the results list
@@ -34,13 +34,48 @@ Item {
Logger.d("SettingsProvider", "Initialized");
}
// Check if this provider handles the command
function handleCommand(searchText) {
return searchText.startsWith(">settings");
}
// Return available commands when user types ">"
function commands() {
return [
{
"name": ">settings",
"description": I18n.tr("launcher.providers.settings-search-description"),
"icon": "settings",
"isTablerIcon": true,
"isImage": false,
"onActivate": function () {
launcher.setSearchText(">settings ");
}
}
];
}
function getResults(query) {
if (!query || searchIndex.length === 0)
return [];
const trimmed = query.trim();
if (!trimmed || trimmed.length < 2)
return [];
var trimmed = query.trim();
// Handle command mode: ">settings" or ">settings <search>"
var isCommandMode = trimmed.startsWith(">settings");
if (isCommandMode) {
// Extract search term after ">settings "
var searchTerm = trimmed.substring(9).trim();
// In command mode, show all settings if no search term
if (searchTerm.length === 0) {
return getAllSettings();
}
trimmed = searchTerm;
} else {
// Regular search mode - require at least 2 chars
if (!trimmed || trimmed.length < 2)
return [];
}
// Build searchable items with resolved translations
let items = [];
@@ -94,6 +129,39 @@ Item {
return launcherItems;
}
function getAllSettings() {
var launcherItems = [];
for (var j = 0; j < searchIndex.length; j++) {
var entry = searchIndex[j];
var label = I18n.tr(entry.labelKey);
var tabName = I18n.tr(entry.tabLabel);
var subTabName = entry.subTabLabel ? I18n.tr(entry.subTabLabel) : "";
var breadcrumb = subTabName ? (tabName + " " + subTabName) : tabName;
launcherItems.push({
"name": label,
"description": breadcrumb,
"icon": "settings",
"isTablerIcon": true,
"isImage": false,
"_score": 0,
"provider": root,
"onActivate": createActivateHandler({
"labelKey": entry.labelKey,
"descriptionKey": entry.descriptionKey,
"widget": entry.widget,
"tab": entry.tab,
"tabLabel": entry.tabLabel,
"subTab": entry.subTab,
"subTabLabel": entry.subTabLabel || null
})
});
}
return launcherItems;
}
function createActivateHandler(entry) {
return function () {
if (launcher)
@@ -0,0 +1,158 @@
import QtQuick
import Quickshell
import qs.Commons
import qs.Services.Compositor
Item {
id: root
property string name: I18n.tr("common.windows")
property var launcher: null
property bool handleSearch: Settings.data.appLauncher.enableWindowsSearch
property string supportedLayouts: "list"
function init() {
Logger.d("WindowsProvider", "Initialized");
}
// Check if this provider handles the command
function handleCommand(searchText) {
return searchText.startsWith(">win");
}
// Return available commands when user types ">"
function commands() {
return [
{
"name": ">win",
"description": I18n.tr("launcher.providers.windows-search-description"),
"icon": "app-window",
"isTablerIcon": true,
"isImage": false,
"onActivate": function () {
launcher.setSearchText(">win ");
}
}
];
}
function getResults(query) {
if (!query)
return [];
var trimmed = query.trim();
// Handle command mode: ">win" or ">win <search>"
var isCommandMode = trimmed.startsWith(">win");
if (isCommandMode) {
// Extract search term after ">win "
var searchTerm = trimmed.substring(4).trim();
// In command mode, show all windows if no search term
if (searchTerm.length === 0) {
return getAllWindows();
}
trimmed = searchTerm;
} else {
// Regular search mode - require at least 2 chars
if (trimmed.length < 2)
return [];
}
var items = [];
// Collect all windows from CompositorService
for (var i = 0; i < CompositorService.windows.count; i++) {
var win = CompositorService.windows.get(i);
items.push({
"id": win.id,
"title": win.title || "",
"appId": win.appId || "",
"workspaceId": win.workspaceId,
"isFocused": win.isFocused,
"searchText": (win.title + " " + win.appId).toLowerCase()
});
}
// Fuzzy search on title and appId
var results = FuzzySort.go(trimmed, items, {
"keys": ["title", "appId"],
"limit": 10
});
// Map to launcher items
var launcherItems = [];
for (var j = 0; j < results.length; j++) {
var entry = results[j].obj;
var score = results[j].score;
// Get icon name from DesktopEntry if available, otherwise use appId
var iconName = entry.appId;
var appEntry = ThemeIcons.findAppEntry(entry.appId);
if (appEntry && appEntry.icon) {
iconName = appEntry.icon;
}
launcherItems.push({
"name": entry.title || entry.appId,
"description": entry.appId,
"icon": iconName || "application-x-executable",
"isTablerIcon": false,
"badgeIcon": "app-window",
"_score": score,
"provider": root,
"windowId": entry.id,
"onActivate": createActivateHandler(entry)
});
}
return launcherItems;
}
function getAllWindows() {
var launcherItems = [];
for (var i = 0; i < CompositorService.windows.count; i++) {
var win = CompositorService.windows.get(i);
var iconName = win.appId;
var appEntry = ThemeIcons.findAppEntry(win.appId);
if (appEntry && appEntry.icon) {
iconName = appEntry.icon;
}
launcherItems.push({
"name": win.title || win.appId,
"description": win.appId,
"icon": iconName || "application-x-executable",
"isTablerIcon": false,
"badgeIcon": "app-window",
"_score": 0,
"provider": root,
"windowId": win.id,
"onActivate": createActivateHandler({
"id": win.id
})
});
}
return launcherItems;
}
function createActivateHandler(windowEntry) {
return function () {
if (launcher)
launcher.close();
Qt.callLater(() => {
// Find the actual window object to pass to focusWindow
for (var i = 0; i < CompositorService.windows.count; i++) {
var win = CompositorService.windows.get(i);
if (win.id === windowEntry.id) {
CompositorService.focusWindow(win);
break;
}
}
});
};
}
}
+10 -4
View File
@@ -890,10 +890,11 @@ SmartPanel {
// Effective hover state that respects ignoreMouseHover
readonly property bool effectiveHover: !root.ignoreMouseHover && mouseArea.containsMouse
readonly property real hoveredScale: 1.05
signal clicked
property real hoverScale: (isSelected || effectiveHover) ? 1.05 : 1.0
property real hoverScale: (isSelected || effectiveHover) ? hoveredScale : 1.0
radius: Style.radiusL
color: {
@@ -909,8 +910,10 @@ SmartPanel {
border.width: Style.borderS
border.color: Color.mOutline
layer.enabled: hoverScale !== 1.0
// Always enable layer to fix nvidia bug, render at 2x size to avoid blur when scaling up
layer.enabled: true
layer.smooth: true
layer.textureSize: Qt.size(Math.ceil(width * 2), Math.ceil(height * 2))
// Scale transform for hover effect
transform: Scale {
@@ -967,10 +970,13 @@ SmartPanel {
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
property real iconScale: (largeButtonRoot.isSelected || largeButtonRoot.effectiveHover) ? 1.15 : 1.0
readonly property real hoveredIconScale: 1.15
property real iconScale: (largeButtonRoot.isSelected || largeButtonRoot.effectiveHover) ? hoveredIconScale : 1.0
layer.enabled: iconScale !== 1.0
// Always enable layer to fix nvidia bug, render at 2x size to avoid blur when scaling up
layer.enabled: true
layer.smooth: true
layer.textureSize: Qt.size(Math.ceil(width * 2), Math.ceil(height * 2))
transform: Scale {
origin.x: iconElement.width / 2
@@ -15,11 +15,12 @@ Popup {
property string widgetId: ""
property string sectionId: ""
property var screen: null
signal updateWidgetSettings(string section, int index, var settings)
property var settingsCache: ({})
readonly property real maxHeight: screen ? screen.height * 0.9 : 800
signal updateWidgetSettings(string section, int index, var settings)
width: Math.max(content.implicitWidth + padding * 2, 640)
height: Math.min(content.implicitHeight + padding * 2, maxHeight)
padding: Style.marginXL
@@ -138,36 +139,27 @@ Popup {
}
}
}
}
}
// Action buttons
RowLayout {
id: buttonRow
Layout.fillWidth: true
Layout.topMargin: Style.marginM
Layout.preferredHeight: implicitHeight
spacing: Style.marginM
Item {
Layout.fillWidth: true
}
NButton {
text: I18n.tr("common.close")
outlined: true
onClicked: saveAndClose()
}
}
Timer {
id: saveTimer
running: false
interval: 150
onTriggered: {
root.updateWidgetSettings(root.sectionId, root.widgetIndex, root.settingsCache);
}
}
Connections {
target: settingsLoader.item
ignoreUnknownSignals: true
function onSettingsChanged(newSettings) {
if (newSettings) {
root.updateWidgetSettings(root.sectionId, root.widgetIndex, newSettings);
root.settingsCache = newSettings;
saveTimer.start();
}
}
ignoreUnknownSignals: true
}
function saveAndClose() {
@@ -44,15 +44,14 @@ NBox {
var metadata = BarWidgetRegistry.widgetMetadata[widgetId];
if (metadata) {
Object.keys(metadata).forEach(function (key) {
if (key !== "allowUserSettings") {
newWidget[key] = metadata[key];
}
newWidget[key] = metadata[key];
});
}
}
var widgets = _getWidgetsContainer();
widgets[section].push(newWidget);
_saveWidgets(widgets);
BarService.widgetsRevision++;
}
function _removeWidgetFromSection(section, index) {
@@ -62,6 +61,7 @@ NBox {
var removedWidgets = newArray.splice(index, 1);
widgets[section] = newArray;
_saveWidgets(widgets);
BarService.widgetsRevision++;
if (removedWidgets[0].id === "ControlCenter" && BarService.lookupWidget("ControlCenter") === undefined) {
ToastService.showWarning(I18n.tr("toast.missing-control-center.label"), I18n.tr("toast.missing-control-center.description"), 12000);
@@ -78,9 +78,12 @@ NBox {
newArray.splice(toIndex, 0, item);
widgets[section] = newArray;
_saveWidgets(widgets);
BarService.widgetsRevision++;
}
}
// Note: _updateWidgetSettingsInSection does NOT increment revision
// because it only changes settings, not widget structure
function _updateWidgetSettingsInSection(section, index, settings) {
var widgets = _getWidgetsContainer();
widgets[section][index] = settings;
@@ -98,6 +101,7 @@ NBox {
targetArray.push(widget);
widgets[toSection] = targetArray;
_saveWidgets(widgets);
BarService.widgetsRevision++;
}
}
@@ -18,21 +18,12 @@ ColumnLayout {
// Local state
property string valueDisplayMode: widgetData.displayMode !== undefined ? widgetData.displayMode : widgetMetadata.displayMode
property int valueWarningThreshold: widgetData.warningThreshold !== undefined ? widgetData.warningThreshold : widgetMetadata.warningThreshold
property string valueDeviceNativePath: widgetData.deviceNativePath !== undefined ? widgetData.deviceNativePath : ""
property string valueDeviceNativePath: widgetData.deviceNativePath !== undefined ? widgetData.deviceNativePath : "__default__"
property bool valueShowPowerProfiles: widgetData.showPowerProfiles !== undefined ? widgetData.showPowerProfiles : widgetMetadata.showPowerProfiles
property bool valueShowNoctaliaPerformance: widgetData.showNoctaliaPerformance !== undefined ? widgetData.showNoctaliaPerformance : widgetMetadata.showNoctaliaPerformance
property bool valueHideIfNotDetected: widgetData.hideIfNotDetected !== undefined ? widgetData.hideIfNotDetected : widgetMetadata.hideIfNotDetected
property bool valueHideIfIdle: widgetData.hideIfIdle !== undefined ? widgetData.hideIfIdle : widgetMetadata.hideIfIdle
property var deviceModel: BatteryService.getDeviceOptionsModel()
Connections {
target: BatteryService
function onDevicesChanged() {
deviceModel = BatteryService.getDeviceOptionsModel();
}
}
function saveSettings() {
var settings = Object.assign({}, widgetData || {});
if (widgetData && widgetData.id) {
@@ -44,54 +35,29 @@ ColumnLayout {
settings.showNoctaliaPerformance = valueShowNoctaliaPerformance;
settings.hideIfNotDetected = valueHideIfNotDetected;
settings.hideIfIdle = valueHideIfIdle;
if (valueDeviceNativePath && valueDeviceNativePath !== "") {
settings.deviceNativePath = valueDeviceNativePath;
} else {
delete settings.deviceNativePath;
}
settings.deviceNativePath = valueDeviceNativePath;
return settings;
}
RowLayout {
NComboBox {
id: deviceComboBox
Layout.fillWidth: true
spacing: Style.marginM
NComboBox {
id: deviceComboBox
Layout.fillWidth: true
label: I18n.tr("bar.battery.device-label")
description: I18n.tr("bar.battery.device-description")
minimumWidth: 200
model: root.deviceModel
currentKey: root.valueDeviceNativePath
onSelected: key => {
root.valueDeviceNativePath = key;
settingsChanged(saveSettings());
}
}
// Update currentKey when model changes to ensure selection is preserved
Connections {
target: root
function onDeviceModelChanged() {
// Force update of currentKey to trigger selection update
deviceComboBox.currentKey = root.valueDeviceNativePath;
}
}
NIconButton {
icon: "refresh"
// TODO i18n
tooltipText: "Refresh device list"
onClicked: deviceModel = BatteryService.getDeviceOptionsModel()
}
label: I18n.tr("bar.battery.device-label")
description: I18n.tr("bar.battery.device-description")
minimumWidth: 200
model: BatteryService.deviceModel
currentKey: root.valueDeviceNativePath
onSelected: key => {
root.valueDeviceNativePath = key;
settingsChanged(saveSettings());
}
}
NComboBox {
Layout.fillWidth: true
label: I18n.tr("bar.volume.display-mode-label")
description: I18n.tr("bar.volume.display-mode-description")
minimumWidth: 240
minimumWidth: 200
model: [
{
"key": "onhover",
@@ -25,7 +25,7 @@ ColumnLayout {
NComboBox {
label: I18n.tr("bar.volume.display-mode-label")
description: I18n.tr("bar.volume.display-mode-description")
minimumWidth: 134
minimumWidth: 200
model: [
{
"key": "onhover",
@@ -26,7 +26,7 @@ ColumnLayout {
NComboBox {
label: I18n.tr("bar.volume.display-mode-label")
description: I18n.tr("bar.volume.display-mode-description")
minimumWidth: 134
minimumWidth: 200
model: [
{
"key": "onhover",
@@ -29,7 +29,7 @@ ColumnLayout {
visible: valueShowIcon // Hide display mode setting when icon is disabled
label: I18n.tr("bar.volume.display-mode-label")
description: I18n.tr("bar.volume.display-mode-description")
minimumWidth: 134
minimumWidth: 200
model: [
{
"key": "onhover",
@@ -28,7 +28,7 @@ ColumnLayout {
NComboBox {
label: I18n.tr("bar.volume.display-mode-label")
description: I18n.tr("bar.volume.display-mode-description")
minimumWidth: 134
minimumWidth: 200
model: [
{
"key": "onhover",
@@ -25,7 +25,7 @@ ColumnLayout {
NComboBox {
label: I18n.tr("bar.volume.display-mode-label")
description: I18n.tr("bar.volume.display-mode-description")
minimumWidth: 134
minimumWidth: 200
model: [
{
"key": "onhover",
@@ -20,6 +20,7 @@ ColumnLayout {
property bool valueUsePrimaryColor: widgetData.usePrimaryColor !== undefined ? widgetData.usePrimaryColor : widgetMetadata.usePrimaryColor
property bool valueUseMonospaceFont: widgetData.useMonospaceFont !== undefined ? widgetData.useMonospaceFont : widgetMetadata.useMonospaceFont
property bool valueShowCpuUsage: widgetData.showCpuUsage !== undefined ? widgetData.showCpuUsage : widgetMetadata.showCpuUsage
property bool valueShowCpuFreq: widgetData.showCpuFreq !== undefined ? widgetData.showCpuFreq : widgetMetadata.showCpuFreq
property bool valueShowCpuTemp: widgetData.showCpuTemp !== undefined ? widgetData.showCpuTemp : widgetMetadata.showCpuTemp
property bool valueShowGpuTemp: widgetData.showGpuTemp !== undefined ? widgetData.showGpuTemp : widgetMetadata.showGpuTemp
property bool valueShowLoadAverage: widgetData.showLoadAverage !== undefined ? widgetData.showLoadAverage : widgetMetadata.showLoadAverage
@@ -38,6 +39,7 @@ ColumnLayout {
settings.usePrimaryColor = valueUsePrimaryColor;
settings.useMonospaceFont = valueUseMonospaceFont;
settings.showCpuUsage = valueShowCpuUsage;
settings.showCpuFreq = valueShowCpuFreq;
settings.showCpuTemp = valueShowCpuTemp;
settings.showGpuTemp = valueShowGpuTemp;
settings.showLoadAverage = valueShowLoadAverage;
@@ -100,6 +102,18 @@ ColumnLayout {
}
}
NToggle {
id: showCpuFreq
Layout.fillWidth: true
label: "Show CPU Frequency" // TODO: use I18n.tr
description: "Display the current CPU clock speed in GHz" // TODO: use I18n.tr
checked: valueShowCpuFreq
onToggled: checked => {
valueShowCpuFreq = checked;
settingsChanged(saveSettings());
}
}
NToggle {
id: showCpuTemp
Layout.fillWidth: true
@@ -147,6 +147,17 @@ ColumnLayout {
enabled: !isVerticalBar
}
NTextInput {
id: titleWidthInput
visible: root.valueShowTitle && !isVerticalBar
Layout.fillWidth: true
label: I18n.tr("bar.taskbar.title-width-label")
description: I18n.tr("bar.taskbar.title-width-description")
text: widgetData.titleWidth || widgetMetadata.titleWidth
placeholderText: I18n.tr("placeholders.enter-width-pixels")
onEditingFinished: settingsChanged(saveSettings())
}
NToggle {
Layout.fillWidth: true
visible: !isVerticalBar && root.valueShowTitle
@@ -174,15 +185,4 @@ ColumnLayout {
}
text: Math.round(root.valueMaxTaskbarWidth) + "%"
}
NTextInput {
id: titleWidthInput
visible: root.valueShowTitle && !isVerticalBar && !root.valueSmartWidth
Layout.fillWidth: true
label: I18n.tr("bar.taskbar.title-width-label")
description: I18n.tr("bar.taskbar.title-width-description")
text: widgetData.titleWidth || widgetMetadata.titleWidth
placeholderText: I18n.tr("placeholders.enter-width-pixels")
onEditingFinished: settingsChanged(saveSettings())
}
}
@@ -137,19 +137,17 @@ ColumnLayout {
spacing: Style.marginS
NText {
anchors.verticalCenter: parent.verticalCenter
text: model.rule
elide: Text.ElideRight
verticalAlignment: Text.AlignVCenter
Layout.fillWidth: true
}
NIconButton {
width: 16
height: 16
anchors.verticalCenter: parent.verticalCenter
icon: "close"
baseSize: 8
baseSize: 12 * Style.uiScaleRatio
colorBg: Color.mSurfaceVariant
colorFg: Color.mOnSurface
colorFg: Color.mOnSurfaceVariant
colorBgHover: Color.mError
colorFgHover: Color.mOnError
onClicked: {
@@ -23,7 +23,7 @@ ColumnLayout {
NComboBox {
label: I18n.tr("bar.volume.display-mode-label")
description: I18n.tr("bar.volume.display-mode-description")
minimumWidth: 134
minimumWidth: 200
model: [
{
"key": "onhover",
@@ -28,7 +28,7 @@ ColumnLayout {
NComboBox {
label: I18n.tr("bar.volume.display-mode-label")
description: I18n.tr("bar.volume.display-mode-description")
minimumWidth: 134
minimumWidth: 200
model: [
{
"key": "onhover",
@@ -226,6 +226,7 @@ ColumnLayout {
settingsChanged(saveSettings());
}
text: Math.round(valueIconScale * 100) + "%"
visible: valueShowApplications
}
NDivider {
@@ -14,6 +14,7 @@ Popup {
property string widgetId: ""
property string sectionId: ""
property var screen: null
property var settingsCache: ({})
signal updateWidgetSettings(string section, int index, var settings)
@@ -111,35 +112,26 @@ Popup {
}
}
}
}
// Action buttons
RowLayout {
id: buttonRow
Layout.fillWidth: true
Layout.topMargin: Style.marginM
Layout.preferredHeight: implicitHeight
spacing: Style.marginM
Item {
Layout.fillWidth: true
}
NButton {
text: I18n.tr("common.close")
outlined: true
onClicked: saveAndClose()
}
Timer {
id: saveTimer
running: false
interval: 150
onTriggered: {
root.updateWidgetSettings(root.sectionId, root.widgetIndex, root.settingsCache);
}
}
Connections {
target: settingsLoader.item
ignoreUnknownSignals: true
function onSettingsChanged(newSettings) {
if (newSettings) {
root.updateWidgetSettings(root.sectionId, root.widgetIndex, newSettings);
root.settingsCache = newSettings;
saveTimer.start();
}
}
ignoreUnknownSignals: true
}
function saveAndClose() {
@@ -16,11 +16,12 @@ Popup {
property string widgetId: ""
property string sectionId: "" // Not used for desktop widgets, but required by NSectionEditor
property var screen: null
signal updateWidgetSettings(string section, int index, var settings)
property var settingsCache: ({})
readonly property real maxHeight: screen ? screen.height * 0.9 : 800
signal updateWidgetSettings(string section, int index, var settings)
width: Math.max(content.implicitWidth + padding * 2, 500)
height: Math.min(content.implicitHeight + padding * 2, maxHeight)
padding: Style.marginXL
@@ -132,35 +133,27 @@ Popup {
}
}
}
}
}
RowLayout {
id: buttonRow
Layout.fillWidth: true
Layout.topMargin: Style.marginM
Layout.preferredHeight: implicitHeight
spacing: Style.marginM
Item {
Layout.fillWidth: true
}
NButton {
text: I18n.tr("common.close")
outlined: true
onClicked: saveAndClose()
}
}
Timer {
id: saveTimer
running: false
interval: 150
onTriggered: {
root.updateWidgetSettings(root.sectionId, root.widgetIndex, root.settingsCache);
}
}
Connections {
target: settingsLoader.item
ignoreUnknownSignals: true
function onSettingsChanged(newSettings) {
if (newSettings) {
root.updateWidgetSettings(root.sectionId, root.widgetIndex, newSettings);
root.settingsCache = newSettings;
saveTimer.start();
}
}
ignoreUnknownSignals: true
}
function saveAndClose() {
@@ -0,0 +1,139 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import qs.Commons
import qs.Services.System
import qs.Widgets
ColumnLayout {
id: root
spacing: Style.marginM
width: 700
property var widgetData: null
property var widgetMetadata: null
signal settingsChanged(var settings)
property string valueStatType: widgetData.statType !== undefined ? widgetData.statType : widgetMetadata.statType
property string valueDiskPath: widgetData.diskPath !== undefined ? widgetData.diskPath : widgetMetadata.diskPath
property bool valueShowBackground: widgetData.showBackground !== undefined ? widgetData.showBackground : widgetMetadata.showBackground
property bool valueRoundedCorners: widgetData.roundedCorners !== undefined ? widgetData.roundedCorners : (widgetMetadata.roundedCorners !== undefined ? widgetMetadata.roundedCorners : true)
property string valueLayout: widgetData.layout !== undefined ? widgetData.layout : (widgetMetadata.layout !== undefined ? widgetMetadata.layout : "side")
function saveSettings() {
var settings = Object.assign({}, widgetData || {});
settings.statType = valueStatType;
settings.diskPath = valueDiskPath;
settings.showBackground = valueShowBackground;
settings.roundedCorners = valueRoundedCorners;
settings.layout = valueLayout;
return settings;
}
NComboBox {
Layout.fillWidth: true
label: I18n.tr("panels.desktop-widgets.system-stat-stat-type-label")
description: I18n.tr("panels.desktop-widgets.system-stat-stat-type-description")
currentKey: valueStatType
minimumWidth: 260 * Style.uiScaleRatio
model: [
{
"key": "CPU",
"name": I18n.tr("system-monitor.cpu-usage")
},
{
"key": "GPU",
"name": I18n.tr("panels.system-monitor.gpu-section-label")
},
{
"key": "Memory",
"name": I18n.tr("common.memory")
},
{
"key": "Network",
"name": I18n.tr("bar.system-monitor.network-traffic-label")
},
{
"key": "Disk",
"name": I18n.tr("system-monitor.disk")
}
]
onSelected: key => {
valueStatType = key;
settingsChanged(saveSettings());
}
}
NComboBox {
Layout.fillWidth: true
visible: valueStatType === "Disk"
label: I18n.tr("bar.system-monitor.disk-path-label")
description: I18n.tr("bar.system-monitor.disk-path-description")
model: {
const paths = Object.keys(SystemStatService.diskPercents).sort();
return paths.map(path => ({
key: path,
name: path
}));
}
currentKey: valueDiskPath
onSelected: key => {
valueDiskPath = key;
settingsChanged(saveSettings());
}
}
NDivider {
Layout.fillWidth: true
}
NToggle {
Layout.fillWidth: true
label: I18n.tr("panels.desktop-widgets.system-stat-show-background-label")
description: I18n.tr("panels.desktop-widgets.system-stat-show-background-description")
checked: valueShowBackground
onToggled: checked => {
valueShowBackground = checked;
settingsChanged(saveSettings());
}
}
NToggle {
Layout.fillWidth: true
visible: valueShowBackground
label: I18n.tr("panels.desktop-widgets.system-stat-rounded-corners-label")
description: I18n.tr("panels.desktop-widgets.system-stat-rounded-corners-description")
checked: valueRoundedCorners
onToggled: checked => {
valueRoundedCorners = checked;
settingsChanged(saveSettings());
}
}
NDivider {
Layout.fillWidth: true
}
NComboBox {
Layout.fillWidth: true
label: I18n.tr("panels.desktop-widgets.system-stat-layout-label")
description: I18n.tr("panels.desktop-widgets.system-stat-layout-description")
currentKey: valueLayout
minimumWidth: 260 * Style.uiScaleRatio
model: [
{
"key": "side",
"name": I18n.tr("panels.desktop-widgets.system-stat-layout-side")
},
{
"key": "bottom",
"name": I18n.tr("panels.desktop-widgets.system-stat-layout-bottom")
}
]
onSelected: key => {
valueLayout = key;
settingsChanged(saveSettings());
}
}
}
+14 -12
View File
@@ -57,6 +57,8 @@ Item {
property real _lastMouseY: 0
property bool _mouseInitialized: false
readonly property bool panelVeryTransparent: Settings.data.ui.panelBackgroundOpacity <= 0.75
onSearchResultsChanged: {
searchSelectedIndex = 0;
ignoreMouseHover = true;
@@ -554,7 +556,9 @@ Item {
ProgramCheckerService.checkAllPrograms();
updateTabsModel();
selectTabById(requestedTab);
if (sidebarExpanded) {
// Skip auto-focus on Nvidia GPUs - cursor blink causes UI choppiness
const isNvidia = SystemStatService.gpuType === "nvidia";
if (sidebarExpanded && !isNvidia) {
Qt.callLater(() => {
if (searchInput.inputItem)
searchInput.inputItem.forceActiveFocus();
@@ -652,16 +656,14 @@ Item {
NBox {
id: sidebar
readonly property bool panelVeryTransparent: Settings.data.ui.panelBackgroundOpacity <= 0.75
clip: true
Layout.preferredWidth: Math.round(root.sidebarExpanded ? 200 * Style.uiScaleRatio : sidebarToggle.width + (panelVeryTransparent ? Style.marginXL : 0) + (sidebarList.verticalScrollBarActive ? Style.marginM : 0))
Layout.preferredWidth: Math.round(root.sidebarExpanded ? 200 * Style.uiScaleRatio : sidebarToggle.width + (root.panelVeryTransparent ? Style.marginXL : 0) + (sidebarList.verticalScrollBarActive ? Style.marginM : 0))
Layout.fillHeight: true
Layout.alignment: Qt.AlignTop
radius: sidebar.panelVeryTransparent ? Style.radiusM : 0
color: sidebar.panelVeryTransparent ? Color.mSurfaceVariant : "transparent"
border.color: sidebar.panelVeryTransparent ? Style.boxBorderColor : "transparent"
radius: root.panelVeryTransparent ? Style.radiusM : 0
color: root.panelVeryTransparent ? Color.mSurfaceVariant : "transparent"
border.color: root.panelVeryTransparent ? Style.boxBorderColor : "transparent"
Behavior on Layout.preferredWidth {
NumberAnimation {
@@ -674,7 +676,7 @@ Item {
ColumnLayout {
anchors.fill: parent
spacing: Style.marginS
anchors.margins: sidebar.panelVeryTransparent ? Style.marginM : 0
anchors.margins: root.panelVeryTransparent ? Style.marginM : 0
// Sidebar toggle button
Item {
@@ -737,7 +739,7 @@ Item {
Layout.fillWidth: true
placeholderText: I18n.tr("common.search")
inputIconName: "search"
visible: root.sidebarExpanded
visible: opacity > 0
opacity: root.sidebarExpanded ? 1.0 : 0.0
Behavior on opacity {
@@ -759,7 +761,7 @@ Item {
id: searchCollapsedContainer
Layout.fillWidth: true
Layout.preferredHeight: Math.round(searchCollapsedRow.implicitHeight + Style.marginS * 2)
visible: !root.sidebarExpanded
visible: opacity > 0
opacity: !root.sidebarExpanded ? 1.0 : 0.0
Behavior on opacity {
@@ -832,7 +834,7 @@ Item {
spacing: Style.marginXS
visible: root.searchText.trim() !== ""
verticalPolicy: ScrollBar.AsNeeded
gradientColor: Color.mSurface
gradientColor: "transparent"
reserveScrollbarSpace: false
HoverHandler {
@@ -932,7 +934,7 @@ Item {
spacing: Style.marginXS
currentIndex: root.currentTabIndex
verticalPolicy: ScrollBar.AsNeeded
gradientColor: Color.mSurface
gradientColor: "transparent"
reserveScrollbarSpace: false
delegate: Rectangle {
@@ -476,17 +476,22 @@ ColumnLayout {
}
}
// Action buttons row
RowLayout {
GridLayout {
id: actionsGrid
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: Style.marginM
Layout.bottomMargin: Style.marginM
spacing: Style.marginM
rowSpacing: Style.marginM
columnSpacing: Style.marginM
columns: (changelogBtn.implicitWidth + copyBtn.implicitWidth + supportBtn.implicitWidth + 2 * columnSpacing) < root.width ? 3 : 1
NButton {
id: changelogBtn
icon: "sparkles"
text: I18n.tr("panels.about.changelog")
outlined: true
Layout.alignment: Qt.AlignHCenter
onClicked: {
var screen = PanelService.openedPanel?.screen || Quickshell.screens[0];
UpdateService.viewChangelog(screen);
@@ -494,16 +499,20 @@ ColumnLayout {
}
NButton {
id: copyBtn
icon: "copy"
text: I18n.tr("panels.about.copy-info")
outlined: true
Layout.alignment: Qt.AlignHCenter
onClicked: root.copyInfoToClipboard()
}
NButton {
id: supportBtn
icon: "heart"
text: I18n.tr("panels.about.support")
outlined: true
Layout.alignment: Qt.AlignHCenter
onClicked: {
Quickshell.execDetached(["xdg-open", "https://buymeacoffee.com/noctalia"]);
ToastService.showNotice(I18n.tr("panels.about.support"), I18n.tr("toast.kofi-opened"));
@@ -67,6 +67,50 @@ ColumnLayout {
defaultValue: Settings.getDefaultValue("bar.density")
onSelected: key => Settings.data.bar.density = key
}
NComboBox {
Layout.fillWidth: true
label: I18n.tr("panels.bar.appearance-type-label")
description: I18n.tr("panels.bar.appearance-type-description")
model: [
{
"key": "simple",
"name": I18n.tr("options.bar.type-simple")
},
{
"key": "floating",
"name": I18n.tr("options.bar.type-floating")
},
{
"key": "framed",
"name": I18n.tr("options.bar.type-framed")
}
]
currentKey: Settings.data.bar.barType
defaultValue: Settings.getDefaultValue("bar.barType")
onSelected: key => {
Settings.data.bar.barType = key;
Settings.data.bar.floating = (key === "floating");
}
}
NComboBox {
Layout.fillWidth: true
label: I18n.tr("panels.bar.appearance-display-mode-label")
description: I18n.tr("panels.bar.appearance-display-mode-description")
model: [
{
"key": "always_visible",
"name": I18n.tr("hide-modes.visible")
},
{
"key": "auto_hide",
"name": I18n.tr("hide-modes.auto-hide")
}
]
currentKey: Settings.data.bar.displayMode
defaultValue: Settings.getDefaultValue("bar.displayMode")
onSelected: key => Settings.data.bar.displayMode = key
}
NToggle {
label: I18n.tr("panels.bar.appearance-use-separate-opacity-label")
@@ -122,30 +166,14 @@ ColumnLayout {
text: Math.floor(Settings.data.bar.capsuleOpacity * 100) + "%"
}
NComboBox {
NToggle {
Layout.fillWidth: true
label: I18n.tr("panels.bar.appearance-type-label") ?? "Bar Type"
description: I18n.tr("panels.bar.appearance-type-description") ?? "Choose the style of the bar: Simple, Floating or Framed"
model: [
{
"key": "simple",
"name": I18n.tr("options.bar.type-simple") ?? "Simple"
},
{
"key": "floating",
"name": I18n.tr("options.bar.type-floating") ?? "Floating"
},
{
"key": "framed",
"name": I18n.tr("options.bar.type-framed") ?? "Framed"
}
]
currentKey: Settings.data.bar.barType
defaultValue: Settings.getDefaultValue("bar.barType")
onSelected: key => {
Settings.data.bar.barType = key;
Settings.data.bar.floating = (key === "floating");
}
visible: CompositorService.isNiri
label: I18n.tr("panels.bar.appearance-hide-on-overview-label")
description: I18n.tr("panels.bar.appearance-hide-on-overview-description")
checked: Settings.data.bar.hideOnOverview
defaultValue: Settings.getDefaultValue("bar.hideOnOverview")
onToggled: checked => Settings.data.bar.hideOnOverview = checked
}
NToggle {
@@ -164,8 +192,8 @@ ColumnLayout {
Layout.fillWidth: true
NLabel {
label: I18n.tr("panels.bar.appearance-frame-settings-label") ?? "Frame Settings"
description: I18n.tr("panels.bar.appearance-frame-settings-description") ?? "Adjust frame thickness and inner corner radius"
label: I18n.tr("panels.bar.appearance-frame-settings-label")
description: I18n.tr("panels.bar.appearance-frame-settings-description")
}
RowLayout {
@@ -174,7 +202,7 @@ ColumnLayout {
NValueSlider {
Layout.fillWidth: true
label: I18n.tr("panels.bar.appearance-frame-thickness") ?? "Thickness"
label: I18n.tr("panels.bar.appearance-frame-thickness")
from: 4
to: 24
stepSize: 1
@@ -186,7 +214,7 @@ ColumnLayout {
NValueSlider {
Layout.fillWidth: true
label: I18n.tr("panels.bar.appearance-frame-radius") ?? "Inner Radius"
label: I18n.tr("panels.bar.appearance-frame-radius")
from: 4
to: 24
stepSize: 1
@@ -238,13 +266,40 @@ ColumnLayout {
}
}
NToggle {
NDivider {
Layout.fillWidth: true
visible: CompositorService.isNiri
label: I18n.tr("panels.bar.appearance-hide-on-overview-label")
description: I18n.tr("panels.bar.appearance-hide-on-overview-description")
checked: Settings.data.bar.hideOnOverview
defaultValue: Settings.getDefaultValue("bar.hideOnOverview")
onToggled: checked => Settings.data.bar.hideOnOverview = checked
Layout.topMargin: Style.marginS
}
ColumnLayout {
visible: Settings.data.bar.displayMode === "auto_hide"
spacing: Style.marginS
Layout.fillWidth: true
NValueSlider {
Layout.fillWidth: true
label: I18n.tr("panels.bar.appearance-auto-hide-delay-label")
description: I18n.tr("panels.bar.appearance-auto-hide-delay-description")
from: 100
to: 2000
stepSize: 100
value: Settings.data.bar.autoHideDelay
defaultValue: Settings.getDefaultValue("bar.autoHideDelay")
onMoved: value => Settings.data.bar.autoHideDelay = value
text: Settings.data.bar.autoHideDelay + "ms"
}
NValueSlider {
Layout.fillWidth: true
label: I18n.tr("panels.bar.appearance-auto-show-delay-label")
description: I18n.tr("panels.bar.appearance-auto-show-delay-description")
from: 0
to: 500
stepSize: 50
value: Settings.data.bar.autoShowDelay
defaultValue: Settings.getDefaultValue("bar.autoShowDelay")
onMoved: value => Settings.data.bar.autoShowDelay = value
text: Settings.data.bar.autoShowDelay + "ms"
}
}
}
+9 -4
View File
@@ -33,13 +33,12 @@ ColumnLayout {
var metadata = BarWidgetRegistry.widgetMetadata[widgetId];
if (metadata) {
Object.keys(metadata).forEach(function (key) {
if (key !== "allowUserSettings") {
newWidget[key] = metadata[key];
}
newWidget[key] = metadata[key];
});
}
}
Settings.data.bar.widgets[section].push(newWidget);
BarService.widgetsRevision++;
}
function _removeWidgetFromSection(section, index) {
@@ -48,9 +47,10 @@ ColumnLayout {
var newArray = widgets[section].slice();
var removedWidgets = newArray.splice(index, 1);
widgets[section] = newArray;
BarService.widgetsRevision++;
if (removedWidgets[0].id === "ControlCenter" && BarService.lookupWidget("ControlCenter") === undefined) {
ToastService.showWarning(I18n.tr("toast.missing-control-center.label"), I18n.tr("toast.missing-control-center.description"), 12000);
ToastService.showWarning(I18n.tr("toast.missing-control-center.label"), I18n.tr("toast.missing-control-center.description"), 6000);
}
}
}
@@ -63,9 +63,12 @@ ColumnLayout {
newArray.splice(fromIndex, 1);
newArray.splice(toIndex, 0, item);
widgets[section] = newArray;
BarService.widgetsRevision++;
}
}
// Note: _updateWidgetSettingsInSection does NOT increment revision
// because it only changes settings, not widget structure
function _updateWidgetSettingsInSection(section, index, settings) {
Settings.data.bar.widgets[section][index] = settings;
}
@@ -80,6 +83,8 @@ ColumnLayout {
var targetArray = widgets[toSection].slice();
targetArray.push(widget);
widgets[toSection] = targetArray;
BarService.widgetsRevision++;
Logger.d("BarTab", "_moveWidgetBetweenSections: revision now", BarService.widgetsRevision);
}
}
@@ -219,7 +219,7 @@ ColumnLayout {
id: chip
Layout.fillWidth: true
Layout.preferredHeight: Math.round(Style.baseWidgetSize * 0.9)
radius: height / 2
radius: Style.iRadiusM
color: chipMouse.containsMouse ? Color.mHover : (isActive ? Color.mPrimary : Color.mSurface)
border.color: isActive ? Color.mPrimary : Color.mOutline
border.width: Style.borderS
@@ -184,9 +184,7 @@ ColumnLayout {
var metadata = ControlCenterWidgetRegistry.widgetMetadata[widgetId];
if (metadata) {
Object.keys(metadata).forEach(function (key) {
if (key !== "allowUserSettings") {
newWidget[key] = metadata[key];
}
newWidget[key] = metadata[key];
});
}
}
@@ -234,9 +234,7 @@ ColumnLayout {
var metadata = DesktopWidgetRegistry.widgetMetadata[widgetId];
if (metadata) {
Object.keys(metadata).forEach(function (key) {
if (key !== "allowUserSettings") {
newWidget[key] = metadata[key];
}
newWidget[key] = metadata[key];
});
}
}
+5 -2
View File
@@ -194,12 +194,15 @@ ColumnLayout {
}
var setupPanel = PanelService.getPanel("setupWizardPanel", targetScreen);
if (setupPanel) {
setupPanel.telemetryOnlyMode = false;
setupPanel.open();
} else {
Qt.callLater(() => {
var sp = PanelService.getPanel("setupWizardPanel", targetScreen);
if (sp)
sp.open();
if (sp) {
sp.telemetryOnlyMode = false;
sp.open();
}
});
}
}
@@ -107,6 +107,14 @@ ColumnLayout {
defaultValue: Settings.getDefaultValue("appLauncher.enableSettingsSearch")
}
NToggle {
label: I18n.tr("panels.launcher.settings-enable-windows-search-label")
description: I18n.tr("panels.launcher.settings-enable-windows-search-description")
checked: Settings.data.appLauncher.enableWindowsSearch
onToggled: checked => Settings.data.appLauncher.enableWindowsSearch = checked
defaultValue: Settings.getDefaultValue("appLauncher.enableWindowsSearch")
}
NToggle {
label: I18n.tr("panels.launcher.settings-ignore-mouse-input-label")
description: I18n.tr("panels.launcher.settings-ignore-mouse-input-description")
@@ -1,5 +1,4 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import qs.Commons
import qs.Services.Noctalia
@@ -234,14 +233,6 @@ ColumnLayout {
Layout.fillWidth: true
}
// Downloaded indicator
NIcon {
icon: "circle-check"
pointSize: Style.baseWidgetSize * 0.5
color: Color.mPrimary
visible: modelData.downloaded === true
}
// Open plugin page button
NIconButton {
icon: "external-link"
@@ -250,22 +241,21 @@ ColumnLayout {
onClicked: Qt.openUrlExternally("https://noctalia.dev/plugins/" + modelData.id + "/")
}
// Install/Uninstall button
// Downloaded indicator
NIcon {
icon: "circle-check"
pointSize: Style.baseWidgetSize * 0.5
color: Color.mPrimary
visible: modelData.downloaded === true
}
// Install button (only shown when not downloaded)
NIconButton {
icon: modelData.downloaded ? "trash" : "download"
visible: modelData.downloaded === false
icon: "download"
baseSize: Style.baseWidgetSize * 0.7
tooltipText: modelData.downloaded ? I18n.tr("common.uninstall") : I18n.tr("common.install")
onClicked: {
if (modelData.downloaded) {
// Construct composite key for available plugins
var pluginData = Object.assign({}, modelData);
pluginData.compositeKey = PluginRegistry.generateCompositeKey(modelData.id, modelData.source?.url || "");
uninstallDialog.pluginToUninstall = pluginData;
uninstallDialog.open();
} else {
installPlugin(modelData);
}
}
tooltipText: I18n.tr("common.install")
onClicked: installPlugin(modelData)
}
}
@@ -346,64 +336,6 @@ ColumnLayout {
}
}
// Uninstall confirmation dialog
Popup {
id: uninstallDialog
parent: Overlay.overlay
modal: true
dim: false
anchors.centerIn: parent
width: 400 * Style.uiScaleRatio
padding: Style.marginL
property var pluginToUninstall: null
background: Rectangle {
color: Color.mSurface
radius: Style.radiusS
border.color: Color.mPrimary
border.width: Style.borderM
}
contentItem: ColumnLayout {
width: parent.width
spacing: Style.marginL
NHeader {
label: I18n.tr("panels.plugins.uninstall-dialog-title")
description: I18n.tr("panels.plugins.uninstall-dialog-description", {
"plugin": uninstallDialog.pluginToUninstall?.name || ""
})
}
RowLayout {
spacing: Style.marginM
Layout.fillWidth: true
Item {
Layout.fillWidth: true
}
NButton {
text: I18n.tr("common.cancel")
onClicked: uninstallDialog.close()
}
NButton {
text: I18n.tr("common.uninstall")
backgroundColor: Color.mPrimary
textColor: Color.mOnPrimary
onClicked: {
if (uninstallDialog.pluginToUninstall) {
uninstallPlugin(uninstallDialog.pluginToUninstall.compositeKey);
uninstallDialog.close();
}
}
}
}
}
}
// Timer to check for updates after refresh starts
Timer {
id: checkUpdatesTimer
@@ -433,27 +365,6 @@ ColumnLayout {
});
}
function uninstallPlugin(pluginId) {
var manifest = PluginRegistry.getPluginManifest(pluginId);
var pluginName = manifest?.name || pluginId;
ToastService.showNotice(I18n.tr("panels.plugins.title"), I18n.tr("panels.plugins.uninstalling", {
"plugin": pluginName
}));
PluginService.uninstallPlugin(pluginId, function (success, error) {
if (success) {
ToastService.showNotice(I18n.tr("panels.plugins.title"), I18n.tr("panels.plugins.uninstall-success", {
"plugin": pluginName
}));
} else {
ToastService.showError(I18n.tr("panels.plugins.title"), I18n.tr("panels.plugins.uninstall-error", {
"error": error || "Unknown error"
}));
}
});
}
// Listen to plugin service signals
Connections {
target: PluginService
@@ -41,7 +41,7 @@ ColumnLayout {
"count": updateCount
})
icon: "download"
visible: updateCount >= 2
visible: (updateCount > 0)
enabled: !isUpdating
backgroundColor: Color.mPrimary
textColor: Color.mOnPrimary
@@ -457,6 +457,8 @@ ColumnLayout {
var manifest = PluginRegistry.getPluginManifest(pluginId);
var pluginName = manifest?.name || pluginId;
BarService.widgetsRevision++;
ToastService.showNotice(I18n.tr("panels.plugins.title"), I18n.tr("panels.plugins.uninstalling", {
"plugin": pluginName
}));
@@ -36,28 +36,6 @@ ColumnLayout {
}
}
// Temperature Polling
RowLayout {
Layout.fillWidth: true
spacing: Style.marginM
NText {
Layout.fillWidth: true
text: I18n.tr("bar.system-monitor.cpu-temperature-label")
pointSize: Style.fontSizeM
}
NSpinBox {
from: 250
to: 10000
stepSize: 250
value: Settings.data.systemMonitor.tempPollingInterval
defaultValue: Settings.getDefaultValue("systemMonitor.tempPollingInterval")
onValueChanged: Settings.data.systemMonitor.tempPollingInterval = value
suffix: " ms"
}
}
// GPU Polling
RowLayout {
Layout.fillWidth: true
+298 -356
View File
@@ -12,11 +12,11 @@ SmartPanel {
id: root
preferredWidth: Math.round(440 * Style.uiScaleRatio)
preferredHeight: Math.round(420 * Style.uiScaleRatio)
panelContent: Item {
id: panelContent
property real contentPreferredHeight: mainColumn.implicitHeight + Style.marginL * 2
readonly property real cardHeight: 90 * Style.uiScaleRatio
// Get diskPath from bar's SystemMonitor widget if available, otherwise use "/"
readonly property string diskPath: {
@@ -69,398 +69,340 @@ SmartPanel {
}
}
// Stats Grid + Bottom section
// CPU Card (dual-line: usage % + temperature °C)
NBox {
Layout.fillWidth: true
Layout.preferredHeight: statsContainer.implicitHeight + (Style.marginXL)
Layout.preferredHeight: panelContent.cardHeight
ColumnLayout {
id: statsContainer
anchors.fill: parent
anchors.margins: Style.marginS
spacing: Style.marginXS
RowLayout {
Layout.fillWidth: true
spacing: Style.marginXS
NIcon {
icon: "cpu-usage"
pointSize: Style.fontSizeXS
color: Color.mPrimary
}
NText {
text: `${Math.round(SystemStatService.cpuUsage)}%`
pointSize: Style.fontSizeXS
color: Color.mPrimary
Layout.rightMargin: Style.marginS
}
NIcon {
icon: "cpu-temperature"
pointSize: Style.fontSizeXS
color: Color.mError
}
NText {
text: `${Math.round(SystemStatService.cpuTemp)}°C`
pointSize: Style.fontSizeXS
color: Color.mError
Layout.rightMargin: Style.marginS
}
NIcon {
icon: "bolt"
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
NText {
text: SystemStatService.cpuFreq
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
Item {
Layout.fillWidth: true
}
NText {
text: I18n.tr("system-monitor.cpu-usage")
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
}
NGraph {
Layout.fillWidth: true
Layout.fillHeight: true
values: SystemStatService.cpuHistory
values2: SystemStatService.cpuTempHistory
minValue: 0
maxValue: Math.max(SystemStatService.cpuHistoryMax, 1)
minValue2: Math.max(SystemStatService.cpuTempHistoryMin - 5, 0)
maxValue2: Math.max(SystemStatService.cpuTempHistoryMax + 5, 1)
color: Color.mPrimary
color2: Color.mError
fill: true
fillOpacity: 0.15
}
}
}
// Memory Card (single-line + optional swap indicator)
NBox {
Layout.fillWidth: true
Layout.preferredHeight: panelContent.cardHeight
ColumnLayout {
anchors.fill: parent
anchors.margins: Style.marginS
spacing: Style.marginXS
RowLayout {
Layout.fillWidth: true
spacing: Style.marginXS
NIcon {
icon: "memory"
pointSize: Style.fontSizeXS
color: Color.mPrimary
}
NText {
text: `${Math.round(SystemStatService.memPercent)}% ${SystemStatService.formatMemoryGb(SystemStatService.memGb).replace(/[^0-9.]/g, "")} GB`
pointSize: Style.fontSizeXS
color: Color.mPrimary
}
NIcon {
visible: SystemStatService.swapTotalGb > 0
icon: "exchange"
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
NText {
visible: SystemStatService.swapTotalGb > 0
text: `${Math.round(SystemStatService.swapPercent)}%`
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
Item {
Layout.fillWidth: true
}
NText {
text: I18n.tr("common.memory")
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
}
NGraph {
Layout.fillWidth: true
Layout.fillHeight: true
values: SystemStatService.memHistory
minValue: 0
maxValue: Math.max(SystemStatService.memHistoryMax, 1)
color: Color.mPrimary
fill: true
fillOpacity: 0.15
}
}
}
// Network Card (dual-line: RX + TX speeds)
NBox {
Layout.fillWidth: true
Layout.preferredHeight: panelContent.cardHeight
ColumnLayout {
anchors.fill: parent
anchors.margins: Style.marginS
spacing: Style.marginXS
RowLayout {
Layout.fillWidth: true
spacing: Style.marginXS
NIcon {
icon: "download-speed"
pointSize: Style.fontSizeXS
color: Color.mPrimary
}
NText {
text: SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s"
pointSize: Style.fontSizeXS
color: Color.mPrimary
Layout.rightMargin: Style.marginS
}
NIcon {
icon: "upload-speed"
pointSize: Style.fontSizeXS
color: Color.mError
}
NText {
text: SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s"
pointSize: Style.fontSizeXS
color: Color.mError
}
Item {
Layout.fillWidth: true
}
NText {
text: I18n.tr("common.network")
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
}
NGraph {
Layout.fillWidth: true
Layout.fillHeight: true
values: SystemStatService.rxSpeedHistory
values2: SystemStatService.txSpeedHistory
minValue: 0
maxValue: Math.max(SystemStatService.rxMaxSpeed, 1)
minValue2: 0
maxValue2: Math.max(SystemStatService.txMaxSpeed, 1)
color: Color.mPrimary
color2: Color.mError
fill: true
fillOpacity: 0.15
}
}
}
// Detailed Stats section
NBox {
Layout.fillWidth: true
implicitHeight: detailsColumn.implicitHeight + Style.marginXL
ColumnLayout {
id: detailsColumn
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.margins: Style.marginM
spacing: Style.marginM
spacing: Style.marginS
// Top row: 5 NCircleStat gauges
// Load Average
RowLayout {
id: topRow
Layout.fillWidth: true
spacing: Style.marginS
visible: SystemStatService.nproc > 0
// CPU Usage
Item {
Layout.fillWidth: true
implicitHeight: cpuUsageGauge.implicitHeight
NCircleStat {
id: cpuUsageGauge
anchors.centerIn: parent
ratio: SystemStatService.cpuUsage / 100
icon: "cpu-usage"
suffix: "%"
fillColor: SystemStatService.cpuColor
tooltipText: I18n.tr("system-monitor.cpu-usage") + `: ${Math.round(SystemStatService.cpuUsage)}%`
}
Connections {
target: SystemStatService
function onCpuUsageChanged() {
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === cpuUsageGauge) {
TooltipService.updateText(I18n.tr("system-monitor.cpu-usage") + `: ${Math.round(SystemStatService.cpuUsage)}%`);
}
}
}
NIcon {
icon: "cpu-usage"
pointSize: Style.fontSizeM
color: Color.mPrimary
}
// CPU Temperature
Item {
Layout.fillWidth: true
implicitHeight: cpuTempGauge.implicitHeight
NCircleStat {
id: cpuTempGauge
anchors.centerIn: parent
ratio: SystemStatService.cpuTemp / 100
icon: "cpu-temperature"
suffix: "\u00B0"
fillColor: SystemStatService.tempColor
tooltipText: I18n.tr("system-monitor.cpu-temp") + `: ${Math.round(SystemStatService.cpuTemp)}°C`
}
Connections {
target: SystemStatService
function onCpuTempChanged() {
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === cpuTempGauge) {
TooltipService.updateText(I18n.tr("system-monitor.cpu-temp") + `: ${Math.round(SystemStatService.cpuTemp)}°C`);
}
}
}
NText {
text: I18n.tr("system-monitor.load-average") + ":"
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
// GPU Temperature
Item {
NText {
text: `${SystemStatService.loadAvg1.toFixed(2)} ${SystemStatService.loadAvg5.toFixed(2)} ${SystemStatService.loadAvg15.toFixed(2)}`
pointSize: Style.fontSizeXS
color: Color.mOnSurface
Layout.fillWidth: true
implicitHeight: gpuTempGauge.implicitHeight
visible: SystemStatService.gpuAvailable
NCircleStat {
id: gpuTempGauge
anchors.centerIn: parent
ratio: SystemStatService.gpuTemp / 100
icon: "gpu-temperature"
suffix: "\u00B0"
fillColor: SystemStatService.gpuColor
tooltipText: I18n.tr("system-monitor.gpu-temp") + `: ${Math.round(SystemStatService.gpuTemp)}°C`
}
Connections {
target: SystemStatService
function onGpuTempChanged() {
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === gpuTempGauge) {
TooltipService.updateText(I18n.tr("system-monitor.gpu-temp") + `: ${Math.round(SystemStatService.gpuTemp)}°C`);
}
}
}
}
// Memory Usage
Item {
Layout.fillWidth: true
implicitHeight: memPercentGauge.implicitHeight
NCircleStat {
id: memPercentGauge
anchors.centerIn: parent
ratio: SystemStatService.memPercent / 100
icon: "memory"
suffix: "%"
fillColor: SystemStatService.memColor
tooltipText: I18n.tr("common.memory") + `: ${Math.round(SystemStatService.memPercent)}%`
}
Connections {
target: SystemStatService
function onMemPercentChanged() {
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === memPercentGauge) {
TooltipService.updateText(I18n.tr("common.memory") + `: ${Math.round(SystemStatService.memPercent)}%`);
}
}
}
}
// Swap Usage (only visible if swap is enabled)
Item {
Layout.fillWidth: true
implicitHeight: swapPercentGauge.implicitHeight
visible: SystemStatService.swapTotalGb > 0
NCircleStat {
id: swapPercentGauge
anchors.centerIn: parent
ratio: SystemStatService.swapPercent / 100
icon: "exchange"
suffix: "%"
fillColor: SystemStatService.swapColor
tooltipText: I18n.tr("bar.system-monitor.swap-usage-label") + `: ${Math.round(SystemStatService.swapPercent)}%`
}
Connections {
target: SystemStatService
function onSwapPercentChanged() {
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === swapPercentGauge) {
TooltipService.updateText(I18n.tr("bar.system-monitor.swap-usage-label") + `: ${Math.round(SystemStatService.swapPercent)}%`);
}
}
}
}
// Disk Usage
Item {
Layout.fillWidth: true
implicitHeight: diskPercentsGauge.implicitHeight
NCircleStat {
id: diskPercentsGauge
anchors.centerIn: parent
ratio: (SystemStatService.diskPercents[panelContent.diskPath] ?? 0) / 100
icon: "storage"
suffix: "%"
fillColor: SystemStatService.getDiskColor(panelContent.diskPath)
tooltipText: I18n.tr("system-monitor.disk") + `: ${SystemStatService.diskPercents[panelContent.diskPath] || 0}%\n${panelContent.diskPath}`
}
Connections {
target: SystemStatService
function onDiskPercentsChanged() {
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === diskPercentsGauge) {
TooltipService.updateText(I18n.tr("system-monitor.disk") + `: ${SystemStatService.diskPercents[panelContent.diskPath] || 0}%\n${panelContent.diskPath}`);
}
}
}
horizontalAlignment: Text.AlignRight
}
}
// Divider
NDivider {
Layout.fillWidth: true
Layout.topMargin: Style.marginS
Layout.bottomMargin: Style.marginXS
}
// Bottom row: 2 NCircleStat (download/upload) with speeds below + Detailed Stats
// Disk usage
RowLayout {
id: bottomRow
Layout.fillWidth: true
spacing: Style.marginS
// Number of visible gauges in top row
readonly property int topRowGaugeCount: {
let count = 4; // CPU, CPU Temp, Memory, Disk
if (SystemStatService.gpuAvailable)
count++;
if (SystemStatService.swapTotalGb > 0)
count++;
return count;
NIcon {
icon: "storage"
pointSize: Style.fontSizeM
color: Color.mPrimary
}
// Download gauge with speed below (same width as top row items)
Item {
Layout.fillWidth: true
implicitHeight: downloadColumn.implicitHeight
ColumnLayout {
id: downloadColumn
anchors.centerIn: parent
spacing: Style.marginS
NCircleStat {
id: rxSpeedGauge
ratio: SystemStatService.rxRatio
icon: "download-speed"
suffix: "%"
fillColor: Color.mPrimary
tooltipText: I18n.tr("common.download") + `: ${SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s"
Layout.alignment: Qt.AlignHCenter
}
NText {
text: SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s"
pointSize: Style.fontSizeXXS
color: Color.mOnSurfaceVariant
Layout.alignment: Qt.AlignHCenter
}
Connections {
target: SystemStatService
function onRxSpeedChanged() {
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === rxSpeedGauge) {
TooltipService.updateText(I18n.tr("common.download") + `: ${SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s");
}
}
}
}
NText {
text: I18n.tr("system-monitor.disk") + ":"
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
// Upload gauge with speed below (same width as top row items)
Item {
Layout.fillWidth: true
implicitHeight: uploadColumn.implicitHeight
ColumnLayout {
id: uploadColumn
anchors.centerIn: parent
spacing: Style.marginS
NCircleStat {
id: txSpeedGauge
ratio: SystemStatService.txRatio
icon: "upload-speed"
suffix: "%"
fillColor: Color.mPrimary
tooltipText: I18n.tr("common.upload") + `: ${SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s"
Layout.alignment: Qt.AlignHCenter
}
NText {
text: SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s"
pointSize: Style.fontSizeXXS
color: Color.mOnSurfaceVariant
Layout.alignment: Qt.AlignHCenter
}
Connections {
target: SystemStatService
function onTxSpeedChanged() {
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === txSpeedGauge) {
TooltipService.updateText(I18n.tr("common.upload") + `: ${SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s");
}
}
}
NText {
text: {
const usedGb = SystemStatService.diskUsedGb[panelContent.diskPath] || 0;
const sizeGb = SystemStatService.diskSizeGb[panelContent.diskPath] || 0;
const percent = SystemStatService.diskPercents[panelContent.diskPath] || 0;
return `${percent}% (${usedGb.toFixed(1)} / ${sizeGb.toFixed(1)} GB)`;
}
pointSize: Style.fontSizeXS
color: Color.mOnSurface
Layout.fillWidth: true
horizontalAlignment: Text.AlignRight
elide: Text.ElideMiddle
}
}
// GPU Temperature (only if available)
RowLayout {
Layout.fillWidth: true
spacing: Style.marginS
visible: SystemStatService.gpuAvailable
NIcon {
icon: "gpu-temperature"
pointSize: Style.fontSizeM
color: Color.mPrimary
}
// Detailed Stats column (takes remaining space equivalent to topRowGaugeCount - 2 items)
Item {
NText {
text: I18n.tr("system-monitor.gpu-temp") + ":"
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
NText {
text: `${Math.round(SystemStatService.gpuTemp)}°C`
pointSize: Style.fontSizeXS
color: Color.mOnSurface
Layout.fillWidth: true
Layout.fillHeight: true
Layout.preferredWidth: bottomRow.topRowGaugeCount - 2 // Match remaining top row slots
horizontalAlignment: Text.AlignRight
}
}
ColumnLayout {
id: detailsColumn
anchors.fill: parent
spacing: -Style.marginM
// Swap details (only visible if swap is enabled)
RowLayout {
Layout.fillWidth: true
spacing: Style.marginS
visible: SystemStatService.swapTotalGb > 0
// Load average
RowLayout {
Layout.fillWidth: true
spacing: Style.marginS
visible: SystemStatService.nproc > 0
NIcon {
icon: "exchange"
pointSize: Style.fontSizeM
color: Color.mPrimary
}
NIcon {
icon: "cpu-usage"
pointSize: Style.fontSizeM
color: Color.mOnSurfaceVariant
}
NText {
text: I18n.tr("bar.system-monitor.swap-usage-label") + ":"
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
NText {
text: I18n.tr("system-monitor.load-average") + ":"
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
NText {
text: `${SystemStatService.loadAvg1.toFixed(2)} · ${SystemStatService.loadAvg5.toFixed(2)} · ${SystemStatService.loadAvg15.toFixed(2)}`
pointSize: Style.fontSizeXS
color: Color.mOnSurface
Layout.fillWidth: true
horizontalAlignment: Text.AlignRight
}
}
// Memory details
RowLayout {
Layout.fillWidth: true
spacing: Style.marginS
NIcon {
icon: "memory"
pointSize: Style.fontSizeM
color: Color.mOnSurfaceVariant
}
NText {
text: I18n.tr("common.memory") + ":"
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
NText {
text: SystemStatService.formatGigabytes(SystemStatService.memGb).replace(/[^0-9.]/g, "") + " GB"
pointSize: Style.fontSizeXS
color: Color.mOnSurface
Layout.fillWidth: true
horizontalAlignment: Text.AlignRight
}
}
// Swap details (only visible if swap is enabled)
RowLayout {
Layout.fillWidth: true
spacing: Style.marginS
visible: SystemStatService.swapTotalGb > 0
NIcon {
icon: "exchange"
pointSize: Style.fontSizeM
color: Color.mOnSurfaceVariant
}
NText {
text: I18n.tr("bar.system-monitor.swap-usage-label") + ":"
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
NText {
text: `${SystemStatService.formatGigabytes(SystemStatService.swapGb).replace(/[^0-9.]/g, "") + " GB"} / ${SystemStatService.formatGigabytes(SystemStatService.swapTotalGb).replace(/[^0-9.]/g, "") + " GB"}`
pointSize: Style.fontSizeXS
color: Color.mOnSurface
Layout.fillWidth: true
horizontalAlignment: Text.AlignRight
}
}
// Disk details
RowLayout {
Layout.fillWidth: true
spacing: Style.marginS
NIcon {
icon: "storage"
pointSize: Style.fontSizeM
color: Color.mOnSurfaceVariant
}
NText {
text: I18n.tr("system-monitor.disk") + ":"
pointSize: Style.fontSizeXS
color: Color.mOnSurfaceVariant
}
NText {
text: {
const usedGb = SystemStatService.diskUsedGb[panelContent.diskPath] || 0;
const sizeGb = SystemStatService.diskSizeGb[panelContent.diskPath] || 0;
return `${usedGb.toFixed(1)} GB / ${sizeGb.toFixed(1)} GB`;
}
pointSize: Style.fontSizeXS
color: Color.mOnSurface
Layout.fillWidth: true
horizontalAlignment: Text.AlignRight
}
}
}
NText {
text: `${SystemStatService.formatMemoryGb(SystemStatService.swapGb).replace(/[^0-9.]/g, "")} / ${SystemStatService.formatMemoryGb(SystemStatService.swapTotalGb).replace(/[^0-9.]/g, "")} GB`
pointSize: Style.fontSizeXS
color: Color.mOnSurface
Layout.fillWidth: true
horizontalAlignment: Text.AlignRight
}
}
}
@@ -752,6 +752,50 @@ SmartPanel {
}
}
NIconButton {
property string sortOrder: Settings.data.wallpaper.sortOrder || "name"
icon: {
if (sortOrder === "date_desc")
return "clock";
if (sortOrder === "date_asc")
return "history";
if (sortOrder === "name_desc")
return "sort-descending";
return "sort-ascending";
}
tooltipText: {
if (sortOrder === "date_desc")
return "Sort: Newest First";
if (sortOrder === "date_asc")
return "Sort: Oldest First";
if (sortOrder === "name_desc")
return "Sort: Name (Z-A)";
return "Sort: Name (A-Z)";
}
baseSize: Style.baseWidgetSize * 0.8
onClicked: {
var next = "name";
if (sortOrder === "name")
next = "date_desc";
else if (sortOrder === "date_desc")
next = "name"; // Toggle simpler: Name -> Newest -> Name
// Expanded cycle: Name -> Newest -> Oldest -> Z-A -> Name
// User just asked for "newest first", so let's make it easy to reach.
// Let's do: Name (A-Z) -> Newest -> Oldest -> Name (Z-A) -> ...
if (sortOrder === "name")
next = "date_desc";
else if (sortOrder === "date_desc")
next = "date_asc";
else if (sortOrder === "date_asc")
next = "name_desc";
else
next = "name";
Settings.data.wallpaper.sortOrder = next;
}
}
NIconButton {
icon: getViewModeIcon()
tooltipText: getViewModeTooltip()
@@ -2,6 +2,7 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import qs.Commons
import qs.Services.System
import qs.Widgets
Item {
@@ -27,6 +28,29 @@ Item {
opacity: 0
scale: initialScale
property real progress: 1.0
property int hoverCount: 0
onHoverCountChanged: {
if (hoverCount > 0) {
resumeTimer.stop();
progressAnimation.pause();
} else {
resumeTimer.start();
}
}
Timer {
id: resumeTimer
interval: 50
repeat: false
onTriggered: {
if (hoverCount === 0) {
progressAnimation.resume();
}
}
}
// Background rectangle (apply shadows here)
Rectangle {
id: background
@@ -40,9 +64,6 @@ Item {
border.color: {
var baseColor;
switch (root.type) {
case "warning":
baseColor = Color.mPrimary;
break;
case "error":
baseColor = Color.mError;
break;
@@ -52,6 +73,40 @@ Item {
}
return Qt.alpha(baseColor, Settings.data.notifications.backgroundOpacity || 1.0);
}
// Progress bar
Rectangle {
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
height: 2
color: "transparent"
Rectangle {
id: progressBar
readonly property real progressWidth: background.width - (2 * background.radius)
height: parent.height
// Mirrored logic: centers the bar as it shrinks
x: background.radius + (progressWidth * (1 - root.progress)) / 2
width: progressWidth * root.progress
color: {
var baseColor;
switch (root.type) {
case "warning":
baseColor = Color.mPrimary;
break;
case "error":
baseColor = Color.mError;
break;
default:
baseColor = Color.mPrimary; // Match standard notification color
break;
}
return Qt.alpha(baseColor, Settings.data.notifications.backgroundOpacity || 1.0);
}
}
}
}
NDropShadow {
@@ -60,6 +115,23 @@ Item {
autoPaddingEnabled: true
}
NumberAnimation {
id: progressAnimation
target: root
property: "progress"
from: 1.0
to: 0.0
duration: root.duration
easing.type: Easing.Linear
onFinished: {
if (root.progress === 0.0 && root.visible) {
root.hide();
}
}
}
// Timer: hideTimer removed, using progressAnimation
Behavior on opacity {
NumberAnimation {
duration: Style.animationNormal
@@ -74,12 +146,6 @@ Item {
}
}
Timer {
id: hideTimer
interval: root.duration
onTriggered: root.hide()
}
Timer {
id: hideAnimation
interval: Style.animationFast
@@ -91,7 +157,7 @@ Item {
// Cleanup on destruction
Component.onDestruction: {
hideTimer.stop();
progressAnimation.stop();
hideAnimation.stop();
}
@@ -100,8 +166,12 @@ Item {
anchors.fill: background
acceptedButtons: Qt.LeftButton
hoverEnabled: true
onEntered: hideTimer.stop()
onExited: hideTimer.restart()
onEntered: {
root.hoverCount++;
}
onExited: {
root.hoverCount--;
}
onClicked: root.hide()
cursorShape: Qt.PointingHandCursor
}
@@ -176,6 +246,10 @@ Item {
hoverColor: Color.mHover
outlined: false
implicitHeight: 24
onEntered: root.hoverCount++
onExited: root.hoverCount--
onClicked: {
if (root.actionCallback) {
root.actionCallback();
@@ -188,7 +262,7 @@ Item {
function show(msgTitle, msgDescription, msgIcon, msgType, msgDuration, msgActionLabel, msgActionCallback) {
// Stop all timers first
hideTimer.stop();
progressAnimation.stop();
hideAnimation.stop();
title = msgTitle;
@@ -202,23 +276,28 @@ Item {
visible = true;
opacity = 1.0;
scale = 1.0;
progress = 1.0;
hoverCount = 0;
hideTimer.restart();
// Configure and start animation
progressAnimation.duration = duration;
progressAnimation.from = 1.0;
progressAnimation.to = 0.0;
progressAnimation.restart();
}
function hide() {
hideTimer.stop();
progressAnimation.stop();
opacity = 0;
scale = initialScale;
hideAnimation.restart();
}
function hideImmediately() {
hideTimer.stop();
hideAnimation.stop();
progressAnimation.stop();
opacity = 0;
scale = initialScale;
root.visible = false;
root.hidden();
}
}
+1 -1
View File
@@ -229,7 +229,7 @@ Item {
toastItem.hideImmediately();
}
SimpleToast {
Toast {
id: toastItem
onHidden: root.onToastHidden()
}
+258 -121
View File
@@ -1,4 +1,5 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import qs.Commons
import qs.Widgets
@@ -7,16 +8,42 @@ PopupWindow {
id: root
property string text: ""
property var rows: null // Array of arrays for grid mode: [["col1", "col2"], ["row2col1", "row2col2"]]
property bool isGridMode: rows !== null && Array.isArray(rows) && rows.length > 0
property int columnCount: isGridMode && rows.length > 0 ? rows[0].length : 0
property string direction: "auto" // "auto", "left", "right", "top", "bottom"
property int margin: Style.marginXS // distance from target
property int padding: Style.marginM
property int gridPaddingVertical: Style.marginXS // extra vertical padding for grid mode
property int delay: 0
property int hideDelay: 0
property int maxWidth: 320
property int maxWidth: 340
property int animationDuration: Style.animationFast
property real animationScale: 0.85
// Font scale calculation matching NText behavior
readonly property real gridFontScale: {
const baseScale = (tooltipText.family === Settings.data.ui.fontDefault ? Settings.data.ui.fontDefaultScale : Settings.data.ui.fontFixedScale);
return baseScale * Style.uiScaleRatio;
}
// For measuring grid cell widths - must match actual NText font
TextMetrics {
id: cellMetrics
font.family: tooltipText.family
font.pointSize: Math.max(1, Style.fontSizeS * gridFontScale)
}
// For measuring grid row height - hidden NText matches actual grid items exactly
NText {
id: rowHeightMeasure
visible: false
text: "Ag" // Characters with ascenders and descenders
pointSize: Style.fontSizeS
family: tooltipText.family
}
// Internal properties
property var targetItem: null
property real anchorX: 0
@@ -106,9 +133,9 @@ PopupWindow {
}
}
// Function to show tooltip
function show(target, tipText, customDirection, showDelay, fontFamily) {
if (!target || !tipText || tipText === "")
// Function to show tooltip (content can be string or array of arrays for grid mode)
function show(target, content, customDirection, showDelay, fontFamily) {
if (!target || !content || content === "" || (Array.isArray(content) && content.length === 0))
return;
root.delay = showDelay;
@@ -124,11 +151,17 @@ PopupWindow {
hideImmediately();
}
// Convert \n to <br> for RichText format
const processedText = tipText.replace(/\n/g, '<br>');
// Set content based on type
if (Array.isArray(content)) {
rows = content;
text = "";
} else {
// Convert \n to <br> for RichText format
const processedText = content.replace(/\n/g, '<br>');
text = processedText;
rows = null;
}
// Set properties
text = processedText;
targetItem = target;
// Find the correct screen dimensions based on target's global position
@@ -166,17 +199,68 @@ PopupWindow {
tooltipText.family = fontFamily ? fontFamily : Settings.data.ui.fontDefault;
}
// Calculate grid dimensions using measurements that match actual NText rendering
function calculateGridSize() {
if (!rows || rows.length === 0)
return {
width: 0,
height: 0
};
const numCols = rows[0].length;
const numRows = rows.length;
let columnWidths = [];
// Find max width for each column using TextMetrics
for (let col = 0; col < numCols; col++) {
let maxWidth = 0;
for (let row = 0; row < numRows; row++) {
cellMetrics.text = rows[row][col] || "";
if (cellMetrics.width > maxWidth) {
maxWidth = cellMetrics.width;
}
}
columnWidths.push(maxWidth);
}
// Calculate total width: sum of columns + spacing between columns
let totalWidth = 0;
for (let i = 0; i < columnWidths.length; i++) {
totalWidth += columnWidths[i];
}
totalWidth += (numCols - 1) * Style.marginM; // columnSpacing
// Calculate total height using hidden NText for accurate row height
const rowHeight = rowHeightMeasure.implicitHeight;
const totalHeight = numRows * rowHeight;
return {
width: totalWidth,
height: totalHeight
};
}
// Function to position and display the tooltip
function positionAndShow() {
if (!targetItem || !targetItem.parent) {
return;
}
// Calculate tooltip dimensions
const tipWidth = Math.min(tooltipText.implicitWidth + (padding * 2), maxWidth);
// Calculate tooltip dimensions based on content mode
let contentWidth, contentHeight;
if (isGridMode) {
const gridSize = calculateGridSize();
contentWidth = gridSize.width;
contentHeight = gridSize.height;
} else {
contentWidth = tooltipText.implicitWidth;
contentHeight = tooltipText.implicitHeight;
}
const tipWidth = Math.min(contentWidth + (padding * 2), maxWidth);
root.implicitWidth = tipWidth;
const tipHeight = tooltipText.implicitHeight + (padding * 2);
const tipHeight = contentHeight + (padding * 2);
root.implicitHeight = tipHeight;
// Get target's global position and convert to screen-relative
@@ -377,6 +461,7 @@ PopupWindow {
visible = false;
animatingOut = false;
text = "";
rows = null;
isPositioned = false;
tooltipContainer.opacity = 1.0;
tooltipContainer.scale = 1.0;
@@ -392,120 +477,147 @@ PopupWindow {
completeHide();
}
// Update text function
function updateText(newText) {
// Update content function (supports both text and rows)
function updateContent(newContent) {
if (visible && targetItem) {
// Convert \n to <br> for RichText format
const processedText = newText.replace(/\n/g, '<br>');
text = processedText;
// Recalculate dimensions
const tipWidth = Math.min(tooltipText.implicitWidth + (padding * 2), maxWidth);
root.implicitWidth = tipWidth;
const tipHeight = tooltipText.implicitHeight + (padding * 2);
root.implicitHeight = tipHeight;
// Reposition based on current direction (screen-relative)
var targetGlobalAbs = targetItem.mapToGlobal(0, 0);
var targetGlobal = {
"x": targetGlobalAbs.x - screenX,
"y": targetGlobalAbs.y - screenY
};
const targetWidth = targetItem.width;
const targetHeight = targetItem.height;
// Recalculate base anchor position (center on target for top/bottom, etc.)
var newAnchorX = anchorX;
var newAnchorY = anchorY;
// Determine which direction the tooltip is currently positioned
// and recalculate the centering for that direction
var isHorizontalTooltip = false;
var isVerticalTooltip = false;
if (anchorY > targetHeight / 2) {
// Tooltip is below target
newAnchorX = (targetWidth - tipWidth) / 2;
isHorizontalTooltip = true;
} else if (anchorY < -tipHeight / 2) {
// Tooltip is above target
newAnchorX = (targetWidth - tipWidth) / 2;
isHorizontalTooltip = true;
} else if (anchorX > targetWidth / 2) {
// Tooltip is to the right
newAnchorY = (targetHeight - tipHeight) / 2;
isVerticalTooltip = true;
} else if (anchorX < -tipWidth / 2) {
// Tooltip is to the left
newAnchorY = (targetHeight - tipHeight) / 2;
isVerticalTooltip = true;
if (Array.isArray(newContent)) {
rows = newContent;
text = "";
} else {
// Convert \n to <br> for RichText format
const processedText = newContent.replace(/\n/g, '<br>');
text = processedText;
rows = null;
}
// Adjust horizontal position to keep tooltip on screen if needed
// For top/bottom tooltips, always adjust horizontally (they don't overlap horizontally)
// For left/right tooltips, check for overlap before adjusting
const globalX = targetGlobal.x + newAnchorX;
if (globalX < 0) {
const adjustedX = -targetGlobal.x + margin;
if (isHorizontalTooltip) {
newAnchorX = adjustedX;
} else {
const wouldOverlap = adjustedX < targetWidth && adjustedX + tipWidth > 0;
if (!wouldOverlap) {
newAnchorX = adjustedX;
}
}
} else if (globalX + tipWidth > screenWidth) {
const adjustedX = screenWidth - targetGlobal.x - tipWidth - margin;
if (isHorizontalTooltip) {
newAnchorX = adjustedX;
} else {
const wouldOverlap = adjustedX < targetWidth && adjustedX + tipWidth > 0;
if (!wouldOverlap) {
newAnchorX = adjustedX;
}
}
}
// Adjust vertical position to keep tooltip on screen if needed
// For left/right tooltips, always adjust vertically (they don't overlap vertically)
// For top/bottom tooltips, check for overlap before adjusting
const globalY = targetGlobal.y + newAnchorY;
if (globalY < 0) {
const adjustedY = -targetGlobal.y + margin;
if (isVerticalTooltip) {
newAnchorY = adjustedY;
} else {
const wouldOverlap = adjustedY < targetHeight && adjustedY + tipHeight > 0;
if (!wouldOverlap) {
newAnchorY = adjustedY;
}
}
} else if (globalY + tipHeight > screenHeight) {
const adjustedY = screenHeight - targetGlobal.y - tipHeight - margin;
if (isVerticalTooltip) {
newAnchorY = adjustedY;
} else {
const wouldOverlap = adjustedY < targetHeight && adjustedY + tipHeight > 0;
if (!wouldOverlap) {
newAnchorY = adjustedY;
}
}
}
// Apply the new anchor positions
anchorX = newAnchorX;
anchorY = newAnchorY;
// Force anchor update
Qt.callLater(() => {
if (root.anchor && root.visible) {
root.anchor.updateAnchor();
}
});
// Defer dimension recalculation to allow GridLayout to update
Qt.callLater(updateContentDeferred);
}
}
function updateContentDeferred() {
if (!visible || !targetItem) {
return;
}
// Recalculate dimensions based on content mode
// Use calculateGridSize() for consistency with initial show
let contentWidth, contentHeight;
if (isGridMode) {
const gridSize = calculateGridSize();
contentWidth = gridSize.width;
contentHeight = gridSize.height;
} else {
contentWidth = tooltipText.implicitWidth;
contentHeight = tooltipText.implicitHeight;
}
const tipWidth = Math.min(contentWidth + (padding * 2), maxWidth);
root.implicitWidth = tipWidth;
const tipHeight = contentHeight + (padding * 2);
root.implicitHeight = tipHeight;
// Reposition based on current direction (screen-relative)
var targetGlobalAbs = targetItem.mapToGlobal(0, 0);
var targetGlobal = {
"x": targetGlobalAbs.x - screenX,
"y": targetGlobalAbs.y - screenY
};
const targetWidth = targetItem.width;
const targetHeight = targetItem.height;
// Recalculate base anchor position (center on target for top/bottom, etc.)
var newAnchorX = anchorX;
var newAnchorY = anchorY;
// Determine which direction the tooltip is currently positioned
// and recalculate the centering for that direction
var isHorizontalTooltip = false;
var isVerticalTooltip = false;
if (anchorY > targetHeight / 2) {
// Tooltip is below target
newAnchorX = (targetWidth - tipWidth) / 2;
isHorizontalTooltip = true;
} else if (anchorY < -tipHeight / 2) {
// Tooltip is above target
newAnchorX = (targetWidth - tipWidth) / 2;
isHorizontalTooltip = true;
} else if (anchorX > targetWidth / 2) {
// Tooltip is to the right
newAnchorY = (targetHeight - tipHeight) / 2;
isVerticalTooltip = true;
} else if (anchorX < -tipWidth / 2) {
// Tooltip is to the left
newAnchorY = (targetHeight - tipHeight) / 2;
isVerticalTooltip = true;
}
// Adjust horizontal position to keep tooltip on screen if needed
const globalX = targetGlobal.x + newAnchorX;
if (globalX < 0) {
const adjustedX = -targetGlobal.x + margin;
if (isHorizontalTooltip) {
newAnchorX = adjustedX;
} else {
const wouldOverlap = adjustedX < targetWidth && adjustedX + tipWidth > 0;
if (!wouldOverlap) {
newAnchorX = adjustedX;
}
}
} else if (globalX + tipWidth > screenWidth) {
const adjustedX = screenWidth - targetGlobal.x - tipWidth - margin;
if (isHorizontalTooltip) {
newAnchorX = adjustedX;
} else {
const wouldOverlap = adjustedX < targetWidth && adjustedX + tipWidth > 0;
if (!wouldOverlap) {
newAnchorX = adjustedX;
}
}
}
// Adjust vertical position to keep tooltip on screen if needed
const globalY = targetGlobal.y + newAnchorY;
if (globalY < 0) {
const adjustedY = -targetGlobal.y + margin;
if (isVerticalTooltip) {
newAnchorY = adjustedY;
} else {
const wouldOverlap = adjustedY < targetHeight && adjustedY + tipHeight > 0;
if (!wouldOverlap) {
newAnchorY = adjustedY;
}
}
} else if (globalY + tipHeight > screenHeight) {
const adjustedY = screenHeight - targetGlobal.y - tipHeight - margin;
if (isVerticalTooltip) {
newAnchorY = adjustedY;
} else {
const wouldOverlap = adjustedY < targetHeight && adjustedY + tipHeight > 0;
if (!wouldOverlap) {
newAnchorY = adjustedY;
}
}
}
// Apply the new anchor positions
anchorX = newAnchorX;
anchorY = newAnchorY;
// Force anchor update
Qt.callLater(() => {
if (root.anchor && root.visible) {
root.anchor.updateAnchor();
}
});
}
// Backward compatibility alias
function updateText(newText) {
updateContent(newText);
}
// Reset function to clean up state
function reset() {
// Stop all timers and animations
@@ -518,6 +630,7 @@ PopupWindow {
visible = false;
animatingOut = false;
text = "";
rows = null;
isPositioned = false;
// Reset to defaults
@@ -547,11 +660,13 @@ PopupWindow {
border.width: Style.borderS
radius: Style.radiusS
// Only show content when we have text
visible: root.text !== ""
// Only show content when we have content
visible: root.text !== "" || root.isGridMode
// Text content (default mode)
NText {
id: tooltipText
visible: !root.isGridMode
anchors.centerIn: parent
anchors.margins: root.padding
text: root.text
@@ -564,6 +679,28 @@ PopupWindow {
width: Math.min(implicitWidth, root.maxWidth - (root.padding * 2))
richTextEnabled: true
}
// Grid content (grid mode)
GridLayout {
id: gridContent
visible: root.isGridMode
anchors.centerIn: parent
columns: root.columnCount
rowSpacing: 0
columnSpacing: Style.marginM
Repeater {
model: root.isGridMode ? [].concat.apply([], root.rows) : []
NText {
text: modelData
pointSize: Style.fontSizeS
family: tooltipText.family
color: Color.mOnSurfaceVariant
Layout.preferredHeight: rowHeightMeasure.implicitHeight
}
}
}
}
}

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