Merge remote-tracking branch 'upstream/main'

This commit is contained in:
shouya
2026-02-11 12:20:22 +09:00
326 changed files with 32487 additions and 11592 deletions
+1
View File
@@ -1 +1,2 @@
buy_me_a_coffee: noctalia
ko_fi: noctaliadev
Binary file not shown.
@@ -0,0 +1,16 @@
{
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
"modules": [
"os",
"kernel",
"title",
"host",
"uptime",
"cpu",
"gpu",
"memory",
"disk",
"wm",
"packages"
]
}
+80 -55
View File
@@ -153,68 +153,46 @@ body {
--purple-5: hsl(267deg, 83%, 70%);
}
.divider__908e2:not(.isUnread__908e2) {
border-color: var(--bg-2);
/* Dividers (Channel list and messages) */
[class*="divider"]:not([class*="isUnread"]) {
border-color: var(--bg-2) !important;
}
.bannerButton_de8008, .bannerColor_fb7f94 {
color: var(--text-1);
/* Profile Banners */
[class*="bannerButton"],
[class*="bannerColor"] {
color: var(--text-1) !important;
}
/* Prevent scaling animation on DMS icon */
.wrapper__6e9f8[data-list-item-id='guildsnav___home']:hover > .childWrapper__6e9f8::before,
.wrapper__6e9f8[data-list-item-id='guildsnav___home'].selected__6e9f8 > .childWrapper__6e9f8::before {
/* Prevent scaling animation on Home/DMS icon */
[class*="guildsnav"] [class*="wrapper"][data-list-item-id='guildsnav___home']:hover > [class*="childWrapper"]::before,
[class*="guildsnav"] [class*="wrapper"][data-list-item-id='guildsnav___home'][class*="selected"] > [class*="childWrapper"]::before {
transform: rotate(-360deg) scale(1) !important;
}
/* Make timestamps use lighter text color */
.timestamp_c19a55,
.timestampInline_c19a55,
.timestamp_c19a55 time,
.timestampInline_c19a55 time {
color: var(--text-4) !important;
}
/* Make timestamps more readable by overriding inline styles */
/* Timestamps */
[class*="timestamp"],
[class*="timestampInline"],
[class*="timestamp"] time {
color: var(--text-4) !important;
}
.postTitleText_faa96b {
/* Forum/Thread Titles */
[class*="postTitleText"],
[class*="postTitleText"] [class*="highlight"] {
color: var(--text-2) !important;
}
.postTitleText_faa96b .highlight {
color: var(--text-2) !important;
}
/* Make thread titles more readable by overriding inline styles */
[class*="headerText"] [class*="postTitleText"],
[class*="headerText"] h3[class*="postTitleText"] {
color: var(--text-2) !important;
}
.messageContent_c19a55,
.messageContent_faa96b {
color: var(--text-3) !important;
}
.messageContent_c19a55 .highlight,
.messageContent_faa96b .highlight {
color: var(--text-2) !important;
}
/* Make message content more readable by overriding inline styles */
/* Message Content */
[class*="messageContent"] {
color: var(--text-3) !important;
}
[class*="messageContent"] .highlight {
[class*="messageContent"] [class*="highlight"] {
color: var(--text-2) !important;
}
/* Make slowmode/cooldown text more readable by overriding inline styles */
/* Slowmode/Cooldown Text */
[class*="cooldownText"] {
color: var(--text-4) !important;
}
@@ -227,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;
}
@@ -269,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;
}
@@ -279,8 +257,8 @@ body {
[class*="radioSelection"][data-selected="true"] [class*="innerDotRadio"],
[class*="radioSelection"][aria-checked="true"] [class*="outerRadioFill"],
[class*="radioSelection"][aria-checked="true"] [class*="innerDotRadio"],
.parentSelected__6e9f8 [class*="outerRadioFill"],
.parentSelected__6e9f8 [class*="innerDotRadio"] {
[class*="parentSelected"] [class*="outerRadioFill"],
[class*="parentSelected"] [class*="innerDotRadio"] {
opacity: 1 !important;
}
@@ -303,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 */
@@ -311,35 +289,82 @@ body {
border-color: var(--accent-1) /* keep background consistent on hover */
}
._714a9a7abaf0392a-checkboxOption[data-selected="true"]:hover ._714a9a7abaf0392a-checkStroke,
._714a9a7abaf0392a-checkboxOption[data-selected="true"]:hover ._714a9a7abaf0392a-dot {
color: var(--accent-1) !important; /* keep checkmark accent color on hover */
}
/* Fix hover color for channel mentions */
.channelMention:hover {
color: var(--text-1) !important;
}
[class*="unreadTop"],
[class*="unreadBottom"],
[class*="unreadMentionsIndicator"] {
background-color: transparent !important;
}
[class*="unreadBar"],
[class*="unreadMentionsBar"] {
background-color: var(--accent-1) !important;
border: 1px solid var(--border);
}
[class*="unreadBar"][class*="mention"],
[class*="unreadMentionsBar"][class*="mention"] {
background-color: var(--accent-1) !important;
}
[class*="unreadBar"][class*="unread"],
[class*="unreadMentionsBar"][class*="unread"] {
background-color: var(--bg-1) !important;
border-color: var(--accent-1) !important;
}
[class*="unreadBar"] [class*="text"],
[class*="unreadMentionsBar"] [class*="text"] {
color: var(--text-0) !important;
color: var(--text-1) !important;
font-weight: 700;
}
[class*="unreadMentionsIndicator"] [class*="bar"] {
background-color: var(--accent-1) !important;
/* 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;
}
+1 -1
View File
@@ -1,4 +1,4 @@
;;; noctalia-theme.el --- Theme using Template SCSS variables
;;; noctalia-theme.el --- Theme using Template SCSS variables -*- lexical-binding: t -*-
;; Copyright (C) 2025
+15 -11
View File
@@ -2,21 +2,25 @@
"wallpaper": "{{image}}",
"alpha": "100",
"colors": {
"color0": "{{colors.background.default.hex}}",
"color1": "{{colors.surface_container.default.hex}}",
"color2": "{{colors.surface_container_highest.default.hex}}",
"color3": "",
"color0": "{{colors.shadow.default.hex}}",
"color1": "",
"color2": "",
"color3": "{{colors.primary.default.hex}}",
"color4": "",
"color5": "",
"color5": "{{colors.tertiary.default.hex}}",
"color6": "",
"color7": "",
"color7": "{{colors.surface_container_highest.default.hex}}",
"color8": "",
"color9": "",
"color10": "{{colors.primary.default.hex}}",
"color11": "{{colors.secondary.default.hex}}",
"color12": "{{colors.tertiary.default.hex}}",
"color13": "{{colors.surface_bright.default.hex}}",
"color11": "",
"color12": "",
"color13": "{{colors.secondary.default.hex}}",
"color14": "",
"color15": "{{colors.on_surface.default.hex}}"
"color15": "{{colors.on_background.default.hex}}",
"color16": "{{colors.on_surface.default.hex}}",
"color17": "{{colors.surface_container.default.hex}}",
"color18": "",
"color19": "{{colors.background.default.hex}}"
}
}
}
+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}}
+209 -70
View File
@@ -31,7 +31,7 @@
},
"bar": {
"active-window": {
"colorize-icons-description": "Theme-Farben auf das aktive Fenster-Symbol anwenden.",
"colorize-icons-description": "Themenfarben auf das aktive Fenster-Symbol anwenden.",
"hide-mode-description": "Steuert das Verhalten des Widgets, wenn kein Fenster aktiv ist.",
"scrolling-mode-description": "Steuern, wann Textscrolling für lange Fenstertitel aktiviert ist.",
"show-app-icon-description": "Anwendungssymbol neben dem Fenstertitel anzeigen.",
@@ -48,11 +48,16 @@
"device-default": "Standard (Anzeigegerät)",
"device-description": "Wählen Sie das anzuzeigende Akkugerät aus.",
"device-label": "Akkugerät",
"display-mode-description": "Wählen Sie, wie der Akku in der Leiste angezeigt wird.",
"display-mode-graphic": "Grafischer Akku",
"display-mode-graphic-clean": "Grafischer Akku (ohne %)",
"display-mode-icon-always": "Symbol - Immer % anzeigen",
"display-mode-icon-hover": "Symbol - Beim Hover anzeigen",
"display-mode-icon-only": "Nur Symbol",
"hide-if-idle-description": "Das Widget ausblenden, wenn der Akku nicht geladen oder entladen wird.",
"hide-if-idle-label": "Ausblenden, wenn im Leerlauf",
"hide-if-not-detected-description": "Widget ausblenden, wenn kein Akku im System erkannt wird.",
"hide-if-not-detected-label": "Ausblenden, wenn nicht erkannt",
"low-battery-threshold-description": "Warnung anzeigen, wenn Akku unter diesen Prozentsatz fällt.",
"low-battery-threshold-label": "Schwellenwert für niedrigen Akkustand",
"show-noctalia-performance-description": "Zeige den Noctalia-Leistungsmodus-Schalter im Akku-Panel an.<br>Deaktiviert Schatten und Animationen in Noctalia, um Ressourcen zu sparen.",
"show-noctalia-performance-label": "Noctalia-Performance-Schalter anzeigen",
@@ -67,18 +72,16 @@
"custom-font-placeholder": "Benutzerdefinierte Schriftart auswählen...",
"custom-font-search-placeholder": "Schriftarten suchen...",
"horizontal-bar-description": "Tipp: Verwenden Sie \\n, um einen Zeilenumbruch zu erstellen.",
"horizontal-bar-label": "Horizontale Statusleiste",
"horizontal-bar-label": "Horizontale Leiste",
"preview": "Vorschau",
"tooltip-format-description": "Formatzeichenfolge für den Tooltip, der beim Überfahren der Uhr angezeigt wird. Leer lassen, um den Standard-Tooltip zu verwenden.",
"tooltip-format-description": "Formatzeichenfolge für den Tooltip, der beim Bewegen des Mauszeigers über die Uhr angezeigt wird. Leer lassen, um den Standard-Tooltip zu verwenden.",
"tooltip-format-label": "Tooltip-Format",
"use-custom-font-description": "Überschreibt die Standard-Schriftart mit einer benutzerdefinierten Schriftart für die Uhr.",
"use-custom-font-label": "Benutzerdefinierte Schriftart verwenden",
"use-monospaced-font-description": "Wenn aktiviert, verwendet die Uhr die Monospace-Schriftart.",
"use-monospaced-font-label": "Monospace-Schriftart verwenden",
"use-primary-color-description": "Wenn aktiviert, wird die Primärfarbe zur Hervorhebung angewendet.",
"use-primary-color-label": "Primärfarbe verwenden",
"vertical-bar-description": "Verwenden Sie ein Leerzeichen, um jeden Teil in eine neue Zeile zu trennen.",
"vertical-bar-label": "Vertikale Statusleiste"
"vertical-bar-label": "Vertikale Leiste"
},
"control-center": {
"browse-file": "Datei durchsuchen",
@@ -93,8 +96,7 @@
"custom-button": {
"collapse-condition-description": "Wenn der Ausgabetext diesem Wert entspricht, wird die Schaltfläche eingeklappt.",
"collapse-condition-label": "Einklappbedingung",
"color-selection-description": "Designfarben auf Symbol und Text anwenden.",
"color-selection-label": "Farbe auswählen",
"color-selection-description": "Themenfarben auf Symbol und Text anwenden.",
"display-command-output-description": "Befehl eingeben, der in regelmäßigen Abständen ausgeführt wird. Die erste Zeile seiner Ausgabe wird als Text angezeigt.",
"display-command-output-label": "Befehlsausgabe anzeigen",
"display-command-output-stream-description": "Geben Sie einen Befehl ein, der kontinuierlich ausgeführt werden soll.",
@@ -181,8 +183,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ählen Sie die Farbe für das Abzeichen ungelesener Benachrichtigungen.",
"unread-badge-color-label": "Farbe des Ungelesen-Abzeichens"
},
"section-editor": {
"placeholder": "Widget auswählen...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "Statistiken als Mini-Balkendiagramme anstelle von Textwerten anzeigen. Verhindert Layoutverschiebungen.",
"compact-mode-label": "Kompaktmodus",
"cpu-frequency-description": "Die aktuelle CPU-Taktrate in GHz anzeigen.",
"cpu-frequency-label": "CPU-Frequenz anzeigen",
"cpu-temperature-description": "CPU-Temperaturwerte anzeigen, falls verfügbar.",
"cpu-temperature-label": "CPU-Temperatur",
"cpu-usage-description": "Aktuelle CPU-Auslastung in Prozent anzeigen.",
@@ -209,6 +215,10 @@
"memory-usage-label": "Speicherauslastung",
"network-traffic-description": "Upload- und Download-Geschwindigkeiten anzeigen.",
"network-traffic-label": "Netzwerkverkehr",
"storage-as-percentage-description": "Festplattenspeicher als Prozentsatz statt absoluter Werte anzeigen.",
"storage-as-percentage-label": "Festplatte als Prozentsatz",
"storage-available-description": "Zeigt an, wie viel Speicherplatz verfügbar ist, anstatt wie viel belegt ist.",
"storage-available-label": "Verfügbarer Speicherplatz",
"storage-usage-description": "Festplattenspeicher-Nutzungsinformationen anzeigen.",
"storage-usage-label": "Datenträgerauslastung",
"swap-usage-description": "Swap-Speichernutzung anzeigen.",
@@ -217,15 +227,15 @@
"use-monospace-font-label": "Schriftart mit fester Breite"
},
"taskbar": {
"colorize-icons-description": "Theme-Farben auf Taskbar-Symbole anwenden.",
"colorize-icons-description": "Themenfarben auf Taskbar-Symbole anwenden.",
"hide-mode-description": "Steuert das Verhalten des Widgets, wenn keine übereinstimmenden Fenster vorhanden sind.",
"hide-mode-label": "Ausblendmodus",
"icon-scale-description": "Legt den Skalierungsfaktor für Taskleistensymbole fest.",
"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.",
@@ -240,7 +250,9 @@
"title-width-reset-tooltip": "Titelbreite zurücksetzen"
},
"tray": {
"colorize-icons-description": "Theme-Farben auf Tray-Symbole anwenden.",
"chevron-color-description": "Wendet die Themenfarben auf das Pfeilsymbol des Drawers an.",
"chevron-color-label": "Pfeil-Farbe",
"colorize-icons-description": "Themenfarben auf Tray-Symbole anwenden.",
"colorize-icons-label": "Symbole einfärben",
"drawer-enabled-description": "Wenn aktiviert, werden nicht angeheftete Tray-Elemente in einem Drawer-Panel angezeigt.<br>Wenn deaktiviert, werden alle Tray-Elemente inline angezeigt.",
"drawer-enabled-label": "Drawer aktivieren",
@@ -248,25 +260,36 @@
"hide-passive-label": "Passive Elemente ausblenden"
},
"volume": {
"display-mode-description": "Wählen Sie, wie dieser Wert angezeigt werden soll.",
"display-mode-label": "Anzeigemodus"
"display-mode-description": "Wählen Sie, wie dieser Wert angezeigt werden soll."
},
"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",
"enable-scrollwheel-description": "Zwischen Arbeitsbereichen mit dem Mausrad wechseln.",
"enable-scrollwheel-label": "Zum Wechseln der Arbeitsbereiche scrollen",
"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",
"show-applications-description": "Anwendungssymbole in jedem Arbeitsbereich anzeigen.",
"occupied-color-description": "Lege die Hintergrundfarbe für belegte Arbeitsflächen fest.",
"occupied-color-label": "Farbe für belegte Arbeitsfläche",
"pill-size-description": "Passen Sie die Größe der Arbeitsbereichs-Pillen an (50%-100%).",
"pill-size-label": "Pillengröße",
"reverse-scrolling-description": "Die Richtung des Arbeitsflächenwechsels beim Scrollen umkehren.",
"reverse-scrolling-label": "Scrollen umkehren",
"show-applications-description": "Anwendungssymbole in jeder Arbeitsfläche anzeigen.",
"show-applications-label": "Anwendungen 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"
@@ -327,13 +350,6 @@
"version-new-user": "Neuinstallation"
}
},
"colors": {
"error": "Fehler",
"on-surface": "Auf der Oberfläche",
"primary": "Primär",
"secondary": "Sekundär",
"tertiary": "Tertiär"
},
"common": {
"actions": "Aktionen",
"add": "Hinzufügen",
@@ -373,10 +389,13 @@
"disconnect": "Trennen",
"disconnected": "Getrennt",
"disconnecting": "Verbindung wird getrennt...",
"display-mode": "Anzeigemodus",
"download": "Herunterladen",
"duration": "Dauer",
"dysfunctional": "Dysfunktional",
"edit": "Bearbeiten",
"enabled": "Aktiviert",
"error": "Fehler",
"events": "Ereignisse",
"execute": "Ausführen",
"faithful": "Originalgetreu",
@@ -395,6 +414,7 @@
"installed": "Installiert",
"interface": "Schnittstelle",
"internet": "Internet",
"keybind": "Tastenbelegung",
"language": "Sprache",
"loading": "Wird geladen...",
"local": "Lokal",
@@ -416,6 +436,7 @@
"not-found": "Nicht gefunden",
"notifications": "Benachrichtigungen",
"official": "Offiziell",
"on-surface": "Auf Oberfläche",
"output": "Ausgabe",
"pair": "Koppeln",
"paired": "Gekoppelt",
@@ -428,11 +449,14 @@
"polling": "Abfrageintervall",
"position": "Position",
"previous": "Zurück",
"primary": "Primär",
"random": "Zufällig",
"reboot": "Neu starten",
"record": "Aufnahme starten",
"refresh": "Aktualisieren",
"required": "(erforderlich)",
"reset": "Zurücksetzen",
"reset-to-default": "Auf Standard zurücksetzen",
"result-count": "{count} Ergebnis",
"result-count-plural": "{count} Ergebnisse",
"resume": "Fortsetzen",
@@ -440,8 +464,12 @@
"scanning": "Scannen...",
"screen-corners": "Bildschirmecken",
"search": "Suche",
"secondary": "Sekundär",
"security": "Sicherheit",
"select": "Auswählen",
"select-color": "Farbe auswählen",
"select-color-description": "Wendet Themenfarben zur Hervorhebung an.",
"select-icon-color": "Symbolfarbe auswählen",
"shortcuts": "Kurzbefehle",
"shutdown": "Herunterfahren",
"signal": "Signal",
@@ -449,8 +477,10 @@
"sources": "Quellen",
"start": "Start",
"stop": "Stopp",
"supporters": "Unterstützer",
"suspend": "Energie sparen",
"templates": "Vorlagen",
"tertiary": "Tertiär",
"test": "Test",
"thresholds": "Schwellenwerte",
"title": "Titel",
@@ -473,6 +503,7 @@
"week": "Woche",
"widgets": "Widgets",
"width": "Breite",
"windows": "Fenster",
"yes": "Ja"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "Beim Hover"
},
"hide-modes": {
"auto-hide": "Automatisch ausblenden",
"hidden": "Ausblenden, wenn leer",
"idle": "Ausblenden, wenn inaktiv",
"non-exclusive": "Nicht-exklusiv",
"transparent": "Transparent, wenn leer",
"visible": "Immer sichtbar"
},
@@ -543,7 +576,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": {
@@ -579,13 +614,26 @@
"density-compact": "Kompakt",
"density-default": "Standard",
"density-mini": "Mini",
"density-spacious": "Geräumig"
"density-spacious": "Geräumig",
"display-mode-always-visible": "Immer sichtbar",
"type-floating": "Schwebend",
"type-framed": "Gerahmt",
"type-simple": "Einfach"
},
"control-center": {
"quick-settings-style-classic": "Klassisch",
"quick-settings-style-modern": "Modern"
},
"frame-rates-fps": "{fps} FPS",
"launcher-density": {
"comfortable": "Bequem",
"compact": "Kompakt",
"default": "Standard"
},
"launcher-view-mode": {
"grid": "Gitter",
"list": "Liste"
},
"scrolling-modes": {
"always": "Immer scrollen",
"hover": "Beim Hover scrollen",
@@ -616,8 +664,9 @@
},
"panels": {
"about": {
"become-supporter": "Werde Unterstützer",
"changelog": "Änderungsprotokoll anzeigen",
"contributors-desc": "Ein Dankeschön an unseren {count} <b>großartigen</b> Mitwirkenden!",
"contributors-description": "Ein Dankeschön an unseren {count} <b>großartigen</b> Mitwirkenden!",
"contributors-description-plural": "Ein Dankeschön an unsere {count} <b>großartigen</b> Mitwirkenden!",
"copy-info": "Informationen kopieren",
"info-copied": "Info in die Zwischenablage kopiert",
@@ -628,10 +677,14 @@
"noctalia-title": "Noctalia Shell",
"privacy-policy": "Datenschutzbestimmungen",
"support": "Unterstütze uns",
"supporter-badge": "Unterstützer",
"supporters-desc": "Ein riesiges Dankeschön an unseren großartigen Unterstützer!",
"supporters-desc-plural": "Ein riesiges Dankeschön an unsere <b>{count} großartigen</b> Unterstützer!",
"supporters-loading": "Supporter werden geladen...",
"system-cpu": "CPU:",
"system-disk": "Festplatte:",
"system-gpu": "GPU:",
"system-host": "Gastgeber:",
"system-host": "Host:",
"system-install-hint": "Installieren Sie fastfetch, um Systeminformationen anzuzeigen",
"system-kernel": "Kernel:",
"system-loading": "Systeminformationen werden geladen...",
@@ -692,35 +745,49 @@
"volumes-output-volume-description": "Systemweite Lautstärke.",
"volumes-step-size-description": "Schrittgröße für Lautstärkeänderungen anpassen (Mausrad, Tastenkürzel).",
"volumes-step-size-label": "Lautstärke-Schrittgröße",
"volumes-volume-feedback-description": "Einen Feedback-Sound abspielen, wenn die Lautstärke angepasst wird",
"volumes-volume-feedback-description": "Einen Feedback-Sound abspielen, wenn die Lautstärke angepasst wird.",
"volumes-volume-feedback-label": "Lautstärke-Feedback-Sound abspielen",
"volumes-volume-overdrive-description": "Erlaubt das Anheben der Lautstärke über 100%. Wird möglicherweise nicht von aller Hardware unterstützt.",
"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-color-description": "Wählen Sie eine Farbe für Leistenkapseln oder keine, um die Standard-Oberflächenfarbe zu verwenden.",
"appearance-capsule-color-label": "Kapselfarbe",
"appearance-capsule-opacity-description": "Deckkraft der Widget-Hintergründe festlegen, wenn Kapsel angezeigt wird.",
"appearance-capsule-opacity-label": "Kapsel-Deckkraft",
"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-floating-description": "Statusleiste als schwebende 'Pille' anzeigen.",
"appearance-floating-label": "Schwebende Statusleiste",
"appearance-density-description": "Innenabstand der Leiste für kompaktes oder geräumiges Aussehen anpassen.",
"appearance-density-label": "Leistendichte",
"appearance-desc": "Erscheinungsbild und Position der Leiste anpassen.",
"appearance-display-mode-description": "Wählen Sie, wann die Leiste sichtbar ist.",
"appearance-floating-description": "Leiste als schwebende 'Pille' anzeigen.",
"appearance-floating-label": "Schwebende Leiste",
"appearance-frame-radius": "Innenradius",
"appearance-frame-settings-description": "Rahmenstärke und inneren Eckenradius anpassen",
"appearance-frame-settings-label": "Rahmeneinstellungen",
"appearance-frame-thickness": "Stärke",
"appearance-hide-on-overview-description": "Die Leiste ausblenden und Panels schließen, wenn die Compositor-Übersicht aktiv ist.",
"appearance-hide-on-overview-label": "Leiste in der Übersicht ausblenden",
"appearance-margins-description": "Ränder um die schwebende Statusleiste anpassen.",
"appearance-margins-description": "Ränder um die schwebende Leiste anpassen.",
"appearance-margins-horizontal": "Horizontal",
"appearance-margins-label": "Ränder",
"appearance-margins-vertical": "Vertikal",
"appearance-outer-corners-description": "Nach außen gewölbte Ecken auf der Leiste anzeigen.",
"appearance-outer-corners-label": "Äußere Ecken",
"appearance-position-description": "Wählen Sie, wo die Statusleiste auf dem Bildschirm platziert werden soll.",
"appearance-position-label": "Statusleistenposition",
"appearance-position-description": "Wählen Sie, wo die Leiste auf dem Bildschirm platziert werden soll.",
"appearance-position-label": "Leistenposition",
"appearance-show-capsule-description": "Widget-Hintergründe anzeigen.",
"appearance-show-capsule-label": "Kapsel anzeigen",
"appearance-show-outline-description": "Zeige eine sichtbare Umrandung um jedes Widget an.",
"appearance-show-outline-label": "Widget-Umrisse anzeigen",
"appearance-type-description": "Wählen Sie den Stil der Leiste: Einfach, Schwebend oder Gerahmt.",
"appearance-type-label": "Leistentyp",
"appearance-use-separate-opacity-description": "Ermöglicht die Verwendung eines separaten Deckkraftwerts für den Leistenhintergrund.",
"appearance-use-separate-opacity-label": "Separate Leisten-Deckkraft",
"monitor-configure-widgets": "Widgets konfigurieren",
@@ -728,13 +795,13 @@
"monitor-override-settings-description": "Benutzerdefinierte Einstellungen für diesen Monitor verwenden.",
"monitor-reset-all": "Alles zurücksetzen",
"monitor-widgets-title": "Widget-Konfiguration - {monitor}",
"monitors-desc": "Statusleiste auf bestimmten Monitoren anzeigen. Standardmäßig auf allen.",
"monitors-desc": "Leiste auf bestimmten Monitoren anzeigen. Standardmäßig auf allen.",
"monitors-desc-new": "Konfiguriere, welche Monitore die Bar anzeigen und passe die Einstellungen pro Monitor an.",
"monitors-title": "Monitor-Anzeige",
"title": "Statusleiste",
"title": "Leiste",
"tray-blacklist-description": "Ausschlussregeln für die Tray-Symbolleiste hinzufügen, unterstützt Platzhalter (*).",
"tray-blacklist-label": "Ausschlussliste",
"tray-blacklist-placeholder": "z.B., nm-applet, Fcitx*",
"tray-blacklist-placeholder": "z.B. nm-applet, Fcitx*",
"tray-pin-application": "Anwendung anheften",
"tray-unpin-application": "Anheftung aufheben",
"use-global-widgets": "Globale Widgets verwenden",
@@ -770,6 +837,7 @@
"download-title": "Farbschemata herunterladen",
"method-description": {
"content": "Material Design Schema mit hochauflösender Farbextraktion, das die tatsächlichen Farben des Quellinhalts genau wiedergibt.",
"dysfunctional": "Wie Faithful, wählt aber die zweitdominanteste Farbfamilie als primär.",
"faithful": "Versucht, nah an der Ausgangsfarbe zu bleiben, während gleichzeitig eine harmonische Palette erzeugt wird.",
"fruit-salad": "Material Design-Schema, das eine spielerische, lebendige Palette mit vielfältigen Farbtönen erzeugt.",
"monochrome": "Material Design-Schema mit einer einfarbigen Grauskala und minimalem Farbanteil.",
@@ -793,7 +861,7 @@
"title": "Farbschema",
"wallpaper-method-description": "Wählen Sie Ihre bevorzugte Methode zur Palettengenerierung.",
"wallpaper-method-label": "Methode zur Palettengenerierung",
"wallpaper-monitor-source-description": "Wähle den Monitor aus, der für die Extraktion der Wallpaper-Farben verwendet werden soll.",
"wallpaper-monitor-source-description": "Wählen Sie den Monitor aus, der für die Extraktion der Wallpaper-Farben verwendet werden soll.",
"wallpaper-monitor-source-label": "Quelle der Farbgenerierung"
},
"control-center": {
@@ -816,7 +884,7 @@
"shortcuts-custom-button-state-checks-command": "Befehl, der für diese Zustandsprüfung ausgeführt werden soll",
"shortcuts-custom-button-state-checks-label": "Zustandsprüfungen",
"shortcuts-custom-button-state-checks-remove": "Entfernen",
"shortcuts-custom-button-tooltip-description": "Der Tooltip, der angezeigt wird, wenn Sie mit der Maus über die Schaltfläche fahren.",
"shortcuts-custom-button-tooltip-description": "Der Tooltip, der beim Bewegen des Mauszeigers über die Schaltfläche angezeigt wird.",
"shortcuts-custom-button-tooltip-label": "Tooltip",
"shortcuts-title": "Widgets für Kurzbefehle",
"system-monitor-disk-path-description": "Wählen Sie, welchen Festplatten-Mountpunkt die Systemmonitor-Karte im Kontrollzentrum überwachen soll.",
@@ -866,6 +934,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 Hintergrundcontainer 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",
@@ -907,7 +985,7 @@
"appearance-background-opacity-description": "Hintergrundtransparenz des Docks anpassen.",
"appearance-border-radius-description": "Den Radius der Dock-Umrandung anpassen.",
"appearance-border-radius-label": "Eckenradius",
"appearance-colorize-icons-description": "Theme-Farben auf Dock-App-Symbole anwenden (nur nicht fokussierte Apps).",
"appearance-colorize-icons-description": "Themenfarben auf Dock-App-Symbole anwenden (nur nicht fokussierte Apps).",
"appearance-colorize-icons-label": "Symbole einfärben",
"appearance-dead-opacity-description": "Die Deckkraft von App-Symbolen anpassen, die nicht ausgeführt werden.",
"appearance-dead-opacity-label": "Tote Opazität",
@@ -923,7 +1001,7 @@
"appearance-icon-size-label": "Dock-Größe",
"appearance-inactive-indicators-description": "Anzeige von Indikator-Pillen für alle Apps, nicht nur für die aktuell aktive.",
"appearance-inactive-indicators-label": "Laufende Indikatoren",
"appearance-pinned-static-description": "Gepinnten App-Symbole immer in statischer Reihenfolge nach links schieben.",
"appearance-pinned-static-description": "Gepinnte App-Symbole immer in statischer Reihenfolge nach links schieben.",
"appearance-pinned-static-label": "Statische angeheftete Apps",
"appearance-position-description": "Wählen Sie, wo das Dock auf dem Bildschirm angezeigt wird.",
"appearance-position-label": "Position",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "Monospace-Schriftarten suchen...",
"fonts-reset-scaling": "Skalierung zurücksetzen",
"fonts-title": "Schriftarten",
"keybinds-description": "Globale Navigationstasten für Panels und Launcher konfigurieren.",
"keybinds-down": "Nach unten verschieben",
"keybinds-enter": "Bestätigen / Aktion",
"keybinds-escape": "Schließen / Zurück",
"keybinds-left": "Links verschieben",
"keybinds-right": "Rechts bewegen",
"keybinds-title": "Navigations-Tastenkombinationen",
"keybinds-up": "Nach oben",
"language-desc": "Ändern Sie die Sprache von Noctalia.",
"language-select-auto-detect": "Automatisch",
"language-select-description": "Wählen Sie die Sprache der Anwendungsoberfläche.",
@@ -969,10 +1055,12 @@
"screen-corners-radius-reset": "Eckenradius des Bildschirms zurücksetzen",
"screen-corners-show-corners-description": "Gerundete Ecken am Rand des Bildschirms anzeigen.",
"screen-corners-show-corners-label": "Bildschirmecken anzeigen",
"screen-corners-solid-black-description": "Schwarze Ecken anstelle der Statusleisten-Hintergrundfarbe verwenden.",
"screen-corners-solid-black-description": "Schwarze Ecken anstelle der Leisten-Hintergrundfarbe verwenden.",
"screen-corners-solid-black-label": "Schwarze Ecken",
"screen-corners-title": "Bildschirmecken",
"settings-copied": "Einstellungen in die Zwischenablage kopiert"
"settings-copied": "Einstellungen in die Zwischenablage kopiert",
"tab-basics": "Grundlagen",
"tab-keybinds": "Tastenkombinationen"
},
"hooks": {
"info-command-info-description": "• Befehle werden über Shell ausgeführt (sh -lc)<br>• Befehle laufen im Hintergrund (getrennt)<br>• Test-Buttons führen mit aktuellen Werten aus",
@@ -1027,18 +1115,28 @@
"settings-clip-wrap-text-label": "Zwischenablage-Text umbrechen",
"settings-clipboard-history-description": "Zugriff auf zuvor kopierte Elemente über den Launcher.",
"settings-clipboard-history-label": "Zwischenablageverlauf aktivieren",
"settings-clipboard-watch-image-description": "Vollständiger Befehlsstring, der an wl-paste für Bildänderungen übergeben wird (Neustart erforderlich).",
"settings-clipboard-watch-image-label": "Bildüberwachungsbefehl",
"settings-clipboard-watch-text-description": "Vollständiger Befehlsstring, der an wl-paste für Textänderungen übergeben wird (Neustart erforderlich).",
"settings-clipboard-watch-text-label": "Textüberwachungsbefehl",
"settings-custom-launch-prefix-description": "Befehle mit einem benutzerdefinierten Launcher präfixieren (z.B. 'runapp' für systemd-Integration).",
"settings-custom-launch-prefix-enabled-description": "Verwenden Sie ein benutzerdefiniertes Präfix zum Starten von Anwendungen anstelle der Standardmethode.",
"settings-custom-launch-prefix-enabled-label": "Benutzerdefiniertes Start-Präfix aktivieren",
"settings-custom-launch-prefix-label": "Benutzerdefiniertes Start-Präfix",
"settings-density-description": "Größe der Anwendungssymbole und Dichte des Launchers anpassen.",
"settings-density-label": "Dichte",
"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",
"settings-ignore-mouse-input-description": "Deaktivieren Sie die Mausinteraktion und das Mausrad im Launcher.",
"settings-ignore-mouse-input-label": "Maus-Eingabe ignorieren",
"settings-overlay-layer-description": "Zeigt das Startprogramm auf der Überlagerungsebene an, über Vollbildfenstern. Wenn aktiviert, wird das Startprogramm nicht an der Leiste befestigt.",
"settings-overlay-layer-label": "Über Vollbild anzeigen",
"settings-position-description": "Wählen Sie, wo das Starter-Panel erscheint.",
"settings-show-categories-description": "Kategorienregisterkarten zum Filtern von Anwendungen anzeigen.",
"settings-show-categories-label": "Kategorien anzeigen",
@@ -1050,6 +1148,8 @@
"settings-terminal-command-label": "Terminalbefehl",
"settings-use-app2unit-description": "Verwendet eine alternative Startmethode zur besseren Verwaltung von App-Prozessen und Problemvermeidung.",
"settings-use-app2unit-label": "App2Unit zum Starten von Anwendungen verwenden",
"settings-view-mode-description": "Wähle das Layout für die Anwendungsstarter-Einträge.",
"settings-view-mode-label": "Ansichtsmodus",
"title": "Starter"
},
"location": {
@@ -1057,7 +1157,7 @@
"calendar-cards-title": "Kalenderkarten",
"calendar-header-label": "Kalenderkopfzeile",
"calendar-month-label": "Kalendermonat",
"date-time-12hour-format-description": "Zeige die Uhrzeit im 12-Stunden-Format auf dem Sperrbildschirm und im Kalender an. Die Uhr in der Statusleiste hat eigene Einstellungen.",
"date-time-12hour-format-description": "Zeige die Uhrzeit im 12-Stunden-Format auf dem Sperrbildschirm und im Kalender an. Die Uhr in der Leiste hat eigene Einstellungen.",
"date-time-12hour-format-label": "12-Stunden-Zeitformat benutzen",
"date-time-desc": "Anpassen, wie Datum und Zeit erscheinen.",
"date-time-first-day-of-week-automatic": "Automatisch (Systemgebietsschema verwenden)",
@@ -1066,7 +1166,7 @@
"date-time-show-events-description": "Ereignisse im Kalender-Panel anzeigen.",
"date-time-show-events-label": "Kalenderereignisse anzeigen",
"date-time-title": "Datum & Zeit",
"date-time-use-analog-description": "Eine Analoguhr im Kalender-Panel und auf dem Sperrbildschirm anzeigen.",
"date-time-use-analog-description": "Zeige eine Analoguhr im Kalenderfenster an.",
"date-time-use-analog-label": "Analoge Uhr verwenden",
"date-time-week-numbers-description": "Zeige die Woche des Jahres (z.B. Woche 38) im Kalender an.",
"date-time-week-numbers-label": "Wochennummern anzeigen",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "Wetter im Kalender anzeigen"
},
"lock-screen": {
"allow-password-with-fprintd-description": "Wenn fprintd (Fingerabdruck-Authentifizierung) aktiv ist, können Sie mit dieser Option weiterhin Ihr Passwort anstelle eines Fingerabdrucks verwenden.",
"allow-password-with-fprintd-label": "Passwort-Anmeldung mit fprintd erlauben",
"auto-start-auth-description": "Startet die Fingerabdruckauthentifizierung automatisch, ohne dass ein Tastendruck oder ein Klick erforderlich ist.",
"auto-start-auth-label": "Automatische Authentifizierung beim Start",
"clock-format-description": "Passe das Uhrformat mit Datums-/Uhrzeit-Syntax-Tokens an.",
"clock-format-label": "Uhrenformat",
"clock-style-analog": "Analog",
"clock-style-custom": "Benutzerdefiniert",
"clock-style-description": "Wählen Sie den visuellen Stil der Uhr auf dem Sperrbildschirm.",
"clock-style-digital": "Digital",
"clock-style-label": "Uhrstil",
"compact-lockscreen-description": "Zeige nur die Login-Eingabe und Systemsteuerung, blende Wetter- und Medien-Widgets aus.",
"compact-lockscreen-label": "Kompakter Sperrbildschirm",
"lock-on-suspend-description": "Den Bildschirm beim Energiesparen automatisch sperren.",
"lock-on-suspend-label": "Sperren beim Energiesparen",
"lock-screen-animations-description": "Sperrbildschirm-Animationen aktivieren oder deaktivieren.",
"lock-screen-animations-label": "Sperrbildschirm-Animationen",
"lock-screen-blur-strength-description": "Wendet einen Weichzeichnungseffekt auf das Hintergrundbild des Sperrbildschirms an.",
"lock-screen-blur-strength-label": "Sperrbildschirm-Unschärfestärke",
"lock-screen-tint-strength-description": "Wendet eine Farbüberlagerung auf das Hintergrundbild des Sperrbildschirms an.",
"lock-screen-tint-strength-label": "Stärke der Sperrbildschirmtönung",
"monitors-desc": "Sperrbildschirm auf bestimmten Monitoren anzeigen. Standardmäßig auf alle, wenn keine ausgewählt sind.",
"show-hibernate-description": "Die Option 'Ruhezustand' in den Energieoptionen anzeigen.",
"show-hibernate-label": "Ruhezustand anzeigen",
"show-session-buttons-description": "Zugriff auf die Energieeinstellungen vom Sperrbildschirm aus erlauben.",
@@ -1126,8 +1244,6 @@
"history-low-urgency-label": "Niedrige Dringlichkeit im Verlauf speichern",
"history-normal-urgency-description": "Normale Prioritätsbenachrichtigungen im Verlauf speichern.",
"history-normal-urgency-label": "Normale Dringlichkeit im Verlauf speichern",
"media-toast-description": "Eine Toast-Benachrichtigung anzeigen, wenn sich der Wiedergabestatus von Medien ändert.",
"media-toast-label": "Medien",
"monitors-desc": "Benachrichtigungen auf bestimmten Monitoren anzeigen. Standardmäßig werden sie auf allen Monitoren angezeigt.",
"settings-always-on-top-description": "Benachrichtigungen über Vollbildfenstern und anderen Ebenen anzeigen.",
"settings-background-opacity-description": "Transparenz der Benachrichtigungshintergründe anpassen.",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "Benachrichtigungstöne nicht verfügbar",
"sounds-volume-description": "Lautstärke für Benachrichtigungstöne anpassen.",
"sounds-volume-label": "Sound-Lautstärke",
"toast-battery-description": "Zeige eine Warnung an, wenn der Akkustand unter diesen Prozentsatz fällt.",
"toast-battery-label": "Akkuwarnung",
"toast-desc": "Konfigurieren Sie das Aussehen und Verhalten von Toast-Benachrichtigungen.",
"toast-keyboard-description": "Zeige eine Toast-Benachrichtigung an, wenn sich das Tastaturlayout ändert.",
"toast-keyboard-label": "Tastaturlayout"
"toast-keyboard-label": "Tastaturlayout",
"toast-media-description": "Eine Toast-Benachrichtigung anzeigen, wenn sich der Wiedergabestatus von Medien ändert.",
"toast-media-label": "Medien"
},
"osd": {
"always-on-top-description": "On-Screen Display über Vollbildfenstern und anderen Ebenen anzeigen.",
@@ -1202,16 +1322,20 @@
"types-volume-label": "Ausgangslautstärke"
},
"plugins": {
"auto-update": "Plugins automatisch aktualisieren",
"auto-update-description": "Automatisch alle Plugins aktualisieren, wenn die Shell startet.",
"available-description": "Plugins aus konfigurierten Quellen durchsuchen und installieren.",
"available-label": "Verfügbare Plugins",
"available-no-plugins-description": "Überprüfen Sie Ihre Plugin-Quellen oder aktualisieren Sie die Liste.",
"available-no-plugins-label": "Keine Plugins verfügbar",
"check-for-updates": "Nach Updates suchen",
"checking-for-updates": "Prüfe auf Updates...",
"collision-already-installed": "Dieses Plugin ist bereits installiert",
"collision-custom-version-exists": "Eine benutzerdefinierte Version von \"{source}\" ist bereits installiert",
"collision-official-version-exists": "Die offizielle Version dieses Plugins ist bereits installiert",
"filter-downloaded": "Heruntergeladen",
"filter-not-downloaded": "Nicht heruntergeladen",
"filter-tags-description": "Filter-Plugins nach Kategorie oder Download-Status filtern",
"filter-tags-description": "Plugins nach Kategorie oder Download-Status filtern.",
"filter-tags-label": "Schlagwörter",
"hot-reload-description": "Plugins automatisch neu laden, wenn sich ihre Dateien ändern. Nützlich für die Plugin-Entwicklung.",
"hot-reload-label": "Hot Reload (Entwicklermodus)",
@@ -1245,6 +1369,7 @@
"sources-placeholder": "Mein cooles Repository",
"sources-remove-tooltip": "Plugin-Quelle entfernen",
"title": "Plugins",
"translations-reloaded": "Übersetzungen neu geladen: {name}",
"uninstall-dialog-description": "Sind Sie sicher, dass Sie {plugin} deinstallieren möchten? Dadurch werden alle Plugin-Daten entfernt.",
"uninstall-dialog-title": "Plugin deinstallieren",
"uninstall-error": "Deinstallation fehlgeschlagen: {error}",
@@ -1271,11 +1396,14 @@
"entries-desc": "Anpassen, welche Energieaktionen im Sitzungsmenü angezeigt werden und in welcher Reihenfolge.",
"entries-title": "Energieaktionen",
"entry-settings-command-description": "Benutzerdefinierter Befehl, der für diese Aktion ausgeführt werden soll. Leer lassen, um den Standard-Systembefehl zu verwenden.",
"entry-settings-command-placeholder": "systemctl poweroff",
"entry-settings-command-placeholder": "z.B. systemctl poweroff",
"entry-settings-default-command-lock": "Interner Sperrbildschirm (kein Befehl)",
"entry-settings-default-command-logout": "Interne Abmeldung (kein Befehl)",
"entry-settings-default-info-description": "Wenn kein benutzerdefinierter Befehl angegeben ist, wird der standardmäßige Systembefehl verwendet.",
"entry-settings-default-info-label": "Standardbefehl",
"entry-settings-keybind-description": "Weisen Sie eine Tastenkombination zu, um diese Aktion auszulösen, wenn das Sitzungsmenü geöffnet ist.",
"entry-settings-keybind-placeholder": "Drücke Aufnehmen, um eine Taste zuzuweisen...",
"entry-settings-keybind-recording": "Aufnahme läuft... Drücken Sie eine beliebige Tastenkombination",
"entry-settings-title": "Konfiguriere {entry}",
"entry-settings-tooltip": "Konfigurationsbefehl",
"general-desc": "Konfigurieren Sie das Verhalten und Erscheinungsbild des Sitzungsmenü-Panels.",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "Kritische Farbe",
"custom-highlight-colors-title-label": "Benutzerdefinierte Hervorhebungsfarben",
"disk-available-label": "Verfügbarer Speicherplatz",
"disk-section-label": "Festplattennutzung",
"enable-dgpu-monitoring-description": "Warnung: Dies aktiviert Ihre dedizierte GPU (NVIDIA/AMD), was die Akkulaufzeit von Laptops mit Hybridgrafik erheblich beeinträchtigen kann.",
"enable-dgpu-monitoring-label": "Dedizierte GPU-Überwachung aktivieren",
@@ -1323,7 +1452,7 @@
"box-border-description": "Zeige eine Umrandung um Inhaltsbereiche an.",
"box-border-label": "Containerumriss",
"box-border-radius-description": "Passt die Eckenrundung wichtiger Layoutbereiche an, wie z. B. Seitenleisten, Karten und Inhaltsbereiche.",
"box-border-radius-label": "Behälterradius",
"box-border-radius-label": "Eckenradius",
"box-border-radius-reset": "Container-Radius zurücksetzen",
"control-border-radius-description": "Steuert die Krümmung interaktiver Elemente, einschließlich Schaltflächen, Umschalter und Textfelder.",
"control-border-radius-label": "Eingaberadius",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "Wählen Sie das Layout der Einstellungen (möglicherweise ist ein Neustart erforderlich).",
"settings-panel-mode-label": "Einstellungs-Panel-Modus",
"shadows-description": "Aktiviert Schlagschatten unter Leisten und Panels.",
"shadows-direction-description": "Wählen, aus welcher Richtung der Schatten fällt.",
"shadows-direction-description": "Wählen Sie, wohin der Schatten geworfen wird.",
"shadows-direction-label": "Schattenrichtung",
"shadows-label": "Schlagschatten",
"title": "Benutzeroberfläche",
@@ -1386,6 +1515,10 @@
"settings-monitor-specific-description": "Unterschiedlichen Hintergrundbild-Ordner für jeden Monitor festlegen.",
"settings-monitor-specific-label": "Monitor-spezifische Verzeichnisse",
"settings-monitor-specific-tooltip": "Monitor-Hintergrundbild-Ordner",
"settings-overview-blur-strength-description": "Wendet die Unschärfestärke auf die Übersicht an.",
"settings-overview-blur-strength-label": "Unschärfestärke der Übersicht",
"settings-overview-tint-description": "Wendet die Tönungsstärke auf die Übersicht an.",
"settings-overview-tint-label": "Stärke der Übersichts-Tönung",
"settings-recursive-search-description": "Auch nach Hintergrundbildern in Unterordnern des Hintergrundbild-Verzeichnisses suchen.",
"settings-recursive-search-label": "Unterordner durchsuchen",
"settings-select-monitor-folder": "Monitor-Hintergrundbild-Ordner auswählen",
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "Fertig!",
"appearance": {
"subheader": "Wähle Dark Mode und Farbquellen (Wallpaper oder vordefiniert)."
"subheader": "Wählen Sie den Dunkelmodus und Farbquellen (Hintergrundbild oder vordefiniert)."
},
"customize": {
"header": "Erlebnis anpassen",
@@ -1449,7 +1582,7 @@
},
"skip-setup": "Einrichtung überspringen",
"telemetry-wizard-done": "Verstanden!",
"telemetry-wizard-note": "Sie haben die Kontrolle aktivieren oder deaktivieren Sie dies jederzeit in den Einstellungen",
"telemetry-wizard-note": "Sie haben die Kontrolle aktivieren oder deaktivieren Sie dies jederzeit in den Einstellungen",
"telemetry-wizard-subtitle": "Wir haben anonyme Analysen hinzugefügt, um Noctalia zu verbessern",
"telemetry-wizard-title": "Datenschutz-Update",
"wallpaper": {
@@ -1466,7 +1599,7 @@
"select-prompt": "Wählen Sie unten ein Hintergrundbild",
"subheader": "Bestimmen Sie die Stimmung mit einem schönen Hintergrund."
},
"welcome-note": "Nur ein paar Grundeinstellungen alle Optionen befinden sich in den Einstellungen",
"welcome-note": "Nur ein paar Grundeinstellungen alle Optionen befinden sich in den Einstellungen",
"welcome-subtitle": "Gestalten wir Ihren Desktop einzigartig",
"welcome-title": "Willkommen bei Noctalia!"
},
@@ -1490,7 +1623,7 @@
"disk": "Festplatte",
"download-speed": "Download-Speed",
"gpu-temp": "GPU-Temperatur",
"load-average": "Last",
"load-average": "Lastdurchschnitt",
"title": "Systemmonitor",
"upload-speed": "Upload-Speed"
},
@@ -1499,8 +1632,10 @@
"title": "Flugmodus"
},
"battery": {
"critical": "Kritischer Akkustand",
"critical-desc": "Akku ist bei {percent}% — bitte sofort das Ladegerät anschließen",
"low": "Niedriger Akkustand",
"low-desc": "Akku ist bei {percent}%. Bitte schließen Sie das Ladegerät an"
"low-desc": "Akku ist bei {percent}% — bitte das Ladegerät anschließen"
},
"bluetooth": {
"address-copied": "Adresse in die Zwischenablage kopiert",
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "Scheibe",
"fade": "Überblenden",
"honeycomb": "Honigwabe",
"pixelate": "Verpixeln",
"stripes": "Streifen",
"wipe": "Wischen"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "Hintergrundbilder werden geladen...",
"no-results": "Keine Hintergrundbilder gefunden. Versuchen Sie eine andere Suchanfrage.",
"page": "{current} von {total}"
"page": "{current} von {total}",
"page-prefix": "Seite",
"page-suffix": "von {total}"
}
},
"weather": {
+186 -47
View File
@@ -48,11 +48,16 @@
"device-default": "Default (Display Device)",
"device-description": "Select which battery device to display.",
"device-label": "Battery device",
"display-mode-description": "Choose how the battery is displayed in the bar.",
"display-mode-graphic": "Graphical battery",
"display-mode-graphic-clean": "Graphical battery (no %)",
"display-mode-icon-always": "Icon - Always show %",
"display-mode-icon-hover": "Icon - Show on hover",
"display-mode-icon-only": "Icon only",
"hide-if-idle-description": "Hide the widget when the battery is not charging or discharging.",
"hide-if-idle-label": "Hide when idle",
"hide-if-not-detected-description": "Hide the widget when no battery is detected on the system.",
"hide-if-not-detected-label": "Hide when not detected",
"low-battery-threshold-description": "Show a warning when battery falls below this percentage.",
"low-battery-threshold-label": "Low battery warning threshold",
"show-noctalia-performance-description": "Display the Noctalia Performance Mode toggle inside the battery panel.<br>Disables shadows and animations in Noctalia to reduce resource usage.",
"show-noctalia-performance-label": "Show Noctalia Performance toggle",
@@ -75,8 +80,6 @@
"use-custom-font-label": "Use custom font",
"use-monospaced-font-description": "When enabled, the clock will use the monospaced font.",
"use-monospaced-font-label": "Use monospaced font",
"use-primary-color-description": "When enabled, this applies the primary color for emphasis.",
"use-primary-color-label": "Use primary color",
"vertical-bar-description": "Use a space to separate each part onto a new line.",
"vertical-bar-label": "Vertical bar"
},
@@ -94,7 +97,6 @@
"collapse-condition-description": "If the output text matches this value, the button will collapse.",
"collapse-condition-label": "Collapse condition",
"color-selection-description": "Apply theme colors to icon and text.",
"color-selection-label": "Select Color",
"display-command-output-description": "Enter a command to run at a regular interval. The first line of its output will be displayed as text.",
"display-command-output-label": "Display command output",
"display-command-output-stream-description": "Enter a command to run continuously.",
@@ -182,7 +184,9 @@
"hide-widget-when-zero-unread-description": "Hide the notification icon when there are no unread notifications.",
"hide-widget-when-zero-unread-label": "Hide icon when no unread notifications",
"show-unread-badge-description": "Display a badge showing the number of unread notifications.",
"show-unread-badge-label": "Show unread badge"
"show-unread-badge-label": "Show unread badge",
"unread-badge-color-description": "Select the color for the unread notification badge.",
"unread-badge-color-label": "Unread badge color"
},
"section-editor": {
"placeholder": "Select a widget to add...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "Display stats as mini bar charts instead of text values. Prevents layout shifting.",
"compact-mode-label": "Compact mode",
"cpu-frequency-description": "Display the current CPU clock speed in GHz.",
"cpu-frequency-label": "Show CPU frequency",
"cpu-temperature-description": "Show CPU temperature readings if available.",
"cpu-temperature-label": "CPU temperature",
"cpu-usage-description": "Display current CPU usage percentage.",
@@ -209,6 +215,10 @@
"memory-usage-label": "Memory usage",
"network-traffic-description": "Display network upload and download speeds.",
"network-traffic-label": "Network traffic",
"storage-as-percentage-description": "Show disk space as percentage instead of absolute values.",
"storage-as-percentage-label": "Disk as percentage",
"storage-available-description": "Shows how much disk space is available instead of how much is used.",
"storage-available-label": "Disk space available",
"storage-usage-description": "Show disk space usage information.",
"storage-usage-label": "Storage usage",
"swap-usage-description": "Show swap memory usage.",
@@ -240,6 +250,8 @@
"title-width-reset-tooltip": "Reset title width"
},
"tray": {
"chevron-color-description": "Apply theme colors to the drawer chevron icon.",
"chevron-color-label": "Chevron color",
"colorize-icons-description": "Apply theme colors to tray icons.",
"colorize-icons-label": "Colorize icons",
"drawer-enabled-description": "When enabled, unpinned tray items are shown in a drawer panel.<br>When disabled, all tray items are shown inline.",
@@ -248,14 +260,17 @@
"hide-passive-label": "Hide passive items"
},
"volume": {
"display-mode-description": "Choose how you'd like this value to appear.",
"display-mode-label": "Display mode"
"display-mode-description": "Choose how you'd like this value to appear."
},
"workspace": {
"character-count-description": "Number of characters to display from workspace names (1-10).",
"character-count-label": "Character count",
"empty-color-description": "Set the background color for empty workspaces.",
"empty-color-label": "Empty workspace color",
"enable-scrollwheel-description": "Switch between workspaces using the mouse scroll wheel.",
"enable-scrollwheel-label": "Scroll to switch workspaces",
"focused-color-description": "Set the background color for the focused workspace.",
"focused-color-label": "Focused workspace color",
"follow-focused-screen-description": "Display workspaces from the currently focused screen, rather than the screen where the bar is located.",
"follow-focused-screen-label": "Follow focused screen",
"grouped-border-opacity-description": "Set the opacity level for workspace container borders.",
@@ -264,8 +279,16 @@
"hide-unoccupied-label": "Hide unoccupied",
"label-mode-description": "Choose how workspace labels are displayed.",
"label-mode-label": "Label mode",
"occupied-color-description": "Set the background color for occupied workspaces.",
"occupied-color-label": "Occupied workspace color",
"pill-size-description": "Adjust the size of workspace pills.",
"pill-size-label": "Pill size",
"reverse-scrolling-description": "Reverse the direction of workspace switching when scrolling.",
"reverse-scrolling-label": "Reverse scrolling",
"show-applications-description": "Display application icons inside each workspace.",
"show-applications-label": "Show applications",
"show-badge-description": "Show the workspace number badge in grouped mode.",
"show-badge-label": "Show workspace badge",
"show-labels-only-when-occupied-description": "Only show workspace labels when they contain windows.",
"show-labels-only-when-occupied-label": "Show labels only when occupied",
"unfocused-icons-opacity-description": "Set the opacity level for unfocused app icons.",
@@ -327,13 +350,6 @@
"version-new-user": "Fresh install"
}
},
"colors": {
"error": "Error",
"on-surface": "On Surface",
"primary": "Primary",
"secondary": "Secondary",
"tertiary": "Tertiary"
},
"common": {
"actions": "Actions",
"add": "Add",
@@ -373,10 +389,13 @@
"disconnect": "Disconnect",
"disconnected": "Disconnected",
"disconnecting": "Disconnecting...",
"display-mode": "Display mode",
"download": "Download",
"duration": "Duration",
"dysfunctional": "Dysfunctional",
"edit": "Edit",
"enabled": "Enabled",
"error": "Error",
"events": "Events",
"execute": "Execute",
"faithful": "Faithful",
@@ -395,6 +414,7 @@
"installed": "Installed",
"interface": "Interface",
"internet": "Internet",
"keybind": "Keybind",
"language": "Language",
"loading": "Loading...",
"local": "Local",
@@ -416,6 +436,7 @@
"not-found": "Not found",
"notifications": "Notifications",
"official": "Official",
"on-surface": "On Surface",
"output": "Output",
"pair": "Pair",
"paired": "Paired",
@@ -428,11 +449,14 @@
"polling": "Polling",
"position": "Position",
"previous": "Previous",
"primary": "Primary",
"random": "Random",
"reboot": "Reboot",
"record": "Start recording",
"refresh": "Refresh",
"required": "(required)",
"reset": "Reset",
"reset-to-default": "Reset to Default",
"result-count": "{count} result",
"result-count-plural": "{count} results",
"resume": "Resume",
@@ -440,8 +464,12 @@
"scanning": "Scanning...",
"screen-corners": "Screen Corners",
"search": "Search",
"secondary": "Secondary",
"security": "Security",
"select": "Select",
"select-color": "Select color",
"select-color-description": "Apply theme colors for emphasis.",
"select-icon-color": "Select icon color",
"shortcuts": "Shortcuts",
"shutdown": "Shutdown",
"signal": "Signal",
@@ -449,8 +477,10 @@
"sources": "Sources",
"start": "Start",
"stop": "Stop",
"supporters": "Supporters",
"suspend": "Suspend",
"templates": "Templates",
"tertiary": "Tertiary",
"test": "Test",
"thresholds": "Thresholds",
"title": "Title",
@@ -473,6 +503,7 @@
"week": "Week",
"widgets": "Widgets",
"width": "Width",
"windows": "Windows",
"yes": "Yes"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "On hover"
},
"hide-modes": {
"auto-hide": "Auto-hide",
"hidden": "Hide when empty",
"idle": "Hide when idle",
"non-exclusive": "Non-exclusive",
"transparent": "Transparent when empty",
"visible": "Always visible"
},
@@ -543,7 +576,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": {
@@ -579,13 +614,26 @@
"density-compact": "Compact",
"density-default": "Default",
"density-mini": "Mini",
"density-spacious": "Spacious"
"density-spacious": "Spacious",
"display-mode-always-visible": "Always Visible",
"type-floating": "Floating",
"type-framed": "Framed",
"type-simple": "Simple"
},
"control-center": {
"quick-settings-style-classic": "Classic",
"quick-settings-style-modern": "Modern"
},
"frame-rates-fps": "{fps} FPS",
"launcher-density": {
"comfortable": "Comfortable",
"compact": "Compact",
"default": "Default"
},
"launcher-view-mode": {
"grid": "Grid",
"list": "List"
},
"scrolling-modes": {
"always": "Scroll always",
"hover": "Scroll on hover",
@@ -616,8 +664,9 @@
},
"panels": {
"about": {
"become-supporter": "Become a supporter",
"changelog": "View changelog",
"contributors-desc": "Shout-out to our {count} <b>awesome</b> contributor!",
"contributors-description": "Shout-out to our {count} <b>awesome</b> contributor!",
"contributors-description-plural": "Shout-out to our {count} <b>awesome</b> contributors!",
"copy-info": "Copy info",
"info-copied": "Info copied to clipboard",
@@ -628,6 +677,10 @@
"noctalia-title": "Noctalia shell",
"privacy-policy": "Privacy policy",
"support": "Support us",
"supporter-badge": "Supporter",
"supporters-desc": "A huge thank you to our amazing supporter!",
"supporters-desc-plural": "A huge thank you to our <b>{count} amazing</b> supporters!",
"supporters-loading": "Loading supporters...",
"system-cpu": "CPU:",
"system-disk": "Disk:",
"system-gpu": "GPU:",
@@ -692,21 +745,33 @@
"volumes-output-volume-description": "System-wide volume level.",
"volumes-step-size-description": "Adjust the step size for volume changes (scroll wheel, keyboard shortcuts).",
"volumes-step-size-label": "Volume step size",
"volumes-volume-feedback-description": "Play a feedback sound when adjusting volume",
"volumes-volume-feedback-description": "Play a feedback sound when adjusting volume.",
"volumes-volume-feedback-label": "Play volume feedback sound",
"volumes-volume-overdrive-description": "Allow raising volume above 100%. May not be supported by all hardware.",
"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-color-description": "Choose a color for bar capsules, or use none for the default surface color.",
"appearance-capsule-color-label": "Capsule color",
"appearance-capsule-opacity-description": "Set the opacity level for widget backgrounds when capsule is shown.",
"appearance-capsule-opacity-label": "Capsule opacity",
"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-floating-description": "Display the bar as a floating 'pill'.",
"appearance-floating-label": "Floating bar",
"appearance-frame-radius": "Inner Radius",
"appearance-frame-settings-description": "Adjust frame thickness and inner corner radius",
"appearance-frame-settings-label": "Frame Settings",
"appearance-frame-thickness": "Thickness",
"appearance-hide-on-overview-description": "Hide the bar and close panels when the compositor overview is active.",
"appearance-hide-on-overview-label": "Hide bar on overview",
"appearance-margins-description": "Adjust the margins around the floating bar.",
@@ -721,6 +786,8 @@
"appearance-show-capsule-label": "Show capsule",
"appearance-show-outline-description": "Displays a visible border around every widget.",
"appearance-show-outline-label": "Show widget outlines",
"appearance-type-description": "Choose the style of the bar: Simple, Floating or Framed.",
"appearance-type-label": "Bar type",
"appearance-use-separate-opacity-description": "Enable to use a separate opacity value for the bar background.",
"appearance-use-separate-opacity-label": "Use separate bar opacity",
"monitor-configure-widgets": "Configure widgets",
@@ -734,7 +801,7 @@
"title": "Bar",
"tray-blacklist-description": "Add tray exclusion rules, supports wildcards (*).",
"tray-blacklist-label": "Blacklist",
"tray-blacklist-placeholder": "e.g., nm-applet, Fcitx*",
"tray-blacklist-placeholder": "e.g. nm-applet, Fcitx*",
"tray-pin-application": "Pin Application",
"tray-unpin-application": "Unpin Application",
"use-global-widgets": "Use global widgets",
@@ -770,6 +837,7 @@
"download-title": "Download Color Schemes",
"method-description": {
"content": "Material Design scheme with high-fidelity color extraction that closely matches the source content's actual colors.",
"dysfunctional": "Like Faithful but picks the second most dominant color family as primary.",
"faithful": "Attempts to stay close to the source color while still generating a harmonious palette.",
"fruit-salad": "Material Design scheme that produces a playful, vibrant palette with diverse and varied hues.",
"monochrome": "Material Design scheme using a single-hue grayscale with minimal chromatic content.",
@@ -866,6 +934,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",
@@ -908,7 +986,7 @@
"appearance-border-radius-description": "Adjust the dock's border radius.",
"appearance-border-radius-label": "Border radius",
"appearance-colorize-icons-description": "Apply theme colors to dock app icons (non-focused apps only).",
"appearance-colorize-icons-label": "Colorize Icons",
"appearance-colorize-icons-label": "Colorize icons",
"appearance-dead-opacity-description": "Adjust the opacity of app icons that are not running.",
"appearance-dead-opacity-label": "Dead opacity",
"appearance-desc": "Customize the dock's behavior and appearance.",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "Search monospace font...",
"fonts-reset-scaling": "Reset scaling",
"fonts-title": "Fonts",
"keybinds-description": "Configure global navigation keys for panels and launcher.",
"keybinds-down": "Move Down",
"keybinds-enter": "Confirm / Action",
"keybinds-escape": "Close / Back",
"keybinds-left": "Move Left",
"keybinds-right": "Move Right",
"keybinds-title": "Navigation Keybinds",
"keybinds-up": "Move Up",
"language-desc": "Choose your preferred language for the application.",
"language-select-auto-detect": "Automatic",
"language-select-description": "Select the language used in the application's interface.",
@@ -972,7 +1058,9 @@
"screen-corners-solid-black-description": "Use solid black instead of the bar background color.",
"screen-corners-solid-black-label": "Solid black corners",
"screen-corners-title": "Screen corners",
"settings-copied": "Settings copied to clipboard"
"settings-copied": "Settings copied to clipboard",
"tab-basics": "Basics",
"tab-keybinds": "Keybinds"
},
"hooks": {
"info-command-info-description": "• Commands are executed via shell (sh -lc)<br>• Commands run in background (detached)<br>• Test buttons execute with current values",
@@ -983,30 +1071,30 @@
"noctalia-started-placeholder": "e.g. notify-send 'Noctalia Loaded'",
"performance-mode-disabled-description": "Command to be executed when Noctalia Performance Mode is disabled.",
"performance-mode-disabled-label": "Performance mode disabled",
"performance-mode-disabled-placeholder": "e.g., notify-send \"Performance\" \"Mode disabled\"",
"performance-mode-disabled-placeholder": "e.g. notify-send \"Performance\" \"Mode disabled\"",
"performance-mode-enabled-description": "Command to be executed when Noctalia Performance Mode is enabled.",
"performance-mode-enabled-label": "Performance mode enabled",
"performance-mode-enabled-placeholder": "e.g., notify-send \"Performance\" \"Mode enabled\"",
"screen-lock-description": "Command to be executed when the screen is locked.",
"screen-lock-label": "Screen locked",
"screen-lock-placeholder": "e.g., notify-send \"Screen\" \"Locked\"",
"screen-lock-placeholder": "e.g. notify-send \"Screen\" \"Locked\"",
"screen-unlock-description": "Command to be executed when the lock screen is unlocked.",
"screen-unlock-label": "Screen unlocked",
"screen-unlock-placeholder": "e.g., notify-send \"Screen\" \"Unlocked\"",
"screen-unlock-placeholder": "e.g. notify-send \"Screen\" \"Unlocked\"",
"session-description": "Command to be executed before shutdown or reboot. Receives action type as $1 (shutdown/reboot).",
"session-label": "Session end",
"session-placeholder": "e.g., notify-send \"Session\" \"$1\"",
"session-placeholder": "e.g. notify-send \"Session\" \"$1\"",
"system-hooks-desc": "Configure commands to be executed when system events occur.",
"system-hooks-enable-description": "Enable or disable all hook commands.",
"system-hooks-enable-label": "Enable hooks",
"system-hooks-title": "System hooks",
"theme-changed-description": "Command to be executed when theme toggles between Dark and Light Mode.",
"theme-changed-label": "Theme changed",
"theme-changed-placeholder": "e.g., notify-send \"Theme\" \"Toggled\"",
"theme-changed-placeholder": "e.g. notify-send \"Theme\" \"Toggled\"",
"title": "Hooks",
"wallpaper-changed-description": "Command to be executed when wallpaper changes.",
"wallpaper-changed-label": "Wallpaper changed",
"wallpaper-changed-placeholder": "e.g., notify-send \"Wallpaper\" \"Changed\""
"wallpaper-changed-placeholder": "e.g. notify-send \"Wallpaper\" \"Changed\""
},
"indicator": {
"default-value": "Default: {value}",
@@ -1016,7 +1104,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.",
@@ -1027,18 +1115,28 @@
"settings-clip-wrap-text-label": "Wrap clipboard text",
"settings-clipboard-history-description": "Access previously copied items from the launcher.",
"settings-clipboard-history-label": "Enable clipboard history",
"settings-custom-launch-prefix-description": "Prefix commands with a custom launcher (e.g., 'runapp' for systemd integration).",
"settings-clipboard-watch-image-description": "Full command string passed to wl-paste for image changes. (requires restart)",
"settings-clipboard-watch-image-label": "Image watch command",
"settings-clipboard-watch-text-description": "Full command string passed to wl-paste for text changes. (requires restart)",
"settings-clipboard-watch-text-label": "Text watch command",
"settings-custom-launch-prefix-description": "Prefix commands with a custom launcher (e.g. 'runapp' for systemd integration).",
"settings-custom-launch-prefix-enabled-description": "Use a custom prefix for launching applications instead of the default method.",
"settings-custom-launch-prefix-enabled-label": "Enable custom launch prefix",
"settings-custom-launch-prefix-label": "Custom launch prefix",
"settings-density-description": "Adjust the size of application icons and the density of the launcher.",
"settings-density-label": "Density",
"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",
"settings-ignore-mouse-input-description": "Disable mouse interaction and scrollwheel in the launcher.",
"settings-ignore-mouse-input-label": "Ignore mouse input",
"settings-overlay-layer-description": "Display the launcher on the overlay layer, above fullscreen windows. When enabled, the launcher will not attach to the bar.",
"settings-overlay-layer-label": "Show above fullscreen",
"settings-position-description": "Choose where the launcher panel appears.",
"settings-show-categories-description": "Show category tabs for filtering applications.",
"settings-show-categories-label": "Show categories",
@@ -1046,10 +1144,12 @@
"settings-show-icon-background-label": "Show icon background",
"settings-sort-by-usage-description": "When enabled, frequently launched apps appear first in the list.",
"settings-sort-by-usage-label": "Sort by most used",
"settings-terminal-command-description": "Command to launch a terminal. E.g., 'kitty -e' or 'gnome-terminal --'.",
"settings-terminal-command-description": "Command to launch a terminal. E.g. 'kitty -e' or 'gnome-terminal --'.",
"settings-terminal-command-label": "Terminal command",
"settings-use-app2unit-description": "Uses an alternative launch method to better manage app processes and prevent issues.",
"settings-use-app2unit-label": "Use App2Unit to launch applications",
"settings-view-mode-description": "Choose the layout for the launcher entries.",
"settings-view-mode-label": "View mode",
"title": "Launcher"
},
"location": {
@@ -1066,12 +1166,12 @@
"date-time-show-events-description": "Display events in the calendar panel.",
"date-time-show-events-label": "Show calendar events",
"date-time-title": "Date & time",
"date-time-use-analog-description": "Show an analog style clock on the calendar window and lock screen.",
"date-time-use-analog-description": "Show an analog style clock on the calendar window.",
"date-time-use-analog-label": "Use analog style clock",
"date-time-week-numbers-description": "Display the week of the year (e.g., week 38) in the calendar.",
"date-time-week-numbers-description": "Display the week of the year (e.g. week 38) in the calendar.",
"date-time-week-numbers-label": "Show week numbers",
"location-desc": "Get accurate weather and Night Light scheduling by setting your location.",
"location-search-description": "e.g., Toronto, ON",
"location-search-description": "e.g. Toronto, ON",
"location-search-label": "Search for a location",
"location-search-placeholder": "Enter the location name",
"location-title": "Your location",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "Display weather in calendar"
},
"lock-screen": {
"allow-password-with-fprintd-description": "When fprintd (fingerprint authentication) is active, this option lets you still login using your password instead of a fingerprint",
"allow-password-with-fprintd-label": "Allow password login with fprintd",
"auto-start-auth-description": "Automatically starts fingerprint authentication without requiring a key press or button click.",
"auto-start-auth-label": "Auto-start authentication",
"clock-format-description": "Customize the clock format using date/time syntax tokens.",
"clock-format-label": "Clock format",
"clock-style-analog": "Analog",
"clock-style-custom": "Custom",
"clock-style-description": "Choose the visual style of the clock on the lock screen.",
"clock-style-digital": "Digital",
"clock-style-label": "Clock style",
"compact-lockscreen-description": "Show only the login input and system controls, hiding weather and media widgets.",
"compact-lockscreen-label": "Compact lock screen",
"lock-on-suspend-description": "Automatically lock the screen when suspending the system.",
"lock-on-suspend-label": "Lock on suspend",
"lock-screen-animations-description": "Enable or disable lockscreen animations.",
"lock-screen-animations-label": "Lockscreen animations",
"lock-screen-blur-strength-description": "Applies a blur effect to the lock screen wallpaper.",
"lock-screen-blur-strength-label": "Lock screen blur strength",
"lock-screen-tint-strength-description": "Applies a tint overlay to the lock screen wallpaper.",
"lock-screen-tint-strength-label": "Lock screen tint strength",
"monitors-desc": "Show lock screen on specific monitors. Defaults to all if none are chosen.",
"show-hibernate-description": "Show the option 'hibernate' in the power controls.",
"show-hibernate-label": "Show hibernate",
"show-session-buttons-description": "Allow access to power settings from the lock screen.",
@@ -1126,8 +1244,6 @@
"history-low-urgency-label": "Save low urgency to history",
"history-normal-urgency-description": "Save normal priority notifications to history.",
"history-normal-urgency-label": "Save normal urgency to history",
"media-toast-description": "Show a toast when media playback state changes.",
"media-toast-label": "Media",
"monitors-desc": "Show notification on specific monitors. Defaults to all if none are chosen.",
"settings-always-on-top-description": "Display notifications above fullscreen windows and other layers.",
"settings-background-opacity-description": "Adjust the opacity of notification backgrounds.",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "Notification sounds unavailable",
"sounds-volume-description": "Adjust the volume level for notification sounds.",
"sounds-volume-label": "Sound volume",
"toast-battery-description": "Show a warning when the battery level falls below this percentage.",
"toast-battery-label": "Battery warning",
"toast-desc": "Configure toast appearance and behavior.",
"toast-keyboard-description": "Show a toast when the keyboard layout changes.",
"toast-keyboard-label": "Keyboard layout"
"toast-keyboard-label": "Keyboard layout",
"toast-media-description": "Show a toast when media playback state changes.",
"toast-media-label": "Media"
},
"osd": {
"always-on-top-description": "Display OSD above fullscreen windows and other layers.",
@@ -1202,16 +1322,20 @@
"types-volume-label": "Output volume"
},
"plugins": {
"auto-update": "Auto-update plugins",
"auto-update-description": "Automatically update all plugins when the shell starts.",
"available-description": "Browse and install plugins from configured sources.",
"available-label": "Available plugins",
"available-no-plugins-description": "Check your plugin sources or refresh the list.",
"available-no-plugins-label": "No plugins available",
"check-for-updates": "Check for updates",
"checking-for-updates": "Checking for updates...",
"collision-already-installed": "This plugin is already installed",
"collision-custom-version-exists": "A custom version from \"{source}\" is already installed",
"collision-official-version-exists": "The official version of this plugin is already installed",
"filter-downloaded": "Downloaded",
"filter-not-downloaded": "Not Downloaded",
"filter-tags-description": "Filter plugins by category or download status",
"filter-tags-description": "Filter plugins by category or download status.",
"filter-tags-label": "Tags",
"hot-reload-description": "Automatically reload plugins when their files change. Useful for plugin development.",
"hot-reload-label": "Hot reload (dev mode)",
@@ -1245,6 +1369,7 @@
"sources-placeholder": "My cool repository",
"sources-remove-tooltip": "Remove plugin source",
"title": "Plugins",
"translations-reloaded": "Reloaded translations: {name}",
"uninstall-dialog-description": "Are you sure you want to uninstall {plugin}? This will remove all plugin data.",
"uninstall-dialog-title": "Uninstall plugin",
"uninstall-error": "Failed to uninstall: {error}",
@@ -1271,11 +1396,14 @@
"entries-desc": "Customize which power actions appear in the session menu and in what order.",
"entries-title": "Power actions",
"entry-settings-command-description": "Custom command to execute for this action. Leave empty to use the default system command.",
"entry-settings-command-placeholder": "e.g., systemctl poweroff",
"entry-settings-command-placeholder": "e.g. systemctl poweroff",
"entry-settings-default-command-lock": "Internal lock screen (no command)",
"entry-settings-default-command-logout": "Internal logout (no command)",
"entry-settings-default-info-description": "If no custom command is specified, the default system command will be used.",
"entry-settings-default-info-label": "Default command",
"entry-settings-keybind-description": "Assign a key combination to trigger this action when the session menu is open.",
"entry-settings-keybind-placeholder": "Press Record to assign a key...",
"entry-settings-keybind-recording": "Recording... Press any key combination",
"entry-settings-title": "Configure {entry}",
"entry-settings-tooltip": "Configure command",
"general-desc": "Configure the session menu panel behavior and appearance.",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "Critical color",
"custom-highlight-colors-title-label": "Custom highlight colors",
"disk-available-label": "Disk available",
"disk-section-label": "Disk usage",
"enable-dgpu-monitoring-description": "Warning: This will wake up your discrete GPU (NVIDIA/AMD), which may significantly impact battery life on laptops with hybrid graphics.",
"enable-dgpu-monitoring-label": "Enable discrete GPU monitoring",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "Choose settings layout (may require reopening).",
"settings-panel-mode-label": "Settings panel mode",
"shadows-description": "Enables drop shadows under bars and panels.",
"shadows-direction-description": "Choose where the shadow is cast from.",
"shadows-direction-description": "Choose where the shadow is cast to.",
"shadows-direction-label": "Shadow direction",
"shadows-label": "Drop shadows",
"title": "User Interface",
@@ -1357,7 +1486,7 @@
"automation-change-mode-alphabetical": "Alphabetical",
"automation-change-mode-description": "Choose how wallpapers are selected when changing automatically.",
"automation-change-mode-label": "Change mode",
"automation-custom-interval-description": "Enter time as HH:MM (e.g., 01:30).",
"automation-custom-interval-description": "Enter time as HH:MM (e.g. 01:30).",
"automation-custom-interval-label": "Custom interval",
"automation-interval-description": "How often to change wallpapers automatically.",
"automation-interval-label": "Wallpaper interval",
@@ -1386,6 +1515,10 @@
"settings-monitor-specific-description": "Set a different wallpaper folder for each monitor.",
"settings-monitor-specific-label": "Monitor-specific directories",
"settings-monitor-specific-tooltip": "Monitor wallpaper folder",
"settings-overview-blur-strength-description": "Applies the blur strength to the overview.",
"settings-overview-blur-strength-label": "Overview blur strength",
"settings-overview-tint-description": "Applies the tint strength to the overview.",
"settings-overview-tint-label": "Overview tint strength",
"settings-recursive-search-description": "Also search for wallpapers in subfolders of the wallpaper directory.",
"settings-recursive-search-label": "Search subfolders",
"settings-select-monitor-folder": "Select monitor wallpaper folder",
@@ -1407,11 +1540,11 @@
"enter-command": "Enter command to execute (app or custom script)",
"enter-ipc-identifier": "Enter unique identifier for IPC commands",
"enter-path": "Enter path...",
"enter-text-to-collapse": "e.g., 'nothing is playing'. Use /regex/ for patterns.",
"enter-text-to-collapse": "e.g. 'nothing is playing'. Use /regex/ for patterns.",
"enter-tooltip": "Enter tooltip",
"enter-width-pixels": "Enter width in pixels",
"search": "Search...",
"search-icons": "e.g., noctalia, niri, battery, cloud",
"search-icons": "e.g. noctalia, niri, battery, cloud",
"search-launcher": "Search entries... or use > for commands",
"search-wallhaven": "Search Wallhaven...",
"search-wallpapers": "Type to filter wallpapers..."
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "All Done!",
"appearance": {
"subheader": "Choose Dark Mode and color sources (Wallpaper or predefined)."
"subheader": "Choose Dark Mode and color sources (wallpaper or predefined)."
},
"customize": {
"header": "Customize your experience",
@@ -1449,7 +1582,7 @@
},
"skip-setup": "Skip Setup",
"telemetry-wizard-done": "Got it!",
"telemetry-wizard-note": "You're in control — enable or disable this anytime in Settings",
"telemetry-wizard-note": "You're in control — enable or disable this anytime in settings",
"telemetry-wizard-subtitle": "We've added anonymous analytics to help improve Noctalia",
"telemetry-wizard-title": "Privacy Update",
"wallpaper": {
@@ -1490,7 +1623,7 @@
"disk": "Disk",
"download-speed": "Download speed",
"gpu-temp": "GPU temp",
"load-average": "Load avg",
"load-average": "Load average",
"title": "System Monitor",
"upload-speed": "Upload speed"
},
@@ -1499,8 +1632,10 @@
"title": "Airplane Mode"
},
"battery": {
"critical": "Critical battery",
"critical-desc": "Battery is at {percent}% — please connect the charger immediately",
"low": "Low battery",
"low-desc": "Battery is at {percent}%. Please connect the charger"
"low-desc": "Battery is at {percent}% — please connect the charger"
},
"bluetooth": {
"address-copied": "Address copied to clipboard",
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "Disc",
"fade": "Fade",
"honeycomb": "Honeycomb",
"pixelate": "Pixelate",
"stripes": "Stripes",
"wipe": "Wipe"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "Loading wallpapers...",
"no-results": "No wallpapers found. Try a different search query.",
"page": "{current} of {total}"
"page": "{current} of {total}",
"page-prefix": "Page",
"page-suffix": "of {total}"
}
},
"weather": {
File diff suppressed because it is too large Load Diff
+190 -51
View File
@@ -48,11 +48,16 @@
"device-default": "Par défaut (périphérique d'affichage)",
"device-description": "Sélectionnez le périphérique de batterie à afficher.",
"device-label": "Dispositif à pile",
"display-mode-description": "Choisissez comment la batterie est affichée dans la barre.",
"display-mode-graphic": "Batterie graphique",
"display-mode-graphic-clean": "Batterie graphique (sans %)",
"display-mode-icon-always": "Icône - Toujours afficher %",
"display-mode-icon-hover": "Icône - Afficher au survol",
"display-mode-icon-only": "Icône seulement",
"hide-if-idle-description": "Masquer le widget lorsque la batterie n'est ni en charge ni en décharge.",
"hide-if-idle-label": "Masquer en cas d'inactivité",
"hide-if-not-detected-description": "Masquer le widget lorsqu'aucune batterie n'est détectée sur le système.",
"hide-if-not-detected-label": "Caché si non détecté",
"low-battery-threshold-description": "Afficher un avertissement lorsque la batterie tombe en dessous de ce pourcentage.",
"low-battery-threshold-label": "Seuil d'avertissement de batterie faible",
"show-noctalia-performance-description": "Afficher le basculement du mode performance Noctalia dans le panneau batterie.<br>Désactive les ombres et les animations dans Noctalia pour réduire l'utilisation des ressources.",
"show-noctalia-performance-label": "Afficher le basculement Noctalia Performance",
@@ -75,8 +80,6 @@
"use-custom-font-label": "Utiliser une police personnalisée",
"use-monospaced-font-description": "Lorsque cette option est activée, l'horloge utilisera la police à chasse fixe.",
"use-monospaced-font-label": "Utiliser une police à chasse fixe",
"use-primary-color-description": "Lorsque cette option est activée, la couleur principale est utilisée pour la mise en évidence.",
"use-primary-color-label": "Utiliser la couleur principale",
"vertical-bar-description": "Utilisez un espace pour séparer chaque partie sur une nouvelle ligne.",
"vertical-bar-label": "Barre verticale"
},
@@ -94,7 +97,6 @@
"collapse-condition-description": "Si le texte de sortie correspond à cette valeur, le bouton se repliera.",
"collapse-condition-label": "Condition deffondrement",
"color-selection-description": "Appliquer les couleurs du thème à l'icône et au texte.",
"color-selection-label": "Sélectionner la couleur",
"display-command-output-description": "Entrez une commande à exécuter à intervalle régulier. La première ligne de sa sortie sera affichée sous forme de texte.",
"display-command-output-label": "Afficher la sortie de la commande",
"display-command-output-stream-description": "Entrez une commande à exécuter en continu.",
@@ -182,7 +184,9 @@
"hide-widget-when-zero-unread-description": "Masquer licône de notification lorsquil ny a aucune notification non lue.",
"hide-widget-when-zero-unread-label": "Masquer licône sans notifications non lues",
"show-unread-badge-description": "Afficher un badge montrant le nombre de notifications non lues.",
"show-unread-badge-label": "Afficher le badge non lu"
"show-unread-badge-label": "Afficher le badge non lu",
"unread-badge-color-description": "Sélectionnez la couleur pour le badge de notification non lue.",
"unread-badge-color-label": "Couleur du badge non lu"
},
"section-editor": {
"placeholder": "Sélectionnez un widget à ajouter...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "Afficher les statistiques sous forme de mini-graphiques à barres au lieu de valeurs textuelles. Empêche les décalages de mise en page.",
"compact-mode-label": "Mode compact",
"cpu-frequency-description": "Afficher la vitesse d'horloge actuelle du CPU en GHz.",
"cpu-frequency-label": "Afficher la fréquence du CPU",
"cpu-temperature-description": "Afficher les lectures de température du CPU si disponibles.",
"cpu-temperature-label": "Température du CPU",
"cpu-usage-description": "Afficher le pourcentage d'utilisation actuel du CPU.",
@@ -209,6 +215,10 @@
"memory-usage-label": "Utilisation de la mémoire",
"network-traffic-description": "Afficher les vitesses de téléchargement et de téléversement du réseau.",
"network-traffic-label": "Trafic réseau",
"storage-as-percentage-description": "Afficher l'espace disque en pourcentage au lieu des valeurs absolues.",
"storage-as-percentage-label": "Disque en pourcentage",
"storage-available-description": "Affiche l'espace disque disponible au lieu de l'espace utilisé.",
"storage-available-label": "Espace disque disponible",
"storage-usage-description": "Afficher les informations d'utilisation de l'espace disque.",
"storage-usage-label": "Utilisation du stockage",
"swap-usage-description": "Afficher l'utilisation de la mémoire swap.",
@@ -240,6 +250,8 @@
"title-width-reset-tooltip": "Réinitialiser la largeur du titre"
},
"tray": {
"chevron-color-description": "Appliquer les couleurs du thème à l'icône chevron du tiroir.",
"chevron-color-label": "Couleur du chevron",
"colorize-icons-description": "Appliquer les couleurs du thème aux icônes de la barre système.",
"colorize-icons-label": "Coloriser les icônes",
"drawer-enabled-description": "Lorsqu'elle est activée, les éléments de la barre système non épinglés sont affichés dans un panneau tiroir.<br>Lorsqu'elle est désactivée, tous les éléments de la barre système sont affichés en ligne.",
@@ -248,14 +260,17 @@
"hide-passive-label": "Masquer les objets passifs"
},
"volume": {
"display-mode-description": "Choisissez comment vous souhaitez que cette valeur apparaisse.",
"display-mode-label": "Mode d'affichage"
"display-mode-description": "Choisissez comment vous souhaitez que cette valeur apparaisse."
},
"workspace": {
"character-count-description": "Nombre de caractères à afficher des noms d'espaces de travail (1-10).",
"character-count-label": "Nombre de caractères",
"empty-color-description": "Définir la couleur d'arrière-plan pour les Workspaces vides.",
"empty-color-label": "Couleur d'espace de travail vide",
"enable-scrollwheel-description": "Basculer entre les espaces de travail avec la molette de la souris.",
"enable-scrollwheel-label": "Faites défiler pour changer d'espace de travail",
"focused-color-description": "Définir la couleur d'arrière-plan pour l'espace de travail sélectionné.",
"focused-color-label": "Couleur de l'espace de travail sélectionné",
"follow-focused-screen-description": "Afficher les espaces de travail de l'écran actuellement ciblé, plutôt que de l'écran où se trouve la barre.",
"follow-focused-screen-label": "Suivre l'écran ciblé",
"grouped-border-opacity-description": "Définir le niveau d'opacité des bordures des conteneurs d'espace de travail.",
@@ -264,8 +279,16 @@
"hide-unoccupied-label": "Masquer les inoccupés",
"label-mode-description": "Choisir comment les étiquettes d'espace de travail sont affichées.",
"label-mode-label": "Mode d'étiquette",
"occupied-color-description": "Définir la couleur d'arrière-plan pour les Workspaces occupés.",
"occupied-color-label": "Couleur de l'espace de travail occupé",
"pill-size-description": "Ajustez la taille des pilules d'espace de travail (50%-100%).",
"pill-size-label": "Taille de la pilule",
"reverse-scrolling-description": "Inverser la direction du changement d'espace de travail lors du défilement.",
"reverse-scrolling-label": "Défilement inversé",
"show-applications-description": "Afficher les icônes des applications dans chaque espace de travail.",
"show-applications-label": "Afficher les applications",
"show-badge-description": "Afficher le badge du numéro d'espace de travail en mode groupé.",
"show-badge-label": "Afficher le badge de l'espace de travail",
"show-labels-only-when-occupied-description": "Afficher uniquement les étiquettes d'espace de travail lorsqu'elles contiennent des fenêtres.",
"show-labels-only-when-occupied-label": "Afficher les étiquettes uniquement lorsque le champ est occupé",
"unfocused-icons-opacity-description": "Définir le niveau d'opacité des icônes d'applications non focalisées.",
@@ -327,18 +350,11 @@
"version-new-user": "Nouvelle installation"
}
},
"colors": {
"error": "Erreur",
"on-surface": "Sur la surface",
"primary": "Primaire",
"secondary": "Secondaire",
"tertiary": "Tertiaire"
},
"common": {
"actions": "Actions",
"add": "Ajouter",
"appearance": "Apparence",
"apply": "Postuler",
"apply": "Appliquer",
"automation": "Automatisation",
"available": "Disponible",
"back": "Retour",
@@ -373,10 +389,13 @@
"disconnect": "Déconnecter",
"disconnected": "Déconnecté",
"disconnecting": "Déconnexion...",
"display-mode": "Mode d'affichage",
"download": "Télécharger",
"duration": "Durée",
"dysfunctional": "Dysfonctionnel",
"edit": "Modifier",
"enabled": "Activé",
"error": "Erreur",
"events": "Événements",
"execute": "Exécuter",
"faithful": "Fidèle",
@@ -395,6 +414,7 @@
"installed": "Installé",
"interface": "Interface",
"internet": "Internet",
"keybind": "Raccourci clavier",
"language": "Langue",
"loading": "Chargement...",
"local": "Local",
@@ -416,6 +436,7 @@
"not-found": "Non trouvé",
"notifications": "Notifications",
"official": "Officiel",
"on-surface": "Sur la surface",
"output": "Sortie",
"pair": "Appairer",
"paired": "Apparié",
@@ -428,11 +449,14 @@
"polling": "Interrogation",
"position": "Position",
"previous": "Précédent",
"primary": "Primaire",
"random": "Aléatoire",
"reboot": "Redémarrer",
"record": "Démarrer l'enregistrement",
"refresh": "Actualiser",
"required": "(requis)",
"reset": "Réinitialiser",
"reset-to-default": "Réinitialiser par Défaut",
"result-count": "{count} résultat",
"result-count-plural": "{count} résultats",
"resume": "Reprendrer",
@@ -440,8 +464,12 @@
"scanning": "Analyse en cours...",
"screen-corners": "Coins d'écran",
"search": "Rechercher",
"secondary": "Secondaire",
"security": "Sécurité",
"select": "Sélectionner",
"select-color": "Sélectionner une couleur",
"select-color-description": "Appliquer les couleurs du thème pour mettre en valeur.",
"select-icon-color": "Sélectionner la couleur de l'icône",
"shortcuts": "Raccourcis",
"shutdown": "Éteindre",
"signal": "Signal",
@@ -449,8 +477,10 @@
"sources": "Sources",
"start": "Commencer",
"stop": "Arrêtez",
"supporters": "Soutiens",
"suspend": "Mettre en veille",
"templates": "Modèles",
"tertiary": "Tertiaire",
"test": "Test",
"thresholds": "Seuils",
"title": "Titre",
@@ -473,6 +503,7 @@
"week": "Semaine",
"widgets": "Widgets",
"width": "Largeur",
"windows": "Fenêtres",
"yes": "Oui"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "Au survol"
},
"hide-modes": {
"auto-hide": "Masquer automatiquement ",
"hidden": "Masquer quand vide",
"idle": "Masquer quand inactif",
"non-exclusive": "Non exclusif",
"transparent": "Transparent quand vide",
"visible": "Toujours visible"
},
@@ -543,7 +576,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": {
@@ -579,13 +614,26 @@
"density-compact": "Compact",
"density-default": "Défaut",
"density-mini": "Mini",
"density-spacious": "Spacieux"
"density-spacious": "Spacieux",
"display-mode-always-visible": "Toujours Visible",
"type-floating": "Flottante",
"type-framed": "Encadrée",
"type-simple": "Simple"
},
"control-center": {
"quick-settings-style-classic": "Classique",
"quick-settings-style-modern": "Moderne"
},
"frame-rates-fps": "{fps} FPS",
"launcher-density": {
"comfortable": "Confortable",
"compact": "Compact",
"default": "Par défaut"
},
"launcher-view-mode": {
"grid": "Grille",
"list": "Liste"
},
"scrolling-modes": {
"always": "Défiler toujours",
"hover": "Défiler au survol",
@@ -616,8 +664,9 @@
},
"panels": {
"about": {
"become-supporter": "Devenir un soutien",
"changelog": "Afficher le journal des modifications",
"contributors-desc": "Un grand merci à notre {count} <b>super</b> contributeur !",
"contributors-description": "Un grand merci à notre {count} <b>super</b> contributeur !",
"contributors-description-plural": "Un grand merci à nos {count} <b>super</b> contributeurs !",
"copy-info": "Copier les informations",
"info-copied": "Info copiée dans le presse-papiers",
@@ -628,6 +677,10 @@
"noctalia-title": "Shell Noctalia",
"privacy-policy": "Politique de confidentialité",
"support": "Soutenez-nous",
"supporter-badge": "Soutien",
"supporters-desc": "Un immense merci à notre incroyable soutien !",
"supporters-desc-plural": "Un grand merci à nos <b>{count} incroyables</b> supporters !",
"supporters-loading": "Chargement des contributeurs...",
"system-cpu": "Processeur :",
"system-disk": "Disque :",
"system-gpu": "GPU :",
@@ -636,7 +689,7 @@
"system-kernel": "Noyau :",
"system-loading": "Chargement des informations système...",
"system-memory": "Mémoire :",
"system-monitor": "Moniteur",
"system-monitor": "Moniteur :",
"system-not-installed": "fastfetch n'est pas installé",
"system-os": "Système d'exploitation :",
"system-packages": "Paquets :",
@@ -672,7 +725,7 @@
"media-frame-rate-label": "Fréquence d'images",
"media-primary-player-description": "Entrez un mot-clé pour identifier votre lecteur principal.",
"media-primary-player-label": "Lecteur principal",
"media-primary-player-placeholder": "ex. spotify, vlc, mpv",
"media-primary-player-placeholder": "ex : spotify, vlc, mpv",
"media-scrolling-speed-description": "Temps en secondes pour que le titre défile du début à la fin.",
"media-scrolling-speed-label": "Vitesse de défilement",
"media-scrolling-title-description": "Activer le défilement continu pour les titres multimédias longs.",
@@ -692,21 +745,33 @@
"volumes-output-volume-description": "Niveau de volume de l'ensemble du système.",
"volumes-step-size-description": "Ajustez l'incrément pour les changements de volume (molette de la souris, raccourcis clavier).",
"volumes-step-size-label": "Incrément de volume",
"volumes-volume-feedback-description": "Émettre un son de retour lors du réglage du volume",
"volumes-volume-feedback-description": "Émettre un son de retour lors du réglage du volume.",
"volumes-volume-feedback-label": "Jouer le son de retour de volume",
"volumes-volume-overdrive-description": "Permet d'augmenter le volume au-delà de 100 %. Cette fonctionnalité peut ne pas être prise en charge par tout le matériel.",
"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-color-description": "Choisissez une couleur pour les capsules de la barre, ou n'en utilisez aucune pour la couleur de surface par défaut.",
"appearance-capsule-color-label": "Couleur de la capsule",
"appearance-capsule-opacity-description": "Définir le niveau d'opacité des arrière-plans des widgets quand la capsule est affichée.",
"appearance-capsule-opacity-label": "Opacité de la capsule",
"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-floating-description": "Afficher la barre sous forme de 'pilule' flottante.",
"appearance-floating-label": "Barre flottante",
"appearance-frame-radius": "Rayon interne",
"appearance-frame-settings-description": "Ajuster l'épaisseur du cadre et le rayon interne",
"appearance-frame-settings-label": "Paramètres du cadre",
"appearance-frame-thickness": "Épaisseur",
"appearance-hide-on-overview-description": "Masquer la barre et fermer les panneaux lorsque l'aperçu du compositeur est actif.",
"appearance-hide-on-overview-label": "Masquer la barre dans l'aperçu",
"appearance-margins-description": "Ajustez les marges autour de la barre flottante.",
@@ -721,6 +786,8 @@
"appearance-show-capsule-label": "Afficher la capsule",
"appearance-show-outline-description": "Affiche une bordure visible autour de chaque widget.",
"appearance-show-outline-label": "Afficher les contours des widgets",
"appearance-type-description": "Choisissez le style de la barre : Simple, Flottante ou Encadrée.",
"appearance-type-label": "Type de barre",
"appearance-use-separate-opacity-description": "Activer l'utilisation d'une valeur d'opacité distincte pour l'arrière-plan de la barre.",
"appearance-use-separate-opacity-label": "Utiliser l'opacité des barres séparément",
"monitor-configure-widgets": "Configurer les widgets",
@@ -734,7 +801,7 @@
"title": "Barre",
"tray-blacklist-description": "Ajouter des règles d'exclusion pour la boîte à miniatures, prend en charge les caractères génériques (*).",
"tray-blacklist-label": "Liste noire",
"tray-blacklist-placeholder": "ex: nm-applet, Fcitx*",
"tray-blacklist-placeholder": "ex : nm-applet, Fcitx*",
"tray-pin-application": "Épingler l'application",
"tray-unpin-application": "Désépingler l'application",
"use-global-widgets": "Utiliser les widgets globaux",
@@ -770,6 +837,7 @@
"download-title": "Télécharger des jeux de couleurs",
"method-description": {
"content": "Schéma Material Design avec extraction de couleurs haute fidélité qui correspond étroitement aux couleurs réelles du contenu source.",
"dysfunctional": "Comme Faithful, mais choisit la deuxième famille de couleurs la plus dominante comme principale.",
"faithful": "Tente de rester proche de la couleur source tout en générant une palette harmonieuse.",
"fruit-salad": "Schéma Material Design qui produit une palette ludique et vibrante avec des teintes diverses et variées.",
"monochrome": "Schéma Material Design utilisant une échelle de gris à teinte unique avec un contenu chromatique minimal.",
@@ -866,6 +934,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",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "Rechercher des polices à chasse fixe...",
"fonts-reset-scaling": "Réinitialiser l'échelle",
"fonts-title": "Polices",
"keybinds-description": "Configurez les touches de navigation globales pour les panneaux et le lanceur.",
"keybinds-down": "Déplacer vers le bas",
"keybinds-enter": "Confirmer / Action",
"keybinds-escape": "Fermer / Retour",
"keybinds-left": "Déplacer à Gauche",
"keybinds-right": "Déplacer à droite",
"keybinds-title": "Raccourcis Clavier de Navigation",
"keybinds-up": "Déplacer vers le haut",
"language-desc": "Choisissez votre langue préférée pour l'application.",
"language-select-auto-detect": "Automatique",
"language-select-description": "Sélectionnez la langue utilisée dans l'interface de l'application.",
@@ -972,7 +1058,9 @@
"screen-corners-solid-black-description": "Utilisez du noir uni au lieu de la couleur de fond de la barre.",
"screen-corners-solid-black-label": "Coins noirs unis",
"screen-corners-title": "Coins de l'écran",
"settings-copied": "Paramètres copiés dans le presse-papier"
"settings-copied": "Paramètres copiés dans le presse-papier",
"tab-basics": "Bases",
"tab-keybinds": "Raccourcis Clavier"
},
"hooks": {
"info-command-info-description": "• Les commandes sont exécutées via le shell (sh -lc)<br>• Les commandes s'exécutent en arrière-plan (détachées)<br>• Les boutons de test s'exécutent avec les valeurs actuelles",
@@ -980,33 +1068,33 @@
"info-parameters-label": "Paramètres disponibles",
"noctalia-started-description": "Commande à exécuter lorsque Noctalia a fini de charger.",
"noctalia-started-label": "Noctalia démarré",
"noctalia-started-placeholder": "p. ex. notify-send 'Noctalia chargé'",
"noctalia-started-placeholder": "ex : notify-send 'Noctalia chargé'",
"performance-mode-disabled-description": "Commande à exécuter lorsque le mode performance Noctalia est désactivé.",
"performance-mode-disabled-label": "mode performance désactivé",
"performance-mode-disabled-placeholder": "ex: notify-send \"Performance\" \"Mode désactivé\"",
"performance-mode-disabled-placeholder": "ex : notify-send \"Performance\" \"Mode désactivé\"",
"performance-mode-enabled-description": "Commande à exécuter lorsque le mode performance Noctalia est activé.",
"performance-mode-enabled-label": "Mode performance activé",
"performance-mode-enabled-placeholder": "ex: notify-send \"Performance\" \"Mode activé\"",
"performance-mode-enabled-placeholder": "ex : notify-send \"Performance\" \"Mode activé\"",
"screen-lock-description": "Commande à exécuter lorsque l'écran est verrouillé.",
"screen-lock-label": "Écran verrouillé",
"screen-lock-placeholder": "ex: notify-send \"Écran\" \"Verrouillé\"",
"screen-lock-placeholder": "ex : notify-send \"Écran\" \"Verrouillé\"",
"screen-unlock-description": "Commande à exécuter lorsque l'écran est déverrouillé.",
"screen-unlock-label": "Écran déverrouillé",
"screen-unlock-placeholder": "ex: notify-send \"Écran\" \"Déverrouillé\"",
"screen-unlock-placeholder": "ex : notify-send \"Écran\" \"Déverrouillé\"",
"session-description": "Commande à exécuter avant l'arrêt ou le redémarrage. Reçoit le type d'action comme $1 (arrêt/redémarrage).",
"session-label": "Fin de session",
"session-placeholder": "p. ex., notify-send \"Session\" \"$1\"",
"session-placeholder": "ex : notify-send \"Session\" \"$1\"",
"system-hooks-desc": "Configurez des commandes à exécuter lors d'événements système.",
"system-hooks-enable-description": "Activer ou désactiver toutes les commandes de hook.",
"system-hooks-enable-label": "Activer les hooks",
"system-hooks-title": "Hooks système",
"theme-changed-description": "Commande à exécuter lorsque le thème bascule entre le mode sombre et clair.",
"theme-changed-label": "Thème changé",
"theme-changed-placeholder": "ex: notify-send \"Thème\" \"Basculé\"",
"theme-changed-placeholder": "ex : notify-send \"Thème\" \"Basculé\"",
"title": "Hooks",
"wallpaper-changed-description": "Commande à exécuter lorsque le fond d'écran change.",
"wallpaper-changed-label": "Fond d'écran changé",
"wallpaper-changed-placeholder": "ex: notify-send \"Fond d'écran\" \"Changé\""
"wallpaper-changed-placeholder": "ex : notify-send \"Fond d'écran\" \"Changé\""
},
"indicator": {
"default-value": "Par défaut : {value}",
@@ -1018,7 +1106,7 @@
"execute-title": "Exécution",
"settings-annotation-tool-description": "Commande à exécuter lorsque l'on clique sur le bouton d'annotation dans l'historique du presse-papiers. L'image sera envoyée à cette commande.",
"settings-annotation-tool-label": "Outil d'annotation",
"settings-annotation-tool-placeholder": "ex. 'gradia', 'satty -f -'",
"settings-annotation-tool-placeholder": "ex : 'gradia', 'satty -f -'",
"settings-auto-paste-description": "Coller automatiquement l'élément sélectionné du presse-papiers. Nécessite wtype.",
"settings-auto-paste-label": "Collage automatique",
"settings-clip-preview-description": "Afficher un aperçu du contenu du presse-papiers lors de l'utilisation de la commande >clip.",
@@ -1027,18 +1115,28 @@
"settings-clip-wrap-text-label": "Envelopper le texte du presse-papiers",
"settings-clipboard-history-description": "Accédez aux éléments précédemment copiés depuis le lanceur.",
"settings-clipboard-history-label": "Activer l'historique du presse-papiers",
"settings-custom-launch-prefix-description": "Préfixer les commandes avec un lanceur personnalisé (ex. 'runapp' pour l'intégration systemd).",
"settings-clipboard-watch-image-description": "Chaîne de commande complète passée à wl-paste pour les changements d'image (redémarrage requis).",
"settings-clipboard-watch-image-label": "Commande de Surveillance d'Images",
"settings-clipboard-watch-text-description": "Chaîne de commande complète passée à wl-paste pour les changements de texte (nécessite un redémarrage).",
"settings-clipboard-watch-text-label": "Commande de surveillance de texte",
"settings-custom-launch-prefix-description": "Préfixer les commandes avec un lanceur personnalisé (ex : 'runapp' pour l'intégration systemd).",
"settings-custom-launch-prefix-enabled-description": "Utiliser un préfixe personnalisé pour lancer les applications au lieu de la méthode par défaut.",
"settings-custom-launch-prefix-enabled-label": "Activer le préfixe de lancement personnalisé",
"settings-custom-launch-prefix-label": "Préfixe de lancement personnalisé",
"settings-density-description": "Ajustez la taille des icônes d'application et la densité du Launcher.",
"settings-density-label": "Densité",
"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",
"settings-ignore-mouse-input-description": "Désactiver l'interaction de la souris et la molette de défilement dans le lanceur.",
"settings-ignore-mouse-input-label": "Ignorer l'entrée de la souris",
"settings-overlay-layer-description": "Affiche le lanceur sur la couche de superposition, au-dessus des fenêtres en plein écran. Lorsqu'il est activé, le lanceur ne s'attachera pas à la barre.",
"settings-overlay-layer-label": "Afficher au-dessus du plein écran",
"settings-position-description": "Choisissez où le panneau du lanceur apparaît.",
"settings-show-categories-description": "Afficher les onglets de catégories pour filtrer les applications.",
"settings-show-categories-label": "Afficher les catégories",
@@ -1046,10 +1144,12 @@
"settings-show-icon-background-label": "Afficher l'arrière-plan de l'icône",
"settings-sort-by-usage-description": "Lorsque cette option est activée, les applications fréquemment lancées apparaissent en premier dans la liste.",
"settings-sort-by-usage-label": "Trier par les plus utilisés",
"settings-terminal-command-description": "Commande pour lancer un terminal. Ex: 'kitty -e' ou 'gnome-terminal --'.",
"settings-terminal-command-description": "Commande pour lancer un terminal. Ex : 'kitty -e' ou 'gnome-terminal --'.",
"settings-terminal-command-label": "Commande du terminal",
"settings-use-app2unit-description": "Utilise une méthode de lancement alternative pour mieux gérer les processus des applications et prévenir les problèmes.",
"settings-use-app2unit-label": "Utiliser App2Unit pour lancer les applications",
"settings-view-mode-description": "Choisis la disposition des entrées du Lanceur.",
"settings-view-mode-label": "Mode d'affichage",
"title": "Lanceur"
},
"location": {
@@ -1066,12 +1166,12 @@
"date-time-show-events-description": "Afficher les événements dans le panneau du calendrier.",
"date-time-show-events-label": "Afficher les événements du calendrier",
"date-time-title": "Date & heure",
"date-time-use-analog-description": "Afficher une horloge de style analogique dans la fenêtre du calendrier et sur l'écran de verrouillage.",
"date-time-use-analog-description": "Afficher une horloge de style analogique sur la fenêtre du calendrier.",
"date-time-use-analog-label": "Utiliser une horloge de style analogique",
"date-time-week-numbers-description": "Afficher la semaine de l'année (ex: Semaine 38) dans le calendrier.",
"date-time-week-numbers-description": "Afficher la semaine de l'année (ex : Semaine 38) dans le calendrier.",
"date-time-week-numbers-label": "Afficher les numéros de semaine",
"location-desc": "Obtenez une météo et une planification de l'éclairage nocturne précises en définissant votre emplacement.",
"location-search-description": "ex: Toronto, ON",
"location-search-description": "ex : Toronto, ON",
"location-search-label": "Rechercher un emplacement",
"location-search-placeholder": "Entrez le nom de l'emplacement",
"location-title": "Votre emplacement",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "Afficher la météo dans le calendrier"
},
"lock-screen": {
"allow-password-with-fprintd-description": "Lorsque fprintd (authentification par empreinte digitale) est actif, cette option vous permet de vous connecter avec votre mot de passe au lieu d'une empreinte digitale.",
"allow-password-with-fprintd-label": "Autoriser la connexion par mot de passe avec fprintd",
"auto-start-auth-description": "Démarre automatiquement l'authentification par empreinte digitale sans nécessiter de pression sur une touche ou un clic de bouton.",
"auto-start-auth-label": "Authentification au démarrage automatique",
"clock-format-description": "Personnalisez le format de l'horloge en utilisant les jetons de syntaxe de date/heure.",
"clock-format-label": "Format de l'horloge",
"clock-style-analog": "Analogique",
"clock-style-custom": "Personnalisé",
"clock-style-description": "Choisissez le style visuel de l'horloge sur l'écran de verrouillage.",
"clock-style-digital": "Numérique",
"clock-style-label": "Style de l'Horloge",
"compact-lockscreen-description": "Afficher uniquement le champ de saisie de connexion et les commandes système, en masquant les widgets météo et multimédia.",
"compact-lockscreen-label": "Écran de verrouillage compact",
"lock-on-suspend-description": "Verrouiller automatiquement l'écran lors de la mise en veille du système.",
"lock-on-suspend-label": "Verrouiller à la suspension",
"lock-screen-animations-description": "Activer ou désactiver les animations de l'écran de verrouillage.",
"lock-screen-animations-label": "Animations de l'Écran de Verrouillage",
"lock-screen-blur-strength-description": "Applique un effet de flou au fond d'écran de l'écran de verrouillage.",
"lock-screen-blur-strength-label": "Intensité du flou de l'écran de verrouillage",
"lock-screen-tint-strength-description": "Applique une superposition de teinte au fond d'écran de l'écran de verrouillage.",
"lock-screen-tint-strength-label": "Force de la teinte de l'écran de verrouillage",
"monitors-desc": "Afficher l'écran de verrouillage sur des moniteurs spécifiques. Par défaut, tous sont utilisés si aucun n'est choisi.",
"show-hibernate-description": "Afficher loption 'hiberner' dans les commandes d'alimentation.",
"show-hibernate-label": "Afficher lhibernation",
"show-session-buttons-description": "Autoriser l'accès aux paramètres d'alimentation depuis l'écran de verrouillage.",
@@ -1126,8 +1244,6 @@
"history-low-urgency-label": "Enregistrer l'urgence faible dans l'historique",
"history-normal-urgency-description": "Enregistrer les notifications de priorité normale dans l'historique.",
"history-normal-urgency-label": "Enregistrer l'urgence normale dans l'historique",
"media-toast-description": "Afficher une notification toast lorsque l'état de lecture du média change.",
"media-toast-label": "Média",
"monitors-desc": "Afficher les notifications sur des moniteurs spécifiques. Par défaut, sur tous si aucun n'est choisi.",
"settings-always-on-top-description": "Afficher les notifications au-dessus des fenêtres en plein écran et des autres applications.",
"settings-background-opacity-description": "Ajuster l'opacité des arrière-plans de notifications.",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "Sons de notification non disponibles",
"sounds-volume-description": "Ajuster le niveau de volume pour les sons de notification.",
"sounds-volume-label": "Volume sonore",
"toast-battery-description": "Afficher un avertissement lorsque le niveau de batterie descend en dessous de ce pourcentage.",
"toast-battery-label": "Avertissement de batterie",
"toast-desc": "Configurer l'apparence et le comportement des notifications toast.",
"toast-keyboard-description": "Afficher une notification lorsque la disposition du clavier change.",
"toast-keyboard-label": "Disposition du clavier"
"toast-keyboard-label": "Disposition du clavier",
"toast-media-description": "Afficher une notification toast lorsque l'état de lecture du média change.",
"toast-media-label": "Média"
},
"osd": {
"always-on-top-description": "Afficher l'OSD au-dessus des fenêtres plein écran et autres couches.",
@@ -1202,16 +1322,20 @@
"types-volume-label": "Volume de sortie"
},
"plugins": {
"auto-update": "Mettre à jour les plugins automatiquement",
"auto-update-description": "Mettre à jour automatiquement tous les plugins au démarrage de la shell.",
"available-description": "Parcourir et installer des plugins à partir des sources configurées.",
"available-label": "Plugins disponibles",
"available-no-plugins-description": "Vérifiez les sources de vos plugins ou actualisez la liste.",
"available-no-plugins-label": "Aucun plugin disponible",
"check-for-updates": "Rechercher des mises à jour",
"checking-for-updates": "Vérification des mises à jour...",
"collision-already-installed": "Ce plugin est déjà installé",
"collision-custom-version-exists": "Une version personnalisée de \"{source}\" est déjà installée",
"collision-official-version-exists": "La version officielle de cette extension est déjà installée",
"filter-downloaded": "Téléchargé",
"filter-not-downloaded": "Non téléchargé",
"filter-tags-description": "Filtrer les extensions par catégorie ou état de téléchargement",
"filter-tags-description": "Filtrer les extensions par catégorie ou état de téléchargement.",
"filter-tags-label": "Mots-clés",
"hot-reload-description": "Recharger automatiquement les plugins lorsque leurs fichiers sont modifiés. Utile pour le développement de plugins.",
"hot-reload-label": "Rechargement à chaud (mode développement)",
@@ -1245,6 +1369,7 @@
"sources-placeholder": "Mon dépôt cool",
"sources-remove-tooltip": "Supprimer la source du plugin",
"title": "Modules d'extension",
"translations-reloaded": "Traductions rechargées : {name}",
"uninstall-dialog-description": "Êtes-vous sûr de vouloir désinstaller {plugin} ? Cette action supprimera toutes les données du plugin.",
"uninstall-dialog-title": "Désinstaller le plugin",
"uninstall-error": "Échec de la désinstallation : {error}",
@@ -1271,11 +1396,14 @@
"entries-desc": "Personnaliser les actions d'alimentation qui apparaissent dans le menu de session et leur ordre.",
"entries-title": "Actions d'alimentation",
"entry-settings-command-description": "Commande personnalisée à exécuter pour cette action. Laisser vide pour utiliser la commande système par défaut.",
"entry-settings-command-placeholder": "systemctl poweroff",
"entry-settings-command-placeholder": "ex : systemctl poweroff",
"entry-settings-default-command-lock": "Écran de verrouillage interne (sans commande)",
"entry-settings-default-command-logout": "Déconnexion interne (sans commande)",
"entry-settings-default-info-description": "Si aucune commande personnalisée n'est spécifiée, la commande système par défaut sera utilisée.",
"entry-settings-default-info-label": "Commande par défaut",
"entry-settings-keybind-description": "Attribuez une combinaison de touches pour déclencher cette action lorsque le menu de session est ouvert.",
"entry-settings-keybind-placeholder": "Appuyez sur Enregistrer pour assigner une touche...",
"entry-settings-keybind-recording": "Enregistrement... Appuyez sur n'importe quelle combinaison de touches",
"entry-settings-title": "Configurer {entry}",
"entry-settings-tooltip": "Configurer la commande",
"general-desc": "Configurer le comportement et l'apparence du panneau du menu de session.",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "Couleur critique",
"custom-highlight-colors-title-label": "Couleurs de surbrillance personnalisées",
"disk-available-label": "Espace disque disponible",
"disk-section-label": "Utilisation disque",
"enable-dgpu-monitoring-description": "Attention : Ceci va activer votre GPU dédié (NVIDIA/AMD), ce qui peut avoir un impact significatif sur l'autonomie de la batterie des ordinateurs portables dotés de cartes graphiques hybrides.",
"enable-dgpu-monitoring-label": "Activer la surveillance du GPU dédié",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "Choisir la disposition des paramètres (peut nécessiter une réouverture).",
"settings-panel-mode-label": "Mode du panneau des paramètres",
"shadows-description": "Active les ombres portées sous les barres et les panneaux.",
"shadows-direction-description": "Choisissez dvient lombre.",
"shadows-direction-description": "Choisissez où l'ombre est projetée.",
"shadows-direction-label": "Direction de lombre",
"shadows-label": "Ombres portées",
"title": "Interface utilisateur",
@@ -1357,7 +1486,7 @@
"automation-change-mode-alphabetical": "Alphabétique",
"automation-change-mode-description": "Choisissez comment les fonds d'écran sont sélectionnés lors du changement automatique.",
"automation-change-mode-label": "Mode de changement",
"automation-custom-interval-description": "Entrez l'heure au format HH:MM (ex: 01:30).",
"automation-custom-interval-description": "Entrez l'heure au format HH:MM (ex : 01:30).",
"automation-custom-interval-label": "Intervalle personnalisé",
"automation-interval-description": "Fréquence de changement automatique des fonds d'écran.",
"automation-interval-label": "Intervalle du fond d'écran",
@@ -1386,6 +1515,10 @@
"settings-monitor-specific-description": "Définissez un dossier de fond d'écran différent pour chaque moniteur.",
"settings-monitor-specific-label": "Dossiers spécifiques au moniteur",
"settings-monitor-specific-tooltip": "Dossier des fonds d'écran du moniteur",
"settings-overview-blur-strength-description": "Applique la force du flou à l'aperçu.",
"settings-overview-blur-strength-label": "Force du flou de l'aperçu",
"settings-overview-tint-description": "Applique la force de la teinte à l'aperçu.",
"settings-overview-tint-label": "Force de la teinte de l'aperçu",
"settings-recursive-search-description": "Rechercher également des fonds d'écran dans les sous-dossiers du répertoire des fonds d'écran.",
"settings-recursive-search-label": "Rechercher dans les sous-dossiers",
"settings-select-monitor-folder": "Sélectionner le dossier des fonds d'écran du moniteur",
@@ -1407,11 +1540,11 @@
"enter-command": "Entrez la commande à exécuter (application ou script personnalisé)",
"enter-ipc-identifier": "Entrez un identifiant unique pour les commandes IPC",
"enter-path": "Entrez le chemin...",
"enter-text-to-collapse": "par ex., 'rien nest en lecture'. Utilisez /regex/ pour les modèles.",
"enter-text-to-collapse": "ex : 'rien nest en lecture'. Utilisez /regex/ pour les modèles.",
"enter-tooltip": "Entrer l'infobulle",
"enter-width-pixels": "Entrez la largeur en pixels",
"search": "Rechercher...",
"search-icons": "ex: noctalia, niri, batterie, nuage",
"search-icons": "ex : noctalia, niri, batterie, nuage",
"search-launcher": "Rechercher des entrées... ou utilisez > pour les commandes",
"search-wallhaven": "Rechercher sur Wallhaven...",
"search-wallpapers": "Tapez pour filtrer les fonds d'écran..."
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "Terminé !",
"appearance": {
"subheader": "Choisissez le Dark Mode et les sources de couleurs (Fond d'écran ou prédéfinies)."
"subheader": "Choisissez le mode sombre et les sources de couleur (fond d'écran ou prédéfinies)."
},
"customize": {
"header": "Personnaliser votre expérience",
@@ -1449,7 +1582,7 @@
},
"skip-setup": "Ignorer la configuration",
"telemetry-wizard-done": "Bien reçu !",
"telemetry-wizard-note": "Vous avez le contrôle : activez ou désactivez cette option à tout moment dans les Paramètres",
"telemetry-wizard-note": "Vous avez le contrôle  activez ou désactivez cette option à tout moment dans les paramètres",
"telemetry-wizard-subtitle": "Nous avons ajouté des analyses anonymes pour aider à améliorer Noctalia",
"telemetry-wizard-title": "Mise à jour de la confidentialité",
"wallpaper": {
@@ -1490,7 +1623,7 @@
"disk": "Disque",
"download-speed": "Vitesse de téléchargement",
"gpu-temp": "Température du GPU",
"load-average": "Charge moy.",
"load-average": "Charge moyenne",
"title": "Moniteur système",
"upload-speed": "Vitesse denvoi"
},
@@ -1499,8 +1632,10 @@
"title": "Mode avion"
},
"battery": {
"critical": "Batterie critique",
"critical-desc": "Batterie à {percent}% — veuillez connecter le chargeur immédiatement",
"low": "Batterie faible",
"low-desc": "La batterie est à {percent}%. Veuillez brancher le chargeur"
"low-desc": "Batterie à {percent}% — veuillez connecter le chargeur"
},
"bluetooth": {
"address-copied": "Adresse copiée dans le presse-papiers",
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "Disque",
"fade": "Fondu",
"honeycomb": "Nid d'abeille",
"pixelate": "Pixéliser",
"stripes": "Rayures",
"wipe": "Balayage"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "Chargement des fonds d'écran...",
"no-results": "Aucun fond d'écran trouvé. Essayez une autre requête de recherche.",
"page": "{current} sur {total}"
"page": "{current} sur {total}",
"page-prefix": "Page",
"page-suffix": "de {total}"
}
},
"weather": {
-5
View File
@@ -1,5 +0,0 @@
{
"toast": {
"donation-opened": "दान पृष्ठ आपके ब्राउज़र में खुला"
}
}
+171 -32
View File
@@ -48,11 +48,16 @@
"device-default": "Alapértelmezett (Megjelenítő eszköz)",
"device-description": "Válassza ki, melyik akkumulátor eszközt jelenítse meg.",
"device-label": "Akkumulátor eszköz",
"display-mode-description": "Válassza ki, hogyan jelenjen meg az akkumulátor a sávban.",
"display-mode-graphic": "Grafikus akkumulátor",
"display-mode-graphic-clean": "Grafikus akkumulátor (százalék nélkül)",
"display-mode-icon-always": "Ikon - Mindig mutassa a %-ot",
"display-mode-icon-hover": "Ikon - Rámutatásra megjelenik",
"display-mode-icon-only": "Csak ikon",
"hide-if-idle-description": "Widget elrejtése, ha az akkumulátor nincs töltés alatt vagy lemerülőben.",
"hide-if-idle-label": "Elrejtés tétlenség esetén",
"hide-if-not-detected-description": "Widget elrejtése, ha a rendszer nem észlel akkumulátort.",
"hide-if-not-detected-label": "Elrejtés, ha nincs észlelve",
"low-battery-threshold-description": "Figyelmeztetés megjelenítése, ha az akkumulátor töltöttsége e százalék alá esik.",
"low-battery-threshold-label": "Alacsony akkumulátor töltöttségi figyelmeztetési küszöb",
"show-noctalia-performance-description": "A Noctalia teljesítménymód kapcsoló megjelenítése az akkumulátor panelen belül.<br>Kikapcsolja az árnyékokat és animációkat a Noctalia-ban az erőforrás-felhasználás csökkentése érdekében.",
"show-noctalia-performance-label": "Noctalia teljesítménymód kapcsoló",
@@ -75,8 +80,6 @@
"use-custom-font-label": "Egyéni betűtípus használata",
"use-monospaced-font-description": "Ha engedélyezve van, az óra a monospace betűtípust fogja használni.",
"use-monospaced-font-label": "Monospace betűtípus használata",
"use-primary-color-description": "Ha engedélyezve van, ez az elsődleges színt alkalmazza a hangsúlyozáshoz.",
"use-primary-color-label": "Elsődleges szín használata",
"vertical-bar-description": "Használjon szóközt az egyes részek új sorba való elkülönítéséhez.",
"vertical-bar-label": "Függőleges sáv"
},
@@ -94,7 +97,6 @@
"collapse-condition-description": "Ha a kimeneti szöveg megegyezik ezzel az értékkel, a gomb összecsukódik.",
"collapse-condition-label": "Összecsukási feltétel",
"color-selection-description": "Témák színeinek alkalmazása az ikonra és a szövegre.",
"color-selection-label": "Szín kiválasztása",
"display-command-output-description": "Adjon meg egy parancsot, amelyet rendszeres időközönként futtatni szeretne. A kimenetének első sora szövegként jelenik meg.",
"display-command-output-label": "Parancs kimenetének megjelenítése",
"display-command-output-stream-description": "Adjon meg egy parancsot, amelyet folyamatosan futtatni szeretne.",
@@ -182,7 +184,9 @@
"hide-widget-when-zero-unread-description": "Az értesítési ikon elrejtése, ha nincs olvasatlan értesítés.",
"hide-widget-when-zero-unread-label": "Ikon elrejtése, amikor nincs olvasatlan értesítés",
"show-unread-badge-description": "Jelenítsen meg egy jelvényt, amely mutatja az olvasatlan értesítések számát.",
"show-unread-badge-label": "Olvasatlan jelvény megjelenítése"
"show-unread-badge-label": "Olvasatlan jelvény megjelenítése",
"unread-badge-color-description": "Válaszd ki az olvasatlan értesítési jelvény színét.",
"unread-badge-color-label": "Olvasatlan jelvény színe"
},
"section-editor": {
"placeholder": "Válasszon hozzáadandó widgetet...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "A statisztikákat mini sávdiagramokként jelenítse meg a szöveges értékek helyett. Megakadályozza az elrendezés eltolódását.",
"compact-mode-label": "Kompakt mód",
"cpu-frequency-description": "Az aktuális CPU órajel megjelenítése GHz-ben.",
"cpu-frequency-label": "CPU frekvencia megjelenítése",
"cpu-temperature-description": "CPU hőmérséklet-adatok megjelenítése, ha elérhetőek.",
"cpu-temperature-label": "CPU hőmérséklet",
"cpu-usage-description": "Jelenítse meg az aktuális CPU-használati százalékot.",
@@ -209,6 +215,10 @@
"memory-usage-label": "Memóriahasználat",
"network-traffic-description": "Hálózati feltöltési és letöltési sebességek megjelenítése.",
"network-traffic-label": "Hálózati forgalom",
"storage-as-percentage-description": "Lemezterület megjelenítése százalékban abszolút értékek helyett.",
"storage-as-percentage-label": "Lemez százalékban",
"storage-available-description": "Azt mutatja, mennyi lemezterület áll rendelkezésre, ahelyett, hogy mennyit használnak.",
"storage-available-label": "Rendelkezésre álló lemezterület",
"storage-usage-description": "Lemezterület-használati információk megjelenítése.",
"storage-usage-label": "Tárhelyhasználat",
"swap-usage-description": "Cserehely memória használatának megjelenítése.",
@@ -240,6 +250,8 @@
"title-width-reset-tooltip": "Cím szélességének alaphelyzetbe állítása"
},
"tray": {
"chevron-color-description": "Alkalmazza a témaszíneket a fiók nyíl ikonjára.",
"chevron-color-label": "Nyíl színe",
"colorize-icons-description": "Témaszínek alkalmazása a tálcaikonokra.",
"colorize-icons-label": "Ikonok színezése",
"drawer-enabled-description": "Ha be van kapcsolva, a nem rögzített tálcaelemek egy fiókpanelen jelennek meg.<br>Kikapcsolva az összes tálcaelem sorban jelenik meg.",
@@ -248,14 +260,17 @@
"hide-passive-label": "Passzív elemek elrejtése"
},
"volume": {
"display-mode-description": "Válassza ki, hogyan jelenjen meg ez az érték.",
"display-mode-label": "Megjelenítési mód"
"display-mode-description": "Válassza ki, hogyan jelenjen meg ez az érték."
},
"workspace": {
"character-count-description": "A munkaterületnevekből megjelenítendő karakterek száma (1-10).",
"character-count-label": "Karakterek száma",
"empty-color-description": "Üres Workspaces háttérszínének beállítása.",
"empty-color-label": "Üres munkafelület színe",
"enable-scrollwheel-description": "Váltás a munkaterületek között az egérgörgővel.",
"enable-scrollwheel-label": "Görgetés a munkaterületek váltásához",
"focused-color-description": "Állítsd be a fókuszált Workspace háttérszínét.",
"focused-color-label": "Fókuszált munkaterület színe",
"follow-focused-screen-description": "Munkaterületek megjelenítése az aktuálisan fókuszált képernyőről, nem arról a képernyőről, ahol a sáv található.",
"follow-focused-screen-label": "Fókuszált képernyő követése",
"grouped-border-opacity-description": "A munkaterület-konténerek szegélyeinek átlátszósági szintjének beállítása.",
@@ -264,8 +279,16 @@
"hide-unoccupied-label": "Foglalatlan elrejtése",
"label-mode-description": "Válassza ki, hogyan jelenjenek meg a munkaterület címkéi.",
"label-mode-label": "Címke mód",
"occupied-color-description": "A foglalt Workspaces háttérszínének beállítása.",
"occupied-color-label": "Foglalt munkaterület színe",
"pill-size-description": "Állítsa be a munkaterület-jelzők méretét (50%-100%).",
"pill-size-label": "Pill méret",
"reverse-scrolling-description": "Görgetéskor fordított irányba váltson a munkaterületek között.",
"reverse-scrolling-label": "Görgetés megfordítása",
"show-applications-description": "Alkalmazásikonok megjelenítése minden munkaterületen belül.",
"show-applications-label": "Alkalmazások megjelenítése",
"show-badge-description": "Munkaterület számának jelzése csoportosított módban.",
"show-badge-label": "Munkafelület jelvény megjelenítése",
"show-labels-only-when-occupied-description": "Csak akkor jelenítse meg a munkaterület címkéket, ha azok tartalmaznak ablakokat.",
"show-labels-only-when-occupied-label": "Címkék megjelenítése csak foglalt állapotban",
"unfocused-icons-opacity-description": "Állítsa be a nem fókuszált alkalmazásikonok átlátszóságának szintjét.",
@@ -327,13 +350,6 @@
"version-new-user": "Új telepítés"
}
},
"colors": {
"error": "Hiba",
"on-surface": "A felszínen",
"primary": "Elsődleges",
"secondary": "Másodlagos",
"tertiary": "Harmadlagos"
},
"common": {
"actions": "Műveletek",
"add": "Hozzáadás",
@@ -373,10 +389,13 @@
"disconnect": "Kapcsolat bontása",
"disconnected": "Kapcsolat bontva",
"disconnecting": "Kapcsolat bontása...",
"display-mode": "Kijelző mód",
"download": "Letöltés",
"duration": "Időtartam",
"dysfunctional": "Diszfunkcionális",
"edit": "Szerkesztés",
"enabled": "Engedélyezve",
"error": "Hiba",
"events": "Események",
"execute": "Végrehajt",
"faithful": "Hű",
@@ -395,6 +414,7 @@
"installed": "Telepítve",
"interface": "Felület",
"internet": "Internet",
"keybind": "Billentyűkombináció",
"language": "Nyelv",
"loading": "Betöltés...",
"local": "Helyi",
@@ -416,6 +436,7 @@
"not-found": "Nem található",
"notifications": "Értesítések",
"official": "Hivatalos",
"on-surface": "Felületen",
"output": "Kimenet",
"pair": "Párosítás",
"paired": "Párosítva",
@@ -428,11 +449,14 @@
"polling": "Lekérdezés",
"position": "Pozíció",
"previous": "Előző",
"primary": "Elsődleges",
"random": "Véletlen",
"reboot": "Újraindítás",
"record": "Felvétel indítása",
"refresh": "Frissítés",
"required": "(kötelező)",
"reset": "Visszaállítás",
"reset-to-default": "Visszaállítás Alapértelmezettre",
"result-count": "{count} eredmény",
"result-count-plural": "eredmények",
"resume": "Folytatás",
@@ -440,8 +464,12 @@
"scanning": "Szkennelés...",
"screen-corners": "Képernyő sarkok",
"search": "Keresés",
"secondary": "Másodlagos",
"security": "Biztonság",
"select": "Kiválasztás",
"select-color": "Szín kiválasztása",
"select-color-description": "Alkalmazza a témaszíneket a kiemeléshez.",
"select-icon-color": "Ikon színének kiválasztása",
"shortcuts": "Gyorsbillentyűk",
"shutdown": "Leállítás",
"signal": "Jelzés",
@@ -449,8 +477,10 @@
"sources": "Források",
"start": "Kezdés",
"stop": "Állj",
"supporters": "Támogatók",
"suspend": "Felfüggesztés",
"templates": "Sablonok",
"tertiary": "Harmadlagos",
"test": "Teszt",
"thresholds": "Küszöbértékek",
"title": "Cím",
@@ -473,6 +503,7 @@
"week": "Hét",
"widgets": "Widgetek",
"width": "Szélesség",
"windows": "Ablakok",
"yes": "Igen"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "Rámutatáskor"
},
"hide-modes": {
"auto-hide": "Automatikus elrejtés",
"hidden": "Elrejtés, ha üres",
"idle": "Elrejtés, ha tétlen",
"non-exclusive": "Nem kizárólagos",
"transparent": "Átlátszó, ha üres",
"visible": "Mindig látható"
},
@@ -543,7 +576,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": {
@@ -579,13 +614,26 @@
"density-compact": "Kompakt",
"density-default": "Alapértelmezett",
"density-mini": "Mini",
"density-spacious": "Tágas"
"density-spacious": "Tágas",
"display-mode-always-visible": "Mindig látható",
"type-floating": "Lebegő",
"type-framed": "Keretes",
"type-simple": "Egyszerű"
},
"control-center": {
"quick-settings-style-classic": "Klasszikus",
"quick-settings-style-modern": "Modern"
},
"frame-rates-fps": "{fps} FPS",
"launcher-density": {
"comfortable": "Kényelmes",
"compact": "Kompakt",
"default": "Alapértelmezett"
},
"launcher-view-mode": {
"grid": "Rács",
"list": "Lista"
},
"scrolling-modes": {
"always": "Mindig görgetés",
"hover": "Görgetés rámutatáskor",
@@ -616,8 +664,9 @@
},
"panels": {
"about": {
"become-supporter": "Legyél támogató",
"changelog": "Változások megtekintése",
"contributors-desc": "Köszönet a(z) {count} <b>fantasztikus</b> közreműködőnknek!",
"contributors-description": "Köszönet a(z) {count} <b>fantasztikus</b> közreműködőnknek!",
"contributors-description-plural": "Köszönet a(z) {count} <b>fantasztikus</b> közreműködőnknek!",
"copy-info": "Információk másolása",
"info-copied": "Információ a vágólapra másolva",
@@ -628,6 +677,10 @@
"noctalia-title": "Noctalia shell",
"privacy-policy": "Adatvédelmi irányelvek",
"support": "Támogasson minket",
"supporter-badge": "Támogató",
"supporters-desc": "Hatalmas köszönet csodálatos támogatóinknak!",
"supporters-desc-plural": "Hatalmas köszönet a <b>{count} csodálatos</b> támogatóinknak!",
"supporters-loading": "Támogatók betöltése...",
"system-cpu": "CPU:",
"system-disk": "Lemez:",
"system-gpu": "GPU:",
@@ -692,21 +745,33 @@
"volumes-output-volume-description": "Rendszerszintű hangerőszint.",
"volumes-step-size-description": "Beállítja a hangerő változtatásának lépésméretét (görgő, billentyűparancsok).",
"volumes-step-size-label": "Hangerő lépésmérete",
"volumes-volume-feedback-description": "Hangerő állításakor visszajelző hang lejátszása",
"volumes-volume-feedback-description": "Hangerő állításakor visszajelző hang lejátszása.",
"volumes-volume-feedback-label": "Hangerő visszajelző hang lejátszása",
"volumes-volume-overdrive-description": "Engedélyezi a hangerő 100% fölé emelését. Előfordulhat, hogy nem minden hardver támogatja.",
"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-color-description": "Válassz színt a sávkapszulákhoz, vagy ne használj semmit az alapértelmezett felületszínhez.",
"appearance-capsule-color-label": "Kapszula színe",
"appearance-capsule-opacity-description": "Beállítja a widget hátterének átlátszósági szintjét, amikor a kapszula megjelenik.",
"appearance-capsule-opacity-label": "Kapszula átlátszósága",
"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-floating-description": "Megjeleníti a sávot lebegő „pirulaként”.",
"appearance-floating-label": "Lebegő sáv",
"appearance-frame-radius": "Belső sugár",
"appearance-frame-settings-description": "Állítsa be a keret vastagságát és a belső sarok sugarát",
"appearance-frame-settings-label": "Keret beállításai",
"appearance-frame-thickness": "Vastagság",
"appearance-hide-on-overview-description": "A sáv elrejtése és a panelek bezárása, amikor a kompozitor áttekintése aktív.",
"appearance-hide-on-overview-label": "Sáv elrejtése az áttekintésben",
"appearance-margins-description": "Beállítja a lebegő sáv körüli margókat.",
@@ -721,6 +786,8 @@
"appearance-show-capsule-label": "Kapszula megjelenítése",
"appearance-show-outline-description": "Látható szegély megjelenítése minden widget körül.",
"appearance-show-outline-label": "Widget körvonalak megjelenítése",
"appearance-type-description": "Válassza ki a sáv stílusát: Egyszerű, Lebegő vagy Keretes.",
"appearance-type-label": "Sáv típusa",
"appearance-use-separate-opacity-description": "Lehetővé teszi egy külön átlátszatlansági érték használatát a sáv hátteréhez.",
"appearance-use-separate-opacity-label": "Külön oszlop átlátszóság használata",
"monitor-configure-widgets": "Widgetek konfigurálása",
@@ -770,6 +837,7 @@
"download-title": "Színsémák letöltése",
"method-description": {
"content": "Material Design séma nagy pontosságú színkivonással, amely szorosan illeszkedik a forrás tartalom tényleges színeihez.",
"dysfunctional": "Mint a Faithful, de a második legdominánsabb színcsaládot választja elsődlegesnek.",
"faithful": "Igyekszik közel maradni a forrásszínhez, miközben harmonikus palettát generál.",
"fruit-salad": "Material Design séma, amely játékos, élénk palettát hoz létre változatos árnyalatokkal.",
"monochrome": "Material Design séma egyszínű szürkeskálával, minimális színtartalommal.",
@@ -866,6 +934,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",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "Monospace betűtípus keresése...",
"fonts-reset-scaling": "Méretezés visszaállítása",
"fonts-title": "Betűtípusok",
"keybinds-description": "Globális navigációs billentyűk beállítása a panelekhez és az indítóhoz.",
"keybinds-down": "Lejjebb mozgatás",
"keybinds-enter": "Megerősítés / Művelet",
"keybinds-escape": "Bezárás / Vissza",
"keybinds-left": "Balra mozgat",
"keybinds-right": "Mozgatás jobbra",
"keybinds-title": "Navigációs Billentyűparancsok",
"keybinds-up": "Feljebb",
"language-desc": "Válassza ki az alkalmazás előnyben részesített nyelvét.",
"language-select-auto-detect": "Automatikus",
"language-select-description": "Válassza ki az alkalmazás felületén használt nyelvet.",
@@ -972,7 +1058,9 @@
"screen-corners-solid-black-description": "Használjon egyszínű feketét a sáv háttérszíne helyett.",
"screen-corners-solid-black-label": "Tömör fekete sarkok",
"screen-corners-title": "Képernyősarkok",
"settings-copied": "Beállítások a vágólapra másolva"
"settings-copied": "Beállítások a vágólapra másolva",
"tab-basics": "Alapok",
"tab-keybinds": "Billentyűparancsok"
},
"hooks": {
"info-command-info-description": "• A parancsok shellen keresztül futnak (sh -lc)<br>• A parancsok a háttérben futnak (leválasztva)<br>• A tesztgombok az aktuális értékekkel futnak le",
@@ -1027,18 +1115,28 @@
"settings-clip-wrap-text-label": "Clipboard szöveg becsomagolása",
"settings-clipboard-history-description": "Hozzáférés a korábban másolt elemekhez az indítóból.",
"settings-clipboard-history-label": "Vágólapelőzmények engedélyezése",
"settings-clipboard-watch-image-description": "A wl-paste-nek átadott teljes parancssor képmódosításokhoz (újraindítás szükséges).",
"settings-clipboard-watch-image-label": "Képfigyelő Parancs",
"settings-clipboard-watch-text-description": "A wl-paste-nek átadott teljes parancssor a szövegváltozásokhoz (újraindítást szükséges).",
"settings-clipboard-watch-text-label": "Szövegfigyelő parancs",
"settings-custom-launch-prefix-description": "Előtagolja a parancsokat egyéni indítóval (pl. 'runapp' a systemd integrációhoz).",
"settings-custom-launch-prefix-enabled-description": "Használjon egyéni előtagot az alkalmazások indításához az alapértelmezett módszer helyett.",
"settings-custom-launch-prefix-enabled-label": "Egyéni indítási előtag engedélyezése",
"settings-custom-launch-prefix-label": "Egyéni indítási előtag",
"settings-density-description": "Állítsd be az alkalmazásikonok méretét és a Launcher sűrűségét.",
"settings-density-label": "Sűrűség",
"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",
"settings-ignore-mouse-input-description": "A launcherben tiltsd le az egérműveleteket és a görgőt.",
"settings-ignore-mouse-input-label": "Egérbemenet figyelmen kívül hagyása",
"settings-overlay-layer-description": "Jelenítse meg az indítót az átfedő rétegen, a teljes képernyős ablakok felett. Ha engedélyezve van, az indító nem fog a sávhoz csatlakozni.",
"settings-overlay-layer-label": "Megjelenítés teljes képernyő felett",
"settings-position-description": "Hol jelenjen meg az indító panel.",
"settings-show-categories-description": "Kategóriafülek megjelenítése az alkalmazások szűréséhez.",
"settings-show-categories-label": "Kategóriák megjelenítése",
@@ -1046,10 +1144,12 @@
"settings-show-icon-background-label": "Ikon háttér megjelenítése",
"settings-sort-by-usage-description": "Ha engedélyezve van, a gyakran indított alkalmazások jelennek meg először a listán.",
"settings-sort-by-usage-label": "Rendezés gyakoriság szerint",
"settings-terminal-command-description": "Parancs a terminál indításához. Pl.: 'kitty -e' vagy 'gnome-terminal --'.",
"settings-terminal-command-description": "Parancs a terminál indításához. Pl. 'kitty -e' vagy 'gnome-terminal --'.",
"settings-terminal-command-label": "Terminál parancs",
"settings-use-app2unit-description": "Alternatív indítási módszert használ az alkalmazásfolyamatok jobb kezelésére és a problémák megelőzésére.",
"settings-use-app2unit-label": "App2Unit használata alkalmazások indításához",
"settings-view-mode-description": "Válaszd ki az indító bejegyzések elrendezését.",
"settings-view-mode-label": "Nézet mód",
"title": "Indító"
},
"location": {
@@ -1066,7 +1166,7 @@
"date-time-show-events-description": "Események megjelenítése a naptár panelen.",
"date-time-show-events-label": "Naptáresemények megjelenítése",
"date-time-title": "Dátum és idő",
"date-time-use-analog-description": "Analóg stílusú óra megjelenítése a naptár ablakon és a zárképernyőn.",
"date-time-use-analog-description": "Analóg stílusú óra megjelenítése a naptár ablakon.",
"date-time-use-analog-label": "Analóg stílusú óra használata",
"date-time-week-numbers-description": "Az év hetének megjelenítése (pl. 38. hét) a naptárban.",
"date-time-week-numbers-label": "Hét számok megjelenítése",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "Időjárás megjelenítése a naptárban"
},
"lock-screen": {
"allow-password-with-fprintd-description": "Ha az fprintd (ujjlenyomat-hitelesítés) aktív, ez az opció lehetővé teszi, hogy továbbra is jelszóval jelentkezzen be ujjlenyomat helyett.",
"allow-password-with-fprintd-label": "Jelszavas bejelentkezés engedélyezése fprintd-vel",
"auto-start-auth-description": "Automatikusan elindítja az ujjlenyomat-hitelesítést anélkül, hogy billentyűt kellene megnyomni vagy gombra kellene kattintani.",
"auto-start-auth-label": "Automatikus hitelesítés indításkor",
"clock-format-description": "Testreszabhatja az óra formátumát dátum/idő szintaxis tokenek használatával.",
"clock-format-label": "Óraformátum",
"clock-style-analog": "Analóg",
"clock-style-custom": "Egyéni",
"clock-style-description": "Válaszd ki az óra vizuális stílusát a zárolási képernyőn.",
"clock-style-digital": "Digitális",
"clock-style-label": "Óra stílus",
"compact-lockscreen-description": "Csak a bejelentkezési beviteli mező és a rendszervezérlők megjelenítése, elrejtve az időjárás és média widgeteket.",
"compact-lockscreen-label": "Kompakt zárolási képernyő",
"lock-on-suspend-description": "A képernyő automatikus zárolása a rendszer felfüggesztésekor.",
"lock-on-suspend-label": "Zárolás felfüggesztéskor",
"lock-screen-animations-description": "A zárolási képernyő animációinak engedélyezése vagy letiltása.",
"lock-screen-animations-label": "Zárolási Képernyő Animációk",
"lock-screen-blur-strength-description": "Homályosító effektust alkalmaz a zárolási képernyő háttérképére.",
"lock-screen-blur-strength-label": "Zárolási képernyő elmosásának erőssége",
"lock-screen-tint-strength-description": "Színezett átfedést alkalmaz a zárolási képernyő háttérképére.",
"lock-screen-tint-strength-label": "Zárolási képernyő árnyalatának erőssége",
"monitors-desc": "Zárolási képernyő megjelenítése meghatározott monitorokon. Alapértelmezetten mindegyiken megjelenik, ha nincs kiválasztva.",
"show-hibernate-description": "A 'hibernálás' lehetőség megjelenítése az energiakezelési műveletek között.",
"show-hibernate-label": "Hibernálás megjelenítése",
"show-session-buttons-description": "Engedélyezi a hozzáférést az energiabeállításokhoz a zárolási képernyőről.",
@@ -1126,8 +1244,6 @@
"history-low-urgency-label": "Alacsony sürgősség mentése az előzményekbe",
"history-normal-urgency-description": "Normál prioritású értesítések mentése az előzményekbe.",
"history-normal-urgency-label": "Normál sürgősség mentése az előzményekbe",
"media-toast-description": "Toast üzenet megjelenítése a média lejátszási állapotának változásakor.",
"media-toast-label": "Média",
"monitors-desc": "Értesítés megjelenítése meghatározott monitorokon. Alapértelmezetten mindegyiken, ha nincs kiválasztva.",
"settings-always-on-top-description": "Értesítések megjelenítése teljes képernyős ablakok és más rétegek felett.",
"settings-background-opacity-description": "Az értesítési hátterek átlátszóságának beállítása.",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "Értesítési hangok nem érhetők el",
"sounds-volume-description": "Az értesítési hangok hangerejének beállítása.",
"sounds-volume-label": "Hangerő",
"toast-battery-description": "Figyelmeztetés megjelenítése, ha az akkumulátor töltöttségi szintje ez alá a százalék alá esik.",
"toast-battery-label": "Akkumulátor figyelmeztetés",
"toast-desc": "Felugró üzenet megjelenésének és viselkedésének beállítása.",
"toast-keyboard-description": "Felugró üzenet megjelenítése a billentyűzetkiosztás változásakor.",
"toast-keyboard-label": "Billentyűzetkiosztás"
"toast-keyboard-label": "Billentyűzetkiosztás",
"toast-media-description": "Toast üzenet megjelenítése a média lejátszási állapotának változásakor.",
"toast-media-label": "Média"
},
"osd": {
"always-on-top-description": "Képernyőn megjelenő kijelző megjelenítése teljes képernyős ablakok és más rétegek felett.",
@@ -1202,16 +1322,20 @@
"types-volume-label": "Kimeneti hangerő"
},
"plugins": {
"auto-update": "Beépülők automatikus frissítése",
"auto-update-description": "Automatikusan frissítse az összes plugint a shell indításakor.",
"available-description": "Bővítmények böngészése és telepítése a beállított forrásokból.",
"available-label": "Elérhető bővítmények",
"available-no-plugins-description": "Ellenőrizze a bővítményforrásokat, vagy frissítse a listát.",
"available-no-plugins-label": "Nincsenek elérhető bővítmények",
"check-for-updates": "Frissítések keresése",
"checking-for-updates": "Frissítések keresése...",
"collision-already-installed": "Ez a bővítmény már telepítve van",
"collision-custom-version-exists": "Egyéni verzió a következő helyről: \"{source}\" már telepítve van",
"collision-official-version-exists": "A plugin hivatalos verziója már telepítve van",
"filter-downloaded": "Letöltött",
"filter-not-downloaded": "Nincs letöltve",
"filter-tags-description": "Bővítmények szűrése kategória vagy letöltési állapot szerint",
"filter-tags-description": "Bővítmények szűrése kategória vagy letöltési állapot szerint.",
"filter-tags-label": "Címkék",
"hot-reload-description": "Automatikusan újratölti a bővítményeket, amikor a fájljaik megváltoznak. Hasznos a bővítményfejlesztéshez.",
"hot-reload-label": "Gyors újratöltés (fejlesztői mód)",
@@ -1245,6 +1369,7 @@
"sources-placeholder": "Saját menő tárolóm",
"sources-remove-tooltip": "Bővítményforrás eltávolítása",
"title": "Bővítmények",
"translations-reloaded": "Fordítások újratöltve: {name}",
"uninstall-dialog-description": "Biztosan el szeretné távolítani a(z) {plugin} bővítményt? Ez eltávolítja az összes bővítményadatot.",
"uninstall-dialog-title": "Bővítmény eltávolítása",
"uninstall-error": "Sikertelen eltávolítás: {error}",
@@ -1276,6 +1401,9 @@
"entry-settings-default-command-logout": "Belső kijelentkezés (nincs parancs)",
"entry-settings-default-info-description": "Ha nincs megadva egyéni parancs, az alapértelmezett rendszerparancs kerül felhasználásra.",
"entry-settings-default-info-label": "Alapértelmezett parancs",
"entry-settings-keybind-description": "Rendeljen hozzá billentyűkombinációt ezen művelet elindításához, amikor a munkamenet menü nyitva van.",
"entry-settings-keybind-placeholder": "Nyomja meg a Felvétel gombot egy billentyű hozzárendeléséhez...",
"entry-settings-keybind-recording": "Felvétel... Nyomjon meg bármilyen billentyűkombinációt",
"entry-settings-title": "{entry} konfigurálása",
"entry-settings-tooltip": "Parancs konfigurálása",
"general-desc": "A munkamenet menüpanel viselkedésének és megjelenésének konfigurálása.",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "Kritikus szín",
"custom-highlight-colors-title-label": "Egyéni kiemelőszínek",
"disk-available-label": "Rendelkezésre álló lemezterület",
"disk-section-label": "Lemezhasználat",
"enable-dgpu-monitoring-description": "Figyelem: Ez felébreszti a dedikált GPU-t (NVIDIA/AMD), ami jelentősen befolyásolhatja az akkumulátor élettartamát a hibrid grafikával rendelkező laptopokon.",
"enable-dgpu-monitoring-label": "Dedikált GPU figyelés engedélyezése",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "Válassza ki a beállítások elrendezését (újraindítást igényelhet).",
"settings-panel-mode-label": "Beállítási panel mód",
"shadows-description": "Engedélyezi az árnyékokat a sávok és panelek alatt.",
"shadows-direction-description": "Válassza ki, honnan vetüljön az árnyék.",
"shadows-direction-description": "Válassza ki, ho vetődjön az árnyék.",
"shadows-direction-label": "Árnyék iránya",
"shadows-label": "Árnyékok",
"title": "Felhasználói felület",
@@ -1386,6 +1515,10 @@
"settings-monitor-specific-description": "Külön háttérkép mappa beállítása minden monitorhoz.",
"settings-monitor-specific-label": "Monitor-specifikus könyvtárak",
"settings-monitor-specific-tooltip": "Monitor háttérkép mappa",
"settings-overview-blur-strength-description": "Alkalmazza az elmosás erősségét az áttekintésre.",
"settings-overview-blur-strength-label": "Áttekintés elmosásának erőssége",
"settings-overview-tint-description": "Alkalmazza az árnyalat erősségét az áttekintésre.",
"settings-overview-tint-label": "Áttekintés árnyalatának erőssége",
"settings-recursive-search-description": "Keressen háttérképeket a háttérkép könyvtár alkönyvtáraiban is.",
"settings-recursive-search-label": "Alkönyvtárak keresése",
"settings-select-monitor-folder": "Monitor háttérkép mappa kiválasztása",
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "Kész!",
"appearance": {
"subheader": "Válassza ki a Sötét módot és a színforrásokat (háttérkép vagy előre definiált)."
"subheader": "Válaszd ki a sötét módot és a színforrásokat (háttérkép vagy előre meghatározott)."
},
"customize": {
"header": "Tapasztalat testreszabása",
@@ -1449,7 +1582,7 @@
},
"skip-setup": "Beállítás kihagyása",
"telemetry-wizard-done": "Értettem!",
"telemetry-wizard-note": "Te irányítasz bármikor engedélyezheted vagy letilthatod a Beállításokban",
"telemetry-wizard-note": "Te irányítasz bármikor engedélyezheted vagy letilthatod a beállításokban",
"telemetry-wizard-subtitle": "Anonim analitikát adtunk hozzá, hogy segítsük a Noctalia fejlesztését",
"telemetry-wizard-title": "Adatvédelmi frissítés",
"wallpaper": {
@@ -1466,7 +1599,7 @@
"select-prompt": "Válasszon egy háttérképet alább",
"subheader": "Teremtsen hangulatot egy gyönyörű háttérrel."
},
"welcome-note": "Csak néhány alapvető dolog az induláshoz a teljes beállítási lehetőség a beállításokban található",
"welcome-note": "Csak néhány alapvető dolog az induláshoz a teljes beállítási lehetőség a beállításokban található",
"welcome-subtitle": "Tegyük egyedivé az asztalod",
"welcome-title": "Üdvözöl a Noctalia!"
},
@@ -1490,7 +1623,7 @@
"disk": "Lemez",
"download-speed": "Letöltési sebesség",
"gpu-temp": "GPU hőmérséklet",
"load-average": "Terhelési átlag",
"load-average": "Átlagos terhelés",
"title": "Rendszerfigyelő",
"upload-speed": "Feltöltési sebesség"
},
@@ -1499,8 +1632,10 @@
"title": "Repülőgép üzemmód"
},
"battery": {
"critical": "Kritikus akkumulátor",
"critical-desc": "Az akkumulátor {percent}%-on van — kérjük, azonnal csatlakoztassa a töltőt",
"low": "Alacsony akkumulátor",
"low-desc": "Az akkumulátor {percent}%-on van. Csatlakoztassa a töltőt"
"low-desc": "Az akkumulátor {percent}%-on van — kérjük, csatlakoztassa a töltőt"
},
"bluetooth": {
"address-copied": "Cím a vágólapra másolva",
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "Korong",
"fade": "Halványítás",
"honeycomb": "Méhsejt",
"pixelate": "Pixelezés",
"stripes": "Csíkok",
"wipe": "Törlés"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "Háttérképek betöltése...",
"no-results": "Nincs háttérkép. Próbáljon másik keresést.",
"page": "{current} / {total}"
"page": "{current} / {total}",
"page-prefix": "Oldal",
"page-suffix": "{total} közül"
}
},
"weather": {
+234 -95
View File
@@ -48,11 +48,16 @@
"device-default": "デフォルト(表示デバイス)",
"device-description": "表示するバッテリーデバイスを選択します。",
"device-label": "バッテリーデバイス",
"display-mode-description": "バッテリーをバーにどのように表示するかを選択します。",
"display-mode-graphic": "グラフィックバッテリー",
"display-mode-graphic-clean": "グラフィカルバッテリー (パーセント表示なし)",
"display-mode-icon-always": "アイコン - 常に%を表示",
"display-mode-icon-hover": "アイコン - ホバー時に表示",
"display-mode-icon-only": "アイコンのみ",
"hide-if-idle-description": "バッテリーが充電または放電していないときは、ウィジェットを非表示にします。",
"hide-if-idle-label": "アイドル時に隠す",
"hide-if-not-detected-description": "システムでバッテリーが検出されない場合は、ウィジェットを非表示にします。",
"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 パフォーマンストグルを表示",
@@ -66,7 +71,7 @@
"custom-font-label": "カスタムフォント",
"custom-font-placeholder": "カスタムフォントを選択...",
"custom-font-search-placeholder": "フォントを検索...",
"horizontal-bar-description": "ヒント: \\n を使用すると改行できます。",
"horizontal-bar-description": "ヒント\\n を使用すると改行できます。",
"horizontal-bar-label": "水平バー",
"preview": "プレビュー",
"tooltip-format-description": "時計にマウスを合わせたときに表示されるツールチップのフォーマット文字列。デフォルトのツールチップを使用するには空のままにします。",
@@ -75,8 +80,6 @@
"use-custom-font-label": "カスタムフォントを使用",
"use-monospaced-font-description": "有効にすると、時計に等幅フォントを使用します。",
"use-monospaced-font-label": "等幅フォントを使用",
"use-primary-color-description": "有効にすると、強調のためにプライマリカラーが適用されます。",
"use-primary-color-label": "プライマリカラーを使用",
"vertical-bar-description": "各パーツを新しい行に分けるにはスペースを使用してください。",
"vertical-bar-label": "垂直バー"
},
@@ -94,7 +97,6 @@
"collapse-condition-description": "出力テキストがこの値と一致する場合、ボタンを折りたたみます。",
"collapse-condition-label": "折りたたみ条件",
"color-selection-description": "テーマカラーをアイコンとテキストに適用します。",
"color-selection-label": "色を選択",
"display-command-output-description": "定期的に実行するコマンドを入力します。出力の最初の行がテキストとして表示されます。",
"display-command-output-label": "コマンド出力を表示",
"display-command-output-stream-description": "継続的に実行するコマンドを入力します。",
@@ -182,7 +184,9 @@
"hide-widget-when-zero-unread-description": "未読の通知がない場合に通知アイコンを非表示にします。",
"hide-widget-when-zero-unread-label": "未読なしでアイコンを非表示",
"show-unread-badge-description": "未読通知の数を表示するバッジを表示します。",
"show-unread-badge-label": "未読バッジを表示"
"show-unread-badge-label": "未読バッジを表示",
"unread-badge-color-description": "未読の通知バッジの色を選択してください。",
"unread-badge-color-label": "未読バッジの色"
},
"section-editor": {
"placeholder": "追加するウィジェットを選択...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "テキスト値の代わりに、ミニ棒グラフとして統計を表示します。レイアウトのずれを防ぎます。",
"compact-mode-label": "コンパクトモード",
"cpu-frequency-description": "現在のCPUクロック速度をGHzで表示します。",
"cpu-frequency-label": "CPU周波数を表示",
"cpu-temperature-description": "利用可能な場合、CPU 温度を表示します。",
"cpu-temperature-label": "CPU 温度",
"cpu-usage-description": "現在の CPU 使用率を表示します。",
@@ -209,6 +215,10 @@
"memory-usage-label": "メモリ使用量",
"network-traffic-description": "ネットワークのアップロード・ダウンロード速度を表示します。",
"network-traffic-label": "ネットワークトラフィック",
"storage-as-percentage-description": "ディスク容量を絶対値ではなくパーセンテージで表示する。",
"storage-as-percentage-label": "ディスクをパーセンテージで",
"storage-available-description": "使用量ではなく、利用可能なディスク容量を表示します。",
"storage-available-label": "利用可能なディスク容量",
"storage-usage-description": "ストレージの使用状況を表示します。",
"storage-usage-label": "ストレージ使用量",
"swap-usage-description": "スワップメモリの使用状況を表示します。",
@@ -240,6 +250,8 @@
"title-width-reset-tooltip": "タイトルの幅をリセット"
},
"tray": {
"chevron-color-description": "ドロワーのシェブロンアイコンにテーマの色を適用します。",
"chevron-color-label": "矢印の色",
"colorize-icons-description": "トレイのアイコンにテーマカラーを適用します。",
"colorize-icons-label": "テーマカラーの適用",
"drawer-enabled-description": "有効にすると、ピン留めされていないトレイ項目をドロワーパネル内に表示します。<br>無効にすると、すべての項目をインラインで表示します。",
@@ -248,14 +260,17 @@
"hide-passive-label": "パッシブ項目を非表示"
},
"volume": {
"display-mode-description": "値の表示方法を選択します。",
"display-mode-label": "表示モード"
"display-mode-description": "値の表示方法を選択します。"
},
"workspace": {
"character-count-description": "ワークスペース名から表示する文字数 (1-10)。",
"character-count-label": "文字数",
"empty-color-description": "空のWorkspaceの背景色を設定します。",
"empty-color-label": "空のワークスペースの色",
"enable-scrollwheel-description": "マウスホイールを使用してワークスペースを切り替えます。",
"enable-scrollwheel-label": "スクロールでワークスペースを切り替え",
"focused-color-description": "フォーカスされたWorkspaceの背景色を設定します。",
"focused-color-label": "フォーカスされたワークスペースの色",
"follow-focused-screen-description": "バーが配置されている画面ではなく、現在フォーカスされている画面のワークスペースを表示します。",
"follow-focused-screen-label": "フォーカス中の画面に追従",
"grouped-border-opacity-description": "ワークスペースコンテナのボーダーの不透明度を設定します。",
@@ -264,8 +279,16 @@
"hide-unoccupied-label": "空のワークスペースを隠す",
"label-mode-description": "ワークスペースラベルの表示方法を選択します。",
"label-mode-label": "ラベルモード",
"occupied-color-description": "使用中のWorkspaceの背景色を設定します。",
"occupied-color-label": "使用中のワークスペースの色",
"pill-size-description": "ワークスペースピルのサイズを調整します (50%-100%)。",
"pill-size-label": "ピルサイズ",
"reverse-scrolling-description": "スクロール時のワークスペース切り替え方向を反転する。",
"reverse-scrolling-label": "スクロール方向を反転",
"show-applications-description": "各ワークスペース内にアプリアイコンを表示します。",
"show-applications-label": "アプリアイコンを表示",
"show-badge-description": "グループ化モードでワークスペース番号バッジを表示します。",
"show-badge-label": "ワークスペースバッジを表示",
"show-labels-only-when-occupied-description": "ウィンドウが開いているワークスペースにのみラベルを表示します。",
"show-labels-only-when-occupied-label": "ウィンドウがある時のみラベルを表示",
"unfocused-icons-opacity-description": "フォーカスされていないアプリのアイコンの不透明度を設定します。",
@@ -275,16 +298,16 @@
"battery": {
"battery-health": "バッテリーの状態",
"battery-level": "バッテリー残量",
"capacity-level": "容量: {level}",
"charging-rate": "充電速度: {rate} W",
"discharging-rate": "放電速度: {rate} W",
"health": "状態: {percent}%",
"capacity-level": "容量{level}",
"charging-rate": "充電速度{rate} W",
"discharging-rate": "放電速度{rate} W",
"health": "状態{percent}%",
"inhibit-idle-description": "システムがスリープ状態になるのを防ぎます。",
"no-battery-detected": "バッテリーが見つかりません",
"plugged-in": "電源接続中",
"power-profile": "電源プロファイル",
"time-left": "残り時間: {time}",
"time-until-full": "充電完了まで: {time}"
"time-left": "残り時間{time}",
"time-until-full": "充電完了まで{time}"
},
"bluetooth": {
"panel": {
@@ -300,9 +323,9 @@
"paired-devices": "ペアリングされたデバイス",
"pairing-mode": "デバイスがペアリングモードになっていることを確認してください。",
"scanning": "デバイスをスキャン中...",
"signal-text-excellent": "信号: 良好",
"signal-text-excellent": "信号良好",
"signal-text-fair": "合図:可",
"signal-text-good": "信号: 良し",
"signal-text-good": "信号良し",
"signal-text-poor": "信号:弱い",
"signal-text-unknown": "信号:不明",
"signal-text-very-poor": "信号:非常に悪い"
@@ -327,13 +350,6 @@
"version-new-user": "新規インストール"
}
},
"colors": {
"error": "エラー",
"on-surface": "表面上",
"primary": "主要",
"secondary": "二次的",
"tertiary": "第三紀"
},
"common": {
"actions": "アクション",
"add": "追加",
@@ -373,10 +389,13 @@
"disconnect": "切断",
"disconnected": "切断済み",
"disconnecting": "切断中...",
"display-mode": "表示モード",
"download": "ダウンロード",
"duration": "期間",
"dysfunctional": "機能不全",
"edit": "編集",
"enabled": "有効",
"error": "エラー",
"events": "イベント",
"execute": "実行",
"faithful": "忠実",
@@ -395,6 +414,7 @@
"installed": "インストール済み",
"interface": "インターフェース",
"internet": "インターネット",
"keybind": "キーバインド",
"language": "言語",
"loading": "読み込み中...",
"local": "ローカル",
@@ -416,6 +436,7 @@
"not-found": "見つかりませんでした",
"notifications": "通知",
"official": "公式",
"on-surface": "表面上",
"output": "出力",
"pair": "ペアリング",
"paired": "ペアリング済み",
@@ -428,11 +449,14 @@
"polling": "ポーリング",
"position": "位置",
"previous": "前へ",
"primary": "プライマリ",
"random": "ランダム",
"reboot": "再起動",
"record": "録画を開始",
"refresh": "更新",
"required": "(必須)",
"reset": "リセット",
"reset-to-default": "デフォルトにリセット",
"result-count": "{count} 結果",
"result-count-plural": "{count} 結果",
"resume": "再開",
@@ -440,8 +464,12 @@
"scanning": "スキャン中...",
"screen-corners": "画面の隅",
"search": "検索",
"secondary": "セカンダリー",
"security": "セキュリティ",
"select": "選択",
"select-color": "色を選択",
"select-color-description": "強調のためにテーマの色を適用します。",
"select-icon-color": "アイコンの色を選択",
"shortcuts": "ショートカット",
"shutdown": "シャットダウン",
"signal": "信号",
@@ -449,8 +477,10 @@
"sources": "ソース",
"start": "開始",
"stop": "停止",
"supporters": "サポーター",
"suspend": "サスペンド",
"templates": "テンプレート",
"tertiary": "第三",
"test": "テスト",
"thresholds": "しきい値",
"title": "タイトル",
@@ -473,6 +503,7 @@
"week": "週",
"widgets": "ウィジェット",
"width": "幅",
"windows": "ウィンドウ",
"yes": "はい"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "マウスオーバー時"
},
"hide-modes": {
"auto-hide": "自動非表示",
"hidden": "空の場合に非表示",
"idle": "アイドル時に非表示",
"non-exclusive": "非独占",
"transparent": "空の時は透明",
"visible": "常に表示"
},
@@ -543,7 +576,9 @@
"emoji-loading": "絵文字を読み込み中...",
"emoji-loading-description": "お待ちください",
"emoji-no-recent": "まだ最近使った絵文字はありません",
"emoji-search-description": "絵文字を検索してコピー"
"emoji-search-description": "絵文字を検索してコピー",
"settings-search-description": "設定を検索して移動",
"windows-search-description": "開いているウィンドウを検索してフォーカスする"
}
},
"lock-screen": {
@@ -579,13 +614,26 @@
"density-compact": "コンパクト",
"density-default": "標準",
"density-mini": "ミニ",
"density-spacious": "広々とした"
"density-spacious": "広々とした",
"display-mode-always-visible": "常に表示",
"type-floating": "フローティング",
"type-framed": "フレーム",
"type-simple": "シンプル"
},
"control-center": {
"quick-settings-style-classic": "クラシック",
"quick-settings-style-modern": "モダン"
},
"frame-rates-fps": "{fps} FPS",
"launcher-density": {
"comfortable": "快適",
"compact": "コンパクト",
"default": "デフォルト"
},
"launcher-view-mode": {
"grid": "グリッド",
"list": "リスト"
},
"scrolling-modes": {
"always": "常にスクロール",
"hover": "ホバー時にスクロール",
@@ -616,34 +664,39 @@
},
"panels": {
"about": {
"become-supporter": "サポーターになる",
"changelog": "変更履歴を見る",
"contributors-desc": "{count}人の<b>素晴らしい</b>コントリビューターに感謝!",
"contributors-description": "{count}人の<b>素晴らしい</b>コントリビューターに感謝!",
"contributors-description-plural": "{count}人の<b>素晴らしい</b>コントリビューターに感謝!",
"copy-info": "情報をコピー",
"info-copied": "クリップボードにコピーしました",
"noctalia-desc": "Wayland のために丁寧に作り込まれた、Quickshell 製の洗練されたミニマルなデスクトップシェル。",
"noctalia-git-commit": "Git コミット:",
"noctalia-installed-version": "現在のバージョン:",
"noctalia-latest-version": "最新のバージョン:",
"noctalia-git-commit": "Git コミット",
"noctalia-installed-version": "現在のバージョン",
"noctalia-latest-version": "最新のバージョン",
"noctalia-title": "Noctalia shell",
"privacy-policy": "プライバシーポリシー",
"support": "支援する",
"system-cpu": "CPU:",
"system-disk": "ディスク",
"supporter-badge": "サポーター",
"supporters-desc": "素晴らしいサポーターに心からの感謝を!",
"supporters-desc-plural": "<b>{count}名の素晴らしい</b>サポーターの皆様に心より感謝いたします!",
"supporters-loading": "サポーターを読み込み中...",
"system-cpu": "CPU",
"system-disk": "ディスク:",
"system-gpu": "GPU",
"system-host": "ホスト:",
"system-install-hint": "fastfetch をインストールしてシステム情報を表示する",
"system-kernel": "カーネル",
"system-kernel": "カーネル",
"system-loading": "システム情報を読み込み中...",
"system-memory": "メモリ:",
"system-monitor": "モニター",
"system-memory": "メモリ",
"system-monitor": "モニター",
"system-not-installed": "fastfetch がインストールされていません",
"system-os": "OS:",
"system-os": "OS",
"system-packages": "パッケージ:",
"system-product": "製品:",
"system-product": "製品",
"system-title": "システム情報",
"system-uptime": "稼働時間:",
"system-wm": "WM:",
"system-uptime": "稼働時間",
"system-wm": "WM",
"telemetry-data-copied": "テレメトリーデータをクリップボードにコピーしました。",
"telemetry-desc": "匿名システム情報(画面解像度、コンポジター、ディストリビューション)を共有して、Noctaliaの改善にご協力ください。起動時に一度送信され、追跡は行われず、データは30日後に自動的に削除されます。",
"telemetry-enabled": "匿名でシステム情報を送信する",
@@ -672,7 +725,7 @@
"media-frame-rate-label": "フレームレート",
"media-primary-player-description": "メインのプレーヤーを識別するためのキーワードを入力します。",
"media-primary-player-label": "優先プレーヤー",
"media-primary-player-placeholder": "例: spotify, vlc, mpv",
"media-primary-player-placeholder": "例spotify, vlc, mpv",
"media-scrolling-speed-description": "タイトルが端から端までスクロールするのにかかる時間(秒)。",
"media-scrolling-speed-label": "スクロール速度",
"media-scrolling-title-description": "長いメディアタイトルを連続スクロールさせます。",
@@ -692,21 +745,33 @@
"volumes-output-volume-description": "システム全体の音量レベル。",
"volumes-step-size-description": "音量の変化量(スクロールホイールやショートカットキー)を調整します。",
"volumes-step-size-label": "ボリューム調整ステップ",
"volumes-volume-feedback-description": "音量を調整するときにフィードバック音を再生する",
"volumes-volume-feedback-description": "音量を調整するときにフィードバック音を再生する",
"volumes-volume-feedback-label": "音量フィードバックサウンドを再生",
"volumes-volume-overdrive-description": "音量を100%以上に上げることを許可します。すべてのハードウェアでサポートされているとは限りません。",
"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-color-description": "バーのカプセルの色を選択するか、デフォルトの表面色には色を使用しない。",
"appearance-capsule-color-label": "カプセルの色",
"appearance-capsule-opacity-description": "カプセル表示時のウィジェット背景の不透明度を設定します。",
"appearance-capsule-opacity-label": "カプセルの不透明度",
"appearance-density-description": "バーの余白を調整し、コンパクトまたはゆったりとした外観にします。",
"appearance-density-label": "バーの密度",
"appearance-desc": "バーの外観や位置をカスタマイズします。",
"appearance-display-mode-description": "バーの表示タイミングを選択してください。",
"appearance-floating-description": "バーを浮かせて、カプセル型で表示します。",
"appearance-floating-label": "フローティングバー",
"appearance-frame-radius": "内側の半径",
"appearance-frame-settings-description": "フレームの太さと内側の半径を調整します",
"appearance-frame-settings-label": "フレーム設定",
"appearance-frame-thickness": "太さ",
"appearance-hide-on-overview-description": "コンポジタの概要がアクティブなときは、バーを非表示にしてパネルを閉じます。",
"appearance-hide-on-overview-label": "概要のバーを非表示にする",
"appearance-margins-description": "フローティングバーの周囲の余白を調整します。",
@@ -721,6 +786,8 @@
"appearance-show-capsule-label": "カプセルを表示",
"appearance-show-outline-description": "すべてのウィジェットの周囲に枠線を表示します。",
"appearance-show-outline-label": "ウィジェットの枠線を表示",
"appearance-type-description": "バーのスタイルを選択:シンプル、フローティング、またはフレーム。",
"appearance-type-label": "バーの種類",
"appearance-use-separate-opacity-description": "バーの背景に別の不透明度の値を使用できるようにする。",
"appearance-use-separate-opacity-label": "バーの不透明度を個別に設定",
"monitor-configure-widgets": "ウィジェットを設定",
@@ -734,7 +801,7 @@
"title": "バー",
"tray-blacklist-description": "トレイから除外するルールを追加します。ワイルドカード (*) に対応しています。",
"tray-blacklist-label": "ブラックリスト",
"tray-blacklist-placeholder": "例: nm-applet, Fcitx*",
"tray-blacklist-placeholder": "例nm-applet, Fcitx*",
"tray-pin-application": "アプリをピン留め",
"tray-unpin-application": "ピン留めを解除",
"use-global-widgets": "グローバルウィジェットを使用する",
@@ -756,12 +823,12 @@
"download-button": "さらにダウンロード",
"download-downloading": "ダウンロード中...",
"download-empty": "利用可能な配色がありません",
"download-error-api-error": "API エラー: {status}",
"download-error-api-error": "API エラー{status}",
"download-error-description": "{scheme} のダウンロードに失敗しました",
"download-error-download-failed": "ダウンロードに失敗しました(終了コード: {code}",
"download-error-download-failed": "ダウンロードに失敗しました(終了コード{code}",
"download-error-invalid-response": "無効なAPIレスポンス形式",
"download-error-no-files": "スキームのファイルが見つかりません",
"download-error-parse-failed": "APIレスポンスの解析に失敗しました: {error}",
"download-error-parse-failed": "APIレスポンスの解析に失敗しました{error}",
"download-error-rate-limit": "GitHub APIのレート制限を超えました",
"download-error-title": "ダウンロード失敗",
"download-fetching": "利用可能な配色を取得中...",
@@ -770,6 +837,7 @@
"download-title": "配色のダウンロード",
"method-description": {
"content": "ソースコンテンツの実際の色と厳密に一致する、高忠実度の色抽出を備えたMaterial Designスキーム。",
"dysfunctional": "Faithfulのように、2番目に支配的な色族をプライマリとして選択します。",
"faithful": "調和のとれたパレットを生成しながら、ソースカラーにできるだけ近い色を維持しようとします。",
"fruit-salad": "多様で多彩な色合いを持つ、遊び心のある鮮やかなパレットを生み出すMaterial Designスキーム。",
"monochrome": "単一色相のグレースケールと最小限の彩度コンテンツを使用した Material Design スキーム。",
@@ -789,7 +857,7 @@
"templates-misc-user-templates-description": "操作方法を理解している場合のみ有効にしてください。オンラインドキュメントを参照してください。",
"templates-misc-user-templates-label": "ユーザーテンプレートを有効化",
"templates-none-detected": "検出されませんでした",
"templates-write-path": "書き込み先: {filepath}",
"templates-write-path": "書き込み先{filepath}",
"title": "配色",
"wallpaper-method-description": "お好みのパレット生成方法を選択してください。",
"wallpaper-method-label": "パレット生成方法",
@@ -866,6 +934,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": "天気ウィジェットを有効化",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "等幅フォントを検索...",
"fonts-reset-scaling": "サイズ設定をリセット",
"fonts-title": "フォント",
"keybinds-description": "パネルとランチャーのグローバルナビゲーションキーを設定します。",
"keybinds-down": "下に移動",
"keybinds-enter": "確認 / アクション",
"keybinds-escape": "閉じる / 戻る",
"keybinds-left": "左へ移動",
"keybinds-right": "右へ移動",
"keybinds-title": "ナビゲーションのキーバインド",
"keybinds-up": "上へ移動",
"language-desc": "アプリケーションで使用する言語を選択します。",
"language-select-auto-detect": "自動検出",
"language-select-description": "アプリケーションのインターフェースで使用する言語を選択します。",
@@ -972,7 +1058,9 @@
"screen-corners-solid-black-description": "バーの背景色の代わりに、黒一色を使用します。",
"screen-corners-solid-black-label": "角を黒く塗りつぶす",
"screen-corners-title": "画面の角",
"settings-copied": "設定をクリップボードにコピーしました"
"settings-copied": "設定をクリップボードにコピーしました",
"tab-basics": "基本",
"tab-keybinds": "キーバインド"
},
"hooks": {
"info-command-info-description": "• コマンドはシェル (sh -lc) 経由で実行されます<br>• コマンドはバックグラウンドで実行されます<br>• テストボタンは現在の設定値を使って実行されます",
@@ -983,16 +1071,16 @@
"noctalia-started-placeholder": "例:notify-send 'Noctalia 読み込み完了'",
"performance-mode-disabled-description": "Noctalia パフォーマンスモードが無効になった際に実行されるコマンド。",
"performance-mode-disabled-label": "パフォーマンスモード無効時",
"performance-mode-disabled-placeholder": "例: notify-send \"Performance\" \"Mode disabled\"",
"performance-mode-disabled-placeholder": "例notify-send \"Performance\" \"Mode disabled\"",
"performance-mode-enabled-description": "Noctalia パフォーマンスモードが有効になった際に実行されるコマンド。",
"performance-mode-enabled-label": "パフォーマンスモード有効時",
"performance-mode-enabled-placeholder": "例: notify-send \"Performance\" \"Mode enabled\"",
"performance-mode-enabled-placeholder": "例notify-send \"Performance\" \"Mode enabled\"",
"screen-lock-description": "画面がロックされた際に実行されるコマンド。",
"screen-lock-label": "画面ロック時",
"screen-lock-placeholder": "例: notify-send \"Screen\" \"Locked\"",
"screen-lock-placeholder": "例notify-send \"Screen\" \"Locked\"",
"screen-unlock-description": "画面ロックが解除された際に実行されるコマンド。",
"screen-unlock-label": "画面ロック解除時",
"screen-unlock-placeholder": "例: notify-send \"Screen\" \"Unlocked\"",
"screen-unlock-placeholder": "例notify-send \"Screen\" \"Unlocked\"",
"session-description": "シャットダウンまたは再起動の前に実行されるコマンド。アクションタイプを $1 (シャットダウン/再起動) として受け取ります。",
"session-label": "セッション終了",
"session-placeholder": "例:notify-send \"Session\" \"$1\"",
@@ -1002,14 +1090,14 @@
"system-hooks-title": "システムフック",
"theme-changed-description": "ダークモードとライトモードが切り替わった際に実行されるコマンド。",
"theme-changed-label": "テーマ変更時",
"theme-changed-placeholder": "例: notify-send \"Theme\" \"Toggled\"",
"theme-changed-placeholder": "例notify-send \"Theme\" \"Toggled\"",
"title": "フック",
"wallpaper-changed-description": "壁紙が変更された際に実行されるコマンド。",
"wallpaper-changed-label": "壁紙変更時",
"wallpaper-changed-placeholder": "例: notify-send \"Wallpaper\" \"Changed\""
"wallpaper-changed-placeholder": "例notify-send \"Wallpaper\" \"Changed\""
},
"indicator": {
"default-value": "デフォルト: {value}",
"default-value": "デフォルト{value}",
"system-default": "システムのデフォルト"
},
"launcher": {
@@ -1027,18 +1115,28 @@
"settings-clip-wrap-text-label": "クリップボードのテキストを折り返す",
"settings-clipboard-history-description": "以前コピーした項目にランチャーからアクセスできるようにします。",
"settings-clipboard-history-label": "クリップボード履歴を有効化",
"settings-custom-launch-prefix-description": "コマンドの先頭にカスタムランチャーを付与します(例: systemd 連携用の 'runapp')。",
"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-custom-launch-prefix-description": "コマンドの先頭にカスタムランチャーを付与します(例:systemd 連携用の 'runapp')。",
"settings-custom-launch-prefix-enabled-description": "デフォルトの方法の代わりに、カスタムプレフィックスを使用してアプリを起動します。",
"settings-custom-launch-prefix-enabled-label": "カスタム起動プレフィックスを有効化",
"settings-custom-launch-prefix-label": "カスタム起動プレフィックス",
"settings-density-description": "アプリケーションアイコンのサイズとLauncherの密度を調整します。",
"settings-density-label": "密度",
"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": "ネイティブアイコンを使用",
"settings-ignore-mouse-input-description": "ランチャーでのマウス操作とスクロールホイールを無効にする。",
"settings-ignore-mouse-input-label": "マウス入力を無視する",
"settings-overlay-layer-description": "ランチャーをオーバーレイレイヤーに、全画面ウィンドウの上に表示します。有効にすると、ランチャーはバーにアタッチされません。",
"settings-overlay-layer-label": "フルスクリーンより上に表示",
"settings-position-description": "ランチャーパネルの表示位置を選択します。",
"settings-show-categories-description": "アプリケーションを絞り込むためのカテゴリタブを表示します。",
"settings-show-categories-label": "カテゴリを表示",
@@ -1046,10 +1144,12 @@
"settings-show-icon-background-label": "アイコンの背景を表示",
"settings-sort-by-usage-description": "有効にすると、よく使うアプリがリストの上位に表示されます。",
"settings-sort-by-usage-label": "使用頻度順に並べ替え",
"settings-terminal-command-description": "ターミナルを起動するためのコマンド(例: 'kitty -e' or 'gnome-terminal --')。",
"settings-terminal-command-description": "ターミナルを起動するためのコマンド(例'kitty -e' or 'gnome-terminal --')。",
"settings-terminal-command-label": "ターミナル起動コマンド",
"settings-use-app2unit-description": "アプリのプロセス管理を改善し、問題を回避するために代替の起動方法を使用します。",
"settings-use-app2unit-label": "App2Unit を使用して起動",
"settings-view-mode-description": "ランチャーのエントリのレイアウトを選択してください。",
"settings-view-mode-label": "表示モード",
"title": "ランチャー"
},
"location": {
@@ -1066,12 +1166,12 @@
"date-time-show-events-description": "カレンダーパネルにイベント(予定)を表示します。",
"date-time-show-events-label": "カレンダーのイベントを表示",
"date-time-title": "日付と時刻",
"date-time-use-analog-description": "カレンダーウィンドウとロック画面にアナログ時計を表示します。",
"date-time-use-analog-description": "カレンダーウィンドウにアナログスタイルの時計を表示します。",
"date-time-use-analog-label": "アナログ時計を使用",
"date-time-week-numbers-description": "カレンダーに週番号(例: 第38週)を表示します。",
"date-time-week-numbers-description": "カレンダーに週番号(例第38週)を表示します。",
"date-time-week-numbers-label": "週番号を表示",
"location-desc": "場所を設定して、正確な天気情報や夜間モードのスケジュールを取得します。",
"location-search-description": "例: Toronto, ON",
"location-search-description": "例:東京、日本",
"location-search-label": "場所を検索",
"location-search-placeholder": "地名を入力",
"location-title": "場所の設定",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "カレンダー"
},
"lock-screen": {
"allow-password-with-fprintd-description": "fprintd(指紋認証)が有効な場合、このオプションを使用すると、指紋の代わりにパスワードでログインできます。",
"allow-password-with-fprintd-label": "fprintd でパスワードログインを許可する",
"auto-start-auth-description": "たとえば、キーを押したりボタンをクリックしたりしなくても、指紋認証が自動的に開始されます。",
"auto-start-auth-label": "自動認証を開始",
"clock-format-description": "日付/時刻の構文トークンを使用して時計のフォーマットをカスタマイズします。",
"clock-format-label": "時計の形式",
"clock-style-analog": "アナログ",
"clock-style-custom": "カスタム",
"clock-style-description": "ロック画面の時計の表示スタイルを選択してください。",
"clock-style-digital": "デジタル",
"clock-style-label": "時計のスタイル",
"compact-lockscreen-description": "天気やメディアウィジェットを隠し、ログイン入力とシステムコントロールのみを表示します。",
"compact-lockscreen-label": "コンパクトなロック画面",
"lock-on-suspend-description": "システムのサスペンド時に、自動的に画面をロックします。",
"lock-on-suspend-label": "サスペンド時にロック",
"lock-screen-animations-description": "ロック画面のアニメーションを有効または無効にする。",
"lock-screen-animations-label": "ロック画面のアニメーション",
"lock-screen-blur-strength-description": "ロック画面の壁紙にぼかし効果を適用します。",
"lock-screen-blur-strength-label": "ロック画面のぼかし強度",
"lock-screen-tint-strength-description": "ロック画面の壁紙に色合いのオーバーレイを適用します。",
"lock-screen-tint-strength-label": "ロック画面の着色強度",
"monitors-desc": "ロック画面を特定のモニターに表示します。何も選択されていない場合、デフォルトですべてに表示されます。",
"show-hibernate-description": "電源操作に「ハイバネート(休止状態)」のオプションを表示します。",
"show-hibernate-label": "ハイバネートを表示",
"show-session-buttons-description": "ロック画面から電源操作を行えるようにします。",
@@ -1109,25 +1227,23 @@
},
"notifications": {
"duration-critical-urgency-description": "緊急度「重大」の通知が表示され続ける時間。",
"duration-critical-urgency-label": "緊急度: 重大",
"duration-critical-urgency-label": "緊急度重大",
"duration-desc": "緊急度レベルに基づいて、通知の表示時間を設定します。",
"duration-low-urgency-description": "緊急度「低」の通知が表示され続ける時間。",
"duration-low-urgency-label": "緊急度: 低",
"duration-low-urgency-label": "緊急度低",
"duration-normal-urgency-description": "緊急度「通常」の通知が表示され続ける時間。",
"duration-normal-urgency-label": "緊急度: 通常",
"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-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": "通知を表示するディスプレイを選択します。未選択の場合は全てに表示されます。",
"settings-always-on-top-description": "全画面ウィンドウや他のレイヤーよりも手前に通知を表示します。",
"settings-background-opacity-description": "通知の背景の不透明度を調整します。",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "通知音を利用できません",
"sounds-volume-description": "通知音の音量レベルを調整します。",
"sounds-volume-label": "通知音量",
"toast-battery-description": "バッテリー残量がこの割合を下回った場合に警告を表示します。",
"toast-battery-label": "バッテリー警告",
"toast-desc": "トースト通知の外観と挙動を設定します。",
"toast-keyboard-description": "キーボードレイアウトの変更時にトーストを表示します。",
"toast-keyboard-label": "キーボードレイアウト"
"toast-keyboard-label": "キーボードレイアウト",
"toast-media-description": "メディアの再生状態が変化したときにトーストを表示します。",
"toast-media-label": "メディア"
},
"osd": {
"always-on-top-description": "全画面ウィンドウや他のレイヤーよりも手前に OSD を表示します。",
@@ -1202,21 +1322,25 @@
"types-volume-label": "出力音量"
},
"plugins": {
"auto-update": "プラグインを自動更新",
"auto-update-description": "シェル起動時にすべてのプラグインを自動的に更新します。",
"available-description": "設定されたソースからプラグインを参照してインストールします。",
"available-label": "利用可能なプラグイン",
"available-no-plugins-description": "プラグインのソースを確認するか、リストを更新してください。",
"available-no-plugins-label": "利用可能なプラグインはありません",
"check-for-updates": "アップデートを確認",
"checking-for-updates": "アップデートを確認しています...",
"collision-already-installed": "このプラグインはすでにインストールされています",
"collision-custom-version-exists": "「{source}」 発 の カスタム版 は 既に インストール されています",
"collision-official-version-exists": "このプラグインの公式バージョンはすでにインストールされています",
"filter-downloaded": "ダウンロード済み",
"filter-not-downloaded": "未ダウンロード",
"filter-tags-description": "カテゴリーまたはダウンロード状況でプラグインを絞り込む",
"filter-tags-description": "カテゴリーまたはダウンロード状況でプラグインを絞り込む",
"filter-tags-label": "タグ",
"hot-reload-description": "ファイルの変更時にプラグインを自動的にリロードします。プラグイン開発に便利です。",
"hot-reload-label": "ホットリロード(開発モード)",
"hot-reloaded": "プラグインをリロードしました: {name}",
"install-error": "インストールに失敗しました: {error}",
"hot-reloaded": "プラグインをリロードしました{name}",
"install-error": "インストールに失敗しました{error}",
"install-incompatible": "{plugin} には Noctalia v{version} 以降が必要です",
"install-success": "{plugin} をインストールしました",
"installed-description": "ローカルにインストールされたすべてのプラグインを管理・設定します。",
@@ -1245,16 +1369,17 @@
"sources-placeholder": "マイリポジトリ",
"sources-remove-tooltip": "プラグインソースを削除",
"title": "プラグイン",
"translations-reloaded": "翻訳をリロードしました:{name}",
"uninstall-dialog-description": "本当に {plugin} をアンインストールしますか?すべてのプラグインデータが削除されます。",
"uninstall-dialog-title": "プラグインのアンインストール",
"uninstall-error": "アンインストールに失敗しました: {error}",
"uninstall-error": "アンインストールに失敗しました{error}",
"uninstall-success": "{plugin} をアンインストールしました",
"uninstalling": "{plugin} をアンインストール中...",
"update-all": "すべてアップデート ({count})",
"update-all-success": "すべてのプラグインをアップデートしました",
"update-available": "新しいプラグインアップデートがあります",
"update-available-plural": "新しいプラグインアップデートがあります({count}個)",
"update-error": "プラグインのアップデートに失敗しました: {plugin}: {error}",
"update-error": "プラグインのアップデートに失敗しました{plugin}{error}",
"update-pending": "v{current} → v{new} (Noctalia v{required}が必要です)",
"update-success": "{plugin} を v{version} にアップデートしました",
"update-version": "v{current} → v{new}",
@@ -1271,11 +1396,14 @@
"entries-desc": "セッションメニューに表示される電源操作と、その表示順序をカスタマイズします。",
"entries-title": "電源操作",
"entry-settings-command-description": "このアクションのために実行するカスタムコマンド。空欄にするとデフォルトのシステムコマンドを使用します。",
"entry-settings-command-placeholder": "例: systemctl poweroff",
"entry-settings-command-placeholder": "例systemctl poweroff",
"entry-settings-default-command-lock": "内部ロック画面(コマンドなし)",
"entry-settings-default-command-logout": "内部ログアウト(コマンドなし)",
"entry-settings-default-info-description": "カスタムコマンドが指定されていない場合、デフォルトのシステムコマンドが使用されます。",
"entry-settings-default-info-label": "デフォルトのコマンド",
"entry-settings-keybind-description": "セッションメニューが開いているときに、このアクションをトリガーするキーの組み合わせを割り当てます。",
"entry-settings-keybind-placeholder": "キーを割り当てるには、記録を押してください...",
"entry-settings-keybind-recording": "録音中... 任意のキーの組み合わせを押してください",
"entry-settings-title": "「{entry}」の設定",
"entry-settings-tooltip": "コマンドを設定",
"general-desc": "セッションメニューパネルの動作と外観を設定します。",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "危険時の色",
"custom-highlight-colors-title-label": "カスタムハイライト色",
"disk-available-label": "利用可能なディスク容量",
"disk-section-label": "ストレージ使用量",
"enable-dgpu-monitoring-description": "警告: これにより外部GPU (NVIDIA/AMD) が起動状態になるため、ハイブリッドグラフィックス搭載のノート PC ではバッテリー駆動時間に大きな影響を与える可能性があります。",
"enable-dgpu-monitoring-label": "外部GPUモニタリングを有効にする",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "設定画面の表示形式を選択します (再起動が必要な場合があります)。",
"settings-panel-mode-label": "設定パネルの表示モード",
"shadows-description": "バーやパネルの下にドロップシャドウ(影)を表示します。",
"shadows-direction-description": "影が落ちる方向を設定します。",
"shadows-direction-description": "影を落とす場所を選択してください。",
"shadows-direction-label": "影の方向",
"shadows-label": "ドロップシャドウ",
"title": "ユーザーインターフェース",
@@ -1357,7 +1486,7 @@
"automation-change-mode-alphabetical": "アルファベット順",
"automation-change-mode-description": "自動変更時に壁紙を選択する方法を選択します。",
"automation-change-mode-label": "変更モード",
"automation-custom-interval-description": "時間を HH:MM 形式で入力してください(例: 01:30)。",
"automation-custom-interval-description": "時間を HH:MM 形式で入力してください(例01:30)。",
"automation-custom-interval-label": "カスタム間隔",
"automation-interval-description": "壁紙を自動的に切り替える頻度。",
"automation-interval-label": "変更間隔",
@@ -1386,6 +1515,10 @@
"settings-monitor-specific-description": "ディスプレイごとに異なる壁紙フォルダを設定します。",
"settings-monitor-specific-label": "ディスプレイ別の壁紙フォルダ",
"settings-monitor-specific-tooltip": "ディスプレイ別の壁紙フォルダ",
"settings-overview-blur-strength-description": "概要にぼかしの強度を適用します。",
"settings-overview-blur-strength-label": "概要のぼかし強度",
"settings-overview-tint-description": "概要に色合いの強さを適用します。",
"settings-overview-tint-label": "オーバービューの着色強度",
"settings-recursive-search-description": "壁紙フォルダのサブフォルダ内も検索対象にします。",
"settings-recursive-search-label": "サブフォルダも検索",
"settings-select-monitor-folder": "ディスプレイ別の壁紙フォルダを選択",
@@ -1397,7 +1530,7 @@
"settings-view-mode-description": "ディレクトリから壁紙をどのように表示するかを選択します。",
"settings-view-mode-label": "表示モード",
"view-mode-browse": "ディレクトリを参照",
"view-mode-cycle-tooltip": "表示モード: {mode} (クリックして変更)",
"view-mode-cycle-tooltip": "表示モード{mode} (クリックして変更)",
"view-mode-recursive": "フラット化されたサブディレクトリ",
"view-mode-single": "ルートディレクトリ"
}
@@ -1407,11 +1540,11 @@
"enter-command": "実行するコマンドを入力(アプリまたはスクリプト)",
"enter-ipc-identifier": "IPCコマンドの一意の識別子を入力してください",
"enter-path": "パスを入力してください...",
"enter-text-to-collapse": "例: 'nothing is playing'。正規表現 (/.../) も使用できます。",
"enter-text-to-collapse": "例'nothing is playing'。正規表現 (/.../) も使用できます。",
"enter-tooltip": "ツールチップを入力",
"enter-width-pixels": "幅を入力(ピクセル)",
"search": "検索...",
"search-icons": "例: noctalia, niri, battery, cloud",
"search-icons": "例noctalia, niri, battery, cloud",
"search-launcher": "項目を検索...(または > でコマンド実行)",
"search-wallhaven": "Wallhaven で検索...",
"search-wallpapers": "壁紙を検索して絞り込む..."
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "完了!",
"appearance": {
"subheader": "Dark Modeと色のソース(壁紙または定義済み)を選択します。"
"subheader": "ダークモードと色のソース(壁紙または事前定義)を選択します。"
},
"customize": {
"header": "自分好みにカスタマイズ",
@@ -1460,7 +1593,7 @@
"dir-select-title": "壁紙フォルダを選択",
"header": "壁紙を選択",
"no-dir": "壁紙フォルダが選択されていません",
"no-valid": "有効な画像ファイルが見つかりませんでした: {dir}",
"no-valid": "有効な画像ファイルが見つかりませんでした{dir}",
"none-in-dir": "ディレクトリに壁紙が見つかりませんでした",
"preview-error": "画像を読み込めませんでした",
"select-prompt": "以下から壁紙を選択します",
@@ -1479,7 +1612,7 @@
"scaling-percentage": "{percentage}%",
"signal-strength": "{signal}%",
"unknown-app": "不明なアプリ",
"uptime": "稼働時間: {uptime}",
"uptime": "稼働時間{uptime}",
"user-requested": "ユーザーの要求",
"welcome-back": "おかえりなさい、",
"widget-settings-title": "{widget} の設定"
@@ -1499,8 +1632,10 @@
"title": "機内モード"
},
"battery": {
"critical": "バッテリー残量低下",
"critical-desc": "バッテリー残量 {percent}% — すぐに充電器を接続してください",
"low": "バッテリー残量低下",
"low-desc": "バッテリー残量 {percent}% です。充電器を接続してください"
"low-desc": "バッテリー残量 {percent}% 充電器を接続してください"
},
"bluetooth": {
"address-copied": "アドレスをクリップボードにコピーしました",
@@ -1544,8 +1679,8 @@
"not-installed": "wlsunset がインストールされていません"
},
"noctalia-performance": {
"disabled": "パフォーマンスモード: 無効",
"enabled": "パフォーマンスモード: 有効",
"disabled": "パフォーマンスモード無効",
"enabled": "パフォーマンスモード有効",
"label": "Noctalia パフォーマンス"
},
"power-profile": {
@@ -1561,8 +1696,8 @@
"disconnected": "{name} から切断しました"
},
"wallpaper-colors": {
"disabled": "壁紙配色の生成: 無効",
"enabled": "壁紙配色の生成: 有効",
"disabled": "壁紙配色の生成無効",
"enabled": "壁紙配色の生成有効",
"label": "壁紙配色の生成"
},
"wifi": {
@@ -1577,7 +1712,7 @@
"tooltips": {
"add-widget": "ウィジェットを追加",
"bluetooth-devices": "Bluetooth デバイス",
"brightness-at": "画面の明るさ: {brightness}%",
"brightness-at": "画面の明るさ{brightness}%",
"click-to-start-recording": "画面録画(録画開始)",
"click-to-stop-recording": "画面録画(録画停止)",
"collapse": "サイドバーを折りたたむ",
@@ -1592,12 +1727,12 @@
"home": "ホームディレクトリ",
"input-muted": "入力ミュート切り替え",
"keep-awake": "スリープ防止",
"keyboard-layout": "キーボードレイアウト: {layout}",
"keyboard-layout": "キーボードレイアウト{layout}",
"list-view": "リスト表示",
"manage-vpn": "VPN 接続",
"manage-wifi": "Wi-Fi",
"max-widgets-reached": "ウィジェットの最大数に達しました",
"microphone-volume-at": "マイク音量: {volume}%",
"microphone-volume-at": "マイク音量{volume}%",
"move-to-section": "{section} に移動",
"mute": "ミュート",
"next-media": "次のトラック",
@@ -1610,7 +1745,7 @@
"open-settings": "設定",
"open-tray-dropdown": "システムトレイ",
"output-muted": "出力ミュート切り替え",
"power-profile": "電源プロファイル: {profile}",
"power-profile": "電源プロファイル{profile}",
"previous-media": "前のトラック",
"previous-month": "前月",
"refresh-devices": "デバイスを更新",
@@ -1624,7 +1759,7 @@
"switch-to-light-mode": "ライトモード",
"unmute": "ミュート解除",
"up": "親ディレクトリ",
"volume-at": "出力音量: {volume}%",
"volume-at": "出力音量{volume}%",
"wallpaper-selector": "壁紙選択パネル"
},
"wallpaper": {
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "ディスク",
"fade": "フェード",
"honeycomb": "ハニカム",
"pixelate": "ピクセル化",
"stripes": "ストライプ",
"wipe": "ワイプ"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "壁紙を読み込み中...",
"no-results": "壁紙が見つかりません。別の検索条件を試してください。",
"page": "{current} / {total}"
"page": "{current} / {total}",
"page-prefix": "ページ",
"page-suffix": "{total}件中"
}
},
"weather": {
@@ -1722,16 +1861,16 @@
"common-us-date": "米国形式の日付(月/日/年)",
"common-weekday-date": "曜日と日付",
"common-weekday-month-day": "曜日、月、日",
"day-abbreviated": "曜日の短縮名(例: 火)",
"day-full": "曜日の完全名(例: 月曜日)",
"day-abbreviated": "曜日の短縮名(例火)",
"day-full": "曜日の完全名(例月曜日)",
"day-leading-zero": "ゼロ埋めありの日付 (01-31)",
"day-no-leading-zero": "ゼロ埋めなしの日付 (1-31)",
"hour-leading-zero": "ゼロ埋めありの時間 (00-23) — 24時間表記",
"hour-no-leading-zero": "ゼロ埋めなしの時間 (0-23) — 24時間表記",
"minute-leading-zero": "ゼロ埋めありの分 (00-59)",
"minute-no-leading-zero": "ゼロ埋めなしの分 (0-59)",
"month-abbreviated": "月の短縮名(例: 1月/Jan",
"month-full": "月の完全名(例: 1月/January",
"month-abbreviated": "月の短縮名(例1月/Jan",
"month-full": "月の完全名(例1月/January",
"month-number-leading-zero": "ゼロ埋めありの月 (01-12)",
"month-number-no-zero": "ゼロ埋めなしの月 (1-12)",
"second-leading-zero": "ゼロ埋めありの秒 (00-59)",
@@ -1747,7 +1886,7 @@
"select-current": "現在のフォルダを選択する",
"select-file": "ファイルを選択する",
"select-folder": "フォルダを選択する",
"selected": "選択済み:",
"selected": "選択済み",
"title": "ファイル選択"
},
"file-picker-title": "ファイルを選択してください",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+173 -34
View File
@@ -48,11 +48,16 @@
"device-default": "Standaard (weergaveapparaat)",
"device-description": "Selecteer welk accuapparaat u wilt weergeven.",
"device-label": "Accuapparaat",
"display-mode-description": "Kies hoe de batterij wordt weergegeven in de balk.",
"display-mode-graphic": "Grafische accu",
"display-mode-graphic-clean": "Grafische accu (geen %)",
"display-mode-icon-always": "Pictogram - Altijd % tonen",
"display-mode-icon-hover": "Icoon - Tonen bij hover",
"display-mode-icon-only": "Alleen pictogram",
"hide-if-idle-description": "Verberg de widget wanneer de accu niet wordt opgeladen of ontladen.",
"hide-if-idle-label": "Verbergen indien inactief",
"hide-if-not-detected-description": "Verberg de widget als er geen accu op het systeem wordt gedetecteerd.",
"hide-if-not-detected-label": "Verbergen indien niet gedetecteerd",
"low-battery-threshold-description": "Toon een waarschuwing wanneer de accu onder dit percentage komt.",
"low-battery-threshold-label": "Waarschuwingsdrempel voor lage accu",
"show-noctalia-performance-description": "Toon de Noctalia-prestatiemodus-schakelaar in het accupaneel.<br>Schakelt schaduwen en animaties in Noctalia uit om het resourcegebruik te verminderen.",
"show-noctalia-performance-label": "Noctalia-Performance-schakelaar tonen",
@@ -75,8 +80,6 @@
"use-custom-font-label": "Aangepast lettertype gebruiken",
"use-monospaced-font-description": "Indien ingeschakeld gebruikt de klok het monospace-lettertype.",
"use-monospaced-font-label": "Monospace-lettertype gebruiken",
"use-primary-color-description": "Indien ingeschakeld wordt de primaire kleur gebruikt voor nadruk.",
"use-primary-color-label": "Primaire kleur gebruiken",
"vertical-bar-description": "Gebruik een spatie om elk deel op een nieuwe regel te plaatsen.",
"vertical-bar-label": "Verticale balk"
},
@@ -94,7 +97,6 @@
"collapse-condition-description": "Als de uitvoer overeenkomt met deze waarde, wordt de knop samengevouwen.",
"collapse-condition-label": "Inklapvoorwaarde",
"color-selection-description": "Pas themakleuren toe op pictogram en tekst.",
"color-selection-label": "Kleur selecteren",
"display-command-output-description": "Voer een commando in dat regelmatig wordt uitgevoerd. De eerste regel van de uitvoer wordt als tekst weergegeven.",
"display-command-output-label": "Commando-uitvoer weergeven",
"display-command-output-stream-description": "Voer een commando in dat continu wordt uitgevoerd.",
@@ -182,7 +184,9 @@
"hide-widget-when-zero-unread-description": "Het meldingspictogram verbergen wanneer er geen ongelezen meldingen zijn.",
"hide-widget-when-zero-unread-label": "Pictogram verbergen zonder ongelezen meldingen",
"show-unread-badge-description": "Toon een badge met het aantal ongelezen meldingen.",
"show-unread-badge-label": "Ongelezen-badge tonen"
"show-unread-badge-label": "Ongelezen-badge tonen",
"unread-badge-color-description": "Selecteer de kleur voor de badge van ongelezen meldingen.",
"unread-badge-color-label": "Kleur van de ongelezen badge"
},
"section-editor": {
"placeholder": "Selecteer een widget om toe te voegen...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "Statistieken weergeven als mini-staafdiagrammen in plaats van tekstwaarden. Voorkomt lay-outverschuiving.",
"compact-mode-label": "Compacte modus",
"cpu-frequency-description": "De huidige CPU-kloksnelheid in GHz weergeven.",
"cpu-frequency-label": "CPU-frequentie weergeven",
"cpu-temperature-description": "Toon CPU-temperatuur indien beschikbaar.",
"cpu-temperature-label": "CPU-temperatuur",
"cpu-usage-description": "Toon het huidige CPU-gebruik in procent.",
@@ -209,6 +215,10 @@
"memory-usage-label": "Geheugengebruik",
"network-traffic-description": "Toon uploadsnelheid en downloadsnelheid van het netwerk.",
"network-traffic-label": "Netwerkverkeer",
"storage-as-percentage-description": "Toon schijfruimte als percentage in plaats van absolute waarden.",
"storage-as-percentage-label": "Schijf als percentage",
"storage-available-description": "Toont hoeveel schijfruimte beschikbaar is in plaats van hoeveel er wordt gebruikt.",
"storage-available-label": "Beschikbare schijfruimte",
"storage-usage-description": "Toon informatie over schijfruimtegebruik.",
"storage-usage-label": "Opslaggebruik",
"swap-usage-description": "Toon swap geheugengebruik.",
@@ -240,6 +250,8 @@
"title-width-reset-tooltip": "Titelbreedte resetten"
},
"tray": {
"chevron-color-description": "Themakleuren toepassen op het pijl-icoon van de lade.",
"chevron-color-label": "Pijlkleur",
"colorize-icons-description": "Pas themakleuren toe op systeemvakpictogrammen.",
"colorize-icons-label": "Pictogrammen inkleuren",
"drawer-enabled-description": "Indien ingeschakeld worden niet-vastgemaakte systeemvakitems in een lade weergegeven.<br>Indien uitgeschakeld worden alle items inline getoond.",
@@ -248,14 +260,17 @@
"hide-passive-label": "Verberg passieve items"
},
"volume": {
"display-mode-description": "Kies hoe je wilt dat deze waarde wordt weergegeven.",
"display-mode-label": "Weergavemodus"
"display-mode-description": "Kies hoe je wilt dat deze waarde wordt weergegeven."
},
"workspace": {
"character-count-description": "Aantal tekens dat wordt weergegeven van werkruimtenamen (1-10).",
"character-count-label": "Aantal tekens",
"empty-color-description": "Stel de achtergrondkleur in voor lege Workspaces.",
"empty-color-label": "Kleur van lege Workspace",
"enable-scrollwheel-description": "Schakel tussen werkruimtes met het muiswiel.",
"enable-scrollwheel-label": "Scroll om tussen werkruimtes te schakelen",
"focused-color-description": "Stel de achtergrondkleur in voor de gefocuste Workspace.",
"focused-color-label": "Kleur van de gefocuste Workspace",
"follow-focused-screen-description": "Werkruimten weergeven van het momenteel gefocuste scherm, in plaats van het scherm waar de balk zich bevindt.",
"follow-focused-screen-label": "Gefocust scherm volgen",
"grouped-border-opacity-description": "Stel het dekkingsniveau in voor de randen van de werkruimtecontainer.",
@@ -264,8 +279,16 @@
"hide-unoccupied-label": "Ongebruikte verbergen",
"label-mode-description": "Kies hoe labels van werkruimten worden weergegeven.",
"label-mode-label": "Labelmodus",
"occupied-color-description": "Stel de achtergrondkleur in voor bezette Workspaces.",
"occupied-color-label": "Kleur van bezette workspace",
"pill-size-description": "Pas de grootte van de werkruimte-pillen aan (50%-100%).",
"pill-size-label": "Pilgrootte",
"reverse-scrolling-description": "Keer de richting van het wisselen van werkruimtes om bij het scrollen.",
"reverse-scrolling-label": "Omgekeerd scrollen",
"show-applications-description": "Toon applicatiepictogrammen in elke werkruimte.",
"show-applications-label": "Toon applicaties",
"show-badge-description": "Toon de werkomgevingnummerbadge in gegroepeerde modus.",
"show-badge-label": "Werkruimtebadge weergeven",
"show-labels-only-when-occupied-description": "Toon alleen werkruimtelabels wanneer ze vensters bevatten.",
"show-labels-only-when-occupied-label": "Toon labels alleen wanneer bezet",
"unfocused-icons-opacity-description": "Stel het dekkingsniveau in voor app-pictogrammen die niet in focus zijn.",
@@ -327,13 +350,6 @@
"version-new-user": "Nieuwe installatie"
}
},
"colors": {
"error": "Fout",
"on-surface": "Op oppervlak",
"primary": "Primair",
"secondary": "Secundair",
"tertiary": "Tertiair"
},
"common": {
"actions": "Acties",
"add": "Toevoegen",
@@ -373,10 +389,13 @@
"disconnect": "Verbreek de verbinding",
"disconnected": "Verbinding verbroken",
"disconnecting": "Verbinding verbroken...",
"display-mode": "Weergavemodus",
"download": "Downloaden",
"duration": "Duur",
"dysfunctional": "Dysfunctioneel",
"edit": "Bewerken",
"enabled": "Ingeschakeld",
"error": "Fout",
"events": "Evenementen",
"execute": "Uitvoeren",
"faithful": "Getrouw",
@@ -395,6 +414,7 @@
"installed": "Geïnstalleerd",
"interface": "Interface",
"internet": "Internet",
"keybind": "Toetsencombinatie",
"language": "Taal",
"loading": "Laden...",
"local": "Lokaal",
@@ -416,6 +436,7 @@
"not-found": "Niet gevonden",
"notifications": "Meldingen",
"official": "Officieel",
"on-surface": "Op oppervlak",
"output": "Uitvoer",
"pair": "Koppelen",
"paired": "Gekoppeld",
@@ -428,11 +449,14 @@
"polling": "Polling",
"position": "Positie",
"previous": "Vorige",
"primary": "Primair",
"random": "Willekeurig",
"reboot": "Herstarten",
"record": "Opname starten",
"refresh": "Vernieuwen",
"required": "(vereist)",
"reset": "Resetten",
"reset-to-default": "Herstellen naar Standaard",
"result-count": "{count} resultaat",
"result-count-plural": "{count} resultaten",
"resume": "Hervatten",
@@ -440,8 +464,12 @@
"scanning": "Scannen...",
"screen-corners": "Schermhoeken",
"search": "Zoeken",
"secondary": "Secundair",
"security": "Beveiliging",
"select": "Selecteer",
"select-color": "Kleur selecteren",
"select-color-description": "Themakleuren toepassen voor nadruk.",
"select-icon-color": "Icoonkleur selecteren",
"shortcuts": "Snelkoppelingen",
"shutdown": "Afsluiten",
"signal": "Signaal",
@@ -449,8 +477,10 @@
"sources": "Bronnen",
"start": "Begin",
"stop": "Stop",
"supporters": "Ondersteuners",
"suspend": "Onderbreken",
"templates": "Sjablonen",
"tertiary": "Tertiair",
"test": "Test",
"thresholds": "Drempels",
"title": "Titel",
@@ -473,6 +503,7 @@
"week": "Week",
"widgets": "Widgets",
"width": "Breedte",
"windows": "Vensters",
"yes": "Ja"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "Bij hover"
},
"hide-modes": {
"auto-hide": "Automatisch verbergen",
"hidden": "Verbergen indien leeg",
"idle": "Verbergen indien inactief",
"non-exclusive": "Niet-exclusief",
"transparent": "Transparant wanneer leeg",
"visible": "Altijd zichtbaar"
},
@@ -543,7 +576,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": {
@@ -579,13 +614,26 @@
"density-compact": "Compact",
"density-default": "Standaard",
"density-mini": "Mini",
"density-spacious": "Ruim"
"density-spacious": "Ruim",
"display-mode-always-visible": "Altijd zichtbaar",
"type-floating": "Zwevend",
"type-framed": "Omkaderd",
"type-simple": "Eenvoudig"
},
"control-center": {
"quick-settings-style-classic": "Klassiek",
"quick-settings-style-modern": "Modern"
},
"frame-rates-fps": "{fps} FPS",
"launcher-density": {
"comfortable": "Comfortabel",
"compact": "Compact",
"default": "Standaard"
},
"launcher-view-mode": {
"grid": "Raster",
"list": "Lijst"
},
"scrolling-modes": {
"always": "Altijd scrollen",
"hover": "Scrollen bij hover",
@@ -616,8 +664,9 @@
},
"panels": {
"about": {
"become-supporter": "Word supporter",
"changelog": "Bekijk wijzigingslogboek",
"contributors-desc": "Een shout-out naar onze {count} <b>geweldige</b> bijdrager!",
"contributors-description": "Een shout-out naar onze {count} <b>geweldige</b> bijdrager!",
"contributors-description-plural": "Een shout-out naar onze {count} <b>geweldige</b> bijdragers!",
"copy-info": "Kopieer info",
"info-copied": "Info gekopieerd naar klembord",
@@ -628,10 +677,14 @@
"noctalia-title": "Noctalia-shell",
"privacy-policy": "Privacybeleid",
"support": "Steun ons",
"supporter-badge": "Supporter",
"supporters-desc": "Een enorme dank aan onze geweldige supporter!",
"supporters-desc-plural": "Enorm bedankt aan onze <b>{count} geweldige</b> supporters!",
"supporters-loading": "Donateurs laden...",
"system-cpu": "CPU:",
"system-disk": "Schijf:",
"system-gpu": "GPU:",
"system-host": "Gastheer/Gastvrouw:",
"system-host": "Host:",
"system-install-hint": "Installeer fastfetch om systeeminformatie te bekijken",
"system-kernel": "Kernel:",
"system-loading": "Systeeminformatie laden...",
@@ -692,21 +745,33 @@
"volumes-output-volume-description": "Systeembreed volumeniveau.",
"volumes-step-size-description": "Pas de stapgrootte voor volumewijzigingen aan (scrollwiel, sneltoetsen).",
"volumes-step-size-label": "Volumestapgrootte",
"volumes-volume-feedback-description": "Een feedbackgeluid afspelen bij het aanpassen van het volume",
"volumes-volume-feedback-description": "Een feedbackgeluid afspelen bij het aanpassen van het volume.",
"volumes-volume-feedback-label": "Volume feedback geluid afspelen",
"volumes-volume-overdrive-description": "Sta toe dat het volume boven 100% wordt verhoogd. Mogelijk niet door alle hardware ondersteund.",
"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-color-description": "Kies een kleur voor balkcapsules, of gebruik geen kleur voor de standaard oppervlaktekleur.",
"appearance-capsule-color-label": "Capsulekleur",
"appearance-capsule-opacity-description": "Stel het doorzichtigheidsniveau in voor widget-achtergronden wanneer capsule wordt getoond.",
"appearance-capsule-opacity-label": "Capsule-doorzichtigheid",
"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-floating-description": "Toon de balk weer als een zwevende 'pil'.",
"appearance-floating-label": "Zwevende balk",
"appearance-frame-radius": "Binnenradius",
"appearance-frame-settings-description": "Pas de kaderdikte en binnenste hoekradius aan",
"appearance-frame-settings-label": "Kaderinstellingen",
"appearance-frame-thickness": "Dikte",
"appearance-hide-on-overview-description": "Verberg de balk en sluit panelen wanneer het compositoroverzicht actief is.",
"appearance-hide-on-overview-label": "Balk verbergen in overzicht",
"appearance-margins-description": "Pas de marges rond de zwevende balk aan.",
@@ -721,6 +786,8 @@
"appearance-show-capsule-label": "Capsules tonen",
"appearance-show-outline-description": "Toon een zichtbare rand rondom elke widget.",
"appearance-show-outline-label": "Toon widget-omtrekken",
"appearance-type-description": "Kies de stijl van de balk: Eenvoudig, Zwevend of Omkaderd.",
"appearance-type-label": "Balktype",
"appearance-use-separate-opacity-description": "Maak het mogelijk om een aparte dekkingswaarde te gebruiken voor de achtergrond van de balk.",
"appearance-use-separate-opacity-label": "Gebruik afzonderlijke balkdekking",
"monitor-configure-widgets": "Widgets configureren",
@@ -770,6 +837,7 @@
"download-title": "Kleurenschema's downloaden",
"method-description": {
"content": "Material Design-schema met high-fidelity kleurextractie die nauw aansluit bij de werkelijke kleuren van de broninhoud.",
"dysfunctional": "Zoals Faithful, maar kiest de op één na meest dominante kleurenfamilie als primair.",
"faithful": "Probeert dicht bij de bronkleur te blijven en tegelijkertijd een harmonieus palet te genereren.",
"fruit-salad": "Material Design-schema dat een speels, levendig palet produceert met diverse en gevarieerde tinten.",
"monochrome": "Material Design-schema met een grijswaarde met één tint en minimale chromatische inhoud.",
@@ -866,6 +934,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",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "Monospace-lettertype zoeken...",
"fonts-reset-scaling": "Schaling resetten",
"fonts-title": "Lettertypes",
"keybinds-description": "Globale navigatietoetsen voor panelen en de starter configureren.",
"keybinds-down": "Naar beneden verplaatsen",
"keybinds-enter": "Bevestigen / Actie",
"keybinds-escape": "Sluiten / Terug",
"keybinds-left": "Naar links verplaatsen",
"keybinds-right": "Naar rechts verplaatsen",
"keybinds-title": "Navigatietoetsencombinaties",
"keybinds-up": "Omhoog verplaatsen",
"language-desc": "Kies je voorkeurstaal voor de applicatie.",
"language-select-auto-detect": "Automatisch",
"language-select-description": "Selecteer de taal die in de interface van de applicatie wordt gebruikt.",
@@ -972,7 +1058,9 @@
"screen-corners-solid-black-description": "Gebruik effen zwart in plaats van de achtergrondkleur van de balk.",
"screen-corners-solid-black-label": "Effen zwarte hoeken",
"screen-corners-title": "Schermhoeken",
"settings-copied": "Instellingen gekopieerd naar klembord"
"settings-copied": "Instellingen gekopieerd naar klembord",
"tab-basics": "Basis",
"tab-keybinds": "Toetsencombinaties"
},
"hooks": {
"info-command-info-description": "• Commando's worden uitgevoerd via shell (sh -lc)<br>• Commando's draaien op de achtergrond (losgekoppeld)<br>• Testknoppen worden uitgevoerd met de huidige waarden",
@@ -1027,18 +1115,28 @@
"settings-clip-wrap-text-label": "Klembordtekst omwikkelen",
"settings-clipboard-history-description": "Toegang tot eerder gekopieerde items vanuit de launcher.",
"settings-clipboard-history-label": "Klembordgeschiedenis inschakelen",
"settings-clipboard-watch-image-description": "Volledige commandoreeks die aan wl-paste wordt doorgegeven voor afbeeldingswijzigingen (herstart vereist).",
"settings-clipboard-watch-image-label": "Afbeelding Bewakingscommando",
"settings-clipboard-watch-text-description": "Volledige commandoreeks die aan wl-paste wordt doorgegeven voor tekstwijzigingen (vereist herstart).",
"settings-clipboard-watch-text-label": "Tekst volgcommando",
"settings-custom-launch-prefix-description": "Voorzie commando's van een aangepaste launcher-prefix (bijv. 'runapp' voor systemd-integratie).",
"settings-custom-launch-prefix-enabled-description": "Gebruik een aangepaste prefix om applicaties te starten in plaats van de standaardmethode.",
"settings-custom-launch-prefix-enabled-label": "Aangepaste startprefix inschakelen",
"settings-custom-launch-prefix-label": "Aangepaste startprefix",
"settings-density-description": "Pas de grootte van applicatiepictogrammen en de dichtheid van de Launcher aan.",
"settings-density-label": "Dichtheid",
"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",
"settings-ignore-mouse-input-description": "Schakel muisinteractie en scrollwiel uit in de launcher.",
"settings-ignore-mouse-input-label": "Negeer muisinvoer",
"settings-overlay-layer-description": "Toon de starter op de overlaylaag, boven vensters op volledig scherm. Indien ingeschakeld, wordt de starter niet aan de balk bevestigd.",
"settings-overlay-layer-label": "Boven volledig scherm weergeven",
"settings-position-description": "Kies waar het launcherpaneel verschijnt.",
"settings-show-categories-description": "Categorieën-tabbladen weergeven voor het filteren van applicaties.",
"settings-show-categories-label": "Categorieën weergeven",
@@ -1050,6 +1148,8 @@
"settings-terminal-command-label": "Terminalcommando",
"settings-use-app2unit-description": "Gebruikt een alternatieve startmethode om app-processen beter te beheren en problemen te voorkomen.",
"settings-use-app2unit-label": "App2Unit gebruiken om applicaties te starten",
"settings-view-mode-description": "Kies de indeling voor de starter-items.",
"settings-view-mode-label": "Weergavemodus",
"title": "Launcher"
},
"location": {
@@ -1066,7 +1166,7 @@
"date-time-show-events-description": "Toon gebeurtenissen in het kalenderpaneel.",
"date-time-show-events-label": "Kalendergebeurtenissen tonen",
"date-time-title": "Datum & tijd",
"date-time-use-analog-description": "Toon een analoge klok in het kalendervenster en op het vergrendelscherm.",
"date-time-use-analog-description": "Toon een analoge klok op het kalendervenster.",
"date-time-use-analog-label": "Analoge klok gebruiken",
"date-time-week-numbers-description": "Toon het weeknummer van het jaar (bijv. week 38) in de kalender.",
"date-time-week-numbers-label": "Weeknummers tonen",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "Weer in kalender weergeven"
},
"lock-screen": {
"allow-password-with-fprintd-description": "Wanneer fprintd (vingerafdrukauthenticatie) actief is, kunt u met deze optie nog steeds inloggen met uw wachtwoord in plaats van een vingerafdruk.",
"allow-password-with-fprintd-label": "Wachtwoordlogin toestaan met fprintd",
"auto-start-auth-description": "Start bijvoorbeeld automatisch de vingerafdrukauthenticatie zonder dat er een toetsaanslag of klik nodig is.",
"auto-start-auth-label": "Automatische authenticatie bij opstarten",
"clock-format-description": "Pas het klokformaat aan met datum-/tijd-syntaxtokens.",
"clock-format-label": "Klokformaat",
"clock-style-analog": "Analoog",
"clock-style-custom": "Aangepast",
"clock-style-description": "Kies de visuele stijl van de klok op het vergrendelscherm.",
"clock-style-digital": "Digitaal",
"clock-style-label": "Klokstijl",
"compact-lockscreen-description": "Toon alleen de logininvoer en systeemknoppen, verberg weer- en mediawidgets.",
"compact-lockscreen-label": "Compact vergrendelscherm",
"lock-on-suspend-description": "Vergrendel het scherm automatisch wanneer het systeem wordt onderbroken.",
"lock-on-suspend-label": "Vergrendelen bij onderbreken",
"lock-screen-animations-description": "Vergrendelschermanimaties in- of uitschakelen.",
"lock-screen-animations-label": "Vergrendelschermanimaties",
"lock-screen-blur-strength-description": "Past een vervagingseffect toe op de achtergrond van het vergrendelscherm.",
"lock-screen-blur-strength-label": "Sterkte van de vervaging van het vergrendelscherm",
"lock-screen-tint-strength-description": "Past een getinte overlay toe op de achtergrond van het vergrendelscherm.",
"lock-screen-tint-strength-label": "Sterkte van de vergrendelschermtint",
"monitors-desc": "Vergrendelscherm tonen op specifieke monitoren. Standaard op alle, indien er geen zijn gekozen.",
"show-hibernate-description": "De optie 'sluimerstand' tonen in de energieopties.",
"show-hibernate-label": "Sluimerstand tonen",
"show-session-buttons-description": "Toegang tot energie-instellingen toestaan vanaf het vergrendelscherm.",
@@ -1126,8 +1244,6 @@
"history-low-urgency-label": "Lage urgentie opslaan in geschiedenis",
"history-normal-urgency-description": "Meldingen met normale prioriteit opslaan in de geschiedenis.",
"history-normal-urgency-label": "Normale urgentie opslaan in geschiedenis",
"media-toast-description": "Een toast weergeven wanneer de afspeelstatus van media verandert.",
"media-toast-label": "Media",
"monitors-desc": "Meldingen op specifieke monitoren tonen. Standaard op alle als er geen zijn gekozen.",
"settings-always-on-top-description": "Toon meldingen boven fullscreen-vensters en andere lagen.",
"settings-background-opacity-description": "Pas de dekking van meldingsachtergronden aan.",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "Meldingsgeluiden niet beschikbaar",
"sounds-volume-description": "Pas het volumeniveau aan voor meldingsgeluiden.",
"sounds-volume-label": "Geluidsvolume",
"toast-battery-description": "Toon een waarschuwing wanneer het accuniveau onder dit percentage zakt.",
"toast-battery-label": "Accuwaarschuwing",
"toast-desc": "Configureer het uiterlijk en gedrag van toasts.",
"toast-keyboard-description": "Toon een toastmelding wanneer de toetsenbordindeling verandert.",
"toast-keyboard-label": "Toetsenbordindeling"
"toast-keyboard-label": "Toetsenbordindeling",
"toast-media-description": "Een toast weergeven wanneer de afspeelstatus van media verandert.",
"toast-media-label": "Media"
},
"osd": {
"always-on-top-description": "Toon OSD boven fullscreen-vensters en andere lagen.",
@@ -1202,16 +1322,20 @@
"types-volume-label": "Uitvoervolume"
},
"plugins": {
"auto-update": "Plugins automatisch bijwerken",
"auto-update-description": "Update automatisch alle plugins wanneer de shell start.",
"available-description": "Blader door en installeer plugins vanuit geconfigureerde bronnen.",
"available-label": "Beschikbare plug-ins",
"available-no-plugins-description": "Controleer je plugin-bronnen of vernieuw de lijst.",
"available-no-plugins-label": "Geen plug-ins beschikbaar",
"check-for-updates": "Controleren op updates",
"checking-for-updates": "Controleren op updates...",
"collision-already-installed": "Deze plugin is al geïnstalleerd",
"collision-custom-version-exists": "Er is al een aangepaste versie van \"{source}\" geïnstalleerd",
"collision-official-version-exists": "De officiële versie van deze plugin is al geïnstalleerd",
"filter-downloaded": "Gedownload",
"filter-not-downloaded": "Niet gedownload",
"filter-tags-description": "Filter plug-ins op categorie of downloadstatus",
"filter-tags-description": "Filter plug-ins op categorie of downloadstatus.",
"filter-tags-label": "Tags",
"hot-reload-description": "Laad plugins automatisch opnieuw wanneer hun bestanden veranderen. Handig voor plugin-ontwikkeling.",
"hot-reload-label": "Hot reload (ontwikkelmodus)",
@@ -1245,6 +1369,7 @@
"sources-placeholder": "Mijn coole repository",
"sources-remove-tooltip": "Pluginbron verwijderen",
"title": "Plugins",
"translations-reloaded": "Vertalingen opnieuw geladen: {name}",
"uninstall-dialog-description": "Weet je zeker dat je {plugin} wilt verwijderen? Hiermee worden alle plugin-gegevens verwijderd.",
"uninstall-dialog-title": "Plugin verwijderen",
"uninstall-error": "Verwijderen mislukt: {error}",
@@ -1271,11 +1396,14 @@
"entries-desc": "Aanpassen welke energieacties in het sessiemenu verschijnen en in welke volgorde.",
"entries-title": "Energieacties",
"entry-settings-command-description": "Aangepast commando om uit te voeren voor deze actie. Laat leeg om het standaard systeemcommando te gebruiken.",
"entry-settings-command-placeholder": "systemctl poweroff",
"entry-settings-command-placeholder": "bijv. systemctl poweroff",
"entry-settings-default-command-lock": "Intern vergrendelscherm (geen commando)",
"entry-settings-default-command-logout": "Interne afmelding (geen commando)",
"entry-settings-default-info-description": "Als er geen aangepast commando is opgegeven, wordt het standaard systeemcommando gebruikt.",
"entry-settings-default-info-label": "Standaardopdracht",
"entry-settings-keybind-description": "Wijs een toetscombinatie toe om deze actie te activeren wanneer het sessiemenu geopend is.",
"entry-settings-keybind-placeholder": "Druk op Opnemen om een toets toe te wijzen...",
"entry-settings-keybind-recording": "Opname... Druk op een willekeurige toetscombinatie",
"entry-settings-title": "Configureer {entry}",
"entry-settings-tooltip": "Configureer opdracht",
"general-desc": "Configureer het gedrag en uiterlijk van het sessiemenupaneel.",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "Kritische kleur",
"custom-highlight-colors-title-label": "Aangepaste markeerkleuren",
"disk-available-label": "Beschikbare schijfruimte",
"disk-section-label": "Schijfgebruik",
"enable-dgpu-monitoring-description": "Waarschuwing: Dit zal uw dedicated GPU (NVIDIA/AMD) activeren, wat een aanzienlijke impact kan hebben op de accuduur van laptops met hybride grafische kaarten.",
"enable-dgpu-monitoring-label": "Dedicated GPU-monitoring inschakelen",
@@ -1323,7 +1452,7 @@
"box-border-description": "Toon een omlijning rond inhoudsgebieden.",
"box-border-label": "Containeromtrek",
"box-border-radius-description": "Past de hoekronding aan van belangrijke lay-outsecties, zoals zijbalken, kaarten en inhoudspanelen.",
"box-border-radius-label": "Container Radius",
"box-border-radius-label": "Hoekradius",
"box-border-radius-reset": "Containerstraal resetten",
"control-border-radius-description": "Regelt de kromming van interactieve elementen, waaronder knoppen, schakelaars en tekstvelden.",
"control-border-radius-label": "Voer straal in",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "Kies lay-out voor instellingen (mogelijk opnieuw openen vereist).",
"settings-panel-mode-label": "Instellingenpaneelmodus",
"shadows-description": "Schakelt slagschaduwen onder balken en panelen in.",
"shadows-direction-description": "Kies vanaf waar de schaduw wordt geworpen.",
"shadows-direction-description": "Kies waar de schaduw wordt geworpen.",
"shadows-direction-label": "Richting van schaduw",
"shadows-label": "Slagschaduwen",
"title": "Gebruikersinterface",
@@ -1386,6 +1515,10 @@
"settings-monitor-specific-description": "Stel een andere achtergrondmap in voor elke monitor.",
"settings-monitor-specific-label": "Monitor-specifieke mappen",
"settings-monitor-specific-tooltip": "Monitor-achtergrondmap",
"settings-overview-blur-strength-description": "Past de vervagingssterkte toe op het overzicht.",
"settings-overview-blur-strength-label": "Vervagingssterkte van het overzicht",
"settings-overview-tint-description": "Past de tintsterkte toe op het overzicht.",
"settings-overview-tint-label": "Overzichtstintsterkte",
"settings-recursive-search-description": "Zoek ook naar achtergronden in submappen van de achtergrondmap.",
"settings-recursive-search-label": "Submappen doorzoeken",
"settings-select-monitor-folder": "Achtergrondmap voor monitor selecteren",
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "Klaar!",
"appearance": {
"subheader": "Kies Dark Mode en kleurbronnen (Wallpaper of vooraf gedefinieerd)."
"subheader": "Kies donkere modus en kleurbronnen (achtergrond of voorgedefinieerd)."
},
"customize": {
"header": "Pas je ervaring aan",
@@ -1449,7 +1582,7 @@
},
"skip-setup": "Setup overslaan",
"telemetry-wizard-done": "Begrepen!",
"telemetry-wizard-note": "Je hebt de controle - schakel dit op elk moment in of uit in de Instellingen",
"telemetry-wizard-note": "Je hebt de controle schakel dit op elk moment in of uit in de instellingen",
"telemetry-wizard-subtitle": "We hebben anonieme analyses toegevoegd om Noctalia te helpen verbeteren",
"telemetry-wizard-title": "Privacy-update",
"wallpaper": {
@@ -1466,7 +1599,7 @@
"select-prompt": "Selecteer hieronder een achtergrond",
"subheader": "Zet de toon met een mooie achtergrond."
},
"welcome-note": "Een paar basisinstellingen om je op weg te helpen alle opties vind je in instellingen",
"welcome-note": "Een paar basisinstellingen om je op weg te helpen alle opties vind je in instellingen",
"welcome-subtitle": "Laten we uw bureaublad uniek maken",
"welcome-title": "Welkom bij Noctalia!"
},
@@ -1490,7 +1623,7 @@
"disk": "Schijf",
"download-speed": "Downloadsnelheid",
"gpu-temp": "GPU-temperatuur",
"load-average": "Belasting Ø",
"load-average": "Gem. belasting",
"title": "Systeemmonitor",
"upload-speed": "Uploadsnelheid"
},
@@ -1499,8 +1632,10 @@
"title": "Vliegtuigmodus"
},
"battery": {
"critical": "Kritiek accuniveau",
"critical-desc": "Accu is {percent}% — sluit de oplader onmiddellijk aan",
"low": "Accu bijna leeg",
"low-desc": "De accu is op {percent}%. Sluit de oplader aan"
"low-desc": "Accu is op {percent}% — sluit de oplader aan"
},
"bluetooth": {
"address-copied": "Adres gekopieerd naar klembord",
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "Schijf",
"fade": "Vervagen",
"honeycomb": "Honingraat",
"pixelate": "Pixeliseren",
"stripes": "Strepen",
"wipe": "Vegen"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "Achtergronden laden...",
"no-results": "Geen achtergronden gevonden. Probeer een andere zoekopdracht.",
"page": "{current} van {total}"
"page": "{current} van {total}",
"page-prefix": "Pagina",
"page-suffix": "van {total}"
}
},
"weather": {
+169
View File
@@ -0,0 +1,169 @@
{
"actions": {
"clear-history": "Tøm tidefar",
"close-app": "Steng {app}",
"connect-vpn": "Få samband med {name}",
"cycle-visualizer": "Skift framsyning",
"disable-bluetooth": "Slå av Blåtann",
"disable-dnd": "Slå av \"Ikkje skjepla\"",
"disable-wifi": "Slå av trådlaust net",
"disconnect-vpn": "Enda samband med {name}",
"enable-bluetooth": "Slå på Blåtann",
"enable-dnd": "Slå på \"Ikkje skjepla\"",
"enable-wifi": "Slå på trådlaust net",
"launcher-settings": "Innstillingar for nøytendeveljar",
"lower-to-bottom": "Send til botnar",
"open-calendar": "Opna almanakka",
"open-display-settings": "Syn innstillingar",
"open-launcher": "Opna nøytendeveljar",
"open-settings": "Opna innstillingar",
"raise-to-top": "Send til toppen",
"random-wallpaper": "Slumpebilæte",
"run-custom-command": "Køyr sjølvgjort styrebod",
"show-active-only": "Syn berre verksam",
"show-all": "Syn alt",
"toggle-mute": "Ljodsløkkjing på/av",
"widget-settings": "Nøytelinnstillingar"
},
"authentication": {
"error": "Sanningsmistak",
"failed": "Sanningsmistak"
},
"bar": {
"active-window": {
"colorize-icons-description": "Lita den verksame ruta med hamlitene.",
"hide-mode-description": "Stjornar kor nøytelen ter seg når det ikkje er ei verksam ruta.",
"scrolling-mode-description": "Stjorna når lange rutenomn kann bledja.",
"show-app-icon-description": "Syn nøytendefråmerke attmed rutenamn.",
"show-app-icon-label": "Syn nøytendefråmerke"
},
"audio-visualizer": {
"color-name-description": "Kjos lìten på framsyningi.",
"color-name-label": "Fyllelìt",
"hide-when-idle-description": "Framsyningi løynest når dette er på, minder noko spelar av.",
"hide-when-idle-label": "Løyn når ingen ting spelar av",
"width-description": "Sjølvvald lutbreidd."
},
"battery": {
"device-default": "Fyrevald syningsambod",
"device-description": "Kjos batteriambod du vil syna fram.",
"device-label": "Batteriambod",
"display-mode-description": "Vel korleîs batteriet er synt fram på radi.",
"display-mode-graphic": "Upplysande batteriteikn",
"display-mode-graphic-clean": "Upplysande batteriteikn (ingen %)",
"display-mode-icon-always": "Fråmerke - syn % stødt",
"display-mode-icon-hover": "Fråmerke - syn ved sviv",
"display-mode-icon-only": "Einast teikn",
"hide-if-idle-description": "Løyn nøytelen når batteriet ikkje ladar og ikkje gjev straum.",
"hide-if-idle-label": "Løyn når uverksam",
"hide-if-not-detected-description": "Løyn nøytelen når kjernen ikkje finn eit batteri.",
"hide-if-not-detected-label": "Løyn når ikkje funne",
"low-battery-threshold-label": "Åtvaringstreskald for lågt batteri",
"show-noctalia-performance-description": "Syn brjotaren for Ytestoda frå Noctalia i batterifjøli.<br>Slær av skuggar og bilætrørslor i Noctalia for å minka emnebruk.",
"show-noctalia-performance-label": "Syn brjotaren for Ytestoda frå Noctalia",
"show-power-profile-description": "Syn veljaren for straumhått i batterifjøli.",
"show-power-profile-label": "Syn straumhåttstoli"
},
"clock": {
"clock-display-description": "Legg til merke frå skråi her for å måta til klokka. 'AP'-merket lyt vera med um klokka berre skal hava 12 timar.",
"clock-display-label": "Klokkesyning",
"custom-font-description": "Kjos skriftkynd til klokka.",
"custom-font-label": "Skriftkynd",
"custom-font-placeholder": "Vel skriftkynd ...",
"custom-font-search-placeholder": "Leita i skriftkynder ...",
"horizontal-bar-description": "Råd: Du kann nytta \\n til å skifta til ny lina.",
"horizontal-bar-label": "Vassbein rad",
"preview": "Vis fyreåt",
"tooltip-format-description": "Snidstreng for vitringi som kjem upp når du sviv yver klokka. Haldt tom for fyrevald vitring.",
"tooltip-format-label": "Vitringssnid",
"use-custom-font-description": "Sjå burt frå skriftkyndi elles og nytta ei onnor skriftkynd til klokka.",
"use-custom-font-label": "Nytta onnor skriftkynd",
"use-monospaced-font-description": "Klokka nyttar fastbreiddeskrift når dette er på.",
"use-monospaced-font-label": "Nytta fastbreiddeskrift",
"vertical-bar-description": "Skriv inn eit millomrom for å skifta kvar lut til ei ny lina.",
"vertical-bar-label": "Loddbein rad"
},
"control-center": {
"browse-file": "Leita etter fil",
"browse-library": "Leita i samning",
"color-selection-description": "Lita nøytelfråmerke med hamlitene.",
"enable-colorization-description": "Lita merket til styreromet med hamlitene.",
"icon-description": "Kjos fråmerke frå samningi eller ei onnor fil.",
"select-custom-icon": "Kjos anna fråmerke",
"use-distro-logo-description": "Nytta fråmerket til Linuxavbrigdet ditt helder en eit anna teikn.",
"use-distro-logo-label": "Nytta avbrigdesfråmerke"
},
"custom-button": {
"collapse-condition-description": "Knappen løynest um utskrifti er lik dette.",
"collapse-condition-label": "Løyningsvilkor",
"color-selection-description": "Lita fråmerket og teksti med hamlitene.",
"display-command-output-description": "Skriv inn eit styrebod som skal køyra jamlege. Syner fyrste utskriftsradi som tekst.",
"display-command-output-label": "Syn utskrift frå styrebod",
"display-command-output-stream-description": "Skriv inn styrebod som skal køyra heile tidi.",
"dynamic-text": "Kvikskrift",
"enable-colorization-description": "Lita fråmerket og teksti på den sjølvgjorde knappen med hamlitene.",
"enable-colorization-label": "Lita",
"hide-mode-always-expanded": "Stødt vidka",
"hide-mode-description": "Stjornar um nøytelen er til å sjå når styrebodet ikkje kjem med utskrift.",
"hide-mode-expand-with-output": "Vidka ved utskrift",
"hide-mode-label": "Løyndarluna",
"hide-mode-max-transparent": "Vidka heilt men klår",
"icon-description": "Kjos fråmerke frå samningi.",
"ipc-identifier-description": "Sermerke for IPC-styrebod. Nytta dette merket med 'qs -c noctalia-shell ipc call cb [gjerning] [merke]' for å styra knappen med IPC.",
"ipc-identifier-label": "IPC-sermerke",
"left-click-description": "Styrebod som køyrer ved vinstretrykk.",
"left-click-label": "Vinstretrykk",
"left-click-update-text": "Før upp ny tekst ved vinstretrykk",
"max-text-length-horizontal-description": "Øvre grensa på teikn som kann synast på vassbein rad (0 for å løyna).",
"max-text-length-horizontal-label": "Øvre grensa på tekstlengd (vassbein)",
"max-text-length-vertical-description": "Øvre grensa på teikn som kann synast på loddbein rad (0 for å løyna).",
"max-text-length-vertical-label": "Øvre grensa på tekstlengd (loddbein)",
"middle-click-description": "Styrebod som køyrer ved midtrykk.",
"middle-click-label": "Midtrykk",
"middle-click-update-text": "Før upp ny tekst ved midtrykk",
"parse-json-description": "Tyd utfall frå styrebodet som JSON-likam for å stjorna tekst og fråmerke kvikt.",
"parse-json-label": "Tyd utfall som JSON",
"refresh-interval-description": "Bil i millisekundar.",
"refresh-interval-label": "Nykveikjingsbil",
"right-click-description": "Styrebod som køyrer ved høgretrykk.",
"right-click-label": "Høgretrykk",
"right-click-update-text": "Før upp ny tekst ved midtrykk",
"show-icon-description": "Skifter um nøytelfråmerket er synlegt eller ikkje.",
"show-icon-label": "Syn fråmerke",
"text-stream-description": "Strøymde utfallssegner frå styrebodet syner seg som tekst på knappen.",
"text-stream-label": "Strøym",
"wheel-description": "Styrebod som køyrer når ein bled hjulet på musi.<br>Nytta $delta i styrebodet for hjulsbrigdi.",
"wheel-down-description": "Styrebod som køyrer når hjulet er bladt nedetter.",
"wheel-down-label": "Styrebod - nedetter",
"wheel-label": "Bladhjul",
"wheel-mode-separate-description": "Hav ulike styrebod når ein bled uppetter og nedetter.",
"wheel-mode-separate-label": "Skilde hjulstyrebod",
"wheel-up-description": "Styrebod som køyrer når hjulet er bladt uppetter.",
"wheel-up-label": "Styrebod - uppetter",
"wheel-update-text": "Før upp ny tekst med bledjing"
},
"keyboard-layout": {
"show-icon-description": "Syn merket for knappefjøluppsett."
},
"lock-keys": {
"hide-when-off-description": "Løyn sermerket når knappen ikkje er verksam.",
"hide-when-off-label": "Løyn når av",
"show-caps-lock-description": "Syn storlåshåtten",
"show-caps-lock-label": "Storlås",
"show-num-lock-description": "Syn tallåshåtten",
"show-num-lock-label": "Tallås",
"show-scroll-lock-description": "Syn bladlåshåtten",
"show-scroll-lock-label": "Bladlås"
},
"media-mini": {
"compact-mode-description": "Få spelnøytelsfjøli til å roma mindre.",
"compact-mode-label": "Klemb spelnøytelen",
"hide-mode-description": "Stjorn framferdi åt nøytelen når ingen ting spelar av.",
"max-width-description": "Fastset kor mykje nøytelen kan lengjast vassbeint. Nøytelen dreg seg i hop for å røma stuttare innhald.",
"no-active-player": "Ingi verksame spelarar"
}
},
"common": {
"select-color-description": "Lita med hamlitene for tyngd."
}
}
File diff suppressed because it is too large Load Diff
+172 -33
View File
@@ -48,11 +48,16 @@
"device-default": "Domyślne (urządzenie wyświetlające)",
"device-description": "Wybierz, które urządzenie baterii ma być wyświetlane.",
"device-label": "Urządzenie baterii",
"display-mode-description": "Wybierz, jak bateria jest wyświetlana na pasku.",
"display-mode-graphic": "Graficzna bateria",
"display-mode-graphic-clean": "Graficzna bateria (bez %)",
"display-mode-icon-always": "Ikona - Zawsze pokazuj %",
"display-mode-icon-hover": "Ikona - Pokaż po najechaniu",
"display-mode-icon-only": "Tylko ikona",
"hide-if-idle-description": "Ukryj widżet, gdy bateria nie jest ładowana ani rozładowywana.",
"hide-if-idle-label": "Ukryj, gdy bezczynny",
"hide-if-not-detected-description": "Ukryj widżet, gdy w systemie nie zostanie wykryta bateria.",
"hide-if-not-detected-label": "Ukryj się, jeśli nie wykryto",
"low-battery-threshold-description": "Pokaż ostrzeżenie, gdy poziom baterii spadnie poniżej tego procentu.",
"low-battery-threshold-label": "Próg ostrzegania o niskim poziomie baterii",
"show-noctalia-performance-description": "Wyświetl przełącznik trybu wydajności Noctalia w panelu baterii.<br>Wyłącza cienie i animacje w Noctalia, aby zmniejszyć zużycie zasobów.",
"show-noctalia-performance-label": "Pokaż przełącznik wydajności Noctalia",
@@ -75,8 +80,6 @@
"use-custom-font-label": "Użyj niestandardowej czcionki",
"use-monospaced-font-description": "Gdy włączone, zegar będzie używał czcionki o stałej szerokości.",
"use-monospaced-font-label": "Użyj czcionki monospaced",
"use-primary-color-description": "Gdy włączone, stosuje kolor podstawowy dla podkreślenia.",
"use-primary-color-label": "Użyj koloru podstawowego",
"vertical-bar-description": "Użyj spacji, aby oddzielić każdą część w nowej linii.",
"vertical-bar-label": "Pasek pionowy"
},
@@ -94,7 +97,6 @@
"collapse-condition-description": "Jeśli tekst wyjściowy pasuje do tej wartości, przycisk zostanie zwinięty.",
"collapse-condition-label": "Warunek zwinięcia",
"color-selection-description": "Zastosuj kolory motywu do ikony i tekstu.",
"color-selection-label": "Wybierz kolor",
"display-command-output-description": "Wpisz polecenie do uruchamiania w regularnych odstępach czasu. Pierwsza linia wyniku zostanie wyświetlona jako tekst.",
"display-command-output-label": "Wyświetl wynik polecenia",
"display-command-output-stream-description": "Wpisz polecenie do uruchamiania w trybie ciągłym.",
@@ -182,7 +184,9 @@
"hide-widget-when-zero-unread-description": "Ukryj ikonę powiadomień, gdy nie ma nieprzeczytanych powiadomień.",
"hide-widget-when-zero-unread-label": "Ukryj ikonę bez nieprzeczytanych",
"show-unread-badge-description": "Wyświetl plakietkę z liczbą nieprzeczytanych powiadomień.",
"show-unread-badge-label": "Pokaż plakietkę nieprzeczytanych"
"show-unread-badge-label": "Pokaż plakietkę nieprzeczytanych",
"unread-badge-color-description": "Wybierz kolor dla plakietki nieprzeczytanych powiadomień.",
"unread-badge-color-label": "Kolor plakietki nieprzeczytanych"
},
"section-editor": {
"placeholder": "Wybierz widżet do dodania...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "Wyświetlaj statystyki jako mini wykresy słupkowe zamiast wartości tekstowych. Zapobiega przesunięciom układu.",
"compact-mode-label": "Tryb kompaktowy",
"cpu-frequency-description": "Wyświetl aktualną prędkość zegara CPU w GHz.",
"cpu-frequency-label": "Pokaż częstotliwość CPU",
"cpu-temperature-description": "Pokaż odczyty temperatury procesora (jeśli dostępne).",
"cpu-temperature-label": "Temperatura CPU",
"cpu-usage-description": "Wyświetl aktualne użycie procesora w procentach.",
@@ -209,6 +215,10 @@
"memory-usage-label": "Użycie pamięci",
"network-traffic-description": "Wyświetl prędkość wysyłania i pobierania danych w sieci.",
"network-traffic-label": "Ruch sieciowy",
"storage-as-percentage-description": "Wyświetlaj miejsce na dysku jako procent zamiast wartości bezwzględnych.",
"storage-as-percentage-label": "Dysk jako procent",
"storage-available-description": "Pokazuje, ile miejsca na dysku jest dostępne, zamiast ile jest używane.",
"storage-available-label": "Dostępne miejsce na dysku",
"storage-usage-description": "Pokaż informacje o użyciu miejsca na dysku.",
"storage-usage-label": "Użycie dysku",
"swap-usage-description": "Pokaż użycie pamięci wymiany.",
@@ -240,6 +250,8 @@
"title-width-reset-tooltip": "Resetuj szerokość tytułu"
},
"tray": {
"chevron-color-description": "Zastosuj kolory motywu do ikony strzałki szuflady.",
"chevron-color-label": "Kolor strzałki",
"colorize-icons-description": "Zastosuj kolory motywu do ikon zasobnika.",
"colorize-icons-label": "Koloryzuj ikony",
"drawer-enabled-description": "Gdy włączone, nieprzypięte elementy zasobnika są pokazywane w panelu szuflady.<br>Gdy wyłączone, wszystkie elementy są pokazywane w linii.",
@@ -248,14 +260,17 @@
"hide-passive-label": "Ukryj pasywne elementy"
},
"volume": {
"display-mode-description": "Wybierz sposób wyświetlania tej wartości.",
"display-mode-label": "Tryb wyświetlania"
"display-mode-description": "Wybierz sposób wyświetlania tej wartości."
},
"workspace": {
"character-count-description": "Liczba znaków do wyświetlenia z nazw obszarów roboczych (1-10).",
"character-count-label": "Liczba znaków",
"empty-color-description": "Ustaw kolor tła dla pustych Workspaceów.",
"empty-color-label": "Kolor pustego obszaru roboczego",
"enable-scrollwheel-description": "Przełączaj między obszarami roboczymi za pomocą kółka myszy.",
"enable-scrollwheel-label": "Przewiń, aby przełączyć obszary",
"focused-color-description": "Ustaw kolor tła dla aktywnego Workspace.",
"focused-color-label": "Kolor aktywnego obszaru roboczego",
"follow-focused-screen-description": "Wyświetl obszary robocze z aktualnie aktywnego ekranu, zamiast ekranu, na którym znajduje się pasek.",
"follow-focused-screen-label": "Podążaj za skupionym ekranem",
"grouped-border-opacity-description": "Ustaw poziom krycia dla obramowań kontenerów obszaru roboczego.",
@@ -264,8 +279,16 @@
"hide-unoccupied-label": "Ukryj nieobsadzone",
"label-mode-description": "Wybierz sposób wyświetlania etykiet obszarów roboczych.",
"label-mode-label": "Tryb etykiet",
"occupied-color-description": "Ustaw kolor tła dla zajętych Workspace'ów.",
"occupied-color-label": "Kolor zajętego obszaru roboczego",
"pill-size-description": "Dostosuj rozmiar pigułek obszaru roboczego (50%-100%).",
"pill-size-label": "Rozmiar pigułki",
"reverse-scrolling-description": "Odwróć kierunek przełączania obszarów roboczych podczas przewijania.",
"reverse-scrolling-label": "Odwróć przewijanie",
"show-applications-description": "Wyświetl ikony aplikacji wewnątrz każdego obszaru roboczego.",
"show-applications-label": "Pokaż aplikacje",
"show-badge-description": "Pokaż plakietkę z numerem obszaru roboczego w trybie grupowym.",
"show-badge-label": "Pokaż odznakę obszaru roboczego",
"show-labels-only-when-occupied-description": "Pokazuj etykiety obszarów roboczych tylko wtedy, gdy zawierają okna.",
"show-labels-only-when-occupied-label": "Pokaż etykiety tylko gdy obsadzone",
"unfocused-icons-opacity-description": "Ustaw poziom przezroczystości dla ikon nieaktywnych aplikacji.",
@@ -327,13 +350,6 @@
"version-new-user": "Nowa instalacja"
}
},
"colors": {
"error": "Błąd",
"on-surface": "Na powierzchni",
"primary": "Podstawowy",
"secondary": "Wtórny",
"tertiary": "Trzeciorzędowy"
},
"common": {
"actions": "Akcje",
"add": "Dodaj",
@@ -373,10 +389,13 @@
"disconnect": "Rozłącz",
"disconnected": "Rozłączone",
"disconnecting": "Rozłączanie...",
"display-mode": "Tryb wyświetlania",
"download": "Pobierz",
"duration": "Czas trwania",
"dysfunctional": "Dysfunkcyjny",
"edit": "Edytuj",
"enabled": "Włączone",
"error": "Błąd",
"events": "Wydarzenia",
"execute": "Wykonaj",
"faithful": "Wierny",
@@ -395,6 +414,7 @@
"installed": "Zainstalowano",
"interface": "Interfejs",
"internet": "Internet",
"keybind": "Skrót klawiszowy",
"language": "Język",
"loading": "Ładowanie...",
"local": "Lokalny",
@@ -416,6 +436,7 @@
"not-found": "Nie znaleziono",
"notifications": "Powiadomienia",
"official": "Oficjalne",
"on-surface": "Na powierzchni",
"output": "Wyjście",
"pair": "Paruj",
"paired": "Sparowane",
@@ -428,11 +449,14 @@
"polling": "Odpytywanie",
"position": "Pozycja",
"previous": "Poprzedni",
"primary": "Podstawowy",
"random": "Losowy",
"reboot": "Restart",
"record": "Rozpocznij nagrywanie",
"refresh": "Odśwież",
"required": "(wymagane)",
"reset": "Zresetuj",
"reset-to-default": "Przywróć do Domyślnych",
"result-count": "{count} wynik",
"result-count-plural": "{count} wyniki",
"resume": "Wznów",
@@ -440,8 +464,12 @@
"scanning": "Skanowanie...",
"screen-corners": "Narożniki ekranu",
"search": "Szukaj",
"secondary": "Dodatkowy",
"security": "Bezpieczeństwo",
"select": "Wybierz",
"select-color": "Wybierz kolor",
"select-color-description": "Zastosuj kolory motywu dla podkreślenia.",
"select-icon-color": "Wybierz kolor ikony",
"shortcuts": "Skróty",
"shutdown": "Wyłącz",
"signal": "Sygnał",
@@ -449,8 +477,10 @@
"sources": "Źródła",
"start": "Start",
"stop": "Stop",
"supporters": "Wspierający",
"suspend": "Wstrzymaj",
"templates": "Szablony",
"tertiary": "Trzeciorzędowy",
"test": "Test",
"thresholds": "Progi",
"title": "Tytuł",
@@ -473,6 +503,7 @@
"week": "Tydzień",
"widgets": "Widżety",
"width": "Szerokość",
"windows": "Okna",
"yes": "Tak"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "Po najechaniu kursorem"
},
"hide-modes": {
"auto-hide": "Automatyczne ukrywanie",
"hidden": "Ukryj, gdy puste",
"idle": "Ukryj, gdy bezczynny",
"non-exclusive": "Niewyłączny",
"transparent": "Przezroczysty, gdy pusty",
"visible": "Zawsze widoczny"
},
@@ -543,7 +576,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": {
@@ -579,13 +614,26 @@
"density-compact": "Kompaktowy",
"density-default": "Domyślny",
"density-mini": "Mini",
"density-spacious": "Przestronny"
"density-spacious": "Przestronny",
"display-mode-always-visible": "Zawsze widoczne",
"type-floating": "Pływający",
"type-framed": "Obramowany",
"type-simple": "Prosty"
},
"control-center": {
"quick-settings-style-classic": "Klasyczny",
"quick-settings-style-modern": "Nowoczesny"
},
"frame-rates-fps": "{fps} FPS",
"launcher-density": {
"comfortable": "Komfortowy",
"compact": "Kompaktowy",
"default": "Domyślny"
},
"launcher-view-mode": {
"grid": "Siatka",
"list": "Lista"
},
"scrolling-modes": {
"always": "Zawsze przewijaj",
"hover": "Przewijaj po najechaniu",
@@ -616,8 +664,9 @@
},
"panels": {
"about": {
"become-supporter": "Zostań wspierającym",
"changelog": "Zobacz dziennik zmian",
"contributors-desc": "Podziękowania dla naszego {count} <b>niesamowitego</b> współtwórcy!",
"contributors-description": "Podziękowania dla naszego {count} <b>niesamowitego</b> współtwórcy!",
"contributors-description-plural": "Podziękowania dla naszych {count} <b>niesamowitych</b> współtwórców!",
"copy-info": "Kopiuj informacje",
"info-copied": "Informacje skopiowane do schowka",
@@ -628,6 +677,10 @@
"noctalia-title": "Noctalia shell",
"privacy-policy": "Polityka prywatności",
"support": "Wesprzyj nas",
"supporter-badge": "Wspierający",
"supporters-desc": "Ogromne podziękowania dla naszego wspaniałego wspierającego!",
"supporters-desc-plural": "Ogromne podziękowania dla naszych <b>{count} wspaniałych</b> wspierających!",
"supporters-loading": "Ładowanie wspierających...",
"system-cpu": "Procesor:",
"system-disk": "Dysk:",
"system-gpu": "GPU:",
@@ -636,7 +689,7 @@
"system-kernel": "Jądro:",
"system-loading": "Ładowanie informacji o systemie...",
"system-memory": "Pamięć:",
"system-monitor": "Monitor: Monitor",
"system-monitor": "Monitor:",
"system-not-installed": "fastfetch nie jest zainstalowany",
"system-os": "System operacyjny:",
"system-packages": "Paczki:",
@@ -692,21 +745,33 @@
"volumes-output-volume-description": "Poziom głośności całego systemu.",
"volumes-step-size-description": "Dostosuj skok zmiany głośności (kółko myszy, skróty klawiszowe).",
"volumes-step-size-label": "Skok głośności",
"volumes-volume-feedback-description": "Odtwarzaj dźwięk zwrotny podczas regulacji głośności",
"volumes-volume-feedback-description": "Odtwarzaj dźwięk zwrotny podczas regulacji głośności.",
"volumes-volume-feedback-label": "Odtwórz dźwięk sprzężenia zwrotnego głośności",
"volumes-volume-overdrive-description": "Pozwól na zwiększenie głośności powyżej 100%. Może nie być obsługiwane przez każdy sprzęt.",
"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-color-description": "Wybierz kolor dla kapsuł paska, lub nie używaj żadnego dla domyślnego koloru powierzchni.",
"appearance-capsule-color-label": "Kolor kapsuły",
"appearance-capsule-opacity-description": "Ustaw poziom przezroczystości tła widżetów, gdy kapsuła jest widoczna.",
"appearance-capsule-opacity-label": "Przezroczystość kapsuły",
"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-floating-description": "Wyświetl pasek jako pływającą 'pigułkę'.",
"appearance-floating-label": "Pływający pasek",
"appearance-frame-radius": "Promień wewnętrzny",
"appearance-frame-settings-description": "Dostosuj grubość ramki i wewnętrzny promień narożników",
"appearance-frame-settings-label": "Ustawienia ramki",
"appearance-frame-thickness": "Grubość",
"appearance-hide-on-overview-description": "Ukryj pasek i zamknij panele, gdy aktywny jest przegląd kompozytora.",
"appearance-hide-on-overview-label": "Ukryj pasek w przeglądzie",
"appearance-margins-description": "Dostosuj marginesy wokół pływającego paska.",
@@ -721,6 +786,8 @@
"appearance-show-capsule-label": "Pokaż kapsułę",
"appearance-show-outline-description": "Wyświetla widoczne obramowanie wokół każdego widżetu.",
"appearance-show-outline-label": "Pokaż obramowanie widżetów",
"appearance-type-description": "Wybierz styl paska: Prosty, Pływający lub Obramowany.",
"appearance-type-label": "Typ paska",
"appearance-use-separate-opacity-description": "Umożliwia użycie oddzielnej wartości krycia dla tła paska.",
"appearance-use-separate-opacity-label": "Użyj osobnej przezroczystości słupków",
"monitor-configure-widgets": "Skonfiguruj widżety",
@@ -770,6 +837,7 @@
"download-title": "Pobierz schematy kolorów",
"method-description": {
"content": "Schemat Material Design z ekstrakcją kolorów o wysokiej wierności, która ściśle odpowiada rzeczywistym kolorom treści źródłowej.",
"dysfunctional": "Jak Faithful, ale wybiera drugą najbardziej dominującą rodzinę kolorów jako główną.",
"faithful": "Próbuje pozostać blisko koloru źródłowego, jednocześnie generując harmonijną paletę.",
"fruit-salad": "Schemat Material Design, który tworzy radosną, żywą paletę z różnorodnymi odcieniami.",
"monochrome": "Schemat Material Design wykorzystujący jednobarwną skalę szarości z minimalną zawartością chromatyczną.",
@@ -866,6 +934,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",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "Szukaj czcionki monospace...",
"fonts-reset-scaling": "Resetuj skalowanie",
"fonts-title": "Czcionki",
"keybinds-description": "Skonfiguruj globalne klawisze nawigacyjne dla paneli i launchera.",
"keybinds-down": "Przenieś w dół",
"keybinds-enter": "Potwierdź / Akcja",
"keybinds-escape": "Zamknij / Wstecz",
"keybinds-left": "Przesuń w lewo",
"keybinds-right": "Przesuń w prawo",
"keybinds-title": "Skróty Klawiszowe Nawigacji",
"keybinds-up": "Przenieś w górę",
"language-desc": "Wybierz preferowany język aplikacji.",
"language-select-auto-detect": "Automatyczny",
"language-select-description": "Wybierz język używany w interfejsie aplikacji.",
@@ -972,7 +1058,9 @@
"screen-corners-solid-black-description": "Użyj jednolitej czerni zamiast koloru tła paska.",
"screen-corners-solid-black-label": "Jednolicie czarne narożniki",
"screen-corners-title": "Narożniki ekranu",
"settings-copied": "Ustawienia skopiowane do schowka"
"settings-copied": "Ustawienia skopiowane do schowka",
"tab-basics": "Podstawy",
"tab-keybinds": "Skróty Klawiszowe"
},
"hooks": {
"info-command-info-description": "• Polecenia są wykonywane przez powłokę (sh -lc)<br>• Polecenia działają w tle (detached)<br>• Przyciski testowe wykonują się z aktualnymi wartościami",
@@ -983,10 +1071,10 @@
"noctalia-started-placeholder": "np. notify-send 'Noctalia załadowany'",
"performance-mode-disabled-description": "Komenda do wykonania, gdy tryb wydajności Noctalia zostanie wyłączony.",
"performance-mode-disabled-label": "Tryb wydajności wyłączony",
"performance-mode-disabled-placeholder": "notify-send \"Wydajność\" \"Tryb wyłączony\"",
"performance-mode-disabled-placeholder": "np. notify-send \"Wydajność\" \"Tryb wyłączony\"",
"performance-mode-enabled-description": "Komenda do wykonania, gdy tryb wydajności Noctalia jest włączony.",
"performance-mode-enabled-label": "Tryb wydajności włączony",
"performance-mode-enabled-placeholder": "notify-send \"Wydajność\" \"Tryb włączony\"",
"performance-mode-enabled-placeholder": "np. notify-send \"Wydajność\" \"Tryb włączony\"",
"screen-lock-description": "Polecenie do wykonania, gdy ekran zostanie zablokowany.",
"screen-lock-label": "Ekran zablokowany",
"screen-lock-placeholder": "np. notify-send \"Ekran\" \"Zablokowany\"",
@@ -1027,18 +1115,28 @@
"settings-clip-wrap-text-label": "Zawijaj tekst ze schowka",
"settings-clipboard-history-description": "Dostęp do wcześniej skopiowanych elementów z poziomu launchera.",
"settings-clipboard-history-label": "Włącz historię schowka",
"settings-clipboard-watch-image-description": "Pełny ciąg poleceń przekazywany do wl-paste dla zmian obrazu (wymaga ponownego uruchomienia).",
"settings-clipboard-watch-image-label": "Polecenie Monitorowania Obrazów",
"settings-clipboard-watch-text-description": "Pełny ciąg poleceń przekazywany do wl-paste dla zmian tekstu (wymaga ponownego uruchomienia).",
"settings-clipboard-watch-text-label": "Polecenie monitorowania tekstu",
"settings-custom-launch-prefix-description": "Poprzedzaj polecenia własnym prefiksem (np. 'runapp' dla integracji z systemd).",
"settings-custom-launch-prefix-enabled-description": "Używaj własnego prefiksu do uruchamiania aplikacji zamiast metody domyślnej.",
"settings-custom-launch-prefix-enabled-label": "Włącz własny prefiks",
"settings-custom-launch-prefix-label": "Własny prefiks uruchamiania",
"settings-density-description": "Dostosuj rozmiar ikon aplikacji i gęstość Launchera.",
"settings-density-label": "Gęstość",
"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",
"settings-ignore-mouse-input-description": "Wyłącz interakcję myszy i kółko przewijania w launcherze.",
"settings-ignore-mouse-input-label": "Ignoruj dane wejściowe myszy",
"settings-overlay-layer-description": "Wyświetl program uruchamiający na warstwie nakładki, nad oknami pełnoekranowymi. Po włączeniu program uruchamiający nie zostanie przypięty do paska.",
"settings-overlay-layer-label": "Pokaż nad pełnym ekranem",
"settings-position-description": "Wybierz, gdzie pojawia się panel launchera.",
"settings-show-categories-description": "Pokaż karty kategorii do filtrowania aplikacji.",
"settings-show-categories-label": "Pokaż kategorie",
@@ -1050,6 +1148,8 @@
"settings-terminal-command-label": "Polecenie terminala",
"settings-use-app2unit-description": "Używa alternatywnej metody uruchamiania, aby lepiej zarządzać procesami i zapobiegać problemom.",
"settings-use-app2unit-label": "Użyj App2Unit do uruchamiania aplikacji",
"settings-view-mode-description": "Wybierz układ dla wpisów programu uruchamiającego.",
"settings-view-mode-label": "Tryb widoku",
"title": "Launcher"
},
"location": {
@@ -1066,7 +1166,7 @@
"date-time-show-events-description": "Wyświetlaj wydarzenia w panelu kalendarza.",
"date-time-show-events-label": "Pokaż wydarzenia kalendarza",
"date-time-title": "Data i czas",
"date-time-use-analog-description": "Pokaż zegar analogowy w oknie kalendarza i na ekranie blokady.",
"date-time-use-analog-description": "Pokaż zegar w stylu analogowym w oknie kalendarza.",
"date-time-use-analog-label": "Użyj zegara analogowego",
"date-time-week-numbers-description": "Wyświetlaj numer tygodnia w roku (np. tydzień 38) w kalendarzu.",
"date-time-week-numbers-label": "Pokaż numery tygodni",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "Wyświetlaj pogodę w kalendarzu"
},
"lock-screen": {
"allow-password-with-fprintd-description": "Gdy fprintd (uwierzytelnianie odciskiem palca) jest aktywne, ta opcja pozwala nadal logować się za pomocą hasła zamiast odcisku palca.",
"allow-password-with-fprintd-label": "Zezwól na logowanie hasłem za pomocą fprintd",
"auto-start-auth-description": "Automatycznie uruchamia uwierzytelnianie odciskiem palca bez konieczności naciskania klawisza lub klikania przycisku.",
"auto-start-auth-label": "Automatyczne uruchamianie uwierzytelniania",
"clock-format-description": "Dostosuj format zegara, używając tokenów składni daty/czasu.",
"clock-format-label": "Format zegara",
"clock-style-analog": "Analogowy",
"clock-style-custom": "Niestandardowy",
"clock-style-description": "Wybierz styl wizualny zegara na ekranie blokady.",
"clock-style-digital": "Cyfrowy",
"clock-style-label": "Styl Zegara",
"compact-lockscreen-description": "Pokaż tylko logowanie i kontrolki systemowe, ukrywając widżety pogody i mediów.",
"compact-lockscreen-label": "Kompaktowy ekran blokady",
"lock-on-suspend-description": "Automatycznie blokuj ekran podczas uśpienia systemu.",
"lock-on-suspend-label": "Blokuj przy uśpieniu",
"lock-screen-animations-description": "Włącz lub wyłącz animacje ekranu blokady.",
"lock-screen-animations-label": "Animacje Ekranu Blokady",
"lock-screen-blur-strength-description": "Stosuje efekt rozmycia do tapety ekranu blokady.",
"lock-screen-blur-strength-label": "Siła rozmycia ekranu blokady",
"lock-screen-tint-strength-description": "Stosuje nakładkę z odcieniem do tapety ekranu blokady.",
"lock-screen-tint-strength-label": "Siła zabarwienia ekranu blokady",
"monitors-desc": "Pokaż ekran blokady na określonych monitorach. Domyślnie na wszystkich, jeśli żadne nie zostaną wybrane.",
"show-hibernate-description": "Pokaż opcję 'hibernacja' w kontrolkach zasilania.",
"show-hibernate-label": "Pokaż hibernację",
"show-session-buttons-description": "Zezwalaj na dostęp do ustawień zasilania z poziomu ekranu blokady.",
@@ -1126,8 +1244,6 @@
"history-low-urgency-label": "Odeślij niską pilność do historii",
"history-normal-urgency-description": "Zapisuj powiadomienia o normalnym priorytecie w historii.",
"history-normal-urgency-label": "Zapisz normalny priorytet do historii",
"media-toast-description": "Wyświetl toast, gdy zmieni się stan odtwarzania multimediów.",
"media-toast-label": "Media",
"monitors-desc": "Pokazuj powiadomienia na konkretnych monitorach. Domyślnie na wszystkich.",
"settings-always-on-top-description": "Wyświetlaj powiadomienia nad oknami pełnoekranowymi i innymi warstwami.",
"settings-background-opacity-description": "Dostosuj przezroczystość tła powiadomień.",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "Dźwięki powiadomień niedostępne",
"sounds-volume-description": "Dostosuj poziom głośności dźwięków powiadomień.",
"sounds-volume-label": "Głośność dźwięku",
"toast-battery-description": "Wyświetl ostrzeżenie, gdy poziom baterii spadnie poniżej tego procentu.",
"toast-battery-label": "Ostrzeżenie o baterii",
"toast-desc": "Konfiguruj wygląd i zachowanie dymków powiadomień.",
"toast-keyboard-description": "Pokaż dymek (toast), gdy zmieni się układ klawiatury.",
"toast-keyboard-label": "Układ klawiatury"
"toast-keyboard-label": "Układ klawiatury",
"toast-media-description": "Wyświetl toast, gdy zmieni się stan odtwarzania multimediów.",
"toast-media-label": "Media"
},
"osd": {
"always-on-top-description": "Wyświetlaj OSD nad oknami pełnoekranowymi i innymi warstwami.",
@@ -1202,16 +1322,20 @@
"types-volume-label": "Głośność wyjściowa"
},
"plugins": {
"auto-update": "Automatyczna aktualizacja wtyczek",
"auto-update-description": "Automatycznie aktualizuj wszystkie wtyczki po uruchomieniu shella.",
"available-description": "Przeglądaj i instaluj wtyczki ze skonfigurowanych źródeł.",
"available-label": "Dostępne wtyczki",
"available-no-plugins-description": "Sprawdź źródła wtyczek lub odśwież listę.",
"available-no-plugins-label": "Brak dostępnych wtyczek",
"check-for-updates": "Sprawdź aktualizacje",
"checking-for-updates": "Sprawdzanie aktualizacji...",
"collision-already-installed": "Ta wtyczka jest już zainstalowana",
"collision-custom-version-exists": "Niestandardowa wersja z \"{source}\" jest już zainstalowana",
"collision-official-version-exists": "Oficjalna wersja tej wtyczki jest już zainstalowana",
"filter-downloaded": "Pobrane",
"filter-not-downloaded": "Niepobrane",
"filter-tags-description": "Filtruj wtyczki według kategorii lub statusu pobierania",
"filter-tags-description": "Filtruj wtyczki według kategorii lub statusu pobierania.",
"filter-tags-label": "Tagi",
"hot-reload-description": "Automatycznie przeładuj wtyczki przy zmianie ich plików. Przydatne przy tworzeniu wtyczek.",
"hot-reload-label": "Gorące przeładowanie (tryb deweloperski)",
@@ -1245,6 +1369,7 @@
"sources-placeholder": "Moje fajne repozytorium",
"sources-remove-tooltip": "Usuń źródło wtyczek",
"title": "Wtyczki",
"translations-reloaded": "Przeładowano tłumaczenia: {name}",
"uninstall-dialog-description": "Czy na pewno chcesz odinstalować {plugin}? Spowoduje to usunięcie wszystkich danych wtyczki.",
"uninstall-dialog-title": "Odinstaluj wtyczkę",
"uninstall-error": "Błąd odinstalowywania: {error}",
@@ -1276,6 +1401,9 @@
"entry-settings-default-command-logout": "Wewnętrzne wylogowanie (brak polecenia)",
"entry-settings-default-info-description": "Jeśli nie podano własnego polecenia, zostanie użyte domyślne polecenie systemowe.",
"entry-settings-default-info-label": "Domyślne polecenie",
"entry-settings-keybind-description": "Przypisz kombinację klawiszy, aby wywołać tę akcję, gdy menu sesji jest otwarte.",
"entry-settings-keybind-placeholder": "Naciśnij Nagraj, aby przypisać klawisz...",
"entry-settings-keybind-recording": "Nagrywanie... Naciśnij dowolną kombinację klawiszy",
"entry-settings-title": "Konfiguruj {entry}",
"entry-settings-tooltip": "Konfiguruj polecenie",
"general-desc": "Konfiguruj zachowanie i wygląd panelu menu sesji.",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "Kolor krytyczny",
"custom-highlight-colors-title-label": "Własne kolory podświetlenia",
"disk-available-label": "Dostępne miejsce na dysku",
"disk-section-label": "Użycie dysku",
"enable-dgpu-monitoring-description": "Ostrzeżenie: To obudzi twoją dedykowaną kartę graficzną (NVIDIA/AMD), co może znacząco wpłynąć na żywotność baterii w laptopach z hybrydową grafiką.",
"enable-dgpu-monitoring-label": "Włącz monitorowanie dedykowanej karty graficznej",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "Wybierz układ ustawień (może wymagać ponownego otwarcia).",
"settings-panel-mode-label": "Tryb panelu ustawień",
"shadows-description": "Włącza cienie pod paskami i panelami.",
"shadows-direction-description": "Wybierz, w którą stronę rzucany jest cień.",
"shadows-direction-description": "Wybierz, gdzie rzucany jest cień.",
"shadows-direction-label": "Kierunek cienia",
"shadows-label": "Cienie",
"title": "Interfejs użytkownika",
@@ -1386,6 +1515,10 @@
"settings-monitor-specific-description": "Ustaw inny folder tapet dla każdego monitora.",
"settings-monitor-specific-label": "Katalogi per-monitor",
"settings-monitor-specific-tooltip": "Folder tapet monitora",
"settings-overview-blur-strength-description": "Stosuje siłę rozmycia do przeglądu.",
"settings-overview-blur-strength-label": "Siła rozmycia przeglądu",
"settings-overview-tint-description": "Stosuje siłę odcienia do przeglądu.",
"settings-overview-tint-label": "Siła zabarwienia przeglądu",
"settings-recursive-search-description": "Szukaj tapet również w podfolderach katalogu głównego.",
"settings-recursive-search-label": "Przeszukuj podfoldery",
"settings-select-monitor-folder": "Wybierz folder tapet monitora",
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "Gotowe!",
"appearance": {
"subheader": "Wybierz Dark Mode i źródła kolorów (Tapeta lub predefiniowane)."
"subheader": "Wybierz tryb ciemny i źródła kolorów (tapeta lub predefiniowane)."
},
"customize": {
"header": "Dostosuj swoje doświadczenie",
@@ -1449,7 +1582,7 @@
},
"skip-setup": "Pomiń konfigurację",
"telemetry-wizard-done": "Rozumiem!",
"telemetry-wizard-note": "Masz kontrolę możesz to włączyć lub wyłączyć w dowolnym momencie w Ustawieniach",
"telemetry-wizard-note": "Masz kontrolę możesz to włączyć lub wyłączyć w dowolnym momencie w ustawieniach",
"telemetry-wizard-subtitle": "Dodaliśmy anonimowe analizy, aby pomóc w ulepszaniu Noctalia",
"telemetry-wizard-title": "Aktualizacja prywatności",
"wallpaper": {
@@ -1490,7 +1623,7 @@
"disk": "Dysk",
"download-speed": "Prędkość pobierania",
"gpu-temp": "Temperatura GPU",
"load-average": "Obciąż. śr.",
"load-average": "Śr. obciążenie",
"title": "Monitor systemu",
"upload-speed": "Prędkość wysyłania"
},
@@ -1499,8 +1632,10 @@
"title": "Tryb samolotowy"
},
"battery": {
"critical": "Krytyczny poziom baterii",
"critical-desc": "Bateria naładowana w {percent}% — proszę natychmiast podłączyć ładowarkę",
"low": "Słaba bateria",
"low-desc": "Poziom baterii wynosi {percent}%. Podłącz ładowarkę"
"low-desc": "Bateria naładowana w {percent}% — proszę podłącz ładowarkę"
},
"bluetooth": {
"address-copied": "Adres skopiowany do schowka",
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "Dysk",
"fade": "Zanikanie",
"honeycomb": "Plaster miodu",
"pixelate": "Pikselizuj",
"stripes": "Paski",
"wipe": "Wycieranie"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "Ładowanie tapet...",
"no-results": "Nie znaleziono tapet. Spróbuj innego zapytania.",
"page": "{current} z {total}"
"page": "{current} z {total}",
"page-prefix": "Strona",
"page-suffix": "z {total}"
}
},
"weather": {
+192 -53
View File
@@ -48,11 +48,16 @@
"device-default": "Padrão (Dispositivo de exibição)",
"device-description": "Selecione qual dispositivo de bateria exibir.",
"device-label": "Dispositivo de bateria",
"display-mode-description": "Escolha como a bateria é exibida na barra.",
"display-mode-graphic": "Bateria gráfica",
"display-mode-graphic-clean": "Bateria gráfica (sem %)",
"display-mode-icon-always": "Ícone - Sempre mostrar %",
"display-mode-icon-hover": "Ícone - Mostrar ao passar",
"display-mode-icon-only": "Apenas ícone",
"hide-if-idle-description": "Ocultar o widget quando a bateria não estiver carregando ou descarregando.",
"hide-if-idle-label": "Ocultar quando inativo",
"hide-if-not-detected-description": "Oculte o widget quando nenhuma bateria for detectada no sistema.",
"hide-if-not-detected-label": "Ocultar se não detectado",
"low-battery-threshold-description": "Mostrar um aviso quando a bateria cair abaixo desta porcentagem.",
"low-battery-threshold-label": "Limite de aviso de bateria fraca",
"show-noctalia-performance-description": "Exibir o interruptor do modo de desempenho Noctalia no painel da bateria.<br>Desativa sombras e animações no Noctalia para reduzir o uso de recursos.",
"show-noctalia-performance-label": "Mostrar alternância de Noctalia Desempenho",
@@ -75,8 +80,6 @@
"use-custom-font-label": "Usar fonte personalizada",
"use-monospaced-font-description": "Quando ativado, o relógio usará a fonte monoespaçada.",
"use-monospaced-font-label": "Usar fonte monoespaçada",
"use-primary-color-description": "Quando ativado, aplica a cor primária para dar ênfase.",
"use-primary-color-label": "Usar cor primária",
"vertical-bar-description": "Use um espaço para separar cada parte em uma nova linha.",
"vertical-bar-label": "Barra vertical"
},
@@ -94,7 +97,6 @@
"collapse-condition-description": "Se o texto de saída corresponder a este valor, o botão será recolhido.",
"collapse-condition-label": "Condição de recolhimento",
"color-selection-description": "Aplicar cores do tema ao ícone e ao texto.",
"color-selection-label": "Selecionar cor",
"display-command-output-description": "Digite um comando para ser executado em um intervalo regular. A primeira linha da sua saída será exibida como texto.",
"display-command-output-label": "Exibir saída de comando",
"display-command-output-stream-description": "Insira um comando para executar continuamente.",
@@ -182,7 +184,9 @@
"hide-widget-when-zero-unread-description": "Ocultar o ícone de notificações quando não houver notificações não lidas.",
"hide-widget-when-zero-unread-label": "Ocultar ícone sem notificações não lidas",
"show-unread-badge-description": "Exibir um distintivo mostrando o número de notificações não lidas.",
"show-unread-badge-label": "Mostrar distintivo de não lidos"
"show-unread-badge-label": "Mostrar distintivo de não lidos",
"unread-badge-color-description": "Selecione a cor para o emblema de notificação não lida.",
"unread-badge-color-label": "Cor do distintivo de não lido"
},
"section-editor": {
"placeholder": "Selecione um widget para adicionar...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "Exibir as estatísticas como mini gráficos de barras em vez de valores de texto. Evita mudanças no layout.",
"compact-mode-label": "Modo compacto",
"cpu-frequency-description": "Exibir a velocidade de clock atual da CPU em GHz.",
"cpu-frequency-label": "Mostrar frequência da CPU",
"cpu-temperature-description": "Mostrar as leituras de temperatura da CPU se disponíveis.",
"cpu-temperature-label": "Temperatura da CPU",
"cpu-usage-description": "Exibir o percentual atual de uso da CPU.",
@@ -209,6 +215,10 @@
"memory-usage-label": "Uso de memória",
"network-traffic-description": "Exibir as velocidades de upload e download da rede.",
"network-traffic-label": "Tráfego de rede",
"storage-as-percentage-description": "Mostrar o espaço em disco como percentagem em vez de valores absolutos.",
"storage-as-percentage-label": "Disco como percentagem",
"storage-available-description": "Mostra quanto espaço em disco está disponível em vez de quanto é usado.",
"storage-available-label": "Espaço em disco disponível",
"storage-usage-description": "Mostrar as informações de uso do espaço em disco.",
"storage-usage-label": "Uso de armazenamento",
"swap-usage-description": "Mostrar o uso da memória swap.",
@@ -240,6 +250,8 @@
"title-width-reset-tooltip": "Redefinir largura do título"
},
"tray": {
"chevron-color-description": "Aplicar as cores do tema ao ícone de seta da gaveta.",
"chevron-color-label": "Cor da seta",
"colorize-icons-description": "Aplicar cores do tema aos ícones da bandeja do sistema.",
"colorize-icons-label": "Colorir ícones",
"drawer-enabled-description": "Quando habilitado, os itens da bandeja não fixados são exibidos em um painel gaveta.<br>Quando desabilitado, todos os itens da bandeja são exibidos inline.",
@@ -248,14 +260,17 @@
"hide-passive-label": "Ocultar itens passivos"
},
"volume": {
"display-mode-description": "Escolha como você gostaria que este valor aparecesse.",
"display-mode-label": "Modo de exibição"
"display-mode-description": "Escolha como você gostaria que este valor aparecesse."
},
"workspace": {
"character-count-description": "Número de caracteres a exibir dos nomes de espaços de trabalho (1-10).",
"character-count-label": "Número de caracteres",
"empty-color-description": "Definir a cor de fundo para Workspaces vazios.",
"empty-color-label": "Cor do espaço de trabalho vazio",
"enable-scrollwheel-description": "Alternar entre áreas de trabalho usando a roda do mouse.",
"enable-scrollwheel-label": "Role para alternar entre áreas de trabalho",
"focused-color-description": "Definir a cor de fundo para o Workspace focado.",
"focused-color-label": "Cor do workspace focado",
"follow-focused-screen-description": "Exibir áreas de trabalho da tela atualmente em foco, em vez da tela onde a barra está localizada.",
"follow-focused-screen-label": "Seguir tela em foco",
"grouped-border-opacity-description": "Definir o nível de opacidade para as bordas do contêiner do espaço de trabalho.",
@@ -264,8 +279,16 @@
"hide-unoccupied-label": "Ocultar desocupados",
"label-mode-description": "Escolher como os rótulos de espaço de trabalho são exibidos.",
"label-mode-label": "Modo de rótulo",
"occupied-color-description": "Definir a cor de fundo para Workspaces ocupados.",
"occupied-color-label": "Cor do espaço de trabalho ocupado",
"pill-size-description": "Ajuste o tamanho das pílulas da área de trabalho (50%-100%).",
"pill-size-label": "Tamanho da pílula",
"reverse-scrolling-description": "Inverter a direção da troca de áreas de trabalho ao rolar.",
"reverse-scrolling-label": "Rolagem invertida",
"show-applications-description": "Exibir ícones de aplicativos dentro de cada espaço de trabalho.",
"show-applications-label": "Mostrar aplicativos",
"show-badge-description": "Mostrar o selo do número da área de trabalho no modo agrupado.",
"show-badge-label": "Mostrar selo da área de trabalho",
"show-labels-only-when-occupied-description": "Mostrar rótulos de área de trabalho apenas quando contiverem janelas.",
"show-labels-only-when-occupied-label": "Mostrar rótulos apenas quando ocupado",
"unfocused-icons-opacity-description": "Definir o nível de opacidade para ícones de aplicativos não focados.",
@@ -327,13 +350,6 @@
"version-new-user": "Nova instalação"
}
},
"colors": {
"error": "Erro",
"on-surface": "Na superfície",
"primary": "Primário",
"secondary": "Secundário",
"tertiary": "Terciário"
},
"common": {
"actions": "Ações",
"add": "Adicionar",
@@ -373,10 +389,13 @@
"disconnect": "Desconectar",
"disconnected": "Desconectado(a)",
"disconnecting": "Desconectando...",
"display-mode": "Modo de exibição",
"download": "Baixar",
"duration": "Duração",
"dysfunctional": "Disfuncional",
"edit": "Editar",
"enabled": "Ativado",
"error": "Erro",
"events": "Eventos",
"execute": "Executar",
"faithful": "Fiel",
@@ -395,6 +414,7 @@
"installed": "Instalado",
"interface": "Interface",
"internet": "Internet",
"keybind": "Atalho de teclado",
"language": "Linguagem",
"loading": "Carregando...",
"local": "Local",
@@ -416,6 +436,7 @@
"not-found": "Não encontrado",
"notifications": "Notificações",
"official": "Oficial",
"on-surface": "Na Superfície",
"output": "Saída",
"pair": "Emparelhar",
"paired": "Emparelhado",
@@ -428,11 +449,14 @@
"polling": "Sondagem",
"position": "Posição",
"previous": "Anterior",
"primary": "Primário",
"random": "Aleatório",
"reboot": "Reiniciar",
"record": "Iniciar gravação",
"refresh": "Atualizar",
"required": "(obrigatório)",
"reset": "Reiniciar",
"reset-to-default": "Redefinir para o Padrão",
"result-count": "{count} resultado",
"result-count-plural": "{count} resultados",
"resume": "Retomar",
@@ -440,8 +464,12 @@
"scanning": "A digitalização está em andamento...",
"screen-corners": "Cantos da tela",
"search": "Pesquisar",
"secondary": "Secundário",
"security": "Segurança",
"select": "Selecionar",
"select-color": "Selecionar cor",
"select-color-description": "Aplicar cores do tema para enfatizar.",
"select-icon-color": "Selecionar cor do ícone",
"shortcuts": "Atalhos",
"shutdown": "Desligar",
"signal": "Sinal",
@@ -449,8 +477,10 @@
"sources": "Fontes",
"start": "Começar",
"stop": "Pare",
"supporters": "Apoiadores",
"suspend": "Suspender",
"templates": "Modelos",
"tertiary": "Terciário",
"test": "Teste",
"thresholds": "Limiares",
"title": "Título",
@@ -473,6 +503,7 @@
"week": "Semana",
"widgets": "Widgets",
"width": "Largura",
"windows": "Janelas",
"yes": "Sim"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "Ao passar"
},
"hide-modes": {
"auto-hide": "Ocultar automaticamente",
"hidden": "Ocultar quando vazio",
"idle": "Ocultar quando inativo",
"non-exclusive": "Não exclusivo",
"transparent": "Transparente quando vazio",
"visible": "Sempre visível"
},
@@ -543,7 +576,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": {
@@ -579,13 +614,26 @@
"density-compact": "Compacta",
"density-default": "Padrão",
"density-mini": "Mini",
"density-spacious": "Espaçoso(a)"
"density-spacious": "Espaçoso(a)",
"display-mode-always-visible": "Sempre Visível",
"type-floating": "Flutuante",
"type-framed": "Emoldurada",
"type-simple": "Simples"
},
"control-center": {
"quick-settings-style-classic": "Clássico",
"quick-settings-style-modern": "Moderno"
},
"frame-rates-fps": "{fps} FPS",
"launcher-density": {
"comfortable": "Confortável",
"compact": "Compacto",
"default": "Padrão"
},
"launcher-view-mode": {
"grid": "Grade",
"list": "Lista"
},
"scrolling-modes": {
"always": "Rolar sempre",
"hover": "Rolar ao passar",
@@ -616,8 +664,9 @@
},
"panels": {
"about": {
"become-supporter": "Torne-se um apoiador",
"changelog": "Ver histórico de alterações",
"contributors-desc": "Agradecimentos ao nosso <b>incrível</b> colaborador!",
"contributors-description": "Agradecimentos ao nosso <b>incrível</b> colaborador!",
"contributors-description-plural": "Agradecimentos aos nossos {count} <b>incríveis</b> colaboradores!",
"copy-info": "Copiar informações",
"info-copied": "Informação copiada para a área de transferência",
@@ -628,10 +677,14 @@
"noctalia-title": "Shell Noctalia",
"privacy-policy": "Política de privacidade",
"support": "Apoie-nos",
"supporter-badge": "Apoiador",
"supporters-desc": "Um enorme obrigado ao nosso incrível apoiador!",
"supporters-desc-plural": "Um enorme obrigado aos nossos <b>{count} incríveis</b> apoiadores!",
"supporters-loading": "Carregando apoiadores...",
"system-cpu": "CPU:",
"system-disk": "Disco:",
"system-gpu": "GPU:",
"system-host": "Anfitrião(ã):",
"system-host": "Host:",
"system-install-hint": "Instale o fastfetch para visualizar informações do sistema",
"system-kernel": "Kernel:",
"system-loading": "Carregando informações do sistema...",
@@ -672,7 +725,7 @@
"media-frame-rate-label": "Taxa de quadros",
"media-primary-player-description": "Digite uma palavra-chave para identificar seu reprodutor principal.",
"media-primary-player-label": "Reprodutor principal",
"media-primary-player-placeholder": "ex: spotify, vlc, mpv",
"media-primary-player-placeholder": "p. ex. spotify, vlc, mpv",
"media-scrolling-speed-description": "Tempo em segundos para o título rolar do início ao fim.",
"media-scrolling-speed-label": "Velocidade de rolagem",
"media-scrolling-title-description": "Ativar rolagem contínua para títulos de mídia longos.",
@@ -692,21 +745,33 @@
"volumes-output-volume-description": "Nível de volume de todo o sistema.",
"volumes-step-size-description": "Ajuste o tamanho do passo para alterações de volume (roda do mouse, atalhos de teclado).",
"volumes-step-size-label": "Tamanho do passo do volume",
"volumes-volume-feedback-description": "Reproduzir um som de feedback ao ajustar o volume",
"volumes-volume-feedback-description": "Reproduzir um som de feedback ao ajustar o volume.",
"volumes-volume-feedback-label": "Reproduzir som de feedback de volume",
"volumes-volume-overdrive-description": "Permite aumentar o volume para além dos 100%. Poderá não ser suportado por todo o hardware.",
"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-color-description": "Escolha uma cor para as cápsulas da barra, ou não use nenhuma para a cor de superfície padrão.",
"appearance-capsule-color-label": "Cor da cápsula",
"appearance-capsule-opacity-description": "Define o nível de opacidade para fundos dos widgets quando a cápsula é mostrada.",
"appearance-capsule-opacity-label": "Opacidade da cápsula",
"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-floating-description": "Exibe a barra como uma 'pílula' flutuante.",
"appearance-floating-label": "Barra flutuante",
"appearance-frame-radius": "Raio Interno",
"appearance-frame-settings-description": "Ajuste a espessura da moldura e o raio interno",
"appearance-frame-settings-label": "Configurações da Moldura",
"appearance-frame-thickness": "Espessura",
"appearance-hide-on-overview-description": "Ocultar a barra e fechar os painéis quando a visão geral do compositor estiver ativa.",
"appearance-hide-on-overview-label": "Ocultar barra na visão geral",
"appearance-margins-description": "Ajuste as margens ao redor da barra flutuante.",
@@ -721,6 +786,8 @@
"appearance-show-capsule-label": "Mostrar cápsula",
"appearance-show-outline-description": "Exibe uma borda visível ao redor de cada widget.",
"appearance-show-outline-label": "Mostrar contornos do widget",
"appearance-type-description": "Escolha o estilo da barra: Simples, Flutuante ou Emoldurada.",
"appearance-type-label": "Tipo de barra",
"appearance-use-separate-opacity-description": "Permitir usar um valor de opacidade separado para o fundo da barra.",
"appearance-use-separate-opacity-label": "Usar opacidade separada para as barras",
"monitor-configure-widgets": "Configurar widgets",
@@ -734,7 +801,7 @@
"title": "Barra",
"tray-blacklist-description": "Adicione regras de exclusão para a bandeja do sistema, suporta curingas (*).",
"tray-blacklist-label": "Lista Negra",
"tray-blacklist-placeholder": "ex: nm-applet, Fcitx*",
"tray-blacklist-placeholder": "p. ex. nm-applet, Fcitx*",
"tray-pin-application": "Fixar aplicativo",
"tray-unpin-application": "Desfixar aplicativo",
"use-global-widgets": "Usar widgets globais",
@@ -770,6 +837,7 @@
"download-title": "Baixar esquemas de cores",
"method-description": {
"content": "Esquema de Material Design com extração de cores de alta fidelidade que corresponde de perto às cores reais do conteúdo de origem.",
"dysfunctional": "Como Faithful, mas escolhe a segunda família de cores mais dominante como primária.",
"faithful": "Tenta manter-se próximo da cor de origem, enquanto gera uma paleta harmoniosa.",
"fruit-salad": "Esquema de Material Design que produz uma paleta divertida e vibrante com tons diversos e variados.",
"monochrome": "Esquema de Material Design usando uma escala de cinza de tom único com conteúdo cromático mínimo.",
@@ -866,6 +934,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",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "Pesquisar fontes monoespaçadas...",
"fonts-reset-scaling": "Redefinir escala",
"fonts-title": "Fontes",
"keybinds-description": "Configure as teclas de navegação globais para painéis e o lançador.",
"keybinds-down": "Mover para baixo",
"keybinds-enter": "Confirmar / Ação",
"keybinds-escape": "Fechar / Voltar",
"keybinds-left": "Mover para a Esquerda",
"keybinds-right": "Mover para a direita",
"keybinds-title": "Atalhos de Teclado de Navegação",
"keybinds-up": "Mover Para Cima",
"language-desc": "Escolha o seu idioma preferido para a aplicação.",
"language-select-auto-detect": "Automático",
"language-select-description": "Selecione o idioma usado na interface da aplicação.",
@@ -972,7 +1058,9 @@
"screen-corners-solid-black-description": "Use preto sólido em vez da cor de fundo da barra.",
"screen-corners-solid-black-label": "Cantos pretos sólidos",
"screen-corners-title": "Cantos da tela",
"settings-copied": "Configurações copiadas para a área de transferência"
"settings-copied": "Configurações copiadas para a área de transferência",
"tab-basics": "Básico",
"tab-keybinds": "Atalhos de Teclado"
},
"hooks": {
"info-command-info-description": "• Comandos são executados via shell (sh -lc)<br>• Comandos rodam em segundo plano (desanexados)<br>• Botões de teste executam com os valores atuais",
@@ -983,30 +1071,30 @@
"noctalia-started-placeholder": "p. ex. notify-send 'Noctalia Carregado'",
"performance-mode-disabled-description": "Comando a ser executado quando o modo de desempenho Noctalia é desabilitado.",
"performance-mode-disabled-label": "Modo de desempenho desabilitado",
"performance-mode-disabled-placeholder": "ex., notify-send \"Desempenho\" \"Modo desabilitado\"",
"performance-mode-disabled-placeholder": "p. ex. notify-send \"Desempenho\" \"Modo desabilitado\"",
"performance-mode-enabled-description": "Comando a ser executado quando o modo de desempenho Noctalia é habilitado.",
"performance-mode-enabled-label": "Modo de desempenho habilitado",
"performance-mode-enabled-placeholder": "ex., notify-send \"Desempenho\" \"Modo habilitado\"",
"performance-mode-enabled-placeholder": "p. ex. notify-send \"Desempenho\" \"Modo habilitado\"",
"screen-lock-description": "Comando a ser executado quando a tela é bloqueada.",
"screen-lock-label": "Tela bloqueada",
"screen-lock-placeholder": "ex., notify-send \"Tela\" \"Bloqueada\"",
"screen-lock-placeholder": "p. ex. notify-send \"Tela\" \"Bloqueada\"",
"screen-unlock-description": "Comando a ser executado quando a tela é desbloqueada.",
"screen-unlock-label": "Tela desbloqueada",
"screen-unlock-placeholder": "ex., notify-send \"Tela\" \"Desbloqueada\"",
"screen-unlock-placeholder": "p. ex. notify-send \"Tela\" \"Desbloqueada\"",
"session-description": "Comando a ser executado antes do desligamento ou reinicialização. Recebe o tipo de ação como $1 (desligamento/reinicialização).",
"session-label": "Fim da sessão",
"session-placeholder": "p. ex., notify-send \"Session\" \"$1\"",
"session-placeholder": "p. ex. notify-send \"Session\" \"$1\"",
"system-hooks-desc": "Configure comandos para serem executados quando eventos do sistema ocorrerem.",
"system-hooks-enable-description": "Ativa ou desativa todos os comandos de hook.",
"system-hooks-enable-label": "Ativar hooks",
"system-hooks-title": "Ganchos do sistema",
"theme-changed-description": "Comando a ser executado quando o tema alterna entre modo escuro e claro.",
"theme-changed-label": "Tema alterado",
"theme-changed-placeholder": "ex., notify-send \"Tema\" \"Alternado\"",
"theme-changed-placeholder": "p. ex. notify-send \"Tema\" \"Alternado\"",
"title": "Hooks",
"wallpaper-changed-description": "Comando a ser executado quando o papel de parede muda.",
"wallpaper-changed-label": "Papel de parede alterado",
"wallpaper-changed-placeholder": "ex., notify-send \"Papel de parede\" \"Alterado\""
"wallpaper-changed-placeholder": "p. ex. notify-send \"Papel de parede\" \"Alterado\""
},
"indicator": {
"default-value": "Padrão: {value}",
@@ -1018,7 +1106,7 @@
"execute-title": "Execução",
"settings-annotation-tool-description": "Comando para executar ao clicar no botão de anotação no histórico da área de transferência. A imagem será enviada para este comando.",
"settings-annotation-tool-label": "Ferramenta de anotação",
"settings-annotation-tool-placeholder": "p.ex. 'gradia', 'satty -f -'",
"settings-annotation-tool-placeholder": "p. ex. 'gradia', 'satty -f -'",
"settings-auto-paste-description": "Colar automaticamente o item selecionado da área de transferência. Requer wtype.",
"settings-auto-paste-label": "Colar automaticamente",
"settings-clip-preview-description": "Mostra uma pré-visualização do conteúdo da área de transferência ao usar o comando >clip.",
@@ -1027,18 +1115,28 @@
"settings-clip-wrap-text-label": "Quebrar texto da área de transferência",
"settings-clipboard-history-description": "Acesse itens copiados anteriormente a partir do lançador.",
"settings-clipboard-history-label": "Ativar histórico da área de transferência",
"settings-custom-launch-prefix-description": "Prefixar comandos com um inicializador personalizado (ex. 'runapp' para integração systemd).",
"settings-clipboard-watch-image-description": "Cadeia de comando completa passada para wl-paste para alterações de imagem (requer reinício).",
"settings-clipboard-watch-image-label": "Comando de Vigilância de Imagens",
"settings-clipboard-watch-text-description": "Cadeia de comando completa passada para wl-paste para alterações de texto (requer reinício).",
"settings-clipboard-watch-text-label": "Comando de observação de texto",
"settings-custom-launch-prefix-description": "Prefixar comandos com um inicializador personalizado (p. ex. 'runapp' para integração systemd).",
"settings-custom-launch-prefix-enabled-description": "Usar um prefixo personalizado para inicializar aplicativos em vez do método padrão.",
"settings-custom-launch-prefix-enabled-label": "Habilitar prefixo de inicialização personalizado",
"settings-custom-launch-prefix-label": "Prefixo de inicialização personalizado",
"settings-density-description": "Ajuste o tamanho dos ícones de aplicativos e a densidade do Launcher.",
"settings-density-label": "Densidade",
"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",
"settings-ignore-mouse-input-description": "Desativar a interação do mouse e a roda de rolagem no iniciador.",
"settings-ignore-mouse-input-label": "Ignorar entrada do mouse",
"settings-overlay-layer-description": "Exibe o lançador na camada de sobreposição, acima de janelas em tela cheia. Quando ativado, o lançador não será anexado à barra.",
"settings-overlay-layer-label": "Mostrar acima da tela cheia",
"settings-position-description": "Escolha onde o painel do lançador aparece.",
"settings-show-categories-description": "Mostrar abas de categorias para filtrar aplicativos.",
"settings-show-categories-label": "Mostrar categorias",
@@ -1046,10 +1144,12 @@
"settings-show-icon-background-label": "Mostrar fundo do ícone",
"settings-sort-by-usage-description": "Quando ativado, os aplicativos mais usados aparecem primeiro na lista.",
"settings-sort-by-usage-label": "Ordenar por mais usados",
"settings-terminal-command-description": "Comando para iniciar um terminal. Ex: 'kitty -e' ou 'gnome-terminal --'.",
"settings-terminal-command-description": "Comando para iniciar um terminal. P. ex. 'kitty -e' ou 'gnome-terminal --'.",
"settings-terminal-command-label": "Comando do terminal",
"settings-use-app2unit-description": "Usa um método de inicialização alternativo para gerenciar melhor os processos de aplicativos e evitar problemas.",
"settings-use-app2unit-label": "Usar App2Unit para iniciar aplicativos",
"settings-view-mode-description": "Escolha o layout para as entradas do Lançador.",
"settings-view-mode-label": "Modo de visualização",
"title": "Lançador"
},
"location": {
@@ -1066,12 +1166,12 @@
"date-time-show-events-description": "Exibir eventos no painel do calendário.",
"date-time-show-events-label": "Mostrar eventos do calendário",
"date-time-title": "Data e hora",
"date-time-use-analog-description": "Mostrar um relógio estilo analógico na janela do calendário e na tela de bloqueio.",
"date-time-use-analog-description": "Mostrar um relógio de estilo analógico na janela do calendário.",
"date-time-use-analog-label": "Use um relógio de estilo analógico",
"date-time-week-numbers-description": "Exibe a semana do ano (ex., Semana 38) no calendário.",
"date-time-week-numbers-description": "Exibe a semana do ano (p. ex. Semana 38) no calendário.",
"date-time-week-numbers-label": "Mostrar números da semana",
"location-desc": "Obtenha previsão do tempo e agendamento de luz noturna precisos definindo sua localização.",
"location-search-description": "ex., São Paulo, SP",
"location-search-description": "p. ex. São Paulo, SP",
"location-search-label": "Procurar por uma localização",
"location-search-placeholder": "Digite o nome da localização",
"location-title": "Sua localização",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "Exibir clima no calendário"
},
"lock-screen": {
"allow-password-with-fprintd-description": "Quando o fprintd (autenticação por impressão digital) está ativo, esta opção permite-lhe iniciar sessão com a sua palavra-passe em vez de uma impressão digital.",
"allow-password-with-fprintd-label": "Permitir login por senha com fprintd",
"auto-start-auth-description": "Inicia automaticamente a autenticação de impressão digital sem exigir uma pressão de tecla ou um clique de botão.",
"auto-start-auth-label": "Autenticação de início automático",
"clock-format-description": "Personalize o formato do relógio usando tokens de sintaxe de data/hora.",
"clock-format-label": "Formato do relógio",
"clock-style-analog": "Analógico",
"clock-style-custom": "Personalizado",
"clock-style-description": "Escolha o estilo visual do relógio na Tela de Bloqueio.",
"clock-style-digital": "Digital",
"clock-style-label": "Estilo do Relógio",
"compact-lockscreen-description": "Mostrar apenas a entrada de login e os controles do sistema, ocultando os widgets de clima e mídia.",
"compact-lockscreen-label": "Tela de bloqueio compacta",
"lock-on-suspend-description": "Bloquear a tela automaticamente ao suspender o sistema.",
"lock-on-suspend-label": "Bloquear ao suspender",
"lock-screen-animations-description": "Ativar ou desativar as animações do ecrã de bloqueio.",
"lock-screen-animations-label": "Animações da Tela de Bloqueio",
"lock-screen-blur-strength-description": "Aplica um efeito de desfoque ao papel de parede da tela de bloqueio.",
"lock-screen-blur-strength-label": "Intensidade do desfoque da tela de bloqueio",
"lock-screen-tint-strength-description": "Aplica uma sobreposição de tonalidade ao papel de parede da tela de bloqueio.",
"lock-screen-tint-strength-label": "Intensidade do matiz da tela de bloqueio",
"monitors-desc": "Mostrar tela de bloqueio em monitores específicos. O padrão é em todos, se nenhum for escolhido.",
"show-hibernate-description": "Mostrar a opção 'hibernar' nos controles de energia.",
"show-hibernate-label": "Mostrar hibernar",
"show-session-buttons-description": "Permitir acesso às configurações de energia a partir da tela de bloqueio.",
@@ -1126,8 +1244,6 @@
"history-low-urgency-label": "Salvar urgência baixa no histórico",
"history-normal-urgency-description": "Salvar notificações de prioridade normal no histórico.",
"history-normal-urgency-label": "Salvar urgência normal no histórico",
"media-toast-description": "Mostrar um toast quando o estado de reprodução de mídia mudar.",
"media-toast-label": "Multimédia",
"monitors-desc": "Mostra a notificação em monitores específicos. O padrão é todos, se nenhum for escolhido.",
"settings-always-on-top-description": "Exibe notificações acima de janelas em tela cheia e outras camadas.",
"settings-background-opacity-description": "Ajustar a opacidade dos fundos das notificações.",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "Sons de notificação indisponíveis",
"sounds-volume-description": "Ajustar o nível de volume para sons de notificação.",
"sounds-volume-label": "Volume do som",
"toast-battery-description": "Mostrar um aviso quando o nível da bateria cair abaixo desta percentagem.",
"toast-battery-label": "Aviso de bateria",
"toast-desc": "Configurar a aparência e o comportamento do toast.",
"toast-keyboard-description": "Mostrar uma notificação quando o layout do teclado mudar.",
"toast-keyboard-label": "Layout do teclado"
"toast-keyboard-label": "Layout do teclado",
"toast-media-description": "Mostrar um toast quando o estado de reprodução de mídia mudar.",
"toast-media-label": "Multimédia"
},
"osd": {
"always-on-top-description": "Exibir OSD acima de janelas em tela cheia e outras camadas.",
@@ -1202,16 +1322,20 @@
"types-volume-label": "Volume de saída"
},
"plugins": {
"auto-update": "Atualizar plugins automaticamente",
"auto-update-description": "Atualizar automaticamente todos os plugins quando a shell iniciar.",
"available-description": "Navegue e instale plugins a partir de fontes configuradas.",
"available-label": "Plugins disponíveis",
"available-no-plugins-description": "Verifique as fontes do seu plugin ou atualize a lista.",
"available-no-plugins-label": "Nenhum plugin disponível",
"check-for-updates": "Verificar atualizações",
"checking-for-updates": "Verificando atualizações...",
"collision-already-installed": "Este plugin já está instalado",
"collision-custom-version-exists": "Uma versão personalizada de \"{source}\" já está instalada",
"collision-official-version-exists": "A versão oficial deste plugin já está instalada",
"filter-downloaded": "Baixado",
"filter-not-downloaded": "Não baixado",
"filter-tags-description": "Filtrar plugins por categoria ou estado de download",
"filter-tags-description": "Filtrar plugins por categoria ou estado de download.",
"filter-tags-label": "Etiquetas",
"hot-reload-description": "Recarrega automaticamente os plugins quando seus arquivos são alterados. Útil para o desenvolvimento de plugins.",
"hot-reload-label": "Recarga a quente (modo de desenvolvimento)",
@@ -1245,6 +1369,7 @@
"sources-placeholder": "Meu repositório legal",
"sources-remove-tooltip": "Remover código fonte do plugin",
"title": "Plugins",
"translations-reloaded": "Traduções recarregadas: {name}",
"uninstall-dialog-description": "Tem certeza de que deseja desinstalar {plugin}? Isso removerá todos os dados do plugin.",
"uninstall-dialog-title": "Desinstalar plugin",
"uninstall-error": "Falha ao desinstalar: {error}",
@@ -1271,11 +1396,14 @@
"entries-desc": "Personalizar quais ações de energia aparecem no menu de sessão e em que ordem.",
"entries-title": "Ações de energia",
"entry-settings-command-description": "Comando personalizado para executar para esta ação. Deixe vazio para usar o comando padrão do sistema.",
"entry-settings-command-placeholder": "systemctl poweroff",
"entry-settings-command-placeholder": "p. ex. systemctl poweroff",
"entry-settings-default-command-lock": "Tela de bloqueio interna (sem comando)",
"entry-settings-default-command-logout": "Logout interno (sem comando)",
"entry-settings-default-info-description": "Se nenhum comando personalizado for especificado, o comando padrão do sistema será usado.",
"entry-settings-default-info-label": "Comando padrão",
"entry-settings-keybind-description": "Atribua uma combinação de teclas para acionar esta ação quando o menu de sessão estiver aberto.",
"entry-settings-keybind-placeholder": "Pressione Gravar para atribuir uma tecla...",
"entry-settings-keybind-recording": "Gravando... Pressione qualquer combinação de teclas",
"entry-settings-title": "Configurar {entry}",
"entry-settings-tooltip": "Configurar comando",
"general-desc": "Configurar o comportamento e a aparência do painel do menu de sessão.",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "Cor crítica",
"custom-highlight-colors-title-label": "Cores de destaque personalizadas",
"disk-available-label": "Espaço em disco disponível",
"disk-section-label": "Uso do disco",
"enable-dgpu-monitoring-description": "Atenção: Isto irá ativar sua GPU dedicada (NVIDIA/AMD), o que pode impactar significativamente a duração da bateria em laptops com gráficos híbridos.",
"enable-dgpu-monitoring-label": "Ativar o monitoramento da GPU dedicada",
@@ -1323,7 +1452,7 @@
"box-border-description": "Exibe um contorno ao redor das áreas de conteúdo.",
"box-border-label": "Contorno do recipiente",
"box-border-radius-description": "Ajusta o arredondamento dos cantos das principais seções do layout, como barras laterais, cards e painéis de conteúdo.",
"box-border-radius-label": "Raio do Contêiner",
"box-border-radius-label": "Raio do contêiner",
"box-border-radius-reset": "Redefinir raio do recipiente",
"control-border-radius-description": "Controla a curvatura de elementos interativos, incluindo botões, alternâncias e campos de texto.",
"control-border-radius-label": "Raio de entrada",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "Escolha o layout das configurações (pode ser necessário reabrir).",
"settings-panel-mode-label": "Modo do painel de configurações",
"shadows-description": "Ativa sombras projetadas sob barras e painéis.",
"shadows-direction-description": "Escolha de onde a sombra é projetada.",
"shadows-direction-description": "Escolha onde a sombra é projetada.",
"shadows-direction-label": "Direção da sombra",
"shadows-label": "Sombras projetadas",
"title": "Interface do usuário",
@@ -1357,7 +1486,7 @@
"automation-change-mode-alphabetical": "Alfabético",
"automation-change-mode-description": "Escolha como os papéis de parede são selecionados ao alterar automaticamente.",
"automation-change-mode-label": "Modo de alteração",
"automation-custom-interval-description": "Digite o tempo como HH:MM (ex., 01:30).",
"automation-custom-interval-description": "Digite o tempo como HH:MM (p. ex. 01:30).",
"automation-custom-interval-label": "Intervalo personalizado",
"automation-interval-description": "Com que frequência alterar os papéis de parede automaticamente.",
"automation-interval-label": "Intervalo do papel de parede",
@@ -1386,6 +1515,10 @@
"settings-monitor-specific-description": "Defina uma pasta de papel de parede diferente para cada monitor.",
"settings-monitor-specific-label": "Diretórios específicos por monitor",
"settings-monitor-specific-tooltip": "Pasta de papéis de parede do monitor",
"settings-overview-blur-strength-description": "Aplica a intensidade do desfoque à Visão Geral.",
"settings-overview-blur-strength-label": "Intensidade do desfoque da visão geral",
"settings-overview-tint-description": "Aplica a intensidade da tonalidade à visão geral.",
"settings-overview-tint-label": "Intensidade da tonalidade da visão geral",
"settings-recursive-search-description": "Também buscar papéis de parede em subpastas do diretório de papéis de parede.",
"settings-recursive-search-label": "Buscar em subpastas",
"settings-select-monitor-folder": "Selecionar pasta de papéis de parede do monitor",
@@ -1407,11 +1540,11 @@
"enter-command": "Digite o comando para executar (app ou script personalizado)",
"enter-ipc-identifier": "Introduza um identificador exclusivo para comandos IPC",
"enter-path": "Digite o caminho...",
"enter-text-to-collapse": "por exemplo, 'nada está sendo reproduzido'. Use /regex/ para padrões.",
"enter-text-to-collapse": "p. ex. 'nada está sendo reproduzido'. Use /regex/ para padrões.",
"enter-tooltip": "Inserir dica de ferramenta",
"enter-width-pixels": "Digite a largura em pixels",
"search": "Pesquisar...",
"search-icons": "ex., noctalia, niri, battery, cloud",
"search-icons": "p. ex. noctalia, niri, battery, cloud",
"search-launcher": "Pesquisar entradas... ou use > para comandos",
"search-wallhaven": "Pesquisar no Wallhaven...",
"search-wallpapers": "Digite para filtrar papéis de parede..."
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "Concluído!",
"appearance": {
"subheader": "Escolha o Dark Mode e as fontes de cor (Wallpaper ou predefinidas)."
"subheader": "Escolha o modo escuro e as fontes de cor (papel de parede ou predefinidas)."
},
"customize": {
"header": "Personalizar a sua experiência",
@@ -1449,7 +1582,7 @@
},
"skip-setup": "Ignorar configuração",
"telemetry-wizard-done": "Entendi!",
"telemetry-wizard-note": "Você está no controle — ative ou desative isso a qualquer momento nas Configurações",
"telemetry-wizard-note": "Você está no controle — ative ou desative isso a qualquer momento nas configurações",
"telemetry-wizard-subtitle": "Adicionámos análises anónimas para ajudar a melhorar o Noctalia",
"telemetry-wizard-title": "Atualização de privacidade",
"wallpaper": {
@@ -1466,7 +1599,7 @@
"select-prompt": "Selecione um papel de parede abaixo",
"subheader": "Defina o ambiente com um belo fundo."
},
"welcome-note": "Apenas alguns ajustes básicos para começar - o restante está em configurações",
"welcome-note": "Apenas alguns ajustes básicos para começar o restante está em configurações",
"welcome-subtitle": "Vamos tornar o seu ambiente de trabalho único",
"welcome-title": "Bem-vindo ao Noctalia!"
},
@@ -1490,7 +1623,7 @@
"disk": "Disco",
"download-speed": "Velocidade de download",
"gpu-temp": "Temperatura da GPU",
"load-average": "Carga méd.",
"load-average": "Carga média",
"title": "Monitor do sistema",
"upload-speed": "Velocidade de upload"
},
@@ -1499,8 +1632,10 @@
"title": "Modo avião"
},
"battery": {
"critical": "Bateria crítica",
"critical-desc": "Bateria a {percent}% — por favor, conecte o carregador imediatamente",
"low": "Bateria fraca",
"low-desc": "A bateria está em {percent}%. Por favor, conecte o carregador"
"low-desc": "Bateria está em {percent}% — por favor, conecte o carregador"
},
"bluetooth": {
"address-copied": "Endereço copiado para a área de transferência",
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "Disco",
"fade": "Esmaecer",
"honeycomb": "Favo de mel",
"pixelate": "Pixelizar",
"stripes": "Listras",
"wipe": "Limpar"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "Carregando papéis de parede...",
"no-results": "Nenhum papel de parede encontrado. Tente uma busca diferente.",
"page": "{current} de {total}"
"page": "{current} de {total}",
"page-prefix": "Página",
"page-suffix": "de {total}"
}
},
"weather": {
@@ -1726,8 +1865,8 @@
"day-full": "Nome completo do dia",
"day-leading-zero": "Dia com zero à esquerda (01-31)",
"day-no-leading-zero": "Dia sem zero à esquerda (1-31)",
"hour-leading-zero": "Hora com zero à esquerda (00-23) - formato de 24 horas",
"hour-no-leading-zero": "Hora sem zero à esquerda (0-23) - formato de 24 horas",
"hour-leading-zero": "Hora com zero à esquerda (00-23) formato de 24 horas",
"hour-no-leading-zero": "Hora sem zero à esquerda (0-23) formato de 24 horas",
"minute-leading-zero": "Minuto com zero à esquerda (00-59)",
"minute-no-leading-zero": "Minuto sem zero à esquerda (0-59)",
"month-abbreviated": "Nome do mês abreviado",
+207 -68
View File
@@ -48,11 +48,16 @@
"device-default": "Устройство отображения по умолчанию",
"device-description": "Выберите устройство для отображения состояния батареи.",
"device-label": "Устройство с батареей",
"display-mode-description": "Выберите, как отображается батарея на панели.",
"display-mode-graphic": "Графическая батарея",
"display-mode-graphic-clean": "Графическая батарея (без %)",
"display-mode-icon-always": "Значок - Всегда показывать %",
"display-mode-icon-hover": "Иконка - Показать при наведении",
"display-mode-icon-only": "Только значок",
"hide-if-idle-description": "Скрыть виджет, когда батарея не заряжается и не разряжается.",
"hide-if-idle-label": "Скрывать в режиме простоя",
"hide-if-not-detected-description": "Скрыть виджет, если в системе не обнаружена батарея.",
"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",
@@ -75,8 +80,6 @@
"use-custom-font-label": "Использовать пользовательский шрифт",
"use-monospaced-font-description": "Если включено, часы будут использовать моноширинный шрифт.",
"use-monospaced-font-label": "Использовать моноширинный шрифт",
"use-primary-color-description": "Если включено, будет использован основной цвет для отображения часов.",
"use-primary-color-label": "Использовать основной цвет",
"vertical-bar-description": "Используйте пробел, чтобы разделить каждую часть на новую строку.",
"vertical-bar-label": "Вертикальная панель"
},
@@ -94,7 +97,6 @@
"collapse-condition-description": "Если выходной текст соответствует этому значению, кнопка будет скрыта.",
"collapse-condition-label": "Условие скрытия",
"color-selection-description": "Применить цвета темы к значку и тексту.",
"color-selection-label": "Выбрать цвет",
"display-command-output-description": "Введите команду для регулярного выполнения. Первая строка её вывода будет отображаться как текст.",
"display-command-output-label": "Вывод команды",
"display-command-output-stream-description": "Введите команду для непрерывного выполнения.",
@@ -182,7 +184,9 @@
"hide-widget-when-zero-unread-description": "Скрывать значок уведомлений, если нет непрочитанных.",
"hide-widget-when-zero-unread-label": "Скрывать значок без непрочитанных",
"show-unread-badge-description": "Отображать значок, показывающий количество непрочитанных уведомлений.",
"show-unread-badge-label": "Показывать значок непрочитанных"
"show-unread-badge-label": "Показывать значок непрочитанных",
"unread-badge-color-description": "Выберите цвет для значка непрочитанных уведомлений.",
"unread-badge-color-label": "Цвет значка непрочитанных"
},
"section-editor": {
"placeholder": "Выберите виджет для добавления...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "Отображать статистику в виде мини-диаграмм вместо текстовых значений. Предотвращает сдвиг макета.",
"compact-mode-label": "Компактный режим",
"cpu-frequency-description": "Отобразить текущую тактовую частоту CPU в ГГц.",
"cpu-frequency-label": "Показать частоту CPU",
"cpu-temperature-description": "Показывать показания температуры процессора, если доступны.",
"cpu-temperature-label": "Температура CPU",
"cpu-usage-description": "Отображать текущий процент использования CPU.",
@@ -209,6 +215,10 @@
"memory-usage-label": "Использование памяти",
"network-traffic-description": "Отображать скорости загрузки и скачивания по сети.",
"network-traffic-label": "Сетевой трафик",
"storage-as-percentage-description": "Показывать место на диске в процентах вместо абсолютных значений.",
"storage-as-percentage-label": "Диск в процентах",
"storage-available-description": "Показывает, сколько места на диске доступно, вместо того, сколько используется.",
"storage-available-label": "Доступное место на диске",
"storage-usage-description": "Показывать информацию об использовании дискового пространства.",
"storage-usage-label": "Использование хранилища",
"swap-usage-description": "Показать использование swap-памяти.",
@@ -240,6 +250,8 @@
"title-width-reset-tooltip": "Сбросить ширину заголовка"
},
"tray": {
"chevron-color-description": "Применить цвета темы к иконке шеврона выдвижной панели.",
"chevron-color-label": "Цвет стрелки",
"colorize-icons-description": "Применить цвета темы к иконкам трея.",
"colorize-icons-label": "Раскрасить иконки",
"drawer-enabled-description": "Если включено, незакрепленные элементы трея отображаются во всплывающей панели.<br>Если отключено, все элементы трея отображаются в строку.",
@@ -248,14 +260,17 @@
"hide-passive-label": "Скрыть пассивные предметы"
},
"volume": {
"display-mode-description": "Выберите, как это значение должно отображаться.",
"display-mode-label": "Режим отображения"
"display-mode-description": "Выберите, как это значение должно отображаться."
},
"workspace": {
"character-count-description": "Количество символов для отображения из имён рабочих пространств (1-10).",
"character-count-label": "Количество символов",
"empty-color-description": "Установить цвет фона для пустых рабочих пространств.",
"empty-color-label": "Цвет пустого рабочего пространства",
"enable-scrollwheel-description": "Переключайтесь между рабочими пространствами с помощью колеса прокрутки мыши.",
"enable-scrollwheel-label": "Прокрутите, чтобы переключить рабочие столы",
"enable-scrollwheel-label": "Прокрутите, чтобы переключить рабочие пространства",
"focused-color-description": "Установить цвет фона для активного рабочего пространства.",
"focused-color-label": "Цвет активного рабочего пространства",
"follow-focused-screen-description": "Отображать рабочие пространства с текущего активного экрана, а не с экрана, на котором расположена панель.",
"follow-focused-screen-label": "Следовать за активным экраном",
"grouped-border-opacity-description": "Установить уровень прозрачности для границ контейнера рабочей области.",
@@ -264,8 +279,16 @@
"hide-unoccupied-label": "Скрыть незанятые",
"label-mode-description": "Выберите, как отображаются метки рабочих пространств.",
"label-mode-label": "Режим метки",
"occupied-color-description": "Установить цвет фона для занятых рабочих пространств.",
"occupied-color-label": "Цвет занятого рабочего пространства",
"pill-size-description": "Отрегулируйте размер индикаторов рабочих пространств (50%-100%).",
"pill-size-label": "Размер капсулы",
"reverse-scrolling-description": "Изменить направление переключения рабочих пространств при прокрутке.",
"reverse-scrolling-label": "Обратная прокрутка",
"show-applications-description": "Отображать значки приложений внутри каждого рабочего пространства.",
"show-applications-label": "Показать приложения",
"show-badge-description": "Показывать значок номера рабочего пространства в сгруппированном режиме.",
"show-badge-label": "Показывать значок рабочего стола",
"show-labels-only-when-occupied-description": "Показывать метки рабочих пространств только тогда, когда они содержат окна.",
"show-labels-only-when-occupied-label": "Показывать метки только при наличии содержимого",
"unfocused-icons-opacity-description": "Установить уровень прозрачности для неактивных значков приложений.",
@@ -327,13 +350,6 @@
"version-new-user": "Новая установка"
}
},
"colors": {
"error": "Ошибка",
"on-surface": "На поверхности",
"primary": "Первичный",
"secondary": "Вторичный",
"tertiary": "Третичный"
},
"common": {
"actions": "Действия",
"add": "Добавить",
@@ -373,10 +389,13 @@
"disconnect": "Отключить",
"disconnected": "Отключено",
"disconnecting": "Отключение...",
"display-mode": "Режим oтображения",
"download": "Скачать",
"duration": "Продолжительность",
"dysfunctional": "Дисфункциональный",
"edit": "Редактировать",
"enabled": "Включено",
"error": "Ошибка",
"events": "События",
"execute": "Выполнить",
"faithful": "Верный",
@@ -395,6 +414,7 @@
"installed": "Установлено",
"interface": "Интерфейс",
"internet": "Интернет",
"keybind": "Привязка клавиш",
"language": "Язык",
"loading": "Загрузка...",
"local": "Местный",
@@ -402,7 +422,7 @@
"lock": "Заблокировать",
"logout": "Выйти",
"look": "Внешний вид",
"media": "СМИ",
"media": "Плеер",
"media-player": "Медиаплеер",
"memory": "Память",
"monitors": "Мониторы",
@@ -416,6 +436,7 @@
"not-found": "Не найдено",
"notifications": "Уведомления",
"official": "Официальный",
"on-surface": "На поверхности",
"output": "Вывод",
"pair": "Спарить",
"paired": "Спарено",
@@ -428,11 +449,14 @@
"polling": "Опрашивание",
"position": "Позиция",
"previous": "Предыдущий",
"primary": "Основной",
"random": "Случайный",
"reboot": "Перезагрузить",
"record": "Начать запись",
"refresh": "Обновить",
"required": "(обязательно)",
"reset": "Сброс",
"reset-to-default": "Сбросить по Умолчанию",
"result-count": "{count} результат",
"result-count-plural": "{count} результаты",
"resume": "Продолжить",
@@ -440,8 +464,12 @@
"scanning": "Сканирование...",
"screen-corners": "Углы экрана",
"search": "Поиск",
"secondary": "Вторичный",
"security": "Безопасность",
"select": "Выбрать",
"select-color": "Выбрать цвет",
"select-color-description": "Применить цвета темы для выделения.",
"select-icon-color": "Выбрать цвет значка",
"shortcuts": "Ярлыки",
"shutdown": "Выключить",
"signal": "Сигнал",
@@ -449,8 +477,10 @@
"sources": "Источники",
"start": "Начать",
"stop": "Стоп",
"supporters": "Поддерживающие",
"suspend": "Приостановить",
"templates": "Шаблоны",
"tertiary": "Третичный",
"test": "Тест",
"thresholds": "Пороги",
"title": "Название",
@@ -473,6 +503,7 @@
"week": "Неделя",
"widgets": "Виджеты",
"width": "Ширина",
"windows": "Окна ",
"yes": "Да"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "При наведении"
},
"hide-modes": {
"auto-hide": "Автоматическое скрытие",
"hidden": "Скрывать, когда пусто",
"idle": "Скрывать в режиме простоя",
"non-exclusive": "Неисключительный",
"transparent": "Прозрачный, когда пустой",
"visible": "Всегда виден"
},
@@ -543,7 +576,9 @@
"emoji-loading": "Загрузка эмодзи...",
"emoji-loading-description": "Пожалуйста, подождите",
"emoji-no-recent": "Недавних эмодзи пока нет",
"emoji-search-description": "Поиск и копирование эмодзи"
"emoji-search-description": "Поиск и копирование эмодзи",
"settings-search-description": "Поиск и переход к настройкам",
"windows-search-description": "Поиск и фокусировка открытых окон"
}
},
"lock-screen": {
@@ -579,13 +614,26 @@
"density-compact": "Компактная",
"density-default": "По умолчанию",
"density-mini": "Мини",
"density-spacious": "Просторный"
"density-spacious": "Просторный",
"display-mode-always-visible": "Всегда видны",
"type-floating": "Плавающий",
"type-framed": "В рамке",
"type-simple": "Простой"
},
"control-center": {
"quick-settings-style-classic": "Классический",
"quick-settings-style-modern": "Современный"
},
"frame-rates-fps": "{fps} FPS",
"launcher-density": {
"comfortable": "Комфортный",
"compact": "Компактный",
"default": "По умолчанию"
},
"launcher-view-mode": {
"grid": "Сетка",
"list": "Список"
},
"scrolling-modes": {
"always": "Всегда прокручивать",
"hover": "Прокручивать при наведении",
@@ -616,8 +664,9 @@
},
"panels": {
"about": {
"become-supporter": "Стать спонсором",
"changelog": "Посмотреть список изменений",
"contributors-desc": "Благодарим нашего <b>замечательного</b> участника: {count}!",
"contributors-description": "Благодарим нашего <b>замечательного</b> участника: {count}!",
"contributors-description-plural": "Благодарим наших <b>замечательных</b> участников: {count}!",
"copy-info": "Копировать информацию",
"info-copied": "Информация скопирована в буфер обмена",
@@ -628,15 +677,19 @@
"noctalia-title": "Оболочка Noctalia",
"privacy-policy": "Политика конфиденциальности",
"support": "Поддержать нас",
"supporter-badge": "Сторонник",
"supporters-desc": "Огромное спасибо нашему замечательному стороннику!",
"supporters-desc-plural": "Огромное спасибо нашим <b>{count} замечательным</b> сторонникам!",
"supporters-loading": "Загрузка спонсоров...",
"system-cpu": "ЦП:",
"system-disk": "Диск:",
"system-gpu": "Графический процессор",
"system-host": "Ведущий:",
"system-host": "хост:",
"system-install-hint": "Установите fastfetch для просмотра информации о системе",
"system-kernel": "Ядро:",
"system-loading": "Загрузка системной информации...",
"system-memory": "Память:",
"system-monitor": "Монитор",
"system-monitor": "Монитор:",
"system-not-installed": "fastfetch не установлен",
"system-os": "ОС:",
"system-packages": "Пакеты:",
@@ -672,7 +725,7 @@
"media-frame-rate-label": "Частота кадров",
"media-primary-player-description": "Введите ключевое слово для идентификации вашего основного плеера.",
"media-primary-player-label": "Основной плеер",
"media-primary-player-placeholder": "например, spotify, vlc, mpv",
"media-primary-player-placeholder": "напр. spotify, vlc, mpv",
"media-scrolling-speed-description": "Время в секундах, за которое заголовок прокручивается от начала до конца.",
"media-scrolling-speed-label": "Скорость прокрутки",
"media-scrolling-title-description": "Включить непрерывную прокрутку для длинных названий медиа.",
@@ -692,21 +745,33 @@
"volumes-output-volume-description": "Общесистемный уровень громкости.",
"volumes-step-size-description": "Настройка шага изменения громкости (колесо прокрутки, сочетания клавиш).",
"volumes-step-size-label": "Шаг изменения громкости",
"volumes-volume-feedback-description": "Воспроизводить звук при регулировке громкости",
"volumes-volume-feedback-description": "Воспроизводить звук при регулировке громкости.",
"volumes-volume-feedback-label": "Воспроизвести звук обратной связи громкости",
"volumes-volume-overdrive-description": "Разрешить повышение громкости выше 100%. Может не поддерживаться всем оборудованием.",
"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-color-description": "Выберите цвет для капсул панели или не используйте никакой для цвета поверхности по умолчанию.",
"appearance-capsule-color-label": "Цвет капсулы",
"appearance-capsule-opacity-description": "Установить уровень непрозрачности для фона виджетов, когда капсула отображается.",
"appearance-capsule-opacity-label": "Непрозрачность капсулы",
"appearance-density-description": "Настройка отступов панели для компактного или просторного вида.",
"appearance-density-label": "Плотность панели",
"appearance-desc": "Настройка внешнего вида и положения панели.",
"appearance-display-mode-description": "Выберите, когда панель видна.",
"appearance-floating-description": "Отображает панель как плавающую 'таблетку'.",
"appearance-floating-label": "Плавающая панель",
"appearance-frame-radius": "Внутренний радиус",
"appearance-frame-settings-description": "Настройте толщину рамки и внутренний радиус углов",
"appearance-frame-settings-label": "Настройки рамки",
"appearance-frame-thickness": "Толщина",
"appearance-hide-on-overview-description": "Скрыть панель и закрыть панели, когда активен обзор компоновщика.",
"appearance-hide-on-overview-label": "Скрыть панель в обзоре",
"appearance-margins-description": "Настройка отступов вокруг плавающей панели.",
@@ -721,6 +786,8 @@
"appearance-show-capsule-label": "Показывать капсулу",
"appearance-show-outline-description": "Отображает видимую границу вокруг каждого виджета.",
"appearance-show-outline-label": "Показать контуры виджетов",
"appearance-type-description": "Выберите стиль панели: Простой, Плавающий или В рамке.",
"appearance-type-label": "Тип панели",
"appearance-use-separate-opacity-description": "Включить использование отдельного значения прозрачности для фона полосы.",
"appearance-use-separate-opacity-label": "Использовать раздельную прозрачность столбцов",
"monitor-configure-widgets": "Настроить виджеты",
@@ -734,7 +801,7 @@
"title": "Панель",
"tray-blacklist-description": "Добавьте правила исключения трея, поддерживает подстановочные знаки (*).",
"tray-blacklist-label": "Чёрный список",
"tray-blacklist-placeholder": "например, nm-applet, Fcitx*",
"tray-blacklist-placeholder": "напр. nm-applet, Fcitx*",
"tray-pin-application": "Закрепить приложение",
"tray-unpin-application": "Открепить приложение",
"use-global-widgets": "Использовать глобальные виджеты",
@@ -770,6 +837,7 @@
"download-title": "Загрузить цветовые схемы",
"method-description": {
"content": "Схема Material Design с высокоточной экстракцией цветов, которая точно соответствует фактическим цветам исходного контента.",
"dysfunctional": "Как Faithful, но выбирает второе по доминантности цветовое семейство в качестве основного.",
"faithful": "Пытается оставаться близким к исходному цвету, создавая при этом гармоничную палитру.",
"fruit-salad": "Схема Material Design, создающая игривую, яркую палитру с разнообразными оттенками.",
"monochrome": "Схема Material Design, использующая однотонную шкалу серого с минимальным хроматическим содержанием.",
@@ -866,6 +934,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": "Включить виджет погоды",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "Поиск моноширинного шрифта...",
"fonts-reset-scaling": "Сбросить масштабирование",
"fonts-title": "Шрифты",
"keybinds-description": "Настройте глобальные клавиши навигации для панелей и лаунчера.",
"keybinds-down": "Переместить вниз",
"keybinds-enter": "Подтвердить / Действие",
"keybinds-escape": "Закрыть / Назад",
"keybinds-left": "Переместить влево",
"keybinds-right": "Переместить вправо",
"keybinds-title": "Навигационные Привязки Клавиш",
"keybinds-up": "Переместить вверх",
"language-desc": "Выберите предпочитаемый язык для приложения.",
"language-select-auto-detect": "Автоматически",
"language-select-description": "Выберите язык, используемый в интерфейсе приложения.",
@@ -972,7 +1058,9 @@
"screen-corners-solid-black-description": "Использовать сплошной чёрный цвет вместо цвета фона панели.",
"screen-corners-solid-black-label": "Сплошные чёрные углы",
"screen-corners-title": "Углы экрана",
"settings-copied": "Настройки скопированы в буфер обмена"
"settings-copied": "Настройки скопированы в буфер обмена",
"tab-basics": "Основы",
"tab-keybinds": "Горячие Клавиши"
},
"hooks": {
"info-command-info-description": "• Команды выполняются через shell (sh -lc)<br>• Команды выполняются в фоновом режиме (отдельно)<br>• Кнопки 'Тест' выполняются с текущими значениями",
@@ -980,40 +1068,40 @@
"info-parameters-label": "Доступные параметры",
"noctalia-started-description": "Команда для выполнения после завершения загрузки Noctalia.",
"noctalia-started-label": "Noctalia запущена",
"noctalia-started-placeholder": "например, notify-send 'Noctalia загружена'",
"noctalia-started-placeholder": "напр. notify-send 'Noctalia загружена'",
"performance-mode-disabled-description": "Команда для выполнения при выключении режима производительности Noctalia.",
"performance-mode-disabled-label": "Режим производительности выключен",
"performance-mode-disabled-placeholder": "например, notify-send \"Производительность\" \"Режим выключен\"",
"performance-mode-disabled-placeholder": "напр. notify-send \"Производительность\" \"Режим выключен\"",
"performance-mode-enabled-description": "Команда для выполнения при включении режима производительности Noctalia.",
"performance-mode-enabled-label": "Режим производительности включен",
"performance-mode-enabled-placeholder": "например, notify-send \"Производительность\" \"Режим включен\"",
"performance-mode-enabled-placeholder": "напр. notify-send \"Производительность\" \"Режим включен\"",
"screen-lock-description": "Команда для выполнения при блокировке экрана.",
"screen-lock-label": "Экран заблокирован",
"screen-lock-placeholder": "например, notify-send \"Экран\" \"Заблокирован\"",
"screen-lock-placeholder": "напр. notify-send \"Экран\" \"Заблокирован\"",
"screen-unlock-description": "Команда для выполнения при разблокировке экрана.",
"screen-unlock-label": "Экран разблокирован",
"screen-unlock-placeholder": "например, notify-send \"Экран\" \"Разблокирован\"",
"screen-unlock-placeholder": "напр. notify-send \"Экран\" \"Разблокирован\"",
"session-description": "Команда, выполняемая перед выключением или перезагрузкой. Получает тип действия как $1 (выключением/перезагрузкой).",
"session-label": "Конец сессии",
"session-placeholder": "например, notify-send \"Session\" \"$1\"",
"session-placeholder": "напр. notify-send \"Session\" \"$1\"",
"system-hooks-desc": "Настройка команд для выполнения при системных событиях.",
"system-hooks-enable-description": "Включить или отключить все команды хуков.",
"system-hooks-enable-label": "Включить хуки",
"system-hooks-title": "Системные хуки",
"theme-changed-description": "Команда для выполнения при переключении темы между тёмным и светлым режимами.",
"theme-changed-label": "Тема изменена",
"theme-changed-placeholder": "например, notify-send \"Тема\" \"Переключена\"",
"theme-changed-placeholder": "напр. notify-send \"Тема\" \"Переключена\"",
"title": "Хуки",
"wallpaper-changed-description": "Команда для выполнения при смене обоев.",
"wallpaper-changed-label": "Обои изменены",
"wallpaper-changed-placeholder": "например, notify-send \"Обои\" \"Изменены\""
"wallpaper-changed-placeholder": "напр. notify-send \"Обои\" \"Изменены\""
},
"indicator": {
"default-value": "По умолчанию: {value}",
"system-default": "По умолчанию"
},
"launcher": {
"clipboard-desc": "Получайте доступ к истории буфера обмена и управляйте ею из панели запуска.",
"clipboard-desc": "Получайте доступ к истории буфера обмена и управляйте ею из лаунчера.",
"execute-desc": "Настройте способ запуска приложений.",
"execute-title": "Исполнение",
"settings-annotation-tool-description": "Команда для запуска при нажатии кнопки аннотирования в истории буфера обмена. Изображение будет передано в эту команду.",
@@ -1027,19 +1115,29 @@
"settings-clip-wrap-text-label": "Обернуть текст из буфера обмена",
"settings-clipboard-history-description": "Доступ к ранее скопированным элементам из запуска.",
"settings-clipboard-history-label": "Включить историю буфера обмена",
"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-custom-launch-prefix-description": "Добавлять префикс к командам с помощью пользовательского запуска (например, 'runapp' для интеграции с systemd).",
"settings-custom-launch-prefix-enabled-description": "Использовать пользовательский префикс для запуска приложений вместо метода по умолчанию.",
"settings-custom-launch-prefix-enabled-label": "Включить пользовательский префикс запуска",
"settings-custom-launch-prefix-label": "Пользовательский префикс запуска",
"settings-density-description": "Настройте размер значков приложений и плотность Launcher.",
"settings-density-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-overlay-layer-description": "Отображать запускатель на слое наложения, над полноэкранными окнами. При включении запускатель не будет прикреплен к панели.",
"settings-overlay-layer-label": "Показывать поверх полноэкранного режима",
"settings-position-description": "Выберите, где появляется панель лаунчера.",
"settings-show-categories-description": "Показывать вкладки категорий для фильтрации приложений.",
"settings-show-categories-label": "Показывать категории",
"settings-show-icon-background-description": "Показывать закруглённый прямоугольник в качестве фона для иконок.",
@@ -1050,7 +1148,9 @@
"settings-terminal-command-label": "Команда терминала",
"settings-use-app2unit-description": "Использует альтернативный метод запуска для лучшего управления процессами приложений и предотвращения проблем.",
"settings-use-app2unit-label": "Использовать App2Unit для запуска приложений",
"title": "Запуск"
"settings-view-mode-description": "Выберите макет для записей Запускателя.",
"settings-view-mode-label": "Режим просмотра",
"title": "Лаунчер"
},
"location": {
"calendar-cards-desc": "Организуйте и включайте/выключайте карточки в панели календаря.",
@@ -1066,12 +1166,12 @@
"date-time-show-events-description": "Отображать события на панели календаря.",
"date-time-show-events-label": "Показывать события календаря",
"date-time-title": "Дата и время",
"date-time-use-analog-description": "Показывать аналоговые часы в окне календаря и на экране блокировки.",
"date-time-use-analog-description": "Показывать аналоговые часы в окне календаря.",
"date-time-use-analog-label": "Использовать аналоговый стиль часов",
"date-time-week-numbers-description": "Отображает номер недели в году (например, Неделя 38) в календаре.",
"date-time-week-numbers-description": "Отображает номер недели в году (например, неделя 38) в календаре.",
"date-time-week-numbers-label": "Показывать номера недель",
"location-desc": "Получите точную погоду и расписание ночного света, установив своё местоположение.",
"location-search-description": "например, Москва, RU",
"location-search-description": "напр. Москва, RU",
"location-search-label": "Поиск местоположения",
"location-search-placeholder": "Введите название местоположения",
"location-title": "Ваше местоположение",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "Отображать погоду в календаре"
},
"lock-screen": {
"allow-password-with-fprintd-description": "Когда fprintd (аутентификация по отпечатку пальца) активен, эта опция позволяет вам входить в систему с помощью пароля вместо отпечатка пальца.",
"allow-password-with-fprintd-label": "Разрешить вход по паролю с помощью fprintd",
"auto-start-auth-description": "Aвтоматически запускает аутентификацию по отпечатку пальца без необходимости нажатия клавиши или щелчка кнопки.",
"auto-start-auth-label": "Автоматический запуск аутентификации",
"clock-format-description": "Настройте формат часов, используя токены синтаксиса даты/времени.",
"clock-format-label": "Формат часов",
"clock-style-analog": "Аналоговый",
"clock-style-custom": "Пользовательский",
"clock-style-description": "Выберите визуальный стиль часов на Экране блокировки.",
"clock-style-digital": "Цифровой",
"clock-style-label": "Стиль Часов",
"compact-lockscreen-description": "Показывать только поле для ввода логина и системные элементы управления, скрывая виджеты погоды и медиа.",
"compact-lockscreen-label": "Компактный экран блокировки",
"lock-on-suspend-description": "Автоматически блокировать экран при приостановке работы системы.",
"lock-on-suspend-label": "Блокировать при приостановке",
"lock-screen-animations-description": "Включить или отключить анимации экрана блокировки.",
"lock-screen-animations-label": "Анимации Экрана Блокировки",
"lock-screen-blur-strength-description": "Применяет эффект размытия к обоям экрана блокировки.",
"lock-screen-blur-strength-label": "Сила размытия экрана блокировки",
"lock-screen-tint-strength-description": "Применяет наложение оттенка к обоям экрана блокировки.",
"lock-screen-tint-strength-label": "Интенсивность тонировки экрана блокировки",
"monitors-desc": "Показать экран блокировки на определенных мониторах. По умолчанию на всех, если ни один не выбран.",
"show-hibernate-description": "Показывать опцию 'спящий режим' в элементах управления питанием.",
"show-hibernate-label": "Показывать спящий режим",
"show-session-buttons-description": "Разрешить доступ к настройкам питания с экрана блокировки.",
@@ -1126,8 +1244,6 @@
"history-low-urgency-label": "Сохранять низкую срочность в истории",
"history-normal-urgency-description": "Сохранять уведомления с нормальным приоритетом в истории.",
"history-normal-urgency-label": "Сохранять нормальную срочность в истории",
"media-toast-description": "Показывать всплывающее уведомление при изменении состояния воспроизведения медиа.",
"media-toast-label": "Медиа",
"monitors-desc": "Показывать уведомления на определённых мониторах. По умолчанию на всех, если ни один не выбран.",
"settings-always-on-top-description": "Отображать уведомления поверх полноэкранных окон и других слоёв.",
"settings-background-opacity-description": "Настройка непрозрачности фона уведомлений.",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "Звуки уведомлений недоступны",
"sounds-volume-description": "Настроить уровень громкости для звуков уведомлений.",
"sounds-volume-label": "Громкость звука",
"toast-battery-description": "Показывать предупреждение, когда уровень заряда батареи опускается ниже этого процента.",
"toast-battery-label": "Предупреждение о батарее",
"toast-desc": "Настроить внешний вид и поведение всплывающих уведомлений.",
"toast-keyboard-description": "Показывать всплывающее уведомление при смене раскладки клавиатуры.",
"toast-keyboard-label": "Раскладка клавиатуры"
"toast-keyboard-label": "Раскладка клавиатуры",
"toast-media-description": "Показывать всплывающее уведомление при изменении состояния воспроизведения медиа.",
"toast-media-label": "Медиа"
},
"osd": {
"always-on-top-description": "Отображать OSD поверх полноэкранных окон и других слоёв.",
@@ -1180,38 +1300,42 @@
"duration-desc": "Как долго OSD остаётся видимым перед автоматическим скрытием.",
"duration-title": "Таймаут автоскрытия",
"enabled-description": "Показывать изменения громкости и яркости в реальном времени.",
"enabled-label": "Включить экранное отображение (OSD)",
"events-desc": "Выберите, какие события запускают экранное меню.",
"general-desc": "Настроить видимость и поведение экранного меню (OSD).",
"location-description": "Где появляются экранные отображения.",
"enabled-label": "Включить уведомления (OSD)",
"events-desc": "Выберите, по каким событиям выводить уведомления (OSD).",
"general-desc": "Настроить видимость и поведение уведомлений (OSD).",
"location-description": "Расположение экранных уведолений.",
"monitors-desc": "Показывать OSD на определённых мониторах. По умолчанию на всех, если ни один не выбран.",
"title": "Экранное отображение (OSD)",
"title": "Уведомления (OSD)",
"types-brightness-description": "Показывать OSD при изменении яркости экрана.",
"types-brightness-label": "Яркость",
"types-custom-text-description": "Показывать OSD для пользовательских текстовых сообщений через IPC.",
"types-custom-text-label": "Пользовательский текст",
"types-desc": "Выберите события, которые должны запускать экранное меню (OSD).",
"types-desc": "Выберите события, которые должны запускать уведомления (OSD).",
"types-input-volume-description": "Показывать OSD при изменении громкости микрофона.",
"types-input-volume-label": "Входная громкость",
"types-lockkey-description": "Показывать OSD при переключении клавиш Caps Lock, Num Lock или Scroll Lock.",
"types-lockkey-label": "Клавиши блокировки",
"types-media-description": "Показывать OSD при изменении состояния воспроизведения медиа (воспроизведение, пауза, пропуск).",
"types-media-label": "Воспроизведение медиа",
"types-title": "События, запускающие экранное меню",
"types-title": "События, запускающие уведомления (OSD)",
"types-volume-description": "Показывать OSD при изменении громкости аудиовыхода.",
"types-volume-label": "Выходная громкость"
},
"plugins": {
"auto-update": "Автоматическое обновление плагинов",
"auto-update-description": "Автоматически обновлять все плагины при запуске оболочки.",
"available-description": "Просмотр и установка плагинов из настроенных источников.",
"available-label": "Доступные плагины",
"available-no-plugins-description": "Проверьте исходники вашего плагина или обновите список.",
"available-no-plugins-label": "Нет доступных плагинов",
"check-for-updates": "Проверить обновления",
"checking-for-updates": "Проверка обновлений...",
"collision-already-installed": "Этот плагин уже установлен",
"collision-custom-version-exists": "Пользовательская версия из \"{source}\" уже установлена",
"collision-official-version-exists": "Официальная версия этого плагина уже установлена",
"filter-downloaded": "Скачано",
"filter-not-downloaded": "Не загружено",
"filter-tags-description": "Фильтровать плагины по категории или статусу загрузки",
"filter-tags-description": "Фильтровать плагины по категории или статусу загрузки.",
"filter-tags-label": "Теги",
"hot-reload-description": "Автоматически перезагружать плагины при изменении их файлов. Полезно для разработки плагинов.",
"hot-reload-label": "Горячая перезагрузка (режим разработки)",
@@ -1245,6 +1369,7 @@
"sources-placeholder": "Мой крутой репозиторий",
"sources-remove-tooltip": "Удалить исходный код плагина",
"title": "Плагины",
"translations-reloaded": "Переводы перезагружены: {name}",
"uninstall-dialog-description": "Вы уверены, что хотите удалить {plugin}? Это удалит все данные плагина.",
"uninstall-dialog-title": "Удалить плагин",
"uninstall-error": "Не удалось удалить: {error}",
@@ -1271,11 +1396,14 @@
"entries-desc": "Настроить, какие действия питания отображаются в меню сеанса и в каком порядке.",
"entries-title": "Действия питания",
"entry-settings-command-description": "Пользовательская команда для выполнения этого действия. Оставьте пустым, чтобы использовать системную команду по умолчанию.",
"entry-settings-command-placeholder": "systemctl poweroff",
"entry-settings-command-placeholder": "напр. systemctl poweroff",
"entry-settings-default-command-lock": "Внутренний экран блокировки (без команды)",
"entry-settings-default-command-logout": "Внутренний выход из системы (без команды)",
"entry-settings-default-info-description": "Если не указана пользовательская команда, будет использована системная команда по умолчанию.",
"entry-settings-default-info-label": "Команда по умолчанию",
"entry-settings-keybind-description": "Назначьте комбинацию клавиш для вызова этого действия, когда меню сеанса открыто.",
"entry-settings-keybind-placeholder": "Нажмите Запись, чтобы назначить клавишу...",
"entry-settings-keybind-recording": "Запись... Нажмите любую комбинацию клавиш",
"entry-settings-title": "Настроить {entry}",
"entry-settings-tooltip": "Настроить команду",
"general-desc": "Настройка поведения и внешнего вида панели меню сеанса.",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "Критический цвет",
"custom-highlight-colors-title-label": "Пользовательские цвета выделения",
"disk-available-label": "Доступно места на диске",
"disk-section-label": "Использование диска",
"enable-dgpu-monitoring-description": "Внимание: Это разбудит ваш дискретный графический процессор (NVIDIA/AMD), что может значительно повлиять на время работы от аккумулятора на ноутбуках с гибридной графикой.",
"enable-dgpu-monitoring-label": "Включить мониторинг дискретного GPU",
@@ -1325,8 +1454,8 @@
"box-border-radius-description": "Настраивает скругление углов основных разделов макета, таких как боковые панели, карточки и панели контента.",
"box-border-radius-label": "Радиус контейнера",
"box-border-radius-reset": "Сбросить радиус контейнера",
"control-border-radius-description": "Управляет кривизной интерактивных элементов, включая кнопки, переключатели и текстовые поля.",
"control-border-radius-label": "Ввести радиус",
"control-border-radius-description": "Управляет скруглением интерактивных элементов, включая кнопки, переключатели и текстовые поля.",
"control-border-radius-label": "Радиус элементов ввода",
"control-border-radius-reset": "Сбросить радиус ввода",
"desc": "Настройка внешнего вида, ощущений и поведения интерфейса.",
"dim-desktop-description": "Затемнять рабочий стол при открытии панелей или меню.",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "Выберите раскладку настроек (может потребоваться перезапуск).",
"settings-panel-mode-label": "Режим панели настроек",
"shadows-description": "Включает отбрасываемые тени под панелями и панелью задач.",
"shadows-direction-description": "Выберите, откуда отбрасывается тень.",
"shadows-direction-description": "Выберите, куда отбрасывается тень.",
"shadows-direction-label": "Направление тени",
"shadows-label": "Отбрасываемые тени",
"title": "Пользовательский интерфейс",
@@ -1357,19 +1486,19 @@
"automation-change-mode-alphabetical": "Алфавитный",
"automation-change-mode-description": "Выберите, как выбираются обои при автоматической смене.",
"automation-change-mode-label": "Режим смены",
"automation-custom-interval-description": "Введите время в формате ЧЧ:ММ (например, 01:30).",
"automation-custom-interval-description": "Введите время в формате ЧЧ:ММ (напр. 01:30).",
"automation-custom-interval-label": "Пользовательский интервал",
"automation-interval-description": "Как часто автоматически менять обои.",
"automation-interval-description": "Частота автоматической смены обоев.",
"automation-interval-label": "Интервал смены обоев",
"automation-random-wallpaper-description": "Запланировать смену случайных обоев через регулярные интервалы.",
"automation-scheduled-change-description": "Автоматически менять обои через регулярные интервалы.",
"automation-scheduled-change-description": "Автоматически менять обои через регулярные интервалы времени.",
"automation-scheduled-change-label": "Запланированная смена",
"look-feel-edge-smoothness-description": "Применяет мягкий, растушёванный эффект к краю переходов.",
"look-feel-edge-smoothness-label": "Смягчить край перехода",
"look-feel-fill-color-description": "Выберите цвет заливки, который может появиться за обоями.",
"look-feel-fill-mode-description": "Выберите, как изображение должно масштабироваться, чтобы соответствовать разрешению вашего монитора.",
"look-feel-fill-mode-label": "Режим заполнения",
"look-feel-title": "Внешний вид и ощущения",
"look-feel-title": "Внешний вид",
"look-feel-transition-duration-description": "Продолжительность анимации перехода в секундах.",
"look-feel-transition-duration-label": "Продолжительность перехода",
"look-feel-transition-type-description": "Тип анимации при переключении между обоями.",
@@ -1386,19 +1515,23 @@
"settings-monitor-specific-description": "Установить отдельную папку с обоями для каждого монитора.",
"settings-monitor-specific-label": "Каталоги для конкретного монитора",
"settings-monitor-specific-tooltip": "Папка обоев монитора",
"settings-overview-blur-strength-description": "Применяет силу размытия к обзору.",
"settings-overview-blur-strength-label": "Сила размытия обзора",
"settings-overview-tint-description": "Применяет интенсивность оттенка к обзору.",
"settings-overview-tint-label": "Интенсивность тонировки обзора",
"settings-recursive-search-description": "Также искать обои во вложенных папках каталога обоев.",
"settings-recursive-search-label": "Искать во вложенных папках",
"settings-select-monitor-folder": "Выбрать папку с обоями для монитора",
"settings-selector-description": "Выберите обои.",
"settings-selector-description": "Перейти на панель выбора обоев.",
"settings-selector-position-description": "Выберите, где появляется панель выбора обоев.",
"settings-show-hidden-files-tooltip-hide": "Скрыть скрытые файлы",
"settings-show-hidden-files-tooltip-hide": "Не показывать скрытые файлы",
"settings-show-hidden-files-tooltip-show": "Показать скрытые файлы",
"settings-title": "Настройки обоев",
"settings-view-mode-description": "Выберите способ отображения обоев из вашей директории.",
"settings-view-mode-label": "Режим просмотра",
"view-mode-browse": "Просмотр каталогов",
"view-mode-cycle-tooltip": "Режим просмотра: {mode} (нажмите, чтобы изменить)",
"view-mode-recursive": "Сглаженные подкаталоги",
"view-mode-recursive": "Объединить с подкаталогами",
"view-mode-single": "Корневой каталог"
}
},
@@ -1407,11 +1540,11 @@
"enter-command": "Введите команду для выполнения (приложение или пользовательский скрипт)",
"enter-ipc-identifier": "Введите уникальный идентификатор для команд IPC",
"enter-path": "Введите путь...",
"enter-text-to-collapse": "например, 'ничего не играет'. Используйте /regex/ для шаблонов.",
"enter-text-to-collapse": "напр. 'ничего не играет'. Используйте /regex/ для шаблонов.",
"enter-tooltip": "Введите подсказку",
"enter-width-pixels": "Введите ширину в пикселях",
"search": "Поиск...",
"search-icons": "например, noctalia, niri, battery, cloud",
"search-icons": "напр. noctalia, niri, battery, cloud",
"search-launcher": "Поиск записей... или используйте > для команд",
"search-wallhaven": "Поиск в Wallhaven...",
"search-wallpapers": "Введите для фильтрации обоев..."
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "Готово!",
"appearance": {
"subheader": "Выберите режим оформления и источник палитры цветов (обои или предопределённые)."
"subheader": "Выберите темный режим и источники цвета (обои или предопределенные)."
},
"customize": {
"header": "Настройте свой опыт",
@@ -1490,7 +1623,7 @@
"disk": "Диск",
"download-speed": "Скорость загрузки",
"gpu-temp": "Температура GPU",
"load-average": "Нaгр. ср.",
"load-average": "Средняя нагрузка",
"title": "Системный монитор",
"upload-speed": "Скорость загрузки"
},
@@ -1499,8 +1632,10 @@
"title": "Режим полёта"
},
"battery": {
"critical": "Критический заряд батареи",
"critical-desc": "Батарея заряжена на {percent}% — немедленно подключите зарядное устройство",
"low": "Низкий заряд батареи",
"low-desc": "Заряд батареи {percent}%. Пожалуйста, подключите зарядное устройство"
"low-desc": "Батарея заряжена на {percent}% — пожалуйста, подключите зарядное устройство"
},
"bluetooth": {
"address-copied": "Адрес скопирован в буфер обмена",
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "Диск",
"fade": "Затухание",
"honeycomb": "Соты",
"pixelate": "Пикселизировать",
"stripes": "Полосы",
"wipe": "Стирание"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "Загрузка обоев...",
"no-results": "Обои не найдены. Попробуйте другой поисковый запрос.",
"page": "{current} из {total}"
"page": "{current} из {total}",
"page-prefix": "Страница",
"page-suffix": "из {total}"
}
},
"weather": {
File diff suppressed because it is too large Load Diff
+187 -48
View File
@@ -48,11 +48,16 @@
"device-default": "Varsayılan (Bileşik aygıt)",
"device-description": "Görüntülenecek pil cihazını seçin.",
"device-label": "Pil cihazı",
"display-mode-description": "Pilin çubukta nasıl görüntüleneceğini seçin.",
"display-mode-graphic": "Grafik pil",
"display-mode-graphic-clean": "Grafik pil (yüzde yok)",
"display-mode-icon-always": "Simge - Her zaman % göster",
"display-mode-icon-hover": "Simge - Üzerine gelindiğinde göster",
"display-mode-icon-only": "Yalnızca simge",
"hide-if-idle-description": "Pil şarj olmuyor veya deşarj olmuyorken aracı gizle.",
"hide-if-idle-label": "Boşta kalınca gizle",
"hide-if-not-detected-description": "Sistemde pil algılanmadığında araç çubuğunu gizle.",
"hide-if-not-detected-label": "Algılanmazsa gizle",
"low-battery-threshold-description": "Batarya bu yüzdeye düştüğünde uyarı göster.",
"low-battery-threshold-label": "Düşük batarya eşiği",
"show-noctalia-performance-description": "Pil panelinde Noctalia performans modu anahtarını göster.<br>Kaynak kullanımını azaltmak için Noctalia'da gölgeleri ve animasyonları devre dışı bırakır.",
"show-noctalia-performance-label": "Noctalia Performans anahtarını göster",
@@ -75,8 +80,6 @@
"use-custom-font-label": "Özel yazı tipi kullan",
"use-monospaced-font-description": "Etkinleştirildiğinde, saat tek aralıklı yazı tipini kullanır.",
"use-monospaced-font-label": "Tek aralıklı yazı tipi kullan",
"use-primary-color-description": "Etkinleştirildiğinde, bu vurgu için birincil rengi uygular.",
"use-primary-color-label": "Birincil rengi kullan",
"vertical-bar-description": "Her parçayı yeni bir satıra ayırmak için boşluk kullanın.",
"vertical-bar-label": "Dikey çubuk"
},
@@ -94,7 +97,6 @@
"collapse-condition-description": "Çıktı metni bu değerle eşleşirse düğme daralacak.",
"collapse-condition-label": "Daralma durumu",
"color-selection-description": "Tema renklerini simgeye ve metne uygula.",
"color-selection-label": "Renk seç",
"display-command-output-description": "Düzenli aralıklarla çalıştırılacak bir komut girin. Çıktısının ilk satırı metin olarak gösterilecektir.",
"display-command-output-label": "Komut çıktısını göster",
"display-command-output-stream-description": "Sürekli çalıştırılacak bir komut girin.",
@@ -182,7 +184,9 @@
"hide-widget-when-zero-unread-description": "Okunmamış bildirim yokken bildirim simgesini gizle.",
"hide-widget-when-zero-unread-label": "Okunmamış yokken simgeyi gizle",
"show-unread-badge-description": "Okunmamış bildirim sayısını gösteren bir rozet göster.",
"show-unread-badge-label": "Okunmamış bildirimleri göster"
"show-unread-badge-label": "Okunmamış bildirimleri göster",
"unread-badge-color-description": "Okunmamış bildirim rozeti için rengi seçin.",
"unread-badge-color-label": "Okunmamış rozet rengi"
},
"section-editor": {
"placeholder": "Eklenecek bir araç takımı seçin...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "İstatistikleri metin değerleri yerine mini çubuk grafikler olarak görüntüleyin. Düzen kaymasını önler.",
"compact-mode-label": "Kompakt mod",
"cpu-frequency-description": "Mevcut CPU saat hızını GHz cinsinden görüntüle.",
"cpu-frequency-label": "CPU frekansını göster",
"cpu-temperature-description": "Mevcut işlemci sıcaklık okumalarını gösterir.",
"cpu-temperature-label": "İşlemci sıcaklığı",
"cpu-usage-description": "Mevcut işlemci kullanım yüzdesini göster.",
@@ -209,6 +215,10 @@
"memory-usage-label": "Bellek kullanımı",
"network-traffic-description": "Ağ yükleme ve indirme hızlarını göster.",
"network-traffic-label": "Ağ trafiği",
"storage-as-percentage-description": "Disk alanını mutlak değerler yerine yüzde olarak göster.",
"storage-as-percentage-label": "Disk yüzde olarak",
"storage-available-description": "Kullanılan miktar yerine ne kadar disk alanı olduğunu gösterir.",
"storage-available-label": "Kullanılabilir disk alanı",
"storage-usage-description": "Disk alanı kullanım bilgilerini göster.",
"storage-usage-label": "Depolama kullanımı",
"swap-usage-description": "Takas belleği kullanımını göster.",
@@ -240,6 +250,8 @@
"title-width-reset-tooltip": "Başlık genişliğini sıfırla"
},
"tray": {
"chevron-color-description": "Çekmecenin ok simgesine tema renklerini uygula.",
"chevron-color-label": "Ok rengi",
"colorize-icons-description": "Tepsi simgelerine tema renklerini uygula.",
"colorize-icons-label": "Simgeleri renklendir",
"drawer-enabled-description": "Etkinleştirildiğinde, sabitlenmemiş tepsi öğeleri bir çekmece panelinde gösterilir.<br>Devre dışı bırakıldığında, tüm tepsi öğeleri satır içi gösterilir.",
@@ -248,14 +260,17 @@
"hide-passive-label": "Pasif öğeleri gizle"
},
"volume": {
"display-mode-description": "Bu değerin nasıl görünmesini istediğinizi seçin.",
"display-mode-label": "Görüntüleme modu"
"display-mode-description": "Bu değerin nasıl görünmesini istediğinizi seçin."
},
"workspace": {
"character-count-description": "Çalışma alanı adlarından gösterilecek karakter sayısı (1-10).",
"character-count-label": "Karakter sayısı",
"empty-color-description": "Boş Workspace'ler için arka plan rengini ayarla.",
"empty-color-label": "Boş çalışma alanı rengi",
"enable-scrollwheel-description": "Fare tekerleği ile çalışma alanları arasında geçiş yapın.",
"enable-scrollwheel-label": "Çalışma alanları arasında geçiş yapmak için kaydırın",
"focused-color-description": "Odaklanılan Workspace için arka plan rengini ayarla.",
"focused-color-label": "Odaklanılan çalışma alanı rengi",
"follow-focused-screen-description": "Çubuğun bulunduğu ekran yerine, şu anda odaklanmış ekrandaki çalışma alanlarını göster.",
"follow-focused-screen-label": "Odaklanmış ekranı takip et",
"grouped-border-opacity-description": "Çalışma alanı kapsayıcı kenarlıklarının opaklık düzeyini ayarlayın.",
@@ -264,8 +279,16 @@
"hide-unoccupied-label": "Dolu olmayanları gizle",
"label-mode-description": "Çalışma alanı etiketlerinin nasıl gösterileceğini seçin.",
"label-mode-label": "Etiket Modu",
"occupied-color-description": "Dolu Workspaces için arka plan rengini ayarla.",
"occupied-color-label": "Dolu çalışma alanı rengi",
"pill-size-description": "Çalışma alanı haplarının boyutunu ayarlayın (50%-100%).",
"pill-size-label": "Kapsül boyutu",
"reverse-scrolling-description": "Kaydırırken çalışma alanı geçiş yönünü tersine çevir.",
"reverse-scrolling-label": "Ters kaydırma",
"show-applications-description": "Her çalışma alanının içinde uygulama simgelerini görüntüle.",
"show-applications-label": "Uygulamaları göster",
"show-badge-description": "Gruplandırılmış modda çalışma alanı numarası işaretini göster.",
"show-badge-label": "Çalışma alanı rozetini göster",
"show-labels-only-when-occupied-description": "Yalnızca pencere içeren çalışma alanı etiketlerini göster.",
"show-labels-only-when-occupied-label": "Yalnızca dolu olduğunda etiketleri göster",
"unfocused-icons-opacity-description": "Odaklanılmamış uygulama simgelerinin opaklık düzeyini ayarlayın.",
@@ -327,13 +350,6 @@
"version-new-user": "Yeni kurulum"
}
},
"colors": {
"error": "Hata",
"on-surface": "Yüzeyde",
"primary": "Birincil",
"secondary": "İkincil",
"tertiary": "Üçüncül"
},
"common": {
"actions": "Eylemler",
"add": "Ekle",
@@ -373,10 +389,13 @@
"disconnect": "Bağlantıyı kes",
"disconnected": "Bağlantı kesildi",
"disconnecting": "Bağlantı kesiliyor...",
"display-mode": "Görüntü modu",
"download": "İndir",
"duration": "Süre",
"dysfunctional": "İşlevsiz",
"edit": "Düzenle",
"enabled": "Etkinleştirildi",
"error": "Hata",
"events": "Etkinlikler",
"execute": "Yürüt",
"faithful": "Sadık",
@@ -395,6 +414,7 @@
"installed": "Yüklendi",
"interface": "Arayüz",
"internet": "İnternet",
"keybind": "Tuş Ataması",
"language": "Dil",
"loading": "Yükleniyor...",
"local": "Yerel",
@@ -416,6 +436,7 @@
"not-found": "Bulunamadı",
"notifications": "Bildirimler",
"official": "Resmi",
"on-surface": "Yüzeyde",
"output": "Çıktı",
"pair": "Eşleştir",
"paired": "Eşleştirildi",
@@ -428,11 +449,14 @@
"polling": "Yoklama",
"position": "Pozisyon",
"previous": "Önceki",
"primary": "Birincil",
"random": "Rastgele",
"reboot": "Yeniden başlat",
"record": "Kaydı Başlat",
"refresh": "Yenile",
"required": "(gerekli)",
"reset": "Sıfırla",
"reset-to-default": "Varsayılanlara Sıfırla",
"result-count": "{count} sonuç",
"result-count-plural": "{count} sonuçlar",
"resume": "Sürdür",
@@ -440,8 +464,12 @@
"scanning": "Taranıyor...",
"screen-corners": "Ekran köşeleri",
"search": "Arama",
"secondary": "İkincil",
"security": "Güvenlik",
"select": "Seç",
"select-color": "Renk Seç",
"select-color-description": "Vurgu için tema renklerini uygula.",
"select-icon-color": "Simge rengini seçin",
"shortcuts": "Kısayollar",
"shutdown": "Kapat",
"signal": "Sinyal",
@@ -449,8 +477,10 @@
"sources": "Kaynaklar",
"start": "Başlat",
"stop": "Dur",
"supporters": "Destekçiler",
"suspend": "Askıya al",
"templates": "Şablonlar",
"tertiary": "Üçüncül",
"test": "Test",
"thresholds": "Eşikler",
"title": "Başlık",
@@ -473,6 +503,7 @@
"week": "Hafta",
"widgets": "Araçlar",
"width": "Genişlik",
"windows": "Pencereler",
"yes": "Evet"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "Üzerine gelindiğinde"
},
"hide-modes": {
"auto-hide": "Otomatik gizleme",
"hidden": "Boş olduğunda gizle",
"idle": "Boşta kalınca gizle",
"non-exclusive": "Münhasır olmayan",
"transparent": "Boşken şeffaf",
"visible": "Her zaman görünür"
},
@@ -543,7 +576,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": {
@@ -579,13 +614,26 @@
"density-compact": "Sıkı",
"density-default": "Varsayılan",
"density-mini": "Ufak",
"density-spacious": "Geniş"
"density-spacious": "Geniş",
"display-mode-always-visible": "Her Zaman Görünür",
"type-floating": "Yüzen",
"type-framed": "Çerçeveli",
"type-simple": "Basit"
},
"control-center": {
"quick-settings-style-classic": "Klasik",
"quick-settings-style-modern": "Modern"
},
"frame-rates-fps": "{fps} FPS",
"launcher-density": {
"comfortable": "Konforlu",
"compact": "Kompakt",
"default": "Varsayılan"
},
"launcher-view-mode": {
"grid": "Izgara",
"list": "Liste"
},
"scrolling-modes": {
"always": "Her zaman kaydır",
"hover": "Üzerine gelince kaydır",
@@ -616,8 +664,9 @@
},
"panels": {
"about": {
"become-supporter": "Destekçi ol",
"changelog": "Değişiklik günlüğünü görüntüle",
"contributors-desc": "{count} <b>harika</b> katılımcımıza <b>teşekkürler</b>!",
"contributors-description": "{count} <b>harika</b> katılımcımıza <b>teşekkürler</b>!",
"contributors-description-plural": "{count} <b>harika</b> katılımcımıza <b>teşekkürler</b>!",
"copy-info": "Bilgileri kopyala",
"info-copied": "Bilgi panoya kopyalandı",
@@ -628,15 +677,19 @@
"noctalia-title": "Noctalia kabuğu",
"privacy-policy": "Gizlilik politikası",
"support": "Bizi destekleyin",
"supporter-badge": "Destekçi",
"supporters-desc": "Harika destekçimize kocaman bir teşekkür!",
"supporters-desc-plural": "<b>{count} harika</b> destekçimize kocaman teşekkürler!",
"supporters-loading": "Destekçiler yükleniyor...",
"system-cpu": "İşlemci:",
"system-disk": "Disk:",
"system-gpu": "GPU:",
"system-host": "Ev sahibi:",
"system-host": "Host:",
"system-install-hint": "Sistem bilgilerini görüntülemek için fastfetch'i kurun",
"system-kernel": "Çekirdek:",
"system-loading": "Sistem bilgileri yükleniyor...",
"system-memory": "Hafıza:",
"system-monitor": "Monitör",
"system-monitor": "Monitör:",
"system-not-installed": "fastfetch kurulu değil",
"system-os": "İşletim sistemi:",
"system-packages": "Paketler:",
@@ -692,21 +745,33 @@
"volumes-output-volume-description": "Sistem genelindeki ses seviyesi.",
"volumes-step-size-description": "Ses değişimleri için adım boyutunu ayarlayın (tekerlek, klavye kısayolları).",
"volumes-step-size-label": "Ses adım boyutu",
"volumes-volume-feedback-description": "Ses seviyesi ayarlanırken geri bildirim sesi çal",
"volumes-volume-feedback-description": "Ses seviyesi ayarlanırken geri bildirim sesi çal.",
"volumes-volume-feedback-label": "Ses düzeyi geri bildirim sesini çal",
"volumes-volume-overdrive-description": "Sesi %100'ün üzerine çıkarmaya izin ver. Bazı donanımlar desteklemeyebilir.",
"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-color-description": "Çubuk kapsülleri için bir renk seçin veya varsayılan yüzey rengi için hiçbirini kullanmayın.",
"appearance-capsule-color-label": "Kapsül rengi",
"appearance-capsule-opacity-description": "Kapsül gösterildiğinde araç takımı arka planlarının saydamlık seviyesini ayarla.",
"appearance-capsule-opacity-label": "Kapsül saydamlığı",
"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-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",
"appearance-frame-settings-description": "Çerçeve kalınlığını ve iç köşe yarıçapını ayarlayın",
"appearance-frame-settings-label": "Çerçeve Ayarları",
"appearance-frame-thickness": "Kalınlık",
"appearance-hide-on-overview-description": "Kompozitör önizlemesi aktif olduğunda çubuğu gizle ve panelleri kapat.",
"appearance-hide-on-overview-label": "Genel bakışta çubuğu gizle",
"appearance-margins-description": "Yüzen araç çubuğunun etrafındaki kenar boşluklarını ayarlayın.",
@@ -721,6 +786,8 @@
"appearance-show-capsule-label": "Kapsülü göster",
"appearance-show-outline-description": "Her widget'ın etrafında görünür bir kenarlık görüntüler.",
"appearance-show-outline-label": "Araç kutusu ana hatlarını göster",
"appearance-type-description": "Çubuk stilini seçin: Basit, Yüzen veya Çerçeveli.",
"appearance-type-label": "Çubuk türü",
"appearance-use-separate-opacity-description": "Çubuk arka planı için ayrı bir opaklık değeri kullanmayı etkinleştir.",
"appearance-use-separate-opacity-label": "Ayrı çubuk opaklığı kullan",
"monitor-configure-widgets": "Araçları yapılandır",
@@ -734,7 +801,7 @@
"title": "Araç çubuğu",
"tray-blacklist-description": "Tepsi hariç tutma kuralları ekleyin, joker karakterleri destekler (*).",
"tray-blacklist-label": "Kara liste",
"tray-blacklist-placeholder": "örn., nm-applet, Fcitx*",
"tray-blacklist-placeholder": "örn. nm-applet, Fcitx*",
"tray-pin-application": "Uygulamayı sabitle",
"tray-unpin-application": "Sabitlemeyi kaldır",
"use-global-widgets": "Genel araçları kullan",
@@ -770,6 +837,7 @@
"download-title": "Renk şemalarını indir",
"method-description": {
"content": "Kaynak içeriğin gerçek renkleriyle yakından eşleşen, yüksek doğruluklu renk çıkarma özelliğine sahip Material Design şeması.",
"dysfunctional": "Faithful gibi, ancak ikinci en baskın renk ailesini birincil olarak seçer.",
"faithful": "Uyumlu bir palet oluştururken kaynak rengine yakın kalmaya çalışır.",
"fruit-salad": "Çeşitli ve farklı tonlara sahip, eğlenceli, canlı bir palet üreten Material Design şeması.",
"monochrome": "Minimal kromatik içerikli tek tonlu gri tonlamalı Material Design şeması.",
@@ -866,6 +934,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",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "Eş aralıklı yazı tipi ara...",
"fonts-reset-scaling": "Ölçeklemeyi sıfırla",
"fonts-title": "Yazı tipleri",
"keybinds-description": "Paneller ve başlatıcı için genel navigasyon tuşlarını yapılandırın.",
"keybinds-down": "Aşağı Taşı",
"keybinds-enter": "Onayla / Eylem",
"keybinds-escape": "Kapat / Geri",
"keybinds-left": "Sola Taşı",
"keybinds-right": "Sağa Taşı",
"keybinds-title": "Gezinme Tuş Atamaları",
"keybinds-up": "Yukarı Taşı",
"language-desc": "Uygulama için tercih ettiğiniz dili seçin.",
"language-select-auto-detect": "Otomatik",
"language-select-description": "Uygulama arayüzünde kullanılacak dili seçin.",
@@ -972,7 +1058,9 @@
"screen-corners-solid-black-description": "Araç çubuğu arka plan rengi yerine tam siyah kullan.",
"screen-corners-solid-black-label": "Siyah köşeler",
"screen-corners-title": "Ekran köşeleri",
"settings-copied": "Ayarlar panoya kopyalandı"
"settings-copied": "Ayarlar panoya kopyalandı",
"tab-basics": "Temeller",
"tab-keybinds": "Tuş Atamaları"
},
"hooks": {
"info-command-info-description": "• Komutlar kabuk (sh -lc) ile yürütülür<br>• Komutlar arka planda yürütülür (ayrık)<br>• Test düğmeleri mevcut değerlerle yürütülür",
@@ -983,30 +1071,30 @@
"noctalia-started-placeholder": "örn. notify-send 'Noctalia Yüklendi'",
"performance-mode-disabled-description": "Noctalia performans modu devre dışı bırakıldığında çalıştırılacak komut.",
"performance-mode-disabled-label": "Performans modu devre dışı bırakıldı",
"performance-mode-disabled-placeholder": "örn., notify-send \"Performans\" \"Mod devre dışı\"",
"performance-mode-disabled-placeholder": "örn. notify-send \"Performans\" \"Mod devre dışı\"",
"performance-mode-enabled-description": "Noctalia performans modu etkinleştirildiğinde çalıştırılacak komut.",
"performance-mode-enabled-label": "Performans modu etkinleştirildi",
"performance-mode-enabled-placeholder": "örn., notify-send \"Performans\" \"Mod etkin\"",
"performance-mode-enabled-placeholder": "örn. notify-send \"Performans\" \"Mod etkin\"",
"screen-lock-description": "Ekran kilitlendiğinde çalıştırılacak komut.",
"screen-lock-label": "Ekran kilitlendi",
"screen-lock-placeholder": "örn., notify-send \"Ekran\" \"Kilitlendi\"",
"screen-lock-placeholder": "örn. notify-send \"Ekran\" \"Kilitlendi\"",
"screen-unlock-description": "Ekran kilidi açıldığında çalıştırılacak komut.",
"screen-unlock-label": "Ekran kilidi açıldı",
"screen-unlock-placeholder": "örn., notify-send \"Ekran\" \"Açıldı\"",
"screen-unlock-placeholder": "örn. notify-send \"Ekran\" \"Açıldı\"",
"session-description": "Kapatma veya yeniden başlatma öncesinde çalıştırılacak komut. Eylem türünü $1 olarak alır (kapatma/yeniden başlatma).",
"session-label": "Oturum sonu",
"session-placeholder": "örn., notify-send \"Session\" \"$1\"",
"session-placeholder": "örn. notify-send \"Session\" \"$1\"",
"system-hooks-desc": "Sistem olayları gerçekleştiğinde çalıştırılacak komutları yapılandırın.",
"system-hooks-enable-description": "Tüm kanca komutlarını etkinleştirin veya devre dışı bırakın.",
"system-hooks-enable-label": "Hooks etkinleştir",
"system-hooks-title": "Sistem hooks",
"theme-changed-description": "Tema koyu ve aydınlık mod arasında geçişte çalıştırılacak komut.",
"theme-changed-label": "Tema değişti",
"theme-changed-placeholder": "örn., notify-send \"Tema\" \"Geçiş yapıldı\"",
"theme-changed-placeholder": "örn. notify-send \"Tema\" \"Geçiş yapıldı\"",
"title": "Kancalar",
"wallpaper-changed-description": "Duvar kâğıdı değiştiğinde çalıştırılacak komut.",
"wallpaper-changed-label": "Duvar kâğıdı değişti",
"wallpaper-changed-placeholder": "örn., notify-send \"Duvar Kâğıdı\" \"Değişti\""
"wallpaper-changed-placeholder": "örn. notify-send \"Duvar Kâğıdı\" \"Değişti\""
},
"indicator": {
"default-value": "Varsayılan: {value}",
@@ -1027,18 +1115,28 @@
"settings-clip-wrap-text-label": "Panoyu metni kaydır",
"settings-clipboard-history-description": "Başlatıcıdan daha önce kopyalanan öğelere erişin.",
"settings-clipboard-history-label": "Pano geçmişini etkinleştir",
"settings-custom-launch-prefix-description": "Komutlara özel bir başlatıcı ile ön ek ekleyin (örn., systemd entegrasyonu için 'runapp').",
"settings-clipboard-watch-image-description": "Görüntü değişiklikleri için wl-paste'e iletilen tam komut dizesi (yeniden başlatma gerektirir).",
"settings-clipboard-watch-image-label": "Görüntü İzleme Komutu",
"settings-clipboard-watch-text-description": "Görüntü değişiklikleri için wl-paste'e iletilen tam komut dizesi (yeniden başlatma gerektirir).",
"settings-clipboard-watch-text-label": "Metin izleme komutu",
"settings-custom-launch-prefix-description": "Komutlara özel bir başlatıcı ile ön ek ekleyin (örn. systemd entegrasyonu için 'runapp').",
"settings-custom-launch-prefix-enabled-description": "Uygulamaları başlatmak için varsayılan yöntem yerine özel bir ön ek kullanın.",
"settings-custom-launch-prefix-enabled-label": "Özel başlatma ön ekini etkinleştir",
"settings-custom-launch-prefix-label": "Özel başlatma ön eki",
"settings-density-description": "Uygulama simgelerinin boyutunu ve Launcher yoğunluğunu ayarlayın.",
"settings-density-label": "Yoğunluk",
"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",
"settings-ignore-mouse-input-description": "Başlatıcıda fare etkileşimini ve kaydırma tekerleğini devre dışı bırak.",
"settings-ignore-mouse-input-label": "Fare girişini yoksay",
"settings-overlay-layer-description": "Başlatıcıyı tam ekran pencerelerinin üzerinde, yer paylaşımı katmanında görüntüle. Etkinleştirildiğinde, başlatıcı çubuğa takılmaz.",
"settings-overlay-layer-label": "Tam ekranın üzerinde göster",
"settings-position-description": "Başlatıcı panelinin nerede görüneceğini seçin.",
"settings-show-categories-description": "Uygulamaları filtrelemek için kategori sekmelerini göster.",
"settings-show-categories-label": "Kategorileri göster",
@@ -1046,10 +1144,12 @@
"settings-show-icon-background-label": "Simge arka planını göster",
"settings-sort-by-usage-description": "Etkinleştirildiğinde, sıkça başlatılan uygulamalar listede ilk olarak görünür.",
"settings-sort-by-usage-label": "En çok kullanılana göre sırala",
"settings-terminal-command-description": "Bir terminal başlatmak için komut. Örn., 'kitty -e' veya 'gnome-terminal --'.",
"settings-terminal-command-description": "Bir terminal başlatmak için komut. Örn. 'kitty -e' veya 'gnome-terminal --'.",
"settings-terminal-command-label": "Terminal komutu",
"settings-use-app2unit-description": "Uygulama süreçlerini daha iyi yönetmek ve sorunları önlemek için alternatif bir başlatma yöntemi kullanır.",
"settings-use-app2unit-label": "Uygulamaları başlatmak için App2Unit kullan",
"settings-view-mode-description": "Başlatıcı girişleri için düzeni seçin.",
"settings-view-mode-label": "Görünüm modu",
"title": "Başlatıcı"
},
"location": {
@@ -1066,12 +1166,12 @@
"date-time-show-events-description": "Takvim panelindeki etkinlikleri göster.",
"date-time-show-events-label": "Takvim etkinliklerini göster",
"date-time-title": "Tarih & Saat",
"date-time-use-analog-description": "Takvim ekranında analog tarzı bir saat göster.",
"date-time-use-analog-description": "Takvim penceresinde analog tarzda bir saat göster.",
"date-time-use-analog-label": "Analog tarzı saat kullan",
"date-time-week-numbers-description": "Takvimde yılın haftasını (örn., 38. Hafta) gösterir.",
"date-time-week-numbers-description": "Takvimde yılın haftasını (örn. 38. Hafta) gösterir.",
"date-time-week-numbers-label": "Hafta numaralarını göster",
"location-desc": "Konumunuzu ayarlayarak hassas hava durumu ve gece ışığı zamanlaması alın.",
"location-search-description": "örn., İstanbul, TR",
"location-search-description": "örn. İstanbul, TR",
"location-search-label": "Konum ara",
"location-search-placeholder": "Konum adını girin",
"location-title": "Konumunuz",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "Takvimde hava durumunu göster"
},
"lock-screen": {
"allow-password-with-fprintd-description": "fprintd (parmak izi kimlik doğrulaması) etkin olduğunda, bu seçenek parmak izi yerine parolanızı kullanarak oturum açmanızı sağlar.",
"allow-password-with-fprintd-label": "fprintd ile parola girişine izin ver",
"auto-start-auth-description": "Bir tuşa basmaya veya düğmeye tıklamaya gerek kalmadan parmak izi kimlik doğrulamasını otomatik olarak başlatır.",
"auto-start-auth-label": "Otomatik kimlik doğrulama başlatma",
"clock-format-description": "Tarih/saat sözdizimi belirteçlerini kullanarak saat biçimini özelleştirin.",
"clock-format-label": "Saat Biçimi",
"clock-style-analog": "Analog",
"clock-style-custom": "Özel",
"clock-style-description": "Kilit Ekranı'ndaki saatin görsel stilini seçin.",
"clock-style-digital": "Dijital",
"clock-style-label": "Saat Stili",
"compact-lockscreen-description": "Sadece giriş girdisini ve sistem kontrollerini göster, hava durumu ve ortam araç takımlarını gizle.",
"compact-lockscreen-label": "Kompakt ekran kilidi",
"lock-on-suspend-description": "Sistemi askıya alırken otomatik olarak ekranı kilitler.",
"lock-on-suspend-label": "Askıya alırken kilitle",
"lock-screen-animations-description": "Kilit ekranı animasyonlarını etkinleştir veya devre dışı bırak.",
"lock-screen-animations-label": "Kilit Ekranı Animasyonları",
"lock-screen-blur-strength-description": "Kilit ekranı duvar kağıdına bulanıklık efekti uygular.",
"lock-screen-blur-strength-label": "Kilit ekranı bulanıklık gücü",
"lock-screen-tint-strength-description": "Kilit ekranı duvar kağıdına bir renk tonu katmanı uygular.",
"lock-screen-tint-strength-label": "Kilit ekranı ton gücü",
"monitors-desc": "Kilit ekranını belirli monitörlerde göster. Hiçbiri seçilmezse varsayılan olarak tüm monitörlerde gösterilir.",
"show-hibernate-description": "Güç kontrollerinde 'hazırda beklet' seçeneğini göster.",
"show-hibernate-label": "Hazırda beklet seçeneğini göster",
"show-session-buttons-description": "Kilit ekranından güç ayarlarına erişime izin ver.",
@@ -1126,8 +1244,6 @@
"history-low-urgency-label": "Düşük aciliyeti geçmişe kaydet",
"history-normal-urgency-description": "Normal öncelikli bildirimleri geçmişe kaydet.",
"history-normal-urgency-label": "Normal aciliyeti geçmişe kaydet",
"media-toast-description": "Medya oynatma durumu değiştiğinde bir bildirim göster.",
"media-toast-label": "Medya",
"monitors-desc": "Bildirimleri belirli ekranlarda gösterin. Hiçbiri seçilmezse varsayılan olarak tümünde gösterilir.",
"settings-always-on-top-description": "Bildirimleri tam ekran pencerelerinin ve diğer katmanların üzerinde görüntüle.",
"settings-background-opacity-description": "Bildirim arka planlarının opaklığını ayarlayın.",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "Bildirim sesleri kullanılamıyor",
"sounds-volume-description": "Bildirim sesleri için ses seviyesini ayarlayın.",
"sounds-volume-label": "Ses seviyesi",
"toast-battery-description": "Pil seviyesi bu yüzdenin altına düştüğünde bir uyarı göster.",
"toast-battery-label": "Pil uyarısı",
"toast-desc": "Bildirim penceresi görünümünü ve davranışını yapılandırın.",
"toast-keyboard-description": "Klavye düzeni değiştiğinde bir bildirim göster.",
"toast-keyboard-label": "Klavye düzeni"
"toast-keyboard-label": "Klavye düzeni",
"toast-media-description": "Medya oynatma durumu değiştiğinde bir bildirim göster.",
"toast-media-label": "Medya"
},
"osd": {
"always-on-top-description": "OSD'yi tam ekran pencerelerinin ve diğer katmanların üzerinde görüntüle.",
@@ -1202,16 +1322,20 @@
"types-volume-label": "Çıkış sesi"
},
"plugins": {
"auto-update": "Eklentileri otomatik güncelle",
"auto-update-description": "Shell başladığında tüm eklentileri otomatik olarak güncelle.",
"available-description": "Yapılandırılmış kaynaklardan eklentilere göz atın ve yükleyin.",
"available-label": "Mevcut eklentiler",
"available-no-plugins-description": "Eklenti kaynaklarınızı kontrol edin veya listeyi yenileyin.",
"available-no-plugins-label": "Kullanılabilir eklenti yok",
"check-for-updates": "Güncellemeleri kontrol et",
"checking-for-updates": "Güncellemeler kontrol ediliyor...",
"collision-already-installed": "Bu eklenti zaten yüklü",
"collision-custom-version-exists": "\"{source}\" kaynağından özel bir sürüm zaten yüklü",
"collision-official-version-exists": "Bu eklentinin resmi sürümü zaten yüklü",
"filter-downloaded": "İndirildi",
"filter-not-downloaded": "İndirilmedi",
"filter-tags-description": "Eklentileri kategoriye veya indirme durumuna göre filtrele",
"filter-tags-description": "Eklentileri kategoriye veya indirme durumuna göre filtrele.",
"filter-tags-label": "Etiketler",
"hot-reload-description": "Eklenti dosyaları değiştiğinde eklentileri otomatik olarak yeniden yükle. Eklenti geliştirme için kullanışlıdır.",
"hot-reload-label": "Hızlı yeniden yükleme (geliştirme modu)",
@@ -1245,6 +1369,7 @@
"sources-placeholder": "Havalı depom",
"sources-remove-tooltip": "Eklenti kaynağını kaldır",
"title": "Eklentiler",
"translations-reloaded": "Çeviriler yeniden yüklendi: {name}",
"uninstall-dialog-description": "{plugin} eklentisini kaldırmak istediğinizden emin misiniz? Bu, tüm eklenti verilerini kaldıracaktır.",
"uninstall-dialog-title": "Eklentiyi kaldır",
"uninstall-error": "Kaldırma başarısız oldu: {error}",
@@ -1271,11 +1396,14 @@
"entries-desc": "Oturum menüsünde hangi güç eylemlerinin görüneceğini ve hangi sırada görüneceğini özelleştirin.",
"entries-title": "Güç eylemleri",
"entry-settings-command-description": "Bu işlem için yürütülecek özel komut. Varsayılan sistem komutunu kullanmak için boş bırakın.",
"entry-settings-command-placeholder": "systemctl poweroff",
"entry-settings-command-placeholder": "örn. systemctl poweroff",
"entry-settings-default-command-lock": "Dahili kilit ekranı (komut yok)",
"entry-settings-default-command-logout": "Dahili oturum kapatma (komut yok)",
"entry-settings-default-info-description": "Özel bir komut belirtilmezse, varsayılan sistem komutu kullanılır.",
"entry-settings-default-info-label": "Varsayılan komut",
"entry-settings-keybind-description": "Oturum menüsü açıkken bu eylemi tetiklemek için bir tuş kombinasyonu atayın.",
"entry-settings-keybind-placeholder": "Bir tuş atamak için Kaydet'e basın...",
"entry-settings-keybind-recording": "Kaydediliyor... Herhangi bir tuş kombinasyonuna basın",
"entry-settings-title": "{entry} yapılandır",
"entry-settings-tooltip": "Yapılandırma komutu",
"general-desc": "Oturum menüsü panelinin davranışını ve görünümünü yapılandırın.",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "Kritik renk",
"custom-highlight-colors-title-label": "Özel vurgulama renkleri",
"disk-available-label": "Kullanılabilir disk alanı",
"disk-section-label": "Disk kullanımı",
"enable-dgpu-monitoring-description": "Uyarı: Bu, ayrık GPU'nuzu (NVIDIA/AMD) uyandıracak ve bu da hibrit grafiklere sahip dizüstü bilgisayarlarda pil ömrünü önemli ölçüde etkileyebilir.",
"enable-dgpu-monitoring-label": "Ayrık GPU izlemeyi etkinleştir",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "Ayarlar düzenini seçin (yeniden açılması gerekebilir).",
"settings-panel-mode-label": "Ayarlar paneli modu",
"shadows-description": "Çubukların ve panellerin altında gölgelerin etkinleştirilmesini sağlar.",
"shadows-direction-description": "Gölgenin hangi yönden verileceğini seçin.",
"shadows-direction-description": "Gölgenin nereye düşeceğini seçin.",
"shadows-direction-label": "Gölge yönü",
"shadows-label": "Gölge efektleri",
"title": "Kullanıcı arayüzü",
@@ -1357,7 +1486,7 @@
"automation-change-mode-alphabetical": "Alfabetik",
"automation-change-mode-description": "Otomatik değiştirirken duvar kâğıtlarının nasıl seçileceğini seçin.",
"automation-change-mode-label": "Değiştirme modu",
"automation-custom-interval-description": "Zamanı SS:DD olarak girin (örn., 01:30).",
"automation-custom-interval-description": "Zamanı SS:DD olarak girin (örn. 01:30).",
"automation-custom-interval-label": "Özel aralık",
"automation-interval-description": "Duvar kâğıtlarının otomatik değiştirilme sıklığını belirleyin.",
"automation-interval-label": "Duvar kâğıdı aralığı",
@@ -1386,6 +1515,10 @@
"settings-monitor-specific-description": "Her ekran için farklı bir duvar kâğıdı klasörü ayarlayın.",
"settings-monitor-specific-label": "Ekrana özgü dizinler",
"settings-monitor-specific-tooltip": "Ekrana özgü duvar kâğıdı klasörü",
"settings-overview-blur-strength-description": "Genel bakışa bulanıklık gücünü uygular.",
"settings-overview-blur-strength-label": "Genel bakış bulanıklık gücü",
"settings-overview-tint-description": "Ton gücünü genel bakışa uygular.",
"settings-overview-tint-label": "Genel Bakış ton gücü",
"settings-recursive-search-description": "Duvar kâğıdı dizinin alt klasörlerinde de duvar kâğıdı arayın.",
"settings-recursive-search-label": "Alt klasörleri ara",
"settings-select-monitor-folder": "Ekran duvar kâğıdı klasörünü seç",
@@ -1407,11 +1540,11 @@
"enter-command": "Çalıştırılacak komutu girin (uygulama veya özel komut)",
"enter-ipc-identifier": "IPC komutları için benzersiz bir tanımlayıcı girin",
"enter-path": "Yolu girin...",
"enter-text-to-collapse": "örn., 'nothing is playing'. Desenler için /regex/ kullanın.",
"enter-text-to-collapse": "örn. 'nothing is playing'. Desenler için /regex/ kullanın.",
"enter-tooltip": "Araç ipucunu girin",
"enter-width-pixels": "Genişliği piksel olarak girin",
"search": "Ara...",
"search-icons": "örn., noctalia, niri, battery, cloud",
"search-icons": "örn. noctalia, niri, battery, cloud",
"search-launcher": "Girişleri arayın... veya > komutları için kullanın",
"search-wallhaven": "Wallhaven'da ara...",
"search-wallpapers": "Duvar kâğıtlarını filtrelemek için yazın..."
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "Tamamlandı!",
"appearance": {
"subheader": "Dark Mode'u ve renk kaynaklarını seçin (Duvar kağıdı veya önceden tanımlı)."
"subheader": "Koyu modu ve renk kaynaklarını (duvar kağıdı veya önceden tanımlanmış) seçin."
},
"customize": {
"header": "Deneyiminizi özelleştirin",
@@ -1449,7 +1582,7 @@
},
"skip-setup": "Kurulumu Atla",
"telemetry-wizard-done": "Anlaşıldı!",
"telemetry-wizard-note": "Kontrol sizde — istediğiniz zaman Ayarlar'dan etkinleştirebilir veya devre dışı bırakabilirsiniz",
"telemetry-wizard-note": "Kontrol sizde — istediğiniz zaman ayarlar'dan etkinleştirebilir veya devre dışı bırakabilirsiniz",
"telemetry-wizard-subtitle": "Noctalia'yı geliştirmeye yardımcı olmak için anonim analizler ekledik",
"telemetry-wizard-title": "Gizlilik Güncellemesi",
"wallpaper": {
@@ -1490,7 +1623,7 @@
"disk": "Disk",
"download-speed": "İndirme hızı",
"gpu-temp": "GPU sıcaklığı",
"load-average": "Ort. yük",
"load-average": "Ortalama yük",
"title": "Sistem i̇zleyici",
"upload-speed": "Yükleme hızı"
},
@@ -1499,8 +1632,10 @@
"title": "Uçak modu"
},
"battery": {
"critical": "Kritik pil seviyesi",
"critical-desc": "Pil {percent}% — lütfen şarj cihazını hemen bağlayın",
"low": "Düşük batarya",
"low-desc": "Batarya % {percent}. Lütfen şarj bağlantısını yapın"
"low-desc": "Pil {percent}% seviyesinde — lütfen şarj cihazını bağlayın"
},
"bluetooth": {
"address-copied": "Adres panoya kopyalandı",
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "Disk",
"fade": "Belirsizleşme",
"honeycomb": "Petek",
"pixelate": "Pikselleştir",
"stripes": "Çizgiler",
"wipe": "Silme"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "Duvar kâğıtları yükleniyor...",
"no-results": "Duvar kâğıdı bulunamadı. Farklı bir arama sorgusu deneyin.",
"page": "{current} / {total}"
"page": "{current} / {total}",
"page-prefix": "Sayfa",
"page-suffix": "{total} taneden"
}
},
"weather": {
+186 -47
View File
@@ -48,11 +48,16 @@
"device-default": "Пристрій відображення за замовчуванням",
"device-description": "Виберіть пристрій з акумулятором для відображення.",
"device-label": "Пристрій живлення від батареї",
"display-mode-description": "Виберіть, як відображається батарея на панелі.",
"display-mode-graphic": "Графічна батарея",
"display-mode-graphic-clean": "Графічна батарея (без %)",
"display-mode-icon-always": "Іконка - Завжди показувати %",
"display-mode-icon-hover": "Іконка - Показувати при наведенні",
"display-mode-icon-only": "Лише значок",
"hide-if-idle-description": "Приховати віджет, коли акумулятор не заряджається та не розряджається.",
"hide-if-idle-label": "Приховати, коли неактивний",
"hide-if-not-detected-description": "Приховати віджет, коли в системі не виявлено акумулятор.",
"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",
@@ -75,8 +80,6 @@
"use-custom-font-label": "Використовувати власний шрифт",
"use-monospaced-font-description": "Коли увімкнено, годинник використовуватиме моноширинний шрифт.",
"use-monospaced-font-label": "Використовувати моноширинний шрифт",
"use-primary-color-description": "Коли увімкнено, застосовується основний колір для акценту.",
"use-primary-color-label": "Використовувати основний колір",
"vertical-bar-description": "Використовуйте пробіл для розділення кожної частини на новий рядок.",
"vertical-bar-label": "Вертикальна панель"
},
@@ -94,7 +97,6 @@
"collapse-condition-description": "Якщо вихідний текст збігається з цим значенням, кнопка згорнеться.",
"collapse-condition-label": "Умова згортання",
"color-selection-description": "Застосувати кольори теми до значка та тексту.",
"color-selection-label": "Вибрати колір",
"display-command-output-description": "Введіть команду для запуску з регулярним інтервалом. Перший рядок її виведення відображатиметься як текст.",
"display-command-output-label": "Відображати виведення команди",
"display-command-output-stream-description": "Введіть команду для безперервного запуску.",
@@ -182,7 +184,9 @@
"hide-widget-when-zero-unread-description": "Приховувати значок сповіщень, якщо немає непрочитаних.",
"hide-widget-when-zero-unread-label": "Приховувати значок без непрочитаних",
"show-unread-badge-description": "Відображати значок з кількістю непрочитаних сповіщень.",
"show-unread-badge-label": "Показувати значок непрочитаних"
"show-unread-badge-label": "Показувати значок непрочитаних",
"unread-badge-color-description": "Виберіть колір для значка непрочитаних сповіщень.",
"unread-badge-color-label": "Колір значка непрочитаних"
},
"section-editor": {
"placeholder": "Виберіть віджет для додавання...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "Відображати статистику у вигляді міні-діаграм замість текстових значень. Запобігає зсуву макета.",
"compact-mode-label": "Компактний режим",
"cpu-frequency-description": "Відобразити поточну тактову частоту CPU у ГГц.",
"cpu-frequency-label": "Показати частоту CPU",
"cpu-temperature-description": "Показувати показники температури ЦП, якщо доступно.",
"cpu-temperature-label": "Температура ЦП",
"cpu-usage-description": "Відображати поточний відсоток використання ЦП.",
@@ -209,6 +215,10 @@
"memory-usage-label": "Використання пам'яті",
"network-traffic-description": "Відображати швидкість прийому та передачі даних.",
"network-traffic-label": "Мережевий трафік",
"storage-as-percentage-description": "Показувати місце на диску у відсотках замість абсолютних значень.",
"storage-as-percentage-label": "Диск у відсотках",
"storage-available-description": "Показує, скільки місця на диску доступно, замість того, скільки використовується.",
"storage-available-label": "Доступне місце на диску",
"storage-usage-description": "Показувати інформацію про використання дискового простору.",
"storage-usage-label": "Використання сховища",
"swap-usage-description": "Показати використання swap-пам'яті.",
@@ -240,6 +250,8 @@
"title-width-reset-tooltip": "Скинути ширину заголовка"
},
"tray": {
"chevron-color-description": "Застосувати кольори теми до іконки шеврона шухляди.",
"chevron-color-label": "Колір стрілки",
"colorize-icons-description": "Застосувати кольори теми до значків трея.",
"colorize-icons-label": "Розфарбувати значки",
"drawer-enabled-description": "Коли увімкнено, не закріплені елементи трея відображаються на панелі ящика.<br>Коли вимкнено, всі елементи трея відображаються в рядку.",
@@ -248,14 +260,17 @@
"hide-passive-label": "Приховати пасивні предмети"
},
"volume": {
"display-mode-description": "Виберіть, як ви хочете, щоб це значення відображалося.",
"display-mode-label": "Режим відображення"
"display-mode-description": "Виберіть, як ви хочете, щоб це значення відображалося."
},
"workspace": {
"character-count-description": "Кількість символів для відображення з назв робочих просторів (1-10).",
"character-count-label": "Кількість символів",
"empty-color-description": "Встановити колір фону для порожніх Workspace.",
"empty-color-label": "Колір порожнього робочого столу",
"enable-scrollwheel-description": "Перемикайтеся між робочими столами за допомогою коліщатка миші.",
"enable-scrollwheel-label": "Прокрутіть, щоб перемикати робочі простори",
"focused-color-description": "Встановити колір тла для сфокусованого Workspace.",
"focused-color-label": "Колір сфокусованого робочого столу",
"follow-focused-screen-description": "Відображати робочі простори з поточного активного екрана, а не з екрана, на якому розташована панель.",
"follow-focused-screen-label": "Слідувати за активним eкраном",
"grouped-border-opacity-description": "Встановити рівень непрозорості для меж контейнерів робочої області.",
@@ -264,8 +279,16 @@
"hide-unoccupied-label": "Приховати незайняті",
"label-mode-description": "Виберіть, як відображаються мітки робочих просторів.",
"label-mode-label": "Режим міток",
"occupied-color-description": "Встановити колір фону для зайнятих Workspace.",
"occupied-color-label": "Колір зайнятого робочого столу",
"pill-size-description": "Налаштуйте розмір пігулок робочого простору (50%-100%).",
"pill-size-label": "Розмір капсули",
"reverse-scrolling-description": "Змінити напрямок перемикання робочих просторів під час прокручування.",
"reverse-scrolling-label": "Зворотне прокручування",
"show-applications-description": "Відображати значки програм у кожному робочому просторі.",
"show-applications-label": "Показати застосунки",
"show-badge-description": "Показувати значок номера робочого столу в згрупованому режимі.",
"show-badge-label": "Показати значок робочого столу",
"show-labels-only-when-occupied-description": "Показувати мітки робочих просторів лише тоді, коли вони містять вікна.",
"show-labels-only-when-occupied-label": "Показувати мітки лише коли поле заповнене",
"unfocused-icons-opacity-description": "Встановити рівень непрозорості для неактивних іконок застосунків.",
@@ -327,13 +350,6 @@
"version-new-user": "Нове встановлення"
}
},
"colors": {
"error": "Помилка",
"on-surface": "На поверхні",
"primary": "Первинний",
"secondary": "Вторинний",
"tertiary": "Третинний"
},
"common": {
"actions": "Дії",
"add": "Додати",
@@ -373,10 +389,13 @@
"disconnect": "Від'єднати",
"disconnected": "Від'єднано",
"disconnecting": "Від'єднання...",
"display-mode": "Режим відображення",
"download": "Завантажити",
"duration": "Тривалість",
"dysfunctional": "Дисфункціональний",
"edit": "Редагувати",
"enabled": "Увімкнено",
"error": "Помилка",
"events": "Події",
"execute": "Виконати",
"faithful": "Вірний",
@@ -395,6 +414,7 @@
"installed": "Встановлено",
"interface": "Інтерфейс",
"internet": "Інтернет",
"keybind": "Прив'язка клавіш",
"language": "Мова",
"loading": "Завантаження...",
"local": "Місцевий",
@@ -416,6 +436,7 @@
"not-found": "Не знайдено",
"notifications": "Сповіщення",
"official": "Офіційний",
"on-surface": "На поверхні",
"output": "Вихід",
"pair": "Спарувати",
"paired": "Спаровано",
@@ -428,11 +449,14 @@
"polling": "Опитування",
"position": "Позиція",
"previous": "Попередній",
"primary": "Основний",
"random": "Випадковий",
"reboot": "Перезапустити",
"record": "Почати запис",
"refresh": "Оновити",
"required": "(обов'язково)",
"reset": "Скинути",
"reset-to-default": "Скинути за Замовчуванням",
"result-count": "{count} результат",
"result-count-plural": "{count} результати",
"resume": "Продовжити",
@@ -440,8 +464,12 @@
"scanning": "Сканування...",
"screen-corners": "Кути екрана",
"search": "Пошук",
"secondary": "Вторинний",
"security": "Безпека",
"select": "Вибрати",
"select-color": "Вибрати колір",
"select-color-description": "Застосувати кольори теми для виділення.",
"select-icon-color": "Вибрати колір значка",
"shortcuts": "Ярлики",
"shutdown": "Вимкнути",
"signal": "Сигнал",
@@ -449,8 +477,10 @@
"sources": "Джерела",
"start": "Почати",
"stop": "Зупиніться",
"supporters": "Прихильники",
"suspend": "Призупинити",
"templates": "Шаблони",
"tertiary": "Третинний",
"test": "Тест",
"thresholds": "Порогові значення",
"title": "Назва",
@@ -473,6 +503,7 @@
"week": "Тиждень",
"widgets": "Віджети",
"width": "Ширина",
"windows": "Вікна",
"yes": "Так"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "При наведенні"
},
"hide-modes": {
"auto-hide": "Автоматичне приховування",
"hidden": "Приховувати, коли порожньо",
"idle": "Приховувати, коли неактивний",
"non-exclusive": "Неексклюзивний",
"transparent": "Прозорий, коли порожній",
"visible": "Завжди видимий"
},
@@ -543,7 +576,9 @@
"emoji-loading": "Завантаження емодзі...",
"emoji-loading-description": "Зачекайте, будь ласка",
"emoji-no-recent": "Немає нещодавніх емодзі",
"emoji-search-description": "Пошук і копіювання емодзі"
"emoji-search-description": "Пошук і копіювання емодзі",
"settings-search-description": "Пошук та перехід до налаштувань",
"windows-search-description": "Пошук і фокусування відкритих вікон"
}
},
"lock-screen": {
@@ -579,13 +614,26 @@
"density-compact": "Компактний",
"density-default": "Стандартний",
"density-mini": "Міні",
"density-spacious": "Просторий"
"density-spacious": "Просторий",
"display-mode-always-visible": "Завжди видимий",
"type-floating": "Плаваючий",
"type-framed": "У рамці",
"type-simple": "Простий"
},
"control-center": {
"quick-settings-style-classic": "Класичний",
"quick-settings-style-modern": "Сучасний"
},
"frame-rates-fps": "{fps} к/с",
"launcher-density": {
"comfortable": "Комфортний",
"compact": "Компактний",
"default": "За замовчуванням"
},
"launcher-view-mode": {
"grid": "Сітка",
"list": "Список"
},
"scrolling-modes": {
"always": "Завжди прокручувати",
"hover": "Прокручувати при наведенні",
@@ -616,8 +664,9 @@
},
"panels": {
"about": {
"become-supporter": "Стати прихильником",
"changelog": "Переглянути журнал змін",
"contributors-desc": "Подяка нашому {count} <b>чудовому</b> учаснику!",
"contributors-description": "Подяка нашому {count} <b>чудовому</b> учаснику!",
"contributors-description-plural": "Подяка нашим {count} <b>чудовим</b> учасникам!",
"copy-info": "Копіювати інформацію",
"info-copied": "Інформацію скопійовано до буфера обміну",
@@ -628,10 +677,14 @@
"noctalia-title": "Оболонка Noctalia",
"privacy-policy": "Політика конфіденційності",
"support": "Підтримати нас",
"supporter-badge": "Прихильник",
"supporters-desc": "Величезне дякую нашому чудовому прихильнику!",
"supporters-desc-plural": "Величезна подяка нашим <b>{count} чудовим</b> прихильникам!",
"supporters-loading": "Завантаження прихильників...",
"system-cpu": "ЦП:",
"system-disk": "Диск:",
"system-gpu": "GPU:",
"system-host": "Ведучий:",
"system-host": "хост:",
"system-install-hint": "Встановіть fastfetch для перегляду інформації про систему",
"system-kernel": "Ядро:",
"system-loading": "Завантаження системної інформації...",
@@ -692,21 +745,33 @@
"volumes-output-volume-description": "Системний рівень гучності.",
"volumes-step-size-description": "Налаштуйте крок зміни гучності (колесо миші, гарячі клавіші).",
"volumes-step-size-label": "Крок зміни гучності",
"volumes-volume-feedback-description": "Відтворювати звук зворотного зв'язку під час регулювання гучності",
"volumes-volume-feedback-description": "Відтворювати звук зворотного зв'язку під час регулювання гучності.",
"volumes-volume-feedback-label": "Відтворити звук зворотного зв'язку гучності",
"volumes-volume-overdrive-description": "Дозволити підвищення гучності понад 100%. Може не підтримуватись усім обладнанням.",
"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-color-description": "Виберіть колір для капсул панелі або не використовуйте жодного для стандартного кольору поверхні.",
"appearance-capsule-color-label": "Колір капсули",
"appearance-capsule-opacity-description": "Встановити рівень непрозорості для фону віджетів, коли показано капсулу.",
"appearance-capsule-opacity-label": "Непрозорість капсули",
"appearance-density-description": "Налаштуйте відступи панелі для компактного або просторого вигляду.",
"appearance-density-label": "Щільність панелі",
"appearance-desc": "Налаштуйте зовнішній вигляд та положення панелі.",
"appearance-display-mode-description": "Виберіть, коли панель видима.",
"appearance-floating-description": "Відображати панель як плаваючу 'капсулу'. Примітка: Це перемістить кути екрана до країв.",
"appearance-floating-label": "Плаваюча панель (Острівець)",
"appearance-frame-radius": "Внутрішній радіус",
"appearance-frame-settings-description": "Налаштуйте товщину рамки та внутрішній радіус кутів",
"appearance-frame-settings-label": "Налаштування рамки",
"appearance-frame-thickness": "Товщина",
"appearance-hide-on-overview-description": "Приховати панель і закрити панелі, коли активний огляд компонувальника.",
"appearance-hide-on-overview-label": "Приховати панель на огляді",
"appearance-margins-description": "Налаштуйте поля навколо плаваючої панелі.",
@@ -721,6 +786,8 @@
"appearance-show-capsule-label": "Показувати капсулу",
"appearance-show-outline-description": "Відображає видиму рамку навколо кожного віджета.",
"appearance-show-outline-label": "Показувати контури віджетів",
"appearance-type-description": "Виберіть стиль панелі: Простий, Плаваючий або У рамці.",
"appearance-type-label": "Тип панелі",
"appearance-use-separate-opacity-description": "Увімкнути використання окремого значення прозорості для фону панелі.",
"appearance-use-separate-opacity-label": "Використовувати окрему прозорість стовпців",
"monitor-configure-widgets": "Налаштувати віджети",
@@ -734,7 +801,7 @@
"title": "Панель",
"tray-blacklist-description": "Додайте правила виключення з трея, підтримує шаблони (*).",
"tray-blacklist-label": "Чорний список",
"tray-blacklist-placeholder": "напр., nm-applet, Fcitx*",
"tray-blacklist-placeholder": "напр. nm-applet, Fcitx*",
"tray-pin-application": "Закріпити застосунок",
"tray-unpin-application": "Відкріпити застосунок",
"use-global-widgets": "Використовувати глобальні віджети",
@@ -770,6 +837,7 @@
"download-title": "Завантажити кольорові схеми",
"method-description": {
"content": "Схема Material Design з високоточною екстракцією кольорів, яка точно відповідає фактичним кольорам вихідного контенту.",
"dysfunctional": "Як Faithful, але вибирає другу за домінантністю колірну родину як основну.",
"faithful": "Намагається залишатися близьким до вихідного кольору, створюючи при цьому гармонійну палітру.",
"fruit-salad": "Схема Material Design, яка створює грайливу, яскраву палітру з різноманітними відтінками.",
"monochrome": "Схема Material Design, що використовує однотонну градацію сірого з мінімальним хроматичним вмістом.",
@@ -866,6 +934,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": "Увімкнути віджет погоди",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "Пошук моноширинного шрифту...",
"fonts-reset-scaling": "Скинути масштаб",
"fonts-title": "Шрифти",
"keybinds-description": "Налаштуйте глобальні клавіші навігації для панелей та запускача.",
"keybinds-down": "Перемістити вниз",
"keybinds-enter": "Підтвердити / Дія",
"keybinds-escape": "Закрити / Назад",
"keybinds-left": "Перемістити вліво",
"keybinds-right": "Перемістити вправо",
"keybinds-title": "Прив'язки Клавіш Навігації",
"keybinds-up": "Перемістити вгору",
"language-desc": "Виберіть бажану мову застосунку.",
"language-select-auto-detect": "Автоматично",
"language-select-description": "Виберіть мову інтерфейсу застосунку.",
@@ -972,7 +1058,9 @@
"screen-corners-solid-black-description": "Використовувати суцільний чорний колір замість кольору фону панелі.",
"screen-corners-solid-black-label": "Суцільні чорні кути",
"screen-corners-title": "Кути екрана",
"settings-copied": "Налаштування скопійовано до буфера обміну"
"settings-copied": "Налаштування скопійовано до буфера обміну",
"tab-basics": "Основи",
"tab-keybinds": "Гарячі Клавіші"
},
"hooks": {
"info-command-info-description": "• Команди виконуються через оболонку (sh -lc)<br>• Команди запускаються у фоні (відокремлено)<br>• Кнопки тестування виконують команди з поточними значеннями",
@@ -983,30 +1071,30 @@
"noctalia-started-placeholder": "напр. notify-send 'Noctalia завантажено'",
"performance-mode-disabled-description": "Команда для виконання при вимкненні режиму продуктивності Noctalia.",
"performance-mode-disabled-label": "Режим продуктивності вимкнено",
"performance-mode-disabled-placeholder": "напр., notify-send \"Продуктивність\" \"Режим вимкнено\"",
"performance-mode-disabled-placeholder": "напр. notify-send \"Продуктивність\" \"Режим вимкнено\"",
"performance-mode-enabled-description": "Команда для виконання при увімкненні режиму продуктивності Noctalia.",
"performance-mode-enabled-label": "Режим продуктивності увімкнено",
"performance-mode-enabled-placeholder": "напр., notify-send \"Продуктивність\" \"Режим увімкнено\"",
"performance-mode-enabled-placeholder": "напр. notify-send \"Продуктивність\" \"Режим увімкнено\"",
"screen-lock-description": "Команда для виконання при блокуванні екрана.",
"screen-lock-label": "Екран заблоковано",
"screen-lock-placeholder": "напр., notify-send \"Екран\" \"Заблоковано\"",
"screen-lock-placeholder": "напр. notify-send \"Екран\" \"Заблоковано\"",
"screen-unlock-description": "Команда для виконання при розблокуванні екрана.",
"screen-unlock-label": "Екран розблоковано",
"screen-unlock-placeholder": "напр., notify-send \"Екран\" \"Розблоковано\"",
"screen-unlock-placeholder": "напр. notify-send \"Екран\" \"Розблоковано\"",
"session-description": "Команда, що виконується перед вимкненням або перезавантаженням. Отримує тип дії як $1 (вимкнення/перезавантаження).",
"session-label": "Завершення сесії",
"session-placeholder": "наприклад, notify-send \"Session\" \"$1\"",
"session-placeholder": "напр. notify-send \"Session\" \"$1\"",
"system-hooks-desc": "Налаштуйте команди для виконання при системних подіях.",
"system-hooks-enable-description": "Увімкнути або вимкнути всі команди хуків.",
"system-hooks-enable-label": "Увімкнути хуки",
"system-hooks-title": "Системні хуки",
"theme-changed-description": "Команда для виконання при перемиканні теми між темним і світлим режимом.",
"theme-changed-label": "Тему змінено",
"theme-changed-placeholder": "напр., notify-send \"Тема\" \"Перемкнуто\"",
"theme-changed-placeholder": "напр. notify-send \"Тема\" \"Перемкнуто\"",
"title": "Хуки",
"wallpaper-changed-description": "Команда для виконання при зміні шпалер.",
"wallpaper-changed-label": "Шпалери змінено",
"wallpaper-changed-placeholder": "напр., notify-send \"Шпалери\" \"Змінено\""
"wallpaper-changed-placeholder": "напр. notify-send \"Шпалери\" \"Змінено\""
},
"indicator": {
"default-value": "За замовчуванням: {value}",
@@ -1016,7 +1104,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.",
@@ -1027,18 +1115,28 @@
"settings-clip-wrap-text-label": "Загорнути текст з буфера обміну",
"settings-clipboard-history-description": "Отримати доступ до раніше скопійованих елементів із лаунчера.",
"settings-clipboard-history-label": "Увімкнути історію буфера обміну",
"settings-custom-launch-prefix-description": "Додати префікс до команд запуску лаунчером (напр., 'runapp' для інтеграції з systemd).",
"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-custom-launch-prefix-description": "Додати префікс до команд запуску лаунчером (напр. 'runapp' для інтеграції з systemd).",
"settings-custom-launch-prefix-enabled-description": "Використовувати власний префікс для запуску застосунків замість стандартного методу.",
"settings-custom-launch-prefix-enabled-label": "Увімкнути користувацький префікс запуску",
"settings-custom-launch-prefix-label": "Користувацький префікс запуску",
"settings-density-description": "Налаштуйте розмір іконок програм і щільність Launcher.",
"settings-density-label": "Щільність",
"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": "Використовувати нативні іконки",
"settings-ignore-mouse-input-description": "Вимкнути взаємодію з мишею та коліщатко прокрутки в лаунчері.",
"settings-ignore-mouse-input-label": "Ігнорувати введення миші",
"settings-overlay-layer-description": "Відображати запускач на шарі накладання, над повноекранними вікнами. Коли увімкнено, запускач не буде прикріплено до панелі.",
"settings-overlay-layer-label": "Показувати над повноекранним режимом",
"settings-position-description": "Виберіть, де з'являється панель лаунчера.",
"settings-show-categories-description": "Показувати вкладки категорій для фільтрації додатків.",
"settings-show-categories-label": "Показувати категорії",
@@ -1046,10 +1144,12 @@
"settings-show-icon-background-label": "Показати фон іконки",
"settings-sort-by-usage-description": "Коли увімкнено, часто використовувані застосунки з'являються першими в списку.",
"settings-sort-by-usage-label": "Сортувати за використанням",
"settings-terminal-command-description": "Команда для запуску терміналу. Напр., 'kitty -e' або 'gnome-terminal --'.",
"settings-terminal-command-description": "Команда для запуску терміналу. Напр. 'kitty -e' або 'gnome-terminal --'.",
"settings-terminal-command-label": "Команда терміналу",
"settings-use-app2unit-description": "Використовує альтернативний метод запуску для кращого керування процесами застосунків і запобігання проблемам.",
"settings-use-app2unit-label": "Використовувати App2Unit для запуску застосунків",
"settings-view-mode-description": "Виберіть макет для записів Запускача.",
"settings-view-mode-label": "Режим перегляду",
"title": "Лаунчер"
},
"location": {
@@ -1066,12 +1166,12 @@
"date-time-show-events-description": "Відображати події на панелі календаря.",
"date-time-show-events-label": "Показувати події календаря",
"date-time-title": "Дата і час",
"date-time-use-analog-description": "Показувати аналоговий годинник на екрані календаря.",
"date-time-use-analog-description": "Показувати аналоговий годинник у вікні календаря.",
"date-time-use-analog-label": "Використовувати аналоговий годинник",
"date-time-week-numbers-description": "Відображати номер тижня року (напр., Тиждень 38) у календарі.",
"date-time-week-numbers-description": "Відображати номер тижня року (напр. тиждень 38) у календарі.",
"date-time-week-numbers-label": "Показувати номери тижнів",
"location-desc": "Отримуйте точну погоду та планування нічного світла, встановивши ваше розташування.",
"location-search-description": "напр., Торонто, ОН",
"location-search-description": "напр. Торонто, ОН",
"location-search-label": "Шукати розташування",
"location-search-placeholder": "Введіть назву місця",
"location-title": "Ваше розташування",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "Відображати погоду в календарі"
},
"lock-screen": {
"allow-password-with-fprintd-description": "Коли fprintd (автентифікація за відбитком пальця) активний, ця опція дозволяє входити в систему за допомогою пароля замість відбитка пальця.",
"allow-password-with-fprintd-label": "Дозволити вхід за паролем за допомогою fprintd",
"auto-start-auth-description": "Aвтоматично запускає автентифікацію за відбитком пальця без необхідності натискання клавіші або клацання кнопки.",
"auto-start-auth-label": "Автоматичний запуск автентифікації",
"clock-format-description": "Налаштуйте формат годинника, використовуючи токени синтаксису дати/часу.",
"clock-format-label": "Формат годинника",
"clock-style-analog": "Аналоговий",
"clock-style-custom": "Користувацький",
"clock-style-description": "Виберіть візуальний стиль годинника на Екрані блокування.",
"clock-style-digital": "Цифровий",
"clock-style-label": "Стиль Годинника",
"compact-lockscreen-description": "Показувати тільки поле входу та системні елементи керування, приховуючи віджети погоди та медіа.",
"compact-lockscreen-label": "Компактний екран блокування",
"lock-on-suspend-description": "Автоматично блокувати екран при призупиненні системи.",
"lock-on-suspend-label": "Блокувати при призупиненні",
"lock-screen-animations-description": "Увімкнути або вимкнути анімації екрана блокування.",
"lock-screen-animations-label": "Анімації Екрана Блокування",
"lock-screen-blur-strength-description": "Застосовує ефект розмиття до шпалер екрана блокування.",
"lock-screen-blur-strength-label": "Сила розмиття екрана блокування",
"lock-screen-tint-strength-description": "Застосовує накладання відтінку до шпалер екрана блокування.",
"lock-screen-tint-strength-label": "Інтенсивність тонування екрана блокування",
"monitors-desc": "Показати екран блокування на певних моніторах. За замовчуванням на всіх, якщо жоден не обрано.",
"show-hibernate-description": "Показувати опцію 'сплячий режим' в елементах керування живленням.",
"show-hibernate-label": "Показувати сплячий режим",
"show-session-buttons-description": "Дозволити доступ до налаштувань живлення з екрана блокування.",
@@ -1126,8 +1244,6 @@
"history-low-urgency-label": "Зберігати низьку терміновість в історії",
"history-normal-urgency-description": "Зберігати сповіщення з нормальним пріоритетом в історії.",
"history-normal-urgency-label": "Зберігати нормальну терміновість в історії",
"media-toast-description": "Показувати спливаюче повідомлення, коли змінюється стан відтворення медіа.",
"media-toast-label": "Медіа",
"monitors-desc": "Показувати сповіщення на певних моніторах. За замовчуванням на всіх, якщо не вибрано.",
"settings-always-on-top-description": "Відображати сповіщення поверх повноекранних вікон та інших шарів.",
"settings-background-opacity-description": "Налаштуйте непрозорість фону сповіщень.",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "Звуки сповіщень недоступні",
"sounds-volume-description": "Налаштуйте рівень гучності для звуків сповіщень.",
"sounds-volume-label": "Гучність звуку",
"toast-battery-description": "Показувати попередження, коли рівень заряду батареї падає нижче цього відсотка.",
"toast-battery-label": "Попередження про батарею",
"toast-desc": "Налаштуйте зовнішній вигляд і поведінку спливаючих повідомлень.",
"toast-keyboard-description": "Показувати сповіщення при зміні розкладки клавіатури.",
"toast-keyboard-label": "Розкладка клавіатури"
"toast-keyboard-label": "Розкладка клавіатури",
"toast-media-description": "Показувати спливаюче повідомлення, коли змінюється стан відтворення медіа.",
"toast-media-label": "Медіа"
},
"osd": {
"always-on-top-description": "Відображати екранну індикацію поверх повноекранних вікон та інших шарів.",
@@ -1202,16 +1322,20 @@
"types-volume-label": "Вихідна гучність"
},
"plugins": {
"auto-update": "Автоматичне оновлення плагінів",
"auto-update-description": "Автоматично оновлювати всі плагіни при запуску оболонки.",
"available-description": "Переглядайте та встановлюйте плагіни з налаштованих джерел.",
"available-label": "Доступні плагіни",
"available-no-plugins-description": "Перевірте вихідні коди вашого плагіна або оновіть список.",
"available-no-plugins-label": "Немає доступних плагінів",
"check-for-updates": "Перевірити оновлення",
"checking-for-updates": "Перевірка оновлень...",
"collision-already-installed": "Цей плагін вже встановлено",
"collision-custom-version-exists": "Вже встановлено власну версію з \"{source}\"",
"collision-official-version-exists": "Офіційна версія цього плагіна вже встановлена",
"filter-downloaded": "Завантажено",
"filter-not-downloaded": "Не завантажено",
"filter-tags-description": "Фільтрувати плагіни за категорією або статусом завантаження",
"filter-tags-description": "Фільтрувати плагіни за категорією або статусом завантаження.",
"filter-tags-label": "Теги",
"hot-reload-description": "Автоматично перезавантажувати плагіни при зміні їхніх файлів. Корисно для розробки плагінів.",
"hot-reload-label": "Гаряче перезавантаження (режим розробки)",
@@ -1245,6 +1369,7 @@
"sources-placeholder": "Мій крутий репозиторій",
"sources-remove-tooltip": "Видалити джерело плагіна",
"title": "Плагіни",
"translations-reloaded": "Переклади перезавантажено: {name}",
"uninstall-dialog-description": "Ви впевнені, що хочете видалити {plugin}? Це призведе до видалення всіх даних плагіна.",
"uninstall-dialog-title": "Видалити плагін",
"uninstall-error": "Не вдалося видалити: {error}",
@@ -1271,11 +1396,14 @@
"entries-desc": "Налаштувати, які дії живлення відображаються в меню сеансу та в якому порядку.",
"entries-title": "Дії живлення",
"entry-settings-command-description": "Спеціальна команда для виконання цієї дії. Залиште поле порожнім, щоб використовувати системну команду за замовчуванням.",
"entry-settings-command-placeholder": "systemctl poweroff",
"entry-settings-command-placeholder": "напр. systemctl poweroff",
"entry-settings-default-command-lock": "Внутрішній екран блокування (без команди)",
"entry-settings-default-command-logout": "Внутрішній вихід з системи (без команди)",
"entry-settings-default-info-description": "Якщо не вказано жодної власної команди, буде використано системну команду за замовчуванням.",
"entry-settings-default-info-label": "Команда за замовчуванням",
"entry-settings-keybind-description": "Призначте комбінацію клавіш для запуску цієї дії, коли меню сесії відкрито.",
"entry-settings-keybind-placeholder": "Натисніть Запис, щоб призначити клавішу...",
"entry-settings-keybind-recording": "Запис... Натисніть будь-яку комбінацію клавіш",
"entry-settings-title": "Налаштувати {entry}",
"entry-settings-tooltip": "Налаштувати команду",
"general-desc": "Налаштувати поведінку та зовнішній вигляд панелі меню сеансу.",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "Критичний колір",
"custom-highlight-colors-title-label": "Власні кольори підсвічування",
"disk-available-label": "Доступно місця на диску",
"disk-section-label": "Використання диска",
"enable-dgpu-monitoring-description": "Увага: Це розбудить ваш дискретний графічний процесор (NVIDIA/AMD), що може значно вплинути на час роботи акумулятора на ноутбуках з гібридною графікою.",
"enable-dgpu-monitoring-label": "Увімкнути моніторинг дискретного GPU",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "Виберіть макет налаштувань (може знадобитися перезапуск).",
"settings-panel-mode-label": "Режим панелі налаштувань",
"shadows-description": "Увімкнути тіні під панелями та смугами.",
"shadows-direction-description": "Виберіть, звідки падає тінь.",
"shadows-direction-description": "Виберіть, куди відкидається тінь.",
"shadows-direction-label": "Напрямок тіні",
"shadows-label": "Тіні",
"title": "Користувацький інтерфейс",
@@ -1357,7 +1486,7 @@
"automation-change-mode-alphabetical": "Алфавітний",
"automation-change-mode-description": "Виберіть, як вибираються шпалери при автоматичній зміні.",
"automation-change-mode-label": "Режим зміни",
"automation-custom-interval-description": "Введіть час як ГГ:ХХ (напр., 01:30).",
"automation-custom-interval-description": "Введіть час як ГГ:ХХ (напр. 01:30).",
"automation-custom-interval-label": "Власний інтервал",
"automation-interval-description": "Як часто автоматично змінювати шпалери.",
"automation-interval-label": "Інтервал шпалер",
@@ -1386,6 +1515,10 @@
"settings-monitor-specific-description": "Встановити різні теки шпалер для кожного монітора.",
"settings-monitor-specific-label": "Окремі теки для моніторів",
"settings-monitor-specific-tooltip": "Тека шпалер монітора",
"settings-overview-blur-strength-description": "Застосовує силу розмиття до огляду.",
"settings-overview-blur-strength-label": "Сила розмиття огляду",
"settings-overview-tint-description": "Застосовує інтенсивність відтінку до огляду.",
"settings-overview-tint-label": "Інтенсивність тонування огляду",
"settings-recursive-search-description": "Також шукати шпалери в підтеках теки шпалер.",
"settings-recursive-search-label": "Шукати в підтеках",
"settings-select-monitor-folder": "Вибрати теку шпалер монітора",
@@ -1407,11 +1540,11 @@
"enter-command": "Введіть команду для виконання (застосунок або власний скрипт)",
"enter-ipc-identifier": "Введіть унікальний ідентифікатор для команд IPC",
"enter-path": "Введіть шлях...",
"enter-text-to-collapse": "напр., 'нічого не відтворюється'. Використовуйте /regex/ для шаблонів.",
"enter-text-to-collapse": "напр. 'нічого не відтворюється'. Використовуйте /regex/ для шаблонів.",
"enter-tooltip": "Введіть підказку",
"enter-width-pixels": "Введіть ширину в пікселях",
"search": "Пошук...",
"search-icons": "напр., noctalia, niri, battery, cloud",
"search-icons": "напр. noctalia, niri, battery, cloud",
"search-launcher": "Пошук записів... або використовуйте > для команд",
"search-wallhaven": "Пошук у Wallhaven...",
"search-wallpapers": "Введіть для фільтрації шпалер..."
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "Готово!",
"appearance": {
"subheader": "Виберіть Dark Mode та джерела кольору (Шпалери або попередньо визначені)."
"subheader": "Виберіть темний режим і джерела кольорів (шпалери або попередньо визначені)."
},
"customize": {
"header": "Налаштуйте ваш досвід",
@@ -1490,7 +1623,7 @@
"disk": "Диск",
"download-speed": "Швидкість завантаження",
"gpu-temp": "Температура GPU",
"load-average": "Нaгр. ср.",
"load-average": "Середнє навантаження",
"title": "Системний монітор",
"upload-speed": "Швидкість завантаження"
},
@@ -1499,8 +1632,10 @@
"title": "Режим польоту"
},
"battery": {
"critical": "Критичний рівень заряду батареї",
"critical-desc": "Батарея заряджена на {percent}% — негайно підключіть зарядний пристрій",
"low": "Низький заряд батареї",
"low-desc": "Рівень заряду: {percent}%. Будь ласка, підключіть зарядний пристрій"
"low-desc": "Батарея заряджена на {percent}%будь ласка, підключіть зарядний пристрій"
},
"bluetooth": {
"address-copied": "Адресу скопійовано до буфера обміну",
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "Диск",
"fade": "Затухання",
"honeycomb": "Стільники",
"pixelate": "Пікселізувати",
"stripes": "Смуги",
"wipe": "Змітання"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "Завантаження шпалер...",
"no-results": "Шпалери не знайдено. Спробуйте інший пошуковий запит.",
"page": "{current} з {total}"
"page": "{current} з {total}",
"page-prefix": "Сторінка",
"page-suffix": "з {total}"
}
},
"weather": {
+183 -44
View File
@@ -48,19 +48,24 @@
"device-default": "默认(显示设备)",
"device-description": "选择要显示的电池设备。",
"device-label": "电池设备",
"hide-if-idle-description": "当电池未充电或放电时,隐藏小部件。",
"display-mode-description": "选择电池在任务栏中的显示方式。",
"display-mode-graphic": "图形化电池",
"display-mode-graphic-clean": "图形电池(无%",
"display-mode-icon-always": "图标 - 始终显示 %",
"display-mode-icon-hover": "图标 - 悬停时显示",
"display-mode-icon-only": "仅图标",
"hide-if-idle-description": "当电池空闲时(没有充电或者放电电流时),隐藏小部件。",
"hide-if-idle-label": "空闲时隐藏",
"hide-if-not-detected-description": "当系统未检测到电池时,隐藏该小部件。",
"hide-if-not-detected-label": "未检测到电池时隐藏",
"low-battery-threshold-description": "当电量低于此百分比时显示警告。",
"hide-if-not-detected-label": "未检测到电池时隐藏该小部件",
"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": "自定义字体",
@@ -75,8 +80,6 @@
"use-custom-font-label": "使用自定义字体",
"use-monospaced-font-description": "启用后,时钟将使用等宽字体。",
"use-monospaced-font-label": "使用等宽字体",
"use-primary-color-description": "启用后,将应用主颜色进行强调。",
"use-primary-color-label": "使用主颜色",
"vertical-bar-description": "使用空格将每个部分分隔到新行。",
"vertical-bar-label": "垂直栏"
},
@@ -94,7 +97,6 @@
"collapse-condition-description": "如果输出文本与此值匹配,按钮将折叠。",
"collapse-condition-label": "折叠条件",
"color-selection-description": "将主题颜色应用到图标和文本。",
"color-selection-label": "选择颜色",
"display-command-output-description": "输入一个定期运行的命令。其输出的第一行将显示为文本。",
"display-command-output-label": "显示命令输出",
"display-command-output-stream-description": "输入一个要持续运行的命令。",
@@ -182,7 +184,9 @@
"hide-widget-when-zero-unread-description": "没有未读通知时隐藏通知图标。",
"hide-widget-when-zero-unread-label": "无未读时隐藏图标",
"show-unread-badge-description": "显示一个用于展示未读通知数量的徽章。",
"show-unread-badge-label": "显示未读徽章"
"show-unread-badge-label": "显示未读徽章",
"unread-badge-color-description": "选择未读通知徽章的颜色。",
"unread-badge-color-label": "未读徽章颜色"
},
"section-editor": {
"placeholder": "选择要添加的小部件...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "将数据以条形图显示以防止布局偏移。",
"compact-mode-label": "紧凑模式",
"cpu-frequency-description": "显示当前 CPU 时钟速度(GHz)。",
"cpu-frequency-label": "显示 CPU 频率",
"cpu-temperature-description": "显示 CPU 温度(如果可用)。",
"cpu-temperature-label": "CPU 温度",
"cpu-usage-description": "以百分比显示当前 CPU 使用率",
@@ -209,6 +215,10 @@
"memory-usage-label": "内存使用率",
"network-traffic-description": "显示网络上传和下载速度。",
"network-traffic-label": "网络流量",
"storage-as-percentage-description": "以百分比而非绝对值显示磁盘空间。",
"storage-as-percentage-label": "磁盘百分比",
"storage-available-description": "显示可用磁盘空间,而非已用空间。",
"storage-available-label": "可用磁盘空间",
"storage-usage-description": "显示磁盘空间使用情况。",
"storage-usage-label": "存储用量",
"swap-usage-description": "显示 Swap 使用情况。",
@@ -240,6 +250,8 @@
"title-width-reset-tooltip": "重置标题宽度"
},
"tray": {
"chevron-color-description": "将主题颜色应用于抽屉的箭头图标。",
"chevron-color-label": "箭头颜色",
"colorize-icons-description": "将主题颜色应用到系统托盘图标。",
"colorize-icons-label": "着色图标",
"drawer-enabled-description": "启用时,未固定的托盘项显示在抽屉面板中。<br>禁用时,所有托盘项都内联显示。",
@@ -248,14 +260,17 @@
"hide-passive-label": "隐藏被动物品"
},
"volume": {
"display-mode-description": "选择您希望此值显示的方式。",
"display-mode-label": "显示模式"
"display-mode-description": "选择您希望此值显示的方式。"
},
"workspace": {
"character-count-description": "显示工作区名称的字符数量(1-10)。",
"character-count-label": "字符数量",
"empty-color-description": "设置空工作区的背景颜色。",
"empty-color-label": "空白工作区颜色",
"enable-scrollwheel-description": "使用鼠标滚轮切换工作区。",
"enable-scrollwheel-label": "滚动切换工作区",
"focused-color-description": "设置焦点 Workspace 的背景颜色。",
"focused-color-label": "聚焦工作区颜色",
"follow-focused-screen-description": "显示当前焦点屏幕的工作区,而不是任务栏所在屏幕的工作区。",
"follow-focused-screen-label": "跟随焦点屏幕",
"grouped-border-opacity-description": "设置工作区容器边框的不透明度级别。",
@@ -264,8 +279,16 @@
"hide-unoccupied-label": "隐藏未占用",
"label-mode-description": "选择工作区标签的显示方式。",
"label-mode-label": "标签模式",
"occupied-color-description": "设置已占用Workspace的背景颜色。",
"occupied-color-label": "已占用工作区颜色",
"pill-size-description": "调整工作区指示器的大小 (50%-100%)。",
"pill-size-label": "胶囊大小",
"reverse-scrolling-description": "滚动时反转工作区切换方向。",
"reverse-scrolling-label": "反转滚动",
"show-applications-description": "在每个工作区内显示应用程序图标。",
"show-applications-label": "显示应用程序",
"show-badge-description": "在分组模式下显示工作区编号徽章。",
"show-badge-label": "显示工作区徽章",
"show-labels-only-when-occupied-description": "仅在工作区包含窗口时显示工作区标签。",
"show-labels-only-when-occupied-label": "仅在被占用时显示标签",
"unfocused-icons-opacity-description": "设置未聚焦应用图标的不透明度级别。",
@@ -273,12 +296,12 @@
}
},
"battery": {
"battery-health": "电池健康",
"battery-health": "电池健康",
"battery-level": "电池电量",
"capacity-level": "容量:{level}",
"charging-rate": "充电速率:{rate} W",
"discharging-rate": "放电速率:{rate} W",
"health": "健康状况{percent}%",
"health": "电池健康:{percent}%",
"inhibit-idle-description": "保持系统唤醒。",
"no-battery-detected": "未检测到电池",
"plugged-in": "已接通电源",
@@ -327,13 +350,6 @@
"version-new-user": "全新安装"
}
},
"colors": {
"error": "错误色",
"on-surface": "背景之上",
"primary": "主要色",
"secondary": "次要色",
"tertiary": "第三色"
},
"common": {
"actions": "操作",
"add": "添加",
@@ -373,10 +389,13 @@
"disconnect": "断开连接",
"disconnected": "已断开连接",
"disconnecting": "正在断开连接...",
"display-mode": "显示模式",
"download": "下载",
"duration": "时长",
"dysfunctional": "功能失调",
"edit": "编辑",
"enabled": "已启用",
"error": "错误",
"events": "事件",
"execute": "执行",
"faithful": "忠实",
@@ -395,6 +414,7 @@
"installed": "已安装",
"interface": "界面",
"internet": "互联网",
"keybind": "按键绑定",
"language": "语言",
"loading": "正在加载...",
"local": "本地",
@@ -416,6 +436,7 @@
"not-found": "未找到",
"notifications": "通知",
"official": "官方",
"on-surface": "在表面上",
"output": "输出",
"pair": "配对",
"paired": "已配对",
@@ -428,11 +449,14 @@
"polling": "数据轮询",
"position": "位置",
"previous": "上一个",
"primary": "主要的",
"random": "随机",
"reboot": "重启",
"record": "开始录制",
"refresh": "刷新",
"required": "(必要)",
"reset": "重置",
"reset-to-default": "重置为默认值",
"result-count": "{count} 结果",
"result-count-plural": "{count} 结果",
"resume": "继续",
@@ -440,8 +464,12 @@
"scanning": "扫描中...",
"screen-corners": "屏幕边角",
"search": "搜索",
"secondary": "辅助",
"security": "安全",
"select": "选择",
"select-color": "选择颜色",
"select-color-description": "应用主题颜色以示强调。",
"select-icon-color": "选择图标颜色",
"shortcuts": "快捷方式",
"shutdown": "关机",
"signal": "信号",
@@ -449,8 +477,10 @@
"sources": "来源",
"start": "开始",
"stop": "停止",
"supporters": "支持者",
"suspend": "挂起",
"templates": "模板",
"tertiary": "第三",
"test": "测试",
"thresholds": "阈值",
"title": "标题",
@@ -473,6 +503,7 @@
"week": "周",
"widgets": "小部件",
"width": "宽度",
"windows": "窗口",
"yes": "是"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "悬停时"
},
"hide-modes": {
"auto-hide": "自动隐藏",
"hidden": "当为空时隐藏",
"idle": "空闲时隐藏",
"non-exclusive": "非独占",
"transparent": "空时透明",
"visible": "始终可见"
},
@@ -543,7 +576,9 @@
"emoji-loading": "正在加载表情符号...",
"emoji-loading-description": "请稍候",
"emoji-no-recent": "尚无最近使用的表情符号",
"emoji-search-description": "搜索和复制表情符号"
"emoji-search-description": "搜索和复制表情符号",
"settings-search-description": "搜索并前往设置",
"windows-search-description": "搜索并聚焦打开的窗口"
}
},
"lock-screen": {
@@ -579,13 +614,26 @@
"density-compact": "紧凑",
"density-default": "默认",
"density-mini": "迷你",
"density-spacious": "宽敞"
"density-spacious": "宽敞",
"display-mode-always-visible": "始终可见",
"type-floating": "悬浮",
"type-framed": "边框",
"type-simple": "简约"
},
"control-center": {
"quick-settings-style-classic": "经典",
"quick-settings-style-modern": "现代"
},
"frame-rates-fps": "{fps} FPS",
"launcher-density": {
"comfortable": "舒适",
"compact": "紧凑",
"default": "默认"
},
"launcher-view-mode": {
"grid": "网格",
"list": "列表"
},
"scrolling-modes": {
"always": "始终滚动",
"hover": "悬停时滚动",
@@ -616,8 +664,9 @@
},
"panels": {
"about": {
"become-supporter": "成为支持者",
"changelog": "查看更改日志",
"contributors-desc": "向我们 {count} 位<b>超棒的</b>贡献者致敬!",
"contributors-description": "向我们 {count} 位<b>超棒的</b>贡献者致敬!",
"contributors-description-plural": "向我们 {count} 位<b>超棒的</b>贡献者致敬!",
"copy-info": "复制信息",
"info-copied": "信息已复制到剪贴板",
@@ -628,6 +677,10 @@
"noctalia-title": "Noctalia shell",
"privacy-policy": "隐私政策",
"support": "支持我们",
"supporter-badge": "支持者",
"supporters-desc": "非常感谢我们出色的支持者!",
"supporters-desc-plural": "非常感谢我们的<b>{count}位出色</b>支持者!",
"supporters-loading": "正在加载支持者...",
"system-cpu": "中央处理器:",
"system-disk": "磁盘:",
"system-gpu": "图形处理器:",
@@ -636,7 +689,7 @@
"system-kernel": "内核:",
"system-loading": "正在加载系统信息...",
"system-memory": "内存:",
"system-monitor": "监视器",
"system-monitor": "监视器",
"system-not-installed": "未安装 fastfetch",
"system-os": "操作系统:",
"system-packages": "软件包:",
@@ -692,21 +745,33 @@
"volumes-output-volume-description": "系统全局音量级别。",
"volumes-step-size-description": "调整音量变化的步长(滚轮、键盘快捷键)。",
"volumes-step-size-label": "音量步长",
"volumes-volume-feedback-description": "调整音量时播放反馈音效",
"volumes-volume-feedback-description": "调整音量时播放反馈音效",
"volumes-volume-feedback-label": "播放音量反馈",
"volumes-volume-overdrive-description": "允许将音量提高到100%以上。可能不被所有硬件支持。",
"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-color-description": "为栏胶囊选择一种颜色,或不使用任何颜色以采用默认表面颜色。",
"appearance-capsule-color-label": "胶囊颜色",
"appearance-capsule-opacity-description": "设置显示胶囊时小部件背景的不透明度。",
"appearance-capsule-opacity-label": "胶囊不透明度",
"appearance-density-description": "调整状态栏的内边距以获得紧凑或宽松的外观。",
"appearance-density-label": "状态栏密度",
"appearance-desc": "自定义状态栏的外观和位置。",
"appearance-display-mode-description": "选择栏何时可见。",
"appearance-floating-description": "将状态栏显示为浮动的“药丸”形状。",
"appearance-floating-label": "浮动状态栏",
"appearance-frame-radius": "内圆角",
"appearance-frame-settings-description": "调整边框粗细和内圆角半径",
"appearance-frame-settings-label": "边框设置",
"appearance-frame-thickness": "粗细",
"appearance-hide-on-overview-description": "当合成器概览处于活动状态时,隐藏栏并关闭面板。",
"appearance-hide-on-overview-label": "在概览中隐藏栏",
"appearance-margins-description": "调整浮动状态栏周围的边距。",
@@ -721,6 +786,8 @@
"appearance-show-capsule-label": "显示组件背景",
"appearance-show-outline-description": "在每个小部件周围显示可见边框。",
"appearance-show-outline-label": "显示小部件轮廓",
"appearance-type-description": "选择栏的样式:简约、悬浮或边框。",
"appearance-type-label": "栏类型",
"appearance-use-separate-opacity-description": "启用后为状态栏背景使用单独的不透明度值。",
"appearance-use-separate-opacity-label": "使用单独的状态栏不透明度",
"monitor-configure-widgets": "配置小部件",
@@ -770,6 +837,7 @@
"download-title": "下载配色方案",
"method-description": {
"content": "具有高保真色彩提取的 Material Design 方案,可与源内容的实际颜色紧密匹配。",
"dysfunctional": "与 Faithful 类似,但选择第二主导的颜色家族作为主要颜色。",
"faithful": "尝试在生成和谐调色板的同时,尽可能接近源颜色。",
"fruit-salad": "Material Design 方案,产生一个俏皮、充满活力的调色板,具有多样和变化的色调。",
"monochrome": "使用单色调灰阶和最少色彩内容的 Material Design 方案。",
@@ -866,6 +934,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": "启用天气小部件",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "搜索等宽字体...",
"fonts-reset-scaling": "恢复默认缩放",
"fonts-title": "字体",
"keybinds-description": "配置面板和启动器的全局导航键。",
"keybinds-down": "下移",
"keybinds-enter": "确认 / 操作",
"keybinds-escape": "关闭 / 返回",
"keybinds-left": "左移",
"keybinds-right": "右移",
"keybinds-title": "导航按键绑定",
"keybinds-up": "上移",
"language-desc": "选择您偏好的应用程序语言。",
"language-select-auto-detect": "自动检测",
"language-select-description": "选择应用程序界面中使用的语言。",
@@ -972,7 +1058,9 @@
"screen-corners-solid-black-description": "使用实心黑色而非状态栏背景色。",
"screen-corners-solid-black-label": "实心黑色边角",
"screen-corners-title": "屏幕边角",
"settings-copied": "设置已复制到剪贴板"
"settings-copied": "设置已复制到剪贴板",
"tab-basics": "基础",
"tab-keybinds": "按键绑定"
},
"hooks": {
"info-command-info-description": "• 命令通过 shell 执行(sh -lc<br>• 命令在后台运行(分离)<br>• 测试按钮使用当前值执行",
@@ -980,7 +1068,7 @@
"info-parameters-label": "可用参数",
"noctalia-started-description": "Noctalia 加载完成后要执行的命令。",
"noctalia-started-label": "Noctalia 已启动",
"noctalia-started-placeholder": "例如 notify-send 'Noctalia 已加载'",
"noctalia-started-placeholder": "例如notify-send 'Noctalia 已加载'",
"performance-mode-disabled-description": "禁用 Noctalia 性能模式时执行的命令。",
"performance-mode-disabled-label": "性能模式已禁用",
"performance-mode-disabled-placeholder": "例如:notify-send \"性能\" \"模式已禁用\"",
@@ -995,7 +1083,7 @@
"screen-unlock-placeholder": "例如:notify-send \"屏幕\" \"已解锁\"",
"session-description": "在关机或重启前执行的命令。接收操作类型作为 $1(关机/重启)。",
"session-label": "会话结束",
"session-placeholder": "例如notify-send \"Session\" \"$1\"",
"session-placeholder": "例如notify-send \"Session\" \"$1\"",
"system-hooks-desc": "配置在系统事件发生时执行的命令。",
"system-hooks-enable-description": "启用或禁用所有钩子命令。",
"system-hooks-enable-label": "启用钩子",
@@ -1018,7 +1106,7 @@
"execute-title": "执行",
"settings-annotation-tool-description": "点击剪贴板历史记录中的注释按钮时要运行的命令。图像将被管道传输到此命令。",
"settings-annotation-tool-label": "标注工具",
"settings-annotation-tool-placeholder": "例如 'gradia''satty -f -'",
"settings-annotation-tool-placeholder": "例如'gradia''satty -f -'",
"settings-auto-paste-description": "自动粘贴选定的剪贴板项目。需要 wtype。",
"settings-auto-paste-label": "自动粘贴",
"settings-clip-preview-description": "在使用 >clip 命令时显示剪贴板内容的预览。",
@@ -1027,18 +1115,28 @@
"settings-clip-wrap-text-label": "环绕剪贴板文本",
"settings-clipboard-history-description": "从启动器访问之前复制的项目。",
"settings-clipboard-history-label": "启用剪贴板历史记录",
"settings-custom-launch-prefix-description": "使用自定义启动器前缀命令(例如,'runapp'用于systemd集成)。",
"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-custom-launch-prefix-description": "使用自定义启动器前缀命令(例如:'runapp'用于systemd集成)。",
"settings-custom-launch-prefix-enabled-description": "使用自定义前缀启动应用程序,而不是默认方法。",
"settings-custom-launch-prefix-enabled-label": "启用自定义启动前缀",
"settings-custom-launch-prefix-label": "自定义启动前缀",
"settings-density-description": "调整应用程序图标大小和 Launcher 密度。",
"settings-density-label": "密度",
"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": "使用本地图标",
"settings-ignore-mouse-input-description": "禁用启动器中的鼠标交互和滚轮。",
"settings-ignore-mouse-input-label": "忽略鼠标输入",
"settings-overlay-layer-description": "在覆盖层上显示启动器,位于全屏窗口之上。启用时,启动器不会附加到栏。",
"settings-overlay-layer-label": "在全屏上方显示",
"settings-position-description": "选择启动器面板出现的位置。",
"settings-show-categories-description": "显示用于筛选应用程序的类别标签。",
"settings-show-categories-label": "显示类别",
@@ -1046,10 +1144,12 @@
"settings-show-icon-background-label": "显示图标背景",
"settings-sort-by-usage-description": "启用后,经常启动的应用程序将显示在列表首位。",
"settings-sort-by-usage-label": "按使用频率排序",
"settings-terminal-command-description": "启动终端的命令。例如'kitty -e'或'gnome-terminal --'。",
"settings-terminal-command-description": "启动终端的命令。例如'kitty -e'或'gnome-terminal --'。",
"settings-terminal-command-label": "终端命令",
"settings-use-app2unit-description": "使用替代启动方法以更好地管理应用程序进程并防止问题。",
"settings-use-app2unit-label": "使用 App2Unit 启动应用程序",
"settings-view-mode-description": "选择启动器条目的布局。",
"settings-view-mode-label": "视图模式",
"title": "启动器"
},
"location": {
@@ -1066,7 +1166,7 @@
"date-time-show-events-description": "在日历面板中显示事件。",
"date-time-show-events-label": "显示日历事件",
"date-time-title": "日期和时间",
"date-time-use-analog-description": "在日历窗口和锁定屏幕上显示模拟时钟。",
"date-time-use-analog-description": "在日历窗口上显示模拟时钟。",
"date-time-use-analog-label": "使用模拟时钟样式",
"date-time-week-numbers-description": "在日历中显示一年中的第几周(例如:第 38 周)。",
"date-time-week-numbers-label": "显示周数",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "在日历中显示天气"
},
"lock-screen": {
"allow-password-with-fprintd-description": "当 fprintd(指纹认证)处于活动状态时,此选项允许您使用密码而非指纹登录。",
"allow-password-with-fprintd-label": "允许使用 fprintd 进行密码登录",
"auto-start-auth-description": "自动启动指纹验证,无需按键或单击按钮。",
"auto-start-auth-label": "自动启动身份验证",
"clock-format-description": "使用日期/时间语法令牌自定义时钟格式。",
"clock-format-label": "时钟格式",
"clock-style-analog": "模拟",
"clock-style-custom": "自定义",
"clock-style-description": "选择锁屏时钟的视觉样式。",
"clock-style-digital": "数字",
"clock-style-label": "时钟样式",
"compact-lockscreen-description": "仅显示登录输入和系统控制,隐藏天气和媒体小部件。",
"compact-lockscreen-label": "紧凑型锁屏",
"lock-on-suspend-description": "系统挂起时自动锁定屏幕。",
"lock-on-suspend-label": "挂起时锁定",
"lock-screen-animations-description": "启用或禁用锁屏动画。",
"lock-screen-animations-label": "锁屏动画",
"lock-screen-blur-strength-description": "对锁屏壁纸应用模糊效果。",
"lock-screen-blur-strength-label": "锁屏模糊强度",
"lock-screen-tint-strength-description": "将色调叠加应用于锁屏壁纸。",
"lock-screen-tint-strength-label": "锁屏着色强度",
"monitors-desc": "在指定显示器上显示锁屏。如果未选择,则默认为所有显示器。",
"show-hibernate-description": "在电源控制中显示'休眠'选项。",
"show-hibernate-label": "显示休眠",
"show-session-buttons-description": "允许从锁屏访问电源设置。",
@@ -1126,8 +1244,6 @@
"history-low-urgency-label": "将低紧急度保存到历史记录",
"history-normal-urgency-description": "将正常优先级通知保存到历史记录。",
"history-normal-urgency-label": "将正常紧急度保存到历史记录",
"media-toast-description": "媒体播放状态改变时显示一个 Toast。",
"media-toast-label": "媒体",
"monitors-desc": "在特定显示器上显示通知。如果未选择,则默认为全部。",
"settings-always-on-top-description": "在全屏窗口和其他图层上方显示通知。",
"settings-background-opacity-description": "调整通知背景的透明度。",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "通知声音不可用",
"sounds-volume-description": "调整通知声音的音量级别。",
"sounds-volume-label": "声音音量",
"toast-battery-description": "当电池电量低于此百分比时显示警告。",
"toast-battery-label": "低电量警告",
"toast-desc": "配置气泡通知的外观和行为。",
"toast-keyboard-description": "键盘布局改变时显示一个 Toast。",
"toast-keyboard-label": "键盘布局"
"toast-keyboard-label": "键盘布局",
"toast-media-description": "媒体播放状态改变时显示一个 Toast。",
"toast-media-label": "媒体"
},
"osd": {
"always-on-top-description": "在全屏窗口和其他图层之上显示 OSD。",
@@ -1202,16 +1322,20 @@
"types-volume-label": "输出音量"
},
"plugins": {
"auto-update": "自动更新插件",
"auto-update-description": "在 shell 启动时自动更新所有插件。",
"available-description": "浏览并安装来自已配置源的插件。",
"available-label": "可用插件",
"available-no-plugins-description": "检查你的插件源或刷新列表。",
"available-no-plugins-label": "没有可用的插件",
"check-for-updates": "检查更新",
"checking-for-updates": "正在检查更新...",
"collision-already-installed": "此插件已安装",
"collision-custom-version-exists": "来自“{source}”的自定义版本已安装",
"collision-official-version-exists": "此插件的官方版本已安装",
"filter-downloaded": "已下载",
"filter-not-downloaded": "未下载",
"filter-tags-description": "按类别或下载状态筛选插件",
"filter-tags-description": "按类别或下载状态筛选插件",
"filter-tags-label": "标签",
"hot-reload-description": "当插件文件发生更改时自动重新加载插件。对插件开发很有用。",
"hot-reload-label": "热重载(开发模式)",
@@ -1245,6 +1369,7 @@
"sources-placeholder": "我的酷仓库",
"sources-remove-tooltip": "移除插件源",
"title": "插件",
"translations-reloaded": "已重新加载翻译:{name}",
"uninstall-dialog-description": "你确定要卸载 {plugin} 吗? 这将移除所有插件数据。",
"uninstall-dialog-title": "卸载插件",
"uninstall-error": "卸载失败:{error}",
@@ -1271,11 +1396,14 @@
"entries-desc": "自定义会话菜单中显示哪些电源操作及其顺序。",
"entries-title": "电源操作",
"entry-settings-command-description": "为此操作执行的自定义命令。留空则使用默认系统命令。",
"entry-settings-command-placeholder": "systemctl poweroff",
"entry-settings-command-placeholder": "例如:systemctl poweroff",
"entry-settings-default-command-lock": "内部锁屏(无命令)",
"entry-settings-default-command-logout": "内部注销(无命令)",
"entry-settings-default-info-description": "如果没有指定自定义命令,将使用默认的系统命令。",
"entry-settings-default-info-label": "默认命令",
"entry-settings-keybind-description": "当会话菜单打开时,分配一个按键组合来触发此操作。",
"entry-settings-keybind-placeholder": "按下录制以分配一个键...",
"entry-settings-keybind-recording": "录制中... 按任意组合键",
"entry-settings-title": "配置 {entry}",
"entry-settings-tooltip": "配置命令",
"general-desc": "配置会话菜单面板的行为和外观。",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "严重颜色",
"custom-highlight-colors-title-label": "自定义高亮颜色",
"disk-available-label": "可用磁盘空间",
"disk-section-label": "磁盘使用率",
"enable-dgpu-monitoring-description": "警告:这将唤醒您的独立显卡 (NVIDIA/AMD),这可能会显著影响配备混合显卡的笔记本电脑的电池续航时间。",
"enable-dgpu-monitoring-label": "启用独立显卡监控",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "选择「设置」面板的布局(可能需要重新打开「设置」面板才会生效)。",
"settings-panel-mode-label": "「设置」面板模式",
"shadows-description": "启用条形图和面板下的阴影。",
"shadows-direction-description": "选择阴影投射的方向。",
"shadows-direction-description": "选择阴影投射的位置。",
"shadows-direction-label": "阴影方向",
"shadows-label": "阴影",
"title": "用户界面",
@@ -1386,6 +1515,10 @@
"settings-monitor-specific-description": "为每个显示器设置不同的壁纸文件夹。",
"settings-monitor-specific-label": "显示器特定目录",
"settings-monitor-specific-tooltip": "显示器壁纸文件夹",
"settings-overview-blur-strength-description": "将模糊强度应用于概览。",
"settings-overview-blur-strength-label": "概览模糊强度",
"settings-overview-tint-description": "将着色强度应用到概览。",
"settings-overview-tint-label": "概览着色强度",
"settings-recursive-search-description": "同时在壁纸目录的子文件夹中搜索壁纸。",
"settings-recursive-search-label": "搜索子文件夹",
"settings-select-monitor-folder": "选择显示器壁纸文件夹",
@@ -1407,7 +1540,7 @@
"enter-command": "输入要执行的命令(应用程序或自定义脚本)",
"enter-ipc-identifier": "输入 IPC 命令的唯一标识符",
"enter-path": "输入路径...",
"enter-text-to-collapse": "例如“nothing is playing”。使用 /regex/ 表示匹配模式。",
"enter-text-to-collapse": "例如“nothing is playing”。使用 /regex/ 表示匹配模式。",
"enter-tooltip": "输入提示信息",
"enter-width-pixels": "输入宽度(像素)",
"search": "搜索...",
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "完成!",
"appearance": {
"subheader": "选择 Dark Mode 和颜色来源(壁纸或预定义)。"
"subheader": "选择深色模式和颜色来源(壁纸或预)。"
},
"customize": {
"header": "自定义体验",
@@ -1499,8 +1632,10 @@
"title": "飞行模式"
},
"battery": {
"critical": "电量严重不足",
"critical-desc": "电量仅剩 {percent}% — 请立即连接充电器",
"low": "电池电量低",
"low-desc": "电量仅剩 {percent}%,请插上充电器"
"low-desc": "电量仅剩 {percent}% — 请连接充电器"
},
"bluetooth": {
"address-copied": "地址已复制到剪贴板",
@@ -1546,7 +1681,7 @@
"noctalia-performance": {
"disabled": "性能模式已禁用",
"enabled": "已启用性能模式",
"label": "Noctalia 性能"
"label": "Noctalia 性能模式"
},
"power-profile": {
"changed": "电源模式已更改",
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "圆盘",
"fade": "淡入淡出",
"honeycomb": "蜂巢",
"pixelate": "像素化",
"stripes": "条纹",
"wipe": "擦除"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "正在加载壁纸...",
"no-results": "未找到壁纸。请尝试不同的搜索查询。",
"page": "{current} / {total}"
"page": "{current} / {total}",
"page-prefix": "页面",
"page-suffix": "共 {total} 个"
}
},
"weather": {
+168 -29
View File
@@ -48,11 +48,16 @@
"device-default": "預設 (顯示裝置)",
"device-description": "選取要顯示哪個裝置的電池",
"device-label": "電池裝置",
"display-mode-description": "選擇電池在工具列中的顯示方式。",
"display-mode-graphic": "圖形化電池",
"display-mode-graphic-clean": "圖形電池(無%",
"display-mode-icon-always": "圖示 - 始終顯示 %",
"display-mode-icon-hover": "圖示 - 懸停時顯示",
"display-mode-icon-only": "僅圖示",
"hide-if-idle-description": "當電池狀態為閒置時隱藏小工具",
"hide-if-idle-label": "閒置時隱藏",
"hide-if-not-detected-description": "如果系統沒有偵測到電池就隱藏小工具",
"hide-if-not-detected-label": "沒有偵測到時隱藏",
"low-battery-threshold-description": "在電池落到此百分比以下時顯示警告",
"low-battery-threshold-label": "低電量警告",
"show-noctalia-performance-description": "在電池面板內顯示 Noctalia 效能模式開關",
"show-noctalia-performance-label": "顯示 Noctalia 效能模式開關",
@@ -75,8 +80,6 @@
"use-custom-font-label": "使用自訂字型",
"use-monospaced-font-description": "當啟用時, 時鐘會使用等寬字型顯示",
"use-monospaced-font-label": "使用等寬字型",
"use-primary-color-description": "當啟用時, 會以主題的主色強調",
"use-primary-color-label": "使用主要顏色",
"vertical-bar-description": "使用空格把各個部件拆到下一行",
"vertical-bar-label": "垂直列顯示"
},
@@ -94,7 +97,6 @@
"collapse-condition-description": "若輸出文字符合此值,按鈕將會摺疊。",
"collapse-condition-label": "摺疊條件",
"color-selection-description": "將主題用色套用至圖示及文字上",
"color-selection-label": "選取顏色",
"display-command-output-description": "輸入一個想要定時重複執行的指令, 指令的第一行輸出將會作為顯示的文字",
"display-command-output-label": "顯示指令的輸出",
"display-command-output-stream-description": "輸入一個要持續執行的指令",
@@ -182,7 +184,9 @@
"hide-widget-when-zero-unread-description": "沒有未讀通知時隱藏通知圖示。",
"hide-widget-when-zero-unread-label": "沒有未讀通知時隱藏圖示",
"show-unread-badge-description": "顯示帶有數量的未讀標記",
"show-unread-badge-label": "顯示未讀標記"
"show-unread-badge-label": "顯示未讀標記",
"unread-badge-color-description": "選擇未讀通知徽章的顏色。",
"unread-badge-color-label": "未讀徽章顏色"
},
"section-editor": {
"placeholder": "選取一個小工具來新增...",
@@ -194,6 +198,8 @@
"system-monitor": {
"compact-mode-description": "用迷你長條來取代文字數值, 可以避免佈局跑版",
"compact-mode-label": "緊湊模式",
"cpu-frequency-description": "顯示目前 CPU 時脈速度(GHz)。",
"cpu-frequency-label": "顯示 CPU 頻率",
"cpu-temperature-description": "如果可用即顯示 CPU 溫度",
"cpu-temperature-label": "CPU 溫度",
"cpu-usage-description": "顯示現在 CPU 的使用百分比",
@@ -209,6 +215,10 @@
"memory-usage-label": "記憶體使用量",
"network-traffic-description": "顯示網路上傳及下載的速度",
"network-traffic-label": "網路流量",
"storage-as-percentage-description": "以百分比而非絕對值顯示磁碟空間。",
"storage-as-percentage-label": "磁碟百分比",
"storage-available-description": "顯示可用磁碟空間,而非已用空間。",
"storage-available-label": "可用磁碟空間",
"storage-usage-description": "顯示磁碟空間的使用量",
"storage-usage-label": "磁碟使用量",
"swap-usage-description": "顯示交換記憶體使用量",
@@ -240,6 +250,8 @@
"title-width-reset-tooltip": "重設標題寬度"
},
"tray": {
"chevron-color-description": "將主題顏色套用至抽屜的箭頭圖示。",
"chevron-color-label": "箭頭顏色",
"colorize-icons-description": "將系統夾圖示套用主題用色",
"colorize-icons-label": "為圖示上色",
"drawer-enabled-description": "當啟用時, 沒有釘選的系統匣圖示將會顯示在抽屜面板中<br>如果停用則所有的圖示都會在工具列裡顯示",
@@ -248,14 +260,17 @@
"hide-passive-label": "隱藏被動項目"
},
"volume": {
"display-mode-description": "選擇你想如何顯示這項數值",
"display-mode-label": "顯示模式"
"display-mode-description": "選擇你想如何顯示這項數值"
},
"workspace": {
"character-count-description": "限制工作區所設定的名字要顯示幾個字元 (1-10)",
"character-count-label": "字元上限",
"empty-color-description": "設定空白 Workspace 的背景顏色。",
"empty-color-label": "空白工作區顏色",
"enable-scrollwheel-description": "利用滑鼠滾輪在工作區間切換",
"enable-scrollwheel-label": "捲輪切換工作區",
"focused-color-description": "設定焦點 Workspace 的背景顏色。",
"focused-color-label": "聚焦的工作區顏色",
"follow-focused-screen-description": "顯示正在聚焦的螢幕所擁有的工作區, 而不是工具列所在的螢幕擁有的工作區",
"follow-focused-screen-label": "跟隨焦點所在的螢幕",
"grouped-border-opacity-description": "設定工作區邊框的不透明度",
@@ -264,8 +279,16 @@
"hide-unoccupied-label": "沒有佔用時隱藏",
"label-mode-description": "選擇工作區標籤該如何顯示",
"label-mode-label": "標籤樣式",
"occupied-color-description": "設定已佔用Workspace的背景顏色。",
"occupied-color-label": "已佔用工作區顏色",
"pill-size-description": "調整工作區指示器的大小 (50%-100%)。",
"pill-size-label": "膠囊大小",
"reverse-scrolling-description": "捲動時反轉工作區切換方向。",
"reverse-scrolling-label": "反轉捲動",
"show-applications-description": "顯示各個工作區的程式圖示",
"show-applications-label": "顯示應用程式",
"show-badge-description": "在群組模式下顯示工作區編號徽章。",
"show-badge-label": "顯示工作區標記",
"show-labels-only-when-occupied-description": "只在工作區有視窗時顯示工作區標籤",
"show-labels-only-when-occupied-label": "佔用時顯示標籤",
"unfocused-icons-opacity-description": "設定非焦點應用程式圖示的不透明度。",
@@ -327,13 +350,6 @@
"version-new-user": "全新安裝"
}
},
"colors": {
"error": "錯誤",
"on-surface": "工具列表面",
"primary": "主要色",
"secondary": "輔助色",
"tertiary": "三級色"
},
"common": {
"actions": "操作",
"add": "新增",
@@ -373,10 +389,13 @@
"disconnect": "斷線",
"disconnected": "已斷線",
"disconnecting": "正在斷線...",
"display-mode": "顯示模式",
"download": "下載",
"duration": "持續時間",
"dysfunctional": "功能失調",
"edit": "編輯",
"enabled": "已啟用",
"error": "錯誤",
"events": "事件",
"execute": "執行",
"faithful": "忠實",
@@ -395,6 +414,7 @@
"installed": "已安裝",
"interface": "介面",
"internet": "網際網路",
"keybind": "按鍵綁定",
"language": "語言",
"loading": "正在載入...",
"local": "本機",
@@ -416,6 +436,7 @@
"not-found": "找不到",
"notifications": "通知",
"official": "官方",
"on-surface": "在表面上",
"output": "輸出",
"pair": "配對",
"paired": "已配對",
@@ -428,11 +449,14 @@
"polling": "輪詢",
"position": "位置",
"previous": "上一首",
"primary": "主要的",
"random": "隨機",
"reboot": "重新啟動",
"record": "開始錄製",
"refresh": "重新整理",
"required": "(必要)",
"reset": "重設",
"reset-to-default": "重設為預設值",
"result-count": "{count} 筆結果",
"result-count-plural": "{count} 筆結果",
"resume": "繼續",
@@ -440,8 +464,12 @@
"scanning": "掃描中...",
"screen-corners": "畫面邊角",
"search": "搜尋",
"secondary": "輔助",
"security": "安全",
"select": "選取",
"select-color": "選擇顏色",
"select-color-description": "套用主題顏色以示強調。",
"select-icon-color": "選擇圖示顏色",
"shortcuts": "快捷鍵",
"shutdown": "關機",
"signal": "訊號",
@@ -449,8 +477,10 @@
"sources": "來源",
"start": "開始",
"stop": "停止",
"supporters": "支持者",
"suspend": "暫停",
"templates": "模板",
"tertiary": "第三",
"test": "測試",
"thresholds": "門檻",
"title": "標題",
@@ -473,6 +503,7 @@
"week": "週",
"widgets": "小工具",
"width": "寬度",
"windows": "視窗",
"yes": "是"
},
"control-center": {
@@ -492,8 +523,10 @@
"on-hover": "游標移過時"
},
"hide-modes": {
"auto-hide": "自動隱藏",
"hidden": "空白時隱藏",
"idle": "閒置時隱藏",
"non-exclusive": "非獨佔",
"transparent": "空白時變透明",
"visible": "始終可見"
},
@@ -543,7 +576,9 @@
"emoji-loading": "載入表情符號...",
"emoji-loading-description": "請稍候",
"emoji-no-recent": "還沒有最近使用的表情符號",
"emoji-search-description": "搜尋和複製表情符號"
"emoji-search-description": "搜尋和複製表情符號",
"settings-search-description": "搜尋並前往設定",
"windows-search-description": "搜尋並聚焦開啟的視窗"
}
},
"lock-screen": {
@@ -579,13 +614,26 @@
"density-compact": "緊湊",
"density-default": "預設",
"density-mini": "迷你",
"density-spacious": "寬敞"
"density-spacious": "寬敞",
"display-mode-always-visible": "永遠可見",
"type-floating": "懸浮",
"type-framed": "邊框",
"type-simple": "簡約"
},
"control-center": {
"quick-settings-style-classic": "古典",
"quick-settings-style-modern": "現代"
},
"frame-rates-fps": "{fps} FPS",
"launcher-density": {
"comfortable": "舒適",
"compact": "緊湊",
"default": "預設"
},
"launcher-view-mode": {
"grid": "網格",
"list": "列表"
},
"scrolling-modes": {
"always": "總是捲動",
"hover": "游標移過時捲動",
@@ -616,8 +664,9 @@
},
"panels": {
"about": {
"become-supporter": "成為支持者",
"changelog": "檢視更新日誌",
"contributors-desc": "特別感謝我們這{count}位<b>超讚</b>的貢獻者!!",
"contributors-description": "特別感謝我們這{count}位<b>超讚</b>的貢獻者!!",
"contributors-description-plural": "特別感謝我們這{count}位<b>超讚</b>的貢獻者!!",
"copy-info": "複製資訊",
"info-copied": "資訊已複製至剪貼簿",
@@ -628,6 +677,10 @@
"noctalia-title": "Noctalia Shell",
"privacy-policy": "隱私權政策",
"support": "支持我們",
"supporter-badge": "支持者",
"supporters-desc": "非常感謝我們出色的支持者!",
"supporters-desc-plural": "非常感謝我們的<b>{count}位出色</b>支持者!",
"supporters-loading": "正在載入支持者...",
"system-cpu": "CPU:",
"system-disk": "磁碟:",
"system-gpu": "GPU:",
@@ -698,15 +751,27 @@
"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-color-description": "為欄膠囊選擇一種顏色,或不使用任何顏色以採用預設表面顏色。",
"appearance-capsule-color-label": "膠囊顏色",
"appearance-capsule-opacity-description": "設定當啟用顯示小容器時小工具的背景不透明度",
"appearance-capsule-opacity-label": "小容器不透明度",
"appearance-density-description": "調整工具列的內部間距來做出緊湊或寬敞的外觀",
"appearance-density-label": "工具列密度",
"appearance-desc": "自訂工具列的外觀及位置",
"appearance-display-mode-description": "選擇列何時可見",
"appearance-floating-description": "將工具列以懸浮的圓弧長條狀顯示",
"appearance-floating-label": "懸浮工具列",
"appearance-frame-radius": "內圓角",
"appearance-frame-settings-description": "調整邊框粗細和內圓角半徑",
"appearance-frame-settings-label": "邊框設定",
"appearance-frame-thickness": "粗細",
"appearance-hide-on-overview-description": "當在合成器概覽時, 隱藏工具列並關閉面板",
"appearance-hide-on-overview-label": "概覽時隱藏工具列",
"appearance-margins-description": "調整懸浮工具列的邊距",
@@ -721,6 +786,8 @@
"appearance-show-capsule-label": "顯示小容器",
"appearance-show-outline-description": "讓每個小工具都顯示可視邊框",
"appearance-show-outline-label": "顯示小工具外框",
"appearance-type-description": "選擇欄的樣式:簡約、懸浮或邊框",
"appearance-type-label": "欄類型",
"appearance-use-separate-opacity-description": "啟用後可針對工具列背景使用分開的不透明度數值",
"appearance-use-separate-opacity-label": "分開設定工具列不透明度",
"monitor-configure-widgets": "設定小工具",
@@ -770,6 +837,7 @@
"download-title": "下載配色",
"method-description": {
"content": "具有高保真色彩提取的 Material Design 方案,可與來源內容的實際色彩緊密匹配。",
"dysfunctional": "與 Faithful 類似,但選擇第二主導的顏色家族作為主要顏色。",
"faithful": "嘗試在生成和諧調色盤的同時,盡可能接近來源顏色。",
"fruit-salad": "Material Design 配色方案,可產生一個俏皮、充滿活力的調色盤,具有多樣且多變的色調。",
"monochrome": "使用單一色調灰階和最少色彩內容的 Material Design 方案。",
@@ -866,6 +934,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": "啟用天氣小工具",
@@ -952,6 +1030,14 @@
"fonts-monospace-search-placeholder": "搜尋等寬字型...",
"fonts-reset-scaling": "重設文字大小",
"fonts-title": "字型",
"keybinds-description": "配置面板和啟動器的全域導航鍵。",
"keybinds-down": "下移",
"keybinds-enter": "確認 / 動作",
"keybinds-escape": "關閉 / 返回",
"keybinds-left": "向左移動",
"keybinds-right": "向右移動",
"keybinds-title": "導覽按鍵綁定",
"keybinds-up": "上移",
"language-desc": "選擇你偏好使用的語言",
"language-select-auto-detect": "自動選擇",
"language-select-description": "選擇要在應用程式所使用的介面語言",
@@ -972,7 +1058,9 @@
"screen-corners-solid-black-description": "使用黑色而不是工具列背景色",
"screen-corners-solid-black-label": "黑色邊角",
"screen-corners-title": "畫面邊角",
"settings-copied": "已複製設定至剪貼簿"
"settings-copied": "已複製設定至剪貼簿",
"tab-basics": "基礎",
"tab-keybinds": "按鍵綁定"
},
"hooks": {
"info-command-info-description": "• 指令將透過 shell (sh -lc) 執行<br>• 指令會在背景 (detached 狀態) 執行<br>• 測試按鈕會以當下填寫的內容執行",
@@ -980,7 +1068,7 @@
"info-parameters-label": "可用參數",
"noctalia-started-description": "Noctalia 完成載入時要執行的指令。",
"noctalia-started-label": "Noctalia 已啟動",
"noctalia-started-placeholder": "例如 notify-send 'Noctalia 已載入'",
"noctalia-started-placeholder": "例如: notify-send 'Noctalia 已載入'",
"performance-mode-disabled-description": "Noctalia 效能模式停用時要執行的指令",
"performance-mode-disabled-label": "效能模式停用時",
"performance-mode-disabled-placeholder": "例如: notify-send \"Performance\" \"Mode disabled\"",
@@ -1016,7 +1104,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 套件",
@@ -1027,18 +1115,28 @@
"settings-clip-wrap-text-label": "剪貼簿文字換行",
"settings-clipboard-history-description": "在啟動器存取先前所複製的項目",
"settings-clipboard-history-label": "啟用剪貼簿歷史",
"settings-custom-launch-prefix-description": "在命令前加上自訂啟動器前綴(例如:用「runapp」來整合 systemd)。",
"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-custom-launch-prefix-description": "在命令前加上自訂啟動器前綴(例如: 用「runapp」來整合 systemd)。",
"settings-custom-launch-prefix-enabled-description": "使用自訂前綴而不是預設的方式來啟動應用程式",
"settings-custom-launch-prefix-enabled-label": "啟用自訂的程式啟動前綴",
"settings-custom-launch-prefix-label": "自訂啟動前綴",
"settings-density-description": "調整應用程式圖示大小和 Launcher 密度。",
"settings-density-label": "密度",
"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": "使用原生圖示",
"settings-ignore-mouse-input-description": "對啟動器停用滑鼠互動及滾輪捲動",
"settings-ignore-mouse-input-label": "忽略滑鼠輸入",
"settings-overlay-layer-description": "在覆蓋層上顯示啟動器,位於全螢幕視窗之上。啟用時,啟動器不會附加到列。",
"settings-overlay-layer-label": "在全螢幕上方顯示",
"settings-position-description": "選擇啟動器面板要出現的地方",
"settings-show-categories-description": "顯示分類標籤來篩選應用程式",
"settings-show-categories-label": "顯示分類",
@@ -1050,6 +1148,8 @@
"settings-terminal-command-label": "終端機指令",
"settings-use-app2unit-description": "使用替代的啟動方式,以更好地管理應用程式程序並避免問題。",
"settings-use-app2unit-label": "使用 App2Unit 啟動應用程式",
"settings-view-mode-description": "選擇啟動器項目的版面配置。",
"settings-view-mode-label": "檢視模式",
"title": "啟動器"
},
"location": {
@@ -1066,7 +1166,7 @@
"date-time-show-events-description": "在行事曆面板裡顯示活動",
"date-time-show-events-label": "顯示行事曆活動",
"date-time-title": "日期與時間",
"date-time-use-analog-description": "在行事曆及鎖定畫面顯示類比時鐘",
"date-time-use-analog-description": "在日曆視窗上顯示類比時鐘",
"date-time-use-analog-label": "使用類比時鐘",
"date-time-week-numbers-description": "在行事曆顯示今年當週的週數 (例如: 第38週)",
"date-time-week-numbers-label": "顯示週數",
@@ -1090,10 +1190,28 @@
"weather-show-in-calendar-label": "在行事曆中顯示天氣"
},
"lock-screen": {
"allow-password-with-fprintd-description": "當 fprintd(指紋認證)處於活動狀態時,此選項允許您使用密碼而非指紋登入。",
"allow-password-with-fprintd-label": "允許使用 fprintd 進行密碼登入",
"auto-start-auth-description": "自動啟動指紋驗證,無需按鍵或點擊按鈕。",
"auto-start-auth-label": "自動啟動驗證",
"clock-format-description": "使用日期/時間語法令牌自訂時鐘格式。",
"clock-format-label": "時鐘格式",
"clock-style-analog": "類比",
"clock-style-custom": "自訂",
"clock-style-description": "選擇鎖定畫面時鐘的視覺樣式。",
"clock-style-digital": "數位",
"clock-style-label": "時鐘樣式",
"compact-lockscreen-description": "只顯示登入欄位及電源控制, 隱藏天氣及媒體小工具",
"compact-lockscreen-label": "精簡鎖定畫面",
"lock-on-suspend-description": "在暫停系統時自動鎖定畫面",
"lock-on-suspend-label": "暫停時鎖定",
"lock-screen-animations-description": "啟用或停用鎖定畫面動畫。",
"lock-screen-animations-label": "鎖定畫面動畫",
"lock-screen-blur-strength-description": "對鎖定畫面桌布套用模糊效果。",
"lock-screen-blur-strength-label": "鎖定螢幕模糊強度",
"lock-screen-tint-strength-description": "將色調疊加套用到鎖定畫面桌布。",
"lock-screen-tint-strength-label": "鎖定畫面著色強度",
"monitors-desc": "在特定顯示器上顯示鎖定畫面。如果未選擇,則預設為所有顯示器。",
"show-hibernate-description": "在電源及工作階段選單顯示睡眠",
"show-hibernate-label": "顯示睡眠",
"show-session-buttons-description": "允許在鎖定畫面存取電源控制",
@@ -1126,8 +1244,6 @@
"history-low-urgency-label": "儲存低急迫性到歷史通知",
"history-normal-urgency-description": "將普通急迫的通知存放到歷史通知",
"history-normal-urgency-label": "儲存普通急迫到歷史通知",
"media-toast-description": "媒體播放狀態變更時顯示氣泡訊息",
"media-toast-label": "媒體",
"monitors-desc": "只在特定的顯示器顯示通知, 如果全部取消勾選則會顯示在所有顯示器",
"settings-always-on-top-description": "在全螢幕視窗與其他層級上方顯示通知。",
"settings-background-opacity-description": "調整通知背景的不透明度",
@@ -1165,9 +1281,13 @@
"sounds-unavailable-label": "通知音效無法使用",
"sounds-volume-description": "調整通知音效的音量大小",
"sounds-volume-label": "音效音量",
"toast-battery-description": "當電池電量低於此百分比時顯示警告。",
"toast-battery-label": "低電量提醒",
"toast-desc": "設定氣泡訊息的外觀及行為",
"toast-keyboard-description": "當鍵盤佈局改變時顯示氣泡訊息",
"toast-keyboard-label": "鍵盤佈局"
"toast-keyboard-label": "鍵盤佈局",
"toast-media-description": "媒體播放狀態變更時顯示氣泡訊息",
"toast-media-label": "媒體"
},
"osd": {
"always-on-top-description": "將螢幕顯示在全螢幕視窗與其他層疊之上",
@@ -1202,10 +1322,14 @@
"types-volume-label": "輸出音量"
},
"plugins": {
"auto-update": "自動更新外掛程式",
"auto-update-description": "在 shell 啟動時自動更新所有外掛程式。",
"available-description": "從設定的來源檢視及安裝外掛模組",
"available-label": "可用的外掛模組",
"available-no-plugins-description": "檢查你的模組來源或者重新整理列表",
"available-no-plugins-label": "沒有可用的外掛模組",
"check-for-updates": "檢查更新",
"checking-for-updates": "正在檢查更新...",
"collision-already-installed": "這個模組已經安裝過了",
"collision-custom-version-exists": "已經安裝了來自 \"{source}\" 的自訂版本",
"collision-official-version-exists": "已經安裝了這個模組的官方版本",
@@ -1245,6 +1369,7 @@
"sources-placeholder": "我的超酷儲存庫",
"sources-remove-tooltip": "移除外掛模組來源",
"title": "外掛模組 (Plugins)",
"translations-reloaded": "已重新載入翻譯:{name}",
"uninstall-dialog-description": "你確定想要移除 {plugin}? 這樣會移除所有模組的資料",
"uninstall-dialog-title": "移除外掛模組",
"uninstall-error": "移除失敗: {error}",
@@ -1276,6 +1401,9 @@
"entry-settings-default-command-logout": "內建登出 (沒有指令)",
"entry-settings-default-info-description": "如果沒有指定自訂指令則使用系統的預設指令",
"entry-settings-default-info-label": "預設指令",
"entry-settings-keybind-description": "當會話選單打開時,分配一個按鍵組合來觸發此操作。",
"entry-settings-keybind-placeholder": "按下錄製以分配一個鍵...",
"entry-settings-keybind-recording": "錄製中... 按任意組合鍵",
"entry-settings-title": "設定{entry}",
"entry-settings-tooltip": "設定指令",
"general-desc": "設定工作階段選單的外觀和行為",
@@ -1292,6 +1420,7 @@
"system-monitor": {
"critical-color-label": "危急顏色",
"custom-highlight-colors-title-label": "自訂突出色",
"disk-available-label": "可用磁碟空間",
"disk-section-label": "磁碟使用量",
"enable-dgpu-monitoring-description": "注意: 這個選項會喚醒你的 GPU (NVIDIA/AMD), 在混合顯卡的筆電上可能會嚴重影響電池續航力",
"enable-dgpu-monitoring-label": "啟用監視獨立 GPU",
@@ -1346,7 +1475,7 @@
"settings-panel-mode-description": "選擇介面設定出現所用的佈局 (可能需要重新打開)",
"settings-panel-mode-label": "設定面板顯示",
"shadows-description": "為工具列及面板啟用陰影",
"shadows-direction-description": "選擇陰影投射的方向",
"shadows-direction-description": "選擇陰影投射的位置。",
"shadows-direction-label": "陰影方向",
"shadows-label": "陰影",
"title": "使用者介面",
@@ -1386,6 +1515,10 @@
"settings-monitor-specific-description": "替個別顯示器設定不同的桌布文件夾",
"settings-monitor-specific-label": "給特定顯示器所使用的文件夾",
"settings-monitor-specific-tooltip": "顯示器桌布文件夾",
"settings-overview-blur-strength-description": "將模糊強度應用於概覽。",
"settings-overview-blur-strength-label": "概覽模糊強度",
"settings-overview-tint-description": "將著色強度套用至概覽。",
"settings-overview-tint-label": "概覽著色強度",
"settings-recursive-search-description": "也同時搜尋桌布目錄底下的子文件夾",
"settings-recursive-search-label": "搜尋子文件夾",
"settings-select-monitor-folder": "選擇顯示器所使用的桌布文件夾",
@@ -1441,7 +1574,7 @@
"setup": {
"all-done": "完成!",
"appearance": {
"subheader": "選擇 Dark Mode 和色彩來源 (桌布或預先定義)。"
"subheader": "選擇深色模式和顏色來源(桌布或預設)。"
},
"customize": {
"header": "客製你的使用體驗",
@@ -1499,8 +1632,10 @@
"title": "飛航模式"
},
"battery": {
"critical": "電量嚴重不足",
"critical-desc": "電量剩餘 {percent}% — 請立即連接充電器",
"low": "電量過低",
"low-desc": "電剩餘 {percent}% 電量, 請接上充電器"
"low-desc": "電剩餘 {percent}% — 請連接充電器"
},
"bluetooth": {
"address-copied": "已複製位址至剪貼簿",
@@ -1683,6 +1818,8 @@
"transitions": {
"disc": "圓盤",
"fade": "淡入",
"honeycomb": "蜂巢",
"pixelate": "像素化",
"stripes": "條紋",
"wipe": "擦除"
},
@@ -1690,7 +1827,9 @@
"wallhaven": {
"loading": "正在載入桌布...",
"no-results": "找不到桌布, 試著用不同的搜尋字串",
"page": "第 {current} / {total} 頁"
"page": "第 {current} / {total} 頁",
"page-prefix": "頁面",
"page-suffix": "共 {total} 個"
}
},
"weather": {
+50 -13
View File
@@ -1,20 +1,26 @@
{
"settingsVersion": 0,
"bar": {
"barType": "simple",
"position": "top",
"monitors": [],
"density": "default",
"showOutline": false,
"showCapsule": true,
"capsuleOpacity": 1,
"capsuleColorKey": "none",
"backgroundOpacity": 0.93,
"useSeparateOpacity": false,
"floating": false,
"marginVertical": 4,
"marginHorizontal": 4,
"frameThickness": 8,
"frameRadius": 12,
"outerCorners": true,
"exclusive": true,
"hideOnOverview": false,
"displayMode": "always_visible",
"autoHideDelay": 500,
"autoShowDelay": 150,
"widgets": {
"left": [
{
@@ -74,6 +80,7 @@
"animationSpeed": 1,
"animationDisabled": false,
"compactLockScreen": false,
"lockScreenAnimations": false,
"lockOnSuspend": true,
"showSessionButtonsOnLockScreen": true,
"showHibernateOnLockScreen": false,
@@ -86,7 +93,22 @@
"showChangelogOnStartup": true,
"telemetryEnabled": false,
"enableLockScreenCountdown": true,
"lockScreenCountdownDuration": 10000
"lockScreenCountdownDuration": 10000,
"autoStartAuth": false,
"allowPasswordWithFprintd": false,
"clockStyle": "custom",
"clockFormat": "hh\\nmm",
"lockScreenMonitors": [],
"lockScreenBlur": 0.0,
"lockScreenTint": 0.0,
"keybinds": {
"keyUp": "Up",
"keyDown": "Down",
"keyLeft": "Left",
"keyRight": "Right",
"keyEnter": "Return",
"keyEscape": "Esc"
}
},
"ui": {
"fontDefault": "",
@@ -154,6 +176,8 @@
"transitionEdgeSmoothness": 0.05,
"panelPosition": "follow_bar",
"hideWallpaperFilenames": false,
"overviewBlur": 0.4,
"overviewTint": 0.6,
"useWallhaven": false,
"wallhavenQuery": "",
"wallhavenSorting": "relevance",
@@ -164,18 +188,21 @@
"wallhavenApiKey": "",
"wallhavenResolutionMode": "atleast",
"wallhavenResolutionWidth": "",
"wallhavenResolutionHeight": ""
"wallhavenResolutionHeight": "",
"sortOrder": "name"
},
"appLauncher": {
"enableClipboardHistory": false,
"autoPasteClipboard": false,
"enableClipPreview": true,
"clipboardWrapText": true,
"clipboardWatchTextCommand": "wl-paste --type text --watch cliphist store",
"clipboardWatchImageCommand": "wl-paste --type image --watch cliphist store",
"position": "center",
"pinnedApps": [],
"useApp2Unit": false,
"sortByMostUsed": true,
"terminalCommand": "xterm -e",
"terminalCommand": "alacritty -e",
"customLaunchPrefixEnabled": false,
"customLaunchPrefix": "",
"viewMode": "list",
@@ -183,8 +210,11 @@
"iconMode": "tabler",
"showIconBackground": false,
"enableSettingsSearch": true,
"enableWindowsSearch": true,
"ignoreMouseInput": false,
"screenshotAnnotationTool": ""
"screenshotAnnotationTool": "",
"overviewLayer": false,
"density": "default"
},
"controlCenter": {
"position": "close_to_bar_button",
@@ -259,13 +289,16 @@
"swapCriticalThreshold": 90,
"diskWarningThreshold": 80,
"diskCriticalThreshold": 90,
"cpuPollingInterval": 3000,
"tempPollingInterval": 3000,
"diskAvailWarningThreshold": 20,
"diskAvailCriticalThreshold": 10,
"batteryWarningThreshold": 20,
"batteryCriticalThreshold": 5,
"cpuPollingInterval": 1000,
"gpuPollingInterval": 3000,
"enableDgpuMonitoring": false,
"memPollingInterval": 3000,
"memPollingInterval": 1000,
"diskPollingInterval": 30000,
"networkPollingInterval": 3000,
"networkPollingInterval": 1000,
"loadAvgPollingInterval": 3000,
"useCustomColors": false,
"warningColor": "",
@@ -301,8 +334,8 @@
"countdownDuration": 10000,
"position": "center",
"showHeader": true,
"largeButtonsStyle": false,
"largeButtonsLayout": "grid",
"largeButtonsStyle": true,
"largeButtonsLayout": "single-row",
"showNumberLabels": true,
"powerOptions": [
{
@@ -341,7 +374,6 @@
"lowUrgencyDuration": 3,
"normalUrgencyDuration": 8,
"criticalUrgencyDuration": 15,
"enableKeyboardLayoutToast": true,
"saveToHistory": {
"low": true,
"normal": true,
@@ -356,7 +388,9 @@
"lowSoundFile": "",
"excludedApps": "discord,firefox,chrome,chromium,edge"
},
"enableMediaToast": false
"enableMediaToast": false,
"enableKeyboardLayoutToast": true,
"enableBatteryToast": true
},
"osd": {
"enabled": true,
@@ -419,6 +453,9 @@
"startup": "",
"session": ""
},
"plugins": {
"autoUpdate": false
},
"desktopWidgets": {
"enabled": false,
"gridSnap": false,
+251 -46
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": "common.display-mode",
"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",
@@ -179,6 +197,15 @@
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-capsule-color-label",
"descriptionKey": "panels.bar.appearance-capsule-color-description",
"widget": "NComboBox",
"tab": 4,
"tabLabel": "panels.bar.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-capsule-opacity-label",
"descriptionKey": "panels.bar.appearance-capsule-opacity-description",
@@ -189,8 +216,8 @@
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-floating-label",
"descriptionKey": "panels.bar.appearance-floating-description",
"labelKey": "panels.bar.appearance-hide-on-overview-label",
"descriptionKey": "panels.bar.appearance-hide-on-overview-description",
"widget": "NToggle",
"tab": 4,
"tabLabel": "panels.bar.title",
@@ -206,6 +233,33 @@
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-frame-settings-label",
"descriptionKey": "panels.bar.appearance-frame-settings-description",
"widget": "NLabel",
"tab": 4,
"tabLabel": "panels.bar.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-frame-thickness",
"descriptionKey": null,
"widget": "NValueSlider",
"tab": 4,
"tabLabel": "panels.bar.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-frame-radius",
"descriptionKey": null,
"widget": "NValueSlider",
"tab": 4,
"tabLabel": "panels.bar.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.bar.appearance-margins-label",
"descriptionKey": "panels.bar.appearance-margins-description",
@@ -234,9 +288,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,
@@ -560,6 +623,14 @@
"tabLabel": "common.general",
"subTab": null
},
{
"labelKey": "panels.general.keybinds-title",
"descriptionKey": "panels.general.keybinds-description",
"widget": "NLabel",
"tab": 0,
"tabLabel": "common.general",
"subTab": null
},
{
"labelKey": "panels.hooks.system-hooks-enable-label",
"descriptionKey": "panels.hooks.system-hooks-enable-description",
@@ -686,6 +757,24 @@
"subTab": 1,
"subTabLabel": "common.clipboard"
},
{
"labelKey": "panels.launcher.settings-clipboard-watch-text-label",
"descriptionKey": "panels.launcher.settings-clipboard-watch-text-description",
"widget": "NTextInput",
"tab": 8,
"tabLabel": "panels.launcher.title",
"subTab": 1,
"subTabLabel": "common.clipboard"
},
{
"labelKey": "panels.launcher.settings-clipboard-watch-image-label",
"descriptionKey": "panels.launcher.settings-clipboard-watch-image-description",
"widget": "NTextInput",
"tab": 8,
"tabLabel": "panels.launcher.title",
"subTab": 1,
"subTabLabel": "common.clipboard"
},
{
"labelKey": "panels.launcher.settings-use-app2unit-label",
"descriptionKey": "panels.launcher.settings-use-app2unit-description",
@@ -732,14 +821,32 @@
"subTabLabel": "common.execute"
},
{
"labelKey": "tooltips.grid-view",
"descriptionKey": "panels.launcher.settings-grid-view-description",
"labelKey": "panels.launcher.settings-overlay-layer-label",
"descriptionKey": "panels.launcher.settings-overlay-layer-description",
"widget": "NToggle",
"tab": 8,
"tabLabel": "panels.launcher.title",
"subTab": 0,
"subTabLabel": "common.general"
},
{
"labelKey": "panels.launcher.settings-view-mode-label",
"descriptionKey": "panels.launcher.settings-view-mode-description",
"widget": "NComboBox",
"tab": 8,
"tabLabel": "panels.launcher.title",
"subTab": 0,
"subTabLabel": "common.general"
},
{
"labelKey": "panels.launcher.settings-density-label",
"descriptionKey": "panels.launcher.settings-density-description",
"widget": "NComboBox",
"tab": 8,
"tabLabel": "panels.launcher.title",
"subTab": 0,
"subTabLabel": "common.general"
},
{
"labelKey": "panels.launcher.settings-show-categories-label",
"descriptionKey": "panels.launcher.settings-show-categories-description",
@@ -785,6 +892,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",
@@ -794,13 +910,32 @@
"subTab": 0,
"subTabLabel": "common.general"
},
{
"labelKey": "panels.lock-screen.clock-style-label",
"descriptionKey": "panels.lock-screen.clock-style-description",
"widget": "NComboBox",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.lock-screen.clock-format-label",
"descriptionKey": "panels.lock-screen.clock-format-description",
"widget": "NTextInput",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.lock-screen.lock-on-suspend-label",
"descriptionKey": "panels.lock-screen.lock-on-suspend-description",
"widget": "NToggle",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": null
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.lock-screen.compact-lockscreen-label",
@@ -808,7 +943,35 @@
"widget": "NToggle",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": null
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.lock-screen.lock-screen-animations-label",
"descriptionKey": "panels.lock-screen.lock-screen-animations-description",
"widget": "NToggle",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.lock-screen.auto-start-auth-label",
"descriptionKey": "panels.lock-screen.auto-start-auth-description",
"widget": "NToggle",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.lock-screen.allow-password-with-fprintd-label",
"descriptionKey": "panels.lock-screen.allow-password-with-fprintd-description",
"widget": "NToggle",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.lock-screen.show-session-buttons-label",
@@ -816,7 +979,8 @@
"widget": "NToggle",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": null
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.lock-screen.show-hibernate-label",
@@ -824,7 +988,8 @@
"widget": "NToggle",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": null
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.session-menu.enable-countdown-label",
@@ -832,7 +997,8 @@
"widget": "NToggle",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": null
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.session-menu.countdown-duration-label",
@@ -840,7 +1006,26 @@
"widget": "NValueSlider",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": null
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.lock-screen.lock-screen-blur-strength-label",
"descriptionKey": "panels.lock-screen.lock-screen-blur-strength-description",
"widget": "NValueSlider",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "panels.lock-screen.lock-screen-tint-strength-label",
"descriptionKey": "panels.lock-screen.lock-screen-tint-strength-description",
"widget": "NValueSlider",
"tab": 11,
"tabLabel": "panels.lock-screen.title",
"subTab": 0,
"subTabLabel": "common.appearance"
},
{
"labelKey": "actions.enable-wifi",
@@ -1038,8 +1223,8 @@
"subTabLabel": "common.sound"
},
{
"labelKey": "panels.notifications.media-toast-label",
"descriptionKey": "panels.notifications.media-toast-description",
"labelKey": "panels.notifications.toast-media-label",
"descriptionKey": "panels.notifications.toast-media-description",
"widget": "NCheckbox",
"tab": 9,
"tabLabel": "common.notifications",
@@ -1055,6 +1240,15 @@
"subTab": 4,
"subTabLabel": "common.toast"
},
{
"labelKey": "panels.notifications.toast-battery-label",
"descriptionKey": "panels.notifications.toast-battery-description",
"widget": "NCheckbox",
"tab": 9,
"tabLabel": "common.notifications",
"subTab": 4,
"subTabLabel": "common.toast"
},
{
"labelKey": "panels.osd.enabled-label",
"descriptionKey": "panels.osd.enabled-description",
@@ -1082,6 +1276,15 @@
"subTab": 1,
"subTabLabel": "common.available"
},
{
"labelKey": "panels.plugins.auto-update",
"descriptionKey": "panels.plugins.auto-update-description",
"widget": "NToggle",
"tab": 18,
"tabLabel": "panels.plugins.title",
"subTab": 0,
"subTabLabel": "common.installed"
},
{
"labelKey": "panels.plugins.installed-no-plugins-label",
"descriptionKey": "panels.plugins.installed-no-plugins-description",
@@ -1253,22 +1456,6 @@
"subTab": 0,
"subTabLabel": "common.general"
},
{
"labelKey": "common.command",
"descriptionKey": "panels.session-menu.entry-settings-command-description",
"widget": "NTextInput",
"tab": 12,
"tabLabel": "session-menu.title",
"subTab": null
},
{
"labelKey": "panels.session-menu.entry-settings-default-info-label",
"descriptionKey": "panels.session-menu.entry-settings-default-info-description",
"widget": "NLabel",
"tab": 12,
"tabLabel": "session-menu.title",
"subTab": null
},
{
"labelKey": "panels.system-monitor.enable-dgpu-monitoring-label",
"descriptionKey": "panels.system-monitor.enable-dgpu-monitoring-description",
@@ -1495,18 +1682,9 @@
"subTabLabel": "common.general"
},
{
"labelKey": "panels.wallpaper.settings-enable-overview-label",
"descriptionKey": "panels.wallpaper.settings-enable-overview-description",
"widget": "NToggle",
"tab": 3,
"tabLabel": "common.wallpaper",
"subTab": 0,
"subTabLabel": "common.general"
},
{
"labelKey": "panels.wallpaper.settings-folder-label",
"descriptionKey": "panels.wallpaper.settings-folder-description",
"widget": "NTextInputButton",
"labelKey": "tooltips.wallpaper-selector",
"descriptionKey": "panels.wallpaper.settings-selector-description",
"widget": "NLabel",
"tab": 3,
"tabLabel": "common.wallpaper",
"subTab": 0,
@@ -1521,6 +1699,15 @@
"subTab": 0,
"subTabLabel": "common.general"
},
{
"labelKey": "panels.wallpaper.settings-folder-label",
"descriptionKey": "panels.wallpaper.settings-folder-description",
"widget": "NTextInputButton",
"tab": 3,
"tabLabel": "common.wallpaper",
"subTab": 0,
"subTabLabel": "common.general"
},
{
"labelKey": "panels.wallpaper.settings-monitor-specific-label",
"descriptionKey": "panels.wallpaper.settings-monitor-specific-description",
@@ -1531,9 +1718,27 @@
"subTabLabel": "common.general"
},
{
"labelKey": "tooltips.wallpaper-selector",
"descriptionKey": "panels.wallpaper.settings-selector-description",
"widget": "NLabel",
"labelKey": "panels.wallpaper.settings-enable-overview-label",
"descriptionKey": "panels.wallpaper.settings-enable-overview-description",
"widget": "NToggle",
"tab": 3,
"tabLabel": "common.wallpaper",
"subTab": 0,
"subTabLabel": "common.general"
},
{
"labelKey": "panels.wallpaper.settings-overview-blur-strength-label",
"descriptionKey": "panels.wallpaper.settings-overview-blur-strength-description",
"widget": "NValueSlider",
"tab": 3,
"tabLabel": "common.wallpaper",
"subTab": 0,
"subTabLabel": "common.general"
},
{
"labelKey": "panels.wallpaper.settings-overview-tint-label",
"descriptionKey": "panels.wallpaper.settings-overview-tint-description",
"widget": "NValueSlider",
"tab": 3,
"tabLabel": "common.wallpaper",
"subTab": 0,
+72 -21
View File
@@ -6,7 +6,8 @@
"scrollingMode": "hover",
"maxWidth": 145,
"useFixedWidth": false,
"colorizeIcons": false
"colorizeIcons": false,
"textColor": "none"
},
"AudioVisualizer": {
"width": 200,
@@ -14,22 +15,25 @@
"hideWhenIdle": false
},
"Battery": {
"displayMode": "onhover",
"warningThreshold": 30,
"deviceNativePath": "",
"displayMode": "graphic-clean",
"deviceNativePath": "__default__",
"showPowerProfiles": false,
"showNoctaliaPerformance": false,
"hideIfNotDetected": true,
"hideIfIdle": false
},
"Bluetooth": {
"displayMode": "onhover"
"displayMode": "onhover",
"iconColor": "none",
"textColor": "none"
},
"Brightness": {
"displayMode": "onhover"
"displayMode": "onhover",
"iconColor": "none",
"textColor": "none"
},
"Clock": {
"usePrimaryColor": false,
"clockColor": "none",
"useCustomFont": false,
"customFont": "",
"formatHorizontal": "HH:mm ddd, MMM dd",
@@ -74,9 +78,18 @@
"colorizeSystemIcon": "none",
"ipcIdentifier": ""
},
"DarkMode": {
"iconColor": "none"
},
"KeepAwake": {
"iconColor": "none",
"textColor": "none"
},
"KeyboardLayout": {
"displayMode": "onhover",
"showIcon": true
"showIcon": true,
"iconColor": "none",
"textColor": "none"
},
"LockKeys": {
"showCapsLock": true,
@@ -89,7 +102,7 @@
},
"Launcher": {
"icon": "rocket",
"usePrimaryColor": false
"iconColor": "none"
},
"MediaMini": {
"hideMode": "hidden",
@@ -102,6 +115,7 @@
"showVisualizer": false,
"showProgressRing": true,
"visualizerType": "linear",
"textColor": "none",
"compactMode": false,
"panelShowAlbumArt": true,
"panelShowVisualizer": true,
@@ -110,24 +124,30 @@
},
"Microphone": {
"displayMode": "onhover",
"middleClickCommand": "pwvucontrol || pavucontrol"
"middleClickCommand": "pwvucontrol || pavucontrol",
"iconColor": "none",
"textColor": "none"
},
"NotificationHistory": {
"showUnreadBadge": true,
"hideWhenZero": false,
"hideWhenZeroUnread": false
"hideWhenZeroUnread": false,
"unreadBadgeColor": "primary",
"iconColor": "none"
},
"SessionMenu": {
"colorName": "error"
"iconColor": "error"
},
"Spacer": {
"width": 20
},
"SystemMonitor": {
"compactMode": true,
"usePrimaryColor": false,
"iconColor": "none",
"textColor": "none",
"useMonospaceFont": true,
"showCpuUsage": true,
"showCpuFreq": false,
"showCpuTemp": true,
"showGpuTemp": false,
"showLoadAverage": false,
@@ -136,6 +156,8 @@
"showSwapUsage": false,
"showNetworkStats": false,
"showDiskUsage": false,
"showDiskUsageAsPercent": false,
"showDiskAvailable": false,
"diskPath": "/"
},
"Taskbar": {
@@ -153,18 +175,29 @@
"Tray": {
"blacklist": [],
"colorizeIcons": false,
"chevronColor": "none",
"pinned": [],
"drawerEnabled": true,
"hidePassive": false
},
"VPN": {
"displayMode": "onhover"
},
"WiFi": {
"displayMode": "onhover"
"displayMode": "onhover",
"iconColor": "none",
"textColor": "none"
},
"Network": {
"displayMode": "onhover"
"displayMode": "onhover",
"iconColor": "none",
"textColor": "none"
},
"NightLight": {
"iconColor": "none"
},
"NoctaliaPerformance": {
"iconColor": "none"
},
"PowerProfile": {
"iconColor": "none"
},
"Workspace": {
"labelMode": "index",
@@ -177,11 +210,22 @@
"unfocusedIconsOpacity": 1,
"groupedBorderOpacity": 1,
"enableScrollWheel": true,
"iconScale": 0.8
"iconScale": 0.8,
"focusedColor": "primary",
"occupiedColor": "secondary",
"emptyColor": "secondary",
"showBadge": true,
"reverseScroll": false,
"pillSize": 0.6
},
"Volume": {
"displayMode": "onhover",
"middleClickCommand": "pwvucontrol || pavucontrol"
"middleClickCommand": "pwvucontrol || pavucontrol",
"iconColor": "none",
"textColor": "none"
},
"WallpaperSelector": {
"iconColor": "none"
}
},
"controlCenter": {
@@ -199,7 +243,7 @@
"Clock": {
"showBackground": true,
"clockStyle": "digital",
"usePrimaryColor": false,
"clockColor": "none",
"useCustomFont": false,
"format": "HH:mm\\nd MMMM yyyy"
},
@@ -214,6 +258,13 @@
},
"Weather": {
"showBackground": true
},
"SystemStat": {
"showBackground": true,
"statType": "CPU",
"diskPath": "/",
"roundedCorners": true,
"layout": "bottom"
}
}
}
+5 -1
View File
@@ -27,6 +27,10 @@ Noctalia Shell is made possible by the incredible work of many open-source proje
### Utilities
- **[cliphist](https://github.com/sentriz/cliphist)** - Clipboard history support
## Icons
- **[Tabler Icons](https://tabler.io/icons)** - Icon set used throughout the shell
- **[Riyan Resdian on Noun Project](https://thenounproject.com/creator/yaicon/)** - Plug icon
## Audio Assets
- **[Universfield on Pixabay](https://pixabay.com/users/universfield-28281460/)** - Notification sound effect
- **[DrNI on Freesound](https://freesound.org/people/DrNI/sounds/34562/)** - Timer's alarm sound effect
@@ -35,7 +39,7 @@ Noctalia Shell is made possible by the incredible work of many open-source proje
## Special Thanks
- The **Wayland** community for building the future of Linux desktop graphics
- The **Niri**, **Hyprland**, **Sway**, and **MangoWC** teams for their excellent Wayland compositors
- The **Niri**, **Hyprland**, **Sway**, **Labwc**, and **MangoWC** teams for their excellent Wayland compositors
- All the contributors and users who have helped make Noctalia better
## License
+153 -35
View File
@@ -20,6 +20,9 @@ Singleton {
property bool reloadColors: false
// Suppress transition animations until the first colors.json load completes
property bool skipTransition: true
// Flag indicating theme colors are currently transitioning (for widgets to disable their own animations)
property bool isTransitioning: false
@@ -57,96 +60,112 @@ Singleton {
// --- Color transition animations ---
Behavior on mPrimary {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mOnPrimary {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mSecondary {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mOnSecondary {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mTertiary {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mOnTertiary {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mError {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mOnError {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mSurface {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mOnSurface {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mSurfaceVariant {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mOnSurfaceVariant {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mOutline {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mShadow {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mHover {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
}
}
Behavior on mOnHover {
enabled: !root.skipTransition
ColorAnimation {
duration: Style.animationSlowest
easing.type: Easing.OutCubic
@@ -163,99 +182,184 @@ Singleton {
Connections {
target: customColorsData
function onMPrimaryChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mPrimary = customColorsData.mPrimary;
}
function onMOnPrimaryChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mOnPrimary = customColorsData.mOnPrimary;
}
function onMSecondaryChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mSecondary = customColorsData.mSecondary;
}
function onMOnSecondaryChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mOnSecondary = customColorsData.mOnSecondary;
}
function onMTertiaryChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mTertiary = customColorsData.mTertiary;
}
function onMOnTertiaryChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mOnTertiary = customColorsData.mOnTertiary;
}
function onMErrorChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mError = customColorsData.mError;
}
function onMOnErrorChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mOnError = customColorsData.mOnError;
}
function onMSurfaceChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mSurface = customColorsData.mSurface;
}
function onMOnSurfaceChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mOnSurface = customColorsData.mOnSurface;
}
function onMSurfaceVariantChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mSurfaceVariant = customColorsData.mSurfaceVariant;
}
function onMOnSurfaceVariantChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mOnSurfaceVariant = customColorsData.mOnSurfaceVariant;
}
function onMOutlineChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mOutline = customColorsData.mOutline;
}
function onMShadowChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mShadow = customColorsData.mShadow;
}
function onMHoverChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mHover = customColorsData.mHover;
}
function onMOnHoverChanged() {
startTransition();
if (!root.skipTransition) {
startTransition();
}
root.mOnHover = customColorsData.mOnHover;
}
}
function resolveColorKey(key) {
switch (key) {
case "primary":
return root.mPrimary;
case "secondary":
return root.mSecondary;
case "tertiary":
return root.mTertiary;
case "error":
return root.mError;
default:
return root.mOnSurface;
}
}
function resolveColorKeyOptional(key) {
switch (key) {
case "primary":
return root.mPrimary;
case "secondary":
return root.mSecondary;
case "tertiary":
return root.mTertiary;
case "error":
return root.mError;
default:
return "transparent";
}
}
readonly property var colorKeyModel: [
{
"key": "none",
"name": I18n.tr("common.none")
},
{
"key": "primary",
"name": I18n.tr("common.primary")
},
{
"key": "secondary",
"name": I18n.tr("common.secondary")
},
{
"key": "tertiary",
"name": I18n.tr("common.tertiary")
},
{
"key": "error",
"name": I18n.tr("common.error")
}
]
// --------------------------------
// Default colors: Rose Pine
// Default colors: Noctalia (default) dark must match Assets/ColorScheme/Noctalia-default
QtObject {
id: defaultColors
readonly property color mPrimary: "#c7a1d8"
readonly property color mOnPrimary: "#1a151f"
readonly property color mPrimary: "#fff59b"
readonly property color mOnPrimary: "#0e0e43"
readonly property color mSecondary: "#a984c4"
readonly property color mOnSecondary: "#f3edf7"
readonly property color mSecondary: "#a9aefe"
readonly property color mOnSecondary: "#0e0e43"
readonly property color mTertiary: "#e0b7c9"
readonly property color mOnTertiary: "#20161f"
readonly property color mTertiary: "#9BFECE"
readonly property color mOnTertiary: "#0e0e43"
readonly property color mError: "#e9899d"
readonly property color mOnError: "#1e1418"
readonly property color mError: "#FD4663"
readonly property color mOnError: "#0e0e43"
readonly property color mSurface: "#1c1822"
readonly property color mOnSurface: "#e9e4f0"
readonly property color mSurface: "#070722"
readonly property color mOnSurface: "#f3edf7"
readonly property color mSurfaceVariant: "#262130"
readonly property color mOnSurfaceVariant: "#a79ab0"
readonly property color mSurfaceVariant: "#11112d"
readonly property color mOnSurfaceVariant: "#7c80b4"
readonly property color mOutline: "#342c42"
readonly property color mShadow: "#120f18"
readonly property color mOutline: "#21215F"
readonly property color mShadow: "#070722"
readonly property color mHover: "#e0b7c9"
readonly property color mOnHover: "#20161f"
readonly property color mHover: "#9BFECE"
readonly property color mOnHover: "#0e0e43"
}
// ----------------------------------------------------------------
@@ -266,15 +370,23 @@ Singleton {
printErrors: false
watchChanges: true
onFileChanged: {
Logger.i("Color", "Reloading colors from disk");
Logger.d("Color", "Reloading colors from disk");
reloadColors = true;
reload();
}
onAdapterUpdated: {
Logger.i("Color", "Writing colors to disk");
Logger.d("Color", "Writing colors to disk");
writeAdapter();
}
onLoaded: {
if (root.skipTransition) {
Qt.callLater(function () {
root.skipTransition = false;
});
}
}
// Trigger initial load when path changes from empty to actual path
onPathChanged: {
if (path !== undefined) {
@@ -287,6 +399,12 @@ Singleton {
return;
}
if (root.skipTransition) {
Qt.callLater(function () {
root.skipTransition = false;
});
}
// Error code 2 = ENOENT (No such file or directory)
if (error === 2 || error.toString().includes("No such file")) {
// File doesn't exist, create it with default values
+107 -127
View File
@@ -13,7 +13,8 @@ Singleton {
property var locale: Qt.locale()
property string systemDetectedLangCode: ""
property string fullLocaleCode: "" // Preserves regional locale variants
property var availableLanguages: []
// Static list of available translations update when adding/removing translation files
property var availableLanguages: ["en", "de", "es", "fr", "hu", "ja", "ko-KR", "ku", "nl", "nn-HN", "nn-NO", "pl", "pt", "ru", "sv", "tr", "uk-UA", "zh-CN", "zh-TW"]
property var translations: ({})
property var fallbackTranslations: ({})
@@ -21,32 +22,10 @@ Singleton {
signal languageChanged(string newLanguage)
signal translationsLoaded
// Process to list directory contents
property Process directoryScanner: Process {
id: directoryProcess
command: ["ls", `${Quickshell.shellDir}/Assets/Translations/`]
running: false
stdout: StdioCollector {
id: stdoutCollector
}
onExited: function (exitCode, exitStatus) {
if (exitCode === 0) {
var output = stdoutCollector.text || "";
parseDirectoryListing(output);
} else {
Logger.e("I18n", `Failed to scan translation directory`);
// Fallback to default languages
availableLanguages = ["en"];
detectLanguage();
}
}
}
// FileView to load translation files
property FileView translationFile: FileView {
id: fileView
printErrors: false
watchChanges: true
onFileChanged: reload()
onLoaded: {
@@ -54,18 +33,50 @@ Singleton {
var data = JSON.parse(text());
root.translations = data;
Logger.i("I18n", `Loaded translations for "${root.langCode}"`);
Logger.d("I18n", `Available root keys: ${Object.keys(data).join(", ")}`);
root.isLoaded = true;
root.translationsLoaded();
// Load English fallback for non-English languages (only after main file succeeds)
if (root.langCode !== "en") {
fallbackFileView.path = `file://${Quickshell.shellDir}/Assets/Translations/en.json`;
}
} catch (e) {
Logger.e("I18n", `Failed to parse translation file: ${e}`);
setLanguage("en");
}
}
onLoadFailed: function (error) {
setLanguage("en");
Logger.e("I18n", `Failed to load translation file: ${error}`);
if (root.langCode === "en") {
Logger.e("I18n", `Failed to load English translation file: ${error}`);
// English also failed - still emit signal to unblock startup
root.isLoaded = true;
root.translationsLoaded();
return;
}
// Qt.callLater is needed because FileView doesn't re-trigger when path
// is changed inside its own onLoadFailed handler
var strippedCode = stripScript(root.langCode);
if (strippedCode !== root.langCode) {
Logger.d("I18n", `Translation file for "${root.langCode}" not found, trying "${strippedCode}"`);
root.langCode = strippedCode;
Qt.callLater(loadTranslations);
} else {
// Try language-only code (e.g. "zh-CN" "zh")
var shortCode = root.langCode.substring(0, 2);
if (shortCode !== root.langCode) {
Logger.d("I18n", `Translation file for "${root.langCode}" not found, trying "${shortCode}"`);
root.langCode = shortCode;
Qt.callLater(loadTranslations);
} else {
Logger.w("I18n", `Translation file for "${root.langCode}" not found, falling back to English`);
root.langCode = "en";
root.fullLocaleCode = "en";
root.locale = Qt.locale("en");
Qt.callLater(loadTranslations);
}
}
}
}
@@ -88,117 +99,92 @@ Singleton {
}
}
// Correct language when settings finish loading from disk (or user changes it)
Connections {
target: Settings.data.general
function onLanguageChanged() {
var userLang = Settings.data.general.language;
if (userLang !== "" && userLang !== root.langCode && availableLanguages.includes(userLang)) {
Logger.i("I18n", `Applying user language preference: "${userLang}"`);
setLanguage(userLang);
} else if (userLang === "" && root.systemDetectedLangCode !== "" && root.systemDetectedLangCode !== root.langCode) {
Logger.i("I18n", `Language reset to default, reverting to system language: "${root.systemDetectedLangCode}"`);
setLanguage(root.systemDetectedLangCode);
}
}
}
Component.onCompleted: {
Logger.i("I18n", "Service started");
scanAvailableLanguages();
var lang = determineFastLanguage();
langCode = lang.code;
fullLocaleCode = lang.fullLocale;
locale = Qt.locale(lang.fullLocale);
systemDetectedLangCode = lang.code;
Logger.i("I18n", `Loading "${lang.code}" (locale: "${lang.fullLocale}")`);
loadTranslations();
}
// -------------------------------------------
function scanAvailableLanguages() {
Logger.d("I18n", "Scanning for available translation files...");
directoryScanner.running = true;
}
// -------------------------------------------
function parseDirectoryListing(output) {
var languages = [];
try {
if (!output || output.trim() === "") {
Logger.w("I18n", "Empty directory listing output");
availableLanguages = ["en"];
detectLanguage();
return;
// Strip 4-letter script subtag from a BCP 47 tag (e.g. "fr-Latn-FR" "fr-FR")
function stripScript(tag) {
var parts = tag.split("-");
var result = [];
for (var i = 0; i < parts.length; i++) {
if (parts[i].length === 4 && /^[A-Za-z]{4}$/.test(parts[i])) {
continue;
}
const entries = output.trim().split('\n');
for (var i = 0; i < entries.length; i++) {
const entry = entries[i].trim();
if (entry && entry.endsWith('.json')) {
// Extract language code from filename (e.g., "en.json" -> "en")
const langCode = entry.substring(0, entry.lastIndexOf('.json'));
if (langCode.length >= 2 && langCode.length <= 5) {
// Basic validation for language codes
languages.push(langCode);
}
}
}
// Sort languages alphabetically, but ensure "en" comes first if available
languages.sort();
const enIndex = languages.indexOf("en");
if (enIndex > 0) {
languages.splice(enIndex, 1);
languages.unshift("en");
}
if (languages.length === 0) {
Logger.w("I18n", "No translation files found, using fallback");
languages = ["en"]; // Fallback
}
availableLanguages = languages;
Logger.d("I18n", `Found ${languages.length} available languages: ${languages.join(', ')}`);
// Detect language after scanning
detectLanguage();
} catch (e) {
Logger.e("I18n", `Failed to parse directory listing: ${e}`);
// Fallback to default languages
availableLanguages = ["en"];
detectLanguage();
result.push(parts[i]);
}
return result.join("-");
}
// -------------------------------------------
function detectLanguage() {
Logger.d("I18n", `detectLanguage() called. Available languages: [${availableLanguages.join(', ')}]`);
if (availableLanguages.length === 0) {
Logger.w("I18n", "No available languages found");
return;
// Determine the best language match against availableLanguages
function determineFastLanguage() {
// User preference from Settings (defaults to "" if not yet loaded from disk)
var userLang = Settings.data.general.language;
if (userLang !== "" && availableLanguages.includes(userLang)) {
return {
code: userLang,
fullLocale: userLang
};
}
var detectedLang = "";
var detectedFullLocale = "";
// First, determine the system's preferred language
// Match system locale against available translations
for (var i = 0; i < Qt.locale().uiLanguages.length; i++) {
const fullUserLang = Qt.locale().uiLanguages[i];
var fullLang = Qt.locale().uiLanguages[i];
if (availableLanguages.includes(fullUserLang)) {
detectedLang = fullUserLang;
detectedFullLocale = fullUserLang;
break;
// Exact match (e.g. "zh-CN")
if (availableLanguages.includes(fullLang)) {
return {
code: fullLang,
fullLocale: fullLang
};
}
const shortUserLang = fullUserLang.substring(0, 2);
if (availableLanguages.includes(shortUserLang)) {
detectedLang = shortUserLang;
detectedFullLocale = fullUserLang;
break;
// Script-stripped match (e.g. "zh-Hans-CN" "zh-CN")
var stripped = stripScript(fullLang);
if (stripped !== fullLang && availableLanguages.includes(stripped)) {
return {
code: stripped,
fullLocale: fullLang
};
}
// Language-only match (e.g. "fr-FR" "fr")
var short_ = fullLang.substring(0, 2);
if (availableLanguages.includes(short_)) {
return {
code: short_,
fullLocale: fullLang
};
}
}
// If no system language is found among available languages, fallback
if (detectedLang === "") {
detectedLang = availableLanguages.includes("en") ? "en" : availableLanguages[0];
detectedFullLocale = detectedLang;
}
root.systemDetectedLangCode = detectedLang;
root.fullLocaleCode = detectedFullLocale;
Logger.d("I18n", `System detected language: "${root.systemDetectedLangCode}" (full locale: "${root.fullLocaleCode}")`);
// Now, apply the language: user-defined, then system-detected
if (Settings.data.general.language !== "" && availableLanguages.includes(Settings.data.general.language)) {
Logger.d("I18n", `User-defined language found: "${Settings.data.general.language}"`);
setLanguage(Settings.data.general.language);
} else {
Logger.d("I18n", `No user-defined language, using system detected: "${root.systemDetectedLangCode}"`);
setLanguage(root.systemDetectedLangCode, root.fullLocaleCode);
}
return {
code: "en",
fullLocale: "en"
};
}
// -------------------------------------------
@@ -226,12 +212,6 @@ Singleton {
const filePath = `file://${Quickshell.shellDir}/Assets/Translations/${langCode}.json`;
fileView.path = filePath;
isLoaded = false;
Logger.d("I18n", `Loading translations: ${langCode}`);
// Only load fallback translations if we are not using english and english is available
if (langCode !== "en" && availableLanguages.includes("en")) {
fallbackFileView.path = `file://${Quickshell.shellDir}/Assets/Translations/en.json`;
}
}
// -------------------------------------------
+6 -3
View File
@@ -78,13 +78,14 @@ Singleton {
"star": "star",
"star-off": "star-off",
"battery-exclamation": "battery-exclamation",
"common.charging": "common.charging",
"battery-charging": "battery-charging",
"battery-charging-2": "battery-charging-2",
"battery-4": "battery-4",
"battery-3": "battery-3",
"battery-2": "battery-2",
"battery-1": "battery-1",
"battery": "battery",
"battery-off": "battery-off",
"wifi-0": "wifi-0",
"wifi-1": "wifi-1",
"wifi-2": "wifi-2",
@@ -177,7 +178,8 @@ Singleton {
"filepicker-eye-off": "eye-off",
"filepicker-folder-current": "checks",
"plugin": "plug-connected",
"info": "file-description"
"info": "file-description",
"official-plugin": "shield-filled"
}
// Fonts Codepoints - do not change!
@@ -747,7 +749,7 @@ Singleton {
"battery-4-filled": "\u{f721}",
"battery-automotive": "\u{ee07}",
"battery-automotive-filled": "\u{10029}",
"common.charging": "\u{ea33}",
"battery-charging": "\u{ea33}",
"battery-charging-2": "\u{ef3b}",
"battery-eco": "\u{ef3c}",
"battery-exclamation": "\u{ff1d}",
@@ -4786,6 +4788,7 @@ Singleton {
"playstation-triangle": "\u{f2af}",
"playstation-x": "\u{f2b0}",
"plug": "\u{ebd9}",
"plug-filled": "\u{f6b3}",
"plug-connected": "\u{f00a}",
"plug-connected-x": "\u{f0a0}",
"plug-off": "\u{f180}",
+18
View File
@@ -0,0 +1,18 @@
import QtQuick
QtObject {
/**
* Migration 45: Migrate 'floating' bar setting to 'barType'
*/
function migrate(adapter, logger, rawJson) {
logger.i("Migration45", "Migrating bar settings...");
if (adapter.bar.floating) {
adapter.bar.barType = "floating";
} else {
adapter.bar.barType = "simple";
}
return true;
}
}
+21
View File
@@ -0,0 +1,21 @@
import QtQuick
import Quickshell
QtObject {
id: root
function migrate(adapter, logger, rawJson) {
logger.i("Migration46", "Removing legacy PAM configuration file");
const shellName = "noctalia";
const configDir = Quickshell.env("NOCTALIA_CONFIG_DIR") || (Quickshell.env("XDG_CONFIG_HOME") || Quickshell.env("HOME") + "/.config") + "/" + shellName + "/";
const pamConfigDir = configDir + "pam";
// Remove the entire pam directory if it exists
const script = `rm -rf '${pamConfigDir}'`;
Quickshell.execDetached(["sh", "-c", script]);
logger.d("Migration46", "Cleaned up legacy PAM config");
return true;
}
}
+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;
}
}
+22
View File
@@ -0,0 +1,22 @@
import QtQuick
QtObject {
id: root
// Migrate battery thresholds from notifications to systemMonitor
function migrate(adapter, logger, rawJson) {
logger.i("Settings", "Migrating settings to v48");
if (rawJson?.notifications?.batteryWarningThreshold !== undefined) {
adapter.systemMonitor.batteryWarningThreshold = rawJson.notifications.batteryWarningThreshold;
logger.i("Settings", "Migrated notifications.batteryWarningThreshold to systemMonitor: " + adapter.systemMonitor.batteryWarningThreshold);
}
if (rawJson?.notifications?.batteryCriticalThreshold !== undefined) {
adapter.systemMonitor.batteryCriticalThreshold = rawJson.notifications.batteryCriticalThreshold;
logger.i("Settings", "Migrated notifications.batteryCriticalThreshold to systemMonitor: " + adapter.systemMonitor.batteryCriticalThreshold);
}
return true;
}
}
+17
View File
@@ -0,0 +1,17 @@
import QtQuick
import Quickshell
import qs.Commons
QtObject {
id: root
// Remove old launcher_app_usage.json (usage tracking moved to ShellState)
function migrate(adapter, logger, rawJson) {
logger.i("Settings", "Migrating settings to v49");
Quickshell.execDetached(["rm", "-f", Settings.cacheDir + "launcher_app_usage.json"]);
logger.i("Settings", "Removed old launcher_app_usage.json");
return true;
}
}
+24
View File
@@ -0,0 +1,24 @@
import QtQuick
QtObject {
id: root
// Migrate keybinds from single strings to arrays of strings
function migrate(adapter, logger, rawJson) {
logger.i("Settings", "Migrating settings to v50");
const keybinds = rawJson?.general?.keybinds;
if (!keybinds)
return true;
const keys = ["keyUp", "keyDown", "keyLeft", "keyRight", "keyEnter", "keyEscape"];
for (const key of keys) {
if (keybinds[key] !== undefined && typeof keybinds[key] === "string") {
adapter.general.keybinds[key] = [keybinds[key]];
logger.i("Settings", "Migrated keybinds." + key + " from string to array: [" + keybinds[key] + "]");
}
}
return true;
}
}
+13 -1
View File
@@ -18,7 +18,13 @@ QtObject {
40: migration40Component,
42: migration42Component,
43: migration43Component,
44: migration44Component
44: migration44Component,
45: migration45Component,
46: migration46Component,
47: migration47Component,
48: migration48Component,
49: migration49Component,
50: migration50Component
})
// Migration components
@@ -34,4 +40,10 @@ QtObject {
property Component migration42Component: Migration42 {}
property Component migration43Component: Migration43 {}
property Component migration44Component: Migration44 {}
property Component migration45Component: Migration45 {}
property Component migration46Component: Migration46 {}
property Component migration47Component: Migration47 {}
property Component migration48Component: Migration48 {}
property Component migration49Component: Migration49 {}
property Component migration50Component: Migration50 {}
}
+56 -69
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: 44
readonly property int settingsVersion: 51
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 + "/"
@@ -48,11 +48,6 @@ Singleton {
Quickshell.execDetached(["mkdir", "-p", configDir]);
Quickshell.execDetached(["mkdir", "-p", cacheDir]);
// Ensure PAM config file exists in configDir (create once, never override)
if (!Quickshell.env("NOCTALIA_PAM_CONFIG")) {
ensurePamConfig();
}
// Mark directories as created and trigger file loading
directoriesCreated = true;
@@ -175,12 +170,14 @@ Singleton {
// bar
property JsonObject bar: JsonObject {
property string barType: "simple" // "simple", "floating", "framed"
property string position: "top" // "top", "bottom", "left", or "right"
property list<string> monitors: [] // holds bar visibility per monitor
property string density: "default" // "compact", "default", "comfortable"
property bool showOutline: false
property bool showCapsule: true
property real capsuleOpacity: 1.0
property string capsuleColorKey: "none"
// Bar background opacity settings
property real backgroundOpacity: 0.93
@@ -191,15 +188,21 @@ Singleton {
property int marginVertical: 4
property int marginHorizontal: 4
// Framed bar settings
property int frameThickness: 8
property int frameRadius: 12
// 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"
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 {
@@ -266,6 +269,7 @@ Singleton {
property real animationSpeed: 1.0
property bool animationDisabled: false
property bool compactLockScreen: false
property bool lockScreenAnimations: false
property bool lockOnSuspend: true
property bool showSessionButtonsOnLockScreen: true
property bool showHibernateOnLockScreen: false
@@ -279,6 +283,21 @@ Singleton {
property bool telemetryEnabled: false
property bool enableLockScreenCountdown: true
property int lockScreenCountdownDuration: 10000
property bool autoStartAuth: false
property bool allowPasswordWithFprintd: false
property string clockStyle: "custom"
property string clockFormat: "hh\\nmm"
property list<string> lockScreenMonitors: [] // holds lock screen visibility per monitor
property real lockScreenBlur: 0.0
property real lockScreenTint: 0.0
property JsonObject keybinds: JsonObject {
property list<string> keyUp: ["Up"]
property list<string> keyDown: ["Down"]
property list<string> keyLeft: ["Left"]
property list<string> keyRight: ["Right"]
property list<string> keyEnter: ["Return"]
property list<string> keyEscape: ["Esc"]
}
}
// ui
@@ -357,6 +376,8 @@ Singleton {
property real transitionEdgeSmoothness: 0.05
property string panelPosition: "follow_bar"
property bool hideWallpaperFilenames: false
property real overviewBlur: 0.4
property real overviewTint: 0.6
// Wallhaven settings
property bool useWallhaven: false
property string wallhavenQuery: ""
@@ -368,7 +389,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", "random"
}
// applauncher
@@ -377,11 +400,13 @@ Singleton {
property bool autoPasteClipboard: false
property bool enableClipPreview: true
property bool clipboardWrapText: true
property string clipboardWatchTextCommand: "wl-paste --type text --watch cliphist store"
property string clipboardWatchImageCommand: "wl-paste --type image --watch cliphist store"
property string position: "center" // Position: center, top_left, top_right, bottom_left, bottom_right, bottom_center, top_center
property list<string> pinnedApps: []
property bool useApp2Unit: false
property bool sortByMostUsed: true
property string terminalCommand: "xterm -e"
property string terminalCommand: "alacritty -e"
property bool customLaunchPrefixEnabled: false
property string customLaunchPrefix: ""
// View mode: "list" or "grid"
@@ -391,8 +416,11 @@ Singleton {
property string iconMode: "tabler"
property bool showIconBackground: false
property bool enableSettingsSearch: true
property bool enableWindowsSearch: true
property bool ignoreMouseInput: false
property string screenshotAnnotationTool: ""
property bool overviewLayer: false
property string density: "default" // "compact", "default", "comfortable"
}
// control center
@@ -473,13 +501,16 @@ Singleton {
property int swapCriticalThreshold: 90
property int diskWarningThreshold: 80
property int diskCriticalThreshold: 90
property int cpuPollingInterval: 3000
property int tempPollingInterval: 3000
property int diskAvailWarningThreshold: 20
property int diskAvailCriticalThreshold: 10
property int batteryWarningThreshold: 20
property int batteryCriticalThreshold: 5
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: ""
@@ -522,8 +553,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: [
{
@@ -564,7 +595,6 @@ Singleton {
property int lowUrgencyDuration: 3
property int normalUrgencyDuration: 8
property int criticalUrgencyDuration: 15
property bool enableKeyboardLayoutToast: true
property JsonObject saveToHistory: JsonObject {
property bool low: true
property bool normal: true
@@ -580,6 +610,8 @@ Singleton {
property string excludedApps: "discord,firefox,chrome,chromium,edge"
}
property bool enableMediaToast: false
property bool enableKeyboardLayoutToast: true
property bool enableBatteryToast: true
}
// on-screen display
@@ -653,6 +685,11 @@ Singleton {
property string session: ""
}
// plugins
property JsonObject plugins: JsonObject {
property bool autoUpdate: false
}
// desktop widgets
property JsonObject desktopWidgets: JsonObject {
property bool enabled: false
@@ -1096,56 +1133,6 @@ Singleton {
}
}
// -----------------------------------------------------
// Ensure PAM password.conf exists in configDir (create once, never override)
function ensurePamConfig() {
var pamConfigDir = configDir + "pam";
var pamConfigFile = pamConfigDir + "/password.conf";
// Check if file already exists
fileCheckPamProcess.command = ["test", "-f", pamConfigFile];
fileCheckPamProcess.running = true;
}
function doCreatePamConfig() {
var pamConfigDir = configDir + "pam";
var pamConfigFile = pamConfigDir + "/password.conf";
var pamConfigDirEsc = pamConfigDir.replace(/'/g, "'\\''");
var pamConfigFileEsc = pamConfigFile.replace(/'/g, "'\\''");
// Ensure directory exists
Quickshell.execDetached(["mkdir", "-p", pamConfigDir]);
// Generate the PAM config file content
var configContent = "auth sufficient pam_fprintd.so timeout=-1\n";
configContent += "auth sufficient /run/current-system/sw/lib/security/pam_fprintd.so timeout=-1 # for NixOS\n";
configContent += "auth required pam_unix.so\n";
// Write the config file using heredoc to avoid escaping issues
var script = `cat > '${pamConfigFileEsc}' << 'EOF'\n`;
script += configContent;
script += "EOF\n";
Quickshell.execDetached(["sh", "-c", script]);
Logger.d("Settings", "PAM config file created at:", pamConfigFile);
}
// Process for checking if PAM config file exists
Process {
id: fileCheckPamProcess
running: false
onExited: function (exitCode) {
if (exitCode === 0) {
// File exists, skip creation
Logger.d("Settings", "PAM config file already exists, skipping creation");
} else {
// File doesn't exist, create it
doCreatePamConfig();
}
}
}
// -----------------------------------------------------
// Function to clean up deprecated user/custom bar widgets settings
function upgradeWidget(widget) {
@@ -1157,7 +1144,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)) {
@@ -1168,7 +1155,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;
}
+20
View File
@@ -71,6 +71,9 @@ Singleton {
property var telemetry: ({
instanceId: ""
})
// Launcher app usage counts
property var launcherUsage: ({})
}
onLoaded: {
@@ -90,6 +93,22 @@ Singleton {
}
}
// Launcher usage
function getLauncherUsageCount(key) {
const m = adapter.launcherUsage;
if (!m)
return 0;
const v = m[key];
return typeof v === 'number' && isFinite(v) ? v : 0;
}
function recordLauncherUsage(key) {
let counts = Object.assign({}, adapter.launcherUsage || {});
counts[key] = getLauncherUsageCount(key) + 1;
adapter.launcherUsage = counts;
save();
}
// Debounced save timer
Timer {
id: saveTimer
@@ -237,6 +256,7 @@ Singleton {
doNotDisturb: NotificationService.doNotDisturb,
noctaliaPerformanceMode: PowerProfileService.noctaliaPerformanceMode,
barVisible: BarService.isVisible,
openedPanel: PanelService.openedPanel?.objectName || "",
lockScreenActive: PanelService.lockScreen?.active || false,
wallpapers: WallpaperService.currentWallpapers || {},
desktopWidgetsEditMode: DesktopWidgetRegistry.editMode || false,
+1 -1
View File
@@ -139,7 +139,7 @@ Singleton {
readonly property real _barBaseFontSize: Math.max(1, (Style.barHeight / Style.capsuleHeight) * Style.fontSizeXXS)
readonly property real barFontSize: (Settings.data.bar.position === "left" || Settings.data.bar.position === "right") ? _barBaseFontSize * 0.9 : _barBaseFontSize
readonly property color capsuleColor: Settings.data.bar.showCapsule ? Qt.alpha(Color.mSurfaceVariant, Settings.data.bar.capsuleOpacity) : "transparent"
readonly property color capsuleColor: Settings.data.bar.showCapsule ? Qt.alpha(Settings.data.bar.capsuleColorKey !== "none" ? Color.resolveColorKey(Settings.data.bar.capsuleColorKey) : Color.mSurfaceVariant, Settings.data.bar.capsuleOpacity) : "transparent"
readonly property color capsuleBorderColor: Settings.data.bar.showOutline ? Color.mPrimary : "transparent"
readonly property int capsuleBorderWidth: Settings.data.bar.showOutline ? Style.borderS : 0
+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
+156 -19
View File
@@ -38,6 +38,14 @@ Variants {
property real stripesCount: 16
property real stripesAngle: 0
// Pixelate
property real pixelateMaxBlockSize: 64.0
// Honeycomb
property real honeycombCellSize: 0.04
property real honeycombCenterX: 0.5
property real honeycombCenterY: 0.5
// Used to debounce wallpaper changes
property string futureWallpaper: ""
// Track the original wallpaper path being transitioned to (before caching)
@@ -59,6 +67,7 @@ Variants {
Component.onDestruction: {
transitionAnimation.stop();
startupTransitionTimer.stop();
debounceTimer.stop();
shaderLoader.active = false;
currentWallpaper.source = "";
@@ -85,13 +94,23 @@ Variants {
Connections {
target: CompositorService
function onDisplayScalesChanged() {
if (isStartupTransition) {
const currentPath = WallpaperService.getWallpaper(modelData.name);
if (!currentPath || WallpaperService.isSolidColorPath(currentPath)) {
return;
}
const currentPath = WallpaperService.getWallpaper(modelData.name);
if (currentPath) {
requestPreprocessedWallpaper(currentPath);
if (isStartupTransition) {
// During startup, just ensure the correct cache exists without visual changes
const compositorScale = CompositorService.getDisplayScale(modelData.name);
const targetWidth = Math.round(modelData.width * compositorScale);
const targetHeight = Math.round(modelData.height * compositorScale);
ImageCacheService.getLarge(currentPath, targetWidth, targetHeight, function (cachedPath, success) {
WallpaperService.wallpaperProcessingComplete(modelData.name, currentPath, success ? cachedPath : "");
});
return;
}
requestPreprocessedWallpaper(currentPath);
}
}
@@ -116,6 +135,15 @@ Variants {
onTriggered: changeWallpaper()
}
// Delay startup transition to ensure the compositor has mapped the window
Timer {
id: startupTransitionTimer
interval: 100
running: false
repeat: false
onTriggered: _executeStartupTransition()
}
Image {
id: currentWallpaper
@@ -171,6 +199,10 @@ Variants {
return discShaderComponent;
case "stripes":
return stripesShaderComponent;
case "pixelate":
return pixelateShaderComponent;
case "honeycomb":
return honeycombShaderComponent;
case "fade":
case "none":
default:
@@ -309,6 +341,71 @@ Variants {
}
}
// Pixelate transition shader component
Component {
id: pixelateShaderComponent
ShaderEffect {
anchors.fill: parent
property variant source1: currentWallpaper
property variant source2: nextWallpaper
property real progress: root.transitionProgress
property real maxBlockSize: root.pixelateMaxBlockSize
// Fill mode properties
property real fillMode: root.fillMode
property vector4d fillColor: root.fillColor
property real imageWidth1: source1.sourceSize.width
property real imageHeight1: source1.sourceSize.height
property real imageWidth2: source2.sourceSize.width
property real imageHeight2: source2.sourceSize.height
property real screenWidth: width
property real screenHeight: height
// Solid color mode
property real isSolid1: root.isSolid1 ? 1.0 : 0.0
property real isSolid2: root.isSolid2 ? 1.0 : 0.0
property vector4d solidColor1: root.solidColor1
property vector4d solidColor2: root.solidColor2
fragmentShader: Qt.resolvedUrl(Quickshell.shellDir + "/Shaders/qsb/wp_pixelate.frag.qsb")
}
}
// Honeycomb transition shader component
Component {
id: honeycombShaderComponent
ShaderEffect {
anchors.fill: parent
property variant source1: currentWallpaper
property variant source2: nextWallpaper
property real progress: root.transitionProgress
property real cellSize: root.honeycombCellSize
property real centerX: root.honeycombCenterX
property real centerY: root.honeycombCenterY
property real aspectRatio: root.width / root.height
// Fill mode properties
property real fillMode: root.fillMode
property vector4d fillColor: root.fillColor
property real imageWidth1: source1.sourceSize.width
property real imageHeight1: source1.sourceSize.height
property real imageWidth2: source2.sourceSize.width
property real imageHeight2: source2.sourceSize.height
property real screenWidth: width
property real screenHeight: height
// Solid color mode
property real isSolid1: root.isSolid1 ? 1.0 : 0.0
property real isSolid2: root.isSolid2 ? 1.0 : 0.0
property vector4d solidColor1: root.solidColor1
property vector4d solidColor2: root.solidColor2
fragmentShader: Qt.resolvedUrl(Quickshell.shellDir + "/Shaders/qsb/wp_honeycomb.frag.qsb")
}
}
// Animation for the transition progress
NumberAnimation {
id: transitionAnimation
@@ -316,8 +413,7 @@ Variants {
property: "transitionProgress"
from: 0.0
to: 1.0
// The stripes shader feels faster visually, we make it a bit slower here.
duration: transitionType == "stripes" ? Settings.data.wallpaper.transitionDuration * 1.6 : Settings.data.wallpaper.transitionDuration
duration: Settings.data.wallpaper.transitionDuration
easing.type: Easing.InOutCubic
onFinished: {
// Clear the tracking of what we're transitioning to
@@ -344,6 +440,18 @@ Variants {
}
}
// Normalize a path (string or QUrl) to a plain string for comparison.
// QML Image.source is a url type; comparing url === string can return
// false even for identical paths. This converts both sides to strings.
function _pathStr(p) {
var s = p.toString();
// QUrl.toString() may add a file:// prefix for local paths
if (s.startsWith("file://")) {
return s.substring(7);
}
return s;
}
// ------------------------------------------------------
function setWallpaperInitial() {
// On startup, defer assigning wallpaper until the services are ready
@@ -424,6 +532,14 @@ Variants {
} else {
futureWallpaper = originalPath;
}
// Skip transition if the resolved path matches what's already displayed
if (_pathStr(futureWallpaper) === _pathStr(currentWallpaper.source)) {
transitioningToOriginalPath = "";
WallpaperService.wallpaperProcessingComplete(modelData.name, originalPath, success ? cachedPath : "");
return;
}
debounceTimer.restart();
// Pass cached path for blur optimization (already resized)
WallpaperService.wallpaperProcessingComplete(modelData.name, originalPath, success ? cachedPath : "");
@@ -473,8 +589,8 @@ Variants {
}
}
// For images, check if source matches
if (!isSolidSource && source === currentWallpaper.source) {
// For images, check if source matches (use _pathStr to normalize url vs string)
if (!isSolidSource && _pathStr(source) === _pathStr(currentWallpaper.source)) {
return;
}
@@ -567,6 +683,16 @@ Variants {
stripesAngle = Math.random() * 360;
setWallpaperWithTransition(futureWallpaper);
break;
case "pixelate":
pixelateMaxBlockSize = Math.round(Math.random() * 80 + 32);
setWallpaperWithTransition(futureWallpaper);
break;
case "honeycomb":
honeycombCellSize = Math.random() * 0.04 + 0.02;
honeycombCenterX = Math.random();
honeycombCenterY = Math.random();
setWallpaperWithTransition(futureWallpaper);
break;
default:
setWallpaperWithTransition(futureWallpaper);
break;
@@ -575,6 +701,8 @@ Variants {
// ------------------------------------------------------
// Dedicated function for startup animation
// Sets up transition params, then defers the actual animation
// to allow the compositor time to map the window.
function performStartupTransition() {
// Get the transitionType from the settings
transitionType = Settings.data.wallpaper.transitionType;
@@ -589,31 +717,40 @@ Variants {
transitionType = "fade";
}
// Apply transitionType so the shader loader picks the correct shader
this.transitionType = transitionType;
// Pre-compute per-type params so the shader is ready
switch (transitionType) {
case "none":
setWallpaperImmediate(futureWallpaper);
break;
case "wipe":
wipeDirection = Math.random() * 4;
setWallpaperWithTransition(futureWallpaper);
break;
case "disc":
// Force center origin for elegant startup animation
discCenterX = 0.5;
discCenterY = 0.5;
setWallpaperWithTransition(futureWallpaper);
break;
case "stripes":
stripesCount = Math.round(Math.random() * 20 + 4);
stripesAngle = Math.random() * 360;
setWallpaperWithTransition(futureWallpaper);
break;
default:
setWallpaperWithTransition(futureWallpaper);
case "pixelate":
pixelateMaxBlockSize = 64.0;
break;
case "honeycomb":
honeycombCellSize = 0.04;
honeycombCenterX = 0.5;
honeycombCenterY = 0.5;
break;
}
// Defer the actual transition start so the compositor can map the window
startupTransitionTimer.start();
}
// Actually kick off the startup transition after the delay
function _executeStartupTransition() {
if (transitionType === "none") {
setWallpaperImmediate(futureWallpaper);
} else {
setWallpaperWithTransition(futureWallpaper);
}
// Mark startup transition complete
isStartupTransition = false;
+5 -4
View File
@@ -4,6 +4,7 @@ import Quickshell
import Quickshell.Wayland
import qs.Commons
import qs.Services.Compositor
import qs.Services.Power
import qs.Services.UI
Loader {
@@ -100,16 +101,16 @@ Loader {
layer.enabled: true
layer.smooth: false
layer.effect: MultiEffect {
blurEnabled: true
blur: 1.0
blurMax: 32
blurEnabled: !PowerProfileService.noctaliaPerformanceMode && (Settings.data.wallpaper.overviewBlur > 0)
blur: Settings.data.wallpaper.overviewBlur
blurMax: 48
}
// Tint overlay
Rectangle {
anchors.fill: parent
color: tintColor
opacity: 0.6
opacity: Settings.data.wallpaper.overviewTint
}
}
}
+207 -67
View File
@@ -27,6 +27,34 @@ Item {
});
}
// Hot corner: trigger click on first widget in a section
function triggerFirstWidgetInSection(sectionName: string) {
var widgets = BarService.getWidgetsBySection(sectionName, screen?.name);
for (var i = 0; i < widgets.length; i++) {
var widget = widgets[i];
if (widget && widget.visible && widget.widgetId !== "Spacer") {
if (typeof widget.clicked === "function") {
widget.clicked();
}
return;
}
}
}
// Hot corner: trigger click on last widget in a section
function triggerLastWidgetInSection(sectionName: string) {
var widgets = BarService.getWidgetsBySection(sectionName, screen?.name);
for (var i = widgets.length - 1; i >= 0; i--) {
var widget = widgets[i];
if (widget && widget.visible && widget.widgetId !== "Spacer") {
if (typeof widget.clicked === "function") {
widget.clicked();
}
return;
}
}
}
// Expose bar region for click-through mask
readonly property var barRegion: barContentLoader.item?.children[0] || null
@@ -46,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
@@ -170,39 +268,39 @@ Item {
acceptedButtons: Qt.RightButton
hoverEnabled: false
preventStealing: true
onClicked: function (mouse) {
if (mouse.button === Qt.RightButton) {
// Check if click is over any widget
var widgets = BarService.getAllWidgetInstances(null, screen.name);
for (var i = 0; i < widgets.length; i++) {
var widget = widgets[i];
if (!widget || !widget.visible || widget.widgetId === "Spacer") {
continue;
}
// Map click position to widget's coordinate space
var localPos = mapToItem(widget, mouse.x, mouse.y);
onClicked: mouse => {
if (mouse.button === Qt.RightButton) {
// Check if click is over any widget
var widgets = BarService.getAllWidgetInstances(null, screen.name);
for (var i = 0; i < widgets.length; i++) {
var widget = widgets[i];
if (!widget || !widget.visible || widget.widgetId === "Spacer") {
continue;
}
// Map click position to widget's coordinate space
var localPos = mapToItem(widget, mouse.x, mouse.y);
if (root.barIsVertical) {
if (localPos.y >= -Style.marginS && localPos.y <= widget.height + Style.marginS) {
return;
}
} else {
if (localPos.x >= -Style.marginS && localPos.x <= widget.width + Style.marginS) {
return;
}
}
}
// Click is on empty bar background - open control center
var controlCenterPanel = PanelService.getPanel("controlCenterPanel", screen);
if (Settings.data.controlCenter.position === "close_to_bar_button") {
// Will attempt to open the panel next to the bar button if any.
controlCenterPanel?.toggle(null, "ControlCenter");
} else {
controlCenterPanel?.toggle();
}
mouse.accepted = true;
}
}
if (root.barIsVertical) {
if (localPos.y >= -Style.marginS && localPos.y <= widget.height + Style.marginS) {
return;
}
} else {
if (localPos.x >= -Style.marginS && localPos.x <= widget.width + Style.marginS) {
return;
}
}
}
// Click is on empty bar background - open control center
var controlCenterPanel = PanelService.getPanel("controlCenterPanel", screen);
if (Settings.data.controlCenter.position === "close_to_bar_button") {
// Will attempt to open the panel next to the bar button if any.
controlCenterPanel?.toggle(null, "ControlCenter");
} else {
controlCenterPanel?.toggle();
}
mouse.accepted = true;
}
}
}
Loader {
@@ -220,26 +318,47 @@ Item {
anchors.fill: parent
clip: true
// Top edge hot corner - triggers first widget in left (top) section
MouseArea {
width: parent.width
height: Style.marginS
x: 0
y: 0
onClicked: root.triggerFirstWidgetInSection("left")
}
// Bottom edge hot corner - triggers last widget in right (bottom) section
MouseArea {
width: parent.width
height: Style.marginS
x: 0
anchors.bottom: parent.bottom
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.marginM
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
}
@@ -253,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
}
@@ -275,22 +394,22 @@ Item {
ColumnLayout {
x: Style.pixelAlignCenter(parent.width, width)
anchors.bottom: parent.bottom
anchors.bottomMargin: Style.marginM
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
}
@@ -306,28 +425,49 @@ Item {
anchors.fill: parent
clip: true
// Left edge hot corner - triggers first widget in left section
MouseArea {
width: Style.marginS
height: parent.height
x: 0
y: 0
onClicked: root.triggerFirstWidgetInSection("left")
}
// Right edge hot corner - triggers last widget in right section
MouseArea {
width: Style.marginS
height: parent.height
anchors.right: parent.right
y: 0
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
}
@@ -343,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
}
@@ -366,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);
}
+16 -5
View File
@@ -12,7 +12,7 @@ Item {
property string icon: ""
property string text: ""
property string suffix: ""
property string tooltipText: ""
property var tooltipText: ""
property bool autoHide: false
property bool forceOpen: false
property bool forceClose: false
@@ -21,6 +21,8 @@ Item {
property bool rotateText: false
property color customBackgroundColor: "transparent"
property color customTextIconColor: "transparent"
property color customIconColor: "transparent"
property color customTextColor: "transparent"
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property bool isVerticalBar: barPosition === "left" || barPosition === "right"
@@ -34,13 +36,18 @@ Item {
signal middleClicked
signal wheel(int delta)
// Dynamic sizing based on loaded component
width: pillLoader.item ? pillLoader.item.width : 0
height: pillLoader.item ? pillLoader.item.height : 0
// Size based on content for the content dimension, fill parent for the extended dimension
// Horizontal bars: width = content, height = fill parent (for extended click area)
// Vertical bars: width = fill parent, height = content
width: isVerticalBar ? parent.width : (pillLoader.item ? pillLoader.item.implicitWidth : 0)
height: isVerticalBar ? (pillLoader.item ? pillLoader.item.implicitHeight : 0) : parent.height
implicitWidth: pillLoader.item ? pillLoader.item.implicitWidth : 0
implicitHeight: pillLoader.item ? pillLoader.item.implicitHeight : 0
// Loader to switch between vertical and horizontal pill implementations
// Loader fills BarPill so child components can extend to full bar dimension
Loader {
id: pillLoader
anchors.fill: parent
sourceComponent: isVerticalBar ? verticalPillComponent : horizontalPillComponent
Component {
@@ -59,6 +66,8 @@ Item {
rotateText: root.rotateText
customBackgroundColor: root.customBackgroundColor
customTextIconColor: root.customTextIconColor
customIconColor: root.customIconColor
customTextColor: root.customTextColor
onShown: root.shown()
onHidden: root.hidden()
onEntered: root.entered()
@@ -85,6 +94,8 @@ Item {
hovered: root.hovered
customBackgroundColor: root.customBackgroundColor
customTextIconColor: root.customTextIconColor
customIconColor: root.customIconColor
customTextColor: root.customTextColor
onShown: root.shown()
onHidden: root.hidden()
onEntered: root.entered()
+24 -14
View File
@@ -13,7 +13,7 @@ Item {
property string icon: ""
property string text: ""
property string suffix: ""
property string tooltipText: ""
property var tooltipText: ""
property bool autoHide: false
property bool forceOpen: false
property bool forceClose: false
@@ -21,6 +21,8 @@ Item {
property bool hovered: false
property color customBackgroundColor: "transparent"
property color customTextIconColor: "transparent"
property color customIconColor: "transparent"
property color customTextColor: "transparent"
readonly property bool collapseToIcon: forceClose && !forceOpen
@@ -50,10 +52,13 @@ Item {
// Always prioritize hover color, then the custom one and finally the fallback color
readonly property color bgColor: hovered ? Color.mHover : (customBackgroundColor.a > 0) ? customBackgroundColor : Style.capsuleColor
readonly property color fgColor: hovered ? Color.mOnHover : (customTextIconColor.a > 0) ? customTextIconColor : Color.mOnSurface
readonly property color iconFgColor: hovered ? Color.mOnHover : (customIconColor.a > 0) ? customIconColor : (customTextIconColor.a > 0) ? customTextIconColor : Color.mOnSurface
readonly property color textFgColor: hovered ? Color.mOnHover : (customTextColor.a > 0) ? customTextColor : (customTextIconColor.a > 0) ? customTextIconColor : Color.mOnSurface
readonly property real iconSize: Style.toOdd(pillHeight * 0.48)
width: {
// Content width calculation (for implicit sizing)
readonly property real contentWidth: {
if (collapseToIcon) {
return hasIcon ? pillHeight : 0;
}
@@ -61,7 +66,12 @@ Item {
var baseWidth = hasIcon ? pillHeight : 0;
return baseWidth + Math.max(0, pill.width - overlap);
}
height: pillHeight
// Fill parent to extend click area to full bar height
// Visual content is centered vertically within
anchors.fill: parent
implicitWidth: contentWidth
implicitHeight: pillHeight
Connections {
target: root
@@ -133,7 +143,7 @@ Item {
family: Settings.data.ui.fontFixed
pointSize: root.barFontSize
applyUiScale: false
color: root.fgColor
color: root.textFgColor
visible: revealed
}
@@ -167,7 +177,7 @@ Item {
icon: root.icon
pointSize: iconSize
applyUiScale: false
color: root.fgColor
color: root.iconFgColor
// Center horizontally
x: (iconCircle.width - width) / 2
// Center vertically accounting for font metrics
@@ -276,15 +286,15 @@ Item {
}
TooltipService.hide();
}
onClicked: function (mouse) {
if (mouse.button === Qt.LeftButton) {
root.clicked();
} else if (mouse.button === Qt.RightButton) {
root.rightClicked();
} else if (mouse.button === Qt.MiddleButton) {
root.middleClicked();
}
}
onClicked: mouse => {
if (mouse.button === Qt.LeftButton) {
root.clicked();
} else if (mouse.button === Qt.RightButton) {
root.rightClicked();
} else if (mouse.button === Qt.MiddleButton) {
root.middleClicked();
}
}
onWheel: wheel => root.wheel(wheel.angleDelta.y)
}
+32 -24
View File
@@ -13,7 +13,7 @@ Item {
property string icon: ""
property string text: ""
property string suffix: ""
property string tooltipText: ""
property var tooltipText: ""
property bool autoHide: false
property bool forceOpen: false
property bool forceClose: false
@@ -22,6 +22,8 @@ Item {
property bool rotateText: false
property color customBackgroundColor: "transparent"
property color customTextIconColor: "transparent"
property color customIconColor: "transparent"
property color customTextColor: "transparent"
readonly property bool collapseToIcon: forceClose && !forceOpen
@@ -57,24 +59,30 @@ Item {
// Always prioritize hover color, then the custom one and finally the fallback color
readonly property color bgColor: hovered ? Color.mHover : (customBackgroundColor.a > 0) ? customBackgroundColor : Style.capsuleColor
readonly property color fgColor: hovered ? Color.mOnHover : (customTextIconColor.a > 0) ? customTextIconColor : Color.mOnSurface
readonly property color iconFgColor: hovered ? Color.mOnHover : (customIconColor.a > 0) ? customIconColor : (customTextIconColor.a > 0) ? customTextIconColor : Color.mOnSurface
readonly property color textFgColor: hovered ? Color.mOnHover : (customTextColor.a > 0) ? customTextColor : (customTextIconColor.a > 0) ? customTextIconColor : Color.mOnSurface
readonly property real iconSize: Style.toOdd(pillHeight * 0.48)
// For vertical bars: width is just icon size, height includes pill space
width: buttonSize
height: {
// Content height calculation (for implicit sizing)
readonly property real contentHeight: {
if (collapseToIcon) {
return hasIcon ? buttonSize : 0;
}
if (revealed) {
var overlap = hasIcon ? pillOverlap : 0;
var baseHeight = hasIcon ? buttonSize : 0;
return baseHeight + Math.max(0, maxPillHeight - overlap);
}
// Fallback to buttonSize in idle state to remain clickable
return buttonSize;
var overlap = hasIcon ? pillOverlap : 0;
var baseHeight = hasIcon ? buttonSize : 0;
return baseHeight + Math.max(0, pill.height - overlap);
}
// Fill parent width to extend horizontal click area
// Keep content-based height for visual layout
anchors.left: parent ? parent.left : undefined
anchors.right: parent ? parent.right : undefined
anchors.verticalCenter: parent ? parent.verticalCenter : undefined
height: contentHeight
implicitWidth: buttonSize
implicitHeight: contentHeight
Connections {
target: root
function onTooltipTextChanged() {
@@ -88,7 +96,7 @@ Item {
Rectangle {
id: pillBackground
width: buttonSize
height: root.height
height: root.contentHeight
radius: Style.radiusM
color: root.bgColor
border.color: Style.capsuleBorderColor
@@ -143,7 +151,7 @@ Item {
applyUiScale: false
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: root.fgColor
color: root.textFgColor
visible: revealed
function getVerticalCenterOffset() {
@@ -183,14 +191,14 @@ Item {
// Icon positioning based on direction
x: 0
y: openUpward ? (parent.height - height) : 0
y: openUpward ? (root.contentHeight - height) : 0
anchors.horizontalCenter: parent.horizontalCenter
NIcon {
icon: root.icon
pointSize: iconSize
applyUiScale: false
color: root.fgColor
color: root.iconFgColor
// Center horizontally
x: (iconCircle.width - width) / 2
// Center vertically accounting for font metrics
@@ -315,15 +323,15 @@ Item {
}
TooltipService.hide();
}
onClicked: function (mouse) {
if (mouse.button === Qt.LeftButton) {
root.clicked();
} else if (mouse.button === Qt.RightButton) {
root.rightClicked();
} else if (mouse.button === Qt.MiddleButton) {
root.middleClicked();
}
}
onClicked: mouse => {
if (mouse.button === Qt.LeftButton) {
root.clicked();
} else if (mouse.button === Qt.RightButton) {
root.rightClicked();
} else if (mouse.button === Qt.MiddleButton) {
root.middleClicked();
}
}
onWheel: wheel => root.wheel(wheel.angleDelta.y)
}
+53 -8
View File
@@ -15,9 +15,30 @@ Item {
readonly property string section: widgetProps ? (widgetProps.section || "") : ""
readonly property int sectionIndex: widgetProps ? (widgetProps.sectionWidgetIndex || 0) : 0
// Don't reserve space unless the loaded widget is really visible
implicitWidth: getImplicitSize(loader.item, "implicitWidth")
implicitHeight: getImplicitSize(loader.item, "implicitHeight")
// Store registration key at registration time so unregistration always uses the correct key,
// even if binding properties (section, sectionIndex) have changed by destruction time
property string _regScreen: ""
property string _regSection: ""
property string _regWidgetId: ""
property int _regIndex: -1
function _unregister() {
if (_regScreen !== "") {
BarService.unregisterWidget(_regScreen, _regSection, _regWidgetId, _regIndex);
_regScreen = "";
}
}
// Bar orientation and height for extended click areas
readonly property string barPosition: Settings.getBarPositionForScreen(widgetScreen?.name)
readonly property bool isVerticalBar: barPosition === "left" || barPosition === "right"
readonly property real barHeight: Style.getBarHeightForScreen(widgetScreen?.name)
// Request full bar dimension from layout to extend click areas above/below widgets
// For horizontal bars: full bar height, widget's content width
// For vertical bars: full bar width, widget's content height
implicitWidth: isVerticalBar ? barHeight : getImplicitSize(loader.item, "implicitWidth")
implicitHeight: isVerticalBar ? getImplicitSize(loader.item, "implicitHeight") : barHeight
// Remove layout space left by hidden widgets
visible: loader.item ? ((loader.item.opacity > 0.0) || (loader.item.hasOwnProperty("hideMode") && loader.item.hideMode === "transparent")) : false
@@ -60,12 +81,32 @@ Item {
return root.checkWidgetExists() ? BarWidgetRegistry.getWidget(root.widgetId) : null;
}
// Unregister when the loaded item is destroyed (Loader deactivated or sourceComponent changed)
onItemChanged: {
if (!item) {
root._unregister();
}
}
onLoaded: {
if (!item)
return;
Logger.d("BarWidgetLoader", "Loading widget", widgetId, "on screen:", widgetScreen.name);
// Extend widget to fill full bar dimension for extended click areas
// For horizontal bars: widget fills bar height (content width preserved)
// For vertical bars: widget fills bar width (content height preserved)
if (root.isVerticalBar) {
item.width = Qt.binding(function () {
return root.barHeight;
});
} else {
item.height = Qt.binding(function () {
return root.barHeight;
});
}
// Apply properties to loaded widget
for (var prop in widgetProps) {
if (item.hasOwnProperty(prop)) {
@@ -89,8 +130,15 @@ Item {
}
}
// Register this widget instance with BarService
// Unregister any previous registration before registering the new instance
root._unregister();
// Register and store the key for reliable unregistration
BarService.registerWidget(widgetScreen.name, section, widgetId, sectionIndex, item);
root._regScreen = widgetScreen.name;
root._regSection = section;
root._regWidgetId = widgetId;
root._regIndex = sectionIndex;
// Call custom onLoaded if it exists
if (item.hasOwnProperty("onLoaded")) {
@@ -99,10 +147,7 @@ Item {
}
Component.onDestruction: {
// Unregister when destroyed
if (widgetScreen && section) {
BarService.unregisterWidget(widgetScreen.name, section, widgetId, sectionIndex);
}
root._unregister();
}
}
+146 -45
View File
@@ -47,6 +47,16 @@ PopupWindow {
// Use the content height of the Flickable for implicit height
implicitHeight: Math.min(screen?.height * 0.9, flickable.contentHeight + (Style.marginS * 2))
// When implicitHeight changes (menu content loads), force anchor recalculation
onImplicitHeightChanged: {
if (visible && anchorItem) {
Qt.callLater(() => {
anchor.updateAnchor();
});
}
}
visible: false
color: "transparent"
anchor.item: anchorItem
@@ -63,21 +73,25 @@ PopupWindow {
menuScreenX = windowXOnScreen + posInPopup.x + baseX;
} else {
const anchorGlobalPos = anchorItem.mapToItem(null, 0, 0);
menuScreenX = anchorGlobalPos.x + baseX;
const anchorScreenX = anchorGlobalPos.x;
menuScreenX = anchorScreenX + baseX;
}
const menuRight = menuScreenX + implicitWidth;
const screenRight = screen.width;
const menuLeft = menuScreenX;
// Adjust if menu would clip on the right
if (menuRight > screenRight) {
// Only adjust if menu would clip off screen boundaries
// Don't adjust if the positioning is intentional (e.g., negative offset for right bar)
if (menuRight > screenRight && menuLeft < screenRight) {
// Clipping on right edge - shift left
const overflow = menuRight - screenRight;
return baseX - overflow - Style.marginM;
}
// Adjust if menu would clip on the left
if (menuScreenX < 0) {
return baseX - menuScreenX + Style.marginM;
return baseX - overflow - Style.marginS;
} else if (menuLeft < 0 && menuRight > 0) {
// Clipping on left edge - shift right
return baseX - menuLeft + Style.marginS;
}
return baseX;
}
return anchorX;
@@ -86,52 +100,60 @@ PopupWindow {
if (anchorItem && screen) {
const barPosition = Settings.getBarPositionForScreen(root.screen?.name);
// Calculate base Y offset (relative to anchor item)
let baseY = anchorY;
if (!isSubMenu && barPosition === "bottom") {
// For bottom bar, position menu above the anchor with margin (adjusted to match widget menu positioning)
baseY = -(implicitHeight + Style.marginL + 2);
// Only apply bottom bar special positioning if:
// 1. Not a submenu
// 2. Bar is at bottom
// 3. anchorY is not already negative (if negative, it's pre-calculated from drawer)
const shouldApplyBottomBarLogic = !isSubMenu && barPosition === "bottom" && anchorY >= 0;
if (shouldApplyBottomBarLogic) {
// For bottom bar from the bar itself, position menu above the anchor with margin
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;
}
// Calculate position relative to current screen (not global coordinates)
let menuScreenY;
if (isSubMenu && anchorItem.Window && anchorItem.Window.window) {
// Submenu: anchor is inside parent PopupWindow
const posInPopup = anchorItem.mapToItem(null, 0, 0);
const parentWindow = anchorItem.Window.window;
// Convert global window Y to screen-relative Y by subtracting screen offset
const windowYOnScreen = parentWindow.y - screen.y;
menuScreenY = windowYOnScreen + posInPopup.y + baseY;
} else if (!isSubMenu && barPosition === "bottom") {
// Bottom bar main menu: subtract baseY to position above anchor
const anchorGlobalPos = anchorItem.mapToItem(null, 0, 0);
menuScreenY = anchorGlobalPos.y - baseY;
} else {
// Main menu for other positions: add baseY
const anchorGlobalPos = anchorItem.mapToItem(null, 0, 0);
menuScreenY = anchorGlobalPos.y + baseY;
// Use a robust way to get screen coordinates
const posInWindow = anchorItem.mapToItem(null, 0, 0);
const parentWindow = anchorItem.Window.window;
// Calculate screen-relative Y of the window
let windowYOnScreen = (parentWindow && screen) ? (parentWindow.y - screen.y) : 0;
// If window reported 0 but bar is at bottom, assume it's at screen bottom
if (windowYOnScreen === 0 && barPosition === "bottom" && screen) {
windowYOnScreen = screen.height - (parentWindow ? parentWindow.height : Style.getBarHeightForScreen(screen.name));
}
const menuBottom = menuScreenY + implicitHeight;
const screenBottom = screen.height;
// 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.marginS) : baseY;
// Adjust baseY if menu would clip
if (menuBottom > screenBottom) {
// Clip at bottom - shift up by the overflow amount
const overflow = menuBottom - screenBottom;
if (!isSubMenu && barPosition === "bottom") {
return baseY + overflow + Style.marginM;
}
return baseY - overflow - Style.marginM;
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.marginS) : baseY;
// Adjust if menu would clip off the bottom
if (menuBottom > screenHeight) {
const overflow = menuBottom - screenHeight;
finalBaseY -= (overflow + Style.marginS);
}
// Adjust if menu would clip off the top
// menuScreenY < 0 means it's above the screen edge
if (menuScreenY < 0) {
// Clip at top - shift down
if (!isSubMenu && barPosition === "bottom") {
return baseY + menuScreenY - Style.marginM;
}
return baseY - menuScreenY + Style.marginM;
finalBaseY -= (menuScreenY - Style.marginS);
}
return baseY;
return finalBaseY;
}
// Fallback if no anchor/screen
@@ -271,6 +293,85 @@ PopupWindow {
anchors.rightMargin: Style.marginM
spacing: Style.marginS
// Indicator Container
Item {
visible: (modelData?.buttonType ?? QsMenuButtonType.None) !== QsMenuButtonType.None
implicitWidth: Math.round(Style.baseWidgetSize * 0.5)
implicitHeight: Math.round(Style.baseWidgetSize * 0.5)
Layout.alignment: Qt.AlignVCenter
// Helper properties
readonly property int type: modelData?.buttonType ?? QsMenuButtonType.None
readonly property bool isRadio: type === QsMenuButtonType.RadioButton
readonly property bool isChecked: modelData?.checkState === Qt.Checked || (modelData?.checked ?? false)
// Color Logic
readonly property color activeColor: mouseArea.containsMouse ? Color.mOnHover : Color.mPrimary
readonly property color checkMarkColor: mouseArea.containsMouse ? Color.mHover : Color.mOnPrimary
readonly property color borderColor: isChecked ? activeColor : (mouseArea.containsMouse ? Color.mOnHover : Color.mOnSurface)
// Checkbox Visuals
Rectangle {
visible: !parent.isRadio
anchors.centerIn: parent
width: Math.round(Style.baseWidgetSize * 0.5)
height: Math.round(Style.baseWidgetSize * 0.5)
radius: Style.iRadiusXS
color: "transparent" // Transparent to match RadioButton style
border.color: parent.borderColor
border.width: Style.borderM
Behavior on border.color {
ColorAnimation {
duration: Style.animationFast
}
}
NIcon {
visible: parent.parent.isChecked
anchors.centerIn: parent
anchors.horizontalCenterOffset: -1
icon: "check"
color: parent.parent.activeColor
pointSize: Math.max(Style.fontSizeXXS, parent.width * 0.6)
}
}
// RadioButton Visuals
Rectangle {
visible: parent.isRadio
anchors.centerIn: parent
width: Style.toOdd(Style.baseWidgetSize * 0.5)
height: Style.toOdd(Style.baseWidgetSize * 0.5)
radius: width / 2
color: "transparent"
border.color: parent.borderColor
border.width: Style.borderM // Slightly thicker for radio look
Behavior on border.color {
ColorAnimation {
duration: Style.animationFast
}
}
Rectangle {
visible: parent.parent.isChecked
anchors.centerIn: parent
width: Style.toOdd(parent.width * 0.5)
height: Style.toOdd(parent.height * 0.5)
radius: width / 2
color: parent.parent.activeColor
Behavior on color {
ColorAnimation {
duration: Style.animationFast
}
}
}
}
}
NText {
id: text
Layout.fillWidth: true
+244
View File
@@ -0,0 +1,244 @@
import QtQuick
import qs.Commons
import qs.Services.Compositor
import qs.Widgets
Item {
id: pillContainer
required property var workspace
required property bool isVertical
// These must be provided by the parent Workspace widget
required property real baseDimensionRatio
required property real capsuleHeight
required property real barHeight
required property string labelMode
required property int characterCount
required property real textRatio
required property bool showLabelsOnlyWhenOccupied
required property string focusedColor
required property string occupiedColor
required property string emptyColor
required property real masterProgress
required property bool effectsActive
required property color effectColor
required property var getWorkspaceWidth
required property var getWorkspaceHeight
// Fixed dimension (cross-axis) for visual pill
readonly property real fixedDimension: Style.toOdd(capsuleHeight * baseDimensionRatio)
// Helper to safely get colors with proper reactivity
// Accesses Color singleton directly to ensure fresh values
function getColorPair(colorKey) {
switch (colorKey) {
case "primary":
return [Color.mPrimary, Color.mOnPrimary];
case "secondary":
return [Color.mSecondary, Color.mOnSecondary];
case "tertiary":
return [Color.mTertiary, Color.mOnTertiary];
case "onSurface":
return [Color.mOnSurface, Color.mSurface];
default:
return [Color.mPrimary, Color.mOnPrimary];
}
}
// Animated pill dimensions (for visual pill, not container)
property real pillWidth: isVertical ? fixedDimension : getWorkspaceWidth(workspace, false)
property real pillHeight: isVertical ? getWorkspaceHeight(workspace, false) : fixedDimension
// Container uses full barHeight on cross-axis for larger click area
width: isVertical ? barHeight : getWorkspaceWidth(workspace, false)
height: isVertical ? getWorkspaceHeight(workspace, false) : barHeight
states: [
State {
name: "active"
when: workspace.isActive
PropertyChanges {
target: pillContainer
width: isVertical ? barHeight : getWorkspaceWidth(workspace, true)
height: isVertical ? getWorkspaceHeight(workspace, true) : barHeight
pillWidth: isVertical ? fixedDimension : getWorkspaceWidth(workspace, true)
pillHeight: isVertical ? getWorkspaceHeight(workspace, true) : fixedDimension
}
}
]
transitions: [
Transition {
from: "inactive"
to: "active"
NumberAnimation {
properties: isVertical ? "height,pillHeight" : "width,pillWidth"
duration: Style.animationNormal
easing.type: Easing.OutBack
}
},
Transition {
from: "active"
to: "inactive"
NumberAnimation {
properties: isVertical ? "height,pillHeight" : "width,pillWidth"
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
]
Rectangle {
id: pill
width: pillContainer.pillWidth
height: pillContainer.pillHeight
x: Style.pixelAlignCenter(parent.width, width)
y: Style.pixelAlignCenter(parent.height, height)
radius: Style.radiusM
z: 0
color: {
if (pillMouseArea.containsMouse)
return Color.mHover;
if (workspace.isFocused)
return getColorPair(focusedColor)[0];
if (workspace.isUrgent)
return Color.mError;
if (workspace.isOccupied)
return getColorPair(occupiedColor)[0];
return Qt.alpha(getColorPair(emptyColor)[0], 0.3);
}
Loader {
active: (labelMode !== "none") && (!showLabelsOnlyWhenOccupied || workspace.isOccupied || workspace.isFocused)
anchors.fill: parent
sourceComponent: Component {
NText {
text: {
if (workspace.name && workspace.name.length > 0) {
if (labelMode === "name") {
return workspace.name.substring(0, characterCount);
}
if (labelMode === "index+name") {
// Vertical mode: compact format (no space, first char only)
// Horizontal mode: full format (space, more chars)
if (isVertical) {
return workspace.idx.toString() + workspace.name.substring(0, 1);
}
return workspace.idx.toString() + " " + workspace.name.substring(0, characterCount);
}
}
return workspace.idx.toString();
}
family: Settings.data.ui.fontFixed
// Size based on the fixed dimension (cross-axis) of the visual pill
pointSize: (isVertical ? pillContainer.pillWidth : pillContainer.pillHeight) * textRatio
applyUiScale: false
font.capitalization: Font.AllUppercase
font.weight: Style.fontWeightBold
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.Wrap
color: {
if (pillMouseArea.containsMouse)
return Color.mOnHover;
if (workspace.isFocused)
return getColorPair(focusedColor)[1];
if (workspace.isUrgent)
return Color.mOnError;
if (workspace.isOccupied)
return getColorPair(occupiedColor)[1];
return getColorPair(emptyColor)[1];
}
Behavior on color {
enabled: !Color.isTransitioning
ColorAnimation {
duration: Style.animationFast
easing.type: Easing.InOutQuad
}
}
}
}
}
// Material 3-inspired smooth animations
Behavior on scale {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
Behavior on color {
enabled: !Color.isTransitioning
ColorAnimation {
duration: Style.animationFast
easing.type: Easing.InOutQuad
}
}
Behavior on opacity {
NumberAnimation {
duration: Style.animationFast
easing.type: Easing.InOutCubic
}
}
Behavior on radius {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
}
Behavior on width {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
Behavior on height {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
Behavior on pillWidth {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
Behavior on pillHeight {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
// Full-height click area
MouseArea {
id: pillMouseArea
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
hoverEnabled: true
onClicked: {
CompositorService.switchToWorkspace(workspace);
}
}
// Burst effect overlay for focused pill
Rectangle {
id: pillBurst
anchors.centerIn: pill
width: pillContainer.pillWidth + 18 * masterProgress * scale
height: pillContainer.pillHeight + 18 * masterProgress * scale
radius: width / 2
color: "transparent"
border.color: effectColor
border.width: Math.max(1, Math.round((2 + 6 * (1.0 - masterProgress))))
opacity: effectsActive && workspace.isFocused ? (1.0 - masterProgress) * 0.7 : 0
visible: effectsActive && workspace.isFocused
z: 1
}
}
+53 -36
View File
@@ -12,6 +12,10 @@ import qs.Widgets
Item {
id: root
Layout.preferredHeight: isVerticalBar ? -1 : Style.getBarHeightForScreen(screenName)
Layout.preferredWidth: isVerticalBar ? Style.getBarHeightForScreen(screenName) : -1
Layout.fillHeight: false
Layout.fillWidth: false
property ShellScreen screen
@@ -22,9 +26,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId] || {}
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length && widgets[sectionWidgetIndex]) {
return widgets[sectionWidgetIndex];
}
@@ -40,11 +46,14 @@ Item {
// Maximum widget width with user settings support
readonly property real maxWidth: (widgetSettings.maxWidth !== undefined) ? widgetSettings.maxWidth : Math.max(widgetMetadata.maxWidth || 0, screen ? screen.width * 0.06 : 0)
readonly property bool useFixedWidth: (widgetSettings.useFixedWidth !== undefined) ? widgetSettings.useFixedWidth : (widgetMetadata.useFixedWidth || false)
readonly property string textColorKey: (widgetSettings.textColor !== undefined) ? widgetSettings.textColor : widgetMetadata.textColor
readonly property color textColor: Color.resolveColorKey(textColorKey)
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isVerticalBar: barPosition === "left" || barPosition === "right"
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screen?.name)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screen?.name)
readonly property real barHeight: Style.getBarHeightForScreen(screenName)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screenName)
readonly property bool hasFocusedWindow: CompositorService.getFocusedWindow() !== null
readonly property string windowTitle: CompositorService.getFocusedWindowTitle() || "No active window"
readonly property string fallbackIcon: "user-desktop"
@@ -52,9 +61,9 @@ Item {
readonly property int iconSize: Style.toOdd(capsuleHeight * 0.75)
readonly property int verticalSize: Style.toOdd(capsuleHeight * 0.85)
// For horizontal bars, height is always capsuleHeight (no animation needed)
// For horizontal bars, height is always barHeight (no animation needed)
// For vertical bars, collapse to 0 when hidden
implicitHeight: isVerticalBar ? (((!hasFocusedWindow) && hideMode === "hidden") ? 0 : verticalSize) : capsuleHeight
implicitHeight: isVerticalBar ? (((!hasFocusedWindow) && hideMode === "hidden") ? 0 : verticalSize) : barHeight
implicitWidth: isVerticalBar ? (((!hasFocusedWindow) && hideMode === "hidden") ? 0 : verticalSize) : (((!hasFocusedWindow) && hideMode === "hidden") ? 0 : dynamicWidth)
// "visible": Always Visible, "hidden": Hide When Empty, "transparent": Transparent When Empty
@@ -173,10 +182,8 @@ Item {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
@@ -263,12 +270,17 @@ Item {
return NScrollText.ScrollMode.Hover;
return NScrollText.ScrollMode.Never;
}
forcedHover: mainMouseArea.containsMouse
gradientColor: Style.capsuleColor
gradientWidth: Math.round(8 * Style.uiScaleRatio)
cornerRadius: Style.radiusM
NText {
text: windowTitle
pointSize: barFontSize
applyUiScale: false
font.weight: Style.fontWeightMedium
color: Color.mOnSurface
color: root.textColor
}
}
}
@@ -312,32 +324,37 @@ Item {
}
}
// Mouse area for hover detection
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
onEntered: {
if ((windowTitle !== "") && isVerticalBar || (scrollingMode === "never")) {
TooltipService.show(root, windowTitle, BarService.getTooltipDirection(root.screen?.name));
}
}
onExited: {
TooltipService.hide();
}
onClicked: mouse => {
if (mouse.button === Qt.RightButton) {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(root, screen);
}
}
}
// Mouse area moved to root
}
}
// Mouse area for hover detection
MouseArea {
id: mainMouseArea
anchors.fill: parent
// Extend click area to screen edge if widget is at the start/end
anchors.leftMargin: (!isVerticalBar && section === "left" && sectionWidgetIndex === 0) ? -Style.marginS : 0
anchors.rightMargin: (!isVerticalBar && section === "right" && sectionWidgetIndex === sectionWidgetsCount - 1) ? -Style.marginS : 0
anchors.topMargin: (isVerticalBar && section === "left" && sectionWidgetIndex === 0) ? -Style.marginM : 0
anchors.bottomMargin: (isVerticalBar && section === "right" && sectionWidgetIndex === sectionWidgetsCount - 1) ? -Style.marginM : 0
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
onEntered: {
if ((windowTitle !== "") && isVerticalBar || (scrollingMode === "never")) {
TooltipService.show(root, windowTitle, BarService.getTooltipDirection(root.screen?.name));
}
}
onExited: {
TooltipService.hide();
}
onClicked: mouse => {
if (mouse.button === Qt.RightButton) {
PanelService.showContextMenu(contextMenu, root, screen);
}
}
}
Connections {
+41 -39
View File
@@ -19,14 +19,16 @@ Item {
property int sectionWidgetIndex: -1
property int sectionWidgetsCount: 0
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isVerticalBar: barPosition === "left" || barPosition === "right"
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screen?.name)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -49,7 +51,6 @@ Item {
return Color.mTertiary;
case "error":
return Color.mError;
case "onSurface":
default:
return Color.mOnSurface;
}
@@ -74,8 +75,12 @@ Item {
}
}
implicitWidth: !shouldShow ? 0 : isVerticalBar ? capsuleHeight : visualizerWidth
implicitHeight: !shouldShow ? 0 : isVerticalBar ? visualizerWidth : capsuleHeight
// Content dimensions for implicit sizing
readonly property real contentWidth: !shouldShow ? 0 : isVerticalBar ? capsuleHeight : visualizerWidth
readonly property real contentHeight: !shouldShow ? 0 : isVerticalBar ? visualizerWidth : capsuleHeight
implicitWidth: contentWidth
implicitHeight: contentHeight
visible: shouldShow
opacity: shouldShow ? 1.0 : 0.0
@@ -92,37 +97,40 @@ Item {
}
}
// Store visualizer type to force re-evaluation
readonly property string currentVisualizerType: Settings.data.audio.visualizerType
// Visual capsule centered in parent
Rectangle {
id: background
anchors.fill: parent
width: root.contentWidth
height: root.contentHeight
anchors.centerIn: parent
radius: Style.radiusS
color: Style.capsuleColor
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
}
// Store visualizer type to force re-evaluation
readonly property string currentVisualizerType: Settings.data.audio.visualizerType
// When visualizer type or playback changes, shouldShow updates automatically
// The Loader dynamically loads the appropriate visualizer based on settings
Loader {
id: visualizerLoader
anchors.fill: parent
anchors.margins: Style.marginS
active: shouldShow
asynchronous: true
// When visualizer type or playback changes, shouldShow updates automatically
// The Loader dynamically loads the appropriate visualizer based on settings
Loader {
id: visualizerLoader
anchors.fill: parent
anchors.margins: Style.marginS
active: shouldShow
asynchronous: true
sourceComponent: {
switch (currentVisualizerType) {
case "linear":
return linearComponent;
case "mirrored":
return mirroredComponent;
case "wave":
return waveComponent;
default:
return null;
sourceComponent: {
switch (currentVisualizerType) {
case "linear":
return linearComponent;
case "mirrored":
return mirroredComponent;
case "wave":
return waveComponent;
default:
return null;
}
}
}
}
@@ -144,10 +152,8 @@ Item {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "cycle-visualizer") {
const types = ["linear", "mirrored", "wave"];
@@ -170,11 +176,7 @@ Item {
onClicked: mouse => {
if (mouse.button === Qt.RightButton) {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(root, screen);
}
PanelService.showContextMenu(contextMenu, root, screen);
} else {
const types = ["linear", "mirrored", "wave"];
const currentIndex = types.indexOf(currentVisualizerType);
+193 -193
View File
@@ -22,9 +22,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -32,148 +34,96 @@ Item {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isBarVertical: barPosition === "left" || barPosition === "right"
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
readonly property string displayMode: widgetSettings.displayMode !== undefined ? widgetSettings.displayMode : widgetMetadata.displayMode
readonly property real warningThreshold: widgetSettings.warningThreshold !== undefined ? widgetSettings.warningThreshold : widgetMetadata.warningThreshold
readonly property bool useGraphicMode: displayMode === "graphic" || displayMode === "graphic-clean"
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)
readonly property bool shouldShow: !hideIfNotDetected || (isReady && (hideIfIdle ? (!isCharging && !isPluggedIn) : true))
// Check if selected device is actually present/connected
readonly property bool isReady: BatteryService.isDeviceReady(selectedDevice)
readonly property bool isPresent: BatteryService.isDevicePresent(selectedDevice)
readonly property real percent: isReady ? BatteryService.getPercentage(selectedDevice) : -1
readonly property bool isCharging: isReady ? BatteryService.isCharging(selectedDevice) : false
readonly property bool isPluggedIn: isReady ? BatteryService.isPluggedIn(selectedDevice) : false
readonly property bool isLowBattery: isReady ? BatteryService.isLowBattery(selectedDevice) : false
readonly property bool isCriticalBattery: isReady ? BatteryService.isCriticalBattery(selectedDevice) : false
// Visibility: show if hideIfNotDetected is false, or if battery is ready
readonly property bool shouldShow: !hideIfNotDetected || (isReady && (hideIfIdle ? !isPluggedIn : true))
readonly property string deviceNativePath: widgetSettings.deviceNativePath !== undefined ? widgetSettings.deviceNativePath : widgetMetadata.deviceNativePath
readonly property var selectedDevice: BatteryService.isDevicePresent(BatteryService.findDevice(deviceNativePath)) ? BatteryService.findDevice(deviceNativePath) : null
readonly property var tooltipContent: {
if (!isReady || !isPresent) {
return I18n.tr("battery.no-battery-detected");
}
let rows = [];
const isInternal = selectedDevice.isLaptopBattery;
if (isInternal) {
// Show charge percentage
rows.push([I18n.tr("battery.battery-level"), `${percent}%`]);
let timeText = BatteryService.getTimeRemainingText(selectedDevice);
if (timeText) {
const colonIdx = timeText.indexOf(":");
if (colonIdx >= 0) {
rows.push([timeText.substring(0, colonIdx).trim(), timeText.substring(colonIdx + 1).trim()]);
} else {
rows.push([timeText, ""]);
}
}
let rateText = BatteryService.getRateText(selectedDevice);
if (rateText) {
const colonIdx = rateText.indexOf(":");
if (colonIdx >= 0) {
rows.push([rateText.substring(0, colonIdx).trim(), rateText.substring(colonIdx + 1).trim()]);
} else {
rows.push([rateText, ""]);
}
}
// Show battery health if supported (check actual battery, not DisplayDevice)
let healthDevice = selectedDevice.healthSupported ? selectedDevice : (BatteryService.laptopBatteries.length > 0 ? BatteryService.laptopBatteries[0] : null);
if (healthDevice && healthDevice.healthSupported) {
rows.push([I18n.tr("battery.battery-health"), `${Math.round(healthDevice.healthPercentage)}%`]);
}
} else if (selectedDevice) {
// External / Peripheral Device (Phone, Keyboard, Mouse, Gamepad, Headphone etc.)
let name = BatteryService.getDeviceName(selectedDevice);
rows.push([name, `${percent}%`]);
}
// If we are showing the main laptop battery, append external devices
if (isInternal) {
var external = BatteryService.bluetoothBatteries;
if (external.length > 0) {
if (rows.length > 0) {
rows.push(["---", "---"]); // Separator
}
for (var j = 0; j < external.length; j++) {
var dev = external[j];
var dName = BatteryService.getDeviceName(dev);
var dPct = BatteryService.getPercentage(dev);
rows.push([dName, `${dPct}%`]);
}
}
}
return rows;
}
visible: shouldShow
opacity: shouldShow ? 1.0 : 0.0
// Test mode
readonly property bool testMode: false
readonly property int testPercent: 35
readonly property bool testCharging: false
readonly property bool testPluggedIn: false
readonly property string deviceNativePath: widgetSettings.deviceNativePath || ""
function findBatteryDevice(nativePath) {
if (!nativePath || !UPower.devices) {
return UPower.displayDevice;
}
var devices = UPower.devices.values || [];
for (var i = 0; i < devices.length; i++) {
var device = devices[i];
if (device && device.nativePath === nativePath && device.type !== UPowerDeviceType.LinePower && device.percentage !== undefined) {
return device;
}
}
return UPower.displayDevice;
}
function findBluetoothDevice(nativePath) {
if (!nativePath || !BluetoothService.devices) {
return null;
}
var macMatch = nativePath.match(/([0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2})/);
if (!macMatch) {
return null;
}
var macAddress = macMatch[1].toUpperCase();
var devices = BluetoothService.devices.values || [];
for (var i = 0; i < devices.length; i++) {
var device = devices[i];
if (device && device.address && device.address.toUpperCase() === macAddress) {
return device;
}
}
return null;
}
readonly property var battery: findBatteryDevice(deviceNativePath)
readonly property var bluetoothDevice: deviceNativePath ? findBluetoothDevice(deviceNativePath) : null
readonly property bool hasBluetoothBattery: bluetoothDevice && bluetoothDevice.batteryAvailable && bluetoothDevice.battery !== undefined
readonly property bool isBluetoothConnected: bluetoothDevice && bluetoothDevice.connected === true
property bool initializationComplete: false
Timer {
interval: 500
running: true
onTriggered: root.initializationComplete = true
}
readonly property bool isDevicePresent: {
if (testMode)
return true;
if (deviceNativePath) {
if (bluetoothDevice) {
return isBluetoothConnected;
}
if (battery && battery.nativePath === deviceNativePath) {
if (battery.type === UPowerDeviceType.Battery && battery.isPresent !== undefined) {
return battery.isPresent;
}
return battery.ready && battery.percentage !== undefined && (battery.percentage > 0 || isCharging);
}
return false;
}
if (battery) {
// For default device, check isPresent if it's a Battery type, otherwise require percentage > 0
if (battery.type === UPowerDeviceType.Battery && battery.isPresent !== undefined) {
return battery.isPresent;
}
// For non-battery types or when isPresent is undefined, require actual percentage
return battery.ready && battery.percentage !== undefined && battery.percentage > 0;
}
return false;
}
readonly property bool isReady: testMode ? true : (initializationComplete && battery && battery.ready && isDevicePresent && (battery.percentage !== undefined || hasBluetoothBattery))
readonly property real percent: testMode ? testPercent : (isReady ? (hasBluetoothBattery ? (bluetoothDevice.battery * 100) : (battery.percentage * 100)) : 0)
readonly property bool isCharging: testMode ? testCharging : (isReady ? battery.state === UPowerDeviceState.Charging : false)
readonly property bool isPluggedIn: testMode ? testPluggedIn : (isReady ? battery.state === UPowerDeviceState.FullyCharged || battery.state === UPowerDeviceState.PendingCharge : false)
property bool hasNotifiedLowBattery: false
implicitWidth: pill.width
implicitHeight: pill.height
function maybeNotify(currentPercent, charging, pluggedIn, isReady) {
if (isReady && (!charging && !pluggedIn) && !hasNotifiedLowBattery && currentPercent <= warningThreshold) {
hasNotifiedLowBattery = true;
ToastService.showWarning(I18n.tr("toast.battery.low"), I18n.tr("toast.battery.low-desc", {
"percent": Math.round(currentPercent)
}));
} else if (hasNotifiedLowBattery && (charging || pluggedIn || currentPercent > warningThreshold + 5)) {
hasNotifiedLowBattery = false;
}
}
function getCurrentPercent() {
return hasBluetoothBattery ? (bluetoothDevice.battery * 100) : (battery ? battery.percentage * 100 : 0);
}
Connections {
target: battery
function onPercentageChanged() {
if (battery) {
maybeNotify(getCurrentPercent(), isCharging, isPluggedIn, isReady);
}
}
function onStateChanged() {
if (battery) {
if (isCharging || isPluggedIn) {
hasNotifiedLowBattery = false;
}
maybeNotify(getCurrentPercent(), isCharging, isPluggedIn, isReady);
}
}
}
Connections {
target: bluetoothDevice
function onBatteryChanged() {
if (bluetoothDevice && hasBluetoothBattery) {
maybeNotify(bluetoothDevice.battery * 100, battery ? isCharging : false, battery ? isPluggedIn : false, true);
}
}
}
implicitWidth: useGraphicMode ? capsule.width : pill.width
implicitHeight: useGraphicMode ? capsule.height : pill.height
NPopupContextMenu {
id: contextMenu
@@ -187,10 +137,8 @@ Item {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
@@ -198,62 +146,114 @@ Item {
}
}
BarPill {
id: pill
// ==================== GRAPHIC MODE ====================
screen: root.screen
oppositeDirection: BarService.getPillDirection(root)
icon: testMode ? BatteryService.getIcon(testPercent, testCharging, testPluggedIn, true) : BatteryService.getIcon(percent, isCharging, isPluggedIn, isReady)
text: (isReady || testMode) ? Math.round(percent) : "-"
suffix: "%"
autoHide: false
forceOpen: isReady && displayMode === "alwaysShow"
forceClose: displayMode === "alwaysHide" || (initializationComplete && !isReady)
customBackgroundColor: !initializationComplete ? "transparent" : (isCharging ? Color.mPrimary : (isLowBattery ? Color.mError : "transparent"))
customTextIconColor: !initializationComplete ? "transparent" : (isCharging ? Color.mOnPrimary : (isLowBattery ? Color.mOnError : "transparent"))
// Capsule background (graphic mode only)
Rectangle {
id: capsule
visible: root.useGraphicMode
anchors.centerIn: nBattery
width: root.isBarVertical ? root.capsuleHeight : nBattery.width + Style.marginS * 2
height: root.isBarVertical ? nBattery.height + Style.marginS * 2 : root.capsuleHeight
radius: Math.min(Style.radiusL, width / 2)
color: graphicMouseArea.containsMouse ? Color.mHover : Style.capsuleColor
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
tooltipText: {
let lines = [];
if (testMode) {
lines.push(`Time left: ${Time.formatVagueHumanReadableDuration(12345)}.`);
return lines.join("\n");
}
if (!isReady || !isDevicePresent) {
return I18n.tr("battery.no-battery-detected");
}
if (!isPluggedIn && battery.timeToEmpty > 0) {
lines.push(I18n.tr("battery.time-left", {
"time": Time.formatVagueHumanReadableDuration(battery.timeToEmpty)
}));
}
if (!isPluggedIn && battery.timeToFull > 0) {
lines.push(I18n.tr("battery.time-until-full", {
"time": Time.formatVagueHumanReadableDuration(battery.timeToFull)
}));
}
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)
}));
}
}
return lines.join("\n");
}
onClicked: PanelService.getPanel("batteryPanel", screen)?.toggle(this)
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(pill, screen);
Behavior on color {
enabled: !Color.isTransitioning
ColorAnimation {
duration: Style.animationFast
easing.type: Easing.InOutQuad
}
}
}
NBattery {
id: nBattery
visible: root.useGraphicMode
anchors.centerIn: parent
baseSize: Style.barFontSize
showPercentageText: root.displayMode !== "graphic-clean"
vertical: root.isBarVertical
percentage: root.percent
ready: root.isReady
charging: root.isCharging
pluggedIn: root.isPluggedIn
low: root.isLowBattery
critical: root.isCriticalBattery
baseColor: graphicMouseArea.containsMouse ? Color.mOnHover : Color.mOnSurface
textColor: graphicMouseArea.containsMouse ? Color.mHover : Color.mSurface
}
MouseArea {
id: graphicMouseArea
visible: root.useGraphicMode
anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.LeftButton | Qt.RightButton
cursorShape: Qt.PointingHandCursor
onEntered: {
if (root.tooltipContent) {
TooltipService.show(root, root.tooltipContent, BarService.getTooltipDirection(root.screen?.name));
}
tooltipRefreshTimer.start();
}
onExited: {
tooltipRefreshTimer.stop();
TooltipService.hide();
}
onClicked: mouse => {
if (mouse.button === Qt.RightButton) {
PanelService.showContextMenu(contextMenu, nBattery, screen);
} else {
openBatteryPanel();
}
}
}
Timer {
id: tooltipRefreshTimer
interval: 1000
repeat: true
onTriggered: {
if (graphicMouseArea.containsMouse) {
TooltipService.updateText(root.tooltipContent);
}
}
}
// ==================== ICON MODE ====================
BarPill {
id: pill
visible: !root.useGraphicMode
screen: root.screen
oppositeDirection: BarService.getPillDirection(root)
icon: BatteryService.getIcon(root.percent, root.isCharging, root.isPluggedIn, root.isReady)
text: root.isReady ? root.percent : "-"
suffix: "%"
autoHide: false
forceOpen: root.isReady && root.displayMode === "icon-always"
forceClose: root.displayMode === "icon-only" || !root.isReady
customBackgroundColor: root.isCharging ? Color.mPrimary : ((root.isLowBattery || root.isCriticalBattery) ? Color.mError : "transparent")
customTextIconColor: root.isCharging ? Color.mOnPrimary : ((root.isLowBattery || root.isCriticalBattery) ? Color.mOnError : "transparent")
tooltipText: root.tooltipContent
onClicked: openBatteryPanel()
onRightClicked: PanelService.showContextMenu(contextMenu, pill, screen)
}
// ==================== SHARED ====================
function openBatteryPanel() {
var panel = PanelService.getPanel("batteryPanel", screen);
if (panel) {
panel.panelID = {
showPowerProfiles: widgetSettings.showPowerProfiles !== undefined ? widgetSettings.showPowerProfiles : widgetMetadata.showPowerProfiles,
showNoctaliaPerformance: widgetSettings.showNoctaliaPerformance !== undefined ? widgetSettings.showNoctaliaPerformance : widgetMetadata.showNoctaliaPerformance
};
panel.toggle(root);
}
}
}
+12 -12
View File
@@ -19,9 +19,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -29,9 +31,11 @@ Item {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isBarVertical: barPosition === "left" || barPosition === "right"
readonly property string displayMode: widgetSettings.displayMode !== undefined ? widgetSettings.displayMode : widgetMetadata.displayMode
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
readonly property string textColorKey: widgetSettings.textColor !== undefined ? widgetSettings.textColor : widgetMetadata.textColor
implicitWidth: pill.width
implicitHeight: pill.height
@@ -53,10 +57,8 @@ Item {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "toggle-bluetooth") {
BluetoothService.setBluetoothEnabled(!BluetoothService.enabled);
@@ -71,6 +73,8 @@ Item {
screen: root.screen
oppositeDirection: BarService.getPillDirection(root)
customIconColor: Color.resolveColorKeyOptional(root.iconColorKey)
customTextColor: Color.resolveColorKeyOptional(root.textColorKey)
icon: !BluetoothService.enabled ? "bluetooth-off" : ((BluetoothService.connectedDevices && BluetoothService.connectedDevices.length > 0) ? "bluetooth-connected" : "bluetooth")
text: {
if (BluetoothService.connectedDevices && BluetoothService.connectedDevices.length > 0) {
@@ -94,11 +98,7 @@ Item {
p.toggle(this);
}
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(pill, screen);
}
PanelService.showContextMenu(contextMenu, pill, screen);
}
tooltipText: {
if (pill.text !== "") {
+12 -12
View File
@@ -20,9 +20,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -30,9 +32,11 @@ Item {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isBarVertical: barPosition === "left" || barPosition === "right"
readonly property string displayMode: (widgetSettings.displayMode !== undefined) ? widgetSettings.displayMode : widgetMetadata.displayMode
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
readonly property string textColorKey: widgetSettings.textColor !== undefined ? widgetSettings.textColor : widgetMetadata.textColor
// Used to avoid opening the pill on Quickshell startup
property bool firstBrightnessReceived: false
@@ -114,10 +118,8 @@ Item {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "open-display-settings") {
var settingsPanel = PanelService.getPanel("settingsPanel", screen);
@@ -134,6 +136,8 @@ Item {
screen: root.screen
oppositeDirection: BarService.getPillDirection(root)
customIconColor: Color.resolveColorKeyOptional(root.iconColorKey)
customTextColor: Color.resolveColorKeyOptional(root.textColorKey)
icon: getIcon()
autoHide: false // Important to be false so we can hover as long as we want
text: {
@@ -169,11 +173,7 @@ Item {
onClicked: PanelService.getPanel("brightnessPanel", screen)?.toggle(this)
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(pill, screen);
}
PanelService.showContextMenu(contextMenu, pill, screen);
}
}
}
+84 -72
View File
@@ -7,7 +7,7 @@ import qs.Modules.Bar.Extras
import qs.Services.UI
import qs.Widgets
Rectangle {
Item {
id: root
property ShellScreen screen
@@ -19,9 +19,11 @@ Rectangle {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -29,90 +31,105 @@ Rectangle {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isBarVertical: barPosition === "left" || barPosition === "right"
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screen?.name)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screen?.name)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screenName)
readonly property var now: Time.now
// Resolve settings: try user settings or defaults from BarWidgetRegistry
readonly property bool usePrimaryColor: widgetSettings.usePrimaryColor !== undefined ? widgetSettings.usePrimaryColor : widgetMetadata.usePrimaryColor
readonly property string clockColor: widgetSettings.clockColor !== undefined ? widgetSettings.clockColor : widgetMetadata.clockColor
readonly property bool useCustomFont: widgetSettings.useCustomFont !== undefined ? widgetSettings.useCustomFont : widgetMetadata.useCustomFont
readonly property string customFont: widgetSettings.customFont !== undefined ? widgetSettings.customFont : widgetMetadata.customFont
readonly property string formatHorizontal: widgetSettings.formatHorizontal !== undefined ? widgetSettings.formatHorizontal : widgetMetadata.formatHorizontal
readonly property string formatVertical: widgetSettings.formatVertical !== undefined ? widgetSettings.formatVertical : widgetMetadata.formatVertical
readonly property string tooltipFormat: widgetSettings.tooltipFormat !== undefined ? widgetSettings.tooltipFormat : widgetMetadata.tooltipFormat
implicitWidth: isBarVertical ? capsuleHeight : Math.round((isBarVertical ? verticalLoader.implicitWidth : horizontalLoader.implicitWidth) + Style.marginXL)
readonly property color textColor: Color.resolveColorKey(clockColor)
implicitHeight: isBarVertical ? Math.round(verticalLoader.implicitHeight + Style.marginS * 2) : capsuleHeight
// Content dimensions for implicit sizing
readonly property real contentWidth: isBarVertical ? capsuleHeight : Math.round((isBarVertical ? verticalLoader.implicitWidth : horizontalLoader.implicitWidth) + Style.marginXL)
readonly property real contentHeight: isBarVertical ? Math.round(verticalLoader.implicitHeight + Style.marginS * 2) : capsuleHeight
radius: Style.radiusS
color: Style.capsuleColor
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
// Size: use implicit width/height
// BarWidgetLoader sets explicit width/height to extend click area
implicitWidth: contentWidth
implicitHeight: contentHeight
Item {
id: clockContainer
// Visual clock capsule - stays at content size, centered in parent
Rectangle {
id: visualClock
width: root.contentWidth
height: root.contentHeight
anchors.centerIn: parent
// Horizontal
Loader {
id: horizontalLoader
active: !isBarVertical
radius: Style.radiusL
color: Style.capsuleColor
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
Item {
id: clockContainer
anchors.centerIn: parent
sourceComponent: ColumnLayout {
// Horizontal
Loader {
id: horizontalLoader
active: !isBarVertical
anchors.centerIn: parent
spacing: Settings.data.bar.showCapsule ? -5 : -3
Repeater {
id: repeater
model: I18n.locale.toString(now, formatHorizontal.trim()).split("\\n")
NText {
visible: text !== ""
text: modelData
family: useCustomFont && customFont ? customFont : Settings.data.ui.fontDefault
Binding on pointSize {
value: {
if (repeater.model.length == 1) {
// Single line: Full size
return barFontSize;
} else if (repeater.model.length == 2) {
// Two lines: First line is bigger than the second
return (index == 0) ? Math.round(barFontSize * 0.9) : Math.round(barFontSize * 0.75);
} else {
// More than two lines: Make it small!
return Math.round(barFontSize * 0.75);
sourceComponent: ColumnLayout {
anchors.centerIn: parent
spacing: Settings.data.bar.showCapsule ? -5 : -3
Repeater {
id: repeater
model: I18n.locale.toString(now, formatHorizontal.trim()).split("\\n")
NText {
visible: text !== ""
text: modelData
family: useCustomFont && customFont ? customFont : Settings.data.ui.fontDefault
Binding on pointSize {
value: {
if (repeater.model.length == 1) {
// Single line: Full size
return barFontSize;
} else if (repeater.model.length == 2) {
// Two lines: First line is bigger than the second
return (index == 0) ? Math.round(barFontSize * 0.9) : Math.round(barFontSize * 0.75);
} else {
// More than two lines: Make it small!
return Math.round(barFontSize * 0.75);
}
}
}
applyUiScale: false
color: textColor
wrapMode: Text.WordWrap
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
}
applyUiScale: false
color: usePrimaryColor ? Color.mPrimary : Color.mOnSurface
wrapMode: Text.WordWrap
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
}
}
}
}
// Vertical
Loader {
id: verticalLoader
active: isBarVertical
anchors.centerIn: parent // Now this works without layout conflicts
sourceComponent: ColumnLayout {
anchors.centerIn: parent
spacing: -2
Repeater {
model: I18n.locale.toString(now, formatVertical.trim()).split(" ")
delegate: NText {
visible: text !== ""
text: modelData
family: useCustomFont && customFont ? customFont : Settings.data.ui.fontDefault
pointSize: barFontSize
applyUiScale: false
color: usePrimaryColor ? Color.mPrimary : Color.mOnSurface
wrapMode: Text.WordWrap
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
// Vertical
Loader {
id: verticalLoader
active: isBarVertical
anchors.centerIn: parent // Now this works without layout conflicts
sourceComponent: ColumnLayout {
anchors.centerIn: parent
spacing: -2
Repeater {
model: I18n.locale.toString(now, formatVertical.trim()).split(" ")
delegate: NText {
visible: text !== ""
text: modelData
family: useCustomFont && customFont ? customFont : Settings.data.ui.fontDefault
pointSize: barFontSize
applyUiScale: false
color: textColor
wrapMode: Text.WordWrap
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
}
}
}
}
@@ -136,10 +153,9 @@ Rectangle {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
// Close the context menu
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "open-calendar") {
PanelService.getPanel("clockPanel", screen)?.toggle(root);
@@ -177,11 +193,7 @@ Rectangle {
onClicked: mouse => {
TooltipService.hide();
if (mouse.button === Qt.RightButton) {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(root, screen);
}
PanelService.showContextMenu(contextMenu, root, screen);
} else {
PanelService.getPanel("clockPanel", screen)?.toggle(this);
}
+22 -52
View File
@@ -22,9 +22,11 @@ NIconButton {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -32,21 +34,14 @@ NIconButton {
return {};
}
readonly property string customIcon: widgetSettings.icon || widgetMetadata.icon
readonly property bool useDistroLogo: (widgetSettings.useDistroLogo !== undefined) ? widgetSettings.useDistroLogo : widgetMetadata.useDistroLogo
readonly property string customIconPath: widgetSettings.customIconPath || ""
readonly property bool enableColorization: widgetSettings.enableColorization || false
readonly property string colorizeSystemIcon: {
if (widgetSettings.colorizeSystemIcon !== undefined)
return widgetSettings.colorizeSystemIcon;
return widgetMetadata.colorizeSystemIcon !== undefined ? widgetMetadata.colorizeSystemIcon : "none";
}
readonly property bool isColorizing: enableColorization && colorizeSystemIcon !== "none"
readonly property string customIcon: widgetSettings.icon !== undefined ? widgetSettings.icon : widgetMetadata.icon
readonly property bool useDistroLogo: widgetSettings.useDistroLogo !== undefined ? widgetSettings.useDistroLogo : widgetMetadata.useDistroLogo
readonly property string customIconPath: widgetSettings.customIconPath !== undefined ? widgetSettings.customIconPath : widgetMetadata.customIconPath
readonly property bool enableColorization: widgetSettings.enableColorization !== undefined ? widgetSettings.enableColorization : widgetMetadata.enableColorization
readonly property string colorizeSystemIcon: widgetSettings.colorizeSystemIcon !== undefined ? widgetSettings.colorizeSystemIcon : widgetMetadata.colorizeSystemIcon
readonly property color iconColor: {
if (!isColorizing)
if (!enableColorization)
return Color.mOnSurface;
switch (colorizeSystemIcon) {
case "primary":
@@ -61,22 +56,6 @@ NIconButton {
return Color.mOnSurface;
}
}
readonly property color iconHoverColor: {
if (!isColorizing)
return Color.mOnHover;
switch (colorizeSystemIcon) {
case "primary":
return Qt.darker(Color.mPrimary, 1.2);
case "secondary":
return Qt.darker(Color.mSecondary, 1.2);
case "tertiary":
return Qt.darker(Color.mTertiary, 1.2);
case "error":
return Qt.darker(Color.mError, 1.2);
default:
return Color.mOnHover;
}
}
// If we have a custom path and not using distro logo, use the theme icon.
// If using distro logo, don't use theme icon.
@@ -88,13 +67,10 @@ NIconButton {
customRadius: Style.radiusL
colorBg: Style.capsuleColor
colorFg: iconColor
colorBgHover: useDistroLogo ? Color.mSurfaceVariant : Color.mHover
colorFgHover: iconHoverColor
colorBorder: "transparent"
colorBorderHover: useDistroLogo ? Color.mHover : "transparent"
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
colorBgHover: Color.mHover
colorFgHover: Color.mOnHover
colorBorder: Style.capsuleBorderColor
colorBorderHover: Style.capsuleBorderColor
NPopupContextMenu {
id: contextMenu
@@ -118,13 +94,11 @@ NIconButton {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "open-launcher") {
PanelService.getPanel("launcherPanel", screen)?.toggle();
PanelService.toggleLauncher(screen);
} else if (action === "open-settings") {
var panel = PanelService.getPanel("settingsPanel", screen);
panel.requestedTab = SettingsPanel.Tab.General;
@@ -145,18 +119,14 @@ NIconButton {
}
}
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(root, screen);
}
PanelService.showContextMenu(contextMenu, root, screen);
}
onMiddleClicked: PanelService.getPanel("launcherPanel", screen)?.toggle()
onMiddleClicked: PanelService.toggleLauncher(screen)
IconImage {
id: customOrDistroLogo
anchors.centerIn: parent
width: root.width * 0.8
width: root.buttonSize * 0.8
height: width
source: {
if (useDistroLogo)
@@ -168,9 +138,9 @@ NIconButton {
visible: source !== ""
smooth: true
asynchronous: true
layer.enabled: isColorizing && (useDistroLogo || customIconPath !== "")
layer.enabled: (enableColorization) && (useDistroLogo || customIconPath !== "")
layer.effect: ShaderEffect {
property color targetColor: isColorizing ? iconColor : (Settings.data.colorSchemes.darkMode ? Color.mOnSurface : Color.mSurfaceVariant)
property color targetColor: !hovering ? iconColor : Color.mOnHover
property real colorizeMode: 2.0
fragmentShader: Qt.resolvedUrl(Quickshell.shellDir + "/Shaders/qsb/appicon_colorize.frag.qsb")
+75 -60
View File
@@ -21,9 +21,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -31,7 +33,7 @@ Item {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isVerticalBar: barPosition === "left" || barPosition === "right"
readonly property string customIcon: widgetSettings.icon || widgetMetadata.icon
@@ -142,39 +144,48 @@ Item {
readonly property bool isColorizing: enableColorization && colorizeSystemIcon !== "none"
readonly property color iconColor: {
if (!isColorizing)
return Color.mOnSurface;
switch (colorizeSystemIcon) {
case "primary":
return Color.mPrimary;
case "secondary":
return Color.mSecondary;
case "tertiary":
return Color.mTertiary;
case "error":
return Color.mError;
default:
return Color.mOnSurface;
}
// Get color value from color name (returns null for invalid names)
function _getColorValue(colorName, forHover) {
const baseColor = (function () {
switch (colorName) {
case "primary":
return Color.mPrimary;
case "secondary":
return Color.mSecondary;
case "tertiary":
return Color.mTertiary;
case "error":
return Color.mError;
default:
return null;
}
})();
return baseColor !== null ? (forHover ? Qt.darker(baseColor, 1.2) : baseColor) : null;
}
readonly property color iconHoverColor: {
if (!isColorizing)
return Color.mOnHover;
switch (colorizeSystemIcon) {
case "primary":
return Qt.darker(Color.mPrimary, 1.2);
case "secondary":
return Qt.darker(Color.mSecondary, 1.2);
case "tertiary":
return Qt.darker(Color.mTertiary, 1.2);
case "error":
return Qt.darker(Color.mError, 1.2);
default:
return Color.mOnHover;
// Resolve icon color with priority: dynamic > static > default
function _resolveIconColor(dynamicColorName, staticColorName, isHover) {
if (dynamicColorName && dynamicColorName !== "") {
if (dynamicColorName === "none") {
return isHover ? Color.mOnHover : Color.mOnSurface;
}
const color = _getColorValue(dynamicColorName, isHover);
if (color !== null)
return color;
}
if (staticColorName && staticColorName !== "" && isColorizing) {
const color = _getColorValue(staticColorName, isHover);
if (color !== null)
return color;
}
return isHover ? Color.mOnHover : Color.mOnSurface;
}
readonly property color iconColor: _resolveIconColor(_dynamicColor, colorizeSystemIcon, false)
readonly property color iconHoverColor: _resolveIconColor(_dynamicColor, colorizeSystemIcon, true)
implicitWidth: pill.width
implicitHeight: pill.height
@@ -190,7 +201,7 @@ Item {
rotateText: isVerticalBar && currentMaxTextLength > 0
autoHide: false
forceOpen: _pillForceOpen
customTextIconColor: isColorizing ? iconColor : "transparent"
customTextIconColor: iconColor
tooltipText: {
var tooltipLines = [];
@@ -231,16 +242,17 @@ Item {
}
}
onClicked: root.onClicked()
onRightClicked: root.onRightClicked()
onMiddleClicked: root.onMiddleClicked()
onWheel: delta => root.onWheel(delta)
onClicked: root.clicked()
onRightClicked: root.rightClicked()
onMiddleClicked: root.middleClicked()
onWheel: delta => root.wheeled(delta)
}
// Internal state for dynamic text
property string _dynamicText: ""
property string _dynamicIcon: ""
property string _dynamicTooltip: ""
property string _dynamicColor: ""
// Maximum length for text display before scrolling (different values for horizontal and vertical)
readonly property var maxTextLength: {
@@ -356,27 +368,31 @@ Item {
function parseDynamicContent(content) {
var contentStr = String(content || "").trim();
if (parseJson) {
var lineToParse = contentStr;
if (!textStream && contentStr.includes('\n')) {
if (parseJson && contentStr) {
// Handle multi-line JSON by filtering empty lines and joining
var jsonStr = contentStr;
if (contentStr.includes('\n')) {
const lines = contentStr.split('\n').filter(line => line.trim() !== '');
if (lines.length > 0) {
lineToParse = lines[lines.length - 1];
}
jsonStr = lines.join('');
}
try {
const parsed = JSON.parse(lineToParse);
const parsed = JSON.parse(jsonStr);
const text = parsed.text || "";
const icon = parsed.icon || "";
let tooltip = parsed.tooltip || "";
const color = parsed.color || "";
// Validate color value
const validColors = ["primary", "secondary", "tertiary", "error", "none"];
const validColor = (color && validColors.includes(color)) ? color : "";
if (checkCollapse(text)) {
_scrollState.originalText = "";
_dynamicText = "";
_dynamicIcon = "";
_dynamicTooltip = "";
_dynamicColor = "";
_scrollState.needsScrolling = false;
_scrollState.phase = 0;
_scrollState.phaseCounter = 0;
@@ -386,23 +402,23 @@ Item {
_scrollState.originalText = text;
_scrollState.needsScrolling = text.length > currentMaxTextLength && currentMaxTextLength > 0;
if (_scrollState.needsScrolling) {
// Start with the beginning of the text
_dynamicText = text.substring(0, currentMaxTextLength);
_scrollState.phase = 0; // Start at phase 0 (static beginning)
_scrollState.phase = 0;
_scrollState.phaseCounter = 0;
_scrollState.offset = 0;
scrollTimer.start(); // Start the scrolling timer
scrollTimer.start();
} else {
_dynamicText = text;
scrollTimer.stop();
}
_dynamicIcon = icon;
_dynamicColor = validColor;
_dynamicTooltip = toHtml(tooltip);
_scrollState.offset = 0;
return;
} catch (e) {
Logger.w("CustomButton", `Failed to parse JSON. Content: "${lineToParse}"`);
Logger.w("CustomButton", `Failed to parse JSON. Content: "${contentStr}"`);
}
}
@@ -411,6 +427,7 @@ Item {
_dynamicText = "";
_dynamicIcon = "";
_dynamicTooltip = "";
_dynamicColor = "";
_scrollState.needsScrolling = false;
_scrollState.phase = 0;
_scrollState.phaseCounter = 0;
@@ -420,17 +437,17 @@ Item {
_scrollState.originalText = contentStr;
_scrollState.needsScrolling = contentStr.length > currentMaxTextLength && currentMaxTextLength > 0;
if (_scrollState.needsScrolling) {
// Start with the beginning of the text
_dynamicText = contentStr.substring(0, currentMaxTextLength);
_scrollState.phase = 0; // Start at phase 0 (static beginning)
_scrollState.phase = 0;
_scrollState.phaseCounter = 0;
_scrollState.offset = 0;
scrollTimer.start(); // Start the scrolling timer
scrollTimer.start();
} else {
_dynamicText = contentStr;
scrollTimer.stop();
}
_dynamicIcon = "";
_dynamicColor = "";
_dynamicTooltip = toHtml(contentStr);
_scrollState.offset = 0;
}
@@ -456,22 +473,20 @@ Item {
}
}
function onClicked() {
function clicked() {
if (leftClickExec) {
Quickshell.execDetached(["sh", "-lc", leftClickExec]);
Logger.i("CustomButton", `Executing command: ${leftClickExec}`);
} else if (!leftClickUpdateText) {
// No left click script was defined, open settings
var settingsPanel = PanelService.getPanel("settingsPanel", screen);
settingsPanel.requestedTab = SettingsPanel.Tab.Bar;
settingsPanel.open();
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
//SettingsPanelService.openToTab(SettingsPanel.Tab.Bar, 1, screen);
}
if (!textStream && leftClickUpdateText) {
runTextCommand();
}
}
function onRightClicked() {
function rightClicked() {
if (rightClickExec) {
Quickshell.execDetached(["sh", "-lc", rightClickExec]);
Logger.i("CustomButton", `Executing command: ${rightClickExec}`);
@@ -481,7 +496,7 @@ Item {
}
}
function onMiddleClicked() {
function middleClicked() {
if (middleClickExec) {
Quickshell.execDetached(["sh", "-lc", middleClickExec]);
Logger.i("CustomButton", `Executing command: ${middleClickExec}`);
@@ -516,7 +531,7 @@ Item {
textProc.running = true;
}
function onWheel(delta) {
function wheeled(delta) {
if (wheelMode === "unified" && wheelExec) {
let normalizedDelta = delta > 0 ? 1 : -1;
+46 -3
View File
@@ -8,6 +8,26 @@ NIconButton {
property ShellScreen screen
// Widget properties passed from Bar.qml for per-instance settings
property string widgetId: ""
property string section: ""
property int sectionWidgetIndex: -1
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
}
return {};
}
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
icon: "dark-mode"
tooltipText: Settings.data.colorSchemes.darkMode ? I18n.tr("tooltips.switch-to-light-mode") : I18n.tr("tooltips.switch-to-dark-mode")
tooltipDirection: BarService.getTooltipDirection(screen?.name)
@@ -15,11 +35,34 @@ NIconButton {
applyUiScale: false
customRadius: Style.radiusL
colorBg: Style.capsuleColor
colorFg: Color.mOnSurface
colorBorder: "transparent"
colorBorderHover: "transparent"
colorFg: Color.resolveColorKey(iconColorKey)
onClicked: Settings.data.colorSchemes.darkMode = !Settings.data.colorSchemes.darkMode
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
NPopupContextMenu {
id: contextMenu
model: [
{
"label": I18n.tr("actions.widget-settings"),
"action": "widget-settings",
"icon": "settings"
},
]
onTriggered: action => {
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
}
}
}
onRightClicked: {
PanelService.showContextMenu(contextMenu, root, screen);
}
}
+33 -3
View File
@@ -19,9 +19,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -29,21 +31,49 @@ Item {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isBarVertical: barPosition === "left" || barPosition === "right"
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
readonly property string textColorKey: widgetSettings.textColor !== undefined ? widgetSettings.textColor : widgetMetadata.textColor
implicitWidth: pill.width
implicitHeight: pill.height
NPopupContextMenu {
id: contextMenu
model: [
{
"label": I18n.tr("actions.widget-settings"),
"action": "widget-settings",
"icon": "settings"
},
]
onTriggered: action => {
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
}
}
}
BarPill {
id: pill
screen: root.screen
text: IdleInhibitorService.timeout == null ? "" : Time.formatVagueHumanReadableDuration(IdleInhibitorService.timeout)
oppositeDirection: BarService.getPillDirection(root)
customIconColor: Color.resolveColorKeyOptional(root.iconColorKey)
customTextColor: Color.resolveColorKeyOptional(root.textColorKey)
icon: IdleInhibitorService.isInhibited ? "keep-awake-on" : "keep-awake-off"
tooltipText: IdleInhibitorService.isInhibited ? I18n.tr("tooltips.keep-awake") : I18n.tr("tooltips.keep-awake")
onClicked: IdleInhibitorService.manualToggle()
onRightClicked: {
PanelService.showContextMenu(contextMenu, pill, screen);
}
forceOpen: IdleInhibitorService.timeout !== null
forceClose: IdleInhibitorService.timeout == null
onWheel: function (delta) {
+12 -12
View File
@@ -23,9 +23,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -33,11 +35,13 @@ Item {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isBarVertical: barPosition === "left" || barPosition === "right"
readonly property string displayMode: (widgetSettings.displayMode !== undefined) ? widgetSettings.displayMode : widgetMetadata.displayMode
readonly property bool showIcon: (widgetSettings.showIcon !== undefined) ? widgetSettings.showIcon : widgetMetadata.showIcon
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
readonly property string textColorKey: widgetSettings.textColor !== undefined ? widgetSettings.textColor : widgetMetadata.textColor
// Use the shared service for keyboard layout
property string currentLayout: KeyboardLayoutService.currentLayout
@@ -57,10 +61,8 @@ Item {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
@@ -73,6 +75,8 @@ Item {
anchors.verticalCenter: parent.verticalCenter
screen: root.screen
oppositeDirection: BarService.getPillDirection(root)
customIconColor: Color.resolveColorKeyOptional(root.iconColorKey)
customTextColor: Color.resolveColorKeyOptional(root.textColorKey)
icon: root.showIcon ? "keyboard" : ""
autoHide: false // Important to be false so we can hover as long as we want
text: isBarVertical ? currentLayout.substring(0, 3).toUpperCase() : currentLayout
@@ -82,11 +86,7 @@ Item {
forceClose: root.showIcon && root.displayMode === "alwaysHide"
onClicked: CompositorService.cycleKeyboardLayout()
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(pill, screen);
}
PanelService.showContextMenu(contextMenu, pill, screen);
}
}
}
+14 -18
View File
@@ -17,9 +17,11 @@ NIconButton {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -28,18 +30,18 @@ NIconButton {
}
readonly property string iconName: widgetSettings.icon || (widgetMetadata ? widgetMetadata.icon : "search")
readonly property bool usePrimaryColor: (widgetSettings.usePrimaryColor !== undefined) ? widgetSettings.usePrimaryColor : ((widgetMetadata && widgetMetadata.usePrimaryColor !== undefined) ? widgetMetadata.usePrimaryColor : true)
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
icon: iconName
tooltipText: I18n.tr("actions.open-launcher")
tooltipDirection: BarService.getTooltipDirection(screen?.name)
baseSize: Style.getCapsuleHeightForScreen(screen?.name)
tooltipDirection: BarService.getTooltipDirection(screenName)
baseSize: Style.getCapsuleHeightForScreen(screenName)
applyUiScale: false
customRadius: Style.radiusL
colorBg: Style.capsuleColor
colorBgHover: Color.mHover
colorFg: usePrimaryColor ? Color.mPrimary : Color.mOnSurface
colorFgHover: usePrimaryColor ? Qt.darker(Color.mPrimary, 1.2) : Color.mOnHover
colorFg: Color.resolveColorKey(iconColorKey)
colorFgHover: Color.mOnHover
colorBorder: Style.capsuleBorderColor
colorBorderHover: Style.capsuleBorderColor
@@ -60,10 +62,8 @@ NIconButton {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "launcher-settings") {
var panel = PanelService.getPanel("settingsPanel", screen);
@@ -75,13 +75,9 @@ NIconButton {
}
}
onClicked: PanelService.getPanel("launcherPanel", screen)?.toggle()
onMiddleClicked: PanelService.getPanel("launcherPanel", screen)?.toggle()
onClicked: PanelService.toggleLauncher(screen)
onMiddleClicked: PanelService.toggleLauncher(screen)
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(root, screen);
}
PanelService.showContextMenu(contextMenu, root, screen);
}
}
+97 -82
View File
@@ -10,20 +10,23 @@ import qs.Services.Keyboard
import qs.Services.UI
import qs.Widgets
Rectangle {
//test
Item {
id: root
property ShellScreen screen
property string widgetId: ""
property string section: ""
property int sectionWidgetIndex: -1
property int sectionWidgetsCount: 0
// Settings
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -31,29 +34,27 @@ Rectangle {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isVertical: barPosition === "left" || barPosition === "right"
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screen?.name)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
readonly property bool showCaps: (widgetSettings.showCapsLock !== undefined) ? widgetSettings.showCapsLock : widgetMetadata.showCapsLock
readonly property bool showNum: (widgetSettings.showNumLock !== undefined) ? widgetSettings.showNumLock : widgetMetadata.showNumLock
readonly property bool showScroll: (widgetSettings.showScrollLock !== undefined) ? widgetSettings.showScrollLock : widgetMetadata.showScrollLock
// Content dimensions for implicit sizing
readonly property real contentWidth: isVertical ? capsuleHeight : Math.round(layout.implicitWidth + Style.marginXL)
readonly property real contentHeight: isVertical ? Math.round(layout.implicitHeight + Style.marginXL) : capsuleHeight
readonly property bool hideWhenOff: (widgetSettings.hideWhenOff !== undefined) ? widgetSettings.hideWhenOff : (widgetMetadata.hideWhenOff !== undefined ? widgetMetadata.hideWhenOff : false)
readonly property string capsIcon: widgetSettings.capsLockIcon !== undefined ? widgetSettings.capsLockIcon : widgetMetadata.capsLockIcon
readonly property string numIcon: widgetSettings.numLockIcon !== undefined ? widgetSettings.numLockIcon : widgetMetadata.numLockIcon
readonly property string scrollIcon: widgetSettings.scrollLockIcon !== undefined ? widgetSettings.scrollLockIcon : widgetMetadata.scrollLockIcon
readonly property bool showCaps: (widgetSettings.showCapsLock !== undefined) ? widgetSettings.showCapsLock : widgetMetadata.showCapsLock
readonly property bool showNum: (widgetSettings.showNumLock !== undefined) ? widgetSettings.showNumLock : widgetMetadata.showNumLock
readonly property bool showScroll: (widgetSettings.showScrollLock !== undefined) ? widgetSettings.showScrollLock : widgetMetadata.showScrollLock
readonly property bool hideWhenOff: (widgetSettings.hideWhenOff !== undefined) ? widgetSettings.hideWhenOff : (widgetMetadata.hideWhenOff !== undefined ? widgetMetadata.hideWhenOff : false)
visible: !root.hideWhenOff || (root.showCaps && LockKeysService.capsLockOn) || (root.showNum && LockKeysService.numLockOn) || (root.showScroll && LockKeysService.scrollLockOn)
implicitWidth: isVertical ? capsuleHeight : Math.round(layout.implicitWidth + Style.marginXL)
implicitHeight: isVertical ? Math.round(layout.implicitHeight + Style.marginXL) : capsuleHeight
Layout.alignment: Qt.AlignVCenter
radius: Style.radiusM
color: Style.capsuleColor
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
implicitHeight: contentHeight
implicitWidth: contentWidth
NPopupContextMenu {
id: contextMenu
@@ -67,10 +68,8 @@ Rectangle {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
@@ -78,70 +77,86 @@ Rectangle {
}
}
// Visual capsule centered in parent
Rectangle {
id: visualCapsule
anchors.centerIn: parent
color: Style.capsuleColor
width: root.contentWidth
height: root.contentHeight
radius: Style.radiusM
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
Item {
id: layout
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
implicitHeight: rowLayout.visible ? rowLayout.implicitHeight : colLayout.implicitHeight
implicitWidth: rowLayout.visible ? rowLayout.implicitWidth : colLayout.implicitWidth
RowLayout {
id: rowLayout
spacing: 0
visible: !root.isVertical
NIcon {
color: LockKeysService.capsLockOn ? Color.mTertiary : Qt.alpha(Color.mOnSurfaceVariant, 0.3)
icon: root.capsIcon
visible: root.showCaps && (!root.hideWhenOff || LockKeysService.capsLockOn)
}
NIcon {
color: LockKeysService.numLockOn ? Color.mTertiary : Qt.alpha(Color.mOnSurfaceVariant, 0.3)
icon: root.numIcon
visible: root.showNum && (!root.hideWhenOff || LockKeysService.numLockOn)
}
NIcon {
color: LockKeysService.scrollLockOn ? Color.mTertiary : Qt.alpha(Color.mOnSurfaceVariant, 0.3)
icon: root.scrollIcon
visible: root.showScroll && (!root.hideWhenOff || LockKeysService.scrollLockOn)
}
}
ColumnLayout {
id: colLayout
spacing: 0
visible: root.isVertical
NIcon {
color: LockKeysService.capsLockOn ? Color.mTertiary : Qt.alpha(Color.mOnSurfaceVariant, 0.3)
icon: root.capsIcon
visible: root.showCaps && (!root.hideWhenOff || LockKeysService.capsLockOn)
}
NIcon {
color: LockKeysService.numLockOn ? Color.mTertiary : Qt.alpha(Color.mOnSurfaceVariant, 0.3)
icon: root.numIcon
visible: root.showNum && (!root.hideWhenOff || LockKeysService.numLockOn)
}
NIcon {
color: LockKeysService.scrollLockOn ? Color.mTertiary : Qt.alpha(Color.mOnSurfaceVariant, 0.3)
icon: root.scrollIcon
visible: root.showScroll && (!root.hideWhenOff || LockKeysService.scrollLockOn)
}
}
}
}
// MouseArea at root level for extended click area
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.RightButton
anchors.fill: parent
onClicked: mouse => {
if (mouse.button === Qt.RightButton) {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(root, screen);
}
PanelService.showContextMenu(contextMenu, root, screen);
}
}
}
Item {
id: layout
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
implicitWidth: rowLayout.visible ? rowLayout.implicitWidth : colLayout.implicitWidth
implicitHeight: rowLayout.visible ? rowLayout.implicitHeight : colLayout.implicitHeight
RowLayout {
id: rowLayout
visible: !root.isVertical
spacing: 0
NIcon {
visible: root.showCaps && (!root.hideWhenOff || LockKeysService.capsLockOn)
icon: root.capsIcon
color: LockKeysService.capsLockOn ? Color.mTertiary : Qt.alpha(Color.mOnSurfaceVariant, 0.3)
}
NIcon {
visible: root.showNum && (!root.hideWhenOff || LockKeysService.numLockOn)
icon: root.numIcon
color: LockKeysService.numLockOn ? Color.mTertiary : Qt.alpha(Color.mOnSurfaceVariant, 0.3)
}
NIcon {
visible: root.showScroll && (!root.hideWhenOff || LockKeysService.scrollLockOn)
icon: root.scrollIcon
color: LockKeysService.scrollLockOn ? Color.mTertiary : Qt.alpha(Color.mOnSurfaceVariant, 0.3)
}
}
ColumnLayout {
id: colLayout
visible: root.isVertical
spacing: 0
NIcon {
visible: root.showCaps && (!root.hideWhenOff || LockKeysService.capsLockOn)
icon: root.capsIcon
color: LockKeysService.capsLockOn ? Color.mTertiary : Qt.alpha(Color.mOnSurfaceVariant, 0.3)
}
NIcon {
visible: root.showNum && (!root.hideWhenOff || LockKeysService.numLockOn)
icon: root.numIcon
color: LockKeysService.numLockOn ? Color.mTertiary : Qt.alpha(Color.mOnSurfaceVariant, 0.3)
}
NIcon {
visible: root.showScroll && (!root.hideWhenOff || LockKeysService.scrollLockOn)
icon: root.scrollIcon
color: LockKeysService.scrollLockOn ? Color.mTertiary : Qt.alpha(Color.mOnSurfaceVariant, 0.3)
}
}
}
}
+59 -40
View File
@@ -20,9 +20,11 @@ Item {
// Settings
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -31,10 +33,10 @@ Item {
}
// Bar orientation (per-screen)
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isVertical: barPosition === "left" || barPosition === "right"
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screen?.name)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screen?.name)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screenName)
// Widget settings
readonly property string hideMode: (widgetSettings.hideMode !== undefined) ? widgetSettings.hideMode : "hidden"
@@ -47,6 +49,8 @@ Item {
readonly property bool showProgressRing: (widgetSettings.showProgressRing !== undefined) ? widgetSettings.showProgressRing : widgetMetadata.showProgressRing
readonly property bool useFixedWidth: (widgetSettings.useFixedWidth !== undefined) ? widgetSettings.useFixedWidth : widgetMetadata.useFixedWidth
readonly property real maxWidth: (widgetSettings.maxWidth !== undefined) ? widgetSettings.maxWidth : Math.max(widgetMetadata.maxWidth, screen ? screen.width * 0.06 : 0)
readonly property string textColorKey: (widgetSettings.textColor !== undefined) ? widgetSettings.textColor : widgetMetadata.textColor
readonly property color textColor: Color.resolveColorKey(textColorKey)
// Dimensions
readonly property int artSize: Style.toOdd(capsuleHeight * 0.75)
@@ -73,6 +77,11 @@ Item {
readonly property string cavaComponentId: "bar:mediamini:" + root.screen?.name + ":" + root.section + ":" + root.sectionWidgetIndex
readonly property bool needsCava: root.showVisualizer && root.visualizerType !== "" && root.visualizerType !== "none"
Layout.preferredHeight: isVertical ? -1 : Style.getBarHeightForScreen(screenName)
Layout.preferredWidth: isVertical ? Style.getBarHeightForScreen(screenName) : -1
Layout.fillHeight: false
Layout.fillWidth: false
onNeedsCavaChanged: {
if (root.needsCava) {
CavaService.registerComponent(root.cavaComponentId);
@@ -205,9 +214,8 @@ Item {
}
onTriggered: action => {
var popupWindow = PanelService.getPopupMenuWindow(screen);
if (popupWindow)
popupWindow.close();
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "play-pause")
MediaService.playPause();
@@ -226,11 +234,11 @@ Item {
}
}
// Main container
// Main container - stays at content size, pixel-perfect centered in parent
Rectangle {
id: container
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
x: Style.pixelAlignCenter(parent.width, width)
y: Style.pixelAlignCenter(parent.height, height)
width: isVertical ? (isHidden ? 0 : verticalSize) : (isHidden ? 0 : contentWidth)
height: isVertical ? (isHidden ? 0 : verticalSize) : capsuleHeight
radius: Style.radiusM
@@ -329,10 +337,15 @@ Item {
}
cursorShape: hasPlayer ? Qt.PointingHandCursor : Qt.ArrowCursor
maxWidth: root.maxWidth - root.mainContentWidth
forcedHover: mainMouseArea.containsMouse
gradientColor: Style.capsuleColor
gradientWidth: Math.round(8 * Style.uiScaleRatio)
cornerRadius: Style.radiusM
NText {
// anchors.fill: parent
color: hasPlayer ? Color.mOnSurface : Color.mOnSurfaceVariant
color: hasPlayer ? root.textColor : Color.mOnSurfaceVariant
pointSize: barFontSize
elide: Text.ElideNone
}
}
}
@@ -365,37 +378,43 @@ Item {
}
}
// Mouse interaction
MouseArea {
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
// Mouse interaction moved to root
}
}
onClicked: mouse => {
if (mouse.button === Qt.LeftButton) {
PanelService.getPanel("mediaPlayerPanel", screen)?.toggle(container);
} else if (mouse.button === Qt.RightButton) {
TooltipService.hide();
var popupWindow = PanelService.getPopupMenuWindow(screen);
if (popupWindow) {
popupWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(container, screen);
}
} else if (mouse.button === Qt.MiddleButton && hasPlayer) {
MediaService.playPause();
TooltipService.hide();
}
}
// Mouse interaction
MouseArea {
id: mainMouseArea
anchors.fill: parent
onEntered: {
if (isVertical || scrollingMode === "never") {
TooltipService.show(root, title, BarService.getTooltipDirection(root.screen?.name));
}
}
onExited: TooltipService.hide()
// Extend click area to screen edge if widget is at the start/end
anchors.leftMargin: (!isVertical && section === "left" && sectionWidgetIndex === 0) ? -Style.marginS : 0
anchors.rightMargin: (!isVertical && section === "right" && sectionWidgetIndex === sectionWidgetsCount - 1) ? -Style.marginS : 0
anchors.topMargin: (isVertical && section === "left" && sectionWidgetIndex === 0) ? -Style.marginM : 0
anchors.bottomMargin: (isVertical && section === "right" && sectionWidgetIndex === sectionWidgetsCount - 1) ? -Style.marginM : 0
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
onClicked: mouse => {
if (mouse.button === Qt.LeftButton) {
PanelService.getPanel("mediaPlayerPanel", screen)?.toggle(container);
} else if (mouse.button === Qt.RightButton) {
TooltipService.hide();
PanelService.showContextMenu(contextMenu, container, screen);
} else if (mouse.button === Qt.MiddleButton && hasPlayer) {
MediaService.playPause();
TooltipService.hide();
}
}
onEntered: {
if (isVertical || scrollingMode === "never") {
TooltipService.show(root, title, BarService.getTooltipDirection(root.screen?.name));
}
}
onExited: TooltipService.hide()
}
// Components
+14 -14
View File
@@ -22,9 +22,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -32,10 +34,12 @@ Item {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isBarVertical: barPosition === "left" || barPosition === "right"
readonly property string displayMode: (widgetSettings.displayMode !== undefined) ? widgetSettings.displayMode : widgetMetadata.displayMode
readonly property string middleClickCommand: (widgetSettings.middleClickCommand !== undefined) ? widgetSettings.middleClickCommand : widgetMetadata.middleClickCommand
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
readonly property string textColorKey: widgetSettings.textColor !== undefined ? widgetSettings.textColor : widgetMetadata.textColor
// Used to avoid opening the pill on Quickshell startup
property bool firstInputVolumeReceived: false
@@ -109,15 +113,13 @@ Item {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "toggle-mute") {
AudioService.setInputMuted(!AudioService.inputMuted);
} else if (action === "custom-command") {
Quickshell.execDetached(["sh", "-lc", middleClickCommand]);
Quickshell.execDetached(["sh", "-c", middleClickCommand]);
} else if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
}
@@ -129,6 +131,8 @@ Item {
screen: root.screen
oppositeDirection: BarService.getPillDirection(root)
customIconColor: Color.resolveColorKeyOptional(root.iconColorKey)
customTextColor: Color.resolveColorKeyOptional(root.textColorKey)
icon: AudioService.getInputIcon()
autoHide: false // Important to be false so we can hover as long as we want
text: {
@@ -164,14 +168,10 @@ Item {
PanelService.getPanel("audioPanel", screen)?.toggle(this);
}
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(pill, screen);
}
PanelService.showContextMenu(contextMenu, pill, screen);
}
onMiddleClicked: {
Quickshell.execDetached(["sh", "-lc", middleClickCommand]);
Quickshell.execDetached(["sh", "-c", middleClickCommand]);
}
}
}
+12 -12
View File
@@ -19,9 +19,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -29,9 +31,11 @@ Item {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isBarVertical: barPosition === "left" || barPosition === "right"
readonly property string displayMode: widgetSettings.displayMode !== undefined ? widgetSettings.displayMode : widgetMetadata.displayMode
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
readonly property string textColorKey: widgetSettings.textColor !== undefined ? widgetSettings.textColor : widgetMetadata.textColor
implicitWidth: pill.width
implicitHeight: pill.height
@@ -53,10 +57,8 @@ Item {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "toggle-wifi") {
NetworkService.setWifiEnabled(!Settings.data.network.wifiEnabled);
@@ -71,6 +73,8 @@ Item {
screen: root.screen
oppositeDirection: BarService.getPillDirection(root)
customIconColor: Color.resolveColorKeyOptional(root.iconColorKey)
customTextColor: Color.resolveColorKeyOptional(root.textColorKey)
icon: {
try {
if (NetworkService.ethernetConnected) {
@@ -115,11 +119,7 @@ Item {
panel?.toggle(this);
}
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(pill, screen);
}
PanelService.showContextMenu(contextMenu, pill, screen);
}
tooltipText: {
try {
+43 -6
View File
@@ -14,13 +14,31 @@ NIconButton {
property ShellScreen screen
// Widget properties passed from Bar.qml for per-instance settings
property string widgetId: ""
property string section: ""
property int sectionWidgetIndex: -1
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
}
return {};
}
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
baseSize: Style.getCapsuleHeightForScreen(screen?.name)
applyUiScale: false
customRadius: Style.radiusL
colorBg: Settings.data.nightLight.forced ? Color.mPrimary : Style.capsuleColor
colorFg: Settings.data.nightLight.forced ? Color.mOnPrimary : Color.mOnSurface
colorBorder: "transparent"
colorBorderHover: "transparent"
colorFg: Settings.data.nightLight.forced ? Color.mOnPrimary : Color.resolveColorKey(iconColorKey)
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
@@ -45,9 +63,28 @@ NIconButton {
}
}
NPopupContextMenu {
id: contextMenu
model: [
{
"label": I18n.tr("actions.widget-settings"),
"action": "widget-settings",
"icon": "settings"
},
]
onTriggered: action => {
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
}
}
}
onRightClicked: {
var settingsPanel = PanelService.getPanel("settingsPanel", screen);
settingsPanel.requestedTab = SettingsPanel.Tab.Display;
settingsPanel.open();
PanelService.showContextMenu(contextMenu, root, screen);
}
}
+46 -3
View File
@@ -14,13 +14,31 @@ NIconButton {
property ShellScreen screen
// Widget properties passed from Bar.qml for per-instance settings
property string widgetId: ""
property string section: ""
property int sectionWidgetIndex: -1
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
}
return {};
}
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
baseSize: Style.getCapsuleHeightForScreen(screen?.name)
applyUiScale: false
customRadius: Style.radiusL
colorBg: PowerProfileService.noctaliaPerformanceMode ? Color.mPrimary : Style.capsuleColor
colorFg: PowerProfileService.noctaliaPerformanceMode ? Color.mOnPrimary : Color.mOnSurface
colorBorder: "transparent"
colorBorderHover: "transparent"
colorFg: PowerProfileService.noctaliaPerformanceMode ? Color.mOnPrimary : Color.resolveColorKey(iconColorKey)
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
@@ -28,4 +46,29 @@ NIconButton {
tooltipText: PowerProfileService.noctaliaPerformanceMode ? I18n.tr("tooltips.noctalia-performance-enabled") : I18n.tr("tooltips.noctalia-performance-enabled")
tooltipDirection: BarService.getTooltipDirection(screen?.name)
onClicked: PowerProfileService.toggleNoctaliaPerformance()
NPopupContextMenu {
id: contextMenu
model: [
{
"label": I18n.tr("actions.widget-settings"),
"action": "widget-settings",
"icon": "settings"
},
]
onTriggered: action => {
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
}
}
}
onRightClicked: {
PanelService.showContextMenu(contextMenu, root, screen);
}
}
+34 -23
View File
@@ -21,18 +21,37 @@ NIconButton {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
}
return {};
}
readonly property bool showUnreadBadge: (widgetSettings.showUnreadBadge !== undefined) ? widgetSettings.showUnreadBadge : widgetMetadata.showUnreadBadge
readonly property bool hideWhenZero: (widgetSettings.hideWhenZero !== undefined) ? widgetSettings.hideWhenZero : widgetMetadata.hideWhenZero
readonly property bool hideWhenZeroUnread: (widgetSettings.hideWhenZeroUnread !== undefined) ? widgetSettings.hideWhenZeroUnread : widgetMetadata.hideWhenZeroUnread
readonly property bool showUnreadBadge: widgetSettings.showUnreadBadge !== undefined ? widgetSettings.showUnreadBadge : widgetMetadata.showUnreadBadge
readonly property bool hideWhenZero: widgetSettings.hideWhenZero !== undefined ? widgetSettings.hideWhenZero : widgetMetadata.hideWhenZero
readonly property bool hideWhenZeroUnread: widgetSettings.hideWhenZeroUnread !== undefined ? widgetSettings.hideWhenZeroUnread : widgetMetadata.hideWhenZeroUnread
readonly property string unreadBadgeColor: widgetSettings.unreadBadgeColor !== undefined ? widgetSettings.unreadBadgeColor : widgetMetadata.unreadBadgeColor
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
readonly property color badgeColor: {
switch (unreadBadgeColor) {
case "primary":
return Color.mPrimary;
case "secondary":
return Color.mSecondary;
case "tertiary":
return Color.mTertiary;
case "error":
return Color.mError;
default:
return Color.mOnSurface;
}
}
function computeUnreadCount() {
var since = NotificationService.lastSeenTs;
@@ -56,9 +75,7 @@ NIconButton {
tooltipText: NotificationService.doNotDisturb ? I18n.tr("tooltips.open-notification-history-enable-dnd") : I18n.tr("tooltips.open-notification-history-enable-dnd")
tooltipDirection: BarService.getTooltipDirection(screen?.name)
colorBg: Style.capsuleColor
colorFg: Color.mOnSurface
colorBorder: "transparent"
colorBorderHover: "transparent"
colorFg: Color.resolveColorKey(iconColorKey)
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
visible: !((hideWhenZero && NotificationService.historyList.count === 0) || (hideWhenZeroUnread && count === 0))
@@ -86,10 +103,8 @@ NIconButton {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "toggle-dnd") {
NotificationService.doNotDisturb = !NotificationService.doNotDisturb;
@@ -107,26 +122,22 @@ NIconButton {
}
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(root, screen);
}
PanelService.showContextMenu(contextMenu, root, screen);
}
Loader {
anchors.right: parent.right
anchors.top: parent.top
anchors.rightMargin: 2
anchors.topMargin: 1
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenterOffset: parent.baseSize / 4
anchors.verticalCenterOffset: -parent.baseSize / 4
z: 2
active: showUnreadBadge
sourceComponent: Rectangle {
id: badge
height: 8
height: 7
width: height
radius: Style.radiusXS
color: Color.mError
color: root.hovering ? Color.mOnHover : (root.badgeColor || Color.mError)
border.color: Color.mSurface
border.width: Style.borderS
visible: count > 0
+46 -4
View File
@@ -12,6 +12,26 @@ NIconButton {
property ShellScreen screen
// Widget properties passed from Bar.qml for per-instance settings
property string widgetId: ""
property string section: ""
property int sectionWidgetIndex: -1
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
}
return {};
}
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
baseSize: Style.getCapsuleHeightForScreen(screen?.name)
applyUiScale: false
customRadius: Style.radiusL
@@ -22,11 +42,33 @@ NIconButton {
})
tooltipDirection: BarService.getTooltipDirection(screen?.name)
colorBg: (PowerProfileService.profile === PowerProfile.Balanced) ? Style.capsuleColor : Color.mPrimary
colorFg: (PowerProfileService.profile === PowerProfile.Balanced) ? Color.mOnSurface : Color.mOnPrimary
colorBorder: "transparent"
colorBorderHover: "transparent"
colorFg: (PowerProfileService.profile === PowerProfile.Balanced) ? Color.resolveColorKey(iconColorKey) : Color.mOnPrimary
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
onClicked: PowerProfileService.cycleProfile()
onRightClicked: PowerProfileService.cycleProfileReverse()
NPopupContextMenu {
id: contextMenu
model: [
{
"label": I18n.tr("actions.widget-settings"),
"action": "widget-settings",
"icon": "settings"
},
]
onTriggered: action => {
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
}
}
}
onRightClicked: {
PanelService.showContextMenu(contextMenu, root, screen);
}
}
+11 -33
View File
@@ -19,9 +19,11 @@ NIconButton {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -29,34 +31,16 @@ NIconButton {
return {};
}
readonly property string colorName: widgetSettings.colorName !== undefined ? widgetSettings.colorName : widgetMetadata.colorName
readonly property string iconColorKey: (widgetSettings.iconColor !== undefined) ? widgetSettings.iconColor : widgetMetadata.iconColor
readonly property color iconColor: {
switch (colorName) {
case "primary":
return Color.mPrimary;
case "secondary":
return Color.mSecondary;
case "tertiary":
return Color.mTertiary;
case "error":
return Color.mError;
case "onSurface":
default:
return Color.mOnSurface;
}
}
baseSize: Style.getCapsuleHeightForScreen(screen?.name)
baseSize: Style.getCapsuleHeightForScreen(screenName)
applyUiScale: false
customRadius: Style.radiusL
icon: "power"
tooltipText: I18n.tr("tooltips.session-menu")
tooltipDirection: BarService.getTooltipDirection(screen?.name)
tooltipDirection: BarService.getTooltipDirection(screenName)
colorBg: Style.capsuleColor
colorFg: root.iconColor
colorBorder: "transparent"
colorBorderHover: "transparent"
colorFg: Color.resolveColorKey(iconColorKey)
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
@@ -72,10 +56,8 @@ NIconButton {
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
@@ -85,10 +67,6 @@ NIconButton {
onClicked: PanelService.getPanel("sessionMenuPanel", screen)?.toggle()
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(root, screen);
}
PanelService.showContextMenu(contextMenu, root, screen);
}
}
+6 -4
View File
@@ -17,9 +17,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -27,9 +29,9 @@ Item {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isBarVertical: barPosition === "left" || barPosition === "right"
readonly property real barHeight: Style.getBarHeightForScreen(screen?.name)
readonly property real barHeight: Style.getBarHeightForScreen(screenName)
readonly property int spacerSize: widgetSettings.width !== undefined ? widgetSettings.width : widgetMetadata.width
implicitWidth: isBarVertical ? barHeight : spacerSize
File diff suppressed because it is too large Load Diff
+304 -306
View File
@@ -10,7 +10,7 @@ import qs.Services.System
import qs.Services.UI
import qs.Widgets
Rectangle {
Item {
id: root
property ShellScreen screen
@@ -21,16 +21,18 @@ Rectangle {
property int sectionWidgetIndex: -1
property int sectionWidgetsCount: 0
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isVerticalBar: barPosition === "left" || barPosition === "right"
readonly property real barHeight: Style.getBarHeightForScreen(screen?.name)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screen?.name)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screen?.name)
readonly property real barHeight: Style.getBarHeightForScreen(screenName)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screenName)
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -59,19 +61,21 @@ Rectangle {
}
readonly property int titleWidth: {
if (smartWidth && showTitle && !isVerticalBar && combinedModel.length > 0) {
var entriesCount = combinedModel.length;
var baseWidth = 140;
var calculatedWidth = baseWidth / Math.sqrt(entriesCount);
// First, use user-defined title width if set
var calculatedWidth = (widgetSettings.titleWidth !== undefined) ? widgetSettings.titleWidth : widgetMetadata.titleWidth;
// Second, shrink title width if it exceeds maxTaskbarWidth when smartWidth is enabled
if (smartWidth && combinedModel.length > 0) {
if (maxTaskbarWidth > 0) {
var entriesCount = combinedModel.length;
var maxWidthPerEntry = (maxTaskbarWidth / entriesCount) - itemSize - Style.marginS - Style.marginXL;
calculatedWidth = Math.min(calculatedWidth, maxWidthPerEntry);
}
return Math.max(Math.round(calculatedWidth), 20);
calculatedWidth = Math.max(Math.round(calculatedWidth), 20);
}
return (widgetSettings.titleWidth !== undefined) ? widgetSettings.titleWidth : widgetMetadata.titleWidth;
return calculatedWidth;
}
readonly property bool showPinnedApps: (widgetSettings.showPinnedApps !== undefined) ? widgetSettings.showPinnedApps : widgetMetadata.showPinnedApps
@@ -391,9 +395,9 @@ Rectangle {
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 {
@@ -458,10 +462,8 @@ Rectangle {
return items;
}
onTriggered: (action, item) => {
var popupMenuWindow = PanelService.getPopupMenuWindow(root.screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(root.screen);
// Look up the window fresh each time to avoid stale references
const selectedWindow = root.getSelectedWindow();
@@ -589,11 +591,12 @@ Rectangle {
}
}
implicitWidth: {
// Content dimensions for implicit sizing
readonly property real contentWidth: {
if (!visible)
return 0;
if (isVerticalBar)
return capsuleHeight;
return barHeight;
var calculatedWidth = showTitle ? taskbarLayout.implicitWidth : taskbarLayout.implicitWidth + Style.marginXL;
@@ -604,311 +607,329 @@ Rectangle {
return Math.round(calculatedWidth);
}
implicitHeight: visible ? (isVerticalBar ? Math.round(taskbarLayout.implicitHeight + Style.marginXL) : capsuleHeight) : 0
radius: Style.radiusM
color: Style.capsuleColor
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
readonly property real contentHeight: visible ? (isVerticalBar ? Math.round(taskbarLayout.implicitHeight + Style.marginS * 2) : capsuleHeight) : 0
GridLayout {
id: taskbarLayout
implicitWidth: contentWidth
implicitHeight: contentHeight
// Pixel-perfect centering
x: isVerticalBar ? Style.pixelAlignCenter(parent.width, width) : ((root.showTitle) ? Style.pixelAlignCenter(parent.width, width) : Style.marginM)
y: Style.pixelAlignCenter(parent.height, height)
// Visual capsule centered in parent
Rectangle {
id: visualCapsule
width: root.contentWidth
height: root.contentHeight
anchors.centerIn: parent
radius: Style.radiusM
color: Style.capsuleColor
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
// Configure GridLayout to behave like RowLayout or ColumnLayout
rows: isVerticalBar ? -1 : 1 // -1 means unlimited
columns: isVerticalBar ? 1 : -1 // -1 means unlimited
GridLayout {
id: taskbarLayout
rowSpacing: isVerticalBar ? Style.marginXXS : 0
columnSpacing: isVerticalBar ? 0 : Style.marginXXS
// Pixel-perfect centering
x: isVerticalBar ? Style.pixelAlignCenter(parent.width, width) : ((root.showTitle) ? Style.pixelAlignCenter(parent.width, width) : Style.marginM)
y: Style.pixelAlignCenter(parent.height, height)
Repeater {
model: root.combinedModel
delegate: Item {
id: taskbarItem
required property var modelData
required property int index
property ShellScreen screen: root.screen
// Configure GridLayout to behave like RowLayout or ColumnLayout
rows: isVerticalBar ? -1 : 1 // -1 means unlimited
columns: isVerticalBar ? 1 : -1 // -1 means unlimited
readonly property bool isRunning: modelData.window !== null
readonly property bool isPinned: modelData.type === "pinned" || modelData.type === "pinned-running"
readonly property bool isFocused: isRunning && modelData.window && modelData.window.isFocused
readonly property bool isPinnedRunning: isPinned && isRunning && !isFocused
readonly property bool isHovered: root.hoveredWindowId === modelData.id
rowSpacing: isVerticalBar ? Style.marginXXS : 0
columnSpacing: isVerticalBar ? 0 : Style.marginXXS
readonly property bool shouldShowTitle: root.showTitle && modelData.type !== "pinned"
readonly property real itemSpacing: Style.marginS
readonly property real contentWidth: shouldShowTitle ? root.itemSize + itemSpacing + root.titleWidth : root.itemSize
Repeater {
model: root.combinedModel
delegate: Item {
id: taskbarItem
required property var modelData
required property int index
property ShellScreen screen: root.screen
readonly property string title: modelData.title || modelData.appId || "Unknown application"
readonly property color titleBgColor: (isHovered || isFocused) ? Color.mHover : Style.capsuleColor
readonly property color titleFgColor: (isHovered || isFocused) ? Color.mOnHover : Color.mOnSurface
readonly property bool isRunning: modelData.window !== null
readonly property bool isPinned: modelData.type === "pinned" || modelData.type === "pinned-running"
readonly property bool isFocused: isRunning && modelData.window && modelData.window.isFocused
readonly property bool isPinnedRunning: isPinned && isRunning && !isFocused
readonly property bool isHovered: root.hoveredWindowId === modelData.id
Layout.preferredWidth: root.showTitle ? Math.round(contentWidth + Style.marginXL) : Math.round(contentWidth) // Add margins for both pinned and running apps
Layout.preferredHeight: root.itemSize
Layout.alignment: Qt.AlignCenter
readonly property bool shouldShowTitle: root.showTitle && modelData.type !== "pinned"
readonly property real itemSpacing: Style.marginS
readonly property real contentWidth: shouldShowTitle ? root.itemSize + itemSpacing + root.titleWidth : root.itemSize
// Ensure dragged item is on top
z: (root.dragSourceIndex === index) ? 1000 : 1
readonly property string title: modelData.title || modelData.appId || "Unknown application"
readonly property color titleBgColor: (isHovered || isFocused) ? Color.mHover : Style.capsuleColor
readonly property color titleFgColor: (isHovered || isFocused) ? Color.mOnHover : Color.mOnSurface
property int modelIndex: index
objectName: "taskbarAppItem"
Layout.preferredWidth: root.isVerticalBar ? root.barHeight : (root.showTitle ? Math.round(contentWidth + Style.marginXL) : Math.round(contentWidth)) // Add margins for both pinned and running apps
Layout.preferredHeight: root.isVerticalBar ? root.itemSize : root.barHeight
Layout.alignment: Qt.AlignCenter
DropArea {
anchors.fill: parent
keys: ["taskbar-app"]
onEntered: function (drag) {
if (drag.source && drag.source.objectName === "taskbarAppItem") {
root.dragTargetIndex = taskbarItem.modelIndex;
// Ensure dragged item is on top
z: (root.dragSourceIndex === index) ? 1000 : 1
property int modelIndex: index
objectName: "taskbarAppItem"
DropArea {
anchors.fill: parent
keys: ["taskbar-app"]
onEntered: function (drag) {
if (drag.source && drag.source.objectName === "taskbarAppItem") {
root.dragTargetIndex = taskbarItem.modelIndex;
}
}
}
onExited: function () {
if (root.dragTargetIndex === taskbarItem.modelIndex) {
onExited: function () {
if (root.dragTargetIndex === taskbarItem.modelIndex) {
root.dragTargetIndex = -1;
}
}
onDropped: function (drop) {
root.dragSourceIndex = -1;
root.dragTargetIndex = -1;
}
}
onDropped: function (drop) {
root.dragSourceIndex = -1;
root.dragTargetIndex = -1;
Logger.d("Taskbar", "Dropped! Source: " + (drop.source ? drop.source.objectName : "null") + " Index: " + (drop.source ? drop.source.modelIndex : "?") + " -> Target Index: " + taskbarItem.modelIndex);
if (drop.source && drop.source.objectName === "taskbarAppItem" && drop.source !== taskbarItem) {
root.reorderApps(drop.source.modelIndex, taskbarItem.modelIndex);
} else {
Logger.d("Taskbar", "Drop ignored. Source objectName: " + (drop.source ? drop.source.objectName : "null"));
}
}
}
Item {
id: draggableContent
width: parent.width
height: parent.height
anchors.centerIn: dragging ? undefined : parent
// Visual shifting logic
readonly property bool isDragged: root.dragSourceIndex === index
property real shiftOffset: 0
// Calculate shift based on drag state
// If I am NOT the dragged item, but I am in the path of the drag
Binding on shiftOffset {
value: {
if (root.dragSourceIndex !== -1 && root.dragTargetIndex !== -1 && !draggableContent.isDragged) {
if (root.dragSourceIndex < root.dragTargetIndex) {
// Dragging Right: Items between source and target shift Left
if (index > root.dragSourceIndex && index <= root.dragTargetIndex) {
return -1 * (root.isVerticalBar ? root.itemSize : draggableContent.width); // Simple approximation, could be refined
}
} else if (root.dragSourceIndex > root.dragTargetIndex) {
// Dragging Left: Items between target and source shift Right
if (index >= root.dragTargetIndex && index < root.dragSourceIndex) {
return (root.isVerticalBar ? root.itemSize : draggableContent.width);
}
}
}
return 0;
}
}
transform: Translate {
x: !root.isVerticalBar ? draggableContent.shiftOffset : 0
y: root.isVerticalBar ? draggableContent.shiftOffset : 0
Behavior on x {
NumberAnimation {
duration: Style.animationFast
easing.type: Easing.OutQuad
}
}
Behavior on y {
NumberAnimation {
duration: Style.animationFast
easing.type: Easing.OutQuad
Logger.d("Taskbar", "Dropped! Source: " + (drop.source ? drop.source.objectName : "null") + " Index: " + (drop.source ? drop.source.modelIndex : "?") + " -> Target Index: " + taskbarItem.modelIndex);
if (drop.source && drop.source.objectName === "taskbarAppItem" && drop.source !== taskbarItem) {
root.reorderApps(drop.source.modelIndex, taskbarItem.modelIndex);
} else {
Logger.d("Taskbar", "Drop ignored. Source objectName: " + (drop.source ? drop.source.objectName : "null"));
}
}
}
property bool dragging: taskbarMouseArea.drag.active
onDraggingChanged: {
if (dragging) {
root.dragSourceIndex = index;
} else {
// Don't reset immediately on release to allow drop to handle it,
// or use a timer if needed, but drop handler usually fires.
// However, if dropped outside, we need to reset.
// Let's reset if not handled by drop area quickly?
// Actually, drag.active becomes false on release.
// We might want to clear it if no drop happened.
if (root.dragSourceIndex === index) {
// Slight delay/check? For now, let DropArea handle reset on success.
// If cancelled (dropped nowhere), we should reset.
Qt.callLater(() => {
if (!taskbarMouseArea.drag.active && root.dragSourceIndex === index) {
root.dragSourceIndex = -1;
root.dragTargetIndex = -1;
}
});
}
}
}
Drag.active: dragging
Drag.source: taskbarItem
Drag.hotSpot.x: width / 2
Drag.hotSpot.y: height / 2
Drag.keys: ["taskbar-app"]
z: dragging ? 1000 : 0
scale: dragging ? 1.05 : 1.0
Behavior on scale {
NumberAnimation {
duration: Style.animationFast
}
}
Rectangle {
id: titleBackground
visible: shouldShowTitle
anchors.centerIn: parent
Item {
id: draggableContent
width: parent.width
height: root.height
color: titleBgColor
radius: Style.radiusM
height: parent.height
anchors.centerIn: dragging ? undefined : parent
Behavior on color {
ColorAnimation {
duration: Style.animationFast
easing.type: Easing.InOutQuad
// Visual shifting logic
readonly property bool isDragged: root.dragSourceIndex === index
property real shiftOffset: 0
// Calculate shift based on drag state
// If I am NOT the dragged item, but I am in the path of the drag
Binding on shiftOffset {
value: {
if (root.dragSourceIndex !== -1 && root.dragTargetIndex !== -1 && !draggableContent.isDragged) {
if (root.dragSourceIndex < root.dragTargetIndex) {
// Dragging Right: Items between source and target shift Left
if (index > root.dragSourceIndex && index <= root.dragTargetIndex) {
return -1 * (root.isVerticalBar ? root.itemSize : draggableContent.width); // Simple approximation, could be refined
}
} else if (root.dragSourceIndex > root.dragTargetIndex) {
// Dragging Left: Items between target and source shift Right
if (index >= root.dragTargetIndex && index < root.dragSourceIndex) {
return (root.isVerticalBar ? root.itemSize : draggableContent.width);
}
}
}
return 0;
}
}
}
Rectangle {
anchors.centerIn: parent
width: taskbarItem.contentWidth
height: parent.height
color: "transparent"
transform: Translate {
x: !root.isVerticalBar ? draggableContent.shiftOffset : 0
y: root.isVerticalBar ? draggableContent.shiftOffset : 0
RowLayout {
id: itemLayout
anchors.fill: parent
spacing: taskbarItem.itemSpacing
Behavior on x {
NumberAnimation {
duration: Style.animationFast
easing.type: Easing.OutQuad
}
}
Behavior on y {
NumberAnimation {
duration: Style.animationFast
easing.type: Easing.OutQuad
}
}
}
Item {
Layout.preferredWidth: root.itemSize
Layout.preferredHeight: root.itemSize
Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
property bool dragging: taskbarMouseArea.drag.active
onDraggingChanged: {
if (dragging) {
root.dragSourceIndex = index;
} else {
// Don't reset immediately on release to allow drop to handle it,
// or use a timer if needed, but drop handler usually fires.
// However, if dropped outside, we need to reset.
// Let's reset if not handled by drop area quickly?
// Actually, drag.active becomes false on release.
// We might want to clear it if no drop happened.
if (root.dragSourceIndex === index) {
// Slight delay/check? For now, let DropArea handle reset on success.
// If cancelled (dropped nowhere), we should reset.
Qt.callLater(() => {
if (!taskbarMouseArea.drag.active && root.dragSourceIndex === index) {
root.dragSourceIndex = -1;
root.dragTargetIndex = -1;
}
});
}
}
}
IconImage {
id: appIcon
anchors.fill: parent
Drag.active: dragging
Drag.source: taskbarItem
Drag.hotSpot.x: width / 2
Drag.hotSpot.y: height / 2
Drag.keys: ["taskbar-app"]
source: ThemeIcons.iconForAppId(taskbarItem.modelData.appId)
smooth: true
asynchronous: true
z: dragging ? 1000 : 0
scale: dragging ? 1.05 : 1.0
Behavior on scale {
NumberAnimation {
duration: Style.animationFast
}
}
// Apply dock shader to all taskbar icons
layer.enabled: widgetSettings.colorizeIcons !== false
layer.effect: ShaderEffect {
property color targetColor: Settings.data.colorSchemes.darkMode ? Color.mOnSurface : Color.mSurfaceVariant
property real colorizeMode: 0.0 // Dock mode (grayscale)
Rectangle {
id: titleBackground
visible: shouldShowTitle
anchors.centerIn: parent
width: parent.width
height: root.capsuleHeight
color: titleBgColor
radius: Style.radiusM
fragmentShader: Qt.resolvedUrl(Quickshell.shellDir + "/Shaders/qsb/appicon_colorize.frag.qsb")
Behavior on color {
ColorAnimation {
duration: Style.animationFast
easing.type: Easing.InOutQuad
}
}
}
Rectangle {
anchors.centerIn: parent
width: taskbarItem.contentWidth
height: parent.height
color: "transparent"
RowLayout {
id: itemLayout
anchors.fill: parent
spacing: taskbarItem.itemSpacing
Item {
Layout.preferredWidth: root.itemSize
Layout.preferredHeight: root.itemSize
Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
IconImage {
id: appIcon
anchors.fill: parent
source: ThemeIcons.iconForAppId(taskbarItem.modelData.appId)
smooth: true
asynchronous: true
// Apply dock shader to all taskbar icons
layer.enabled: widgetSettings.colorizeIcons !== false
layer.effect: ShaderEffect {
property color targetColor: Settings.data.colorSchemes.darkMode ? Color.mOnSurface : Color.mSurfaceVariant
property real colorizeMode: 0.0 // Dock mode (grayscale)
fragmentShader: Qt.resolvedUrl(Quickshell.shellDir + "/Shaders/qsb/appicon_colorize.frag.qsb")
}
}
Rectangle {
id: iconBackground
visible: !shouldShowTitle
anchors.bottomMargin: -2
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
width: Style.toOdd(root.itemSize * 0.25)
height: 4
color: taskbarItem.isFocused ? Color.mPrimary : (taskbarItem.isHovered ? Color.mHover : "transparent")
radius: Math.min(Style.radiusXXS, width / 2)
Behavior on color {
ColorAnimation {
duration: Style.animationFast
easing.type: Easing.OutCubic
}
}
}
}
Rectangle {
id: iconBackground
visible: !shouldShowTitle
anchors.bottomMargin: -2
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
width: Style.toOdd(root.itemSize * 0.25)
height: 4
color: taskbarItem.isFocused ? Color.mPrimary : "transparent"
radius: Math.min(Style.radiusXXS, width / 2)
NText {
id: titleText
visible: shouldShowTitle
Layout.preferredWidth: root.titleWidth
Layout.preferredHeight: root.itemSize
Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
Layout.fillWidth: false
text: taskbarItem.title
elide: Text.ElideRight
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
pointSize: barFontSize
color: titleFgColor
opacity: Style.opacityFull
}
}
NText {
id: titleText
visible: shouldShowTitle
Layout.preferredWidth: root.titleWidth
Layout.preferredHeight: root.itemSize
Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
Layout.fillWidth: false
text: taskbarItem.title
elide: Text.ElideRight
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
pointSize: barFontSize
color: titleFgColor
opacity: Style.opacityFull
}
}
}
}
MouseArea {
id: taskbarMouseArea
objectName: "taskbarMouseArea"
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
MouseArea {
id: taskbarMouseArea
objectName: "taskbarMouseArea"
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton
drag.target: draggableContent
drag.axis: root.isVerticalBar ? Drag.YAxis : Drag.XAxis
preventStealing: true
drag.target: draggableContent
drag.axis: root.isVerticalBar ? Drag.YAxis : Drag.XAxis
preventStealing: true
onPressed: {
// Constrain drag to roughly the taskbar area but allow some freedom
// Or just let it be free since we only care about drops
}
onReleased: {
if (draggableContent.Drag.active) {
draggableContent.Drag.drop();
onPressed: {
// Constrain drag to roughly the taskbar area but allow some freedom
// Or just let it be free since we only care about drops
}
}
onClicked: function (mouse) {
if (!modelData)
return;
if (mouse.button === Qt.LeftButton) {
if (isRunning && modelData.window) {
// Running app - focus it
try {
CompositorService.focusWindow(modelData.window);
} catch (error) {
Logger.e("Taskbar", "Failed to activate toplevel: " + error);
}
} else if (isPinned) {
// Pinned app not running - launch it
root.launchPinnedApp(modelData.appId);
onReleased: {
if (draggableContent.Drag.active) {
draggableContent.Drag.drop();
}
} else if (mouse.button === Qt.RightButton) {
}
onClicked: mouse => {
if (!modelData)
return;
if (mouse.button === Qt.LeftButton) {
if (isRunning && modelData.window) {
// Running app - focus it
try {
CompositorService.focusWindow(modelData.window);
} catch (error) {
Logger.e("Taskbar", "Failed to activate toplevel: " + error);
}
} else if (isPinned) {
// Pinned app not running - launch it
root.launchPinnedApp(modelData.appId);
}
} else if (mouse.button === Qt.RightButton) {
TooltipService.hide();
// Only show context menu for running apps
if (isRunning && modelData.window) {
root.selectedWindowId = modelData.id;
root.selectedAppId = modelData.appId;
root.openTaskbarContextMenu(taskbarItem);
}
}
}
onEntered: {
root.hoveredWindowId = taskbarItem.modelData.id;
TooltipService.show(taskbarItem, taskbarItem.title, BarService.getTooltipDirection(root.screen?.name));
}
onExited: {
root.hoveredWindowId = "";
TooltipService.hide();
// Only show context menu for running apps
if (isRunning && modelData.window) {
root.selectedWindowId = modelData.id;
root.selectedAppId = modelData.appId;
root.openTaskbarContextMenu(taskbarItem);
}
}
}
onEntered: {
root.hoveredWindowId = taskbarItem.modelData.id;
TooltipService.show(taskbarItem, taskbarItem.title, BarService.getTooltipDirection(root.screen?.name));
}
onExited: {
root.hoveredWindowId = "";
TooltipService.hide();
}
}
}
}
@@ -964,30 +985,7 @@ Rectangle {
// Set the model directly
contextMenu.model = items;
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.open();
// Calculate menu position
const globalPos = item.mapToItem(root, 0, 0);
let menuX, menuY;
if (root.barPosition === "top") {
menuX = globalPos.x + (item.width / 2) - (contextMenu.implicitWidth / 2);
menuY = barHeight + Style.marginS;
} else if (root.barPosition === "bottom") {
const menuHeight = 12 + contextMenu.model.length * contextMenu.itemHeight;
menuX = globalPos.x + (item.width / 2) - (contextMenu.implicitWidth / 2);
menuY = -menuHeight - Style.marginS;
} else if (root.barPosition === "left") {
menuX = barHeight + Style.marginS;
menuY = globalPos.y + (item.height / 2) - (contextMenu.implicitHeight / 2);
} else {
// right
menuX = -contextMenu.implicitWidth - Style.marginS;
menuY = globalPos.y + (item.height / 2) - (contextMenu.implicitHeight / 2);
}
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(root, screen);
}
// Anchor to root (stable) but center horizontally on the clicked item
PanelService.showContextMenu(contextMenu, root, screen, item);
}
}
+178 -95
View File
@@ -10,7 +10,7 @@ import qs.Modules.Bar.Extras
import qs.Services.UI
import qs.Widgets
Rectangle {
Item {
id: root
property ShellScreen screen
@@ -43,9 +43,11 @@ Rectangle {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -53,10 +55,10 @@ Rectangle {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isVertical: barPosition === "left" || barPosition === "right"
readonly property real barHeight: Style.getBarHeightForScreen(screen?.name)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screen?.name)
readonly property real barHeight: Style.getBarHeightForScreen(screenName)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
readonly property bool density: Settings.data.bar.density
readonly property int iconSize: Style.toOdd(capsuleHeight * 0.65)
@@ -64,8 +66,11 @@ Rectangle {
property var pinned: widgetSettings.pinned || widgetMetadata.pinned || [] // Pinned items (shown inline)
property bool drawerEnabled: widgetSettings.drawerEnabled !== undefined ? widgetSettings.drawerEnabled : (widgetMetadata.drawerEnabled !== undefined ? widgetMetadata.drawerEnabled : true) // Enable drawer panel
property bool hidePassive: widgetSettings.hidePassive !== undefined ? widgetSettings.hidePassive : true // Hide passive status items
readonly property string chevronColorKey: widgetSettings.chevronColor !== undefined ? widgetSettings.chevronColor : widgetMetadata.chevronColor
readonly property color chevronColor: Color.resolveColorKey(chevronColorKey)
property var filteredItems: [] // Items to show inline (pinned)
property var dropdownItems: [] // Items to show in drawer (unpinned)
property int hoveredItemIndex: -1 // Track hovered item for dot indicator
Timer {
id: updateDebounceTimer
@@ -115,8 +120,8 @@ Rectangle {
function _performFilteredItemsUpdate() {
// Force a fresh read of settings to ensure we have the latest blacklist
var currentSettings = {};
if (section && sectionWidgetIndex >= 0) {
var w = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var w = Settings.getBarWidgetsForScreen(screenName)[section];
if (w && sectionWidgetIndex < w.length) {
currentSettings = w[sectionWidgetIndex];
}
@@ -284,35 +289,73 @@ Rectangle {
Component.onCompleted: {
root.updateFilteredItems(); // Initial update
}
implicitWidth: isVertical ? capsuleHeight : Math.round(trayFlow.implicitWidth)
implicitHeight: isVertical ? Math.round(trayFlow.implicitHeight) : capsuleHeight
radius: Style.radiusM
color: Style.capsuleColor
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
// Content dimensions for implicit sizing
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 + 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
// Visual capsule centered in parent
Rectangle {
id: visualCapsule
width: capsuleWidth
height: capsuleContentHeight
x: Style.pixelAlignCenter(parent.width, width)
y: Style.pixelAlignCenter(parent.height, height)
radius: Style.radiusM
color: Style.capsuleColor
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
}
NPopupContextMenu {
id: chevronContextMenu
model: [
{
"label": I18n.tr("actions.widget-settings"),
"action": "widget-settings",
"icon": "settings"
},
]
onTriggered: action => {
chevronContextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
}
}
}
Flow {
id: trayFlow
spacing: Style.marginXS
spacing: 0
flow: isVertical ? Flow.TopToBottom : Flow.LeftToRight
// Pixel-perfect centering
x: isVertical ? Style.pixelAlignCenter(parent.width, width) : 0
y: isVertical ? 0 : Style.pixelAlignCenter(parent.height, height)
// Position centered in capsule
anchors.centerIn: visualCapsule
// Drawer opener (before items if opposite direction)
NIconButton {
id: chevronIconBefore
visible: root.drawerEnabled && dropdownItems.length > 0 && BarService.getPillDirection(root)
width: isVertical ? barHeight : capsuleHeight
height: isVertical ? capsuleHeight : barHeight
tooltipText: I18n.tr("tooltips.open-tray-dropdown")
tooltipDirection: BarService.getTooltipDirection(root.screen?.name)
baseSize: capsuleHeight
applyUiScale: false
customRadius: Style.radiusL
colorBg: "transparent"
colorFg: Settings.data.colorSchemes.darkMode ? Color.mOnSurface : Color.mOnPrimary
colorFg: root.chevronColor
colorBorder: "transparent"
colorBorderHover: "transparent"
icon: {
@@ -329,7 +372,7 @@ Rectangle {
}
}
onClicked: toggleDrawer(this)
onRightClicked: toggleDrawer(this)
onRightClicked: PanelService.showContextMenu(chevronContextMenu, this, screen)
}
// Pinned items
@@ -338,9 +381,22 @@ Rectangle {
model: root.filteredItems
delegate: Item {
width: capsuleHeight
height: capsuleHeight
id: trayDelegate
required property var modelData
required property int index
width: isVertical ? barHeight : capsuleHeight
height: isVertical ? capsuleHeight : barHeight
visible: modelData
readonly property bool isHovered: root.hoveredItemIndex === index
// Tooltip anchor representing the visual area (for proper tooltip positioning)
Item {
id: tooltipAnchor
width: capsuleHeight
height: capsuleHeight
x: Style.pixelAlignCenter(parent.width, width)
y: Style.pixelAlignCenter(parent.height, height)
}
IconImage {
id: trayIcon
@@ -351,8 +407,6 @@ Rectangle {
asynchronous: true
backer.fillMode: Image.PreserveAspectFit
property bool menuJustOpened: false
source: {
let icon = modelData?.icon || "";
if (!icon) {
@@ -378,82 +432,109 @@ Rectangle {
fragmentShader: Qt.resolvedUrl(Quickshell.shellDir + "/Shaders/qsb/appicon_colorize.frag.qsb")
}
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
onClicked: mouse => {
if (!modelData) {
return;
}
Rectangle {
id: hoverIndicator
anchors.bottom: trayIcon.bottom
anchors.bottomMargin: -2
anchors.horizontalCenter: trayIcon.horizontalCenter
width: Style.toOdd(iconSize * 0.25)
height: 4
color: trayDelegate.isHovered ? Color.mHover : "transparent"
radius: Math.min(Style.radiusXXS, width / 2)
if (mouse.button === Qt.LeftButton) {
// Close any open menu first
if (popupMenuWindow) {
popupMenuWindow.close();
}
Behavior on color {
ColorAnimation {
duration: Style.animationFast
easing.type: Easing.OutCubic
}
}
}
if (!modelData.onlyMenu) {
modelData.activate();
}
} else if (mouse.button === Qt.MiddleButton) {
// Close the menu if it was visible
if (popupMenuWindow && popupMenuWindow.visible) {
popupMenuWindow.close();
return;
}
modelData.secondaryActivate && modelData.secondaryActivate();
} else if (mouse.button === Qt.RightButton) {
TooltipService.hideImmediately();
// Close the menu if it was visible
if (popupMenuWindow && popupMenuWindow.visible) {
popupMenuWindow.close();
return;
}
// Close any opened panel
if ((PanelService.openedPanel !== null) && !PanelService.openedPanel.isClosing) {
PanelService.openedPanel.close();
}
if (modelData.hasMenu && modelData.menu && popupMenuWindow && trayMenu && trayMenu.item) {
popupMenuWindow.open();
// Position menu based on bar position
let menuX, menuY;
if (barPosition === "left") {
// For left bar: position menu to the right of the bar
menuX = width + Style.marginM;
menuY = 0;
} else if (barPosition === "right") {
// For right bar: position menu to the left of the bar
menuX = -trayMenu.item.width - Style.marginM;
menuY = 0;
} else {
// For horizontal bars: center horizontally and position below
menuX = (width / 2) - (trayMenu.item.width / 2);
menuY = (barPosition === "top") ? barHeight + Style.marginS - 2 : barHeight + Style.marginS - 2;
}
trayMenu.item.trayItem = modelData;
trayMenu.item.widgetSection = root.section;
trayMenu.item.widgetIndex = root.sectionWidgetIndex;
trayMenu.item.showAt(parent, menuX, menuY);
} else {
Logger.d("Tray", "No menu available for", modelData.id, "or trayMenu not set");
}
}
}
onEntered: {
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();
}
TooltipService.show(trayIcon, modelData.tooltipTitle || modelData.name || modelData.id || "Tray Item", BarService.getTooltipDirection(root.screen?.name));
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);
}
onExited: TooltipService.hide()
}
onClicked: mouse => {
if (!modelData) {
return;
}
if (mouse.button === Qt.LeftButton) {
// Close any open menu first
if (popupMenuWindow) {
popupMenuWindow.close();
}
if (!modelData.onlyMenu) {
modelData.activate();
}
} else if (mouse.button === Qt.MiddleButton) {
// Close the menu if it was visible
if (popupMenuWindow && popupMenuWindow.visible) {
popupMenuWindow.close();
return;
}
modelData.secondaryActivate && modelData.secondaryActivate();
} else if (mouse.button === Qt.RightButton) {
TooltipService.hideImmediately();
// Close the menu if it was visible
if (popupMenuWindow && popupMenuWindow.visible) {
popupMenuWindow.close();
return;
}
// Close any opened panel
if ((PanelService.openedPanel !== null) && !PanelService.openedPanel.isClosing) {
PanelService.openedPanel.close();
}
if (modelData.hasMenu && modelData.menu && trayMenu && trayMenu.item) {
// Calculate menu position after ensuring menu is loaded
const calculateAndShow = () => {
// Position menu based on bar position, using tooltipAnchor for proper positioning
// Increased spacing for better alignment with other context menus
let menuX, menuY;
if (barPosition === "left") {
// For left bar: position menu to the right of the visual area
menuX = tooltipAnchor.width + Style.marginL;
menuY = 0;
} else if (barPosition === "right") {
// For right bar: position menu to the left of the visual area
menuX = -trayMenu.item.implicitWidth - Style.marginL;
menuY = 0;
} else {
// For horizontal bars: center horizontally and position below visual area
menuX = (tooltipAnchor.width / 2) - (trayMenu.item.implicitWidth / 2);
menuY = tooltipAnchor.height + Style.marginS;
}
PanelService.showTrayMenu(root.screen, modelData, trayMenu.item, tooltipAnchor, menuX, menuY, root.section, root.sectionWidgetIndex);
};
// Use Qt.callLater to ensure menu dimensions are calculated
Qt.callLater(calculateAndShow);
} else {
Logger.d("Tray", "No menu available for", modelData.id, "or trayMenu not set");
}
}
}
}
}
}
@@ -462,13 +543,15 @@ Rectangle {
NIconButton {
id: chevronIconAfter
visible: root.drawerEnabled && dropdownItems.length > 0 && !BarService.getPillDirection(root)
width: isVertical ? barHeight : capsuleHeight
height: isVertical ? capsuleHeight : barHeight
tooltipText: I18n.tr("tooltips.open-tray-dropdown")
tooltipDirection: BarService.getTooltipDirection(root.screen?.name)
baseSize: capsuleHeight
applyUiScale: false
customRadius: Style.radiusL
colorBg: "transparent"
colorFg: Color.mOnSurface
colorFg: root.chevronColor
colorBorder: "transparent"
colorBorderHover: "transparent"
icon: {
@@ -485,7 +568,7 @@ Rectangle {
}
}
onClicked: toggleDrawer(this)
onRightClicked: toggleDrawer(this)
onRightClicked: PanelService.showContextMenu(chevronContextMenu, this, screen)
}
}
} // closes Flow
}
+13 -12
View File
@@ -18,9 +18,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -28,9 +30,11 @@ Item {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isBarVertical: barPosition === "left" || barPosition === "right"
readonly property string displayMode: widgetSettings.displayMode !== undefined ? widgetSettings.displayMode : widgetMetadata.displayMode
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
readonly property string textColorKey: widgetSettings.textColor !== undefined ? widgetSettings.textColor : widgetMetadata.textColor
implicitWidth: pill.width
implicitHeight: pill.height
@@ -71,10 +75,9 @@ Item {
}
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (!action) {
return;
}
@@ -99,6 +102,8 @@ Item {
screen: root.screen
oppositeDirection: BarService.getPillDirection(root)
customIconColor: Color.resolveColorKeyOptional(root.iconColorKey)
customTextColor: Color.resolveColorKeyOptional(root.textColorKey)
icon: VPNService.hasActiveConnection ? "shield-lock" : "shield"
text: {
if (VPNService.activeConnections.length > 0) {
@@ -122,11 +127,7 @@ Item {
forceOpen: !isBarVertical && root.displayMode === "alwaysShow"
forceClose: isBarVertical || root.displayMode === "alwaysHide" || !pill.text
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(pill, screen);
}
PanelService.showContextMenu(contextMenu, pill, screen);
}
tooltipText: {
if (pill.text !== "") {
+14 -16
View File
@@ -21,9 +21,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -31,10 +33,12 @@ Item {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isBarVertical: barPosition === "left" || barPosition === "right"
readonly property string displayMode: (widgetSettings.displayMode !== undefined) ? widgetSettings.displayMode : widgetMetadata.displayMode
readonly property string middleClickCommand: (widgetSettings.middleClickCommand !== undefined) ? widgetSettings.middleClickCommand : widgetMetadata.middleClickCommand
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
readonly property string textColorKey: widgetSettings.textColor !== undefined ? widgetSettings.textColor : widgetMetadata.textColor
// Used to avoid opening the pill on Quickshell startup
property bool firstVolumeReceived: false
@@ -91,16 +95,13 @@ Item {
]
onTriggered: action => {
// Close the popup menu window before handling the action
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "toggle-mute") {
AudioService.setOutputMuted(!AudioService.muted);
} else if (action === "custom-command") {
Quickshell.execDetached(["sh", "-lc", middleClickCommand]);
Quickshell.execDetached(["sh", "-c", middleClickCommand]);
} else if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
}
@@ -112,6 +113,8 @@ Item {
screen: root.screen
oppositeDirection: BarService.getPillDirection(root)
customIconColor: Color.resolveColorKeyOptional(root.iconColorKey)
customTextColor: Color.resolveColorKeyOptional(root.textColorKey)
icon: AudioService.getOutputIcon()
autoHide: false // Important to be false so we can hover as long as we want
text: {
@@ -147,15 +150,10 @@ Item {
PanelService.getPanel("audioPanel", screen)?.toggle(this);
}
onRightClicked: {
// Get the shared popup menu window for this screen
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(pill, screen);
}
PanelService.showContextMenu(contextMenu, pill, screen);
}
onMiddleClicked: {
Quickshell.execDetached(["sh", "-lc", middleClickCommand]);
Quickshell.execDetached(["sh", "-c", middleClickCommand]);
}
}
}
+31 -12
View File
@@ -12,6 +12,26 @@ NIconButton {
property ShellScreen screen
// Widget properties passed from Bar.qml for per-instance settings
property string widgetId: ""
property string section: ""
property int sectionWidgetIndex: -1
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
}
return {};
}
readonly property string iconColorKey: widgetSettings.iconColor !== undefined ? widgetSettings.iconColor : widgetMetadata.iconColor
enabled: Settings.data.wallpaper.enabled
baseSize: Style.getCapsuleHeightForScreen(screen?.name)
applyUiScale: false
@@ -20,9 +40,7 @@ NIconButton {
tooltipText: I18n.tr("tooltips.wallpaper-selector")
tooltipDirection: BarService.getTooltipDirection(screen?.name)
colorBg: Style.capsuleColor
colorFg: Color.mOnSurface
colorBorder: "transparent"
colorBorderHover: "transparent"
colorFg: Color.resolveColorKey(iconColorKey)
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
@@ -35,16 +53,21 @@ NIconButton {
"action": "random-wallpaper",
"icon": "dice"
},
{
"label": I18n.tr("actions.widget-settings"),
"action": "widget-settings",
"icon": "settings"
},
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "random-wallpaper") {
WallpaperService.setRandomWallpaper();
} else if (action === "widget-settings") {
BarService.openWidgetSettings(screen, section, sectionWidgetIndex, widgetId, widgetSettings);
}
}
}
@@ -58,10 +81,6 @@ NIconButton {
}
}
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(root, screen);
}
PanelService.showContextMenu(contextMenu, root, screen);
}
}
+140 -388
View File
@@ -24,9 +24,11 @@ Item {
property int sectionWidgetsCount: 0
property var widgetMetadata: BarWidgetRegistry.widgetMetadata[widgetId]
// Explicit screenName property ensures reactive binding when screen changes
readonly property string screenName: screen ? screen.name : ""
property var widgetSettings: {
if (section && sectionWidgetIndex >= 0) {
var widgets = Settings.getBarWidgetsForScreen(screen?.name)[section];
if (section && sectionWidgetIndex >= 0 && screenName) {
var widgets = Settings.getBarWidgetsForScreen(screenName)[section];
if (widgets && sectionWidgetIndex < widgets.length) {
return widgets[sectionWidgetIndex];
}
@@ -34,12 +36,11 @@ Item {
return {};
}
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isVertical: barPosition === "left" || barPosition === "right"
readonly property real barHeight: Style.getBarHeightForScreen(screen?.name)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screen?.name)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screen?.name)
readonly property real baseDimensionRatio: 0.65 * (widgetSettings.labelMode === "none" ? 0.75 : 1)
readonly property real barHeight: Style.getBarHeightForScreen(screenName)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screenName)
readonly property string labelMode: (widgetSettings.labelMode !== undefined) ? widgetSettings.labelMode : widgetMetadata.labelMode
readonly property bool hasLabel: (labelMode !== "none")
@@ -47,6 +48,12 @@ Item {
readonly property bool followFocusedScreen: (widgetSettings.followFocusedScreen !== undefined) ? widgetSettings.followFocusedScreen : widgetMetadata.followFocusedScreen
readonly property int characterCount: isVertical ? 2 : ((widgetSettings.characterCount !== undefined) ? widgetSettings.characterCount : widgetMetadata.characterCount)
// Pill size setting (0.5-1.0 range)
readonly property real pillSize: (widgetSettings.pillSize !== undefined) ? widgetSettings.pillSize : widgetMetadata.pillSize
// When no label the pills are smaller
readonly property real baseDimensionRatio: pillSize
// Grouped mode (show applications) settings
readonly property bool showApplications: (widgetSettings.showApplications !== undefined) ? widgetSettings.showApplications : widgetMetadata.showApplications
readonly property bool showLabelsOnlyWhenOccupied: (widgetSettings.showLabelsOnlyWhenOccupied !== undefined) ? widgetSettings.showLabelsOnlyWhenOccupied : widgetMetadata.showLabelsOnlyWhenOccupied
@@ -54,7 +61,27 @@ Item {
readonly property real unfocusedIconsOpacity: (widgetSettings.unfocusedIconsOpacity !== undefined) ? widgetSettings.unfocusedIconsOpacity : widgetMetadata.unfocusedIconsOpacity
readonly property real groupedBorderOpacity: (widgetSettings.groupedBorderOpacity !== undefined) ? widgetSettings.groupedBorderOpacity : widgetMetadata.groupedBorderOpacity
readonly property bool enableScrollWheel: (widgetSettings.enableScrollWheel !== undefined) ? widgetSettings.enableScrollWheel : widgetMetadata.enableScrollWheel
readonly property bool reverseScroll: (widgetSettings.reverseScroll !== undefined) ? widgetSettings.reverseScroll : (widgetMetadata.reverseScroll || false)
readonly property real iconScale: (widgetSettings.iconScale !== undefined) ? widgetSettings.iconScale : widgetMetadata.iconScale
readonly property string focusedColor: (widgetSettings.focusedColor !== undefined) ? widgetSettings.focusedColor : widgetMetadata.focusedColor
readonly property string occupiedColor: (widgetSettings.occupiedColor !== undefined) ? widgetSettings.occupiedColor : widgetMetadata.occupiedColor
readonly property string emptyColor: (widgetSettings.emptyColor !== undefined) ? widgetSettings.emptyColor : widgetMetadata.emptyColor
readonly property bool showBadge: (widgetSettings.showBadge !== undefined) ? widgetSettings.showBadge : widgetMetadata.showBadge
// Helper to safely get colors with proper reactivity
// Accesses Color singleton directly to ensure fresh values
function getColorPair(colorKey) {
switch (colorKey) {
case "primary":
return [Color.mPrimary, Color.mOnPrimary];
case "secondary":
return [Color.mSecondary, Color.mOnSecondary];
case "tertiary":
return [Color.mTertiary, Color.mOnTertiary];
default:
return [Color.mOnSurface, Color.mSurface];
}
}
// Only for grouped mode / show apps
readonly property int baseItemSize: Style.toOdd(capsuleHeight * 0.8)
@@ -69,16 +96,12 @@ Item {
function getSelectedWindow() {
if (!selectedWindowId)
return null;
for (var i = 0; i < localWorkspaces.count; i++) {
var ws = localWorkspaces.get(i);
if (ws && ws.windows) {
for (var j = 0; j < ws.windows.count; j++) {
var win = ws.windows.get(j);
// Using loose equality on purpose (==)
if (win && (win.id == selectedWindowId || win.address == selectedWindowId)) {
return win;
}
}
// Search directly in CompositorService to get the live window object
for (var i = 0; i < CompositorService.windows.count; i++) {
var win = CompositorService.windows.get(i);
// Using loose equality on purpose (==)
if (win && (win.id == selectedWindowId || win.address == selectedWindowId)) {
return win;
}
}
return null;
@@ -89,6 +112,8 @@ Item {
// Revision counter to force icon re-evaluation
property int iconRevision: 0
// Revision counter to force window list re-evaluation (for liveWindows binding in grouped mode)
property int windowRevision: 0
property ListModel localWorkspaces: ListModel {}
property int lastFocusedWorkspaceId: -1
@@ -115,7 +140,7 @@ Item {
// Don't calculate text width if labels are off
if (labelMode === "none") {
return Math.round(d * factor);
return Style.toOdd(d * factor);
}
var displayText = ws.idx.toString();
@@ -229,7 +254,9 @@ Item {
}
onScreenChanged: refreshWorkspaces()
onScreenNameChanged: refreshWorkspaces()
onHideUnoccupiedChanged: refreshWorkspaces()
onShowApplicationsChanged: refreshWorkspaces()
Connections {
target: CompositorService
@@ -238,11 +265,13 @@ Item {
}
function onWindowListChanged() {
if (showApplications || showLabelsOnlyWhenOccupied) {
root.windowRevision++;
refreshWorkspaces();
}
}
function onActiveWindowChanged() {
if (showApplications) {
root.windowRevision++;
refreshWorkspaces();
}
}
@@ -271,7 +300,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;
@@ -290,10 +320,13 @@ Item {
isOccupied: ws.isOccupied
};
if (showApplications) {
workspaceData.windows = CompositorService.getWindowsForWorkspace(ws.id);
if (ws.handle !== null && ws.handle !== undefined) {
workspaceData.handle = ws.handle;
}
// Windows are fetched live via liveWindows property in grouped mode
// to avoid Qt 6.9 ListModel nested array serialization issues
targetList.push(workspaceData);
}
}
@@ -424,10 +457,8 @@ Item {
}
onTriggered: (action, item) => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
contextMenu.close();
PanelService.closeContextMenu(screen);
const selectedWindow = root.getSelectedWindow();
@@ -469,11 +500,7 @@ Item {
acceptedButtons: Qt.RightButton
onClicked: mouse => {
if (mouse.button === Qt.RightButton) {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(workspaceBackground, screen);
}
PanelService.showContextMenu(contextMenu, workspaceBackground, screen);
}
}
}
@@ -509,6 +536,8 @@ Item {
var step = 120;
if (Math.abs(root.wheelAccumulatedDelta) >= step) {
var direction = root.wheelAccumulatedDelta > 0 ? -1 : 1;
if (root.reverseScroll)
direction *= -1;
// For vertical layout, natural mapping: wheel up -> previous, down -> next (already handled by sign)
// For horizontal layout, same mapping using vertical wheel
root.switchByOffset(direction);
@@ -525,173 +554,31 @@ Item {
id: pillRow
spacing: spacingBetweenPills
x: horizontalPadding
y: workspaceBackground.y + Style.pixelAlignCenter(workspaceBackground.height, height)
y: 0
visible: !isVertical && !showApplications
Repeater {
id: workspaceRepeaterHorizontal
model: localWorkspaces
Item {
id: workspacePillContainer
height: Style.toOdd(capsuleHeight * root.baseDimensionRatio)
states: [
State {
name: "active"
when: model.isActive
PropertyChanges {
target: workspacePillContainer
width: root.getWorkspaceWidth(model, true)
}
},
State {
name: "inactive"
when: !model.isActive
PropertyChanges {
target: workspacePillContainer
width: root.getWorkspaceWidth(model, false)
}
}
]
transitions: [
Transition {
from: "inactive"
to: "active"
NumberAnimation {
property: "width"
duration: Style.animationNormal
easing.type: Easing.OutBack
}
},
Transition {
from: "active"
to: "inactive"
NumberAnimation {
property: "width"
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
]
Rectangle {
id: pill
anchors.fill: parent
Loader {
active: (labelMode !== "none") && (!root.showLabelsOnlyWhenOccupied || model.isOccupied || model.isFocused)
sourceComponent: Component {
NText {
x: Style.pixelAlignCenter(pill.width, width)
y: Style.pixelAlignCenter(pill.height, height)
text: {
if (model.name && model.name.length > 0) {
if (root.labelMode === "name") {
return model.name.substring(0, characterCount);
}
if (root.labelMode === "index+name") {
return (model.idx.toString() + " " + model.name.substring(0, characterCount));
}
}
return model.idx.toString();
}
family: Settings.data.ui.fontFixed
pointSize: workspacePillContainer.height * root.textRatio
applyUiScale: false
font.capitalization: Font.AllUppercase
font.weight: Style.fontWeightBold
wrapMode: Text.Wrap
color: {
if (model.isFocused)
return Color.mOnPrimary;
if (model.isUrgent)
return Color.mOnError;
if (model.isOccupied)
return Color.mOnSecondary;
return Color.mOnSecondary;
}
}
}
}
radius: Style.radiusM
color: {
if (model.isFocused)
return Color.mPrimary;
if (model.isUrgent)
return Color.mError;
if (model.isOccupied)
return Color.mSecondary;
return Qt.alpha(Color.mSecondary, 0.3);
}
z: 0
MouseArea {
id: pillMouseArea
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
CompositorService.switchToWorkspace(model);
}
hoverEnabled: true
}
// Material 3-inspired smooth animation for scale, color, opacity, and radius
Behavior on scale {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
Behavior on color {
enabled: !Color.isTransitioning
ColorAnimation {
duration: Style.animationFast
easing.type: Easing.InOutCubic
}
}
Behavior on opacity {
NumberAnimation {
duration: Style.animationFast
easing.type: Easing.InOutCubic
}
}
Behavior on radius {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
}
Behavior on width {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
Behavior on height {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
// Burst effect overlay for focused pill (smaller outline)
Rectangle {
id: pillBurst
anchors.centerIn: workspacePillContainer
width: workspacePillContainer.width + 18 * root.masterProgress * scale
height: workspacePillContainer.height + 18 * root.masterProgress * scale
radius: width / 2
color: "transparent"
border.color: root.effectColor
border.width: Math.max(1, Math.round((2 + 6 * (1.0 - root.masterProgress))))
opacity: root.effectsActive && model.isFocused ? (1.0 - root.masterProgress) * 0.7 : 0
visible: root.effectsActive && model.isFocused
z: 1
}
delegate: WorkspacePill {
required property var model
workspace: model
isVertical: false
baseDimensionRatio: root.baseDimensionRatio
capsuleHeight: root.capsuleHeight
barHeight: root.barHeight
labelMode: root.labelMode
characterCount: root.characterCount
textRatio: root.textRatio
showLabelsOnlyWhenOccupied: root.showLabelsOnlyWhenOccupied
focusedColor: root.focusedColor
occupiedColor: root.occupiedColor
emptyColor: root.emptyColor
masterProgress: root.masterProgress
effectsActive: root.effectsActive
effectColor: root.effectColor
getWorkspaceWidth: root.getWorkspaceWidth
getWorkspaceHeight: root.getWorkspaceHeight
}
}
}
@@ -700,174 +587,32 @@ Item {
Column {
id: pillColumn
spacing: spacingBetweenPills
x: workspaceBackground.x + Style.pixelAlignCenter(workspaceBackground.width, width)
x: 0
y: horizontalPadding
visible: isVertical && !showApplications
Repeater {
id: workspaceRepeaterVertical
model: localWorkspaces
Item {
id: workspacePillContainerVertical
width: Style.toOdd(capsuleHeight * root.baseDimensionRatio)
states: [
State {
name: "active"
when: model.isActive
PropertyChanges {
target: workspacePillContainerVertical
height: root.getWorkspaceHeight(model, true)
}
},
State {
name: "inactive"
when: !model.isActive
PropertyChanges {
target: workspacePillContainerVertical
height: root.getWorkspaceHeight(model, false)
}
}
]
transitions: [
Transition {
from: "inactive"
to: "active"
NumberAnimation {
property: "height"
duration: Style.animationNormal
easing.type: Easing.OutBack
}
},
Transition {
from: "active"
to: "inactive"
NumberAnimation {
property: "height"
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
]
Rectangle {
id: pillVertical
anchors.fill: parent
Loader {
active: (labelMode !== "none") && (!root.showLabelsOnlyWhenOccupied || model.isOccupied || model.isFocused)
sourceComponent: Component {
NText {
x: Style.pixelAlignCenter(pillVertical.width, width)
y: Style.pixelAlignCenter(pillVertical.height, height)
text: {
if (model.name && model.name.length > 0) {
if (root.labelMode === "name") {
return model.name.substring(0, characterCount);
}
if (root.labelMode === "index+name") {
return (model.idx.toString() + model.name.substring(0, 1));
}
}
return model.idx.toString();
}
family: Settings.data.ui.fontFixed
pointSize: workspacePillContainerVertical.width * root.textRatio
applyUiScale: false
font.capitalization: Font.AllUppercase
font.weight: Style.fontWeightBold
wrapMode: Text.Wrap
color: {
if (model.isFocused)
return Color.mOnPrimary;
if (model.isUrgent)
return Color.mOnError;
if (model.isOccupied)
return Color.mOnSecondary;
return Color.mOnSecondary;
}
}
}
}
radius: Style.radiusM
color: {
if (model.isFocused)
return Color.mPrimary;
if (model.isUrgent)
return Color.mError;
if (model.isOccupied)
return Color.mSecondary;
return Qt.alpha(Color.mSecondary, 0.3);
}
z: 0
MouseArea {
id: pillMouseAreaVertical
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
CompositorService.switchToWorkspace(model);
}
hoverEnabled: true
}
// Material 3-inspired smooth animation for scale, color, opacity, and radius
Behavior on scale {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
Behavior on color {
enabled: !Color.isTransitioning
ColorAnimation {
duration: Style.animationFast
easing.type: Easing.InOutCubic
}
}
Behavior on opacity {
NumberAnimation {
duration: Style.animationFast
easing.type: Easing.InOutCubic
}
}
Behavior on radius {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
}
Behavior on width {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
Behavior on height {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutBack
}
}
// Burst effect overlay for focused pill (smaller outline)
Rectangle {
id: pillBurstVertical
anchors.centerIn: workspacePillContainerVertical
width: workspacePillContainerVertical.width + 18 * root.masterProgress * scale
height: workspacePillContainerVertical.height + 18 * root.masterProgress * scale
radius: width / 2
color: "transparent"
border.color: root.effectColor
border.width: Math.max(1, Math.round((2 + 6 * (1.0 - root.masterProgress))))
opacity: root.effectsActive && model.isFocused ? (1.0 - root.masterProgress) * 0.7 : 0
visible: root.effectsActive && model.isFocused
z: 1
}
delegate: WorkspacePill {
required property var model
workspace: model
isVertical: true
baseDimensionRatio: root.baseDimensionRatio
capsuleHeight: root.capsuleHeight
barHeight: root.barHeight
labelMode: root.labelMode
characterCount: root.characterCount
textRatio: root.textRatio
showLabelsOnlyWhenOccupied: root.showLabelsOnlyWhenOccupied
focusedColor: root.focusedColor
occupiedColor: root.occupiedColor
emptyColor: root.emptyColor
masterProgress: root.masterProgress
effectsActive: root.effectsActive
effectColor: root.effectColor
getWorkspaceWidth: root.getWorkspaceWidth
getWorkspaceHeight: root.getWorkspaceHeight
}
}
}
@@ -875,7 +620,6 @@ Item {
// ========================================
// Grouped mode (showApplications = true)
// ========================================
Component {
id: groupedWorkspaceDelegate
@@ -884,7 +628,28 @@ Item {
required property var model
property var workspaceModel: model
property bool hasWindows: (workspaceModel?.windows?.length > 0 || workspaceModel?.windows?.count > 0)
// Fetch windows directly from service to avoid Qt 6.9 ListModel nested array issues
property var liveWindows: []
property bool hasWindows: liveWindows.length > 0
function updateWindows() {
var wsId = workspaceModel?.id;
if (wsId !== undefined && wsId !== null) {
liveWindows = CompositorService.getWindowsForWorkspace(wsId);
} else {
liveWindows = [];
}
}
Component.onCompleted: updateWindows()
onWorkspaceModelChanged: updateWindows()
Connections {
target: root
function onWindowRevisionChanged() {
groupedContainer.updateWindows();
}
}
width: Style.toOdd((hasWindows ? groupedIconsFlow.implicitWidth : root.iconSize) + (root.isVertical ? (root.baseItemSize - root.iconSize + Style.marginXS) : Style.marginXL))
height: Style.toOdd((hasWindows ? groupedIconsFlow.implicitHeight : root.iconSize) + (root.isVertical ? Style.marginL : (root.baseItemSize - root.iconSize + Style.marginXS)))
@@ -938,7 +703,7 @@ Item {
flow: root.isVertical ? Flow.TopToBottom : Flow.LeftToRight
Repeater {
model: groupedContainer.workspaceModel.windows
model: groupedContainer.liveWindows
delegate: Item {
id: groupedTaskbarItem
@@ -955,17 +720,16 @@ Item {
height: parent.height
source: {
root.iconRevision; // Force re-evaluation when revision changes
const win = (typeof modelData !== "undefined") ? modelData : model;
return ThemeIcons.iconForAppId(win.appId?.toLowerCase());
return ThemeIcons.iconForAppId(modelData.appId?.toLowerCase());
}
smooth: true
asynchronous: true
opacity: (typeof modelData !== "undefined" ? modelData.isFocused : model.isFocused) ? Style.opacityFull : unfocusedIconsOpacity
layer.enabled: root.colorizeIcons && !(typeof modelData !== "undefined" ? modelData.isFocused : model.isFocused)
opacity: modelData.isFocused ? Style.opacityFull : unfocusedIconsOpacity
layer.enabled: root.colorizeIcons && !modelData.isFocused
Rectangle {
id: groupedFocusIndicator
visible: (typeof modelData !== "undefined" ? modelData.isFocused : model.isFocused)
visible: modelData.isFocused
anchors.bottomMargin: -2
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
@@ -990,30 +754,23 @@ Item {
preventStealing: true
onPressed: mouse => {
const win = (typeof modelData !== "undefined") ? modelData : model;
if (!win)
return;
if (mouse.button === Qt.LeftButton) {
CompositorService.focusWindow(win);
CompositorService.focusWindow(modelData);
}
}
onReleased: mouse => {
const win = (typeof modelData !== "undefined") ? modelData : model;
if (!win)
return;
if (mouse.button === Qt.RightButton) {
mouse.accepted = true;
TooltipService.hide();
root.selectedWindowId = win.id || win.address || "";
root.selectedAppId = win.appId;
root.selectedWindowId = modelData.id || modelData.address || "";
root.selectedAppId = modelData.appId;
openGroupedContextMenu(groupedTaskbarItem);
}
}
onEntered: {
const win = (typeof modelData !== "undefined") ? modelData : model;
groupedTaskbarItem.itemHovered = true;
TooltipService.show(groupedTaskbarItem, win.title || win.appId || "Unknown app.", BarService.getTooltipDirection(root.screen?.name));
TooltipService.show(groupedTaskbarItem, modelData.title || modelData.appId || "Unknown app.", BarService.getTooltipDirection(root.screenName));
}
onExited: {
groupedTaskbarItem.itemHovered = false;
@@ -1027,7 +784,7 @@ Item {
Item {
id: groupedWorkspaceNumberContainer
visible: root.labelMode !== "none" && (!root.showLabelsOnlyWhenOccupied || groupedContainer.hasWindows || groupedContainer.workspaceModel.isFocused)
visible: root.labelMode !== "none" && root.showBadge && (!root.showLabelsOnlyWhenOccupied || groupedContainer.hasWindows || groupedContainer.workspaceModel.isFocused)
anchors {
left: parent.left
@@ -1047,17 +804,13 @@ Item {
color: {
if (groupedContainer.workspaceModel.isFocused)
return Color.mPrimary;
return root.getColorPair(root.focusedColor)[0];
if (groupedContainer.workspaceModel.isUrgent)
return Color.mError;
if (groupedContainer.hasWindows)
return Color.mSecondary;
return root.getColorPair(root.occupiedColor)[0];
if (Settings.data.colorSchemes.darkMode) {
return Qt.darker(Color.mSecondary, 1.5);
} else {
return Qt.lighter(Color.mSecondary, 1.5);
}
return root.getColorPair(root.emptyColor)[0];
}
scale: groupedContainer.workspaceModel.isActive ? 1.0 : 0.8
@@ -1120,11 +873,13 @@ Item {
color: {
if (groupedContainer.workspaceModel.isFocused)
return Color.mOnPrimary;
return root.getColorPair(root.focusedColor)[1];
if (groupedContainer.workspaceModel.isUrgent)
return Color.mOnError;
if (groupedContainer.hasWindows)
return root.getColorPair(root.occupiedColor)[1];
return Color.mOnSecondary;
return root.getColorPair(root.emptyColor)[1];
}
Behavior on opacity {
@@ -1162,10 +917,7 @@ Item {
}
function openGroupedContextMenu(item) {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(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 {
+40
View File
@@ -26,6 +26,7 @@ NBox {
height: parent.height / 4
NCircleStat {
id: cpuUsageGauge
anchors.centerIn: parent
ratio: SystemStatService.cpuUsage / 100
icon: "cpu-usage"
@@ -33,6 +34,15 @@ NBox {
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)}%`);
}
}
}
}
Item {
@@ -40,6 +50,7 @@ NBox {
height: parent.height / 4
NCircleStat {
id: cpuTempGauge
anchors.centerIn: parent
ratio: SystemStatService.cpuTemp / 100
suffix: "°C"
@@ -48,6 +59,15 @@ NBox {
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`);
}
}
}
}
Item {
@@ -55,6 +75,7 @@ NBox {
height: parent.height / 4
NCircleStat {
id: memPercentGauge
anchors.centerIn: parent
ratio: SystemStatService.memPercent / 100
icon: "memory"
@@ -62,6 +83,15 @@ NBox {
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)}%`);
}
}
}
}
Item {
@@ -69,6 +99,7 @@ NBox {
height: parent.height / 4
NCircleStat {
id: diskPercentsGauge
anchors.centerIn: parent
ratio: (SystemStatService.diskPercents[root.diskPath] ?? 0) / 100
icon: "storage"
@@ -76,6 +107,15 @@ NBox {
fillColor: SystemStatService.getDiskColor(root.diskPath)
tooltipText: I18n.tr("system-monitor.disk") + `: ${SystemStatService.diskPercents[root.diskPath] || 0}%\n${root.diskPath}`
}
Connections {
target: SystemStatService
function onDiskPercentsChanged() {
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === diskPercentsGauge) {
TooltipService.updateText(I18n.tr("system-monitor.disk") + `: ${SystemStatService.diskPercents[root.diskPath] || 0}%\n${root.diskPath}`);
}
}
}
}
}
}
+28 -6
View File
@@ -15,13 +15,18 @@ NBox {
property bool showEffects: Settings.data.location.weatherShowEffects
readonly property bool weatherReady: Settings.data.location.weatherEnabled && (LocationService.data.weather !== null)
// Test mode: set to "rain" or "snow"
// Test mode: set to "clear_day", "clear_night", "rain", "snow", "cloud" or "fog"
property string testEffects: ""
// Weather condition detection
readonly property int currentWeatherCode: weatherReady ? LocationService.data.weather.current_weather.weathercode : 0
readonly property bool isDayTime: weatherReady ? LocationService.data.weather.current_weather.is_day : true
readonly property bool isRaining: testEffects === "rain" || (testEffects === "" && ((currentWeatherCode >= 51 && currentWeatherCode <= 67) || (currentWeatherCode >= 80 && currentWeatherCode <= 82)))
readonly property bool isSnowing: testEffects === "snow" || (testEffects === "" && ((currentWeatherCode >= 71 && currentWeatherCode <= 77) || (currentWeatherCode >= 85 && currentWeatherCode <= 86)))
readonly property bool isCloudy: testEffects === "cloud" || (testEffects === "" && (currentWeatherCode === 3))
readonly property bool isFoggy: testEffects === "fog" || (testEffects === "" && (currentWeatherCode >= 40 && currentWeatherCode <= 49))
readonly property bool isClearDay: testEffects === "clear_day" || (testEffects === "" && (currentWeatherCode === 0 && isDayTime))
readonly property bool isClearNight: testEffects === "clear_night" || (testEffects === "" && (currentWeatherCode === 0 && !isDayTime))
visible: Settings.data.location.weatherEnabled
implicitHeight: Math.max(100 * Style.uiScaleRatio, content.implicitHeight + (Style.marginXL * 2))
@@ -30,7 +35,7 @@ NBox {
Loader {
id: weatherEffectLoader
anchors.fill: parent
active: root.showEffects && (root.isRaining || root.isSnowing)
active: root.showEffects && (root.isRaining || root.isSnowing || root.isCloudy || root.isFoggy || root.isClearDay || root.isClearNight)
sourceComponent: Item {
anchors.fill: parent
@@ -47,8 +52,8 @@ NBox {
ShaderEffect {
id: weatherEffect
anchors.fill: parent
// Snow fills the box, rain matches content margins
anchors.margins: root.isSnowing ? root.border.width : Style.marginXL
// Rain matches content margins, everything else fills the box
anchors.margins: root.isRaining ? Style.marginXL : root.border.width
property var source: ShaderEffectSource {
sourceItem: content
@@ -59,9 +64,26 @@ NBox {
property real itemWidth: weatherEffect.width
property real itemHeight: weatherEffect.height
property color bgColor: root.color
property real cornerRadius: root.isSnowing ? (root.radius - root.border.width) : 0
property real cornerRadius: root.isRaining ? 0 : (root.radius - root.border.width)
property real alternative: root.isFoggy
fragmentShader: root.isSnowing ? Qt.resolvedUrl(Quickshell.shellDir + "/Shaders/qsb/weather_snow.frag.qsb") : Qt.resolvedUrl(Quickshell.shellDir + "/Shaders/qsb/weather_rain.frag.qsb")
fragmentShader: {
let shaderName;
if (root.isSnowing)
shaderName = "weather_snow";
else if (root.isRaining)
shaderName = "weather_rain";
else if (root.isCloudy || root.isFoggy)
shaderName = "weather_cloud";
else if (root.isClearDay)
shaderName = "weather_sun";
else if (root.isClearNight)
shaderName = "weather_stars";
else
shaderName = "";
return Qt.resolvedUrl(Quickshell.shellDir + "/Shaders/qsb/" + shaderName + ".frag.qsb");
}
}
}
}
+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) {
@@ -378,6 +290,7 @@ Item {
id: contentContainer
anchors.fill: parent
z: 1
clip: true
}
// Context menu model and handler - menu is created dynamically in PopupMenuWindow
@@ -12,21 +12,11 @@ DraggableDesktopWidget {
readonly property var now: Time.now
readonly property var widgetMetadata: DesktopWidgetRegistry.widgetMetadata["Clock"]
readonly property color clockTextColor: {
if (usePrimaryColor) {
return Color.mPrimary;
}
var txtColor = widgetData && widgetData.textColor ? widgetData.textColor : "";
return (txtColor && txtColor !== "") ? txtColor : Color.mOnSurface;
}
readonly property real fontSize: {
var size = widgetData && widgetData.fontSize ? widgetData.fontSize : 0;
var baseSize = (size && size > 0) ? size : Style.fontSizeXXXL * 2.5;
return Math.round(baseSize * widgetScale);
}
readonly property color clockTextColor: Color.resolveColorKey(clockColor)
readonly property real fontSize: Math.round(Style.fontSizeXXXL * 2.5 * widgetScale)
readonly property real widgetOpacity: (widgetData && widgetData.opacity !== undefined) ? widgetData.opacity : 1.0
readonly property string clockStyle: (widgetData && widgetData.clockStyle !== undefined) ? widgetData.clockStyle : (widgetMetadata.clockStyle !== undefined ? widgetMetadata.clockStyle : "digital")
readonly property bool usePrimaryColor: (widgetData && widgetData.usePrimaryColor !== undefined) ? widgetData.usePrimaryColor : (widgetMetadata.usePrimaryColor !== undefined ? widgetMetadata.usePrimaryColor : false)
readonly property string clockColor: (widgetData && widgetData.clockColor !== undefined) ? widgetData.clockColor : (widgetMetadata.clockColor !== undefined ? widgetMetadata.clockColor : "none")
readonly property bool useCustomFont: (widgetData && widgetData.useCustomFont !== undefined) ? widgetData.useCustomFont : (widgetMetadata.useCustomFont !== undefined ? widgetMetadata.useCustomFont : false)
readonly property string customFont: (widgetData && widgetData.customFont !== undefined) ? widgetData.customFont : ""
readonly property string format: (widgetData && widgetData.format !== undefined) ? widgetData.format : (widgetMetadata.format !== undefined ? widgetMetadata.format : "HH:mm\\nd MMMM yyyy")
@@ -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,301 @@
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 string layout: (widgetData && widgetData.layout !== undefined) ? widgetData.layout : (widgetMetadata.layout !== undefined ? widgetMetadata.layout : "side")
// Fixed colors
readonly property color color: Color.mPrimary
readonly property color color2: Color.mSecondary
// 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: root.color2
}
];
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: root.color2
}
];
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" ? Math.max(SystemStatService.gpuTempHistoryMin - 5, 0) : 0
readonly property real graphMaxValue: {
switch (root.statType) {
case "CPU":
case "Memory":
case "Disk":
return 100; // Percentage-based stats use fixed 0-100 range
case "GPU":
return Math.max(SystemStatService.gpuTempHistoryMax + 5, 1);
case "Network":
return SystemStatService.rxMaxSpeed;
default:
return 100;
}
}
readonly property real graphMinValue2: {
switch (root.statType) {
case "CPU":
return Math.max(SystemStatService.cpuTempHistoryMin - 5, 0);
default:
return graphMinValue;
}
}
readonly property real graphMaxValue2: {
switch (root.statType) {
case "CPU":
return Math.max(SystemStatService.cpuTempHistoryMax + 5, 1);
case "Network":
return SystemStatService.txMaxSpeed;
default:
return graphMaxValue;
}
}
implicitWidth: Math.round(240 * widgetScale)
implicitHeight: Math.round(120 * widgetScale)
width: implicitWidth
height: implicitHeight
// Update interval per stat type
readonly property int graphUpdateInterval: {
switch (root.statType) {
case "CPU":
return Settings.data.systemMonitor.cpuPollingInterval;
case "GPU":
return Settings.data.systemMonitor.gpuPollingInterval;
case "Memory":
return Settings.data.systemMonitor.memPollingInterval;
case "Disk":
return Settings.data.systemMonitor.diskPollingInterval;
case "Network":
return Settings.data.systemMonitor.networkPollingInterval;
default:
return 1000;
}
}
// 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: root.color2
fill: true
updateInterval: root.graphUpdateInterval
animateScale: root.statType === "Network"
}
}
// Side layout: icon + legend on left, graph on right
RowLayout {
anchors.fill: parent
anchors.margins: Math.round(Style.marginM * 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 {
active: root.layout === "side"
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.marginM * widgetScale)
spacing: Math.round(Style.marginS * widgetScale)
visible: root.layout === "bottom"
Loader {
active: root.layout === "bottom"
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
}
}
}
}
}
}
+224 -109
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
@@ -58,11 +59,12 @@ Loader {
}
}
// Refresh icons when DesktopEntries becomes available
// Refresh icons and names when DesktopEntries becomes available (or updates)
Connections {
target: DesktopEntries.applications
function onValuesChanged() {
root.iconRevision++;
updateDockApps();
}
}
@@ -77,6 +79,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
@@ -110,6 +114,15 @@ Loader {
property int dragSourceIndex: -1
property int dragTargetIndex: -1
// when dragging ended but the cursor is outside the dock area, restart the timer
onDragSourceIndexChanged: {
if (dragSourceIndex === -1) {
if (autoHide && !dockHovered && !anyAppHovered && !peekHovered && !menuHovered) {
hideTimer.restart();
}
}
}
// Revision counter to force icon re-evaluation
property int iconRevision: 0
@@ -123,10 +136,17 @@ Loader {
function getAppKey(appData) {
if (!appData)
return null;
// prefer toplevel object identity for running apps to distinguish instances
// Use stable appId for pinned apps to maintain their slot regardless of running state
if (appData.type === "pinned" || appData.type === "pinned-running") {
return appData.appId;
}
// prefer toplevel object identity for unpinned running apps to distinguish instances
if (appData.toplevel)
return appData.toplevel;
// fallback to appId for pinned-only apps
// fallback to appId
return appData.appId;
}
@@ -138,17 +158,23 @@ Loader {
const sorted = [];
const remaining = [...apps];
// 1. Pick apps that are in the session order
// Pick apps that are in the session order
for (let i = 0; i < sessionAppOrder.length; i++) {
const key = sessionAppOrder[i];
const idx = remaining.findIndex(app => getAppKey(app) === key);
if (idx !== -1) {
sorted.push(remaining[idx]);
remaining.splice(idx, 1);
// Pick ALL matching apps (e.g. all instances of a pinned app)
while (true) {
const idx = remaining.findIndex(app => getAppKey(app) === key);
if (idx !== -1) {
sorted.push(remaining[idx]);
remaining.splice(idx, 1);
} else {
break;
}
}
}
// 2. Append any new/remaining apps
// Append any new/remaining apps
remaining.forEach(app => sorted.push(app));
return sorted;
@@ -201,7 +227,10 @@ Loader {
function normalizeAppId(appId) {
if (!appId || typeof appId !== 'string')
return "";
return appId.toLowerCase().trim();
let id = appId.toLowerCase().trim();
if (id.endsWith(".desktop"))
id = id.substring(0, id.length - 8);
return id;
}
// Helper function to check if an app ID matches a pinned app (case-insensitive)
@@ -249,6 +278,9 @@ Loader {
//push an app onto combined with the given appType
function pushApp(appType, toplevel, appId, title) {
// Use canonical ID for pinned apps to ensure key stability
const canonicalId = isAppIdPinned(appId, pinnedApps) ? (pinnedApps.find(p => normalizeAppId(p) === normalizeAppId(appId)) || appId) : appId;
// For running apps, track by toplevel object to allow multiple instances
if (toplevel) {
if (processedToplevels.has(toplevel)) {
@@ -260,30 +292,30 @@ Loader {
combined.push({
"type": appType,
"toplevel": toplevel,
"appId": appId,
"appId": canonicalId,
"title": title
});
processedToplevels.add(toplevel);
} else {
// For pinned apps that aren't running, track by appId to avoid duplicates
if (processedPinnedAppIds.has(appId)) {
if (processedPinnedAppIds.has(canonicalId)) {
return; // Already processed this pinned app
}
combined.push({
"type": appType,
"toplevel": toplevel,
"appId": appId,
"appId": canonicalId,
"title": title
});
processedPinnedAppIds.add(appId);
processedPinnedAppIds.add(canonicalId);
}
}
function pushRunning(first) {
runningApps.forEach(toplevel => {
if (toplevel) {
// Skip pinned apps if they were already processed (when pinnedStatic is true)
const isPinned = pinnedApps.includes(toplevel.appId);
// Use robust matching to check if pinned
const isPinned = isAppIdPinned(toplevel.appId, pinnedApps);
if (!first && isPinned && processedToplevels.has(toplevel)) {
return; // Already added by pushPinned()
}
@@ -294,8 +326,8 @@ Loader {
function pushPinned() {
pinnedApps.forEach(pinnedAppId => {
// Find all running instances of this pinned app
const matchingToplevels = runningApps.filter(app => app && app.appId === pinnedAppId);
// Find all running instances of this pinned app using robust matching
const matchingToplevels = runningApps.filter(app => app && normalizeAppId(app.appId) === normalizeAppId(pinnedAppId));
if (matchingToplevels.length > 0) {
// Add all running instances as pinned-running
@@ -304,7 +336,7 @@ Loader {
});
} else {
// App is pinned but not running - add once
pushApp("pinned", null, pinnedAppId, pinnedAppId);
pushApp("pinned", null, pinnedAppId, getAppNameFromDesktopEntry(pinnedAppId) || pinnedAppId);
}
});
}
@@ -321,9 +353,36 @@ Loader {
}
dockApps = sortDockApps(combined);
// Sync session order if needed (e.g. first run or new apps added)
if (!sessionAppOrder || sessionAppOrder.length === 0 || sessionAppOrder.length !== dockApps.length) {
// Sync session order if needed
// Instead of resetting everything when length changes, we reconcile the keys
if (!sessionAppOrder || sessionAppOrder.length === 0) {
sessionAppOrder = dockApps.map(getAppKey);
} else {
const currentKeys = new Set(dockApps.map(getAppKey));
const existingKeys = new Set();
const newOrder = [];
// Keep existing keys that are still present
sessionAppOrder.forEach(key => {
if (currentKeys.has(key)) {
newOrder.push(key);
existingKeys.add(key);
}
});
// Add new keys at the end
dockApps.forEach(app => {
const key = getAppKey(app);
if (!existingKeys.has(key)) {
newOrder.push(key);
existingKeys.add(key);
}
});
if (JSON.stringify(newOrder) !== JSON.stringify(sessionAppOrder)) {
sessionAppOrder = newOrder;
}
}
}
@@ -343,6 +402,11 @@ Loader {
id: hideTimer
interval: hideDelay
onTriggered: {
// do not hide if dragging
if (root.dragSourceIndex !== -1) {
return;
}
// Force menuHovered to false if no menu is current or visible
if (!root.currentContextMenu || !root.currentContextMenu.visible) {
menuHovered = false;
@@ -535,8 +599,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
@@ -566,12 +630,13 @@ Loader {
showTimer.stop();
hideTimer.stop();
unloadTimer.stop(); // Cancel unload if hovering
hidden = false; // Make sure dock is visible
}
}
onExited: {
dockHovered = false;
if (autoHide && !anyAppHovered && !peekHovered && !menuHovered) {
if (autoHide && !anyAppHovered && !peekHovered && !menuHovered && root.dragSourceIndex === -1) {
hideTimer.restart();
}
}
@@ -582,12 +647,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)
@@ -602,15 +703,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
@@ -825,12 +930,10 @@ Loader {
onVisibleChanged: {
if (visible) {
root.currentContextMenu = contextMenu;
anyAppHovered = false;
} else if (root.currentContextMenu === contextMenu) {
root.currentContextMenu = null;
hideTimer.stop();
menuHovered = false;
anyAppHovered = false;
// Restart hide timer after menu closes
if (autoHide && !dockHovered && !anyAppHovered && !peekHovered && !menuHovered) {
hideTimer.restart();
@@ -850,7 +953,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);
@@ -878,6 +980,7 @@ Loader {
showTimer.stop();
hideTimer.stop();
unloadTimer.stop(); // Cancel unload if hovering app
hidden = false; // Make sure dock is visible
}
}
@@ -888,97 +991,109 @@ Loader {
if (!root.currentContextMenu || !root.currentContextMenu.visible) {
menuHovered = false;
}
if (autoHide && !dockHovered && !peekHovered && !menuHovered) {
if (autoHide && !dockHovered && !peekHovered && !menuHovered && root.dragSourceIndex === -1) {
hideTimer.restart();
}
}
onClicked: function (mouse) {
if (mouse.button === Qt.RightButton) {
// If right-clicking on the same app with an open context menu, close it
if (root.currentContextMenu === contextMenu && contextMenu.visible) {
root.closeAllContextMenus();
return;
}
// Close any other existing context menu first
root.closeAllContextMenus();
// Hide tooltip when showing context menu
TooltipService.hideImmediately();
contextMenu.show(appButton, modelData.toplevel || modelData);
return;
}
onClicked: mouse => {
if (mouse.button === Qt.RightButton) {
// If right-clicking on the same app with an open context menu, close it
if (root.currentContextMenu === contextMenu && contextMenu.visible) {
root.closeAllContextMenus();
return;
}
// Close any other existing context menu first
root.closeAllContextMenus();
// Hide tooltip when showing context menu
TooltipService.hideImmediately();
contextMenu.show(appButton, modelData.toplevel || modelData);
return;
}
// Close any existing context menu for non-right-click actions
root.closeAllContextMenus();
// Close any existing context menu for non-right-click actions
root.closeAllContextMenus();
// Check if toplevel is still valid (not a stale reference)
const isValidToplevel = modelData?.toplevel && ToplevelManager && ToplevelManager.toplevels.values.includes(modelData.toplevel);
// Check if toplevel is still valid (not a stale reference)
const isValidToplevel = modelData?.toplevel && ToplevelManager && ToplevelManager.toplevels.values.includes(modelData.toplevel);
if (mouse.button === Qt.MiddleButton && isValidToplevel && modelData.toplevel.close) {
modelData.toplevel.close();
Qt.callLater(root.updateDockApps); // Force immediate dock update
} else if (mouse.button === Qt.LeftButton) {
if (isValidToplevel && modelData.toplevel.activate) {
// Running app - activate it
modelData.toplevel.activate();
} else if (modelData?.appId) {
// Pinned app not running - launch it
// Use ThemeIcons to robustly find the desktop entry
const app = ThemeIcons.findAppEntry(modelData.appId);
if (mouse.button === Qt.MiddleButton && isValidToplevel && modelData.toplevel.close) {
modelData.toplevel.close();
Qt.callLater(root.updateDockApps); // Force immediate dock update
} else if (mouse.button === Qt.LeftButton) {
if (isValidToplevel && modelData.toplevel.activate) {
// Running app - activate it
modelData.toplevel.activate();
} else if (modelData?.appId) {
// Pinned app not running - launch it
// Use ThemeIcons to robustly find the desktop entry
const app = ThemeIcons.findAppEntry(modelData.appId);
if (!app) {
Logger.w("Dock", `Could not find desktop entry for pinned app: ${modelData.appId}`);
return;
}
if (!app) {
Logger.w("Dock", `Could not find desktop entry for pinned app: ${modelData.appId}`);
return;
}
if (Settings.data.appLauncher.customLaunchPrefixEnabled && Settings.data.appLauncher.customLaunchPrefix) {
// Use custom launch prefix
const prefix = Settings.data.appLauncher.customLaunchPrefix.split(" ");
if (Settings.data.appLauncher.customLaunchPrefixEnabled && Settings.data.appLauncher.customLaunchPrefix) {
// Use custom launch prefix
const prefix = Settings.data.appLauncher.customLaunchPrefix.split(" ");
if (app.runInTerminal) {
const terminal = Settings.data.appLauncher.terminalCommand.split(" ");
const command = prefix.concat(terminal.concat(app.command));
Quickshell.execDetached(command);
} else {
const command = prefix.concat(app.command);
Quickshell.execDetached(command);
}
} else if (Settings.data.appLauncher.useApp2Unit && ProgramCheckerService.app2unitAvailable && app.id) {
Logger.d("Dock", `Using app2unit for: ${app.id}`);
if (app.runInTerminal)
Quickshell.execDetached(["app2unit", "--", app.id + ".desktop"]);
else
Quickshell.execDetached(["app2unit", "--"].concat(app.command));
} 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);
} else if (app.command && app.command.length > 0) {
Quickshell.execDetached(app.command);
} else if (app.execute) {
app.execute();
} else {
Logger.w("Dock", `Could not launch: ${app.name}. No valid launch method.`);
}
}
}
}
}
if (app.runInTerminal) {
const terminal = Settings.data.appLauncher.terminalCommand.split(" ");
const command = prefix.concat(terminal.concat(app.command));
Quickshell.execDetached(command);
} else {
const command = prefix.concat(app.command);
Quickshell.execDetached(command);
}
} else if (Settings.data.appLauncher.useApp2Unit && ProgramCheckerService.app2unitAvailable && app.id) {
Logger.d("Dock", `Using app2unit for: ${app.id}`);
if (app.runInTerminal)
Quickshell.execDetached(["app2unit", "--", app.id + ".desktop"]);
else
Quickshell.execDetached(["app2unit", "--"].concat(app.command));
} else {
// Fallback logic when app2unit is not used
if (app.runInTerminal) {
Logger.d("Dock", "Executing terminal app manually: " + app.name);
const terminal = Settings.data.appLauncher.terminalCommand.split(" ");
const command = terminal.concat(app.command);
CompositorService.spawn(command);
} else if (app.command && app.command.length > 0) {
CompositorService.spawn(app.command);
} else if (app.execute) {
app.execute();
} else {
Logger.w("Dock", `Could not launch: ${app.name}. No valid launch method.`);
}
}
}
}
}
}
// 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
}
}
}
+4 -9
View File
@@ -27,7 +27,7 @@ PopupWindow {
property real menuContentWidth: 160
implicitWidth: menuContentWidth + (Style.marginXL)
implicitHeight: contextMenuColumn.implicitHeight + (Style.marginXL)
implicitHeight: (root.items.length * 32) + (Style.marginXL)
color: "transparent"
visible: false
@@ -256,14 +256,9 @@ PopupWindow {
toplevel = toplevelData;
initItems();
// Force a complete re-evaluation by waiting for the next frame
Qt.callLater(() => {
Qt.callLater(() => {
visible = true;
canAutoClose = false;
gracePeriodTimer.restart();
});
});
visible = true;
canAutoClose = false;
gracePeriodTimer.restart();
}
function hide() {
+48 -18
View File
@@ -17,18 +17,49 @@ Scope {
property bool showInfo: false
property string errorMessage: ""
property string infoMessage: ""
property bool fprintdAvailable: false
readonly property string pamConfigDirectory: Quickshell.env("NOCTALIA_PAM_CONFIG") ? "/etc/pam.d" : Settings.configDir + "pam"
readonly property string pamConfig: Quickshell.env("NOCTALIA_PAM_CONFIG") || "password.conf"
readonly property string pamConfigDirectory: "/etc/pam.d"
property string pamConfig: Quickshell.env("NOCTALIA_PAM_SERVICE") || "login"
property bool pamReady: false
Component.onCompleted: {
checkFprintdProc.running = true;
if (Quickshell.env("NOCTALIA_PAM_CONFIG")) {
Logger.i("LockContext", "NOCTALIA_PAM_CONFIG is set, using system PAM config: /etc/pam.d/" + pamConfig);
if (Quickshell.env("NOCTALIA_PAM_SERVICE")) {
Logger.i("LockContext", "NOCTALIA_PAM_SERVICE is set, using system PAM config: /etc/pam.d/" + pamConfig);
pamReady = true;
} else {
Logger.i("LockContext", "Using generated PAM config:", pamConfigDirectory + "/" + pamConfig);
Logger.i("LockContext", "Probing for best PAM service...");
detectPamServiceProc.running = true;
}
}
Process {
id: detectPamServiceProc
command: ["sh", "-c", "
if [ -f /etc/pam.d/login ]; then echo 'login'; exit 0; fi;
if [ -f /etc/pam.d/system-auth ]; then echo 'system-auth'; exit 0; fi;
if [ -f /etc/pam.d/common-auth ]; then echo 'common-auth'; exit 0; fi;
echo 'login';
"]
stdout: StdioCollector {
onStreamFinished: {
const service = String(text || "").trim();
if (service.length > 0) {
root.pamConfig = service;
Logger.i("LockContext", "Detected PAM service: " + service);
} else {
Logger.w("LockContext", "Failed to detect PAM service, defaulting to login");
}
root.pamReady = true;
}
}
stderr: StdioCollector {}
}
onPamReadyChanged: {
if (pamReady) {
if (Settings.data.general.autoStartAuth && currentText === "") {
pam.start();
}
}
}
@@ -51,16 +82,23 @@ Scope {
if (!waitingForPassword) {
pam.abort();
}
if (fprintdAvailable) {
if (Settings.data.general.allowPasswordWithFprintd) {
occupyFingerprintSensorProc.running = true;
}
} else {
occupyFingerprintSensorProc.running = false;
pam.start();
if (pamReady && Settings.data.general.autoStartAuth) {
pam.start();
}
}
}
function tryUnlock() {
if (!pamReady) {
Logger.w("LockContext", "PAM not ready yet, ignoring unlock attempt");
return;
}
if (waitingForPassword) {
pam.respond(currentText);
unlockInProgress = true;
@@ -73,14 +111,6 @@ Scope {
pam.start();
}
Process {
id: checkFprintdProc
command: ["sh", "-c", "command -v fprintd-verify"]
onExited: function (exitCode) {
fprintdAvailable = (exitCode === 0);
}
}
Process {
id: occupyFingerprintSensorProc
command: ["fprintd-verify"]
+215 -200
View File
@@ -3,7 +3,6 @@ import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import Quickshell.Services.Pam
import Quickshell.Services.UPower
import Quickshell.Wayland
import qs.Commons
import qs.Services.Compositor
@@ -75,225 +74,241 @@ Loader {
WlSessionLockSurface {
id: lockSurface
Item {
id: batteryIndicator
property bool initializationComplete: false
Timer {
interval: 500
running: true
onTriggered: batteryIndicator.initializationComplete = true
}
property bool isReady: initializationComplete && 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()
}
Item {
id: keyboardLayout
property string currentLayout: KeyboardLayoutService.currentLayout
}
// Background with wallpaper, gradient, and screen corners
LockScreenBackground {
id: backgroundComponent
screen: lockSurface.screen
}
Item {
Loader {
anchors.fill: parent
active: true
sourceComponent: (Settings.data.general.lockScreenMonitors.length === 0 || Settings.data.general.lockScreenMonitors.includes(lockSurface.screen.name)) ? fullLockScreenComponent : blackScreenComponent
}
// Mouse area to trigger focus on cursor movement (workaround for Hyprland focus issues)
MouseArea {
anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.NoButton
onPositionChanged: {
if (passwordInput) {
passwordInput.forceActiveFocus();
}
}
}
Component {
id: fullLockScreenComponent
// Header with avatar, welcome, time, date
LockScreenHeader {
id: headerComponent
}
Item {
Item {
id: batteryIndicator
// Info notification
Rectangle {
width: infoRowLayout.implicitWidth + Style.marginXL * 1.5
height: 50
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: (Settings.data.general.compactLockScreen ? 280 : 360) * Style.uiScaleRatio
radius: Style.radiusL
color: Color.mTertiary
visible: lockContext.showInfo && lockContext.infoMessage && !panelComponent.timerActive
opacity: visible ? 1.0 : 0.0
RowLayout {
id: infoRowLayout
anchors.centerIn: parent
spacing: Style.marginM
NIcon {
icon: "circle-key"
pointSize: Style.fontSizeXL
color: Color.mOnTertiary
}
NText {
text: lockContext.infoMessage
color: Color.mOnTertiary
pointSize: Style.fontSizeL
horizontalAlignment: Text.AlignHCenter
}
property bool isReady: BatteryService.batteryReady
property real percent: BatteryService.batteryPercentage
property bool charging: BatteryService.batteryCharging
property bool pluggedIn: BatteryService.batteryPluggedIn
property bool batteryVisible: isReady
property string icon: BatteryService.batteryIcon
}
Behavior on opacity {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutCubic
}
}
}
// Error notification
Rectangle {
width: errorRowLayout.implicitWidth + Style.marginXL * 1.5
height: 50
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: (Settings.data.general.compactLockScreen ? 280 : 360) * Style.uiScaleRatio
radius: Style.radiusL
color: Color.mError
visible: lockContext.showFailure && lockContext.errorMessage && !panelComponent.timerActive
opacity: visible ? 1.0 : 0.0
RowLayout {
id: errorRowLayout
anchors.centerIn: parent
spacing: Style.marginM
NIcon {
icon: "alert-circle"
pointSize: Style.fontSizeXL
color: Color.mOnError
}
NText {
text: lockContext.errorMessage || "Authentication failed"
color: Color.mOnError
pointSize: Style.fontSizeL
horizontalAlignment: Text.AlignHCenter
}
Item {
id: keyboardLayout
property string currentLayout: KeyboardLayoutService.currentLayout
}
Behavior on opacity {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutCubic
}
// Background with wallpaper, gradient, and screen corners
LockScreenBackground {
id: backgroundComponent
screen: lockSurface.screen
}
}
// Countdown notification
Rectangle {
width: countdownRowLayout.implicitWidth + Style.marginXL * 1.5
height: 50
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: (Settings.data.general.compactLockScreen ? 280 : 360) * Style.uiScaleRatio
radius: Style.radiusL
color: Color.mSurface
visible: panelComponent.timerActive
opacity: visible ? 1.0 : 0.0
RowLayout {
id: countdownRowLayout
Item {
anchors.fill: parent
anchors.margins: Style.marginM
spacing: Style.marginM
NIcon {
icon: "clock"
pointSize: Style.fontSizeXL
// Mouse area to trigger focus on cursor movement (workaround for Hyprland focus issues)
MouseArea {
anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.NoButton
onPositionChanged: {
if (passwordInput) {
passwordInput.forceActiveFocus();
}
}
}
// Header with avatar, welcome, time, date
LockScreenHeader {
id: headerComponent
}
// Info notification
Rectangle {
width: infoRowLayout.implicitWidth + Style.marginXL * 1.5
height: 50
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: (Settings.data.general.compactLockScreen ? 280 : 360) * Style.uiScaleRatio
radius: Style.radiusL
color: Color.mTertiary
visible: lockContext.showInfo && lockContext.infoMessage && !panelComponent.timerActive
opacity: visible ? 1.0 : 0.0
RowLayout {
id: infoRowLayout
anchors.centerIn: parent
spacing: Style.marginM
NIcon {
icon: "circle-key"
pointSize: Style.fontSizeXL
color: Color.mOnTertiary
}
NText {
text: lockContext.infoMessage
color: Color.mOnTertiary
pointSize: Style.fontSizeL
horizontalAlignment: Text.AlignHCenter
}
}
Behavior on opacity {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutCubic
}
}
}
// Error notification
Rectangle {
width: errorRowLayout.implicitWidth + Style.marginXL * 1.5
height: 50
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: (Settings.data.general.compactLockScreen ? 280 : 360) * Style.uiScaleRatio
radius: Style.radiusL
color: Color.mError
visible: lockContext.showFailure && lockContext.errorMessage && !panelComponent.timerActive
opacity: visible ? 1.0 : 0.0
RowLayout {
id: errorRowLayout
anchors.centerIn: parent
spacing: Style.marginM
NIcon {
icon: "alert-circle"
pointSize: Style.fontSizeXL
color: Color.mOnError
}
NText {
text: lockContext.errorMessage || "Authentication failed"
color: Color.mOnError
pointSize: Style.fontSizeL
horizontalAlignment: Text.AlignHCenter
}
}
Behavior on opacity {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutCubic
}
}
}
// Countdown notification
Rectangle {
width: countdownRowLayout.implicitWidth + Style.marginXL * 1.5
height: 50
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: (Settings.data.general.compactLockScreen ? 280 : 360) * Style.uiScaleRatio
radius: Style.radiusL
color: Color.mSurface
visible: panelComponent.timerActive
opacity: visible ? 1.0 : 0.0
RowLayout {
id: countdownRowLayout
anchors.fill: parent
anchors.margins: Style.marginM
spacing: Style.marginM
NIcon {
icon: "clock"
pointSize: Style.fontSizeXL
color: Color.mPrimary
}
NText {
text: I18n.tr("session-menu.action-in-seconds", {
"action": I18n.tr("common." + panelComponent.pendingAction),
"seconds": Math.ceil(panelComponent.timeRemaining / 1000)
})
color: Color.mOnSurface
pointSize: Style.fontSizeL
horizontalAlignment: Text.AlignHCenter
font.weight: Style.fontWeightBold
}
Item {
Layout.fillWidth: true
}
NIconButton {
icon: "x"
tooltipText: I18n.tr("session-menu.cancel-timer")
baseSize: 32
colorBg: Qt.alpha(Color.mPrimary, 0.1)
colorFg: Color.mPrimary
colorBgHover: Color.mPrimary
onClicked: panelComponent.cancelTimer()
}
}
Behavior on opacity {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutCubic
}
}
}
// Hidden input that receives actual text
TextInput {
id: passwordInput
width: 0
height: 0
visible: false
enabled: !lockContext.unlockInProgress
font.pointSize: Style.fontSizeM
color: Color.mPrimary
echoMode: TextInput.Password
passwordCharacter: "•"
passwordMaskDelay: 0
text: lockContext.currentText
onTextChanged: lockContext.currentText = text
Keys.onPressed: function (event) {
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
lockContext.tryUnlock();
event.accepted = true;
}
if (event.key === Qt.Key_Escape && panelComponent.timerActive) {
panelComponent.cancelTimer();
event.accepted = true;
}
}
Component.onCompleted: forceActiveFocus()
}
NText {
text: I18n.tr("session-menu.action-in-seconds", {
"action": I18n.tr("common." + panelComponent.pendingAction),
"seconds": Math.ceil(panelComponent.timeRemaining / 1000)
})
color: Color.mOnSurface
pointSize: Style.fontSizeL
horizontalAlignment: Text.AlignHCenter
font.weight: Style.fontWeightBold
}
Item {
Layout.fillWidth: true
}
NIconButton {
icon: "x"
tooltipText: I18n.tr("session-menu.cancel-timer")
baseSize: 32
colorBg: Qt.alpha(Color.mPrimary, 0.1)
colorFg: Color.mPrimary
colorBgHover: Color.mPrimary
onClicked: panelComponent.cancelTimer()
}
}
Behavior on opacity {
NumberAnimation {
duration: Style.animationNormal
easing.type: Easing.OutCubic
// Main panel with password, weather, media, session controls
LockScreenPanel {
id: panelComponent
lockControl: lockContext
batteryIndicator: batteryIndicator
keyboardLayout: keyboardLayout
passwordInput: passwordInput
}
}
}
}
// Hidden input that receives actual text
TextInput {
id: passwordInput
width: 0
height: 0
visible: false
enabled: !lockContext.unlockInProgress
font.pointSize: Style.fontSizeM
color: Color.mPrimary
echoMode: TextInput.Password
passwordCharacter: "•"
passwordMaskDelay: 0
text: lockContext.currentText
onTextChanged: lockContext.currentText = text
Component {
id: blackScreenComponent
Keys.onPressed: function (event) {
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
lockContext.tryUnlock();
event.accepted = true;
}
if (event.key === Qt.Key_Escape && panelComponent.timerActive) {
panelComponent.cancelTimer();
event.accepted = true;
}
}
Component.onCompleted: forceActiveFocus()
}
// Main panel with password, weather, media, session controls
LockScreenPanel {
id: panelComponent
lockControl: lockContext
batteryIndicator: batteryIndicator
keyboardLayout: keyboardLayout
passwordInput: passwordInput
Rectangle {
anchors.fill: parent
color: "black"
}
}
}
@@ -1,7 +1,9 @@
import QtQuick
import QtQuick.Effects
import Quickshell
import qs.Commons
import qs.Services.Compositor
import qs.Services.Power
import qs.Services.UI
Item {
@@ -10,6 +12,7 @@ Item {
// Cached wallpaper path - exposed for parent components
property string resolvedWallpaperPath: ""
property color tintColor: Settings.data.colorSchemes.darkMode ? Color.mSurface : Color.mOnSurface
required property var screen
@@ -116,6 +119,21 @@ Item {
smooth: true
mipmap: false
antialiasing: true
layer.enabled: true
layer.smooth: false
layer.effect: MultiEffect {
blurEnabled: !PowerProfileService.noctaliaPerformanceMode && (Settings.data.general.lockScreenBlur > 0)
blur: Settings.data.general.lockScreenBlur
blurMax: 48
}
// Tint overlay
Rectangle {
anchors.fill: parent
color: root.tintColor
opacity: Settings.data.general.lockScreenTint
}
}
Rectangle {
+81 -11
View File
@@ -8,6 +8,28 @@ import qs.Widgets
// Time, Date, and User Profile Container
Rectangle {
id: root
readonly property bool animationsEnabled: Settings.data.general.lockScreenAnimations || false
// Use timer-driven properties instead of Time.now to avoid per-frame repaints.
// Time.now updates every frame (~60+ Hz); these update only when needed.
property date currentTime: new Date()
property date currentDate: new Date()
Timer {
interval: 1000
running: true
repeat: true
onTriggered: root.currentTime = new Date()
}
Timer {
interval: 60000
running: true
repeat: true
onTriggered: root.currentDate = new Date()
}
width: Math.max(500, contentRow.implicitWidth + 32)
height: Math.max(120, contentRow.implicitHeight + 32)
anchors.horizontalCenter: parent.horizontalCenter
@@ -41,6 +63,7 @@ Rectangle {
SequentialAnimation on border.color {
loops: Animation.Infinite
running: root.animationsEnabled
ColorAnimation {
to: Qt.alpha(Color.mPrimary, 1.0)
duration: 2000
@@ -64,6 +87,7 @@ Rectangle {
SequentialAnimation on scale {
loops: Animation.Infinite
running: root.animationsEnabled
NumberAnimation {
to: 1.02
duration: 4000
@@ -102,12 +126,15 @@ 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");
var dateString = I18n.locale.toString(root.currentDate, formats[lang] || "dddd, d MMMM");
return dateString.charAt(0).toUpperCase() + dateString.slice(1);
}
pointSize: Style.fontSizeXL
@@ -122,17 +149,60 @@ Rectangle {
}
// Clock
NClock {
now: Time.now
clockStyle: Settings.data.location.analogClockInCalendar ? "analog" : "digital"
Layout.preferredWidth: 70
Layout.preferredHeight: 70
Item {
Layout.preferredWidth: Settings.data.general.clockStyle === "analog" ? 70 : (Settings.data.general.clockStyle === "custom" ? 90 : 70)
Layout.preferredHeight: Settings.data.general.clockStyle === "analog" ? 70 : (Settings.data.general.clockStyle === "custom" ? 90 : 70)
Layout.alignment: Qt.AlignVCenter
backgroundColor: Color.mSurface
clockColor: Color.mOnSurface
secondHandColor: Color.mPrimary
hoursFontSize: Style.fontSizeL
minutesFontSize: Style.fontSizeL
// Analog Clock
NClock {
anchors.centerIn: parent
width: 70
height: 70
visible: Settings.data.general.clockStyle === "analog"
now: root.currentTime
clockStyle: "analog"
backgroundColor: "transparent"
clockColor: Color.mOnSurface
secondHandColor: Color.mPrimary
}
// Digital Clock (Standard)
NClock {
anchors.centerIn: parent
width: 70
height: 70
visible: Settings.data.general.clockStyle === "digital"
now: root.currentTime
clockStyle: "digital"
showProgress: true
progressColor: Color.mPrimary
backgroundColor: "transparent"
clockColor: Color.mOnSurface
hoursFontSize: Style.fontSizeL
minutesFontSize: Style.fontSizeL
hoursFontWeight: Style.fontWeightBold
minutesFontWeight: Style.fontWeightBold
}
// Custom Clock (Stacked)
ColumnLayout {
anchors.centerIn: parent
visible: Settings.data.general.clockStyle === "custom"
spacing: -3
Repeater {
model: I18n.locale.toString(root.currentTime, (Settings.data.general.clockFormat || "hh\\nmm").replace(/\\n/g, "\n")).split("\n")
NText {
text: modelData
pointSize: Style.fontSizeL
font.weight: Style.fontWeightBold
color: Color.mOnSurface
horizontalAlignment: Text.AlignHCenter
Layout.alignment: Qt.AlignHCenter
}
}
}
}
}
}
+36 -12
View File
@@ -20,8 +20,14 @@ Item {
required property var keyboardLayout
required property TextInput passwordInput
// Whether to enable lock screen animations (smooth cursor blink).
// Defaults to false to reduce GPU usage. Set Settings.data.general.lockScreenAnimations = true to restore.
readonly property bool animationsEnabled: Settings.data.general.lockScreenAnimations || false
Component.onCompleted: {
doUnlock();
if (Settings.data.general.autoStartAuth) {
doUnlock();
}
}
function doUnlock() {
@@ -107,7 +113,7 @@ Item {
// Compact status indicators container (compact mode only)
Rectangle {
width: {
var hasBattery = batteryIndicator.isReady && BatteryService.hasAnyBattery();
var hasBattery = batteryIndicator.isReady;
var hasKeyboard = keyboardLayout.currentLayout !== "Unknown";
if (hasBattery && hasKeyboard) {
@@ -125,7 +131,7 @@ Item {
topLeftRadius: Style.radiusL
topRightRadius: Style.radiusL
color: Color.mSurface
visible: Settings.data.general.compactLockScreen && ((batteryIndicator.isReady && BatteryService.hasAnyBattery()) || keyboardLayout.currentLayout !== "Unknown")
visible: Settings.data.general.compactLockScreen && ((batteryIndicator.isReady) || keyboardLayout.currentLayout !== "Unknown")
RowLayout {
anchors.centerIn: parent
@@ -134,10 +140,10 @@ Item {
// Battery indicator
RowLayout {
spacing: Style.marginS
visible: batteryIndicator.isReady && BatteryService.hasAnyBattery()
visible: batteryIndicator.isReady
NIcon {
icon: BatteryService.getIcon(Math.round(batteryIndicator.percent), batteryIndicator.charging, batteryIndicator.pluggedIn, batteryIndicator.isReady)
icon: batteryIndicator.icon
pointSize: Style.fontSizeM
color: batteryIndicator.charging ? Color.mPrimary : Color.mOnSurfaceVariant
}
@@ -447,22 +453,22 @@ Item {
}
Item {
Layout.fillWidth: batteryIndicator.isReady && BatteryService.hasAnyBattery()
Layout.fillWidth: batteryIndicator.isReady
}
// Battery and Keyboard Layout (full mode only)
ColumnLayout {
Layout.alignment: (batteryIndicator.isReady && BatteryService.hasAnyBattery()) ? (Qt.AlignRight | Qt.AlignVCenter) : Qt.AlignVCenter
Layout.alignment: (batteryIndicator.isReady) ? (Qt.AlignRight | Qt.AlignVCenter) : Qt.AlignVCenter
spacing: Style.marginM
visible: (batteryIndicator.isReady && BatteryService.hasAnyBattery()) || keyboardLayout.currentLayout !== "Unknown"
visible: (batteryIndicator.isReady) || keyboardLayout.currentLayout !== "Unknown"
// Battery
RowLayout {
spacing: Style.marginXS
visible: batteryIndicator.isReady && BatteryService.hasAnyBattery()
visible: batteryIndicator.isReady
NIcon {
icon: BatteryService.getIcon(Math.round(batteryIndicator.percent), batteryIndicator.charging, batteryIndicator.pluggedIn, batteryIndicator.isReady)
icon: batteryIndicator.icon
pointSize: Style.fontSizeM
color: batteryIndicator.charging ? Color.mPrimary : Color.mOnSurfaceVariant
}
@@ -542,9 +548,10 @@ Item {
visible: passwordInput.activeFocus && passwordInput.text.length === 0
anchors.verticalCenter: parent.verticalCenter
// Smooth fade animation (when animations enabled)
SequentialAnimation on opacity {
loops: Animation.Infinite
running: passwordInput.activeFocus && passwordInput.text.length === 0
running: root.animationsEnabled && passwordInput.activeFocus && passwordInput.text.length === 0
NumberAnimation {
to: 0
duration: 530
@@ -554,6 +561,14 @@ Item {
duration: 530
}
}
// Simple toggle (when animations disabled) no per-frame repaints
Timer {
interval: 530
running: !root.animationsEnabled && passwordInput.activeFocus && passwordInput.text.length === 0
repeat: true
onTriggered: parent.opacity = parent.opacity > 0.5 ? 0 : 1
}
}
// Password display - show dots or actual text based on passwordVisible
@@ -599,9 +614,10 @@ Item {
visible: passwordInput.activeFocus && passwordInput.text.length > 0
anchors.verticalCenter: parent.verticalCenter
// Smooth fade animation (when animations enabled)
SequentialAnimation on opacity {
loops: Animation.Infinite
running: passwordInput.activeFocus && passwordInput.text.length > 0
running: root.animationsEnabled && passwordInput.activeFocus && passwordInput.text.length > 0
NumberAnimation {
to: 0
duration: 530
@@ -611,6 +627,14 @@ Item {
duration: 530
}
}
// Simple toggle (when animations disabled) no per-frame repaints
Timer {
interval: 530
running: !root.animationsEnabled && passwordInput.activeFocus && passwordInput.text.length > 0
repeat: true
onTriggered: parent.opacity = parent.opacity > 0.5 ? 0 : 1
}
}
}
}

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