diff --git a/Assets/Translations/de.json b/Assets/Translations/de.json index 63f22ef22..c13ea1c95 100644 --- a/Assets/Translations/de.json +++ b/Assets/Translations/de.json @@ -834,8 +834,8 @@ "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-enable-exclusion-zone-inset-description": "Reduziere die Ausschlusszone um 1 physisches Pixel, damit bündige Fenster perfekt unter den Rand der Bar überlappen.", - "appearance-enable-exclusion-zone-inset-label": "Eingezogener Ausschlussbereich", + "appearance-enable-exclusion-zone-inset-description": "Reduziere die Ausschlusszone um 1 physisches Pixel, damit bündige Fenster perfekt unter den Rand der Leiste überlappen.", + "appearance-enable-exclusion-zone-inset-label": "Innenabstand der Ausschlusszone", "appearance-floating-description": "Leiste als schwebende 'Pille' anzeigen.", "appearance-floating-label": "Schwebende Leiste", "appearance-font-scale-description": "Die Skalierung der Schriftgröße für Text in der Leiste anpassen.", @@ -945,7 +945,7 @@ "predefined-generate-templates-label": "Templates für vordefinierte Schemata generieren", "predefined-title": "Vordefinierte Farbschemata", "sync-gsettings-description": "Das Systemdesign an die aktive helle oder dunkle Variante anpassen.", - "sync-gsettings-label": "Systemdesign Synchronisieren", + "sync-gsettings-label": "Systemdesign synchronisieren", "templates-desc": "Farben auf externe Anwendungen anwenden.", "templates-filter-description": "Vorlagen aus einer bestimmten Kategorie anzeigen.", "templates-filter-label": "Nach Kategorie filtern", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "Position des Starters", "appearance-launcher-position-start": "Start", "appearance-launcher-use-distro-logo-description": "Verwende das Logo deiner Distribution als Dock-Launcher-Symbol.", - "appearance-launcher-use-distro-logo-label": "Distro-Logo anstelle des Icons verwenden.", + "appearance-launcher-use-distro-logo-label": "Distro-Logo anstelle des Icons verwenden", "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.", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Kein Ton, Pop-up wird trotzdem angezeigt und ist im Verlauf.", "rules-add": "Regel hinzufügen", "rules-delete": "Regel löschen", - "rules-description": "App-Namen oder Inhalt abgleichen. Erster Treffer gewinnt.", + "rules-description": "App-Namen oder Inhalt abgleichen. Regeln werden der Reihe nach geprüft, und die erste Übereinstimmung wird angewendet.", "rules-edit": "Regel bearbeiten", "rules-label": "Filterregeln", "rules-pattern-label": "Muster", @@ -2057,6 +2057,8 @@ "apikey-label": "API-Schlüssel", "apikey-managed-by-env": "Verwaltet über die Umgebungsvariable NOCTALIA_WALLHAVEN_API_KEY.", "apikey-placeholder": "Geben Sie Ihren Wallhaven API-Schlüssel ein", + "appearance-dark-tab": "Dunkel", + "appearance-light-tab": "Hell", "apply-all-monitors-description": "Ausgewähltes Hintergrundbild auf alle Monitore gleichzeitig anwenden.", "apply-all-monitors-label": "Auf alle Monitore anwenden", "categories-anime": "Anime", diff --git a/Assets/Translations/en-GB.json b/Assets/Translations/en-GB.json index 87616f07a..35b066a00 100644 --- a/Assets/Translations/en-GB.json +++ b/Assets/Translations/en-GB.json @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "No sound, still shows popup and in history.", "rules-add": "Add rule", "rules-delete": "Delete rule", - "rules-description": "Match app name or content. First match wins.", + "rules-description": "Match app name or content. Rules are checked in order, and the first match is applied.", "rules-edit": "Edit rule", "rules-label": "Filter rules", "rules-pattern-label": "Pattern", @@ -2057,6 +2057,8 @@ "apikey-label": "API Key", "apikey-managed-by-env": "Managed via NOCTALIA_WALLHAVEN_API_KEY environment variable.", "apikey-placeholder": "Enter your Wallhaven API Key", + "appearance-dark-tab": "Dark", + "appearance-light-tab": "Light", "apply-all-monitors-description": "Apply the selected wallpaper to all monitors.", "apply-all-monitors-label": "Apply to all monitors", "categories-anime": "Anime", diff --git a/Assets/Translations/en.json b/Assets/Translations/en.json index 0af2ba575..236cd6bc4 100644 --- a/Assets/Translations/en.json +++ b/Assets/Translations/en.json @@ -1217,8 +1217,6 @@ "profile-tooltip": "Profile picture", "reverse-scrolling-description": "Reverse the interpreted scroll direction", "reverse-scrolling-label": "Reverse scrolling", - "smooth-scrolling-description": "Animate list scrolling for a smoother wheel experience.", - "smooth-scrolling-label": "Smooth scrolling", "screen-corners-desc": "Customize screen corner rounding and visual effects.", "screen-corners-radius-description": "Adjust the rounded corners of the screen.", "screen-corners-radius-label": "Screen corners radius", @@ -1471,7 +1469,7 @@ "rules-action-mute-desc": "No sound, still shows popup and in history.", "rules-add": "Add rule", "rules-delete": "Delete rule", - "rules-description": "Match app name or content. First match wins.", + "rules-description": "Match app name or content. Rules are checked in order, and the first match is applied.", "rules-edit": "Edit rule", "rules-label": "Filter rules", "rules-pattern-label": "Pattern", @@ -2059,6 +2057,8 @@ "apikey-label": "API Key", "apikey-managed-by-env": "Managed via NOCTALIA_WALLHAVEN_API_KEY environment variable.", "apikey-placeholder": "Enter your Wallhaven API Key", + "appearance-dark-tab": "Dark", + "appearance-light-tab": "Light", "apply-all-monitors-description": "Apply the selected wallpaper to all monitors.", "apply-all-monitors-label": "Apply to all monitors", "categories-anime": "Anime", diff --git a/Assets/Translations/es.json b/Assets/Translations/es.json index 1d283babe..181bdf377 100644 --- a/Assets/Translations/es.json +++ b/Assets/Translations/es.json @@ -834,7 +834,7 @@ "appearance-density-label": "Densidad de la barra", "appearance-desc": "Personaliza la apariencia y posición de la barra.", "appearance-display-mode-description": "Elige cuando será visible la barra.", - "appearance-enable-exclusion-zone-inset-description": "Reduce la zona de exclusión en 1 píxel físico para que las ventanas a ras se extiendan perfectamente por debajo del borde de la Bar.", + "appearance-enable-exclusion-zone-inset-description": "Reduce la zona de exclusión en 1 píxel físico para que las ventanas a ras se extiendan perfectamente por debajo del borde de la barra.", "appearance-enable-exclusion-zone-inset-label": "Zona de exclusión interior", "appearance-floating-description": "Muestra la barra como una 'píldora' flotante.", "appearance-floating-label": "Barra flotante", @@ -945,7 +945,7 @@ "predefined-generate-templates-label": "Generar plantillas para esquemas predefinidos", "predefined-title": "Esquemas de colores predefinidos", "sync-gsettings-description": "Adaptar el tema del sistema a la variante clara u oscura activa.", - "sync-gsettings-label": "Sincronizar Tema del Sistema", + "sync-gsettings-label": "Sincronizar tema del sistema", "templates-desc": "Aplicar colores a aplicaciones externas.", "templates-filter-description": "Mostrar plantillas de una categoría específica.", "templates-filter-label": "Filtrar por categoría", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "Posición del lanzador", "appearance-launcher-position-start": "Iniciar", "appearance-launcher-use-distro-logo-description": "Usa el logo de tu distribución como icono del Dock Launcher.", - "appearance-launcher-use-distro-logo-label": "Usar el logo de la distro en lugar del icono.", + "appearance-launcher-use-distro-logo-label": "Usar el logo de la distro en lugar del icono", "appearance-pinned-static-description": "Siempre empuja los iconos de las aplicaciones ancladas a la izquierda en orden estático.", "appearance-pinned-static-label": "Aplicaciones ancladas estáticas", "appearance-position-description": "Elige dónde aparece el dock en la pantalla.", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Sin sonido, aún muestra la ventana emergente y en el historial.", "rules-add": "Añadir regla", "rules-delete": "Eliminar regla", - "rules-description": "Coincidir con el nombre de la aplicación o el contenido. La primera coincidencia gana.", + "rules-description": "Coincidir nombre de la aplicación o contenido. Las reglas se comprueban en orden, y la primera coincidencia se aplica.", "rules-edit": "Editar regla", "rules-label": "Reglas de Filtrado", "rules-pattern-label": "Patrón", @@ -2057,6 +2057,8 @@ "apikey-label": "Clave API", "apikey-managed-by-env": "Gestionado a través de la variable de entorno NOCTALIA_WALLHAVEN_API_KEY.", "apikey-placeholder": "Introduce tu clave API de Wallhaven", + "appearance-dark-tab": "Oscuro", + "appearance-light-tab": "Claro", "apply-all-monitors-description": "Aplica el fondo de pantalla seleccionado a todos los monitores a la vez.", "apply-all-monitors-label": "Aplicar a todos los monitores", "categories-anime": "Anime", diff --git a/Assets/Translations/fr.json b/Assets/Translations/fr.json index 263b33a45..eb8ae88cc 100644 --- a/Assets/Translations/fr.json +++ b/Assets/Translations/fr.json @@ -834,7 +834,7 @@ "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-enable-exclusion-zone-inset-description": "Réduisez la zone d'exclusion de 1 pixel physique afin que les fenêtres affleurantes se fondent parfaitement sous le bord de la Bar.", + "appearance-enable-exclusion-zone-inset-description": "Réduisez la zone d'exclusion de 1 pixel physique afin que les fenêtres affleurantes se fondent parfaitement sous le bord de la barre.", "appearance-enable-exclusion-zone-inset-label": "Zone d'exclusion en retrait", "appearance-floating-description": "Afficher la barre sous forme de 'pilule' flottante.", "appearance-floating-label": "Barre flottante", @@ -945,7 +945,7 @@ "predefined-generate-templates-label": "Générer des modèles pour les schémas prédéfinis", "predefined-title": "Jeux de couleurs prédéfinis", "sync-gsettings-description": "Adapter le thème du système à la variante claire ou sombre active.", - "sync-gsettings-label": "Synchroniser le Thème Système", + "sync-gsettings-label": "Synchroniser le thème système", "templates-desc": "Appliquer des couleurs aux applications externes.", "templates-filter-description": "Afficher les modèles d'une catégorie spécifique.", "templates-filter-label": "Filtrer par catégorie", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "Position du lanceur", "appearance-launcher-position-start": "Démarrer", "appearance-launcher-use-distro-logo-description": "Utilise le logo de ta distribution comme icône du Dock Launcher.", - "appearance-launcher-use-distro-logo-label": "Utiliser le logo de la distribution au lieu de l'icône.", + "appearance-launcher-use-distro-logo-label": "Utiliser le logo de la distribution au lieu de l'icône", "appearance-pinned-static-description": "Toujours pousser les icônes d'applications épinglées vers la gauche dans un ordre statique.", "appearance-pinned-static-label": "Applications épinglées statiques", "appearance-position-description": "Choisissez l'emplacement du Dock à l'écran.", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Pas de son, affiche toujours le pop-up et dans l'historique.", "rules-add": "Ajouter une règle", "rules-delete": "Supprimer la règle", - "rules-description": "Faire correspondre le nom de l'application ou le contenu. La première correspondance l'emporte.", + "rules-description": "Faire correspondre le nom de l'application ou le contenu. Les règles sont vérifiées dans l'ordre, et la première correspondance est appliquée.", "rules-edit": "Modifier la règle", "rules-label": "Règles de Filtrage", "rules-pattern-label": "Motif", @@ -2057,6 +2057,8 @@ "apikey-label": "Clé API", "apikey-managed-by-env": "Géré via la variable d'environnement NOCTALIA_WALLHAVEN_API_KEY.", "apikey-placeholder": "Entrez votre clé API Wallhaven", + "appearance-dark-tab": "Sombre", + "appearance-light-tab": "Clair", "apply-all-monitors-description": "Appliquer le fond d'écran sélectionné à tous les moniteurs en même temps.", "apply-all-monitors-label": "Appliquer à tous les moniteurs", "categories-anime": "Anime", diff --git a/Assets/Translations/hu.json b/Assets/Translations/hu.json index 2a41b6fdf..18fbb6189 100644 --- a/Assets/Translations/hu.json +++ b/Assets/Translations/hu.json @@ -71,7 +71,7 @@ "apply-all-label": "Görgetési változások alkalmazása minden monitorra" }, "clock": { - "clock-display-description": "Testre szabhatod az óra kijelzőjét a lenti listában szereplő tokenek hozzáadásával. A 12 órás formátum használatához tartalmaznia kell az „AP\" tokent.", + "clock-display-description": "Testre szabhatod az óra kijelzőjét a lenti listában szereplő tokenek hozzáadásával. A 12 órás formátum használatához tartalmaznia kell az „AP” tokent.", "clock-display-label": "Óra kijelző", "custom-font-description": "Egyéni betűtípus az óra kijelzőjéhez.", "custom-font-label": "Egyéni betűtípus", @@ -277,7 +277,7 @@ "colorize-icons-label": "Ikonok színezése", "drawer-enabled-description": "Ha engedélyezve van, a nem rögzített tálcaelemek egy fiókpanelen jelennek meg.
Letiltva az összes tálcaelem sorban jelenik meg.", "drawer-enabled-label": "Tálca-fiók engedélyezése", - "hide-passive-description": "Engedélyezve a „Passzív\" állapotú tálcaelemek el lesznek rejtve.", + "hide-passive-description": "Engedélyezve a „Passzív” állapotú tálcaelemek el lesznek rejtve.", "hide-passive-label": "Passzív elemek elrejtése" }, "volume": { @@ -944,7 +944,7 @@ "predefined-desc": "Válassz az előre definiált színsémák gyűjteményéből.", "predefined-generate-templates-label": "Sablonok generálása előre definiált sémákhoz", "predefined-title": "Előre definiált színsémák", - "sync-gsettings-description": "Illeszd a rendszer témáját az aktív világos vagy sötét változathoz.", + "sync-gsettings-description": "A rendszertéma igazítása az aktív világos vagy sötét módhoz.", "sync-gsettings-label": "Rendszertéma szinkronizálása", "templates-desc": "Színek alkalmazása külő alkalmazásokra.", "templates-filter-description": "Sablonok megjelenítése egy adott kategóriából.", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "Indító pozíciója", "appearance-launcher-position-start": "Indítás", "appearance-launcher-use-distro-logo-description": "A disztribúció logójának használata a dokkindító ikonja helyett.", - "appearance-launcher-use-distro-logo-label": "Disztribúció logójának használata ikon helyett.", + "appearance-launcher-use-distro-logo-label": "Disztribúció logójának használata ikon helyett", "appearance-pinned-static-description": "A rögzített alkalmazásikonok mindig statikus sorrendben kerüljenek balra.", "appearance-pinned-static-label": "Statikus rögzített alkalmazások", "appearance-position-description": "Hol jelenjen meg a dokk a képernyőn.", @@ -1310,7 +1310,7 @@ "execute-title": "Végrehajtás", "settings-annotation-tool-description": "Parancs, amely a jegyzetelés gombra kattintva fut a vágólap előzményeiben. A kép a parancsra lesz átirányítva.", "settings-annotation-tool-label": "Annotációs eszköz", - "settings-annotation-tool-placeholder": "pl. „gradia\", „satty -f -\"", + "settings-annotation-tool-placeholder": "pl. „gradia”, „satty -f -”", "settings-auto-paste-description": "Automatikusan beilleszti a kiválasztott vágólap elemet. Wtype szükséges hozzá.", "settings-auto-paste-label": "Automatikus beillesztés", "settings-clip-chips-description": "Fülmenü megjelenítése a vágólap előzmények típus szerinti szűréséhez (Képek, Linkek, Fájlok, Kód stb.).", @@ -1354,7 +1354,7 @@ "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", @@ -1426,7 +1426,7 @@ "monitors-desc": "Zárolási képernyő megjelenítése meghatározott monitorokon. Alapértelmezetten mindegyiken megjelenik, ha nincs kiválasztva.", "password-chars-description": "Aranyos ikonok, amelyek elrejtik a jelszavadat.", "password-chars-label": "Véletlenszerű jelszó ikonok", - "show-hibernate-description": "A „hibernálás\" lehetőség megjelenítése az energiakezelési műveletek között.", + "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.", "show-session-buttons-label": "Energiakezelés", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Nincs hang, de megjeleníti az előugró ablakot és az előzményekbe rakja.", "rules-add": "Szabály hozzáadása", "rules-delete": "Szabály törlése", - "rules-description": "Alkalmazásnév vagy tartalom egyeztetése. Az első találat nyer.", + "rules-description": "Alkalmazásnév vagy tartalom szerinti egyezés. A szabályok ellenőrzése sorrendben történik, és az első találat lép érvénybe.", "rules-edit": "Szabály szerkesztése", "rules-label": "Szűrőszabályok", "rules-pattern-label": "Minta", @@ -1565,7 +1565,7 @@ "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-custom-version-exists": "Egyéni verzió a következő helyről: „{source}” már telepítve van", "collision-official-version-exists": "A bővítmény hivatalos verziója már telepítve van", "development-disable": "Fejlesztői mód letiltása ennél a bővítménynél", "development-enable": "Fejlesztői mód engedélyezése ehhez a beépülőhöz.", @@ -1581,7 +1581,7 @@ "install-success": "Sikeresen telepítve: {plugin}", "installed-description": "Az összes helyileg telepített bővítmény kezelése és beállítása.", "installed-label": "Telepített bővítmények", - "installed-no-plugins-description": "Bővítmények telepítése az „Elérhető\" szakaszban lehetséges.", + "installed-no-plugins-description": "Bővítmények telepítése az „Elérhető” szakaszban lehetséges.", "installed-no-plugins-label": "Nincs telepített bővítmény", "installing": "{plugin} telepítése…", "notify-updates": "Bővítményfrissítési értesítések", @@ -1799,7 +1799,7 @@ "enter-command": "Végrehajtandó parancs (alkalmazás vagy egyéni parancsfájl)", "enter-ipc-identifier": "Az IPC parancsok egyedi azonosítója", "enter-path": "Útvonal megadása…", - "enter-text-to-collapse": "pl. „semmi sem játszik\". /regex/ a mintákhoz.", + "enter-text-to-collapse": "pl. „semmi sem játszik”. /regex/ a mintákhoz.", "enter-tooltip": "Add meg a buboréksúgót", "enter-width-pixels": "Add meg a szélességet képpontban", "keybind-recording": "Gyorsbillentyű rögzítése…", @@ -1921,7 +1921,7 @@ "clipboard": { "long-text": "Hosszú szöveg", "unavailable": "A vágólapelőzmények nem elérhetők", - "unavailable-desc": "A „cliphist\" alkalmazás nincs telepítve. Telepítsd a vágólapelőzmények funkcióinak használatához" + "unavailable-desc": "A „cliphist” alkalmazás nincs telepítve. Telepítsd a vágólapelőzmények funkcióinak használatához" }, "custom-command-failed": { "description": "A parancs sikertelen: {command}\\nKilépési kód: {code}", @@ -2057,6 +2057,8 @@ "apikey-label": "API kulcs", "apikey-managed-by-env": "A NOCTALIA_WALLHAVEN_API_KEY környezeti változóval kezelhető.", "apikey-placeholder": "Add meg a Wallhaven API kulcsod!", + "appearance-dark-tab": "Sötét", + "appearance-light-tab": "Világos", "apply-all-monitors-description": "A kiválasztott háttérkép alkalmazása minden monitorra.", "apply-all-monitors-label": "Alkalmazás minden monitorra", "categories-anime": "Anime", diff --git a/Assets/Translations/it.json b/Assets/Translations/it.json index 9672a0924..a34042f87 100644 --- a/Assets/Translations/it.json +++ b/Assets/Translations/it.json @@ -834,7 +834,7 @@ "appearance-density-label": "Densità barra", "appearance-desc": "Personalizza aspetto e posizione della barra.", "appearance-display-mode-description": "Scegli quando la barra è visibile.", - "appearance-enable-exclusion-zone-inset-description": "Riduci la zona di esclusione di 1 pixel fisico in modo che le finestre a filo si estendano perfettamente sotto il bordo della Bar.", + "appearance-enable-exclusion-zone-inset-description": "Riduci la zona di esclusione di 1 pixel fisico in modo che le finestre a filo si estendano perfettamente sotto il bordo della barra.", "appearance-enable-exclusion-zone-inset-label": "Zona di esclusione interna", "appearance-floating-description": "Mostra la barra come 'pill' flottante.", "appearance-floating-label": "Barra flottante", @@ -945,7 +945,7 @@ "predefined-generate-templates-label": "Genera template per schemi predefiniti", "predefined-title": "Schemi colore predefiniti", "sync-gsettings-description": "Abbina il tema di sistema alla variante chiara o scura attiva.", - "sync-gsettings-label": "Sincronizza Tema di Sistema", + "sync-gsettings-label": "Sincronizza tema di sistema", "templates-desc": "Applica colori ad applicazioni esterne.", "templates-filter-description": "Mostra template di una categoria specifica.", "templates-filter-label": "Filtra per categoria", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "Posizione launcher", "appearance-launcher-position-start": "Inizio", "appearance-launcher-use-distro-logo-description": "Usa il logo della tua distribuzione come icona del Dock Launcher.", - "appearance-launcher-use-distro-logo-label": "Usa il logo della distro invece dell'icona.", + "appearance-launcher-use-distro-logo-label": "Usa il logo della distro invece dell'icona", "appearance-pinned-static-description": "Spinge sempre le icone app fissate a sinistra in ordine statico.", "appearance-pinned-static-label": "App fissate statiche", "appearance-position-description": "Scegli dove appare il dock sullo schermo.", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Nessun suono, mostra comunque il pop-up e nella cronologia.", "rules-add": "Aggiungi regola", "rules-delete": "Elimina regola", - "rules-description": "Corrisponde al nome dell'app o al contenuto. La prima corrispondenza vince.", + "rules-description": "Corrisponde al nome dell'app o al contenuto. Le regole vengono controllate in ordine e la prima corrispondenza viene applicata.", "rules-edit": "Modifica regola", "rules-label": "Regole di Filtro", "rules-pattern-label": "Modello", @@ -2057,6 +2057,8 @@ "apikey-label": "Chiave API", "apikey-managed-by-env": "Gestita tramite la variabile d’ambiente NOCTALIA_WALLHAVEN_API_KEY.", "apikey-placeholder": "Inserisci la tua chiave API Wallhaven", + "appearance-dark-tab": "Scuro", + "appearance-light-tab": "Chiaro", "apply-all-monitors-description": "Applica lo sfondo selezionato a tutti i monitor.", "apply-all-monitors-label": "Applica a tutti i monitor", "categories-anime": "Anime", diff --git a/Assets/Translations/ja.json b/Assets/Translations/ja.json index bc22904cd..a357c732b 100644 --- a/Assets/Translations/ja.json +++ b/Assets/Translations/ja.json @@ -834,7 +834,7 @@ "appearance-density-label": "バーの密度", "appearance-desc": "バーの外観や位置をカスタマイズします。", "appearance-display-mode-description": "バーの表示タイミングを選択してください。", - "appearance-enable-exclusion-zone-inset-description": "排他ゾーンを1物理ピクセル縮小し、Barの端の下にぴったりと重なるようにウィンドウが表示されるようにします。", + "appearance-enable-exclusion-zone-inset-description": "排他ゾーンを1物理ピクセル縮小し、バーの端の下にぴったりと重なるようにウィンドウが表示されるようにします。", "appearance-enable-exclusion-zone-inset-label": "インセット除外領域", "appearance-floating-description": "バーを浮かせて、カプセル型で表示します。", "appearance-floating-label": "フローティングバー", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "ランチャーの位置", "appearance-launcher-position-start": "開始", "appearance-launcher-use-distro-logo-description": "ディストリビューションのロゴをDock Launcherアイコンとして使用します。", - "appearance-launcher-use-distro-logo-label": "アイコンの代わりにディストロのロゴを使用する。", + "appearance-launcher-use-distro-logo-label": "アイコンの代わりにディストロのロゴを使用する", "appearance-pinned-static-description": "ピン留めされたアプリアイコンを常に左側に寄せて固定します。", "appearance-pinned-static-label": "ピン留めアプリの固定配置", "appearance-position-description": "ドックを画面上のどこに表示するかを選択してください。", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "音は出ないが、ポップアップは表示され、履歴にも残る。", "rules-add": "ルールを追加", "rules-delete": "ルールを削除", - "rules-description": "アプリ名またはコンテンツに一致。最初の結果が優先されます。", + "rules-description": "アプリ名またはコンテンツに一致。ルールは順番にチェックされ、最初の一致が適用されます。", "rules-edit": "ルールを編集", "rules-label": "フィルター規則", "rules-pattern-label": "パターン", @@ -2057,6 +2057,8 @@ "apikey-label": "APIキー", "apikey-managed-by-env": "NOCTALIA_WALLHAVEN_API_KEY 環境変数経由で管理されます。", "apikey-placeholder": "Wallhaven APIキーを入力してください", + "appearance-dark-tab": "ダーク", + "appearance-light-tab": "ライト", "apply-all-monitors-description": "選択した壁紙をすべてのディスプレイに適用します。", "apply-all-monitors-label": "全ディスプレイに適用", "categories-anime": "アニメ", diff --git a/Assets/Translations/ko-KR.json b/Assets/Translations/ko-KR.json index 96444ccac..7a8d36c4f 100644 --- a/Assets/Translations/ko-KR.json +++ b/Assets/Translations/ko-KR.json @@ -834,7 +834,7 @@ "appearance-density-label": "바 밀도", "appearance-desc": "바의 모양과 위치를 사용자 지정합니다.", "appearance-display-mode-description": "바가 언제 표시될지 선택하세요.", - "appearance-enable-exclusion-zone-inset-description": "제외 영역을 1 물리 픽셀만큼 줄여 Bar 가장자리 아래로 창이 완벽하게 겹치도록 합니다.", + "appearance-enable-exclusion-zone-inset-description": "제외 영역을 1 물리 픽셀만큼 줄여 바 가장자리 아래로 창이 완벽하게 겹치도록 합니다.", "appearance-enable-exclusion-zone-inset-label": "인셋 제외 영역", "appearance-floating-description": "바를 플로팅 '알약' 형태로 표시합니다.", "appearance-floating-label": "플로팅 바", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "런처 위치", "appearance-launcher-position-start": "시작", "appearance-launcher-use-distro-logo-description": "배포판 로고를 Dock Launcher 아이콘으로 사용하세요.", - "appearance-launcher-use-distro-logo-label": "아이콘 대신 배포판 로고 사용.", + "appearance-launcher-use-distro-logo-label": "아이콘 대신 배포판 로고 사용", "appearance-pinned-static-description": "고정된 앱 아이콘을 항상 왼쪽에 정적인 순서로 배치합니다.", "appearance-pinned-static-label": "정적 고정 앱", "appearance-position-description": "화면에서 독이 나타날 위치를 선택하세요.", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "소리 없음, 팝업은 계속 표시되며 기록에 남음.", "rules-add": "규칙 추가", "rules-delete": "규칙 삭제", - "rules-description": "앱 이름 또는 콘텐츠와 일치. 첫 번째 일치가 우선합니다.", + "rules-description": "앱 이름 또는 내용과 일치시킵니다. 규칙은 순서대로 확인되며, 첫 번째 일치하는 항목이 적용됩니다.", "rules-edit": "규칙 편집", "rules-label": "필터 규칙", "rules-pattern-label": "패턴", @@ -2057,6 +2057,8 @@ "apikey-label": "API 키", "apikey-managed-by-env": "NOCTALIA_WALLHAVEN_API_KEY 환경 변수를 통해 관리됩니다.", "apikey-placeholder": "Wallhaven API 키 입력", + "appearance-dark-tab": "어둡게", + "appearance-light-tab": "라이트", "apply-all-monitors-description": "선택한 배경화면을 모든 모니터에 적용합니다.", "apply-all-monitors-label": "모든 모니터에 적용", "categories-anime": "애니메이션", diff --git a/Assets/Translations/nl.json b/Assets/Translations/nl.json index 9531e79a2..5bd8330ad 100644 --- a/Assets/Translations/nl.json +++ b/Assets/Translations/nl.json @@ -834,8 +834,8 @@ "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-enable-exclusion-zone-inset-description": "Verklein de uitsluitingszone met 1 fysieke pixel, zodat gelijkgelegen vensters perfect onder de rand van de Bar overlappen.", - "appearance-enable-exclusion-zone-inset-label": "Inspringende uitsluitingszone", + "appearance-enable-exclusion-zone-inset-description": "Verklein de uitsluitingszone met 1 fysieke pixel, zodat gelijkgelegen vensters perfect onder de rand van de balk overlappen.", + "appearance-enable-exclusion-zone-inset-label": "Binnenmarge van de uitsluitingszone", "appearance-floating-description": "Toon de balk weer als een zwevende 'pil'.", "appearance-floating-label": "Zwevende balk", "appearance-font-scale-description": "De schaal van de lettergrootte aanpassen voor tekst die in de balk wordt weergegeven.", @@ -945,7 +945,7 @@ "predefined-generate-templates-label": "Sjablonen genereren voor vooraf gedefinieerde schema's", "predefined-title": "Vooraf gedefinieerde kleurenschema's", "sync-gsettings-description": "Pas het systeemthema aan de actieve lichte of donkere variant aan.", - "sync-gsettings-label": "Systeemthema Synchroniseren", + "sync-gsettings-label": "Systeemthema synchroniseren", "templates-desc": "Pas kleuren toe op externe applicaties.", "templates-filter-description": "Sjablonen uit een specifieke categorie weergeven.", "templates-filter-label": "Filteren op categorie", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "Positie van de starter", "appearance-launcher-position-start": "Start", "appearance-launcher-use-distro-logo-description": "Gebruik het logo van je distributie als het Dock Launcher-pictogram.", - "appearance-launcher-use-distro-logo-label": "Gebruik distro-logo in plaats van pictogram.", + "appearance-launcher-use-distro-logo-label": "Gebruik distro-logo in plaats van pictogram", "appearance-pinned-static-description": "Zet vastgemaakte app-pictogrammen altijd in statische volgorde aan de linkerkant.", "appearance-pinned-static-label": "Statische vastgezette apps", "appearance-position-description": "Kies waar het dock op het scherm verschijnt.", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Geen geluid, toont nog steeds pop-up en in geschiedenis.", "rules-add": "Regel toevoegen", "rules-delete": "Regel verwijderen", - "rules-description": "Komt overeen met app-naam of inhoud. Eerste overeenkomst wint.", + "rules-description": "Komt overeen met app-naam of inhoud. Regels worden in volgorde gecontroleerd, en de eerste overeenkomst wordt toegepast.", "rules-edit": "Regel bewerken", "rules-label": "Filterregels", "rules-pattern-label": "Patroon", @@ -2057,6 +2057,8 @@ "apikey-label": "API-sleutel", "apikey-managed-by-env": "Beheerd via de NOCTALIA_WALLHAVEN_API_KEY omgevingsvariabele.", "apikey-placeholder": "Voer uw Wallhaven API-sleutel in", + "appearance-dark-tab": "Donker", + "appearance-light-tab": "Licht", "apply-all-monitors-description": "Pas de geselecteerde achtergrond in één keer op alle monitoren toe.", "apply-all-monitors-label": "Toepassen op alle monitoren", "categories-anime": "Anime", diff --git a/Assets/Translations/pl.json b/Assets/Translations/pl.json index 29a4f1ff0..aba885372 100644 --- a/Assets/Translations/pl.json +++ b/Assets/Translations/pl.json @@ -834,7 +834,7 @@ "appearance-density-label": "Zagęszczenie paska", "appearance-desc": "Dostosuj wygląd i pozycję paska.", "appearance-display-mode-description": "Wybierz, kiedy pasek jest widoczny.", - "appearance-enable-exclusion-zone-inset-description": "Zmniejsz strefę wykluczenia o 1 fizyczny piksel, aby okna przylegające idealnie zachodziły pod krawędź Bar.", + "appearance-enable-exclusion-zone-inset-description": "Zmniejsz strefę wykluczenia o 1 fizyczny piksel, aby okna przylegające idealnie zachodziły pod krawędź paska.", "appearance-enable-exclusion-zone-inset-label": "Wewnętrzna strefa wykluczenia", "appearance-floating-description": "Wyświetl pasek jako pływającą 'pigułkę'.", "appearance-floating-label": "Pływający pasek", @@ -945,7 +945,7 @@ "predefined-generate-templates-label": "Generuj szablony dla predefiniowanych schematów", "predefined-title": "Predefiniowane schematy kolorów", "sync-gsettings-description": "Dopasuj motyw systemowy do aktywnego wariantu jasnego lub ciemnego.", - "sync-gsettings-label": "Synchronizuj Motyw Systemowy", + "sync-gsettings-label": "Synchronizuj motyw systemowy", "templates-desc": "Zastosuj kolory w aplikacjach zewnętrznych.", "templates-filter-description": "Pokaż szablony z określonej kategorii.", "templates-filter-label": "Filtruj według kategorii", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "Pozycja uruchamiacza", "appearance-launcher-position-start": "Start", "appearance-launcher-use-distro-logo-description": "Użyj logo swojej dystrybucji jako ikony Dock Launcher.", - "appearance-launcher-use-distro-logo-label": "Użyj logo dystrybucji zamiast ikony.", + "appearance-launcher-use-distro-logo-label": "Użyj logo dystrybucji zamiast ikony", "appearance-pinned-static-description": "Zawsze spychaj przypięte aplikacje na lewo w stałej kolejności.", "appearance-pinned-static-label": "Statyczne przypięte aplikacje", "appearance-position-description": "Wybierz, gdzie dok ma się pojawiać na ekranie.", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Brak dźwięku, nadal wyświetla wyskakujące okienko i w historii.", "rules-add": "Dodaj regułę", "rules-delete": "Usuń regułę", - "rules-description": "Dopasuj nazwę aplikacji lub zawartość. Pierwsze dopasowanie wygrywa.", + "rules-description": "Dopasuj nazwę aplikacji lub zawartość. Reguły są sprawdzane po kolei, a pierwsze dopasowanie jest stosowane.", "rules-edit": "Edytuj regułę", "rules-label": "Reguły Filtrowania", "rules-pattern-label": "Wzór", @@ -2057,6 +2057,8 @@ "apikey-label": "Klucz API", "apikey-managed-by-env": "Zarządzane za pomocą zmiennej środowiskowej NOCTALIA_WALLHAVEN_API_KEY.", "apikey-placeholder": "Wprowadź swój klucz API Wallhaven", + "appearance-dark-tab": "Ciemny", + "appearance-light-tab": "Jasny", "apply-all-monitors-description": "Zastosuj wybraną tapetę na wszystkich monitorach.", "apply-all-monitors-label": "Zastosuj na wszystkich monitorach", "categories-anime": "Anime", diff --git a/Assets/Translations/pt.json b/Assets/Translations/pt.json index 192ce4b08..81f483b30 100644 --- a/Assets/Translations/pt.json +++ b/Assets/Translations/pt.json @@ -834,7 +834,7 @@ "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-enable-exclusion-zone-inset-description": "Reduza a zona de exclusão em 1 pixel físico para que as janelas alinhadas se estendam perfeitamente sob a borda da Bar.", + "appearance-enable-exclusion-zone-inset-description": "Reduza a zona de exclusão em 1 pixel físico para que as janelas alinhadas se estendam perfeitamente sob a borda da barra.", "appearance-enable-exclusion-zone-inset-label": "Zona de exclusão interna", "appearance-floating-description": "Exibe a barra como uma 'pílula' flutuante.", "appearance-floating-label": "Barra flutuante", @@ -945,7 +945,7 @@ "predefined-generate-templates-label": "Gerar modelos para esquemas predefinidos", "predefined-title": "Esquemas de cores predefinidos", "sync-gsettings-description": "Corresponder o tema do sistema à variante clara ou escura ativa.", - "sync-gsettings-label": "Sincronizar Tema do Sistema", + "sync-gsettings-label": "Sincronizar tema do sistema", "templates-desc": "Aplicar cores a aplicações externas.", "templates-filter-description": "Mostrar templates de uma categoria específica.", "templates-filter-label": "Filtrar por categoria", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "Posição do lançador", "appearance-launcher-position-start": "Iniciar", "appearance-launcher-use-distro-logo-description": "Use o logo da sua distribuição como o ícone do Dock Launcher.", - "appearance-launcher-use-distro-logo-label": "Usar o logótipo da distro em vez do ícone.", + "appearance-launcher-use-distro-logo-label": "Usar o logótipo da distro em vez do ícone", "appearance-pinned-static-description": "Sempre posicione os ícones de aplicativos fixados à esquerda em ordem estática.", "appearance-pinned-static-label": "Aplicativos fixados estaticamente", "appearance-position-description": "Escolha onde o dock aparece na tela.", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Sem som, ainda mostra o pop-up e no histórico.", "rules-add": "Adicionar regra", "rules-delete": "Excluir regra", - "rules-description": "Corresponder ao nome da aplicação ou conteúdo. A primeira correspondência vence.", + "rules-description": "Corresponder nome da aplicação ou conteúdo. As regras são verificadas por ordem, e a primeira correspondência é aplicada.", "rules-edit": "Editar regra", "rules-label": "Regras de Filtro", "rules-pattern-label": "Padrão", @@ -2057,6 +2057,8 @@ "apikey-label": "Chave de API", "apikey-managed-by-env": "Gerenciado através da variável de ambiente NOCTALIA_WALLHAVEN_API_KEY.", "apikey-placeholder": "Insira sua chave da API Wallhaven", + "appearance-dark-tab": "Escuro", + "appearance-light-tab": "Claro", "apply-all-monitors-description": "Aplica o papel de parede selecionado a todos os monitores de uma só vez.", "apply-all-monitors-label": "Aplicar a todos os monitores", "categories-anime": "Anime", diff --git a/Assets/Translations/ru.json b/Assets/Translations/ru.json index 5dd75b008..292bead80 100644 --- a/Assets/Translations/ru.json +++ b/Assets/Translations/ru.json @@ -834,7 +834,7 @@ "appearance-density-label": "Плотность панели", "appearance-desc": "Настройка внешнего вида и положения панели.", "appearance-display-mode-description": "Выберите, когда панель видна.", - "appearance-enable-exclusion-zone-inset-description": "Уменьшите зону исключения на 1 физический пиксель, чтобы окна вплотную идеально заходили под край Bar.", + "appearance-enable-exclusion-zone-inset-description": "Уменьшите зону исключения на 1 физический пиксель, чтобы окна вплотную идеально заходили под край панели.", "appearance-enable-exclusion-zone-inset-label": "Внутренняя зона исключения", "appearance-floating-description": "Отображает панель как плавающую 'таблетку'.", "appearance-floating-label": "Плавающая панель", @@ -945,7 +945,7 @@ "predefined-generate-templates-label": "Генерировать шаблоны для предопределённых схем", "predefined-title": "Предопределённые цветовые схемы", "sync-gsettings-description": "Сопоставить системную тему с активным светлым или темным вариантом.", - "sync-gsettings-label": "Синхронизировать Системную Тему", + "sync-gsettings-label": "Синхронизировать системную тему", "templates-desc": "Применение цветов к внешним приложениям.", "templates-filter-description": "Показать шаблоны из определённой категории.", "templates-filter-label": "Фильтровать по категории", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "Позиция запускателя", "appearance-launcher-position-start": "Старт", "appearance-launcher-use-distro-logo-description": "Используйте логотип вашего дистрибутива в качестве значка Dock Launcher.", - "appearance-launcher-use-distro-logo-label": "Использовать логотип дистрибутива вместо иконки.", + "appearance-launcher-use-distro-logo-label": "Использовать логотип дистрибутива вместо иконки", "appearance-pinned-static-description": "Всегда перемещайте закреплённые значки приложений влево в статичном порядке.", "appearance-pinned-static-label": "Закреплённые статические приложения", "appearance-position-description": "Выберите, где док будет отображаться на экране.", @@ -1227,7 +1227,7 @@ "screen-corners-solid-black-label": "Сплошные чёрные углы", "screen-corners-title": "Углы экрана", "settings-copied": "Настройки скопированы в буфер обмена", - "tab-basics": "Основы", + "tab-basics": "Основное", "tab-keybinds": "Горячие клавиши" }, "hooks": { @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Нет звука, всплывающее окно всё равно отображается и в истории.", "rules-add": "Добавить правило", "rules-delete": "Удалить правило", - "rules-description": "Сопоставить имя приложения или содержимое. Первое совпадение выигрывает.", + "rules-description": "Сопоставить название приложения или содержимое. Правила проверяются по порядку, и первое совпадение применяется.", "rules-edit": "Редактировать правило", "rules-label": "Правила Фильтрации", "rules-pattern-label": "Шаблон", @@ -2057,6 +2057,8 @@ "apikey-label": "Ключ API", "apikey-managed-by-env": "Управляется через переменную окружения NOCTALIA_WALLHAVEN_API_KEY.", "apikey-placeholder": "Введите свой API-ключ Wallhaven", + "appearance-dark-tab": "Темный", + "appearance-light-tab": "Светлый", "apply-all-monitors-description": "Применить выбранные обои ко всем мониторам одновременно.", "apply-all-monitors-label": "Применить ко всем мониторам", "categories-anime": "Аниме", @@ -2214,7 +2216,7 @@ "saved": "Сохранено", "scan-again": "Сканировать снова", "searching": "Поиск ближайших сетей...", - "security-open": "Открыть", + "security-open": "Открытая", "security-wep": "WEP", "security-wpa": "WPA/WPA2/WPA3 Персональный", "security-wpa-ent": "WPA Enterprise", diff --git a/Assets/Translations/sv.json b/Assets/Translations/sv.json index aa6b41185..8c992494e 100644 --- a/Assets/Translations/sv.json +++ b/Assets/Translations/sv.json @@ -834,7 +834,7 @@ "appearance-density-label": "Stapeldensitet", "appearance-desc": "Anpassa stapelns utseende och position.", "appearance-display-mode-description": "Välj när listen är synlig.", - "appearance-enable-exclusion-zone-inset-description": "Minska exklusionszonen med 1 fysisk pixel så att fönster som ligger kant i kant perfekt överlappar under Bar-kanten.", + "appearance-enable-exclusion-zone-inset-description": "Minska exklusionszonen med 1 fysisk pixel så att fönster som ligger kant i kant perfekt överlappar under stapelkanten.", "appearance-enable-exclusion-zone-inset-label": "Infälld uteslutningszon", "appearance-floating-description": "Visa stapeln som en flytande 'piller'.", "appearance-floating-label": "Flytande stapel", @@ -945,7 +945,7 @@ "predefined-generate-templates-label": "Generera mallar för fördefinierade scheman", "predefined-title": "Fördefinierade färgscheman", "sync-gsettings-description": "Matcha systemtemat med den aktiva ljusa eller mörka varianten.", - "sync-gsettings-label": "Synkronisera Systemtema", + "sync-gsettings-label": "Synkronisera systemtema", "templates-desc": "Tillämpa färger på externa applikationer.", "templates-filter-description": "Visa mallar från en specifik kategori.", "templates-filter-label": "Filtrera efter kategori", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "Startarens position", "appearance-launcher-position-start": "Starta", "appearance-launcher-use-distro-logo-description": "Använd din distributions logotyp som Dock Launcher-ikon.", - "appearance-launcher-use-distro-logo-label": "Använd distrologotyp istället för ikon.", + "appearance-launcher-use-distro-logo-label": "Använd distrologotyp istället för ikon", "appearance-pinned-static-description": "Flytta alltid fastnålade appikoner till vänster i statisk ordning. ", "appearance-pinned-static-label": "Statiska fästa appar", "appearance-position-description": "Välj var dockan ska visas på skärmen.", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Inget ljud, visar fortfarande popup och i historiken.", "rules-add": "Lägg till regel", "rules-delete": "Ta bort regel", - "rules-description": "Matcha appnamn eller innehåll. Första träffen vinner.", + "rules-description": "Matcha appnamn eller innehåll. Regler kontrolleras i ordning, och den första matchningen tillämpas.", "rules-edit": "Redigera regel", "rules-label": "Filterregler", "rules-pattern-label": "Mönster", @@ -2057,6 +2057,8 @@ "apikey-label": "API-nyckel", "apikey-managed-by-env": "Hanteras via miljövariabeln NOCTALIA_WALLHAVEN_API_KEY.", "apikey-placeholder": "Ange din Wallhaven API-nyckel", + "appearance-dark-tab": "Mörk", + "appearance-light-tab": "Ljus", "apply-all-monitors-description": "Tillämpa den valda bakgrundsbilden på alla skärmar.", "apply-all-monitors-label": "Tillämpa på alla skärmar", "categories-anime": "Anime", diff --git a/Assets/Translations/tr.json b/Assets/Translations/tr.json index a631f6016..06dd5e98d 100644 --- a/Assets/Translations/tr.json +++ b/Assets/Translations/tr.json @@ -834,7 +834,7 @@ "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-enable-exclusion-zone-inset-description": "Hariç tutma bölgesini 1 fiziksel piksel kadar azaltın, böylece Bar kenarının altına tam oturan pencereler kusursuzca taşar.", + "appearance-enable-exclusion-zone-inset-description": "Hariç tutma bölgesini 1 fiziksel piksel azaltın, böylece araç çubuğu kenarının altına tam oturan pencereler kusursuzca taşar.", "appearance-enable-exclusion-zone-inset-label": "Girintili dışlama bölgesi", "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", @@ -945,7 +945,7 @@ "predefined-generate-templates-label": "Önceden tanımlanmış şemalar için şablonlar oluşturun", "predefined-title": "Önceden tanımlanmış renk şemaları", "sync-gsettings-description": "Sistem temasını aktif açık veya koyu varyantla eşleştir.", - "sync-gsettings-label": "Sistem Temasını Senkronize Et", + "sync-gsettings-label": "Sistem temasını senkronize et", "templates-desc": "Renkleri harici uygulamalara uygula.", "templates-filter-description": "Belirli bir kategoriden şablonları göster.", "templates-filter-label": "Kategoriye göre filtrele", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "Başlatıcı konumu", "appearance-launcher-position-start": "Başlat", "appearance-launcher-use-distro-logo-description": "Dağıtımınızın logosunu Dock Launcher simgesi olarak kullanın.", - "appearance-launcher-use-distro-logo-label": "Simge yerine dağıtım logosunu kullan.", + "appearance-launcher-use-distro-logo-label": "Simge yerine dağıtım logosunu kullan", "appearance-pinned-static-description": "Sabit sırada, sabitlenmiş uygulama simgelerini her zaman sola itin.", "appearance-pinned-static-label": "Sabitlenmiş statik uygulamalar", "appearance-position-description": "Dock’un ekranda nerede görüneceğini seçin.", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Ses yok, yine de açılır pencere gösteriyor ve geçmişte.", "rules-add": "Kural Ekle", "rules-delete": "Kuralı Sil", - "rules-description": "Uygulama adı veya içerikle eşleştir. İlk eşleşme kazanır.", + "rules-description": "Uygulama adını veya içeriği eşleştir. Kurallar sırayla kontrol edilir ve ilk eşleşen uygulanır.", "rules-edit": "Kuralı Düzenle", "rules-label": "Filtre Kuralları", "rules-pattern-label": "Desen", @@ -2057,6 +2057,8 @@ "apikey-label": "API anahtarı", "apikey-managed-by-env": "NOCTALIA_WALLHAVEN_API_KEY ortam değişkeni aracılığıyla yönetilir.", "apikey-placeholder": "Wallhaven API anahtarınızı girin", + "appearance-dark-tab": "Koyu", + "appearance-light-tab": "Açık", "apply-all-monitors-description": "Seçilen duvar kâğıdını tüm monitörlere aynı anda uygulayın.", "apply-all-monitors-label": "Tüm monitörler için uygula", "categories-anime": "Anime", diff --git a/Assets/Translations/uk-UA.json b/Assets/Translations/uk-UA.json index 7024e089d..d2f66fa1f 100644 --- a/Assets/Translations/uk-UA.json +++ b/Assets/Translations/uk-UA.json @@ -834,7 +834,7 @@ "appearance-density-label": "Щільність панелі", "appearance-desc": "Налаштуйте зовнішній вигляд та положення панелі.", "appearance-display-mode-description": "Виберіть, коли панель видима.", - "appearance-enable-exclusion-zone-inset-description": "Зменшіть зону виключення на 1 фізичний піксель, щоб вікна впритул ідеально заходили під край Bar.", + "appearance-enable-exclusion-zone-inset-description": "Зменшіть зону виключення на 1 фізичний піксель, щоб вікна впритул ідеально заходили під край панели.", "appearance-enable-exclusion-zone-inset-label": "Внутрішня зона виключення", "appearance-floating-description": "Відображати панель як плаваючу 'капсулу'. Примітка: Це перемістить кути екрана до країв.", "appearance-floating-label": "Плаваюча панель (Острівець)", @@ -945,7 +945,7 @@ "predefined-generate-templates-label": "Генерувати шаблони для попередньо визначених схем", "predefined-title": "Попередньо визначені колірні схеми", "sync-gsettings-description": "Зіставити системну тему з активним світлим або темним варіантом.", - "sync-gsettings-label": "Синхронізувати Системну Тему", + "sync-gsettings-label": "Синхронізувати системну тему", "templates-desc": "Застосовувати кольори до зовнішніх застосунків.", "templates-filter-description": "Показати шаблони з певної категорії.", "templates-filter-label": "Фільтрувати за категорією", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "Позиція запускача", "appearance-launcher-position-start": "Старт", "appearance-launcher-use-distro-logo-description": "Використовуйте логотип вашого дистрибутива як значок Dock Launcher.", - "appearance-launcher-use-distro-logo-label": "Використовувати логотип дистрибутива замість іконки.", + "appearance-launcher-use-distro-logo-label": "Використовувати логотип дистрибутива замість іконки", "appearance-pinned-static-description": "Завжди закріплюйте значки програм ліворуч у статичному порядку.", "appearance-pinned-static-label": "Статично закріплені програми", "appearance-position-description": "Виберіть, де док відображатиметься на екрані.", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Немає звуку, все одно показує спливаюче вікно та в історії.", "rules-add": "Додати правило", "rules-delete": "Видалити правило", - "rules-description": "Зіставити назву програми або вміст. Перший збіг виграє.", + "rules-description": "Зіставити назву застосунку або вміст. Правила перевіряються по черзі, і перше співпадіння застосовується.", "rules-edit": "Редагувати правило", "rules-label": "Правила Фільтрації", "rules-pattern-label": "Шаблон", @@ -2057,6 +2057,8 @@ "apikey-label": "Ключ API", "apikey-managed-by-env": "Керується через змінну середовища NOCTALIA_WALLHAVEN_API_KEY.", "apikey-placeholder": "Введіть свій API-ключ Wallhaven", + "appearance-dark-tab": "Темний", + "appearance-light-tab": "Світлий", "apply-all-monitors-description": "Застосувати вибрані шпалери до всіх моніторів одночасно.", "apply-all-monitors-label": "Застосувати до всіх моніторів", "categories-anime": "Аніме", diff --git a/Assets/Translations/vi.json b/Assets/Translations/vi.json index f293c5576..21e635260 100644 --- a/Assets/Translations/vi.json +++ b/Assets/Translations/vi.json @@ -61,8 +61,8 @@ "hide-if-not-detected-description": "Ẩn tiện ích khi không tìm thấy pin trên hệ thống.", "hide-if-not-detected-label": "Ẩn khi không được phát hiện", "low-battery-threshold-label": "Ngưỡng cảnh báo pin yếu", - "show-noctalia-performance-description": "Hiển thị nút chuyển đổi chế độ hiệu suất của Noctalia bên trong bảng điều khiển pin.
Tắt đổ bóng và hoạt ảnh trong Noctalia để giảm mức sử dụng tài nguyên.", - "show-noctalia-performance-label": "Hiển thị công tắc hiệu suất Noctalia", + "show-noctalia-performance-description": "Hiển thị nút chuyển đổi sang chế độ hiệu năng của Noctalia bên trong bảng điều khiển pin.
Tắt đổ bóng và hoạt ảnh trong Noctalia để giảm mức sử dụng tài nguyên.", + "show-noctalia-performance-label": "Hiển thị công tắc hiệu năng của Noctalia", "show-power-profile-description": "Hiển thị lựa chọn cấu hình nguồn bên trong bảng điều khiển pin.", "show-power-profile-label": "Hiển thị điều khiển hồ sơ năng lượng" }, @@ -224,8 +224,8 @@ "disk-path-description": "Chọn điểm gắn kết đĩa nào để giám sát.", "disk-path-label": "Đường dẫn ổ đĩa", "gpu-temperature-description": "Hiển thị thông số nhiệt độ GPU nếu có.", - "load-average-description": "Hiển thị mức tải trung bình của hệ thống.", - "load-average-label": "Mức tải trung bình", + "load-average-description": "Hiển thị mức tải trọng trung bình của hệ thống.", + "load-average-label": "Mức tải trọng trung bình", "memory-percentage-description": "Hiển thị mức sử dụng bộ nhớ dưới dạng phần trăm thay vì giá trị tuyệt đối.", "memory-percentage-label": "Bộ nhớ theo phần trăm", "memory-usage-description": "Hiển thị thông tin sử dụng RAM hiện tại.", @@ -239,7 +239,7 @@ "storage-usage-description": "Hiển thị thông tin dung lượng ổ đĩa.", "storage-usage-label": "Sử dụng bộ nhớ", "swap-usage-description": "Hiển thị mức sử dụng bộ nhớ swap.", - "swap-usage-label": "Sử dụng Swap", + "swap-usage-label": "Mức sử dụng bộ nhớ swap", "use-monospace-font-description": "Sử dụng phông chữ đơn cách để có chiều rộng ký tự nhất quán.", "use-monospace-font-label": "Phông chữ đơn cách", "use-padding-description": "Đệm các giá trị văn bản bằng khoảng trắng đầu dòng để ngăn chặn sự dịch chuyển bố cục.", @@ -945,7 +945,7 @@ "predefined-generate-templates-label": "Tạo mẫu cho các lược đồ cài sẵn", "predefined-title": "Sơ Đồ Màu Định Sẵn", "sync-gsettings-description": "Khớp chủ đề hệ thống với biến thể sáng hoặc tối đang hoạt động.", - "sync-gsettings-label": "Đồng Bộ Hóa Chủ Đề Hệ Thống", + "sync-gsettings-label": "Đồng bộ chủ đề hệ thống", "templates-desc": "Áp dụng màu sắc cho các ứng dụng bên ngoài.", "templates-filter-description": "Hiển thị các mẫu từ một danh mục cụ thể.", "templates-filter-label": "Lọc theo danh mục", @@ -1244,7 +1244,7 @@ "performance-mode-disabled-label": "Chế độ hiệu suất đã tắt", "performance-mode-disabled-placeholder": "Ví dụ: notify-send \"Performance\" \"Mode disabled\"", "performance-mode-enabled-description": "Lệnh sẽ được chạy khi chế độ hiệu năng của Noctalia được bật.", - "performance-mode-enabled-label": "Chế độ hiệu suất đã bật", + "performance-mode-enabled-label": "Chế độ hiệu năng đã bật", "performance-mode-enabled-placeholder": "Ví dụ: notify-send \"Performance\" \"Mode enabled\"", "screen-lock-description": "Lệnh được thực thi khi màn hình bị khóa.", "screen-lock-label": "Màn hình đã khóa", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "Không có âm thanh, vẫn hiển thị cửa sổ bật lên và trong lịch sử.", "rules-add": "Thêm quy tắc", "rules-delete": "Xóa quy tắc", - "rules-description": "Tìm ứng dụng theo tên hoặc nội dung. Kết quả đầu tiên phù hợp sẽ được chọn.", + "rules-description": "Khớp tên ứng dụng hoặc nội dung. Các quy tắc được kiểm tra theo thứ tự, và kết quả khớp đầu tiên sẽ được áp dụng.", "rules-edit": "Sửa quy tắc", "rules-label": "Quy tắc lọc", "rules-pattern-label": "Mẫu", @@ -1885,7 +1885,7 @@ "disk": "Ổ đĩa", "download-speed": "Tốc độ tải xuống", "gpu-temp": "Nhiệt độ GPU", - "load-average": "Tải trung bình", + "load-average": "Tải trọng trung bình ", "title": "Giám sát Hệ thống", "upload-speed": "Tốc độ tải lên" }, @@ -1949,9 +1949,9 @@ "not-installed": "wlsunset chưa cài đặt" }, "noctalia-performance": { - "disabled": "Chế độ hiệu suất đã tắt", - "enabled": "Chế độ hiệu suất đã bật", - "label": "Noctalia Hiệu suất" + "disabled": "Chế độ hiệu năng đã tắt", + "enabled": "Chế độ hiệu năng đã bật", + "label": "Chế độ hiệu năng của Noctalia" }, "power-profile": { "changed": "Cấu hình nguồn đã thay đổi", @@ -2057,6 +2057,8 @@ "apikey-label": "Khóa API", "apikey-managed-by-env": "Được quản lý thông qua biến môi trường NOCTALIA_WALLHAVEN_API_KEY.", "apikey-placeholder": "Nhập Wallhaven API Key của bạn", + "appearance-dark-tab": "Tối", + "appearance-light-tab": "Sáng", "apply-all-monitors-description": "Áp dụng hình nền đã chọn cho tất cả màn hình.", "apply-all-monitors-label": "Áp dụng cho tất cả màn hình", "categories-anime": "Anime", diff --git a/Assets/Translations/zh-CN.json b/Assets/Translations/zh-CN.json index d85a72dde..bba07bc45 100644 --- a/Assets/Translations/zh-CN.json +++ b/Assets/Translations/zh-CN.json @@ -834,7 +834,7 @@ "appearance-density-label": "状态栏密度", "appearance-desc": "自定义状态栏的外观和位置。", "appearance-display-mode-description": "选择栏何时可见。", - "appearance-enable-exclusion-zone-inset-description": "减少排除区域1个物理像素,以便齐平的窗口完美地延伸到 Bar 边缘下方。", + "appearance-enable-exclusion-zone-inset-description": "减少排除区域1个物理像素,以便齐平的窗口完美地延伸到状态栏边缘下方。", "appearance-enable-exclusion-zone-inset-label": "内嵌排除区域", "appearance-floating-description": "将状态栏显示为浮动的“药丸”形状。", "appearance-floating-label": "浮动状态栏", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "启动器位置", "appearance-launcher-position-start": "开始", "appearance-launcher-use-distro-logo-description": "使用你的发行版标志作为 Dock Launcher 图标。", - "appearance-launcher-use-distro-logo-label": "使用发行版标志而非图标。", + "appearance-launcher-use-distro-logo-label": "使用发行版标志而非图标", "appearance-pinned-static-description": "始终将固定的应用图标按静态顺序推到左侧。", "appearance-pinned-static-label": "静态固定应用", "appearance-position-description": "选择 Dock 栏在屏幕上显示的位置。", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "无声音,仍显示弹窗并记录在历史中。", "rules-add": "添加规则", "rules-delete": "删除规则", - "rules-description": "匹配应用名称或内容。首个匹配项胜出。", + "rules-description": "匹配应用名称或内容。规则按顺序检查,并应用第一个匹配项。", "rules-edit": "编辑规则", "rules-label": "筛选规则", "rules-pattern-label": "模式", @@ -2057,6 +2057,8 @@ "apikey-label": "API 密钥", "apikey-managed-by-env": "通过 NOCTALIA_WALLHAVEN_API_KEY 环境变量进行管理。", "apikey-placeholder": "输入您的 Wallhaven API 密钥", + "appearance-dark-tab": "深色", + "appearance-light-tab": "浅色", "apply-all-monitors-description": "将选定的壁纸应用到所有显示器。", "apply-all-monitors-label": "应用到所有显示器", "categories-anime": "动漫", diff --git a/Assets/Translations/zh-TW.json b/Assets/Translations/zh-TW.json index da901252c..b2638e52b 100644 --- a/Assets/Translations/zh-TW.json +++ b/Assets/Translations/zh-TW.json @@ -834,7 +834,7 @@ "appearance-density-label": "工具列密度", "appearance-desc": "自訂工具列的外觀及位置", "appearance-display-mode-description": "選擇列何時可見", - "appearance-enable-exclusion-zone-inset-description": "減少排除區域1個實體像素,以便齊平的視窗能完美地延伸到 Bar 邊緣下方。", + "appearance-enable-exclusion-zone-inset-description": "減少排除區域1個實體像素,以便齊平的視窗能完美地延伸到工具列邊緣下方。", "appearance-enable-exclusion-zone-inset-label": "內嵌排除區域", "appearance-floating-description": "將工具列以懸浮的圓弧長條狀顯示", "appearance-floating-label": "懸浮工具列", @@ -1154,7 +1154,7 @@ "appearance-launcher-position-label": "啟動器位置", "appearance-launcher-position-start": "開始", "appearance-launcher-use-distro-logo-description": "使用你的發行版標誌作為 Dock Launcher 圖示。", - "appearance-launcher-use-distro-logo-label": "使用發行版標誌而非圖示。", + "appearance-launcher-use-distro-logo-label": "使用發行版標誌而非圖示", "appearance-pinned-static-description": "總是將釘選的程式圖示固定放在左邊", "appearance-pinned-static-label": "固定放置釘選程式", "appearance-position-description": "選擇 Dock 該放在畫面的哪裡", @@ -1469,7 +1469,7 @@ "rules-action-mute-desc": "無聲音,仍顯示彈出視窗並記錄在歷史中。", "rules-add": "新增規則", "rules-delete": "刪除規則", - "rules-description": "匹配應用程式名稱或內容。第一個匹配項勝出。", + "rules-description": "匹配應用程式名稱或內容。規則會依序檢查,並套用第一個匹配項。", "rules-edit": "編輯規則", "rules-label": "篩選規則", "rules-pattern-label": "模式", @@ -2057,6 +2057,8 @@ "apikey-label": "API key", "apikey-managed-by-env": "已透過 NOCTALIA_WALLHAVEN_API_KEY 這個環境變數管理", "apikey-placeholder": "輸入你的 Wallhaven API Key", + "appearance-dark-tab": "深色", + "appearance-light-tab": "淺色", "apply-all-monitors-description": "將選定的桌布套用到所有顯示器上", "apply-all-monitors-label": "套用到所有顯示器", "categories-anime": "動漫", diff --git a/Assets/settings-search-index.json b/Assets/settings-search-index.json index a2d482cdd..fbff4a441 100644 --- a/Assets/settings-search-index.json +++ b/Assets/settings-search-index.json @@ -2633,7 +2633,8 @@ "subTab": 0, "subTabLabel": "common.general", "visibleWhen": [ - "CompositorService.isNiri" + "CompositorService.isNiri", + "Settings.data.wallpaper.overviewEnabled" ] }, { @@ -2645,7 +2646,8 @@ "subTab": 0, "subTabLabel": "common.general", "visibleWhen": [ - "CompositorService.isNiri" + "CompositorService.isNiri", + "Settings.data.wallpaper.overviewEnabled" ] }, { diff --git a/Commons/Settings.qml b/Commons/Settings.qml index 84f3399e6..9c5f456ef 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -413,7 +413,8 @@ Singleton { property string wallhavenResolutionHeight: "" property string sortOrder: "name" // "name", "name_desc", "date", "date_desc", "random" property list favorites: [] - // Format: [{ "path": "/path/to/wallpaper.jpg", "colorScheme": "...", "darkMode": true, "useWallpaperColors": true, "generationMethod": "tonal-spot" }] + // Format: [{ "path": "...", "appearance": "light"|"dark", "colorScheme": "...", "darkMode": bool, "useWallpaperColors": bool, "generationMethod": "...", "paletteColors": [...] }] + // Legacy entries omit "appearance" and use darkMode to infer light vs dark slot. } // applauncher diff --git a/Commons/ShellState.qml b/Commons/ShellState.qml index f4d1c0c1f..187443b22 100644 --- a/Commons/ShellState.qml +++ b/Commons/ShellState.qml @@ -269,7 +269,7 @@ Singleton { barVisible: BarService.isVisible, openedPanel: PanelService.openedPanel?.objectName || "", lockScreenActive: PanelService.lockScreen?.active || false, - wallpapers: WallpaperService.currentWallpapers || {}, + wallpapers: WallpaperService.getWallpapersEffectiveMap(), desktopWidgetsEditMode: DesktopWidgetRegistry.editMode || false, // ------------- display: shellStateData.display || {}, diff --git a/Modules/Panels/Wallpaper/WallpaperPanel.qml b/Modules/Panels/Wallpaper/WallpaperPanel.qml index 220654c2d..617bd38d8 100644 --- a/Modules/Panels/Wallpaper/WallpaperPanel.qml +++ b/Modules/Panels/Wallpaper/WallpaperPanel.qml @@ -140,6 +140,7 @@ SmartPanel { } property var currentScreen: Quickshell.screens[currentScreenIndex] property string filterText: "" + property int appearanceTabIndex: 0 property alias screenRepeater: screenRepeater Component.onCompleted: { @@ -218,6 +219,8 @@ SmartPanel { if (wallhavenView && wallhavenView.gridView) { wallhavenView.gridView.currentIndex = -1; } + panelContent.appearanceTabIndex = Settings.data.colorSchemes.darkMode ? 1 : 0; + WallpaperService.wallpaperSelectionAppearance = panelContent.appearanceTabIndex === 1 ? "dark" : "light"; // Give initial focus to search input Qt.callLater(() => { if (searchInput.inputItem) { @@ -331,6 +334,35 @@ SmartPanel { Layout.fillWidth: true } + NTabBar { + id: appearanceTabBar + visible: Settings.data.wallpaper.enabled + Layout.fillWidth: true + currentIndex: panelContent.appearanceTabIndex + spacing: Style.marginM + distributeEvenly: true + + onCurrentIndexChanged: { + if (currentIndex < 0) { + return; + } + panelContent.appearanceTabIndex = currentIndex; + WallpaperService.wallpaperSelectionAppearance = currentIndex === 1 ? "dark" : "light"; + Settings.data.colorSchemes.darkMode = currentIndex === 1; + } + + NTabButton { + text: I18n.tr("wallpaper.panel.appearance-light-tab") + tabIndex: 0 + checked: appearanceTabBar.currentIndex === 0 + } + NTabButton { + text: I18n.tr("wallpaper.panel.appearance-dark-tab") + tabIndex: 1 + checked: appearanceTabBar.currentIndex === 1 + } + } + // Monitor tabs NTabBar { id: screenTabBar @@ -437,13 +469,6 @@ SmartPanel { } } - NIconButton { - icon: Settings.data.colorSchemes.darkMode ? "moon" : "sun" - tooltipText: Settings.data.colorSchemes.darkMode ? I18n.tr("tooltips.switch-to-light-mode") : I18n.tr("tooltips.switch-to-dark-mode") - baseSize: Style.baseWidgetSize * 0.8 - onClicked: Settings.data.colorSchemes.darkMode = !Settings.data.colorSchemes.darkMode - } - NIconButton { icon: "color-swatch" tooltipText: Settings.data.colorSchemes.useWallpaperColors ? I18n.tr("wallpaper.panel.color-extraction-enabled") : I18n.tr("wallpaper.panel.color-extraction-disabled") @@ -651,18 +676,31 @@ SmartPanel { property bool isBrowseMode: Settings.data.wallpaper.viewMode === "browse" property int _browseScanGeneration: 0 - // Sort favorites to the top (only for non-directory items) + // Order: (1) favorites for the active Light/Dark tab, (2) favorites only for the other appearance, + // (3) everything else. Legacy favorites without "appearance" still match via WallpaperService (darkMode on entry). function sortFavoritesToTop(items) { - var favorited = []; - var nonFavorited = []; + var forThisAppearance = []; + var forOtherAppearance = []; + var rest = []; + var app = WallpaperService.wallpaperSelectionAppearance; for (var i = 0; i < items.length; i++) { - if (!items[i].isDirectory && WallpaperService.isFavorite(items[i].path)) { - favorited.push(items[i]); + var it = items[i]; + if (!it.isDirectory) { + var path = it.path; + var here = WallpaperService.isFavorite(path, app); + var any = WallpaperService.isFavorite(path); + if (here) { + forThisAppearance.push(it); + } else if (any) { + forOtherAppearance.push(it); + } else { + rest.push(it); + } } else { - nonFavorited.push(items[i]); + rest.push(it); } } - return favorited.concat(nonFavorited); + return forThisAppearance.concat(forOtherAppearance).concat(rest); } // Rebuild filteredItems and sync to wallpaperModel (full replacement, no animation). @@ -789,7 +827,13 @@ SmartPanel { target: WallpaperService function onWallpaperChanged(screenName, path) { if (targetScreen !== null && screenName === targetScreen.name) { - currentWallpaper = WallpaperService.getWallpaper(targetScreen.name); + currentWallpaper = WallpaperService.getWallpaperPathForSlot(targetScreen.name, WallpaperService.wallpaperSelectionAppearance); + } + } + function onWallpaperSelectionAppearanceChanged() { + if (targetScreen !== null) { + currentWallpaper = WallpaperService.getWallpaperPathForSlot(targetScreen.name, WallpaperService.wallpaperSelectionAppearance); + updateFiltered(false); } } function onWallpaperDirectoryChanged(screenName, directory) { @@ -823,7 +867,7 @@ SmartPanel { return; } - currentWallpaper = WallpaperService.getWallpaper(targetScreen.name); + currentWallpaper = WallpaperService.getWallpaperPathForSlot(targetScreen.name, WallpaperService.wallpaperSelectionAppearance); if (isBrowseMode) { // In browse mode, scan current directory for both files and directories @@ -854,8 +898,8 @@ SmartPanel { WallpaperService.setBrowsePath(targetScreen.name, path); } else { var screen = Settings.data.wallpaper.setWallpaperOnAllMonitors ? undefined : targetScreen.name; - WallpaperService.changeWallpaper(path, screen); - WallpaperService.applyFavoriteTheme(path, screen); + WallpaperService.changeWallpaper(path, screen, WallpaperService.wallpaperSelectionAppearance); + WallpaperService.applyFavoriteTheme(path, screen, WallpaperService.wallpaperSelectionAppearance); } } @@ -1077,7 +1121,7 @@ SmartPanel { property string wallpaperPath: model.path ?? "" property bool isDirectory: model.isDirectory ?? false property bool isSelected: !isDirectory && (wallpaperPath === currentWallpaper) - property bool isFavorited: !isDirectory && WallpaperService.isFavorite(wallpaperPath) + property bool isFavorited: !isDirectory && WallpaperService.isFavorite(wallpaperPath, WallpaperService.wallpaperSelectionAppearance) property string filename: model.name ?? wallpaperPath.split('/').pop() property string cachedPath: "" @@ -1240,7 +1284,7 @@ SmartPanel { TapHandler { onTapped: { - WallpaperService.toggleFavorite(wallpaperItem.wallpaperPath); + WallpaperService.toggleFavorite(wallpaperItem.wallpaperPath, WallpaperService.wallpaperSelectionAppearance); } } } @@ -1259,10 +1303,22 @@ SmartPanel { property int _favRevision: 0 property var favData: { _favRevision; - return WallpaperService.getFavorite(wallpaperItem.wallpaperPath); + WallpaperService.wallpaperSelectionAppearance; + return WallpaperService.getFavorite(wallpaperItem.wallpaperPath, WallpaperService.wallpaperSelectionAppearance); } property var colors: favData && favData.paletteColors ? favData.paletteColors : [] - property bool isDark: favData ? favData.darkMode : false + property bool isDark: { + if (!favData) { + return false; + } + if (favData.appearance === "dark") { + return true; + } + if (favData.appearance === "light") { + return false; + } + return favData.darkMode === true; + } Connections { target: WallpaperService @@ -1840,11 +1896,13 @@ SmartPanel { if (typeof WallhavenService !== "undefined") { WallhavenService.downloadWallpaper(wallpaper, function (success, localPath) { if (success) { + var whScreen = Settings.data.wallpaper.setWallpaperOnAllMonitors ? undefined : Quickshell.screens[currentScreenIndex].name; if (!Settings.data.wallpaper.setWallpaperOnAllMonitors && currentScreenIndex < Quickshell.screens.length) { - WallpaperService.changeWallpaper(localPath, Quickshell.screens[currentScreenIndex].name); + WallpaperService.changeWallpaper(localPath, Quickshell.screens[currentScreenIndex].name, WallpaperService.wallpaperSelectionAppearance); } else { - WallpaperService.changeWallpaper(localPath, undefined); + WallpaperService.changeWallpaper(localPath, undefined, WallpaperService.wallpaperSelectionAppearance); } + WallpaperService.applyFavoriteTheme(localPath, whScreen, WallpaperService.wallpaperSelectionAppearance); } }); } diff --git a/Services/Control/IPCService.qml b/Services/Control/IPCService.qml index a089481d5..13778f2bd 100644 --- a/Services/Control/IPCService.qml +++ b/Services/Control/IPCService.qml @@ -616,20 +616,16 @@ Singleton { function get(screen: string): string { if (screen === "all" || screen === "") { if (Quickshell.screens.length > 1) { - var map = {}; - Quickshell.screens.forEach(s => { - map[s.name] = WallpaperService.currentWallpapers[s.name] ?? ""; - }); - return JSON.stringify(map); + return JSON.stringify(WallpaperService.getWallpapersEffectiveMap()); } - return WallpaperService.currentWallpapers[Quickshell.screens[0].name] ?? ""; + return WallpaperService.getWallpaper(Quickshell.screens[0].name) ?? ""; } else { var found = Quickshell.screens.find(s => s.name === screen); if (!found) { Logger.w("IPC", "wallpaper get: unknown screen: " + screen); return ""; } - return WallpaperService.currentWallpapers[screen] ?? ""; + return WallpaperService.getWallpaper(screen) ?? ""; } } diff --git a/Services/UI/WallpaperService.qml b/Services/UI/WallpaperService.qml index 8a5ff6ab3..75a435794 100644 --- a/Services/UI/WallpaperService.qml +++ b/Services/UI/WallpaperService.qml @@ -56,6 +56,9 @@ Singleton { // Browse mode: track current browse path per screen (separate from root directory) property var currentBrowsePaths: ({}) + // Wallpaper panel: which appearance slot (light/dark) new selections apply to — like picking a monitor tab + property string wallpaperSelectionAppearance: "light" + // Signal emitted when browse path changes for a screen signal browsePathChanged(string screenName, string path) @@ -121,7 +124,7 @@ Singleton { } else { for (var i = 0; i < Quickshell.screens.length; i++) { var screenName = Quickshell.screens[i].name; - root.wallpaperChanged(screenName, currentWallpapers[screenName] || root.defaultWallpaper); + root.wallpaperChanged(screenName, root.getWallpaper(screenName) || root.defaultWallpaper); } } } @@ -138,6 +141,15 @@ Singleton { } } + Connections { + target: Settings.data.colorSchemes + function onDarkModeChanged() { + // Restore scheme from favorite for this light/dark slot before wallpaper refresh + root.reapplyFavoriteThemeForActiveWallpaper(); + root._notifyAllWallpapersChanged(); + } + } + Connections { target: WallhavenService function onWallpaperDownloaded() { @@ -167,6 +179,7 @@ Singleton { // Cache restore updates currentWallpapers without _setWallpaper, so wallpaperChanged does not fire. function _scheduleThemeSyncFromCachedWallpaper() { Qt.callLater(function () { + root.reapplyFavoriteThemeForActiveWallpaper(); if (Settings.data.colorSchemes.useWallpaperColors) { AppThemeService.generate(); } @@ -278,6 +291,153 @@ Singleton { Settings.data.wallpaper.useSolidColor = true; } + // ------------------------------------------------------------------- + // Per-screen wallpaper: persisted as { light, dark } (legacy string loads are normalized) + // ------------------------------------------------------------------- + function _isSplitWallpaperEntry(entry) { + if (!entry || typeof entry !== "object") { + return false; + } + return entry.light !== undefined || entry.dark !== undefined; + } + + function _pathsFromEntry(entry) { + if (!entry) { + return { + light: "", + dark: "" + }; + } + if (typeof entry === "string") { + return { + light: entry, + dark: entry + }; + } + return { + light: entry.light || "", + dark: entry.dark || "" + }; + } + + function _cloneWallpaperEntry(entry) { + if (typeof entry === "string") { + return { + light: entry, + dark: entry + }; + } + var p = _pathsFromEntry(entry); + return { + light: p.light, + dark: p.dark + }; + } + + function _entriesEqual(a, b) { + if (a === b) { + return true; + } + if (typeof a === "string" && typeof b === "string") { + return a === b; + } + if (typeof a === "string" || typeof b === "string") { + return false; + } + if (!_isSplitWallpaperEntry(a) || !_isSplitWallpaperEntry(b)) { + return false; + } + var pa = _pathsFromEntry(a); + var pb = _pathsFromEntry(b); + return pa.light === pb.light && pa.dark === pb.dark; + } + + function _entryToEffectivePath(entry) { + if (!entry) { + return ""; + } + if (typeof entry === "string") { + return entry; + } + var p = _pathsFromEntry(entry); + if (Settings.data.colorSchemes.darkMode) { + return p.dark || p.light || ""; + } + return p.light || p.dark || ""; + } + + function _normalizeAppearanceSlot(slot) { + return slot === "dark" ? "dark" : "light"; + } + + function _defaultAppearanceSlotForChange(slot) { + if (slot === "light" || slot === "dark") { + return slot; + } + return Settings.data.colorSchemes.darkMode ? "dark" : "light"; + } + + function getWallpaperPathForSlot(screenName, appearanceSlot) { + if (Settings.data.wallpaper.useSolidColor) { + return createSolidColorPath(Settings.data.wallpaper.solidColor.toString()); + } + var slot = _normalizeAppearanceSlot(appearanceSlot); + var entry = currentWallpapers[screenName]; + if (!entry) { + return ""; + } + var p = _pathsFromEntry(entry); + if (slot === "dark") { + return p.dark || p.light || ""; + } + return p.light || p.dark || ""; + } + + function getWallpapersEffectiveMap() { + var out = {}; + for (var i = 0; i < Quickshell.screens.length; i++) { + var n = Quickshell.screens[i].name; + out[n] = getWallpaper(n); + } + return out; + } + + function _ensureObjectWallpaperEntries() { + var names = {}; + Object.keys(currentWallpapers).forEach(function (k) { + names[k] = true; + }); + for (var i = 0; i < Quickshell.screens.length; i++) { + names[Quickshell.screens[i].name] = true; + } + Object.keys(names).forEach(function (name) { + var e = currentWallpapers[name]; + if (!e) { + return; + } + if (typeof e === "string") { + currentWallpapers[name] = { + light: e, + dark: e + }; + } else if (_isSplitWallpaperEntry(e)) { + var p = _pathsFromEntry(e); + currentWallpapers[name] = { + light: p.light || p.dark || "", + dark: p.dark || p.light || "" + }; + } + }); + saveTimer.restart(); + } + + function _notifyAllWallpapersChanged() { + for (var i = 0; i < Quickshell.screens.length; i++) { + var n = Quickshell.screens[i].name; + root.wallpaperChanged(n, getWallpaper(n)); + } + } + // ------------------------------------------------------------------- // Get specific monitor wallpaper data function getMonitorConfig(screenName) { @@ -346,8 +506,12 @@ Singleton { if (Settings.data.wallpaper.useSolidColor) { return createSolidColorPath(Settings.data.wallpaper.solidColor.toString()); } - if (currentWallpapers[screenName]) { - return currentWallpapers[screenName]; + var entry = currentWallpapers[screenName]; + if (entry) { + var effective = _entryToEffectivePath(entry); + if (effective) { + return effective; + } } // Try to inherit wallpaper from another active screen @@ -360,39 +524,79 @@ Singleton { } // ------------------------------------------------------------------- - function changeWallpaper(path, screenName) { + function changeWallpaper(path, screenName, appearanceSlot) { // Turn off solid color mode when selecting a wallpaper if (Settings.data.wallpaper.useSolidColor) { Settings.data.wallpaper.useSolidColor = false; } + var slot = _defaultAppearanceSlotForChange(appearanceSlot); + // Save current favorite color schemes before switching away. // This must happen before applyFavoriteTheme (called by the UI) // overwrites the settings that _createFavoriteEntry reads. - _saveOutgoingFavorites(path, screenName); + _saveOutgoingFavorites(path, screenName, slot); if (screenName !== undefined) { - _setWallpaper(screenName, path); + _setWallpaper(screenName, path, slot); } else { var allScreenNames = new Set(Object.keys(currentWallpapers)); for (var i = 0; i < Quickshell.screens.length; i++) { allScreenNames.add(Quickshell.screens[i].name); } - allScreenNames.forEach(name => _setWallpaper(name, path)); + allScreenNames.forEach(name => _setWallpaper(name, path, slot)); } } // ------------------------------------------------------------------- // Save the color scheme of any favorited wallpapers that are about // to be replaced, while the current settings still reflect them. - function _saveOutgoingFavorites(newPath, screenName) { - var outgoing = screenName !== undefined ? [currentWallpapers[screenName]] : Object.values(currentWallpapers); + function _saveOutgoingFavorites(newPath, screenName, appearanceSlot) { + var paths = []; + var slot = _normalizeAppearanceSlot(appearanceSlot); - var unique = [...new Set(outgoing)]; + function collectFromEntry(e) { + if (!e) { + return; + } + if (typeof e === "string") { + if (e && e !== newPath) { + paths.push(e); + } + return; + } + if (!_isSplitWallpaperEntry(e)) { + return; + } + var p = _pathsFromEntry(e); + var old = slot === "dark" ? p.dark : p.light; + if (old && old !== newPath) { + paths.push(old); + } + } + + if (screenName !== undefined) { + collectFromEntry(currentWallpapers[screenName]); + } else { + var names = new Set(Object.keys(currentWallpapers)); + for (var i = 0; i < Quickshell.screens.length; i++) { + names.add(Quickshell.screens[i].name); + } + names.forEach(function (name) { + collectFromEntry(currentWallpapers[name]); + }); + } + + var unique = []; + for (var j = 0; j < paths.length; j++) { + if (unique.indexOf(paths[j]) === -1) { + unique.push(paths[j]); + } + } unique.forEach(function (path) { - if (path && path !== newPath && isFavorite(path)) { - updateFavoriteColorScheme(path); + if (path && path !== newPath && isFavorite(path, slot)) { + updateFavoriteColorScheme(path, slot); } }); } @@ -401,15 +605,29 @@ Singleton { function _inheritWallpaperFromExistingScreen(screenName) { for (var i = 0; i < Quickshell.screens.length; i++) { var otherName = Quickshell.screens[i].name; - if (otherName !== screenName && currentWallpapers[otherName]) { - _setWallpaper(screenName, currentWallpapers[otherName]); - return currentWallpapers[otherName]; + if (otherName === screenName) { + continue; } + var entry = currentWallpapers[otherName]; + if (!entry) { + continue; + } + var cloned = _cloneWallpaperEntry(entry); + if (_entriesEqual(currentWallpapers[screenName], cloned)) { + return _entryToEffectivePath(cloned); + } + currentWallpapers[screenName] = cloned; + saveTimer.restart(); + root.wallpaperChanged(screenName, _entryToEffectivePath(cloned)); + if (randomWallpaperTimer.running) { + randomWallpaperTimer.restart(); + } + return _entryToEffectivePath(cloned); } return ""; } - function _setWallpaper(screenName, path) { + function _setWallpaper(screenName, path, appearanceSlot) { if (path === "" || path === undefined) { return; } @@ -419,21 +637,30 @@ Singleton { return; } - var oldPath = currentWallpapers[screenName] || ""; - if (oldPath === path) { + var slot = _normalizeAppearanceSlot(appearanceSlot); + var oldEntry = currentWallpapers[screenName]; + var p = _pathsFromEntry(oldEntry); + var newEntry; + if (slot === "dark") { + newEntry = { + light: p.light || p.dark || path, + dark: path + }; + } else { + newEntry = { + light: path, + dark: p.dark || p.light || path + }; + } + + if (_entriesEqual(oldEntry, newEntry)) { return; } - // Update cache directly - currentWallpapers[screenName] = path; - - // Save to cache file with debounce + currentWallpapers[screenName] = newEntry; saveTimer.restart(); + root.wallpaperChanged(screenName, _entryToEffectivePath(newEntry)); - // Emit signal for this specific wallpaper change - root.wallpaperChanged(screenName, path); - - // Restart the random wallpaper timer if (randomWallpaperTimer.running) { randomWallpaperTimer.restart(); } @@ -534,7 +761,7 @@ Singleton { // Get or initialize index for this screen if (alphabeticalIndices[screenName] === undefined) { // Find current wallpaper in list to set initial index - var currentWallpaper = currentWallpapers[screenName] || ""; + var currentWallpaper = getWallpaper(screenName) || ""; var foundIndex = wallpaperList.indexOf(currentWallpaper); alphabeticalIndices[screenName] = (foundIndex >= 0) ? foundIndex : 0; } @@ -556,7 +783,7 @@ Singleton { var key = "all"; if (alphabeticalIndices[key] === undefined) { // Find current wallpaper in list to set initial index - var currentWallpaper = currentWallpapers[Screen.name] || ""; + var currentWallpaper = getWallpaper(Screen.name) || ""; var foundIndex = wallpaperList.indexOf(currentWallpaper); alphabeticalIndices[key] = (foundIndex >= 0) ? foundIndex : 0; } @@ -920,7 +1147,7 @@ Singleton { // Reset alphabetical indices when list changes if (alphabeticalIndices[screenName] !== undefined) { - var currentWallpaper = currentWallpapers[screenName] || ""; + var currentWallpaper = getWallpaper(screenName) || ""; var foundIndex = files.indexOf(currentWallpaper); alphabeticalIndices[screenName] = (foundIndex >= 0) ? foundIndex : 0; } @@ -968,10 +1195,32 @@ Singleton { readonly property int _favoriteNotFound: -1 // ------------------------------------------------------------------- - function _findFavoriteIndex(path) { + function _favoriteAppearanceSlot(f) { + if (f.appearance === "light" || f.appearance === "dark") { + return f.appearance; + } + return f.darkMode ? "dark" : "light"; + } + + function _findFavoriteIndex(path, appearanceSlot) { var favorites = Settings.data.wallpaper.favorites; var searchPath = Settings.preprocessPath(path); + var slot = _normalizeAppearanceSlot(appearanceSlot); + for (var i = 0; i < favorites.length; i++) { + if (Settings.preprocessPath(favorites[i].path) !== searchPath) { + continue; + } + if (_favoriteAppearanceSlot(favorites[i]) === slot) { + return i; + } + } + return _favoriteNotFound; + } + + function _findAnyFavoriteIndexForPath(path) { + var favorites = Settings.data.wallpaper.favorites; + var searchPath = Settings.preprocessPath(path); for (var i = 0; i < favorites.length; i++) { if (Settings.preprocessPath(favorites[i].path) === searchPath) { return i; @@ -981,11 +1230,13 @@ Singleton { } // ------------------------------------------------------------------- - function _createFavoriteEntry(path) { + function _createFavoriteEntry(path, appearanceSlot) { + var app = _normalizeAppearanceSlot(appearanceSlot); return { "path": path, + "appearance": app, "colorScheme": Settings.data.colorSchemes.predefinedScheme, - "darkMode": Settings.data.colorSchemes.darkMode, + "darkMode": app === "dark", "useWallpaperColors": Settings.data.colorSchemes.useWallpaperColors, "generationMethod": Settings.data.colorSchemes.generationMethod, "paletteColors": [Color.mPrimary.toString(), Color.mSecondary.toString(), Color.mTertiary.toString(), Color.mError.toString()] @@ -993,37 +1244,97 @@ Singleton { } // ------------------------------------------------------------------- - function isFavorite(path) { - return _findFavoriteIndex(path) !== _favoriteNotFound; + function isFavorite(path, appearanceSlot) { + if (appearanceSlot === undefined || appearanceSlot === null || appearanceSlot === "") { + return _findAnyFavoriteIndexForPath(path) !== _favoriteNotFound; + } + return _findFavoriteIndex(path, appearanceSlot) !== _favoriteNotFound; } // ------------------------------------------------------------------- - function getFavorite(path) { - var favoriteIndex = _findFavoriteIndex(path); - if (favoriteIndex === _favoriteNotFound) + function getFavorite(path, appearanceSlot) { + var slot; + if (appearanceSlot !== undefined && appearanceSlot !== null && appearanceSlot !== "") { + slot = _normalizeAppearanceSlot(appearanceSlot); + } else { + slot = _normalizeAppearanceSlot(root.wallpaperSelectionAppearance); + } + var favoriteIndex = _findFavoriteIndex(path, slot); + if (favoriteIndex === _favoriteNotFound) { return null; + } return Settings.data.wallpaper.favorites[favoriteIndex]; } // ------------------------------------------------------------------- - function toggleFavorite(path) { + function toggleFavorite(path, appearanceSlot) { + var slot; + if (appearanceSlot !== undefined && appearanceSlot !== null && appearanceSlot !== "") { + slot = _normalizeAppearanceSlot(appearanceSlot); + } else { + slot = _normalizeAppearanceSlot(root.wallpaperSelectionAppearance); + } var favorites = Settings.data.wallpaper.favorites.slice(); - var existingIndex = _findFavoriteIndex(path); + var existingIndex = _findFavoriteIndex(path, slot); if (existingIndex !== _favoriteNotFound) { favorites.splice(existingIndex, 1); - Logger.d("Wallpaper", "Removed favorite:", path); + Logger.d("Wallpaper", "Removed favorite:", path, slot); } else { - favorites.push(_createFavoriteEntry(path)); - Logger.d("Wallpaper", "Added favorite:", path); + favorites.push(_createFavoriteEntry(path, slot)); + Logger.d("Wallpaper", "Added favorite:", path, slot); } Settings.data.wallpaper.favorites = favorites; favoritesChanged(path); } + // Apply saved scheme from a favorite entry (path + appearance must already match the slot you care about). + function _applyFavoriteThemeFromEntry(favorite) { + if (!favorite) { + return; + } + + var favApp = _favoriteAppearanceSlot(favorite); + var targetDark = favApp === "dark"; + + var generationMethodChanging = Settings.data.colorSchemes.generationMethod !== favorite.generationMethod; + var darkModeChanging = Settings.data.colorSchemes.darkMode !== targetDark; + var useWallpaperColorsChanging = Settings.data.colorSchemes.useWallpaperColors !== favorite.useWallpaperColors; + + Settings.data.colorSchemes.useWallpaperColors = favorite.useWallpaperColors; + Settings.data.colorSchemes.predefinedScheme = favorite.colorScheme; + Settings.data.colorSchemes.generationMethod = favorite.generationMethod; + Settings.data.colorSchemes.darkMode = targetDark; + + // If nothing triggered AppThemeService via change handlers, regenerate once. + if (!generationMethodChanging && !darkModeChanging && !useWallpaperColorsChanging) { + AppThemeService.generate(); + } else if (!generationMethodChanging && !darkModeChanging && useWallpaperColorsChanging) { + AppThemeService.generate(); + } + } + + // When light/dark changes (or on startup), re-load scheme from the favorite for the wallpaper now shown for that slot. + function reapplyFavoriteThemeForActiveWallpaper() { + var effectiveMonitor = Settings.data.colorSchemes.monitorForColors; + if (effectiveMonitor === "" || effectiveMonitor === undefined) { + effectiveMonitor = Quickshell.screens.length > 0 ? Quickshell.screens[0].name : ""; + } + var wp = getWallpaper(effectiveMonitor); + if (!wp || isSolidColorPath(wp)) { + return; + } + var slot = Settings.data.colorSchemes.darkMode ? "dark" : "light"; + var favorite = getFavorite(wp, slot); + if (!favorite) { + return; + } + _applyFavoriteThemeFromEntry(favorite); + } + // ------------------------------------------------------------------- - function applyFavoriteTheme(path, screenName) { + function applyFavoriteTheme(path, screenName, appearanceSlot) { // Only apply theme if the wallpaper is on the monitor driving colors var effectiveMonitor = Settings.data.colorSchemes.monitorForColors; if (effectiveMonitor === "" || effectiveMonitor === undefined) { @@ -1033,37 +1344,32 @@ Singleton { return; } - var favorite = getFavorite(path); - if (!favorite) - return; - - // Track which auto-triggered properties are changing to avoid redundant generation calls - var generationMethodChanging = Settings.data.colorSchemes.generationMethod !== favorite.generationMethod; - var darkModeChanging = Settings.data.colorSchemes.darkMode !== favorite.darkMode; - - // Update settings to match the favorite's saved color scheme - Settings.data.colorSchemes.useWallpaperColors = favorite.useWallpaperColors; - Settings.data.colorSchemes.predefinedScheme = favorite.colorScheme; - Settings.data.colorSchemes.generationMethod = favorite.generationMethod; - Settings.data.colorSchemes.darkMode = favorite.darkMode; - - // Only explicitly trigger generation if the auto-triggered properties didn't change. - // If generationMethod or darkMode changed, their change handlers already called generate(). - if (!generationMethodChanging && !darkModeChanging) { - AppThemeService.generate(); + var slot; + if (appearanceSlot !== undefined && appearanceSlot !== null && appearanceSlot !== "") { + slot = _normalizeAppearanceSlot(appearanceSlot); + } else { + slot = _normalizeAppearanceSlot(root.wallpaperSelectionAppearance); } + var favorite = getFavorite(path, slot); + if (!favorite) { + return; + } + + _applyFavoriteThemeFromEntry(favorite); } // ------------------------------------------------------------------- - function updateFavoriteColorScheme(path) { - var existingIndex = _findFavoriteIndex(path); - if (existingIndex === _favoriteNotFound) + function updateFavoriteColorScheme(path, appearanceSlot) { + var slot = _normalizeAppearanceSlot(appearanceSlot); + var existingIndex = _findFavoriteIndex(path, slot); + if (existingIndex === _favoriteNotFound) { return; + } var favorites = Settings.data.wallpaper.favorites.slice(); - favorites[existingIndex] = _createFavoriteEntry(favorites[existingIndex].path); + favorites[existingIndex] = _createFavoriteEntry(favorites[existingIndex].path, slot); Settings.data.wallpaper.favorites = favorites; - Logger.d("Wallpaper", "Updated color scheme for favorite:", path); + Logger.d("Wallpaper", "Updated color scheme for favorite:", path, slot); favoriteDataUpdated(path); } @@ -1086,8 +1392,9 @@ Singleton { effectiveMonitor = Quickshell.screens.length > 0 ? Quickshell.screens[0].name : ""; } var wp = getWallpaper(effectiveMonitor); - if (wp && isFavorite(wp)) { - updateFavoriteColorScheme(wp); + var app = Settings.data.colorSchemes.darkMode ? "dark" : "light"; + if (wp && isFavorite(wp, app)) { + updateFavoriteColorScheme(wp, app); } } @@ -1123,6 +1430,8 @@ Singleton { root.currentWallpapers = wallpaperCacheAdapter.wallpapers || {}; root.usedRandomWallpapers = wallpaperCacheAdapter.usedRandomWallpapers || {}; + root._ensureObjectWallpaperEntries(); + // Load default wallpaper from cache if it exists, otherwise use Noctalia default if (wallpaperCacheAdapter.defaultWallpaper && wallpaperCacheAdapter.defaultWallpaper !== "") { root.defaultWallpaper = wallpaperCacheAdapter.defaultWallpaper;