SettingsWindow: add i18n support

This commit is contained in:
Ly-sec
2025-09-24 13:20:49 +02:00
parent 31db195087
commit 2285a3fb18
19 changed files with 1760 additions and 382 deletions
+658
View File
@@ -0,0 +1,658 @@
{
"settings": {
"general": {
"title": "Allgemein",
"profile": {
"section": {
"label": "Profil",
"description": "Bearbeite deine Benutzerdaten und deinen Avatar."
},
"picture": {
"label": "{user}s Profilbild",
"description": "Dein Profilbild, das überall in der Oberfläche angezeigt wird."
},
"select-avatar": "Avatar-Bild auswählen"
},
"ui": {
"section": {
"label": "Benutzeroberfläche",
"description": "Passe Aussehen, Gefühl und Verhalten der Oberfläche an."
},
"dim-desktop": {
"label": "Desktop abdunkeln",
"description": "Desktop abdunkeln, wenn Panels oder Menüs geöffnet sind."
},
"border-radius": {
"label": "Eckenrundung",
"description": "Bestimmt die Rundung von Fenstern, Buttons und anderen Elementen."
},
"animation-speed": {
"label": "Animationsgeschwindigkeit",
"description": "Globale Animationsgeschwindigkeit anpassen."
}
},
"screen-corners": {
"section": {
"label": "Bildschirmecken",
"description": "Rundung und visuelle Effekte der Bildschirmecken anpassen."
},
"show-corners": {
"label": "Bildschirmecken anzeigen",
"description": "Gerundete Ecken am Bildschirmrand anzeigen."
},
"solid-black": {
"label": "Durchgehend schwarze Ecken",
"description": "Verwende durchgehend schwarz statt der Hintergrundfarbe der Statusleiste."
}
},
"fonts": {
"section": {
"label": "Schriftarten",
"description": "Wähle die Schriftarten für die gesamte Oberfläche."
},
"default": {
"label": "Standard-Schriftart",
"description": "Hauptschriftart für die gesamte Oberfläche.",
"placeholder": "Standard-Schriftart auswählen...",
"search-placeholder": "Schriftarten durchsuchen..."
},
"monospace": {
"label": "Monospace-Schriftart",
"description": "Monospace-Schriftart für Zahlen und Statistiken.",
"placeholder": "Monospace-Schriftart auswählen...",
"search-placeholder": "Monospace-Schriftarten durchsuchen..."
},
"accent": {
"label": "Akzent-Schriftart",
"description": "Große Schriftart für prominente Anzeigen.",
"placeholder": "Display-Schriftart auswählen...",
"search-placeholder": "Display-Schriftarten durchsuchen..."
}
}
},
"audio": {
"title": "Audio",
"volumes": {
"section": {
"label": "Lautstärke",
"description": "Lautstärke-Einstellungen und Audiopegel anpassen."
},
"output-volume": {
"label": "Ausgabe-Lautstärke",
"description": "Systemweite Lautstärke."
},
"mute-output": {
"label": "Audio-Ausgabe stumm",
"description": "Haupt-Audio-Ausgabe des Systems stummschalten."
},
"input-volume": {
"label": "Eingabe-Lautstärke",
"description": "Mikrofon-Eingangslautstärke."
},
"mute-input": {
"label": "Audio-Eingabe stumm",
"description": "Standard-Audio-Eingang (Mikrofon) stummschalten."
},
"step-size": {
"label": "Lautstärke-Schrittgröße",
"description": "Schrittgröße für Lautstärkeänderungen (Mausrad, Tastenkürzel)."
}
},
"devices": {
"section": {
"label": "Audio-Geräte",
"description": "Verfügbare Audio-Ein- und Ausgabegeräte konfigurieren."
},
"output-device": {
"label": "Ausgabegerät",
"description": "Gewünschtes Audio-Ausgabegerät auswählen."
},
"input-device": {
"label": "Eingabegerät",
"description": "Gewünschtes Audio-Eingabegerät auswählen."
}
},
"media": {
"section": {
"label": "Media Player",
"description": "Bevorzugte und ignorierte Media-Anwendungen festlegen."
},
"primary-player": {
"label": "Haupt-Player",
"description": "Stichwort eingeben, um deinen Haupt-Player zu identifizieren.",
"placeholder": "z.B. spotify, vlc, mpv"
},
"excluded-player": {
"label": "Ausgeschlossene Player",
"description": "Stichwörter für Player hinzufügen, die das System ignorieren soll. Jedes Stichwort in eine neue Zeile.",
"placeholder": "Teilstring eingeben und + drücken"
},
"visualizer-type": {
"label": "Visualisierung",
"description": "Visualisierung für Media-Wiedergabe auswählen"
},
"frame-rate": {
"label": "Bildrate",
"description": "Höhere Raten sind flüssiger, brauchen aber mehr Ressourcen."
}
}
},
"display": {
"title": "Display",
"monitors": {
"section": {
"label": "Monitor-Einstellungen",
"description": "Skalierung und Helligkeit für jeden Bildschirm anpassen."
},
"scale": "Skalierung",
"brightness": "Helligkeit",
"reset-scaling": "Skalierung zurücksetzen",
"brightness-step": {
"label": "Helligkeits-Schrittgröße",
"description": "Schrittgröße für Helligkeitsänderungen (Mausrad und Tastenkürzel)."
}
},
"night-light": {
"section": {
"label": "Nachtlicht",
"description": "Blaues Licht reduzieren für besseren Schlaf und weniger Augenbelastung."
},
"enable": {
"label": "Nachtlicht aktivieren",
"description": "Warmen Farbfilter anwenden, um blaues Licht zu reduzieren."
},
"temperature": {
"label": "Farbtemperatur",
"description": "Farbwärme für Nacht- und Tageszeit einstellen.",
"night": "Nacht",
"day": "Tag"
},
"auto-schedule": {
"label": "Automatische Zeiten",
"description": "Basiert auf Sonnenuntergang und -aufgang in <i>{location}</i> - empfohlen."
},
"manual-schedule": {
"label": "Manuelle Zeiten",
"description": "Eigene Zeiten für Sonnenauf- und -untergang festlegen.",
"sunrise": "Sonnenaufgang",
"sunset": "Sonnenuntergang",
"select-start": "Startzeit auswählen",
"select-stop": "Endzeit auswählen"
},
"force-activation": {
"label": "Sofort aktivieren",
"description": "Ignoriert den Zeitplan und wendet den Nachtfilter sofort an."
}
}
},
"bar": {
"title": "Statusleiste",
"appearance": {
"section": {
"label": "Aussehen",
"description": "Aussehen und Position der Statusleiste anpassen."
},
"position": {
"label": "Statusleistenposition",
"description": "Wähle, wo die Statusleiste auf dem Bildschirm platziert wird."
},
"density": {
"label": "Statusleistendichte",
"description": "Innenabstand der Statusleiste für kompaktes oder geräumiges Aussehen anpassen."
},
"background-opacity": {
"label": "Hintergrund-Transparenz",
"description": "Transparenz des Statusleistenhintergrunds anpassen."
},
"show-capsule": {
"label": "Kapsel anzeigen",
"description": "Widget-Hintergründe anzeigen."
},
"floating": {
"label": "Schwebende Statusleiste",
"description": "Statusleiste als schwebende 'Pille' anzeigen. Hinweis: Dadurch werden die Bildschirmecken an die Ränder verschoben."
},
"margins": {
"label": "Ränder",
"description": "Ränder um die schwebende Statusleiste anpassen.",
"vertical": "Vertikal",
"horizontal": "Horizontal"
}
},
"widgets": {
"section": {
"label": "Widget-Positionierung",
"description": "Widgets per Drag & Drop innerhalb jeder Sektion neu ordnen oder mit den Hinzufügen/Entfernen-Buttons verwalten."
}
},
"monitors": {
"section": {
"label": "Monitor-Anzeige",
"description": "Statusleiste auf bestimmten Monitoren anzeigen. Standard ist alle, wenn keine ausgewählt."
}
}
},
"dock": {
"title": "Dock",
"appearance": {
"section": {
"label": "Aussehen",
"description": "Verhalten und Aussehen des Docks anpassen."
},
"auto-hide": {
"label": "Automatisch ausblenden",
"description": "Automatisch ausblenden, wenn nicht verwendet."
},
"exclusive-zone": {
"label": "Exklusivbereich",
"description": "Fensterüberlappung verhindern."
},
"background-opacity": {
"label": "Hintergrund-Transparenz",
"description": "Transparenz des Dock-Hintergrunds anpassen."
},
"floating-distance": {
"label": "Schwebeabstand",
"description": "Schwebeabstand vom Bildschirmrand anpassen."
}
},
"monitors": {
"section": {
"label": "Monitor-Anzeige",
"description": "Monitor auswählen, auf dem das Dock angezeigt wird."
}
}
},
"launcher": {
"title": "Starter",
"settings": {
"section": {
"label": "Aussehen",
"description": "Verhalten und Aussehen des Starters anpassen."
},
"position": {
"label": "Position",
"description": "Wähle, wo das Starter-Panel erscheint."
},
"background-opacity": {
"label": "Hintergrund-Transparenz",
"description": "Transparenz des Starter-Hintergrunds anpassen."
},
"clipboard-history": {
"label": "Zwischenablage-Verlauf aktivieren",
"description": "Auf zuvor kopierte Inhalte über den Starter zugreifen."
},
"sort-by-usage": {
"label": "Nach Nutzung sortieren",
"description": "Wenn aktiviert, erscheinen häufig gestartete Apps zuerst in der Liste."
},
"use-app2unit": {
"label": "App2Unit zum Starten verwenden",
"description": "Verwendet eine alternative Startmethode für bessere Prozessverwaltung und weniger Probleme."
}
}
},
"notifications": {
"title": "Benachrichtigungen",
"settings": {
"section": {
"label": "Aussehen",
"description": "Aussehen und Verhalten von Benachrichtigungen konfigurieren."
},
"do-not-disturb": {
"label": "Nicht stören",
"description": "Alle Benachrichtigungs-Popups deaktivieren, wenn aktiviert."
},
"enable-osd": {
"label": "Bildschirmanzeige aktivieren",
"description": "Lautstärke- und Helligkeitsänderungen in Echtzeit anzeigen."
},
"location": {
"label": "Position",
"description": "Wo Benachrichtigungen auf dem Bildschirm erscheinen."
},
"low-urgency": {
"label": "Niedrige Priorität",
"description": "Wie lange Benachrichtigungen niedriger Priorität sichtbar bleiben."
},
"normal-urgency": {
"label": "Normale Priorität",
"description": "Wie lange Benachrichtigungen normaler Priorität sichtbar bleiben."
},
"critical-urgency": {
"label": "Kritische Priorität",
"description": "Wie lange kritische Benachrichtigungen sichtbar bleiben."
},
"monitors-display": {
"label": "Monitor-Anzeige",
"description": "Benachrichtigungen auf bestimmten Monitoren anzeigen. Standard ist alle, wenn keine ausgewählt."
}
}
},
"wallpaper": {
"title": "Hintergrundbild",
"settings": {
"section": {
"label": "Hintergrundbild-Einstellungen",
"description": "Verwaltung und Anzeige von Hintergrundbildern steuern."
},
"enable-management": {
"label": "Hintergrundbild-Verwaltung aktivieren",
"description": "Hintergrundbilder mit Noctalia verwalten. Deaktivieren, wenn du eine andere Anwendung bevorzugst."
},
"folder": {
"label": "Hintergrundbild-Ordner",
"description": "Pfad zu deinem Haupt-Hintergrundbild-Ordner.",
"tooltip": "Nach Hintergrundbild-Ordner suchen"
},
"monitor-specific": {
"label": "Monitor-spezifische Verzeichnisse",
"description": "Anderen Hintergrundbild-Ordner für jeden Monitor festlegen.",
"tooltip": "Nach Monitor-Hintergrundbild-Ordner suchen"
},
"select-folder": "Hintergrundbild-Ordner auswählen",
"select-monitor-folder": "Monitor-Hintergrundbild-Ordner auswählen"
},
"look-feel": {
"section": {
"label": "Aussehen"
},
"fill-mode": {
"label": "Füllmodus",
"description": "Wähle, wie das Bild an die Auflösung deines Monitors angepasst werden soll."
},
"fill-color": {
"label": "Füllfarbe",
"description": "Wähle eine Füllfarbe, die hinter dem Hintergrundbild erscheinen kann."
},
"transition-type": {
"label": "Übergangstyp",
"description": "Animationstyp beim Wechsel zwischen Hintergrundbildern."
},
"transition-duration": {
"label": "Übergangsdauer",
"description": "Dauer der Übergangsanimationen in Sekunden."
},
"edge-smoothness": {
"label": "Übergangskante weichzeichnen",
"description": "Wendet einen weichen, ausgefransten Effekt auf die Kante der Übergänge an."
}
},
"automation": {
"section": {
"label": "Automatisierung"
},
"random-wallpaper": {
"label": "Zufälliges Hintergrundbild",
"description": "Plane zufällige Hintergrundbild-Wechsel in regelmäßigen Abständen."
},
"interval": {
"label": "Hintergrundbild-Intervall",
"description": "Wie oft Hintergrundbilder automatisch gewechselt werden."
},
"custom-interval": {
"label": "Eigenes Intervall",
"description": "Zeit als HH:MM eingeben (z.B. 01:30)."
}
}
},
"color-scheme": {
"title": "Farbschema",
"color-source": {
"section": {
"label": "Farbquelle",
"description": "Haupteinstellungen für Noctalias Farben."
},
"dark-mode": {
"label": "Dunkler Modus",
"description": "Wechselt zu einem dunkleren Design für angenehmeres Sehen bei Nacht."
},
"enable-matugen": {
"label": "Matugen aktivieren",
"description": "Automatisch Farben basierend auf deinem aktiven Hintergrundbild generieren."
}
},
"predefined": {
"section": {
"label": "Vordefinierte Farbschemata",
"description": "Um diese Farbschemata zu verwenden, musst du Matugen deaktivieren. Mit aktiviertem Matugen werden Farben automatisch aus deinem Hintergrundbild generiert."
}
},
"matugen": {
"section": {
"label": "Matugen-Vorlagen",
"description": "Farben auf externe Anwendungen anwenden."
},
"ui": {
"label": "UI",
"description": "Desktop-Umgebung und UI-Toolkit-Theming.",
"gtk4": {
"label": "GTK 4 (libadwaita)",
"description": "Schreibt ~/.config/gtk-4.0/gtk.css"
},
"gtk3": {
"label": "GTK 3",
"description": "Schreibt ~/.config/gtk-3.0/gtk.css"
},
"qt6": {
"label": "Qt6ct",
"description": "Schreibt ~/.config/qt6ct/colors/noctalia.conf"
},
"qt5": {
"label": "Qt5ct",
"description": "Schreibt ~/.config/qt5ct/colors/noctalia.conf"
}
},
"terminal": {
"label": "Terminal",
"description": "Terminal-Emulator-Theming.",
"kitty": {
"label": "Kitty",
"description": "Schreibt ~/.config/kitty/themes/noctalia.conf und lädt neu",
"description-missing": "Erfordert installiertes kitty Terminal"
},
"ghostty": {
"label": "Ghostty",
"description": "Schreibt ~/.config/ghostty/themes/noctalia und lädt neu",
"description-missing": "Erfordert installiertes ghostty Terminal"
},
"foot": {
"label": "Foot",
"description": "Schreibt ~/.config/foot/themes/noctalia und lädt neu",
"description-missing": "Erfordert installiertes foot Terminal"
}
},
"programs": {
"label": "Programme",
"description": "Anwendungsspezifisches Theming.",
"fuzzel": {
"label": "Fuzzel",
"description": "Schreibt ~/.config/fuzzel/themes/noctalia und lädt neu",
"description-missing": "Erfordert installierten fuzzel Launcher"
},
"vesktop": {
"label": "Vesktop",
"description": "Schreibt ~/.config/vesktop/themes/noctalia.theme.css",
"description-missing": "Erfordert installierten vesktop Discord-Client"
},
"pywalfox": {
"label": "Pywalfox (Firefox)",
"description": "Schreibt ~/.cache/wal/colors.json und führt pywalfox update aus",
"description-missing": "Erfordert installiertes pywalfox Paket"
}
},
"misc": {
"label": "Sonstiges",
"description": "Weitere Konfigurationsoptionen.",
"user-templates": {
"label": "Benutzer-Vorlagen",
"description": "Benutzerdefinierte Matugen-Konfiguration aus ~/.config/matugen/config.toml aktivieren"
}
}
}
},
"location": {
"title": "Standort",
"location": {
"section": {
"label": "Dein Standort",
"description": "Genaues Wetter und Nachtlicht-Zeitplan durch Festlegen deines Standorts erhalten."
},
"search": {
"label": "Nach Standort suchen",
"description": "z.B. Berlin, DE",
"placeholder": "Ortsnamen eingeben"
}
},
"weather": {
"section": {
"label": "Wetter",
"description": "Wähle deine bevorzugte Temperatureinheit."
},
"fahrenheit": {
"label": "Temperatur in Fahrenheit (°F) anzeigen",
"description": "Temperatur in Fahrenheit statt Celsius anzeigen."
}
},
"date-time": {
"section": {
"label": "Datum & Zeit",
"description": "Anpassen, wie Datum und Zeit angezeigt werden."
},
"12hour-format": {
"label": "12-Stunden-Format auf dem Sperrbildschirm verwenden",
"description": "An für AM/PM-Format (z.B. 8:00 PM), aus für 24-Stunden-Format (z.B. 20:00)."
},
"week-numbers": {
"label": "Wochennummern anzeigen",
"description": "Zeigt die Woche des Jahres (z.B. Woche 38) im Kalender an."
}
}
},
"network": {
"title": "Netzwerk",
"section": {
"description": "Wi-Fi- und Bluetooth-Verbindungen verwalten."
},
"wifi": {
"label": "Wi-Fi aktivieren"
},
"bluetooth": {
"label": "Bluetooth aktivieren"
}
},
"screen-recorder": {
"title": "Bildschirmaufnahme",
"general": {
"section": {
"label": "Allgemeine Einstellungen",
"description": "Ausgabe und Inhalt der Bildschirmaufnahme verwalten."
},
"output-folder": {
"label": "Ausgabe-Ordner",
"description": "Ordner, in dem Bildschirmaufnahmen gespeichert werden.",
"tooltip": "Nach Ausgabe-Ordner suchen"
},
"show-cursor": {
"label": "Cursor anzeigen",
"description": "Mauszeiger im Video aufnehmen."
},
"select-output-folder": "Ausgabe-Ordner auswählen"
},
"video": {
"section": {
"label": "Video-Einstellungen",
"description": "Video-Aufnahmeoptionen konfigurieren."
},
"video-source": {
"label": "Video-Quelle",
"description": "Portal wird empfohlen, bei Artefakten versuche Screen."
},
"frame-rate": {
"label": "Bildrate",
"description": "Ziel-Bildrate für Bildschirmaufnahmen."
},
"video-quality": {
"label": "Video-Qualität",
"description": "Höhere Qualität führt zu größeren Dateien."
},
"video-codec": {
"label": "Video-Codec",
"description": "h264 ist der gängigste Codec."
},
"color-range": {
"label": "Farbbereich",
"description": "Begrenzt wird für bessere Kompatibilität empfohlen."
}
},
"audio": {
"section": {
"label": "Audio-Einstellungen",
"description": "Audio-Aufnahmeoptionen konfigurieren."
},
"audio-source": {
"label": "Audio-Quelle",
"description": "Audio-Quelle für die Aufnahme."
},
"audio-codec": {
"label": "Audio-Codec",
"description": "Opus wird für beste Performance und kleinste Audio-Dateigröße empfohlen."
}
}
},
"about": {
"title": "Über",
"noctalia": {
"section": {
"label": "Noctalia Shell",
"description": "Eine schlanke und minimalistische Desktop-Shell, durchdacht für Wayland entwickelt, gebaut mit Quickshell."
},
"latest-version": "Neueste Version:",
"installed-version": "Installierte Version:",
"download-latest": "Neueste Version herunterladen"
},
"contributors": {
"section": {
"label": "Mitwirkende",
"description": "Shoutout an unseren {count} <b>großartigen</b> Mitwirkenden!",
"description_plural": "Shoutout an unsere {count} <b>großartigen</b> Mitwirkenden!"
}
}
},
"hooks": {
"title": "Hooks",
"system-hooks": {
"section": {
"label": "System-Hooks",
"description": "Befehle konfigurieren, die bei Systemereignissen ausgeführt werden."
},
"enable": {
"label": "Hooks aktivieren",
"description": "Alle Hook-Befehle aktivieren oder deaktivieren."
}
},
"wallpaper-changed": {
"label": "Hintergrundbild geändert",
"description": "Befehl, der ausgeführt wird, wenn das Hintergrundbild wechselt.",
"placeholder": "z.B. notify-send \"Hintergrundbild\" \"Geändert\""
},
"theme-changed": {
"label": "Design geändert",
"description": "Befehl, der ausgeführt wird, wenn zwischen dunklem und hellem Modus gewechselt wird.",
"placeholder": "z.B. notify-send \"Design\" \"Gewechselt\""
},
"info": {
"command-info": {
"label": "Hook-Befehl-Informationen",
"description": "• Befehle werden über Shell ausgeführt (sh -c)\n• Befehle laufen im Hintergrund (detached)\n• Test-Buttons führen mit aktuellen Werten aus"
},
"parameters": {
"label": "Verfügbare Parameter",
"description": "• Hintergrundbild-Hook: $1 = Hintergrundbild-Pfad, $2 = Bildschirmname\n• Design-Wechsel-Hook: $1 = true/false (Dunkler-Modus-Status)"
}
}
}
}
}
+626 -1
View File
@@ -11,7 +11,8 @@
"picture": {
"label": "{user}'s Profile picture",
"description": "Your profile picture that appears throughout the interface."
}
},
"select-avatar": "Select avatar image"
},
"ui": {
@@ -26,6 +27,630 @@
"border-radius": {
"label": "Border radius",
"description": "Controls the corner roundness of windows, buttons, and other elements."
},
"animation-speed": {
"label": "Animation speed",
"description": "Adjust global animation speed."
}
},
"screen-corners": {
"section": {
"label": "Screen corners",
"description": "Customize screen corner rounding and visual effects."
},
"show-corners": {
"label": "Show screen corners",
"description": "Display rounded corners on the edge of the screen."
},
"solid-black": {
"label": "Solid black corners",
"description": "Use solid black instead of the bar background color."
}
},
"fonts": {
"section": {
"label": "Fonts",
"description": "Choose the fonts used throughout the interface."
},
"default": {
"label": "Default font",
"description": "Main font used throughout the interface.",
"placeholder": "Select default font...",
"search-placeholder": "Search fonts..."
},
"monospace": {
"label": "Monospaced font",
"description": "Monospaced font used for numbers and stats display.",
"placeholder": "Select monospace font...",
"search-placeholder": "Search monospace fonts..."
},
"accent": {
"label": "Accent font",
"description": "Large font used for prominent displays.",
"placeholder": "Select display font...",
"search-placeholder": "Search display fonts..."
}
}
},
"audio": {
"title": "Audio",
"volumes": {
"section": {
"label": "Volumes",
"description": "Adjust volume controls and audio levels."
},
"output-volume": {
"label": "Output volume",
"description": "System-wide volume level."
},
"mute-output": {
"label": "Mute audio output",
"description": "Mute the system's main audio output."
},
"input-volume": {
"label": "Input volume",
"description": "Microphone input volume level."
},
"mute-input": {
"label": "Mute audio input",
"description": "Mute the default audio input (microphone)."
},
"step-size": {
"label": "Volume step size",
"description": "Adjust the step size for volume changes (scroll wheel, keyboard shortcuts)."
}
},
"devices": {
"section": {
"label": "Audio devices",
"description": "Configure available audio input and output devices."
},
"output-device": {
"label": "Output device",
"description": "Select the desired audio output device."
},
"input-device": {
"label": "Input device",
"description": "Select the desired audio input device."
}
},
"media": {
"section": {
"label": "Media players",
"description": "Set your preferred and ignored media applications."
},
"primary-player": {
"label": "Primary player",
"description": "Enter a keyword to identify your main player.",
"placeholder": "e.g. spotify, vlc, mpv"
},
"excluded-player": {
"label": "Excluded player",
"description": "Add keywords for players you want the system to ignore. Each keyword should be on a new line.",
"placeholder": "type substring and press +"
},
"visualizer-type": {
"label": "Visualization type",
"description": "Choose a visualization type for media playback"
},
"frame-rate": {
"label": "Frame rate",
"description": "Higher rates are smoother but use more resources."
}
}
},
"display": {
"title": "Display",
"monitors": {
"section": {
"label": "Per-monitor settings",
"description": "Adjust scaling and brightness for each display."
},
"scale": "Scale",
"brightness": "Brightness",
"reset-scaling": "Reset scaling",
"brightness-step": {
"label": "Brightness step size",
"description": "Adjust the step size for brightness changes (scroll wheel and keyboard shortcuts)."
}
},
"night-light": {
"section": {
"label": "Night light",
"description": "Reduce blue light emission to help you sleep better and reduce eye strain."
},
"enable": {
"label": "Enable night light",
"description": "Apply a warm color filter to reduce blue light emission."
},
"temperature": {
"label": "Color temperature",
"description": "Set the color warmth for nighttime and daytime.",
"night": "Night",
"day": "Day"
},
"auto-schedule": {
"label": "Automatic scheduling",
"description": "Based on the sunset and sunrise time in <i>{location}</i> - recommended."
},
"manual-schedule": {
"label": "Manual scheduling",
"description": "Set custom times for sunrise and sunset.",
"sunrise": "Sunrise time",
"sunset": "Sunset time",
"select-start": "Select start time",
"select-stop": "Select stop time"
},
"force-activation": {
"label": "Force activation",
"description": "Ignores the schedule and applies the night filter immediately."
}
}
},
"bar": {
"title": "Bar",
"appearance": {
"section": {
"label": "Appearance",
"description": "Customize the bar's appearance and position."
},
"position": {
"label": "Bar position",
"description": "Choose where to place the bar on the screen."
},
"density": {
"label": "Bar density",
"description": "Adjust the bar's padding for a compact or spacious look."
},
"background-opacity": {
"label": "Background opacity",
"description": "Adjust the background opacity of the bar."
},
"show-capsule": {
"label": "Show capsule",
"description": "Show widget backgrounds."
},
"floating": {
"label": "Floating bar",
"description": "Displays the bar as a floating 'pill'. Note: This will move the screen corners to the edges."
},
"margins": {
"label": "Margins",
"description": "Adjust the margins around the floating bar.",
"vertical": "Vertical",
"horizontal": "Horizontal"
}
},
"widgets": {
"section": {
"label": "Widgets positioning",
"description": "Drag and drop widgets to reorder them within each section, or use the add/remove buttons to manage widgets."
}
},
"monitors": {
"section": {
"label": "Monitor display",
"description": "Show bar on specific monitors. Defaults to all if none are chosen."
}
}
},
"dock": {
"title": "Dock",
"appearance": {
"section": {
"label": "Appearance",
"description": "Customize the dock's behavior and appearance."
},
"auto-hide": {
"label": "Auto-hide",
"description": "Automatically hide when not in use."
},
"exclusive-zone": {
"label": "Exclusive zone",
"description": "Prevent window overlap."
},
"background-opacity": {
"label": "Background opacity",
"description": "Adjust the dock's background opacity."
},
"floating-distance": {
"label": "Dock floating distance",
"description": "Adjust the floating distance from the screen edge."
}
},
"monitors": {
"section": {
"label": "Monitor display",
"description": "Choose which monitor to display the dock on."
}
}
},
"launcher": {
"title": "Launcher",
"settings": {
"section": {
"label": "Appearance",
"description": "Customize the launcher's behavior and appearance."
},
"position": {
"label": "Position",
"description": "Choose where the launcher panel appears."
},
"background-opacity": {
"label": "Background opacity",
"description": "Adjust the background opacity of the launcher."
},
"clipboard-history": {
"label": "Enable clipboard history",
"description": "Access previously copied items from the launcher."
},
"sort-by-usage": {
"label": "Sort by most used",
"description": "When enabled, frequently launched apps appear first in the list."
},
"use-app2unit": {
"label": "Use App2Unit to launch applications",
"description": "Uses an alternative launch method to better manage app processes and prevent issues."
}
}
},
"notifications": {
"title": "Notifications",
"settings": {
"section": {
"label": "Appearance",
"description": "Configure notifications appearance and behavior."
},
"do-not-disturb": {
"label": "Do not disturb",
"description": "Disable all notification popups when enabled."
},
"enable-osd": {
"label": "Enable on screen display",
"description": "Show volume and brightness changes in real-time."
},
"location": {
"label": "Location",
"description": "Where notifications appear on screen."
},
"low-urgency": {
"label": "Low urgency",
"description": "How long low priority notifications stay visible."
},
"normal-urgency": {
"label": "Normal urgency",
"description": "How long normal priority notifications stay visible."
},
"critical-urgency": {
"label": "Critical urgency",
"description": "How long critical priority notifications stay visible."
},
"monitors-display": {
"label": "Monitors display",
"description": "Show notification on specific monitors. Defaults to all if none are chosen."
}
}
},
"wallpaper": {
"title": "Wallpaper",
"settings": {
"section": {
"label": "Wallpaper settings",
"description": "Control how wallpapers are managed and displayed."
},
"enable-management": {
"label": "Enable wallpaper management",
"description": "Manage wallpapers with Noctalia. Uncheck if you prefer using another application."
},
"folder": {
"label": "Wallpaper folder",
"description": "Path to your main wallpaper folder.",
"tooltip": "Browse for wallpaper folder"
},
"monitor-specific": {
"label": "Monitor-specific directories",
"description": "Set a different wallpaper folder for each monitor.",
"tooltip": "Browse for wallpaper folder"
},
"select-folder": "Select wallpaper folder",
"select-monitor-folder": "Select monitor wallpaper folder"
},
"look-feel": {
"section": {
"label": "Look & feel"
},
"fill-mode": {
"label": "Fill mode",
"description": "Select how the image should scale to match your monitor's resolution."
},
"fill-color": {
"label": "Fill color",
"description": "Choose a fill color that may appear behind the wallpaper."
},
"transition-type": {
"label": "Transition type",
"description": "Animation type when switching between wallpapers."
},
"transition-duration": {
"label": "Transition duration",
"description": "Duration of transition animations in seconds."
},
"edge-smoothness": {
"label": "Soften transition edge",
"description": "Applies a soft, feathered effect to the edge of transitions."
}
},
"automation": {
"section": {
"label": "Automation"
},
"random-wallpaper": {
"label": "Random wallpaper",
"description": "Schedule random wallpaper changes at regular intervals."
},
"interval": {
"label": "Wallpaper interval",
"description": "How often to change wallpapers automatically."
},
"custom-interval": {
"label": "Custom interval",
"description": "Enter time as HH:MM (e.g., 01:30)."
}
}
},
"color-scheme": {
"title": "Color scheme",
"color-source": {
"section": {
"label": "Color source",
"description": "Main settings for Noctalia's colors."
},
"dark-mode": {
"label": "Dark mode",
"description": "Switches to a darker theme for easier viewing at night."
},
"enable-matugen": {
"label": "Enable Matugen",
"description": "Automatically generate colors based on your active wallpaper."
}
},
"predefined": {
"section": {
"label": "Predefined color schemes",
"description": "To use these color schemes, you must turn off Matugen. With Matugen enabled, colors are automatically generated from your wallpaper."
}
},
"matugen": {
"section": {
"label": "Matugen templates",
"description": "Apply colors to external applications."
},
"ui": {
"label": "UI",
"description": "Desktop environment and UI toolkit theming.",
"gtk4": {
"label": "GTK 4 (libadwaita)",
"description": "Write ~/.config/gtk-4.0/gtk.css"
},
"gtk3": {
"label": "GTK 3",
"description": "Write ~/.config/gtk-3.0/gtk.css"
},
"qt6": {
"label": "Qt6ct",
"description": "Write ~/.config/qt6ct/colors/noctalia.conf"
},
"qt5": {
"label": "Qt5ct",
"description": "Write ~/.config/qt5ct/colors/noctalia.conf"
}
},
"terminal": {
"label": "Terminal",
"description": "Terminal emulator theming.",
"kitty": {
"label": "Kitty",
"description": "Write ~/.config/kitty/themes/noctalia.conf and reload",
"description-missing": "Requires kitty terminal to be installed"
},
"ghostty": {
"label": "Ghostty",
"description": "Write ~/.config/ghostty/themes/noctalia and reload",
"description-missing": "Requires ghostty terminal to be installed"
},
"foot": {
"label": "Foot",
"description": "Write ~/.config/foot/themes/noctalia and reload",
"description-missing": "Requires foot terminal to be installed"
}
},
"programs": {
"label": "Programs",
"description": "Application-specific theming.",
"fuzzel": {
"label": "Fuzzel",
"description": "Write ~/.config/fuzzel/themes/noctalia and reload",
"description-missing": "Requires fuzzel launcher to be installed"
},
"vesktop": {
"label": "Vesktop",
"description": "Write ~/.config/vesktop/themes/noctalia.theme.css",
"description-missing": "Requires vesktop Discord client to be installed"
},
"pywalfox": {
"label": "Pywalfox (Firefox)",
"description": "Write ~/.cache/wal/colors.json and run pywalfox update",
"description-missing": "Requires pywalfox package to be installed"
}
},
"misc": {
"label": "Misc",
"description": "Additional configuration options.",
"user-templates": {
"label": "User templates",
"description": "Enable user-defined Matugen config from ~/.config/matugen/config.toml"
}
}
}
},
"location": {
"title": "Location",
"location": {
"section": {
"label": "Your location",
"description": "Get accurate weather and night light scheduling by setting your location."
},
"search": {
"label": "Search for a location",
"description": "e.g., Toronto, ON",
"placeholder": "Enter the location name"
}
},
"weather": {
"section": {
"label": "Weather",
"description": "Choose your preferred temperature unit."
},
"fahrenheit": {
"label": "Display temperature in Fahrenheit (°F)",
"description": "Display temperature in Fahrenheit instead of Celsius."
}
},
"date-time": {
"section": {
"label": "Date & time",
"description": "Customize how date and time appear."
},
"12hour-format": {
"label": "Use 12-hour time format on the lock screen",
"description": "On for AM/PM format (e.g., 8:00 PM), off for 24-hour format (e.g., 20:00)."
},
"week-numbers": {
"label": "Show week numbers",
"description": "Displays the week of the year (e.g., Week 38) in the calendar."
}
}
},
"network": {
"title": "Network",
"section": {
"description": "Manage Wi-Fi and Bluetooth connections."
},
"wifi": {
"label": "Enable Wi-Fi"
},
"bluetooth": {
"label": "Enable Bluetooth"
}
},
"screen-recorder": {
"title": "Screen recorder",
"general": {
"section": {
"label": "General settings",
"description": "Manage screen recording output and content."
},
"output-folder": {
"label": "Output folder",
"description": "Folder where screen recordings will be saved.",
"tooltip": "Browse for output folder"
},
"show-cursor": {
"label": "Show cursor",
"description": "Record mouse cursor in the video."
},
"select-output-folder": "Select output folder"
},
"video": {
"section": {
"label": "Video settings",
"description": "Configure video recording options."
},
"video-source": {
"label": "Video source",
"description": "Portal is recommended, if you get artifacts try Screen."
},
"frame-rate": {
"label": "Frame rate",
"description": "Target frame rate for screen recordings."
},
"video-quality": {
"label": "Video quality",
"description": "Higher quality results in larger file sizes."
},
"video-codec": {
"label": "Video codec",
"description": "h264 is the most common codec."
},
"color-range": {
"label": "Color range",
"description": "Limited is recommended for better compatibility."
}
},
"audio": {
"section": {
"label": "Audio settings",
"description": "Configure audio recording options."
},
"audio-source": {
"label": "Audio source",
"description": "Audio source to capture during recording."
},
"audio-codec": {
"label": "Audio codec",
"description": "Opus is recommended for best performance and smallest audio size."
}
}
},
"about": {
"title": "About",
"noctalia": {
"section": {
"label": "Noctalia shell",
"description": "A sleek and minimal desktop shell thoughtfully crafted for Wayland, built with Quickshell."
},
"latest-version": "Latest version:",
"installed-version": "Installed version:",
"download-latest": "Download latest release"
},
"contributors": {
"section": {
"label": "Contributors",
"description": "Shout-out to our {count} <b>awesome</b> contributor!",
"description_plural": "Shout-out to our {count} <b>awesome</b> contributors!"
}
}
},
"hooks": {
"title": "Hooks",
"system-hooks": {
"section": {
"label": "System hooks",
"description": "Configure commands to be executed when system events occur."
},
"enable": {
"label": "Enable hooks",
"description": "Enable or disable all hook commands."
}
},
"wallpaper-changed": {
"label": "Wallpaper changed",
"description": "Command to be executed when wallpaper changes.",
"placeholder": "e.g., notify-send \"Wallpaper\" \"Changed\""
},
"theme-changed": {
"label": "Theme changed",
"description": "Command to be executed when theme toggles between dark and light mode.",
"placeholder": "e.g., notify-send \"Theme\" \"Toggled\""
},
"info": {
"command-info": {
"label": "Hook Command Information",
"description": "• Commands are executed via shell (sh -c)\n• Commands run in background (detached)\n• Test buttons execute with current values"
},
"parameters": {
"label": "Available Parameters",
"description": "• Wallpaper Hook: $1 = wallpaper path, $2 = screen name\n• Theme Toggle Hook: $1 = true/false (dark mode state)"
}
}
}
+62
View File
@@ -0,0 +1,62 @@
#!/bin/bash
# Noctalia Shell i18n Checker
# Scans for hardcoded strings that need internationalization
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
echo -e "${BLUE}Noctalia Shell i18n Checker${NC}"
echo -e "${BLUE}===========================${NC}"
files_with_issues=0
# Check a single file
check_file() {
local file="$1"
local issues=$(grep -n -E '(label|text|title|description|tooltip|placeholder):\s*"[^"]{3,}"' "$file" | grep -v 'I18n.tr')
if [[ -n "$issues" ]]; then
echo -e "${YELLOW}$file${NC}"
echo "$issues" | sed 's/^/ /'
echo ""
return 1
fi
return 0
}
echo "Scanning QML files..."
echo ""
# Find and check QML files
qml_files=$(find . -name "*.qml" -type f \
! -path "./Assets/*" \
! -path "./Bin/*" \
! -path "./Shaders/*" \
! -path "./Helpers/*" \
! -path "./.git/*")
total_files=$(echo "$qml_files" | wc -l)
for file in $qml_files; do
if ! check_file "$file"; then
((files_with_issues++))
fi
done
# Summary
echo -e "${BLUE}Summary${NC}"
echo -e "${BLUE}=======${NC}"
echo -e "Files scanned: $total_files"
echo -e "Files needing i18n: $files_with_issues"
if [[ $files_with_issues -eq 0 ]]; then
echo -e "${GREEN}All files use I18n.tr() properly!${NC}"
else
echo -e "${YELLOW}$files_with_issues files have potential hardcoded strings${NC}"
fi
+109 -11
View File
@@ -13,7 +13,7 @@ Singleton {
property bool isLoaded: false
property string langCode: ""
readonly property var availableLanguages: ["en", "fr"]
property var availableLanguages: []
property var translations: ({})
property var fallbackTranslations: ({})
@@ -21,6 +21,29 @@ 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.error("I18n", `Failed to scan translation directory`)
// Fallback to default languages
availableLanguages = ["en"]
detectLanguage()
}
}
}
// FileView to load translation files
property FileView translationFile: FileView {
id: fileView
@@ -44,7 +67,7 @@ Singleton {
}
}
// FileView to load translation files
// FileView to load fallback translation files
property FileView fallbackTranslationFile: FileView {
id: fallbackFileView
watchChanges: true
@@ -66,15 +89,84 @@ Singleton {
// -------------------------------------------
function init() {
Logger.log("I18n", "Service started")
detectLanguage()
scanAvailableLanguages()
}
// -------------------------------------------
function scanAvailableLanguages() {
Logger.log("I18n", "Scanning for available translation files...")
directoryScanner.running = true
}
// -------------------------------------------
function parseDirectoryListing(output) {
var languages = []
try {
if (!output || output.trim() === "") {
Logger.warn("I18n", "Empty directory listing output")
availableLanguages = ["en"]
detectLanguage()
return
}
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.warn("I18n", "No translation files found, using fallback")
languages = ["en"] // Fallback
}
availableLanguages = languages
Logger.log("I18n", `Found ${languages.length} available languages: ${languages.join(', ')}`)
// Detect language after scanning
detectLanguage()
} catch (e) {
Logger.error("I18n", `Failed to parse directory listing: ${e}`)
// Fallback to default languages
availableLanguages = ["en"]
detectLanguage()
}
}
// -------------------------------------------
function detectLanguage() {
Logger.log("I18n", `detectLanguage() called. Available languages: [${availableLanguages.join(', ')}]`)
if (availableLanguages.length === 0) {
Logger.warn("I18n", "No available languages found")
return
}
if (debug && debugForceLanguage !== "") {
setLanguage(debugForceLanguage)
return
Logger.log("I18n", `Debug mode: forcing language to "${debugForceLanguage}"`)
if (availableLanguages.includes(debugForceLanguage)) {
setLanguage(debugForceLanguage)
return
} else {
Logger.warn("I18n", `Debug language "${debugForceLanguage}" not available in [${availableLanguages.join(', ')}]`)
}
}
// Detect user's favorite locale - languages
@@ -86,8 +178,9 @@ Singleton {
}
}
// Fallback to english
setLanguage("en")
// Fallback to first available language (preferably "en" if available)
const fallbackLang = availableLanguages.includes("en") ? "en" : availableLanguages[0]
setLanguage(fallbackLang)
}
// -------------------------------------------
@@ -97,6 +190,8 @@ Singleton {
Logger.log("I18n", `Language set to "${langCode}"`)
languageChanged(langCode)
loadTranslations()
} else if (!availableLanguages.includes(newLangCode)) {
Logger.warn("I18n", `Language "${newLangCode}" is not available`)
}
}
@@ -110,8 +205,8 @@ Singleton {
isLoaded = false
Logger.log("I18n", `Loading translations from: ${filePath}`)
// Only load fallback translations if we are not using enlgish
if (langCode !== "en") {
// 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`
}
}
@@ -194,7 +289,7 @@ Singleton {
}
// Fallback to english if not found
if (notFound) {
if (notFound && availableLanguages.includes("en") && langCode !== "en") {
value = fallbackTranslations
for (var i = 0; i < keys.length; i++) {
if (value && typeof value === "object" && keys[i] in value) {
@@ -207,6 +302,9 @@ Singleton {
// Make untranslated string easy to spot
value = `<i>${value}</i>`
} else if (notFound) {
// No fallback available
return `## ${key} ##`
}
if (typeof value !== "string") {
@@ -247,6 +345,6 @@ Singleton {
finalInterpolations[prop] = interpolations[prop]
}
return t(pluralKey, defaultValue, finalInterpolations)
return tr(pluralKey, finalInterpolations)
}
}
+13 -13
View File
@@ -116,67 +116,67 @@ NPanel {
"source": generalTab
}, {
"id": SettingsPanel.Tab.Bar,
"label": "Bar",
"label": "settings.bar.title",
"icon": "settings-bar",
"source": barTab
}, {
"id": SettingsPanel.Tab.Dock,
"label": "Dock",
"label": "settings.dock.title",
"icon": "settings-dock",
"source": dockTab
}, {
"id": SettingsPanel.Tab.Launcher,
"label": "Launcher",
"label": "settings.launcher.title",
"icon": "settings-launcher",
"source": launcherTab
}, {
"id": SettingsPanel.Tab.Audio,
"label": "Audio",
"label": "settings.audio.title",
"icon": "settings-audio",
"source": audioTab
}, {
"id": SettingsPanel.Tab.Display,
"label": "Display",
"label": "settings.display.title",
"icon": "settings-display",
"source": displayTab
}, {
"id": SettingsPanel.Tab.Notifications,
"label": "Notifications",
"label": "settings.notifications.title",
"icon": "settings-notifications",
"source": notificationsTab
}, {
"id": SettingsPanel.Tab.Network,
"label": "Network",
"label": "settings.network.title",
"icon": "settings-network",
"source": networkTab
}, {
"id": SettingsPanel.Tab.Location,
"label": "Location",
"label": "settings.location.title",
"icon": "settings-location",
"source": locationTab
}, {
"id": SettingsPanel.Tab.ColorScheme,
"label": "Color scheme",
"label": "settings.color-scheme.title",
"icon": "settings-color-scheme",
"source": colorSchemeTab
}, {
"id": SettingsPanel.Tab.Wallpaper,
"label": "Wallpaper",
"label": "settings.wallpaper.title",
"icon": "settings-wallpaper",
"source": wallpaperTab
}, {
"id": SettingsPanel.Tab.ScreenRecorder,
"label": "Screen recorder",
"label": "settings.screen-recorder.title",
"icon": "settings-screen-recorder",
"source": screenRecorderTab
}, {
"id": SettingsPanel.Tab.Hooks,
"label": "Hooks",
"label": "settings.hooks.title",
"icon": "settings-hooks",
"source": hooksTab
}, {
"id": SettingsPanel.Tab.About,
"label": "About",
"label": "settings.about.title",
"icon": "settings-about",
"source": aboutTab
}]
+11 -7
View File
@@ -17,8 +17,8 @@ ColumnLayout {
property var contributors: GitHubService.contributors
NHeader {
label: "Noctalia shell"
description: "A sleek and minimal desktop shell thoughtfully crafted for Wayland, built with Quickshell."
label: I18n.tr("settings.about.noctalia.section.label")
description: I18n.tr("settings.about.noctalia.section.description")
}
RowLayout {
@@ -31,7 +31,7 @@ ColumnLayout {
columnSpacing: Style.marginS * scaling
NText {
text: "Latest version:"
text: I18n.tr("settings.about.noctalia.latest-version")
color: Color.mOnSurface
}
@@ -42,7 +42,7 @@ ColumnLayout {
}
NText {
text: "Installed version:"
text: I18n.tr("settings.about.noctalia.installed-version")
color: Color.mOnSurface
}
@@ -97,7 +97,7 @@ ColumnLayout {
NText {
id: updateText
text: "Download latest release"
text: I18n.tr("settings.about.noctalia.download-latest")
font.pointSize: Style.fontSizeL * scaling
color: updateArea.containsMouse ? Color.mSurface : Color.mPrimary
}
@@ -123,8 +123,12 @@ ColumnLayout {
}
NHeader {
label: "Contributors"
description: `Shout-out to our ${root.contributors.length} <b>awesome</b> contributors!`
label: I18n.tr("settings.about.contributors.section.label")
description: root.contributors.length === 1 ? I18n.tr("settings.about.contributors.section.description", {
"count": root.contributors.length
}) : I18n.tr("settings.about.contributors.section.description_plural", {
"count": root.contributors.length
})
}
GridView {
+31 -50
View File
@@ -11,8 +11,8 @@ ColumnLayout {
spacing: Style.marginL * scaling
NHeader {
label: "Volumes"
description: "Adjust volume controls and audio levels."
label: I18n.tr("settings.audio.volumes.section.label")
description: I18n.tr("settings.audio.volumes.section.description")
}
property real localVolume: AudioService.volume
@@ -30,8 +30,8 @@ ColumnLayout {
Layout.fillWidth: true
NLabel {
label: "Output volume"
description: "System-wide volume level."
label: I18n.tr("settings.audio.volumes.output-volume.label")
description: I18n.tr("settings.audio.volumes.output-volume.description")
}
// Pipewire seems a bit finicky, if we spam too many volume changes it breaks easily
@@ -67,8 +67,8 @@ ColumnLayout {
Layout.fillWidth: true
NToggle {
label: "Mute audio output"
description: "Mute the system's main audio output."
label: I18n.tr("settings.audio.volumes.mute-output.label")
description: I18n.tr("settings.audio.volumes.mute-output.description")
checked: AudioService.muted
onToggled: checked => {
if (AudioService.sink && AudioService.sink.audio) {
@@ -84,8 +84,8 @@ ColumnLayout {
Layout.fillWidth: true
NLabel {
label: "Input volume"
description: "Microphone input volume level."
label: I18n.tr("settings.audio.volumes.input-volume.label")
description: I18n.tr("settings.audio.volumes.input-volume.description")
}
NValueSlider {
@@ -105,8 +105,8 @@ ColumnLayout {
Layout.fillWidth: true
NToggle {
label: "Mute audio input"
description: "Mute the default audio input (microphone)."
label: I18n.tr("settings.audio.volumes.mute-input.label")
description: I18n.tr("settings.audio.volumes.mute-input.description")
checked: AudioService.inputMuted
onToggled: checked => AudioService.setInputMuted(checked)
}
@@ -119,8 +119,8 @@ ColumnLayout {
NSpinBox {
Layout.fillWidth: true
label: "Volume step size"
description: "Adjust the step size for volume changes (scroll wheel, keyboard shortcuts)."
label: I18n.tr("settings.audio.volumes.step-size.label")
description: I18n.tr("settings.audio.volumes.step-size.description")
minimum: 1
maximum: 25
value: Settings.data.audio.volumeStep
@@ -141,8 +141,8 @@ ColumnLayout {
spacing: Style.marginS * scaling
NHeader {
label: "Audio devices"
description: "Choose your audio input and output devices."
label: I18n.tr("settings.audio.devices.section.label")
description: I18n.tr("settings.audio.devices.section.description")
}
// -------------------------------
@@ -157,8 +157,8 @@ ColumnLayout {
Layout.bottomMargin: Style.marginL * scaling
NLabel {
label: "Output device"
description: "Select the desired audio output device."
label: I18n.tr("settings.audio.devices.output-device.label")
description: I18n.tr("settings.audio.devices.output-device.description")
}
Repeater {
@@ -184,8 +184,8 @@ ColumnLayout {
Layout.fillWidth: true
NLabel {
label: "Input device"
description: "Select the desired audio input device."
label: I18n.tr("settings.audio.devices.input-device.label")
description: I18n.tr("settings.audio.devices.input-device.description")
}
Repeater {
@@ -213,15 +213,15 @@ ColumnLayout {
spacing: Style.marginL * scaling
NHeader {
label: "Media players"
description: "Set your preferred and ignored media applications."
label: I18n.tr("settings.audio.media.section.label")
description: I18n.tr("settings.audio.media.section.description")
}
// Preferred player
NTextInput {
label: "Primary player"
description: "Enter a keyword to identify your main player."
placeholderText: "e.g. spotify, vlc, mpv"
label: I18n.tr("settings.audio.media.primary-player.label")
description: I18n.tr("settings.audio.media.primary-player.description")
placeholderText: I18n.tr("settings.audio.media.primary-player.placeholder")
text: Settings.data.audio.preferredPlayer
onTextChanged: {
Settings.data.audio.preferredPlayer = text
@@ -240,9 +240,9 @@ ColumnLayout {
NTextInput {
id: blacklistInput
label: "Excluded player"
description: "Add keywords for players you want the system to ignore. Each keyword should be on a new line."
placeholderText: "type substring and press +"
label: I18n.tr("settings.audio.media.excluded-player.label")
description: I18n.tr("settings.audio.media.excluded-player.description")
placeholderText: I18n.tr("settings.audio.media.excluded-player.placeholder")
}
// Button aligned to the center of the actual input field
@@ -321,30 +321,11 @@ ColumnLayout {
}
}
}
}
// Divider
NDivider {
Layout.fillWidth: true
Layout.topMargin: Style.marginXL * scaling
Layout.bottomMargin: Style.marginXL * scaling
}
// AudioService Visualizer Category
ColumnLayout {
spacing: Style.marginS * scaling
Layout.fillWidth: true
NHeader {
label: "Audio visualizer"
description: "Customize visual effects that respond to audio playback."
}
// AudioService Visualizer section
NComboBox {
id: audioVisualizerCombo
label: "Visualization type"
description: "Choose a visualization type for media playback"
label: I18n.tr("settings.audio.media.visualizer-type.label")
description: I18n.tr("settings.audio.media.visualizer-type.description")
model: ListModel {
ListElement {
key: "none"
@@ -368,8 +349,8 @@ ColumnLayout {
}
NComboBox {
label: "Frame rate"
description: "Higher rates are smoother but use more resources."
label: I18n.tr("settings.audio.media.frame-rate.label")
description: I18n.tr("settings.audio.media.frame-rate.description")
model: ListModel {
ListElement {
key: "30"
@@ -404,7 +385,7 @@ ColumnLayout {
onSelected: key => Settings.data.audio.cavaFrameRate = key
}
}
// Divider
NDivider {
Layout.fillWidth: true
Layout.topMargin: Style.marginXL * scaling
+20 -20
View File
@@ -41,14 +41,14 @@ ColumnLayout {
}
NHeader {
label: "settings.appearance"
description: "Customize the bar's appearance and position."
label: I18n.tr("settings.bar.appearance.section.label")
description: I18n.tr("settings.bar.appearance.section.description")
}
NComboBox {
Layout.fillWidth: true
label: "Bar position"
description: "Choose where to place the bar on the screen."
label: I18n.tr("settings.bar.appearance.position.label")
description: I18n.tr("settings.bar.appearance.position.description")
model: ListModel {
ListElement {
key: "top"
@@ -73,8 +73,8 @@ ColumnLayout {
NComboBox {
Layout.fillWidth: true
label: "Bar density"
description: "Adjust the bar's padding for a compact or spacious look."
label: I18n.tr("settings.bar.appearance.density.label")
description: I18n.tr("settings.bar.appearance.density.description")
model: ListModel {
ListElement {
key: "compact"
@@ -98,8 +98,8 @@ ColumnLayout {
Layout.fillWidth: true
NLabel {
label: "Background opacity"
description: "Adjust the background opacity of the bar."
label: I18n.tr("settings.bar.appearance.background-opacity.label")
description: I18n.tr("settings.bar.appearance.background-opacity.description")
}
NValueSlider {
@@ -115,16 +115,16 @@ ColumnLayout {
NToggle {
Layout.fillWidth: true
label: "Show capsule"
description: "Show widget backgrounds."
label: I18n.tr("settings.bar.appearance.show-capsule.label")
description: I18n.tr("settings.bar.appearance.show-capsule.description")
checked: Settings.data.bar.showCapsule
onToggled: checked => Settings.data.bar.showCapsule = checked
}
NToggle {
Layout.fillWidth: true
label: "Floating bar"
description: "Displays the bar as a floating 'pill'. Note: This will move the screen corners to the edges."
label: I18n.tr("settings.bar.appearance.floating.label")
description: I18n.tr("settings.bar.appearance.floating.description")
checked: Settings.data.bar.floating
onToggled: checked => Settings.data.bar.floating = checked
}
@@ -136,8 +136,8 @@ ColumnLayout {
Layout.fillWidth: true
NLabel {
label: "Margins"
description: "Adjust the margins around the floating bar."
label: I18n.tr("settings.bar.appearance.margins.label")
description: I18n.tr("settings.bar.appearance.margins.description")
}
RowLayout {
@@ -148,7 +148,7 @@ ColumnLayout {
spacing: Style.marginXXS * scaling
NText {
text: "Vertical"
text: I18n.tr("settings.bar.appearance.margins.vertical")
font.pointSize: Style.fontSizeXS * scaling
color: Color.mOnSurfaceVariant
}
@@ -168,7 +168,7 @@ ColumnLayout {
spacing: Style.marginXXS * scaling
NText {
text: "Horizontal"
text: I18n.tr("settings.bar.appearance.margins.horizontal")
font.pointSize: Style.fontSizeXS * scaling
color: Color.mOnSurfaceVariant
}
@@ -198,8 +198,8 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Widgets positioning"
description: "Drag and drop widgets to reorder them within each section, or use the add/remove buttons to manage widgets."
label: I18n.tr("settings.bar.widgets.section.label")
description: I18n.tr("settings.bar.widgets.section.description")
}
// Bar Sections
@@ -268,8 +268,8 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Monitor display"
description: "Show bar on specific monitors. Defaults to all if none are chosen."
label: I18n.tr("settings.bar.monitors.section.label")
description: I18n.tr("settings.bar.monitors.section.description")
}
Repeater {
+43 -38
View File
@@ -106,14 +106,14 @@ ColumnLayout {
// Main Toggles - Dark Mode / Matugen
NHeader {
label: "Color source"
description: "Main settings for Noctalia's colors."
label: I18n.tr("settings.color-scheme.color-source.section.label")
description: I18n.tr("settings.color-scheme.color-source.section.description")
}
// Dark Mode Toggle (affects both Matugen and predefined schemes that provide variants)
NToggle {
label: "Dark mode"
description: "Switches to a darker theme for easier viewing at night."
label: I18n.tr("settings.color-scheme.color-source.dark-mode.label")
description: I18n.tr("settings.color-scheme.color-source.dark-mode.description")
checked: Settings.data.colorSchemes.darkMode
enabled: true
onToggled: checked => Settings.data.colorSchemes.darkMode = checked
@@ -121,8 +121,8 @@ ColumnLayout {
// Use Matugen
NToggle {
label: "Enable Matugen"
description: "Automatically generate colors based on your active wallpaper."
label: I18n.tr("settings.color-scheme.color-source.enable-matugen.label")
description: I18n.tr("settings.color-scheme.color-source.enable-matugen.description")
checked: Settings.data.colorSchemes.useWallpaperColors
onToggled: checked => {
if (checked) {
@@ -152,8 +152,8 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Predefined color schemes"
description: "To use these color schemes, you must turn off Matugen. With Matugen enabled, colors are automatically generated from your wallpaper."
label: I18n.tr("settings.color-scheme.predefined.section.label")
description: I18n.tr("settings.color-scheme.predefined.section.description")
}
// Color Schemes Grid
@@ -324,16 +324,21 @@ ColumnLayout {
visible: Settings.data.colorSchemes.useWallpaperColors
spacing: Style.marginL * scaling
NHeader {
label: I18n.tr("settings.color-scheme.matugen.section.label")
description: I18n.tr("settings.color-scheme.matugen.section.description")
}
// UI Components
NCollapsible {
Layout.fillWidth: true
label: "UI"
description: "Desktop environment and UI toolkit theming."
label: I18n.tr("settings.color-scheme.matugen.ui.label")
description: I18n.tr("settings.color-scheme.matugen.ui.description")
defaultExpanded: false
NCheckbox {
label: "GTK 4 (libadwaita)"
description: "Write ~/.config/gtk-4.0/gtk.css"
label: I18n.tr("settings.color-scheme.matugen.ui.gtk4.label")
description: I18n.tr("settings.color-scheme.matugen.ui.gtk4.description")
checked: Settings.data.matugen.gtk4
onToggled: checked => {
Settings.data.matugen.gtk4 = checked
@@ -343,8 +348,8 @@ ColumnLayout {
}
NCheckbox {
label: "GTK 3"
description: "Write ~/.config/gtk-3.0/gtk.css"
label: I18n.tr("settings.color-scheme.matugen.ui.gtk3.label")
description: I18n.tr("settings.color-scheme.matugen.ui.gtk3.description")
checked: Settings.data.matugen.gtk3
onToggled: checked => {
Settings.data.matugen.gtk3 = checked
@@ -354,8 +359,8 @@ ColumnLayout {
}
NCheckbox {
label: "Qt6ct"
description: "Write ~/.config/qt6ct/colors/noctalia.conf"
label: I18n.tr("settings.color-scheme.matugen.ui.qt6.label")
description: I18n.tr("settings.color-scheme.matugen.ui.qt6.description")
checked: Settings.data.matugen.qt6
onToggled: checked => {
Settings.data.matugen.qt6 = checked
@@ -365,8 +370,8 @@ ColumnLayout {
}
NCheckbox {
label: "Qt5ct"
description: "Write ~/.config/qt5ct/colors/noctalia.conf"
label: I18n.tr("settings.color-scheme.matugen.ui.qt5.label")
description: I18n.tr("settings.color-scheme.matugen.ui.qt5.description")
checked: Settings.data.matugen.qt5
onToggled: checked => {
Settings.data.matugen.qt5 = checked
@@ -379,13 +384,13 @@ ColumnLayout {
// Terminal Emulators
NCollapsible {
Layout.fillWidth: true
label: "Terminal"
description: "Terminal emulator theming."
label: I18n.tr("settings.color-scheme.matugen.terminal.label")
description: I18n.tr("settings.color-scheme.matugen.terminal.description")
defaultExpanded: false
NCheckbox {
label: "Kitty"
description: ProgramCheckerService.kittyAvailable ? "Write ~/.config/kitty/themes/noctalia.conf and reload" : "Requires kitty terminal to be installed"
label: I18n.tr("settings.color-scheme.matugen.terminal.kitty.label")
description: ProgramCheckerService.kittyAvailable ? I18n.tr("settings.color-scheme.matugen.terminal.kitty.description") : I18n.tr("settings.color-scheme.matugen.terminal.kitty.description-missing")
checked: Settings.data.matugen.kitty
enabled: ProgramCheckerService.kittyAvailable
opacity: ProgramCheckerService.kittyAvailable ? 1.0 : 0.6
@@ -399,8 +404,8 @@ ColumnLayout {
}
NCheckbox {
label: "Ghostty"
description: ProgramCheckerService.ghosttyAvailable ? "Write ~/.config/ghostty/themes/noctalia and reload" : "Requires ghostty terminal to be installed"
label: I18n.tr("settings.color-scheme.matugen.terminal.ghostty.label")
description: ProgramCheckerService.ghosttyAvailable ? I18n.tr("settings.color-scheme.matugen.terminal.ghostty.description") : I18n.tr("settings.color-scheme.matugen.terminal.ghostty.description-missing")
checked: Settings.data.matugen.ghostty
enabled: ProgramCheckerService.ghosttyAvailable
opacity: ProgramCheckerService.ghosttyAvailable ? 1.0 : 0.6
@@ -414,8 +419,8 @@ ColumnLayout {
}
NCheckbox {
label: "Foot"
description: ProgramCheckerService.footAvailable ? "Write ~/.config/foot/themes/noctalia and reload" : "Requires foot terminal to be installed"
label: I18n.tr("settings.color-scheme.matugen.terminal.foot.label")
description: ProgramCheckerService.footAvailable ? I18n.tr("settings.color-scheme.matugen.terminal.foot.description") : I18n.tr("settings.color-scheme.matugen.terminal.foot.description-missing")
checked: Settings.data.matugen.foot
enabled: ProgramCheckerService.footAvailable
opacity: ProgramCheckerService.footAvailable ? 1.0 : 0.6
@@ -432,13 +437,13 @@ ColumnLayout {
// Applications
NCollapsible {
Layout.fillWidth: true
label: "Programs"
description: "Application-specific theming."
label: I18n.tr("settings.color-scheme.matugen.programs.label")
description: I18n.tr("settings.color-scheme.matugen.programs.description")
defaultExpanded: false
NCheckbox {
label: "Fuzzel"
description: ProgramCheckerService.fuzzelAvailable ? "Write ~/.config/fuzzel/themes/noctalia and reload" : "Requires fuzzel launcher to be installed"
label: I18n.tr("settings.color-scheme.matugen.programs.fuzzel.label")
description: ProgramCheckerService.fuzzelAvailable ? I18n.tr("settings.color-scheme.matugen.programs.fuzzel.description") : I18n.tr("settings.color-scheme.matugen.programs.fuzzel.description-missing")
checked: Settings.data.matugen.fuzzel
enabled: ProgramCheckerService.fuzzelAvailable
opacity: ProgramCheckerService.fuzzelAvailable ? 1.0 : 0.6
@@ -452,8 +457,8 @@ ColumnLayout {
}
NCheckbox {
label: "Vesktop"
description: ProgramCheckerService.vesktopAvailable ? "Write ~/.config/vesktop/themes/noctalia.theme.css" : "Requires vesktop Discord client to be installed"
label: I18n.tr("settings.color-scheme.matugen.programs.vesktop.label")
description: ProgramCheckerService.vesktopAvailable ? I18n.tr("settings.color-scheme.matugen.programs.vesktop.description") : I18n.tr("settings.color-scheme.matugen.programs.vesktop.description-missing")
checked: Settings.data.matugen.vesktop
enabled: ProgramCheckerService.vesktopAvailable
opacity: ProgramCheckerService.vesktopAvailable ? 1.0 : 0.6
@@ -467,8 +472,8 @@ ColumnLayout {
}
NCheckbox {
label: "Pywalfox (Firefox)"
description: ProgramCheckerService.pywalfoxAvailable ? "Write ~/.cache/wal/colors.json and run pywalfox update" : "Requires pywalfox package to be installed"
label: I18n.tr("settings.color-scheme.matugen.programs.pywalfox.label")
description: ProgramCheckerService.pywalfoxAvailable ? I18n.tr("settings.color-scheme.matugen.programs.pywalfox.description") : I18n.tr("settings.color-scheme.matugen.programs.pywalfox.description-missing")
checked: Settings.data.matugen.pywalfox
enabled: ProgramCheckerService.pywalfoxAvailable
opacity: ProgramCheckerService.pywalfoxAvailable ? 1.0 : 0.6
@@ -485,13 +490,13 @@ ColumnLayout {
// Miscellaneous
NCollapsible {
Layout.fillWidth: true
label: "Misc"
description: "Additional configuration options."
label: I18n.tr("settings.color-scheme.matugen.misc.label")
description: I18n.tr("settings.color-scheme.matugen.misc.description")
defaultExpanded: false
NCheckbox {
label: "User templates"
description: "Enable user-defined Matugen config from ~/.config/matugen/config.toml"
label: I18n.tr("settings.color-scheme.matugen.misc.user-templates.label")
description: I18n.tr("settings.color-scheme.matugen.misc.user-templates.description")
checked: Settings.data.matugen.enableUserTemplates
onToggled: checked => {
Settings.data.matugen.enableUserTemplates = checked
+27 -43
View File
@@ -52,8 +52,8 @@ ColumnLayout {
spacing: Style.marginL * scaling
NHeader {
label: "Per-monitor settings"
description: "Adjust scaling and brightness for each display."
label: I18n.tr("settings.display.monitors.section.label")
description: I18n.tr("settings.display.monitors.section.description")
}
ColumnLayout {
@@ -103,7 +103,7 @@ ColumnLayout {
Layout.fillWidth: true
NText {
text: "Scale"
text: I18n.tr("settings.display.monitors.scale")
Layout.preferredWidth: 80 * scaling
}
@@ -126,7 +126,7 @@ ColumnLayout {
NIconButton {
icon: "refresh"
baseSize: Style.baseWidgetSize * 0.9
tooltipText: "Reset scaling"
tooltipText: I18n.tr("settings.display.monitors.reset-scaling")
onClicked: ScalingService.setScreenScale(modelData, 1.0)
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
@@ -146,7 +146,7 @@ ColumnLayout {
spacing: Style.marginL * scaling
NText {
text: "Brightness"
text: I18n.tr("settings.display.monitors.brightness")
Layout.preferredWidth: 80 * scaling
}
@@ -180,24 +180,6 @@ ColumnLayout {
}
}
}
}
NDivider {
Layout.fillWidth: true
Layout.topMargin: Style.marginXL * scaling
Layout.bottomMargin: Style.marginXL * scaling
}
// Brightness Section
ColumnLayout {
spacing: Style.marginS * scaling
Layout.fillWidth: true
NHeader {
label: "Brightness"
description: "Adjust brightness related settings."
}
// Brightness Step Section
ColumnLayout {
spacing: Style.marginS * scaling
@@ -205,8 +187,8 @@ ColumnLayout {
NSpinBox {
Layout.fillWidth: true
label: "Brightness step size"
description: "Adjust the step size for brightness changes (scroll wheel and keyboard shortcuts)."
label: I18n.tr("settings.display.monitors.brightness-step.label")
description: I18n.tr("settings.display.monitors.brightness-step.description")
minimum: 1
maximum: 50
value: Settings.data.brightness.brightnessStep
@@ -229,14 +211,14 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Night light"
description: "Reduce blue light emission to help you sleep better and reduce eye strain."
label: I18n.tr("settings.display.night-light.section.label")
description: I18n.tr("settings.display.night-light.section.description")
}
}
NToggle {
label: "Enable night light"
description: "Apply a warm color filter to reduce blue light emission."
label: I18n.tr("settings.display.night-light.enable.label")
description: I18n.tr("settings.display.night-light.enable.description")
checked: Settings.data.nightLight.enabled
onToggled: checked => {
if (checked) {
@@ -257,8 +239,8 @@ ColumnLayout {
Layout.alignment: Qt.AlignVCenter
NLabel {
label: "Color temperature"
description: "Set the color warmth for nighttime and daytime."
label: I18n.tr("settings.display.night-light.temperature.label")
description: I18n.tr("settings.display.night-light.temperature.description")
}
RowLayout {
@@ -269,7 +251,7 @@ ColumnLayout {
Layout.alignment: Qt.AlignVCenter
NText {
text: "Night"
text: I18n.tr("settings.display.night-light.temperature.night")
font.pointSize: Style.fontSizeM * scaling
color: Color.mOnSurfaceVariant
Layout.alignment: Qt.AlignVCenter
@@ -291,7 +273,7 @@ ColumnLayout {
}
NText {
text: "Day"
text: I18n.tr("settings.display.night-light.temperature.day")
font.pointSize: Style.fontSizeM * scaling
color: Color.mOnSurfaceVariant
Layout.alignment: Qt.AlignVCenter
@@ -314,8 +296,10 @@ ColumnLayout {
}
NToggle {
label: "Automatic scheduling"
description: `Based on the sunset and sunrise time in <i>${LocationService.stableName}</i> - recommended.`
label: I18n.tr("settings.display.night-light.auto-schedule.label")
description: I18n.tr("settings.display.night-light.auto-schedule.description", {
"location": LocationService.stableName
})
checked: Settings.data.nightLight.autoSchedule
onToggled: checked => Settings.data.nightLight.autoSchedule = checked
visible: Settings.data.nightLight.enabled
@@ -327,8 +311,8 @@ ColumnLayout {
visible: Settings.data.nightLight.enabled && !Settings.data.nightLight.autoSchedule && !Settings.data.nightLight.forced
NLabel {
label: "Manual scheduling"
description: "Set custom times for sunrise and sunset."
label: I18n.tr("settings.display.night-light.manual-schedule.label")
description: I18n.tr("settings.display.night-light.manual-schedule.description")
}
RowLayout {
@@ -336,7 +320,7 @@ ColumnLayout {
spacing: Style.marginS * scaling
NText {
text: "Sunrise time"
text: I18n.tr("settings.display.night-light.manual-schedule.sunrise")
font.pointSize: Style.fontSizeM * scaling
color: Color.mOnSurfaceVariant
}
@@ -344,7 +328,7 @@ ColumnLayout {
NComboBox {
model: timeOptions
currentKey: Settings.data.nightLight.manualSunrise
placeholder: "Select start time"
placeholder: I18n.tr("settings.display.night-light.manual-schedule.select-start")
onSelected: key => Settings.data.nightLight.manualSunrise = key
minimumWidth: 120 * scaling
}
@@ -354,7 +338,7 @@ ColumnLayout {
}
NText {
text: "Sunset time"
text: I18n.tr("settings.display.night-light.manual-schedule.sunset")
font.pointSize: Style.fontSizeM * scaling
color: Color.mOnSurfaceVariant
}
@@ -362,7 +346,7 @@ ColumnLayout {
NComboBox {
model: timeOptions
currentKey: Settings.data.nightLight.manualSunset
placeholder: "Select stop time"
placeholder: I18n.tr("settings.display.night-light.manual-schedule.select-stop")
onSelected: key => Settings.data.nightLight.manualSunset = key
minimumWidth: 120 * scaling
}
@@ -371,8 +355,8 @@ ColumnLayout {
// Force activation toggle
NToggle {
label: "Force activation"
description: "Ignores the schedule and applies the night filter immediately."
label: I18n.tr("settings.display.night-light.force-activation.label")
description: I18n.tr("settings.display.night-light.force-activation.description")
checked: Settings.data.nightLight.forced
onToggled: checked => {
Settings.data.nightLight.forced = checked
+12 -12
View File
@@ -24,20 +24,20 @@ ColumnLayout {
}
NHeader {
label: "Appearance"
description: "Customize the dock's behavior and appearance."
label: I18n.tr("settings.dock.appearance.section.label")
description: I18n.tr("settings.dock.appearance.section.description")
}
NToggle {
label: "Auto-hide"
description: "Automatically hide when not in use."
label: I18n.tr("settings.dock.appearance.auto-hide.label")
description: I18n.tr("settings.dock.appearance.auto-hide.description")
checked: Settings.data.dock.autoHide
onToggled: checked => Settings.data.dock.autoHide = checked
}
NToggle {
label: "Exclusive zone"
description: "Prevent window overlap."
label: I18n.tr("settings.dock.appearance.exclusive-zone.label")
description: I18n.tr("settings.dock.appearance.exclusive-zone.description")
checked: Settings.data.dock.exclusive
onToggled: checked => Settings.data.dock.exclusive = checked
}
@@ -46,8 +46,8 @@ ColumnLayout {
spacing: Style.marginXXS * scaling
Layout.fillWidth: true
NLabel {
label: "Background opacity"
description: "Adjust the dock's background opacity."
label: I18n.tr("settings.dock.appearance.background-opacity.label")
description: I18n.tr("settings.dock.appearance.background-opacity.description")
}
NValueSlider {
Layout.fillWidth: true
@@ -65,8 +65,8 @@ ColumnLayout {
Layout.fillWidth: true
NLabel {
label: "Dock floating distance"
description: "Adjust the floating distance from the screen edge."
label: I18n.tr("settings.dock.appearance.floating-distance.label")
description: I18n.tr("settings.dock.appearance.floating-distance.description")
}
NValueSlider {
@@ -92,8 +92,8 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Monitor display"
description: "Choose which monitor to display the dock on."
label: I18n.tr("settings.dock.monitors.section.label")
description: I18n.tr("settings.dock.monitors.section.description")
}
Repeater {
+23 -23
View File
@@ -49,7 +49,7 @@ ColumnLayout {
NFilePicker {
id: filePicker
pickerType: "file"
title: I18n.tr("settings.general.profile.select-avatar") //Select avatar image"
title: I18n.tr("settings.general.profile.select-avatar")
initialPath: Settings.data.general.avatarImage.substr(0, Settings.data.general.avatarImage.lastIndexOf("/")) || Quickshell.env("HOME")
nameFilters: ["Image files (*.jpg *.jpeg *.png *.gif *.pnm *.bmp *.face)", "All files (*)"]
onAccepted: paths => Settings.data.general.avatarImage = paths[0]
@@ -104,8 +104,8 @@ ColumnLayout {
Layout.fillWidth: true
NLabel {
label: "Animation speed"
description: "Adjust global animation speed."
label: I18n.tr("settings.general.ui.animation-speed.label")
description: I18n.tr("settings.general.ui.animation-speed.description")
}
NValueSlider {
@@ -132,20 +132,20 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Screen corners"
description: "Customize screen corner rounding and visual effects."
label: I18n.tr("settings.general.screen-corners.section.label")
description: I18n.tr("settings.general.screen-corners.section.description")
}
NToggle {
label: "Show screen corners"
description: "Display rounded corners on the edge of the screen."
label: I18n.tr("settings.general.screen-corners.show-corners.label")
description: I18n.tr("settings.general.screen-corners.show-corners.description")
checked: Settings.data.general.showScreenCorners
onToggled: checked => Settings.data.general.showScreenCorners = checked
}
NToggle {
label: "Solid black corners"
description: "Use solid black instead of the bar background color."
label: I18n.tr("settings.general.screen-corners.solid-black.label")
description: I18n.tr("settings.general.screen-corners.solid-black.description")
checked: Settings.data.general.forceBlackScreenCorners
onToggled: checked => Settings.data.general.forceBlackScreenCorners = checked
}
@@ -182,8 +182,8 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Fonts"
description: "Choose the fonts used throughout the interface."
label: I18n.tr("settings.general.fonts.section.label")
description: I18n.tr("settings.general.fonts.section.description")
}
// Font configuration section
@@ -192,12 +192,12 @@ ColumnLayout {
Layout.fillWidth: true
NSearchableComboBox {
label: "Default font"
description: "Main font used throughout the interface."
label: I18n.tr("settings.general.fonts.default.label")
description: I18n.tr("settings.general.fonts.default.description")
model: FontService.availableFonts
currentKey: Settings.data.ui.fontDefault
placeholder: "Select default font..."
searchPlaceholder: "Search fonts..."
placeholder: I18n.tr("settings.general.fonts.default.placeholder")
searchPlaceholder: I18n.tr("settings.general.fonts.default.search-placeholder")
popupHeight: 420 * scaling
minimumWidth: 300 * scaling
onSelected: function (key) {
@@ -206,12 +206,12 @@ ColumnLayout {
}
NSearchableComboBox {
label: "Monospaced font"
description: "Monospaced font used for numbers and stats display."
label: I18n.tr("settings.general.fonts.monospace.label")
description: I18n.tr("settings.general.fonts.monospace.description")
model: FontService.monospaceFonts
currentKey: Settings.data.ui.fontFixed
placeholder: "Select monospace font..."
searchPlaceholder: "Search monospace fonts..."
placeholder: I18n.tr("settings.general.fonts.monospace.placeholder")
searchPlaceholder: I18n.tr("settings.general.fonts.monospace.search-placeholder")
popupHeight: 320 * scaling
minimumWidth: 300 * scaling
onSelected: function (key) {
@@ -220,12 +220,12 @@ ColumnLayout {
}
NSearchableComboBox {
label: "Accent font"
description: "Large font used for prominent displays."
label: I18n.tr("settings.general.fonts.accent.label")
description: I18n.tr("settings.general.fonts.accent.description")
model: FontService.displayFonts
currentKey: Settings.data.ui.fontBillboard
placeholder: "Select display font..."
searchPlaceholder: "Search display fonts..."
placeholder: I18n.tr("settings.general.fonts.accent.placeholder")
searchPlaceholder: I18n.tr("settings.general.fonts.accent.search-placeholder")
popupHeight: 320 * scaling
minimumWidth: 300 * scaling
onSelected: function (key) {
+14 -14
View File
@@ -11,14 +11,14 @@ ColumnLayout {
width: root.width
NHeader {
label: "System hooks"
description: "Configure commands to be executed when system events occur."
label: I18n.tr("settings.hooks.system-hooks.section.label")
description: I18n.tr("settings.hooks.system-hooks.section.description")
}
// Enable/Disable Toggle
NToggle {
label: "Enable hooks"
description: "Enable or disable all hook commands."
label: I18n.tr("settings.hooks.system-hooks.enable.label")
description: I18n.tr("settings.hooks.system-hooks.enable.description")
checked: Settings.data.hooks.enabled
onToggled: checked => Settings.data.hooks.enabled = checked
}
@@ -35,9 +35,9 @@ ColumnLayout {
// Wallpaper Hook Section
NInputAction {
id: wallpaperHookInput
label: "Wallpaper changed"
description: "Command to be executed when wallpaper changes."
placeholderText: "e.g., notify-send \"Wallpaper\" \"Changed\""
label: I18n.tr("settings.hooks.wallpaper-changed.label")
description: I18n.tr("settings.hooks.wallpaper-changed.description")
placeholderText: I18n.tr("settings.hooks.wallpaper-changed.placeholder")
text: Settings.data.hooks.wallpaperChange
onEditingFinished: {
Settings.data.hooks.wallpaperChange = wallpaperHookInput.text
@@ -57,9 +57,9 @@ ColumnLayout {
// Dark Mode Hook Section
NInputAction {
id: darkModeHookInput
label: "Theme changed"
description: "Command to be executed when theme toggles between dark and light mode."
placeholderText: "e.g., notify-send \"Theme\" \"Toggled\""
label: I18n.tr("settings.hooks.theme-changed.label")
description: I18n.tr("settings.hooks.theme-changed.description")
placeholderText: I18n.tr("settings.hooks.theme-changed.placeholder")
text: Settings.data.hooks.darkModeChange
onEditingFinished: {
Settings.data.hooks.darkModeChange = darkModeHookInput.text
@@ -82,13 +82,13 @@ ColumnLayout {
Layout.fillWidth: true
NLabel {
label: "Hook Command Information"
description: "• Commands are executed via shell (sh -c)\n• Commands run in background (detached)\n• Test buttons execute with current values"
label: I18n.tr("settings.hooks.info.command-info.label")
description: I18n.tr("settings.hooks.info.command-info.description")
}
NLabel {
label: "Available Parameters"
description: "• Wallpaper Hook: $1 = wallpaper path, $2 = screen name\n• Theme Toggle Hook: $1 = true/false (dark mode state)"
label: I18n.tr("settings.hooks.info.parameters.label")
description: I18n.tr("settings.hooks.info.parameters.description")
}
}
}
+12 -12
View File
@@ -10,14 +10,14 @@ ColumnLayout {
spacing: Style.marginL * scaling
NHeader {
label: "Appearance"
description: "Customize the launcher's behavior and appearance."
label: I18n.tr("settings.launcher.settings.section.label")
description: I18n.tr("settings.launcher.settings.section.description")
}
NComboBox {
id: launcherPosition
label: "Position"
description: "Choose where the launcher panel appears."
label: I18n.tr("settings.launcher.settings.position.label")
description: I18n.tr("settings.launcher.settings.position.description")
Layout.fillWidth: true
model: ListModel {
ListElement {
@@ -60,14 +60,14 @@ ColumnLayout {
Layout.fillWidth: true
NText {
text: "Background opacity"
text: I18n.tr("settings.launcher.settings.background-opacity.label")
font.pointSize: Style.fontSizeL * scaling
font.weight: Style.fontWeightBold
color: Color.mOnSurface
}
NText {
text: "Adjust the background opacity of the launcher."
text: I18n.tr("settings.launcher.settings.background-opacity.description")
font.pointSize: Style.fontSizeXS * scaling
color: Color.mOnSurfaceVariant
wrapMode: Text.WordWrap
@@ -87,22 +87,22 @@ ColumnLayout {
}
NToggle {
label: "Enable clipboard history"
description: "Access previously copied items from the launcher."
label: I18n.tr("settings.launcher.settings.clipboard-history.label")
description: I18n.tr("settings.launcher.settings.clipboard-history.description")
checked: Settings.data.appLauncher.enableClipboardHistory
onToggled: checked => Settings.data.appLauncher.enableClipboardHistory = checked
}
NToggle {
label: "Sort by most used"
description: "When enabled, frequently launched apps appear first in the list."
label: I18n.tr("settings.launcher.settings.sort-by-usage.label")
description: I18n.tr("settings.launcher.settings.sort-by-usage.description")
checked: Settings.data.appLauncher.sortByMostUsed
onToggled: checked => Settings.data.appLauncher.sortByMostUsed = checked
}
NToggle {
label: "Use App2Unit to launch applications"
description: "Uses an alternative launch method to better manage app processes and prevent issues."
label: I18n.tr("settings.launcher.settings.use-app2unit.label")
description: I18n.tr("settings.launcher.settings.use-app2unit.description")
checked: Settings.data.appLauncher.useApp2Unit
onToggled: checked => Settings.data.appLauncher.useApp2Unit = checked
}
+16 -16
View File
@@ -10,8 +10,8 @@ ColumnLayout {
spacing: Style.marginL * scaling
NHeader {
label: "Your location"
description: "Get accurate weather and night light scheduling by setting your location."
label: I18n.tr("settings.location.location.section.label")
description: I18n.tr("settings.location.location.section.description")
}
// Location section
@@ -20,10 +20,10 @@ ColumnLayout {
spacing: Style.marginL * scaling
NTextInput {
label: "Search for a location"
description: "e.g., Toronto, ON"
label: I18n.tr("settings.location.location.search.label")
description: I18n.tr("settings.location.location.search.description")
text: Settings.data.location.name || Settings.defaultLocation
placeholderText: "Enter the location name"
placeholderText: I18n.tr("settings.location.location.search.placeholder")
onEditingFinished: {
// Verify the location has really changed to avoid extra resets
var newLocation = text.trim()
@@ -64,13 +64,13 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Weather"
description: "Choose your preferred temperature unit."
label: I18n.tr("settings.location.weather.section.label")
description: I18n.tr("settings.location.weather.section.description")
}
NToggle {
label: "Display temperature in Fahrenheit (°F)"
description: "Display temperature in Fahrenheit instead of Celsius."
label: I18n.tr("settings.location.weather.fahrenheit.label")
description: I18n.tr("settings.location.weather.fahrenheit.description")
checked: Settings.data.location.useFahrenheit
onToggled: checked => Settings.data.location.useFahrenheit = checked
}
@@ -82,26 +82,26 @@ ColumnLayout {
Layout.bottomMargin: Style.marginXL * scaling
}
// Weather section
// Date & time section
ColumnLayout {
spacing: Style.marginM * scaling
Layout.fillWidth: true
NHeader {
label: "Date & time"
description: "Customize how date and time appear."
label: I18n.tr("settings.location.date-time.section.label")
description: I18n.tr("settings.location.date-time.section.description")
}
NToggle {
label: "Use 12-hour time format on the lock screen"
description: "On for AM/PM format (e.g., 8:00 PM), off for 24-hour format (e.g., 20:00)."
label: I18n.tr("settings.location.date-time.12hour-format.label")
description: I18n.tr("settings.location.date-time.12hour-format.description")
checked: Settings.data.location.use12hourFormat
onToggled: checked => Settings.data.location.use12hourFormat = checked
}
NToggle {
label: "Show week numbers"
description: "Displays the week of the year (e.g., Week 38) in the calendar."
label: I18n.tr("settings.location.date-time.week-numbers.label")
description: I18n.tr("settings.location.date-time.week-numbers.description")
checked: Settings.data.location.showWeekNumberInCalendar
onToggled: checked => Settings.data.location.showWeekNumberInCalendar = checked
}
+3 -3
View File
@@ -12,17 +12,17 @@ ColumnLayout {
spacing: Style.marginL * scaling
NHeader {
label: "Manage Wi-Fi and Bluetooth connections."
description: I18n.tr("settings.network.section.description")
}
NToggle {
label: "Enable Wi-Fi"
label: I18n.tr("settings.network.wifi.label")
checked: Settings.data.network.wifiEnabled
onToggled: checked => NetworkService.setWifiEnabled(checked)
}
NToggle {
label: "Enable Bluetooth"
label: I18n.tr("settings.network.bluetooth.label")
checked: Settings.data.network.bluetoothEnabled
onToggled: checked => BluetoothService.setBluetoothEnabled(checked)
}
+18 -48
View File
@@ -28,27 +28,27 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Appearance"
description: "Configure notifications appearance and behavior."
label: I18n.tr("settings.notifications.settings.section.label")
description: I18n.tr("settings.notifications.settings.section.description")
}
NToggle {
label: "Do not disturb"
description: "Disable all notification popups when enabled."
label: I18n.tr("settings.notifications.settings.do-not-disturb.label")
description: I18n.tr("settings.notifications.settings.do-not-disturb.description")
checked: Settings.data.notifications.doNotDisturb
onToggled: checked => Settings.data.notifications.doNotDisturb = checked
}
NToggle {
label: "Enable on screen display"
description: "Show volume and brightness changes in real-time."
label: I18n.tr("settings.notifications.settings.enable-osd.label")
description: I18n.tr("settings.notifications.settings.enable-osd.description")
checked: Settings.data.notifications.enableOSD
onToggled: checked => Settings.data.notifications.enableOSD = checked
}
NComboBox {
label: "Location"
description: "Where notifications appear on screen."
label: I18n.tr("settings.notifications.settings.location.label")
description: I18n.tr("settings.notifications.settings.location.description")
model: ListModel {
ListElement {
key: "top"
@@ -78,32 +78,14 @@ ColumnLayout {
currentKey: Settings.data.notifications.location || "top_right"
onSelected: key => Settings.data.notifications.location = key
}
}
NDivider {
Layout.fillWidth: true
Layout.topMargin: Style.marginXL * scaling
Layout.bottomMargin: Style.marginXL * scaling
}
// Notification Duration Settings
ColumnLayout {
spacing: Style.marginL * scaling
Layout.fillWidth: true
NHeader {
label: "Notification duration"
description: "Configure how long notifications stay visible based on their urgency level."
}
// Low Urgency Duration
ColumnLayout {
spacing: Style.marginXXS * scaling
Layout.fillWidth: true
NLabel {
label: "Low urgency"
description: "How long low priority notifications stay visible."
label: I18n.tr("settings.notifications.settings.low-urgency.label")
description: I18n.tr("settings.notifications.settings.low-urgency.description")
}
NValueSlider {
@@ -123,8 +105,8 @@ ColumnLayout {
Layout.fillWidth: true
NLabel {
label: "Normal urgency"
description: "How long normal priority notifications stay visible."
label: I18n.tr("settings.notifications.settings.normal-urgency.label")
description: I18n.tr("settings.notifications.settings.normal-urgency.description")
}
NValueSlider {
@@ -144,8 +126,8 @@ ColumnLayout {
Layout.fillWidth: true
NLabel {
label: "Critical urgency"
description: "How long critical priority notifications stay visible."
label: I18n.tr("settings.notifications.settings.critical-urgency.label")
description: I18n.tr("settings.notifications.settings.critical-urgency.description")
}
NValueSlider {
@@ -158,22 +140,10 @@ ColumnLayout {
text: Settings.data.notifications.criticalUrgencyDuration + "s"
}
}
}
NDivider {
Layout.fillWidth: true
Layout.topMargin: Style.marginXL * scaling
Layout.bottomMargin: Style.marginXL * scaling
}
// Monitor Configuration
ColumnLayout {
spacing: Style.marginM * scaling
Layout.fillWidth: true
NHeader {
label: "Monitors display"
description: "Show notification on specific monitors. Defaults to all if none are chosen."
// Monitor Configuration
NLabel {
label: I18n.tr("settings.notifications.settings.monitors-display.label")
description: I18n.tr("settings.notifications.settings.monitors-display.description")
}
Repeater {
+32 -41
View File
@@ -12,8 +12,8 @@ ColumnLayout {
spacing: Style.marginL * scaling
NHeader {
label: "General settings"
description: "Manage screen recording output and content."
label: I18n.tr("settings.screen-recorder.general.section.label")
description: I18n.tr("settings.screen-recorder.general.section.description")
}
// Output Folder
@@ -22,27 +22,22 @@ ColumnLayout {
Layout.fillWidth: true
NTextInputButton {
label: "Output folder"
description: "Folder where screen recordings will be saved."
label: I18n.tr("settings.screen-recorder.general.output-folder.label")
description: I18n.tr("settings.screen-recorder.general.output-folder.description")
placeholderText: Quickshell.env("HOME") + "/Videos"
text: Settings.data.screenRecorder.directory
buttonIcon: "folder-open"
buttonTooltip: "Browse for output folder"
buttonTooltip: I18n.tr("settings.screen-recorder.general.output-folder.tooltip")
onInputEditingFinished: Settings.data.screenRecorder.directory = text
onButtonClicked: folderPicker.open()
}
ColumnLayout {
spacing: Style.marginS * scaling
Layout.fillWidth: true
Layout.topMargin: Style.marginM * scaling
// Show Cursor
NToggle {
label: "Show cursor"
description: "Record mouse cursor in the video."
checked: Settings.data.screenRecorder.showCursor
onToggled: checked => Settings.data.screenRecorder.showCursor = checked
}
// Show Cursor
NToggle {
label: I18n.tr("settings.screen-recorder.general.show-cursor.label")
description: I18n.tr("settings.screen-recorder.general.show-cursor.description")
checked: Settings.data.screenRecorder.showCursor
onToggled: checked => Settings.data.screenRecorder.showCursor = checked
}
}
@@ -58,13 +53,14 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Video settings"
label: I18n.tr("settings.screen-recorder.video.section.label")
description: I18n.tr("settings.screen-recorder.video.section.description")
}
// Source
NComboBox {
label: "Video source"
description: "Portal is recommended, if you get artifacts try Screen."
label: I18n.tr("settings.screen-recorder.video.video-source.label")
description: I18n.tr("settings.screen-recorder.video.video-source.description")
model: ListModel {
ListElement {
key: "portal"
@@ -81,8 +77,8 @@ ColumnLayout {
// Frame Rate
NComboBox {
label: "Frame rate"
description: "Target frame rate for screen recordings."
label: I18n.tr("settings.screen-recorder.video.frame-rate.label")
description: I18n.tr("settings.screen-recorder.video.frame-rate.description")
model: ListModel {
ListElement {
key: "30"
@@ -119,8 +115,8 @@ ColumnLayout {
// Video Quality
NComboBox {
label: "Video quality"
description: "Higher quality results in larger file sizes."
label: I18n.tr("settings.screen-recorder.video.video-quality.label")
description: I18n.tr("settings.screen-recorder.video.video-quality.description")
model: ListModel {
ListElement {
key: "medium"
@@ -145,8 +141,8 @@ ColumnLayout {
// Video Codec
NComboBox {
label: "Video codec"
description: "h264 is the most common codec."
label: I18n.tr("settings.screen-recorder.video.video-codec.label")
description: I18n.tr("settings.screen-recorder.video.video-codec.description")
model: ListModel {
ListElement {
key: "h264"
@@ -175,8 +171,8 @@ ColumnLayout {
// Color Range
NComboBox {
label: "Color range"
description: "Limited is recommended for better compatibility."
label: I18n.tr("settings.screen-recorder.video.color-range.label")
description: I18n.tr("settings.screen-recorder.video.color-range.description")
model: ListModel {
ListElement {
key: "limited"
@@ -194,8 +190,8 @@ ColumnLayout {
NDivider {
Layout.fillWidth: true
Layout.topMargin: Style.marginL * 2 * scaling
Layout.bottomMargin: Style.marginL * scaling
Layout.topMargin: Style.marginXL * scaling
Layout.bottomMargin: Style.marginXL * scaling
}
// Audio Settings
@@ -204,13 +200,14 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Audio settings"
label: I18n.tr("settings.screen-recorder.audio.section.label")
description: I18n.tr("settings.screen-recorder.audio.section.description")
}
// Audio Source
NComboBox {
label: "Audio source"
description: "Audio source to capture during recording."
label: I18n.tr("settings.screen-recorder.audio.audio-source.label")
description: I18n.tr("settings.screen-recorder.audio.audio-source.description")
model: ListModel {
ListElement {
key: "default_output"
@@ -231,8 +228,8 @@ ColumnLayout {
// Audio Codec
NComboBox {
label: "Audio codec"
description: "Opus is recommended for best performance and smallest audio size."
label: I18n.tr("settings.screen-recorder.audio.audio-codec.label")
description: I18n.tr("settings.screen-recorder.audio.audio-codec.description")
model: ListModel {
ListElement {
key: "opus"
@@ -248,16 +245,10 @@ ColumnLayout {
}
}
NDivider {
Layout.fillWidth: true
Layout.topMargin: Style.marginXL * scaling
Layout.bottomMargin: Style.marginXL * scaling
}
NFilePicker {
id: folderPicker
pickerType: "folder"
title: "Select output folder"
title: I18n.tr("settings.screen-recorder.general.select-output-folder")
initialPath: Settings.data.screenRecorder.directory || Quickshell.env("HOME") + "/Videos"
onAccepted: paths => Settings.data.screenRecorder.directory = paths[0]
}
+30 -30
View File
@@ -14,13 +14,13 @@ ColumnLayout {
property string specificFolderMonitorName: ""
NHeader {
label: "Wallpaper settings"
description: "Control how wallpapers are managed and displayed."
label: I18n.tr("settings.wallpaper.settings.section.label")
description: I18n.tr("settings.wallpaper.settings.section.description")
}
NToggle {
label: "Enable wallpaper management"
description: "Manage wallpapers with Noctalia. Uncheck if you prefer using another application."
label: I18n.tr("settings.wallpaper.settings.enable-management.label")
description: I18n.tr("settings.wallpaper.settings.enable-management.description")
checked: Settings.data.wallpaper.enabled
onToggled: checked => Settings.data.wallpaper.enabled = checked
Layout.bottomMargin: Style.marginL * scaling
@@ -33,11 +33,11 @@ ColumnLayout {
NTextInputButton {
id: wallpaperPathInput
label: "Wallpaper folder"
description: "Path to your main wallpaper folder."
label: I18n.tr("settings.wallpaper.settings.folder.label")
description: I18n.tr("settings.wallpaper.settings.folder.description")
text: Settings.data.wallpaper.directory
buttonIcon: "folder-open"
buttonTooltip: "Browse for wallpaper folder"
buttonTooltip: I18n.tr("settings.wallpaper.settings.folder.tooltip")
Layout.fillWidth: true
onInputEditingFinished: Settings.data.wallpaper.directory = text
onButtonClicked: mainFolderPicker.open()
@@ -45,8 +45,8 @@ ColumnLayout {
// Monitor-specific directories
NToggle {
label: "Monitor-specific directories"
description: "Set a different wallpaper folder for each monitor."
label: I18n.tr("settings.wallpaper.settings.monitor-specific.label")
description: I18n.tr("settings.wallpaper.settings.monitor-specific.description")
checked: Settings.data.wallpaper.enableMultiMonitorDirectories
onToggled: checked => Settings.data.wallpaper.enableMultiMonitorDirectories = checked
}
@@ -83,7 +83,7 @@ ColumnLayout {
NTextInputButton {
text: WallpaperService.getMonitorDirectory(modelData.name)
buttonIcon: "folder-open"
buttonTooltip: "Browse for wallpaper folder"
buttonTooltip: I18n.tr("settings.wallpaper.settings.monitor-specific.tooltip")
Layout.fillWidth: true
onInputEditingFinished: WallpaperService.setMonitorDirectory(modelData.name, text)
onButtonClicked: {
@@ -110,13 +110,13 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Look & feel"
label: I18n.tr("settings.wallpaper.look-feel.section.label")
}
// Fill Mode
NComboBox {
label: "Fill mode"
description: "Select how the image should scale to match your monitor's resolution."
label: I18n.tr("settings.wallpaper.look-feel.fill-mode.label")
description: I18n.tr("settings.wallpaper.look-feel.fill-mode.description")
model: WallpaperService.fillModeModel
currentKey: Settings.data.wallpaper.fillMode
onSelected: key => Settings.data.wallpaper.fillMode = key
@@ -124,8 +124,8 @@ ColumnLayout {
RowLayout {
NLabel {
label: "Fill color"
description: "Choose a fill color that may appear behind the wallpaper."
label: I18n.tr("settings.wallpaper.look-feel.fill-color.label")
description: I18n.tr("settings.wallpaper.look-feel.fill-color.description")
Layout.alignment: Qt.AlignTop
}
@@ -137,8 +137,8 @@ ColumnLayout {
// Transition Type
NComboBox {
label: "Transition type"
description: "Animation type when switching between wallpapers."
label: I18n.tr("settings.wallpaper.look-feel.transition-type.label")
description: I18n.tr("settings.wallpaper.look-feel.transition-type.description")
model: WallpaperService.transitionsModel
currentKey: Settings.data.wallpaper.transitionType
onSelected: key => Settings.data.wallpaper.transitionType = key
@@ -147,8 +147,8 @@ ColumnLayout {
// Transition Duration
ColumnLayout {
NLabel {
label: "Transition duration"
description: "Duration of transition animations in seconds."
label: I18n.tr("settings.wallpaper.look-feel.transition-duration.label")
description: I18n.tr("settings.wallpaper.look-feel.transition-duration.description")
}
NValueSlider {
@@ -165,8 +165,8 @@ ColumnLayout {
// Edge Smoothness
ColumnLayout {
NLabel {
label: "Soften transition edge"
description: "Applies a soft, feathered effect to the edge of transitions."
label: I18n.tr("settings.wallpaper.look-feel.edge-smoothness.label")
description: I18n.tr("settings.wallpaper.look-feel.edge-smoothness.description")
}
NValueSlider {
@@ -193,13 +193,13 @@ ColumnLayout {
Layout.fillWidth: true
NHeader {
label: "Automation"
label: I18n.tr("settings.wallpaper.automation.section.label")
}
// Random Wallpaper
NToggle {
label: "Random wallpaper"
description: "Schedule random wallpaper changes at regular intervals."
label: I18n.tr("settings.wallpaper.automation.random-wallpaper.label")
description: I18n.tr("settings.wallpaper.automation.random-wallpaper.description")
checked: Settings.data.wallpaper.randomEnabled
onToggled: checked => Settings.data.wallpaper.randomEnabled = checked
}
@@ -209,8 +209,8 @@ ColumnLayout {
visible: Settings.data.wallpaper.randomEnabled
RowLayout {
NLabel {
label: "Wallpaper interval"
description: "How often to change wallpapers automatically."
label: I18n.tr("settings.wallpaper.automation.interval.label")
description: I18n.tr("settings.wallpaper.automation.interval.description")
Layout.fillWidth: true
}
@@ -275,8 +275,8 @@ ColumnLayout {
Layout.topMargin: Style.marginS * scaling
NTextInput {
label: "Custom interval"
description: "Enter time as HH:MM (e.g., 01:30)."
label: I18n.tr("settings.wallpaper.automation.custom-interval.label")
description: I18n.tr("settings.wallpaper.automation.custom-interval.description")
text: {
const s = Settings.data.wallpaper.randomIntervalSec
const h = Math.floor(s / 3600)
@@ -341,14 +341,14 @@ ColumnLayout {
NFilePicker {
id: mainFolderPicker
pickerType: "folder"
title: "Select wallpaper folder"
title: I18n.tr("settings.wallpaper.settings.select-folder")
onAccepted: paths => Settings.data.wallpaper.directory = paths[0]
}
NFilePicker {
id: monitorFolderPicker
pickerType: "folder"
title: "Select monitor wallpaper folder"
title: I18n.tr("settings.wallpaper.settings.select-monitor-folder")
onAccepted: paths => WallpaperService.setMonitorDirectory(specificFolderMonitorName, paths[0])
}
}