diff --git a/quickshell/Modules/ControlCenter/BuiltinPlugins/VpnWidget.qml b/quickshell/Modules/ControlCenter/BuiltinPlugins/VpnWidget.qml index b8d2a78f..531045e8 100644 --- a/quickshell/Modules/ControlCenter/BuiltinPlugins/VpnWidget.qml +++ b/quickshell/Modules/ControlCenter/BuiltinPlugins/VpnWidget.qml @@ -12,7 +12,7 @@ PluginComponent { } ccWidgetIcon: DMSNetworkService.isBusy ? "sync" : (DMSNetworkService.connected ? "vpn_lock" : "vpn_key_off") - ccWidgetPrimaryText: "VPN" + ccWidgetPrimaryText: I18n.tr("VPN") ccWidgetSecondaryText: { if (!DMSNetworkService.connected) return I18n.tr("Disconnected"); diff --git a/quickshell/Modules/ControlCenter/Components/HeaderPane.qml b/quickshell/Modules/ControlCenter/Components/HeaderPane.qml index 6049a480..382b2e52 100644 --- a/quickshell/Modules/ControlCenter/Components/HeaderPane.qml +++ b/quickshell/Modules/ControlCenter/Components/HeaderPane.qml @@ -51,13 +51,13 @@ Rectangle { spacing: 2 Typography { - text: UserInfoService.fullName || UserInfoService.username || "User" + text: UserInfoService.fullName || UserInfoService.username || I18n.tr("User") style: Typography.Style.Subtitle color: Theme.surfaceText } Typography { - text: DgopService.uptime || "Unknown" + text: DgopService.uptime || I18n.tr("Unknown") style: Typography.Style.Caption color: Theme.surfaceVariantText } diff --git a/quickshell/Modules/ControlCenter/Details/AudioInputDetail.qml b/quickshell/Modules/ControlCenter/Details/AudioInputDetail.qml index adef44d1..453cf2f9 100644 --- a/quickshell/Modules/ControlCenter/Details/AudioInputDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/AudioInputDetail.qml @@ -201,7 +201,7 @@ Rectangle { } StyledText { - text: modelData === AudioService.source ? "Active" : "Available" + text: modelData === AudioService.source ? I18n.tr("Active") : I18n.tr("Available") font.pixelSize: Theme.fontSizeSmall color: Theme.surfaceVariantText elide: Text.ElideRight @@ -241,7 +241,7 @@ Rectangle { StyledText { text: { const isThisDevicePinned = (SettingsData.audioInputDevicePins || {})["preferredInput"] === modelData.name; - return isThisDevicePinned ? "Pinned" : "Pin"; + return isThisDevicePinned ? I18n.tr("Pinned") : I18n.tr("Pin"); } font.pixelSize: Theme.fontSizeSmall color: { diff --git a/quickshell/Modules/ControlCenter/Details/AudioOutputDetail.qml b/quickshell/Modules/ControlCenter/Details/AudioOutputDetail.qml index ca6f158e..7166a1f6 100644 --- a/quickshell/Modules/ControlCenter/Details/AudioOutputDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/AudioOutputDetail.qml @@ -211,7 +211,7 @@ Rectangle { } StyledText { - text: modelData === AudioService.sink ? "Active" : "Available" + text: modelData === AudioService.sink ? I18n.tr("Active") : I18n.tr("Available") font.pixelSize: Theme.fontSizeSmall color: Theme.surfaceVariantText elide: Text.ElideRight @@ -251,7 +251,7 @@ Rectangle { StyledText { text: { const isThisDevicePinned = (SettingsData.audioOutputDevicePins || {})["preferredOutput"] === modelData.name; - return isThisDevicePinned ? "Pinned" : "Pin"; + return isThisDevicePinned ? I18n.tr("Pinned") : I18n.tr("Pin"); } font.pixelSize: Theme.fontSizeSmall color: { diff --git a/quickshell/Modules/ControlCenter/Details/BatteryDetail.qml b/quickshell/Modules/ControlCenter/Details/BatteryDetail.qml index 19fac6fb..dce400cc 100644 --- a/quickshell/Modules/ControlCenter/Details/BatteryDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/BatteryDetail.qml @@ -1,6 +1,4 @@ import QtQuick -import QtQuick.Controls -import Quickshell import Quickshell.Services.UPower import qs.Common import qs.Services @@ -66,7 +64,7 @@ Rectangle { spacing: Theme.spacingS StyledText { - text: BatteryService.batteryAvailable ? `${BatteryService.batteryLevel}%` : "Power" + text: BatteryService.batteryAvailable ? `${BatteryService.batteryLevel}%` : I18n.tr("Power") font.pixelSize: Theme.fontSizeXLarge color: { if (BatteryService.isLowBattery && !BatteryService.isCharging) { @@ -81,7 +79,7 @@ Rectangle { } StyledText { - text: BatteryService.batteryAvailable ? BatteryService.batteryStatus : "Management" + text: BatteryService.batteryAvailable ? BatteryService.batteryStatus : I18n.tr("Management") font.pixelSize: Theme.fontSizeLarge color: { if (BatteryService.isLowBattery && !BatteryService.isCharging) { @@ -100,10 +98,10 @@ Rectangle { StyledText { text: { if (!BatteryService.batteryAvailable) - return "Power profile management available"; + return I18n.tr("Power profile management available"); const time = BatteryService.formatTimeRemaining(); if (time !== "Unknown") { - return BatteryService.isCharging ? `Time until full: ${time}` : `Time remaining: ${time}`; + return BatteryService.isCharging ? I18n.tr("Time until full: %1").arg(time) : I18n.tr("Time remaining: %1").arg(time); } return ""; } @@ -176,7 +174,7 @@ Rectangle { } StyledText { - text: BatteryService.batteryCapacity > 0 ? `${BatteryService.batteryCapacity.toFixed(1)} Wh` : "Unknown" + text: BatteryService.batteryCapacity > 0 ? `${BatteryService.batteryCapacity.toFixed(1)} Wh` : I18n.tr("Unknown") font.pixelSize: Theme.fontSizeLarge color: Theme.surfaceText font.weight: Font.Bold diff --git a/quickshell/Modules/ControlCenter/Details/BluetoothCodecSelector.qml b/quickshell/Modules/ControlCenter/Details/BluetoothCodecSelector.qml index c287fb2e..df1f8159 100644 --- a/quickshell/Modules/ControlCenter/Details/BluetoothCodecSelector.qml +++ b/quickshell/Modules/ControlCenter/Details/BluetoothCodecSelector.qml @@ -1,7 +1,4 @@ import QtQuick -import QtQuick.Controls -import Quickshell -import Quickshell.Io import qs.Common import qs.Services import qs.Widgets @@ -42,7 +39,7 @@ Item { if (!device) return; - BluetoothService.getAvailableCodecs(device, function(codecs, current) { + BluetoothService.getAvailableCodecs(device, function (codecs, current) { availableCodecs = codecs; currentCodec = current; isLoading = false; @@ -60,7 +57,7 @@ Item { } isLoading = true; - BluetoothService.switchCodec(device, profileName, function(success, message) { + BluetoothService.switchCodec(device, profileName, function (success, message) { isLoading = false; if (success) { ToastService.showToast(message, ToastService.levelInfo); @@ -85,8 +82,12 @@ Item { propagateComposedEvents: false onClicked: root.hide() - onWheel: (wheel) => { wheel.accepted = true } - onPositionChanged: (mouse) => { mouse.accepted = true } + onWheel: wheel => { + wheel.accepted = true; + } + onPositionChanged: mouse => { + mouse.accepted = true; + } } Rectangle { @@ -111,8 +112,8 @@ Item { enabled: root.visible Keys.onEscapePressed: { - root.hide() - event.accepted = true + root.hide(); + event.accepted = true; } } @@ -133,9 +134,15 @@ Item { hoverEnabled: true preventStealing: true propagateComposedEvents: false - onClicked: (mouse) => { mouse.accepted = true } - onWheel: (wheel) => { wheel.accepted = true } - onPositionChanged: (mouse) => { mouse.accepted = true } + onClicked: mouse => { + mouse.accepted = true; + } + onWheel: wheel => { + wheel.accepted = true; + } + onPositionChanged: mouse => { + mouse.accepted = true; + } } Column { @@ -174,9 +181,7 @@ Item { font.pixelSize: Theme.fontSizeSmall color: Theme.surfaceTextMedium } - } - } Rectangle { @@ -186,7 +191,7 @@ Item { } StyledText { - text: isLoading ? "Loading codecs..." : `Current: ${currentCodec}` + text: isLoading ? I18n.tr("Loading codecs...") : I18n.tr("Current: %1").arg(currentCodec) font.pixelSize: Theme.fontSizeSmall color: isLoading ? Theme.primary : Theme.surfaceTextMedium font.weight: Font.Medium @@ -245,9 +250,7 @@ Item { font.pixelSize: Theme.fontSizeSmall color: Theme.surfaceTextMedium } - } - } DankIcon { @@ -271,14 +274,9 @@ Item { selectCodec(modelData.profile); } } - - } - } - } - } Behavior on opacity { @@ -286,7 +284,6 @@ Item { duration: Theme.mediumDuration easing.type: Theme.emphasizedEasing } - } Behavior on scale { @@ -294,8 +291,6 @@ Item { duration: Theme.mediumDuration easing.type: Theme.emphasizedEasing } - } - } } diff --git a/quickshell/Modules/ControlCenter/Details/BluetoothDetail.qml b/quickshell/Modules/ControlCenter/Details/BluetoothDetail.qml index b209c67c..cccf8f82 100644 --- a/quickshell/Modules/ControlCenter/Details/BluetoothDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/BluetoothDetail.qml @@ -113,7 +113,7 @@ Rectangle { } StyledText { - text: BluetoothService.adapter && BluetoothService.adapter.discovering ? "Scanning" : "Scan" + text: BluetoothService.adapter && BluetoothService.adapter.discovering ? I18n.tr("Scanning") : I18n.tr("Scan") color: BluetoothService.adapter && BluetoothService.adapter.enabled ? Theme.primary : Theme.surfaceVariantText font.pixelSize: Theme.fontSizeMedium font.weight: Font.Medium @@ -231,7 +231,7 @@ Rectangle { width: 200 StyledText { - text: modelData.name || modelData.deviceName || "Unknown Device" + text: modelData.name || modelData.deviceName || I18n.tr("Unknown Device") font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceText font.weight: modelData.connected ? Font.Medium : Font.Normal @@ -245,15 +245,15 @@ Rectangle { StyledText { text: { if (modelData.state === BluetoothDeviceState.Connecting) - return "Connecting..." + return I18n.tr("Connecting...") if (modelData.connected) { - let status = "Connected" + let status = I18n.tr("Connected") if (currentCodec) { status += " • " + currentCodec } return status } - return "Paired" + return I18n.tr("Paired") } font.pixelSize: Theme.fontSizeSmall color: { @@ -320,7 +320,7 @@ Rectangle { StyledText { text: { const isThisDevicePinned = (SettingsData.bluetoothDevicePins || {})["preferredDevice"] === modelData.address - return isThisDevicePinned ? "Pinned" : "Pin" + return isThisDevicePinned ? I18n.tr("Pinned") : I18n.tr("Pin") } font.pixelSize: Theme.fontSizeSmall color: { @@ -458,7 +458,7 @@ Rectangle { width: 200 StyledText { - text: modelData.name || modelData.deviceName || "Unknown Device" + text: modelData.name || modelData.deviceName || I18n.tr("Unknown Device") font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceText elide: Text.ElideRight @@ -470,8 +470,8 @@ Rectangle { StyledText { text: { - if (modelData.pairing || isBusy) return "Pairing..." - if (modelData.blocked) return "Blocked" + if (modelData.pairing || isBusy) return I18n.tr("Pairing...") + if (modelData.blocked) return I18n.tr("Blocked") return BluetoothService.getSignalStrength(modelData) } font.pixelSize: Theme.fontSizeSmall @@ -493,9 +493,9 @@ Rectangle { anchors.rightMargin: Theme.spacingM anchors.verticalCenter: parent.verticalCenter text: { - if (isBusy) return "Pairing..." - if (!canConnect) return "Cannot pair" - return "Pair" + if (isBusy) return I18n.tr("Pairing...") + if (!canConnect) return I18n.tr("Cannot pair") + return I18n.tr("Pair") } font.pixelSize: Theme.fontSizeSmall color: (canConnect && !isBusy) ? Theme.primary : Theme.surfaceVariantText @@ -546,7 +546,7 @@ Rectangle { } MenuItem { - text: bluetoothContextMenu.currentDevice && bluetoothContextMenu.currentDevice.connected ? "Disconnect" : "Connect" + text: bluetoothContextMenu.currentDevice && bluetoothContextMenu.currentDevice.connected ? I18n.tr("Disconnect") : I18n.tr("Connect") height: 32 contentItem: StyledText { diff --git a/quickshell/Modules/ControlCenter/Details/BrightnessDetail.qml b/quickshell/Modules/ControlCenter/Details/BrightnessDetail.qml index 3e7cd797..04702871 100644 --- a/quickshell/Modules/ControlCenter/Details/BrightnessDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/BrightnessDetail.qml @@ -141,7 +141,7 @@ Rectangle { StyledText { anchors.horizontalCenter: parent.horizontalCenter - text: DisplayService.brightnessAvailable ? "No brightness devices available" : "Brightness control not available" + text: DisplayService.brightnessAvailable ? I18n.tr("No brightness devices available") : I18n.tr("Brightness control not available") font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceText horizontalAlignment: Text.AlignHCenter @@ -173,7 +173,7 @@ Rectangle { } StyledText { - text: root.getScreenPinKey() || "Unknown Monitor" + text: root.getScreenPinKey() || I18n.tr("Unknown Monitor") font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceText anchors.verticalCenter: parent.verticalCenter @@ -201,7 +201,7 @@ Rectangle { } StyledText { - text: isPinnedToScreen ? "Pinned" : "Pin" + text: isPinnedToScreen ? I18n.tr("Pinned") : I18n.tr("Pin") font.pixelSize: Theme.fontSizeSmall color: isPinnedToScreen ? Theme.primary : Theme.surfaceText anchors.verticalCenter: parent.verticalCenter @@ -317,11 +317,11 @@ Rectangle { text: { const deviceClass = modelData.class || ""; if (deviceClass === "backlight") - return "Backlight device"; + return I18n.tr("Backlight device"); if (deviceClass === "ddc") - return "DDC/CI monitor"; + return I18n.tr("DDC/CI monitor"); if (deviceClass === "leds") - return "LED device"; + return I18n.tr("LED device"); return deviceClass; } font.pixelSize: Theme.fontSizeSmall @@ -430,7 +430,7 @@ Rectangle { } StyledText { - text: SessionData.getBrightnessExponential(modelData.name) ? "Exponential" : "Linear" + text: SessionData.getBrightnessExponential(modelData.name) ? I18n.tr("Exponential") : I18n.tr("Linear") font.pixelSize: Theme.fontSizeSmall color: SessionData.getBrightnessExponential(modelData.name) ? Theme.primary : Theme.surfaceText anchors.verticalCenter: parent.verticalCenter diff --git a/quickshell/Modules/ControlCenter/Details/DiskUsageDetail.qml b/quickshell/Modules/ControlCenter/Details/DiskUsageDetail.qml index c08476d9..529e2aee 100644 --- a/quickshell/Modules/ControlCenter/Details/DiskUsageDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/DiskUsageDetail.qml @@ -1,6 +1,4 @@ import QtQuick -import QtQuick.Controls -import Quickshell import qs.Common import qs.Services import qs.Widgets @@ -20,11 +18,11 @@ Rectangle { border.width: 0 Component.onCompleted: { - DgopService.addRef(["diskmounts"]) + DgopService.addRef(["diskmounts"]); } Component.onDestruction: { - DgopService.removeRef(["diskmounts"]) + DgopService.removeRef(["diskmounts"]); } DankFlickable { @@ -61,7 +59,7 @@ Rectangle { StyledText { anchors.horizontalCenter: parent.horizontalCenter - text: DgopService.dgopAvailable ? "No disk data available" : "dgop not available" + text: DgopService.dgopAvailable ? I18n.tr("No disk data available") : I18n.tr("dgop not available") font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceText horizontalAlignment: Text.AlignHCenter @@ -96,20 +94,22 @@ Rectangle { name: "storage" size: Theme.iconSize color: { - const percentStr = modelData.percent?.replace("%", "") || "0" - const percent = parseFloat(percentStr) || 0 - if (percent > 90) return Theme.error - if (percent > 75) return Theme.warning - return modelData.mount === currentMountPath ? Theme.primary : Theme.surfaceText + const percentStr = modelData.percent?.replace("%", "") || "0"; + const percent = parseFloat(percentStr) || 0; + if (percent > 90) + return Theme.error; + if (percent > 75) + return Theme.warning; + return modelData.mount === currentMountPath ? Theme.primary : Theme.surfaceText; } anchors.horizontalCenter: parent.horizontalCenter } StyledText { text: { - const percentStr = modelData.percent?.replace("%", "") || "0" - const percent = parseFloat(percentStr) || 0 - return percent.toFixed(0) + "%" + const percentStr = modelData.percent?.replace("%", "") || "0"; + const percent = parseFloat(percentStr) || 0; + return percent.toFixed(0) + "%"; } font.pixelSize: Theme.fontSizeSmall color: Theme.surfaceText @@ -122,7 +122,7 @@ Rectangle { width: parent.parent.width - parent.parent.anchors.leftMargin - parent.spacing - 50 - Theme.spacingM StyledText { - text: modelData.mount === "/" ? "Root Filesystem" : modelData.mount + text: modelData.mount === "/" ? I18n.tr("Root Filesystem") : modelData.mount font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceText font.weight: modelData.mount === currentMountPath ? Font.Medium : Font.Normal @@ -154,11 +154,10 @@ Rectangle { hoverEnabled: true cursorShape: Qt.PointingHandCursor onClicked: { - currentMountPath = modelData.mount - mountPathChanged(modelData.mount) + currentMountPath = modelData.mount; + mountPathChanged(modelData.mount); } } - } } } diff --git a/quickshell/Modules/ControlCenter/Details/NetworkDetail.qml b/quickshell/Modules/ControlCenter/Details/NetworkDetail.qml index 8be386f3..b67fdf51 100644 --- a/quickshell/Modules/ControlCenter/Details/NetworkDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/NetworkDetail.qml @@ -118,7 +118,7 @@ Rectangle { buttonHeight: 28 textSize: Theme.fontSizeSmall - model: ["Ethernet", "WiFi"] + model: [I18n.tr("Ethernet"), I18n.tr("WiFi")] currentIndex: currentPreferenceIndex selectionMode: "single" onSelectionChanged: (index, selected) => { @@ -173,7 +173,7 @@ Rectangle { StyledText { anchors.horizontalCenter: parent.horizontalCenter - text: NetworkService.wifiEnabled ? "Disabling WiFi..." : "Enabling WiFi..." + text: NetworkService.wifiEnabled ? I18n.tr("Disabling WiFi...") : I18n.tr("Enabling WiFi...") font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceText horizontalAlignment: Text.AlignHCenter @@ -303,7 +303,7 @@ Rectangle { width: 200 StyledText { - text: modelData.id || "Unknown Config" + text: modelData.id || I18n.tr("Unknown Config") font.pixelSize: Theme.fontSizeMedium color: modelData.isActive ? Theme.primary : Theme.surfaceText font.weight: modelData.isActive ? Font.Medium : Font.Normal @@ -549,7 +549,7 @@ Rectangle { width: 200 StyledText { - text: modelData.ssid || "Unknown Network" + text: modelData.ssid || I18n.tr("Unknown Network") font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceText font.weight: modelData.ssid === NetworkService.currentWifiSSID ? Font.Medium : Font.Normal @@ -561,13 +561,13 @@ Rectangle { spacing: Theme.spacingXS StyledText { - text: modelData.ssid === NetworkService.currentWifiSSID ? "Connected •" : (modelData.secured ? "Secured •" : "Open •") + text: modelData.ssid === NetworkService.currentWifiSSID ? I18n.tr("Connected") + " •" : (modelData.secured ? I18n.tr("Secured") + " •" : I18n.tr("Open") + " •") font.pixelSize: Theme.fontSizeSmall color: Theme.surfaceVariantText } StyledText { - text: modelData.saved ? "Saved" : "" + text: modelData.saved ? I18n.tr("Saved") : "" font.pixelSize: Theme.fontSizeSmall color: Theme.primary visible: text.length > 0 @@ -635,7 +635,7 @@ Rectangle { StyledText { text: { const isThisNetworkPinned = (SettingsData.wifiNetworkPins || {})["preferredWifi"] === modelData.ssid; - return isThisNetworkPinned ? "Pinned" : "Pin"; + return isThisNetworkPinned ? I18n.tr("Pinned") : I18n.tr("Pin"); } font.pixelSize: Theme.fontSizeSmall color: { @@ -714,7 +714,7 @@ Rectangle { } MenuItem { - text: networkContextMenu.currentConnected ? "Disconnect" : "Connect" + text: networkContextMenu.currentConnected ? I18n.tr("Disconnect") : I18n.tr("Connect") height: 32 contentItem: StyledText { diff --git a/quickshell/Modules/ControlCenter/Models/WidgetModel.qml b/quickshell/Modules/ControlCenter/Models/WidgetModel.qml index 1f4e1e1a..2192682b 100644 --- a/quickshell/Modules/ControlCenter/Models/WidgetModel.qml +++ b/quickshell/Modules/ControlCenter/Models/WidgetModel.qml @@ -65,141 +65,141 @@ QtObject { readonly property var coreWidgetDefinitions: [ { "id": "nightMode", - "text": "Night Mode", - "description": "Blue light filter", + "text": I18n.tr("Night Mode"), + "description": I18n.tr("Blue light filter"), "icon": "nightlight", "type": "toggle", "enabled": DisplayService.automationAvailable, - "warning": !DisplayService.automationAvailable ? "Requires night mode support" : undefined + "warning": !DisplayService.automationAvailable ? I18n.tr("Requires night mode support") : undefined }, { "id": "darkMode", - "text": "Dark Mode", - "description": "System theme toggle", + "text": I18n.tr("Dark Mode"), + "description": I18n.tr("System theme toggle"), "icon": "contrast", "type": "toggle", "enabled": true }, { "id": "doNotDisturb", - "text": "Do Not Disturb", - "description": "Block notifications", + "text": I18n.tr("Do Not Disturb"), + "description": I18n.tr("Block notifications"), "icon": "do_not_disturb_on", "type": "toggle", "enabled": true }, { "id": "idleInhibitor", - "text": "Keep Awake", - "description": "Prevent screen timeout", + "text": I18n.tr("Keep Awake"), + "description": I18n.tr("Prevent screen timeout"), "icon": "motion_sensor_active", "type": "toggle", "enabled": true }, { "id": "wifi", - "text": "Network", - "description": "Wi-Fi and Ethernet connection", + "text": I18n.tr("Network"), + "description": I18n.tr("Wi-Fi and Ethernet connection"), "icon": "wifi", "type": "connection", "enabled": NetworkService.wifiAvailable, - "warning": !NetworkService.wifiAvailable ? "Wi-Fi not available" : undefined + "warning": !NetworkService.wifiAvailable ? I18n.tr("Wi-Fi not available") : undefined }, { "id": "bluetooth", - "text": "Bluetooth", - "description": "Device connections", + "text": I18n.tr("Bluetooth"), + "description": I18n.tr("Device connections"), "icon": "bluetooth", "type": "connection", "enabled": BluetoothService.available, - "warning": !BluetoothService.available ? "Bluetooth not available" : undefined + "warning": !BluetoothService.available ? I18n.tr("Bluetooth not available") : undefined }, { "id": "audioOutput", - "text": "Audio Output", - "description": "Speaker settings", + "text": I18n.tr("Audio Output"), + "description": I18n.tr("Speaker settings"), "icon": "volume_up", "type": "connection", "enabled": true }, { "id": "audioInput", - "text": "Audio Input", - "description": "Microphone settings", + "text": I18n.tr("Audio Input"), + "description": I18n.tr("Microphone settings"), "icon": "mic", "type": "connection", "enabled": true }, { "id": "volumeSlider", - "text": "Volume Slider", - "description": "Audio volume control", + "text": I18n.tr("Volume Slider"), + "description": I18n.tr("Audio volume control"), "icon": "volume_up", "type": "slider", "enabled": true }, { "id": "brightnessSlider", - "text": "Brightness Slider", - "description": "Display brightness control", + "text": I18n.tr("Brightness Slider"), + "description": I18n.tr("Display brightness control"), "icon": "brightness_6", "type": "slider", "enabled": DisplayService.brightnessAvailable, - "warning": !DisplayService.brightnessAvailable ? "Brightness control not available" : undefined, + "warning": !DisplayService.brightnessAvailable ? I18n.tr("Brightness control not available") : undefined, "allowMultiple": true }, { "id": "inputVolumeSlider", - "text": "Input Volume Slider", - "description": "Microphone volume control", + "text": I18n.tr("Input Volume Slider"), + "description": I18n.tr("Microphone volume control"), "icon": "mic", "type": "slider", "enabled": true }, { "id": "battery", - "text": "Battery", - "description": "Battery and power management", + "text": I18n.tr("Battery"), + "description": I18n.tr("Battery and power management"), "icon": "battery_std", "type": "action", "enabled": true }, { "id": "diskUsage", - "text": "Disk Usage", - "description": "Filesystem usage monitoring", + "text": I18n.tr("Disk Usage"), + "description": I18n.tr("Filesystem usage monitoring"), "icon": "storage", "type": "action", "enabled": DgopService.dgopAvailable, - "warning": !DgopService.dgopAvailable ? "Requires 'dgop' tool" : undefined, + "warning": !DgopService.dgopAvailable ? I18n.tr("Requires 'dgop' tool") : undefined, "allowMultiple": true }, { "id": "colorPicker", - "text": "Color Picker", - "description": "Choose colors from palette", + "text": I18n.tr("Color Picker"), + "description": I18n.tr("Choose colors from palette"), "icon": "palette", "type": "action", "enabled": true }, { "id": "builtin_vpn", - "text": "VPN", - "description": "VPN connections", + "text": I18n.tr("VPN"), + "description": I18n.tr("VPN connections"), "icon": "vpn_key", "type": "builtin_plugin", "enabled": DMSNetworkService.available, - "warning": !DMSNetworkService.available ? "VPN not available" : undefined, + "warning": !DMSNetworkService.available ? I18n.tr("VPN not available") : undefined, "isBuiltinPlugin": true }, { "id": "builtin_cups", - "text": "Printers", - "description": "Print Server Management", + "text": I18n.tr("Printers"), + "description": I18n.tr("Print Server Management"), "icon": "Print", "type": "builtin_plugin", "enabled": CupsService.available, - "warning": !CupsService.available ? "CUPS not available" : undefined, + "warning": !CupsService.available ? I18n.tr("CUPS not available") : undefined, "isBuiltinPlugin": true } ] @@ -235,7 +235,7 @@ QtObject { plugins.push({ "id": "plugin_" + plugin.id, "pluginId": plugin.id, - "text": plugin.name || "Plugin", + "text": plugin.name || I18n.tr("Plugin"), "description": plugin.description || "", "icon": plugin.icon || "extension", "type": "plugin", diff --git a/quickshell/Modules/ControlCenter/Widgets/BatteryPill.qml b/quickshell/Modules/ControlCenter/Widgets/BatteryPill.qml index 76516534..c14c3087 100644 --- a/quickshell/Modules/ControlCenter/Widgets/BatteryPill.qml +++ b/quickshell/Modules/ControlCenter/Widgets/BatteryPill.qml @@ -1,8 +1,6 @@ import QtQuick -import Quickshell import qs.Common import qs.Services -import qs.Widgets import qs.Modules.ControlCenter.Widgets CompoundPill { @@ -14,35 +12,35 @@ CompoundPill { primaryText: { if (!BatteryService.batteryAvailable) { - return "No battery" + return I18n.tr("No battery"); } - return "Battery" + return I18n.tr("Battery"); } secondaryText: { if (!BatteryService.batteryAvailable) { - return "Not available" + return I18n.tr("Not available"); } if (BatteryService.isCharging) { - return `${BatteryService.batteryLevel}% • Charging` + return `${BatteryService.batteryLevel}% • ` + I18n.tr("Charging"); } if (BatteryService.isPluggedIn) { - return `${BatteryService.batteryLevel}% • Plugged in` + return `${BatteryService.batteryLevel}% • ` + I18n.tr("Plugged in"); } - return `${BatteryService.batteryLevel}%` + return `${BatteryService.batteryLevel}%`; } iconColor: { if (BatteryService.isLowBattery && !BatteryService.isCharging) { - return Theme.error + return Theme.error; } if (BatteryService.isCharging || BatteryService.isPluggedIn) { - return Theme.primary + return Theme.primary; } - return Theme.surfaceText + return Theme.surfaceText; } onToggled: { - expandClicked() + expandClicked(); } } diff --git a/quickshell/Modules/ControlCenter/Widgets/ColorPickerPill.qml b/quickshell/Modules/ControlCenter/Widgets/ColorPickerPill.qml index 238360a1..a95410bb 100644 --- a/quickshell/Modules/ControlCenter/Widgets/ColorPickerPill.qml +++ b/quickshell/Modules/ControlCenter/Widgets/ColorPickerPill.qml @@ -1,9 +1,5 @@ import QtQuick -import QtQuick.Controls -import Quickshell import qs.Common -import qs.Services -import qs.Widgets import qs.Modules.ControlCenter.Widgets CompoundPill { @@ -14,20 +10,20 @@ CompoundPill { isActive: true iconName: "palette" iconColor: Theme.primary - primaryText: "Color Picker" - secondaryText: "Choose a color" + primaryText: I18n.tr("Color Picker") + secondaryText: I18n.tr("Choose a color") onToggled: { - console.log("ColorPickerPill toggled, modal:", colorPickerModal) + console.log("ColorPickerPill toggled, modal:", colorPickerModal); if (colorPickerModal) { - colorPickerModal.show() + colorPickerModal.show(); } } onExpandClicked: { - console.log("ColorPickerPill expandClicked, modal:", colorPickerModal) + console.log("ColorPickerPill expandClicked, modal:", colorPickerModal); if (colorPickerModal) { - colorPickerModal.show() + colorPickerModal.show(); } } } diff --git a/quickshell/Modules/ControlCenter/Widgets/DiskUsagePill.qml b/quickshell/Modules/ControlCenter/Widgets/DiskUsagePill.qml index f0917274..827df4ec 100644 --- a/quickshell/Modules/ControlCenter/Widgets/DiskUsagePill.qml +++ b/quickshell/Modules/ControlCenter/Widgets/DiskUsagePill.qml @@ -1,8 +1,6 @@ import QtQuick -import Quickshell import qs.Common import qs.Services -import qs.Widgets import qs.Modules.ControlCenter.Widgets CompoundPill { @@ -15,64 +13,64 @@ CompoundPill { property var selectedMount: { if (!DgopService.diskMounts || DgopService.diskMounts.length === 0) { - return null + return null; } - const targetMount = DgopService.diskMounts.find(mount => mount.mount === mountPath) - return targetMount || DgopService.diskMounts.find(mount => mount.mount === "/") || DgopService.diskMounts[0] + const targetMount = DgopService.diskMounts.find(mount => mount.mount === mountPath); + return targetMount || DgopService.diskMounts.find(mount => mount.mount === "/") || DgopService.diskMounts[0]; } property real usagePercent: { if (!selectedMount || !selectedMount.percent) { - return 0 + return 0; } - const percentStr = selectedMount.percent.replace("%", "") - return parseFloat(percentStr) || 0 + const percentStr = selectedMount.percent.replace("%", ""); + return parseFloat(percentStr) || 0; } isActive: DgopService.dgopAvailable && selectedMount !== null primaryText: { if (!DgopService.dgopAvailable) { - return "Disk Usage" + return I18n.tr("Disk Usage"); } if (!selectedMount) { - return "No disk data" + return I18n.tr("No disk data"); } - return selectedMount.mount + return selectedMount.mount; } secondaryText: { if (!DgopService.dgopAvailable) { - return "dgop not available" + return I18n.tr("dgop not available"); } if (!selectedMount) { - return "No disk data available" + return I18n.tr("No disk data available"); } - return `${selectedMount.used} / ${selectedMount.size} (${usagePercent.toFixed(0)}%)` + return `${selectedMount.used} / ${selectedMount.size} (${usagePercent.toFixed(0)}%)`; } iconColor: { if (!DgopService.dgopAvailable || !selectedMount) { - return Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.5) + return Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.5); } if (usagePercent > 90) { - return Theme.error + return Theme.error; } if (usagePercent > 75) { - return Theme.warning + return Theme.warning; } - return Theme.surfaceText + return Theme.surfaceText; } Component.onCompleted: { - DgopService.addRef(["diskmounts"]) + DgopService.addRef(["diskmounts"]); } Component.onDestruction: { - DgopService.removeRef(["diskmounts"]) + DgopService.removeRef(["diskmounts"]); } onToggled: { - expandClicked() + expandClicked(); } } diff --git a/quickshell/Modules/Settings/ClipboardTab.qml b/quickshell/Modules/Settings/ClipboardTab.qml index a1d6e302..663bd3f5 100644 --- a/quickshell/Modules/Settings/ClipboardTab.qml +++ b/quickshell/Modules/Settings/ClipboardTab.qml @@ -172,7 +172,7 @@ Item { DMSService.sendRequest("clipboard.setConfig", params, response => { saving = false; if (response.error) { - ToastService.showError(I18n.tr("Failed to save clipboard setting")); + ToastService.showError(I18n.tr("Failed to save clipboard setting"), response.error); return; } loadConfig(); diff --git a/quickshell/Modules/Settings/DisplayWidgetsTab.qml b/quickshell/Modules/Settings/DisplayWidgetsTab.qml index 16bc58da..1ca31cf3 100644 --- a/quickshell/Modules/Settings/DisplayWidgetsTab.qml +++ b/quickshell/Modules/Settings/DisplayWidgetsTab.qml @@ -189,7 +189,7 @@ Item { spacing: Theme.spacingM StyledText { - text: I18n.tr("Available Screens (") + Quickshell.screens.length + ")" + text: I18n.tr("Available Screens (%1)").arg(Quickshell.screens.length) font.pixelSize: Theme.fontSizeMedium font.weight: Font.Medium color: Theme.surfaceText diff --git a/quickshell/Modules/Settings/KeybindsTab.qml b/quickshell/Modules/Settings/KeybindsTab.qml index ad35caed..4591188a 100644 --- a/quickshell/Modules/Settings/KeybindsTab.qml +++ b/quickshell/Modules/Settings/KeybindsTab.qml @@ -333,10 +333,10 @@ Item { visible: warningBox.showError || warningBox.showSetup text: { if (KeybindsService.fixing) - return I18n.tr("Fixing...") + return I18n.tr("Fixing..."); if (warningBox.showSetup) - return I18n.tr("Setup") - return I18n.tr("Fix Now") + return I18n.tr("Setup"); + return I18n.tr("Fix Now"); } backgroundColor: Theme.primary textColor: Theme.primaryText @@ -510,7 +510,7 @@ Item { } StyledText { - text: KeybindsService.loading ? I18n.tr("Shortcuts") : I18n.tr("Shortcuts") + " (" + keybindsTab._filteredBinds.length + ")" + text: KeybindsService.loading ? I18n.tr("Shortcuts") : I18n.tr("Shortcuts (%1)").arg(keybindsTab._filteredBinds.length) font.pixelSize: Theme.fontSizeMedium font.weight: Font.Medium color: Theme.surfaceText diff --git a/quickshell/Modules/Settings/NetworkTab.qml b/quickshell/Modules/Settings/NetworkTab.qml index d6c49785..a26340fb 100644 --- a/quickshell/Modules/Settings/NetworkTab.qml +++ b/quickshell/Modules/Settings/NetworkTab.qml @@ -1182,7 +1182,7 @@ Item { onClicked: { forgetNetworkConfirm.showWithOptions({ title: I18n.tr("Forget Network"), - message: I18n.tr("Forget \"") + modelData.ssid + "\"?", + message: I18n.tr("Forget \"%1\"?").arg(modelData.ssid), confirmText: I18n.tr("Forget"), confirmColor: Theme.error, onConfirm: () => NetworkService.forgetWifiNetwork(modelData.ssid) @@ -1674,7 +1674,7 @@ Item { onClicked: { deleteVpnConfirm.showWithOptions({ title: I18n.tr("Delete VPN"), - message: I18n.tr("Delete \"") + modelData.name + "\"?", + message: I18n.tr("Delete \"%1\"?").arg(modelData.name), confirmText: I18n.tr("Delete"), confirmColor: Theme.error, onConfirm: () => VPNService.deleteVpn(modelData.uuid) diff --git a/quickshell/Modules/Settings/PluginListItem.qml b/quickshell/Modules/Settings/PluginListItem.qml index f00906be..cce21813 100644 --- a/quickshell/Modules/Settings/PluginListItem.qml +++ b/quickshell/Modules/Settings/PluginListItem.qml @@ -125,7 +125,7 @@ StyledRect { hoverEnabled: true onEntered: { if (root.sharedTooltip) - root.sharedTooltip.show(I18n.tr("Requires DMS") + " " + root.requiresDms, parent, 0, 0, "top"); + root.sharedTooltip.show(I18n.tr("Requires DMS %1").arg(root.requiresDms), parent, 0, 0, "top"); } onExited: { if (root.sharedTooltip) diff --git a/quickshell/Modules/Settings/PluginsTab.qml b/quickshell/Modules/Settings/PluginsTab.qml index 8999703b..aa857d2f 100644 --- a/quickshell/Modules/Settings/PluginsTab.qml +++ b/quickshell/Modules/Settings/PluginsTab.qml @@ -315,7 +315,7 @@ FocusScope { StyledText { width: parent.width - text: I18n.tr("No plugins found.") + "\n" + I18n.tr("Place plugins in") + " " + PluginService.pluginDirectory + text: I18n.tr("No plugins found.") + "\n" + I18n.tr("Place plugins in %1").arg(PluginService.pluginDirectory) font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceVariantText horizontalAlignment: Text.AlignHCenter diff --git a/quickshell/Services/CupsService.qml b/quickshell/Services/CupsService.qml index 21b4cfc1..ad853845 100644 --- a/quickshell/Services/CupsService.qml +++ b/quickshell/Services/CupsService.qml @@ -384,7 +384,7 @@ Singleton { DMSService.sendRequest("cups.pausePrinter", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to pause printer") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to pause printer"), response.error); } else { getState(); } @@ -400,7 +400,7 @@ Singleton { DMSService.sendRequest("cups.resumePrinter", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to resume printer") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to resume printer"), response.error); } else { getState(); } @@ -417,7 +417,7 @@ Singleton { DMSService.sendRequest("cups.cancelJob", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to cancel selected job") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to cancel selected job"), response.error); } else { fetchJobsForPrinter(printerName); } @@ -433,7 +433,7 @@ Singleton { DMSService.sendRequest("cups.purgeJobs", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to cancel all jobs") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to cancel all jobs"), response.error); } else { fetchJobsForPrinter(printerName); } @@ -499,7 +499,7 @@ Singleton { DMSService.sendRequest("cups.createPrinter", params, response => { creatingPrinter = false; if (response.error) { - ToastService.showError(I18n.tr("Failed to create printer") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to create printer"), response.error); } else { ToastService.showInfo(I18n.tr("Printer created successfully")); getState(); @@ -516,7 +516,7 @@ Singleton { DMSService.sendRequest("cups.deletePrinter", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to delete printer") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to delete printer"), response.error); } else { ToastService.showInfo(I18n.tr("Printer deleted")); if (selectedPrinter === printerName) { @@ -536,7 +536,7 @@ Singleton { DMSService.sendRequest("cups.acceptJobs", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to enable job acceptance") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to enable job acceptance"), response.error); } else { getState(); } @@ -552,7 +552,7 @@ Singleton { DMSService.sendRequest("cups.rejectJobs", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to disable job acceptance") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to disable job acceptance"), response.error); } else { getState(); } @@ -569,7 +569,7 @@ Singleton { DMSService.sendRequest("cups.setPrinterShared", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to update sharing") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to update sharing"), response.error); } else { getState(); } @@ -586,7 +586,7 @@ Singleton { DMSService.sendRequest("cups.setPrinterLocation", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to update location") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to update location"), response.error); } else { getState(); } @@ -603,7 +603,7 @@ Singleton { DMSService.sendRequest("cups.setPrinterInfo", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to update description") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to update description"), response.error); } else { getState(); } @@ -619,7 +619,7 @@ Singleton { DMSService.sendRequest("cups.printTestPage", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to print test page") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to print test page"), response.error); } else { ToastService.showInfo(I18n.tr("Test page sent to printer")); fetchJobsForPrinter(printerName); @@ -637,7 +637,7 @@ Singleton { DMSService.sendRequest("cups.moveJob", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to move job") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to move job"), response.error); } else { fetchAllJobs(); } @@ -653,7 +653,7 @@ Singleton { DMSService.sendRequest("cups.restartJob", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to restart job") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to restart job"), response.error); } else { fetchAllJobs(); } @@ -672,7 +672,7 @@ Singleton { DMSService.sendRequest("cups.holdJob", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to hold job") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to hold job"), response.error); } else { fetchAllJobs(); } @@ -689,7 +689,7 @@ Singleton { DMSService.sendRequest("cups.addPrinterToClass", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to add printer to class") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to add printer to class"), response.error); } else { getClasses(); } @@ -706,7 +706,7 @@ Singleton { DMSService.sendRequest("cups.removePrinterFromClass", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to remove printer from class") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to remove printer from class"), response.error); } else { getClasses(); } @@ -722,7 +722,7 @@ Singleton { DMSService.sendRequest("cups.deleteClass", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to delete class") + " - " + response.error); + ToastService.showError(I18n.tr("Failed to delete class"), response.error); } else { getClasses(); } diff --git a/quickshell/Services/DMSNetworkService.qml b/quickshell/Services/DMSNetworkService.qml index 8f1b7b4b..a67aae25 100644 --- a/quickshell/Services/DMSNetworkService.qml +++ b/quickshell/Services/DMSNetworkService.qml @@ -353,7 +353,7 @@ Singleton { pendingConnectionSSID = ""; } else { if (connectionError) { - ToastService.showError(I18n.tr("Failed to connect to ") + pendingConnectionSSID); + ToastService.showError(I18n.tr("Failed to connect to %1").arg(pendingConnectionSSID)); } connectionStatus = "failed"; pendingConnectionSSID = ""; @@ -382,7 +382,7 @@ Singleton { connectionError = response.error; lastConnectionError = response.error; connectionStatus = "failed"; - ToastService.showError(I18n.tr("Failed to activate configuration")); + ToastService.showError(I18n.tr("Failed to activate configuration"), response.error); } else { connectionError = ""; connectionStatus = "connected"; @@ -461,7 +461,7 @@ Singleton { lastConnectionError = response.error; pendingConnectionSSID = ""; connectionStatus = "failed"; - ToastService.showError(I18n.tr("Failed to start connection to ") + ssid); + ToastService.showError(I18n.tr("Failed to start connection to %1").arg(ssid)); } }); } @@ -474,7 +474,7 @@ Singleton { } : null; DMSService.sendRequest("network.wifi.disconnect", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to disconnect WiFi")); + ToastService.showError(I18n.tr("Failed to disconnect WiFi"), response.error); } else { ToastService.showInfo(I18n.tr("Disconnected from WiFi")); currentWifiSSID = ""; @@ -534,7 +534,7 @@ Singleton { if (response.error) { console.warn("Failed to forget network:", response.error); } else { - ToastService.showInfo(I18n.tr("Forgot network ") + ssid); + ToastService.showInfo(I18n.tr("Forgot network %1").arg(ssid)); savedConnections = savedConnections.filter(s => s.ssid !== ssid); savedWifiNetworks = savedWifiNetworks.filter(s => s.ssid !== ssid); @@ -577,7 +577,7 @@ Singleton { return; DMSService.sendRequest("network.wifi.enable", null, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to enable WiFi")); + ToastService.showError(I18n.tr("Failed to enable WiFi"), response.error); } else { ToastService.showInfo(I18n.tr("WiFi enabled")); } @@ -826,7 +826,7 @@ Singleton { vpnIsBusy = false; pendingVpnUuid = ""; vpnBusyStartTime = 0; - ToastService.showError(I18n.tr("Failed to connect VPN")); + ToastService.showError(I18n.tr("Failed to connect VPN"), response.error); } }); } @@ -850,7 +850,7 @@ Singleton { if (response.error) { vpnIsBusy = false; vpnBusyStartTime = 0; - ToastService.showError(I18n.tr("Failed to disconnect VPN")); + ToastService.showError(I18n.tr("Failed to disconnect VPN"), response.error); } }); } @@ -868,7 +868,7 @@ Singleton { DMSService.sendRequest("network.vpn.disconnectAll", null, response => { if (response.error) { vpnIsBusy = false; - ToastService.showError(I18n.tr("Failed to disconnect VPNs")); + ToastService.showError(I18n.tr("Failed to disconnect VPNs"), response.error); } }); } @@ -933,7 +933,7 @@ Singleton { DMSService.sendRequest("network.wifi.setAutoconnect", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to update autoconnect")); + ToastService.showError(I18n.tr("Failed to update autoconnect"), response.error); } else { ToastService.showInfo(autoconnect ? I18n.tr("Autoconnect enabled") : I18n.tr("Autoconnect disabled")); Qt.callLater(() => getState()); diff --git a/quickshell/Services/DisplayService.qml b/quickshell/Services/DisplayService.qml index f980b7da..475aea16 100644 --- a/quickshell/Services/DisplayService.qml +++ b/quickshell/Services/DisplayService.qml @@ -319,7 +319,7 @@ Singleton { DMSService.sendRequest("brightness.setBrightness", params, response => { if (response.error) { console.error("DisplayService: Failed to set brightness:", response.error); - ToastService.showError("Failed to set brightness: " + response.error, "", "", "brightness"); + ToastService.showError(I18n.tr("Failed to set brightness"), response.error, "", "brightness"); } else { ToastService.dismissCategory("brightness"); } @@ -453,7 +453,7 @@ Singleton { }, response => { if (response.error) { console.error("DisplayService: Failed to enable gamma control:", response.error); - ToastService.showError("Failed to enable night mode: " + response.error, "", "", "night-mode"); + ToastService.showError(I18n.tr("Failed to enable night mode"), response.error, "", "night-mode"); nightModeEnabled = false; SessionData.setNightModeEnabled(false); return; @@ -481,7 +481,7 @@ Singleton { }, response => { if (response.error) { console.error("DisplayService: Failed to disable gamma control:", response.error); - ToastService.showError("Failed to disable night mode: " + response.error, "", "", "night-mode"); + ToastService.showError(I18n.tr("Failed to disable night mode"), response.error, "", "night-mode"); } else { ToastService.dismissCategory("night-mode"); } @@ -522,7 +522,7 @@ Singleton { }, response => { if (response.error) { console.error("DisplayService: Failed to set temperature:", response.error); - ToastService.showError("Failed to set night mode temperature: " + response.error, "", "", "night-mode"); + ToastService.showError(I18n.tr("Failed to set night mode temperature"), response.error, "", "night-mode"); } else { ToastService.dismissCategory("night-mode"); } @@ -573,7 +573,7 @@ Singleton { }, response => { if (response.error) { console.error("DisplayService: Failed to set temperature:", response.error); - ToastService.showError("Failed to set night mode temperature: " + response.error, "", "", "night-mode"); + ToastService.showError(I18n.tr("Failed to set night mode temperature"), response.error, "", "night-mode"); return; } @@ -583,7 +583,7 @@ Singleton { }, response => { if (response.error) { console.error("DisplayService: Failed to set manual times:", response.error); - ToastService.showError("Failed to set night mode schedule: " + response.error, "", "", "night-mode"); + ToastService.showError(I18n.tr("Failed to set night mode schedule"), response.error, "", "night-mode"); } else { ToastService.dismissCategory("night-mode"); } @@ -611,7 +611,7 @@ Singleton { }, response => { if (response.error) { console.error("DisplayService: Failed to set temperature:", response.error); - ToastService.showError("Failed to set night mode temperature: " + response.error, "", "", "night-mode"); + ToastService.showError(I18n.tr("Failed to set night mode temperature"), response.error, "", "night-mode"); return; } @@ -621,7 +621,7 @@ Singleton { }, response => { if (response.error) { console.error("DisplayService: Failed to enable IP location:", response.error); - ToastService.showError("Failed to enable IP location: " + response.error, "", "", "night-mode"); + ToastService.showError(I18n.tr("Failed to enable IP location"), response.error, "", "night-mode"); } else { ToastService.dismissCategory("night-mode"); } @@ -641,7 +641,7 @@ Singleton { }, response => { if (response.error) { console.error("DisplayService: Failed to set location:", response.error); - ToastService.showError("Failed to set night mode location: " + response.error, "", "", "night-mode"); + ToastService.showError(I18n.tr("Failed to set night mode location"), response.error, "", "night-mode"); } else { ToastService.dismissCategory("night-mode"); } diff --git a/quickshell/Services/PortalService.qml b/quickshell/Services/PortalService.qml index bc8f2734..73c0a9f9 100644 --- a/quickshell/Services/PortalService.qml +++ b/quickshell/Services/PortalService.qml @@ -1,5 +1,4 @@ pragma Singleton - pragma ComponentBehavior: Bound import QtQuick @@ -22,161 +21,157 @@ Singleton { readonly property string socketPath: Quickshell.env("DMS_SOCKET") - function init() {} + function init() { + } function getSystemProfileImage() { if (!freedeskAvailable) - return - - const username = Quickshell.env("USER") + return; + const username = Quickshell.env("USER"); if (!username) - return - + return; DMSService.sendRequest("freedesktop.accounts.getUserIconFile", { - "username": username - }, response => { - if (response.result && response.result.success) { - const iconFile = response.result.value || "" - if (iconFile && iconFile !== "" && iconFile !== "/var/lib/AccountsService/icons/") { - systemProfileImage = iconFile - if (!profileImage || profileImage === "") { - profileImage = iconFile - } - } - } - }) + "username": username + }, response => { + if (response.result && response.result.success) { + const iconFile = response.result.value || ""; + if (iconFile && iconFile !== "" && iconFile !== "/var/lib/AccountsService/icons/") { + systemProfileImage = iconFile; + if (!profileImage || profileImage === "") { + profileImage = iconFile; + } + } + } + }); } function getUserProfileImage(username) { if (!username) { - profileImage = "" - return + profileImage = ""; + return; } if (Quickshell.env("DMS_RUN_GREETER") === "1" || Quickshell.env("DMS_RUN_GREETER") === "true") { - profileImage = "" - return + profileImage = ""; + return; } if (!freedeskAvailable) { - profileImage = "" - return + profileImage = ""; + return; } DMSService.sendRequest("freedesktop.accounts.getUserIconFile", { - "username": username - }, response => { - if (response.result && response.result.success) { - const icon = response.result.value || "" - if (icon && icon !== "" && icon !== "/var/lib/AccountsService/icons/") { - profileImage = icon - } else { - profileImage = "" - } - } else { - profileImage = "" - } - }) + "username": username + }, response => { + if (response.result && response.result.success) { + const icon = response.result.value || ""; + if (icon && icon !== "" && icon !== "/var/lib/AccountsService/icons/") { + profileImage = icon; + } else { + profileImage = ""; + } + } else { + profileImage = ""; + } + }); } function setProfileImage(imagePath) { if (accountsServiceAvailable) { - pendingProfileImage = imagePath - setSystemProfileImage(imagePath || "") + pendingProfileImage = imagePath; + setSystemProfileImage(imagePath || ""); } else { - profileImage = imagePath + profileImage = imagePath; } } function getSystemColorScheme() { if (typeof SettingsData !== "undefined" && SettingsData.syncModeWithPortal === false) { - return + return; } if (!freedeskAvailable) - return - + return; DMSService.sendRequest("freedesktop.settings.getColorScheme", null, response => { - if (response.result) { - systemColorScheme = response.result.value || 0 - } - }) + if (response.result) { + systemColorScheme = response.result.value || 0; + } + }); } function setLightMode(isLightMode) { if (typeof SettingsData !== "undefined" && SettingsData.syncModeWithPortal === false) { - return + return; } - setSystemColorScheme(isLightMode) + setSystemColorScheme(isLightMode); } function setSystemColorScheme(isLightMode) { if (typeof SettingsData !== "undefined" && SettingsData.syncModeWithPortal === false) { - return + return; } - const targetScheme = isLightMode ? "default" : "prefer-dark" + const targetScheme = isLightMode ? "default" : "prefer-dark"; if (colorSchemeCommand === "gsettings") { - Quickshell.execDetached(["gsettings", "set", "org.gnome.desktop.interface", "color-scheme", targetScheme]) + Quickshell.execDetached(["gsettings", "set", "org.gnome.desktop.interface", "color-scheme", targetScheme]); } if (colorSchemeCommand === "dconf") { - Quickshell.execDetached(["dconf", "write", "/org/gnome/desktop/interface/color-scheme", `'${targetScheme}'`]) + Quickshell.execDetached(["dconf", "write", "/org/gnome/desktop/interface/color-scheme", `'${targetScheme}'`]); } } function setSystemIconTheme(themeName) { if (!settingsPortalAvailable || !freedeskAvailable) - return - + return; DMSService.sendRequest("freedesktop.settings.setIconTheme", { - "iconTheme": themeName - }, response => { - if (response.error) { - console.warn("PortalService: Failed to set icon theme:", response.error) - } - }) + "iconTheme": themeName + }, response => { + if (response.error) { + console.warn("PortalService: Failed to set icon theme:", response.error); + } + }); } function setSystemProfileImage(imagePath) { if (!accountsServiceAvailable || !freedeskAvailable) - return - + return; DMSService.sendRequest("freedesktop.accounts.setIconFile", { - "path": imagePath || "" - }, response => { - if (response.error) { - console.warn("PortalService: Failed to set icon file:", response.error) + "path": imagePath || "" + }, response => { + if (response.error) { + console.warn("PortalService: Failed to set icon file:", response.error); - const errorMsg = response.error.toString() - let userMessage = I18n.tr("Failed to set profile image") + const errorMsg = response.error.toString(); + let userMessage = I18n.tr("Failed to set profile image"); - if (errorMsg.includes("too large")) { - userMessage = I18n.tr("Profile image is too large. Please use a smaller image.") - } else if (errorMsg.includes("permission")) { - userMessage = I18n.tr("Permission denied to set profile image.") - } else if (errorMsg.includes("not found") || errorMsg.includes("does not exist")) { - userMessage = I18n.tr("Selected image file not found.") - } else { - userMessage = I18n.tr("Failed to set profile image: ") + errorMsg.split(":").pop().trim() - } + if (errorMsg.includes("too large")) { + userMessage = I18n.tr("Profile image is too large. Please use a smaller image."); + } else if (errorMsg.includes("permission")) { + userMessage = I18n.tr("Permission denied to set profile image."); + } else if (errorMsg.includes("not found") || errorMsg.includes("does not exist")) { + userMessage = I18n.tr("Selected image file not found."); + } else { + userMessage = I18n.tr("Failed to set profile image: %1").arg(errorMsg.split(":").pop().trim()); + } - Quickshell.execDetached(["notify-send", "-u", "normal", "-a", "DMS", "-i", "error", I18n.tr("Profile Image Error"), userMessage]) + Quickshell.execDetached(["notify-send", "-u", "normal", "-a", "DMS", "-i", "error", I18n.tr("Profile Image Error"), userMessage]); - pendingProfileImage = "" - } else { - profileImage = pendingProfileImage - pendingProfileImage = "" - Qt.callLater(() => getSystemProfileImage()) - } - }) + pendingProfileImage = ""; + } else { + profileImage = pendingProfileImage; + pendingProfileImage = ""; + Qt.callLater(() => getSystemProfileImage()); + } + }); } Component.onCompleted: { if (socketPath && socketPath.length > 0) { - checkDMSCapabilities() + checkDMSCapabilities(); } else { - console.info("PortalService: DMS_SOCKET not set") + console.info("PortalService: DMS_SOCKET not set"); } - colorSchemeDetector.running = true + colorSchemeDetector.running = true; } Connections { @@ -184,7 +179,7 @@ Singleton { function onConnectionStateChanged() { if (DMSService.isConnected) { - checkDMSCapabilities() + checkDMSCapabilities(); } } } @@ -194,63 +189,61 @@ Singleton { enabled: DMSService.isConnected function onCapabilitiesChanged() { - checkDMSCapabilities() + checkDMSCapabilities(); } } function checkDMSCapabilities() { if (!DMSService.isConnected) { - return + return; } if (DMSService.capabilities.length === 0) { - return + return; } - freedeskAvailable = DMSService.capabilities.includes("freedesktop") + freedeskAvailable = DMSService.capabilities.includes("freedesktop"); if (freedeskAvailable) { - checkAccountsService() - checkSettingsPortal() + checkAccountsService(); + checkSettingsPortal(); } else { - console.info("PortalService: freedesktop capability not available in DMS") + console.info("PortalService: freedesktop capability not available in DMS"); } } function checkAccountsService() { if (!freedeskAvailable) - return - + return; DMSService.sendRequest("freedesktop.getState", null, response => { - if (response.result && response.result.accounts) { - accountsServiceAvailable = response.result.accounts.available || false - if (accountsServiceAvailable) { - getSystemProfileImage() - } - } - }) + if (response.result && response.result.accounts) { + accountsServiceAvailable = response.result.accounts.available || false; + if (accountsServiceAvailable) { + getSystemProfileImage(); + } + } + }); } function checkSettingsPortal() { if (!freedeskAvailable) - return - + return; DMSService.sendRequest("freedesktop.getState", null, response => { - if (response.result && response.result.settings) { - settingsPortalAvailable = response.result.settings.available || false - if (settingsPortalAvailable && SettingsData.syncModeWithPortal) { - getSystemColorScheme() - } - } - }) + if (response.result && response.result.settings) { + settingsPortalAvailable = response.result.settings.available || false; + if (settingsPortalAvailable && SettingsData.syncModeWithPortal) { + getSystemColorScheme(); + } + } + }); } function getGreeterUserProfileImage(username) { if (!username) { - profileImage = "" - return + profileImage = ""; + return; } - userProfileCheckProcess.command = ["bash", "-c", `uid=$(id -u ${username} 2>/dev/null) && [ -n "$uid" ] && dbus-send --system --print-reply --dest=org.freedesktop.Accounts /org/freedesktop/Accounts/User$uid org.freedesktop.DBus.Properties.Get string:org.freedesktop.Accounts.User string:IconFile 2>/dev/null | grep -oP 'string "\\K[^"]+' || echo ""`] - userProfileCheckProcess.running = true + userProfileCheckProcess.command = ["bash", "-c", `uid=$(id -u ${username} 2>/dev/null) && [ -n "$uid" ] && dbus-send --system --print-reply --dest=org.freedesktop.Accounts /org/freedesktop/Accounts/User$uid org.freedesktop.DBus.Properties.Get string:org.freedesktop.Accounts.User string:IconFile 2>/dev/null | grep -oP 'string "\\K[^"]+' || echo ""`]; + userProfileCheckProcess.running = true; } Process { @@ -260,18 +253,18 @@ Singleton { stdout: StdioCollector { onStreamFinished: { - const trimmed = text.trim() + const trimmed = text.trim(); if (trimmed && trimmed !== "" && !trimmed.includes("Error") && trimmed !== "/var/lib/AccountsService/icons/") { - root.profileImage = trimmed + root.profileImage = trimmed; } else { - root.profileImage = "" + root.profileImage = ""; } } } onExited: exitCode => { if (exitCode !== 0) { - root.profileImage = "" + root.profileImage = ""; } } } @@ -283,11 +276,11 @@ Singleton { stdout: StdioCollector { onStreamFinished: { - const cmd = text.trim() + const cmd = text.trim(); if (cmd.includes("gsettings")) { - root.colorSchemeCommand = "gsettings" + root.colorSchemeCommand = "gsettings"; } else if (cmd.includes("dconf")) { - root.colorSchemeCommand = "dconf" + root.colorSchemeCommand = "dconf"; } } } @@ -297,27 +290,27 @@ Singleton { target: "profile" function getImage(): string { - return root.profileImage + return root.profileImage; } function setImage(path: string): string { if (!path) { - return "ERROR: No path provided" + return "ERROR: No path provided"; } - const absolutePath = path.startsWith("/") ? path : `${StandardPaths.writableLocation(StandardPaths.HomeLocation)}/${path}` + const absolutePath = path.startsWith("/") ? path : `${StandardPaths.writableLocation(StandardPaths.HomeLocation)}/${path}`; try { - root.setProfileImage(absolutePath) - return "SUCCESS: Profile image set to " + absolutePath + root.setProfileImage(absolutePath); + return "SUCCESS: Profile image set to " + absolutePath; } catch (e) { - return "ERROR: Failed to set profile image: " + e.toString() + return "ERROR: Failed to set profile image: " + e.toString(); } } function clearImage(): string { - root.setProfileImage("") - return "SUCCESS: Profile image cleared" + root.setProfileImage(""); + return "SUCCESS: Profile image cleared"; } } } diff --git a/quickshell/Services/VPNService.qml b/quickshell/Services/VPNService.qml index a8a4c9cd..e93bf8ac 100644 --- a/quickshell/Services/VPNService.qml +++ b/quickshell/Services/VPNService.qml @@ -81,14 +81,14 @@ Singleton { if (response.error) { importError = response.error; - ToastService.showError(I18n.tr("Failed to import VPN")); + ToastService.showError(I18n.tr("Failed to import VPN"), response.error); return; } if (!response.result) return; if (response.result.success) { - ToastService.showInfo(I18n.tr("VPN imported: ") + (response.result.name || "")); + ToastService.showInfo(I18n.tr("VPN imported: %1").arg(response.result.name || "")); DMSNetworkService.refreshVpnProfiles(); importComplete(response.result.uuid || "", response.result.name || ""); return; @@ -111,7 +111,7 @@ Singleton { configLoading = false; if (response.error) { - ToastService.showError(I18n.tr("Failed to load VPN config")); + ToastService.showError(I18n.tr("Failed to load VPN config"), response.error); return; } @@ -137,7 +137,7 @@ Singleton { DMSService.sendRequest("network.vpn.updateConfig", params, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to update VPN")); + ToastService.showError(I18n.tr("Failed to update VPN"), response.error); return; } ToastService.showInfo(I18n.tr("VPN configuration updated")); @@ -153,7 +153,7 @@ Singleton { uuid: uuidOrName }, response => { if (response.error) { - ToastService.showError(I18n.tr("Failed to delete VPN")); + ToastService.showError(I18n.tr("Failed to delete VPN"), response.error); return; } ToastService.showInfo(I18n.tr("VPN deleted")); diff --git a/quickshell/Widgets/VpnDetailContent.qml b/quickshell/Widgets/VpnDetailContent.qml index fa579a0b..82381394 100644 --- a/quickshell/Widgets/VpnDetailContent.qml +++ b/quickshell/Widgets/VpnDetailContent.qml @@ -51,8 +51,8 @@ Rectangle { return I18n.tr("Active: None"); const names = DMSNetworkService.activeNames || []; if (names.length <= 1) - return I18n.tr("Active: ") + (names[0] || "VPN"); - return I18n.tr("Active: ") + names[0] + " +" + (names.length - 1); + return I18n.tr("Active: %1").arg(names[0] || "VPN"); + return I18n.tr("Active: %1 +%2").arg(names[0]).arg(names.length - 1); } font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceText @@ -214,7 +214,7 @@ Rectangle { onDeleteRequested: { deleteConfirm.showWithOptions({ "title": I18n.tr("Delete VPN"), - "message": I18n.tr("Delete \"") + modelData.name + "\"?", + "message": I18n.tr("Delete \"%1\"?").arg(modelData.name), "confirmText": I18n.tr("Delete"), "confirmColor": Theme.error, "onConfirm": () => VPNService.deleteVpn(modelData.uuid) diff --git a/quickshell/scripts/i18nsync.py b/quickshell/scripts/i18nsync.py index 82dd3e85..d96f316d 100755 --- a/quickshell/scripts/i18nsync.py +++ b/quickshell/scripts/i18nsync.py @@ -243,7 +243,7 @@ def save_sync_state(): def main(): if len(sys.argv) < 2: - error("Usage: i18nsync.py [check|sync|test]") + error("Usage: i18nsync.py [check|sync|test|local]") command = sys.argv[1] @@ -315,6 +315,39 @@ def main(): save_sync_state() info("Already in sync") + elif command == "local": + info("Updating en.json locally (no POEditor sync)") + + old_en = normalize_json(EN_JSON) + old_terms = {entry['term']: entry for entry in old_en} if isinstance(old_en, list) else {} + + extract_strings() + + new_en = normalize_json(EN_JSON) + new_terms = {entry['term']: entry for entry in new_en} if isinstance(new_en, list) else {} + + added = set(new_terms.keys()) - set(old_terms.keys()) + removed = set(old_terms.keys()) - set(new_terms.keys()) + + if added: + info(f"\n+{len(added)} new terms:") + for term in sorted(added)[:20]: + print(f" + {term[:60]}...") + if len(added) > 20: + print(f" ... and {len(added) - 20} more") + + if removed: + info(f"\n-{len(removed)} removed terms:") + for term in sorted(removed)[:20]: + print(f" - {term[:60]}...") + if len(removed) > 20: + print(f" ... and {len(removed) - 20} more") + + success(f"\n✓ {len(new_en)} total terms") + + if not added and not removed: + info("No changes detected") + else: error(f"Unknown command: {command}") diff --git a/quickshell/translations/en.json b/quickshell/translations/en.json index 90fed93a..339c7e5d 100644 --- a/quickshell/translations/en.json +++ b/quickshell/translations/en.json @@ -290,7 +290,7 @@ { "term": "Active", "context": "Active", - "reference": "Modules/Settings/NetworkTab.qml:674", + "reference": "Modules/Settings/NetworkTab.qml:674, Modules/ControlCenter/Details/AudioInputDetail.qml:204, Modules/ControlCenter/Details/AudioOutputDetail.qml:214", "comment": "" }, { @@ -300,9 +300,15 @@ "comment": "" }, { - "term": "Active: ", - "context": "Active: ", - "reference": "Widgets/VpnDetailContent.qml:54, Widgets/VpnDetailContent.qml:55", + "term": "Active: %1", + "context": "Active: %1", + "reference": "Widgets/VpnDetailContent.qml:54", + "comment": "" + }, + { + "term": "Active: %1 +%2", + "context": "Active: %1 +%2", + "reference": "Widgets/VpnDetailContent.qml:55", "comment": "" }, { @@ -353,6 +359,12 @@ "reference": "Modules/Settings/DockTab.qml:189", "comment": "" }, + { + "term": "Add a custom prefix to all application launches. This can be used for things like 'uwsm-app', 'systemd-run', or other command wrappers.", + "context": "Add a custom prefix to all application launches. This can be used for things like 'uwsm-app', 'systemd-run', or other command wrappers.", + "reference": "Modules/Settings/LauncherTab.qml:303", + "comment": "" + }, { "term": "Adjust the number of columns in grid view mode.", "context": "Adjust the number of columns in grid view mode.", @@ -419,6 +431,18 @@ "reference": "Modules/Settings/WorkspacesTab.qml:36", "comment": "" }, + { + "term": "Always show the dock when niri's overview is open", + "context": "Always show the dock when niri's overview is open", + "reference": "Modules/Settings/DockTab.qml:87", + "comment": "" + }, + { + "term": "Always show when there's only one connected display", + "context": "Always show when there's only one connected display", + "reference": "Modules/Settings/DisplayWidgetsTab.qml:407", + "comment": "" + }, { "term": "Amount", "context": "Amount", @@ -533,6 +557,18 @@ "reference": "Modules/ControlCenter/Details/AudioOutputDetail.qml:34", "comment": "" }, + { + "term": "Audio Input", + "context": "Audio Input", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:127", + "comment": "" + }, + { + "term": "Audio Output", + "context": "Audio Output", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:119", + "comment": "" + }, { "term": "Audio Output Devices (", "context": "Audio Output Devices (", @@ -551,6 +587,12 @@ "reference": "Modules/Settings/MediaPlayerTab.qml:41", "comment": "" }, + { + "term": "Audio volume control", + "context": "Audio volume control", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:136", + "comment": "" + }, { "term": "Auth", "context": "Auth", @@ -728,7 +770,7 @@ { "term": "Available", "context": "Available", - "reference": "Modules/ProcessList/SystemTab.qml:464, Modules/Settings/PrinterTab.qml:145", + "reference": "Modules/ProcessList/SystemTab.qml:464, Modules/Settings/PrinterTab.qml:145, Modules/ControlCenter/Details/AudioInputDetail.qml:204, Modules/ControlCenter/Details/AudioOutputDetail.qml:214", "comment": "" }, { @@ -750,8 +792,8 @@ "comment": "" }, { - "term": "Available Screens (", - "context": "Available Screens (", + "term": "Available Screens (%1)", + "context": "Available Screens (%1)", "reference": "Modules/Settings/DisplayWidgetsTab.qml:192", "comment": "" }, @@ -779,6 +821,12 @@ "reference": "PLUGINS/ExampleDesktopClock/DesktopClockSettings.qml:39", "comment": "" }, + { + "term": "Backlight device", + "context": "Backlight device", + "reference": "Modules/ControlCenter/Details/BrightnessDetail.qml:320", + "comment": "" + }, { "term": "Balanced palette with focused accents (default).", "context": "Balanced palette with focused accents (default).", @@ -800,7 +848,13 @@ { "term": "Battery", "context": "Battery", - "reference": "Modules/Settings/WidgetsTabSection.qml:838, Modules/Settings/WidgetsTab.qml:168", + "reference": "Modules/Settings/WidgetsTabSection.qml:838, Modules/Settings/WidgetsTab.qml:168, Modules/ControlCenter/Models/WidgetModel.qml:161, Modules/ControlCenter/Widgets/BatteryPill.qml:19", + "comment": "" + }, + { + "term": "Battery and power management", + "context": "Battery and power management", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:162", "comment": "" }, { @@ -839,10 +893,28 @@ "reference": "Modules/Settings/DisplayConfig/DisplayConfigState.qml:839", "comment": "" }, + { + "term": "Block notifications", + "context": "Block notifications", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:86", + "comment": "" + }, + { + "term": "Blocked", + "context": "Blocked", + "reference": "Modules/ControlCenter/Details/BluetoothDetail.qml:474", + "comment": "" + }, + { + "term": "Blue light filter", + "context": "Blue light filter", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:69", + "comment": "" + }, { "term": "Bluetooth", "context": "Bluetooth", - "reference": "Modules/Settings/WidgetsTabSection.qml:818", + "reference": "Modules/Settings/WidgetsTabSection.qml:818, Modules/ControlCenter/Models/WidgetModel.qml:110", "comment": "" }, { @@ -851,6 +923,12 @@ "reference": "Modules/ControlCenter/Details/BluetoothDetail.qml:78", "comment": "" }, + { + "term": "Bluetooth not available", + "context": "Bluetooth not available", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:115", + "comment": "" + }, { "term": "Blur on Overview", "context": "Blur on Overview", @@ -923,6 +1001,18 @@ "reference": "Modules/Settings/WidgetsTabSection.qml:833, Modules/Settings/LauncherTab.qml:268, Modules/Settings/OSDTab.qml:111", "comment": "" }, + { + "term": "Brightness Slider", + "context": "Brightness Slider", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:143", + "comment": "" + }, + { + "term": "Brightness control not available", + "context": "Brightness control not available", + "reference": "Modules/ControlCenter/Details/BrightnessDetail.qml:144, Modules/ControlCenter/Models/WidgetModel.qml:148", + "comment": "" + }, { "term": "Browse", "context": "Browse", @@ -989,6 +1079,12 @@ "reference": "Modules/Settings/PrinterTab.qml:108", "comment": "" }, + { + "term": "CUPS not available", + "context": "CUPS not available", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:202", + "comment": "" + }, { "term": "Camera", "context": "Camera", @@ -1007,6 +1103,12 @@ "reference": "Services/CupsService.qml:749", "comment": "" }, + { + "term": "Cannot pair", + "context": "Cannot pair", + "reference": "Modules/ControlCenter/Details/BluetoothDetail.qml:497", + "comment": "" + }, { "term": "Capabilities", "context": "Capabilities", @@ -1067,6 +1169,12 @@ "reference": "Modules/Settings/NetworkTab.qml:1287", "comment": "" }, + { + "term": "Charging", + "context": "Charging", + "reference": "Modules/ControlCenter/Widgets/BatteryPill.qml:27", + "comment": "" + }, { "term": "Check for system updates", "context": "Check for system updates", @@ -1085,6 +1193,18 @@ "reference": "Modules/Settings/LauncherTab.qml:238", "comment": "" }, + { + "term": "Choose a color", + "context": "Choose a color", + "reference": "Modules/ControlCenter/Widgets/ColorPickerPill.qml:18", + "comment": "" + }, + { + "term": "Choose colors from palette", + "context": "Choose colors from palette", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:180", + "comment": "" + }, { "term": "Choose icon", "context": "Choose icon", @@ -1175,6 +1295,18 @@ "reference": "Modules/Settings/ClipboardTab.qml:310", "comment": "" }, + { + "term": "Click 'Setup' to create dms/binds.kdl and add include to config.kdl.", + "context": "Click 'Setup' to create dms/binds.kdl and add include to config.kdl.", + "reference": "Modules/Settings/KeybindsTab.qml:315", + "comment": "" + }, + { + "term": "Click 'Setup' to create the outputs config and add include to your compositor config.", + "context": "Click 'Setup' to create the outputs config and add include to your compositor config.", + "reference": "Modules/Settings/DisplayConfig/IncludeWarningBox.qml:58", + "comment": "" + }, { "term": "Click Import to add a .ovpn or .conf", "context": "Click Import to add a .ovpn or .conf", @@ -1280,7 +1412,7 @@ { "term": "Color Picker", "context": "Color Picker", - "reference": "Modules/Settings/WidgetsTab.qml:231", + "reference": "Modules/Settings/WidgetsTab.qml:231, Modules/ControlCenter/Models/WidgetModel.qml:179, Modules/ControlCenter/Widgets/ColorPickerPill.qml:17", "comment": "" }, { @@ -1436,7 +1568,7 @@ { "term": "Connect", "context": "Connect", - "reference": "Modals/WifiPasswordModal.qml:645", + "reference": "Modals/WifiPasswordModal.qml:645, Modules/ControlCenter/Details/BluetoothDetail.qml:549, Modules/ControlCenter/Details/NetworkDetail.qml:717", "comment": "" }, { @@ -1454,7 +1586,7 @@ { "term": "Connected", "context": "Connected", - "reference": "Modules/Settings/AboutTab.qml:668, Modules/Settings/NetworkTab.qml:384, Modules/Settings/NetworkTab.qml:1091, Modules/Settings/NetworkTab.qml:1415, Modules/ControlCenter/BuiltinPlugins/VpnWidget.qml:21", + "reference": "Modules/Settings/AboutTab.qml:668, Modules/Settings/NetworkTab.qml:384, Modules/Settings/NetworkTab.qml:1091, Modules/Settings/NetworkTab.qml:1415, Modules/ControlCenter/Details/BluetoothDetail.qml:250, Modules/ControlCenter/Details/NetworkDetail.qml:564, Modules/ControlCenter/BuiltinPlugins/VpnWidget.qml:21", "comment": "" }, { @@ -1469,6 +1601,12 @@ "reference": "Services/CupsService.qml:798", "comment": "" }, + { + "term": "Connecting...", + "context": "Connecting...", + "reference": "Modules/ControlCenter/Details/BluetoothDetail.qml:248", + "comment": "" + }, { "term": "Contrast", "context": "Contrast", @@ -1619,6 +1757,12 @@ "reference": "Modules/Settings/WidgetsTab.qml:80", "comment": "" }, + { + "term": "Current: %1", + "context": "Current: %1", + "reference": "Modules/ControlCenter/Details/BluetoothCodecSelector.qml:189", + "comment": "" + }, { "term": "Custom", "context": "Custom", @@ -1709,6 +1853,12 @@ "reference": "Modules/Settings/PowerSleepTab.qml:299", "comment": "" }, + { + "term": "DDC/CI monitor", + "context": "DDC/CI monitor", + "reference": "Modules/ControlCenter/Details/BrightnessDetail.qml:322", + "comment": "" + }, { "term": "DEMO MODE - Click anywhere to exit", "context": "DEMO MODE - Click anywhere to exit", @@ -1790,7 +1940,7 @@ { "term": "Dark Mode", "context": "Dark Mode", - "reference": "Modules/Settings/WallpaperTab.qml:561, Modules/ControlCenter/Components/DragDropGrid.qml:601", + "reference": "Modules/Settings/WallpaperTab.qml:561, Modules/ControlCenter/Models/WidgetModel.qml:77, Modules/ControlCenter/Components/DragDropGrid.qml:601", "comment": "" }, { @@ -1937,6 +2087,12 @@ "reference": "Widgets/KeybindItem.qml:965, Modules/ProcessList/SystemTab.qml:420, Modules/Settings/PrinterTab.qml:278", "comment": "" }, + { + "term": "Device connections", + "context": "Device connections", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:111", + "comment": "" + }, { "term": "Device paired", "context": "Device paired", @@ -1991,6 +2147,12 @@ "reference": "Modules/Settings/NetworkTab.qml:741, Modules/Settings/DankBarTab.qml:428, Modules/Settings/DisplayConfig/DisplayConfigState.qml:819, Modules/Settings/DisplayConfig/DisplayConfigState.qml:825, Modules/Settings/DisplayConfig/DisplayConfigState.qml:827", "comment": "" }, + { + "term": "Disabling WiFi...", + "context": "Disabling WiFi...", + "reference": "Modules/ControlCenter/Details/NetworkDetail.qml:176", + "comment": "" + }, { "term": "Discard", "context": "Discard", @@ -2000,7 +2162,7 @@ { "term": "Disconnect", "context": "Disconnect", - "reference": "Widgets/VpnDetailContent.qml:121, Modules/Settings/NetworkTab.qml:1484, Modules/ControlCenter/Details/NetworkDetail.qml:395", + "reference": "Widgets/VpnDetailContent.qml:121, Modules/Settings/NetworkTab.qml:1484, Modules/ControlCenter/Details/BluetoothDetail.qml:549, Modules/ControlCenter/Details/NetworkDetail.qml:395, Modules/ControlCenter/Details/NetworkDetail.qml:717", "comment": "" }, { @@ -2024,7 +2186,7 @@ { "term": "Disk Usage", "context": "Disk Usage", - "reference": "Modules/Settings/WidgetsTab.qml:116", + "reference": "Modules/Settings/WidgetsTab.qml:116, Modules/ControlCenter/Models/WidgetModel.qml:169, Modules/ControlCenter/Widgets/DiskUsagePill.qml:37", "comment": "" }, { @@ -2075,6 +2237,12 @@ "reference": "Modules/Settings/WorkspacesTab.qml:43", "comment": "" }, + { + "term": "Display brightness control", + "context": "Display brightness control", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:144", + "comment": "" + }, { "term": "Display configuration is not available. WLR output management protocol not supported.", "context": "Display configuration is not available. WLR output management protocol not supported.", @@ -2138,7 +2306,7 @@ { "term": "Do Not Disturb", "context": "Do Not Disturb", - "reference": "Modules/Settings/NotificationsTab.qml:146, Modules/ControlCenter/Components/DragDropGrid.qml:603, Modules/Notifications/Center/NotificationHeader.qml:41, Modules/Notifications/Center/NotificationSettings.qml:131", + "reference": "Modules/Settings/NotificationsTab.qml:146, Modules/ControlCenter/Models/WidgetModel.qml:85, Modules/ControlCenter/Components/DragDropGrid.qml:603, Modules/Notifications/Center/NotificationHeader.qml:41, Modules/Notifications/Center/NotificationSettings.qml:131", "comment": "" }, { @@ -2183,6 +2351,18 @@ "reference": "Modals/WifiPasswordModal.qml:490", "comment": "" }, + { + "term": "Don't Change", + "context": "Don't Change", + "reference": "Modules/Settings/PowerSleepTab.qml:104", + "comment": "" + }, + { + "term": "Don't Save", + "context": "Don't Save", + "reference": "Modules/Notepad/Notepad.qml:421", + "comment": "" + }, { "term": "Door Open", "context": "Door Open", @@ -2333,6 +2513,12 @@ "reference": "Modules/Settings/DisplayConfig/DisplayConfigState.qml:819, Modules/Settings/DisplayConfig/DisplayConfigState.qml:827", "comment": "" }, + { + "term": "Enabling WiFi...", + "context": "Enabling WiFi...", + "reference": "Modules/ControlCenter/Details/NetworkDetail.qml:176", + "comment": "" + }, { "term": "End", "context": "End", @@ -2387,6 +2573,12 @@ "reference": "Modals/FileBrowser/FileBrowserSaveRow.qml:24", "comment": "" }, + { + "term": "Enter launch prefix (e.g., 'uwsm-app')", + "context": "Enter launch prefix (e.g., 'uwsm-app')", + "reference": "Modules/Settings/LauncherTab.qml:312", + "comment": "" + }, { "term": "Enter passkey for ", "context": "Enter passkey for ", @@ -2420,7 +2612,7 @@ { "term": "Ethernet", "context": "Ethernet", - "reference": "Modules/Settings/NetworkTab.qml:157, Modules/Settings/NetworkTab.qml:206, Modules/Settings/NetworkTab.qml:274", + "reference": "Modules/Settings/NetworkTab.qml:157, Modules/Settings/NetworkTab.qml:206, Modules/Settings/NetworkTab.qml:274, Modules/ControlCenter/Details/NetworkDetail.qml:121", "comment": "" }, { @@ -2435,6 +2627,12 @@ "reference": "Modules/Settings/DisplayConfig/HyprlandOutputSettings.qml:165", "comment": "" }, + { + "term": "Exponential", + "context": "Exponential", + "reference": "Modules/ControlCenter/Details/BrightnessDetail.qml:433", + "comment": "" + }, { "term": "External Wallpaper Management", "context": "wallpaper settings external management", @@ -2496,8 +2694,8 @@ "comment": "" }, { - "term": "Failed to connect to ", - "context": "Failed to connect to ", + "term": "Failed to connect to %1", + "context": "Failed to connect to %1", "reference": "Services/DMSNetworkService.qml:356", "comment": "" }, @@ -2537,6 +2735,12 @@ "reference": "Services/CupsService.qml:555", "comment": "" }, + { + "term": "Failed to disable night mode", + "context": "Failed to disable night mode", + "reference": "Services/DisplayService.qml:484", + "comment": "" + }, { "term": "Failed to disconnect VPN", "context": "Failed to disconnect VPN", @@ -2555,6 +2759,12 @@ "reference": "Services/DMSNetworkService.qml:477", "comment": "" }, + { + "term": "Failed to enable IP location", + "context": "Failed to enable IP location", + "reference": "Services/DisplayService.qml:624", + "comment": "" + }, { "term": "Failed to enable WiFi", "context": "Failed to enable WiFi", @@ -2567,6 +2777,12 @@ "reference": "Services/CupsService.qml:539", "comment": "" }, + { + "term": "Failed to enable night mode", + "context": "Failed to enable night mode", + "reference": "Services/DisplayService.qml:456", + "comment": "" + }, { "term": "Failed to hold job", "context": "Failed to hold job", @@ -2651,6 +2867,30 @@ "reference": "Services/KeybindsService.qml:155", "comment": "" }, + { + "term": "Failed to set brightness", + "context": "Failed to set brightness", + "reference": "Services/DisplayService.qml:322", + "comment": "" + }, + { + "term": "Failed to set night mode location", + "context": "Failed to set night mode location", + "reference": "Services/DisplayService.qml:644", + "comment": "" + }, + { + "term": "Failed to set night mode schedule", + "context": "Failed to set night mode schedule", + "reference": "Services/DisplayService.qml:586", + "comment": "" + }, + { + "term": "Failed to set night mode temperature", + "context": "Failed to set night mode temperature", + "reference": "Services/DisplayService.qml:525, Services/DisplayService.qml:576, Services/DisplayService.qml:614", + "comment": "" + }, { "term": "Failed to set profile image", "context": "Failed to set profile image", @@ -2658,14 +2898,14 @@ "comment": "" }, { - "term": "Failed to set profile image: ", - "context": "Failed to set profile image: ", + "term": "Failed to set profile image: %1", + "context": "Failed to set profile image: %1", "reference": "Services/PortalService.qml:159", "comment": "" }, { - "term": "Failed to start connection to ", - "context": "Failed to start connection to ", + "term": "Failed to start connection to %1", + "context": "Failed to start connection to %1", "reference": "Services/DMSNetworkService.qml:464", "comment": "" }, @@ -2735,6 +2975,12 @@ "reference": "Modules/AppDrawer/AppDrawerPopout.qml:245", "comment": "" }, + { + "term": "Filesystem usage monitoring", + "context": "Filesystem usage monitoring", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:170", + "comment": "" + }, { "term": "Find in Text", "context": "Find in Text", @@ -2886,8 +3132,8 @@ "comment": "" }, { - "term": "Forgot network ", - "context": "Forgot network ", + "term": "Forgot network %1", + "context": "Forgot network %1", "reference": "Services/DMSNetworkService.qml:537", "comment": "" }, @@ -3299,6 +3545,12 @@ "reference": "Modules/ControlCenter/Details/AudioInputDetail.qml:34", "comment": "" }, + { + "term": "Input Volume Slider", + "context": "Input Volume Slider", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:153", + "comment": "" + }, { "term": "Install plugins from the DMS plugin registry", "context": "Install plugins from the DMS plugin registry", @@ -3356,7 +3608,7 @@ { "term": "Keep Awake", "context": "Keep Awake", - "reference": "Modules/ControlCenter/Components/DragDropGrid.qml:605", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:93, Modules/ControlCenter/Components/DragDropGrid.qml:605", "comment": "" }, { @@ -3407,6 +3659,12 @@ "reference": "Modules/Settings/AboutTab.qml:278, Modules/Settings/AboutTab.qml:286", "comment": "" }, + { + "term": "LED device", + "context": "LED device", + "reference": "Modules/ControlCenter/Details/BrightnessDetail.qml:324", + "comment": "" + }, { "term": "Last launched %1", "context": "Last launched %1", @@ -3503,6 +3761,12 @@ "reference": "Modules/Settings/ThemeColorsTab.qml:576, Modules/Settings/WallpaperTab.qml:377", "comment": "" }, + { + "term": "Linear", + "context": "Linear", + "reference": "Modules/ControlCenter/Details/BrightnessDetail.qml:433", + "comment": "" + }, { "term": "Lines: %1", "context": "Lines: %1", @@ -3521,6 +3785,12 @@ "reference": "Common/Theme.qml:205", "comment": "" }, + { + "term": "Loading codecs...", + "context": "Loading codecs...", + "reference": "Modules/ControlCenter/Details/BluetoothCodecSelector.qml:189", + "comment": "" + }, { "term": "Loading keybinds...", "context": "Loading keybinds...", @@ -3653,6 +3923,12 @@ "reference": "Modules/Settings/DankBarTab.qml:312", "comment": "" }, + { + "term": "Management", + "context": "Management", + "reference": "Modules/ControlCenter/Details/BatteryDetail.qml:84", + "comment": "" + }, { "term": "Manual Coordinates", "context": "Manual Coordinates", @@ -3863,6 +4139,18 @@ "reference": "Modules/Settings/OSDTab.qml:125", "comment": "" }, + { + "term": "Microphone settings", + "context": "Microphone settings", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:128", + "comment": "" + }, + { + "term": "Microphone volume control", + "context": "Microphone volume control", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:154", + "comment": "" + }, { "term": "Middle Section", "context": "Middle Section", @@ -3986,7 +4274,7 @@ { "term": "Network", "context": "Network", - "reference": "Services/CupsService.qml:131, Modals/Settings/SettingsSidebar.qml:184, Modules/ProcessList/PerformanceTab.qml:342, Modules/Settings/WidgetsTabSection.qml:808, Modules/Settings/DesktopWidgetsTab.qml:401, Modules/ControlCenter/Details/NetworkDetail.qml:73", + "reference": "Services/CupsService.qml:131, Modals/Settings/SettingsSidebar.qml:184, Modules/ProcessList/PerformanceTab.qml:342, Modules/Settings/WidgetsTabSection.qml:808, Modules/Settings/DesktopWidgetsTab.qml:401, Modules/ControlCenter/Details/NetworkDetail.qml:73, Modules/ControlCenter/Models/WidgetModel.qml:101", "comment": "" }, { @@ -4076,7 +4364,7 @@ { "term": "Night Mode", "context": "Night Mode", - "reference": "Modules/Settings/GammaControlTab.qml:74, Modules/ControlCenter/Components/DragDropGrid.qml:599", + "reference": "Modules/Settings/GammaControlTab.qml:74, Modules/ControlCenter/Models/WidgetModel.qml:68, Modules/ControlCenter/Components/DragDropGrid.qml:599", "comment": "" }, { @@ -4157,6 +4445,18 @@ "reference": "Modules/Settings/NetworkTab.qml:285", "comment": "" }, + { + "term": "No battery", + "context": "No battery", + "reference": "Modules/ControlCenter/Widgets/BatteryPill.qml:17", + "comment": "" + }, + { + "term": "No brightness devices available", + "context": "No brightness devices available", + "reference": "Modules/ControlCenter/Details/BrightnessDetail.qml:144", + "comment": "" + }, { "term": "No changes", "context": "No changes", @@ -4175,6 +4475,18 @@ "reference": "Modules/Settings/PrinterTab.qml:300, Modules/Settings/PrinterTab.qml:304", "comment": "" }, + { + "term": "No disk data", + "context": "No disk data", + "reference": "Modules/ControlCenter/Widgets/DiskUsagePill.qml:40", + "comment": "" + }, + { + "term": "No disk data available", + "context": "No disk data available", + "reference": "Modules/ControlCenter/Details/DiskUsageDetail.qml:64, Modules/ControlCenter/Widgets/DiskUsagePill.qml:50", + "comment": "" + }, { "term": "No drivers found", "context": "No drivers found", @@ -4271,6 +4583,12 @@ "reference": "Modules/Settings/NotificationsTab.qml:177, Modules/Notifications/Center/NotificationSettings.qml:175", "comment": "" }, + { + "term": "Not available", + "context": "Not available", + "reference": "Modules/ControlCenter/Widgets/BatteryPill.qml:24", + "comment": "" + }, { "term": "Not connected", "context": "Not connected", @@ -4412,7 +4730,7 @@ { "term": "Open", "context": "Open", - "reference": "Modules/Notepad/NotepadTextEditor.qml:527, Modules/Settings/NetworkTab.qml:1091, Modules/Settings/NetworkTab.qml:1307", + "reference": "Modules/Notepad/NotepadTextEditor.qml:527, Modules/Settings/NetworkTab.qml:1091, Modules/Settings/NetworkTab.qml:1307, Modules/ControlCenter/Details/NetworkDetail.qml:564", "comment": "" }, { @@ -4538,7 +4856,7 @@ { "term": "Pair", "context": "Pair", - "reference": "Modals/BluetoothPairingModal.qml:324", + "reference": "Modals/BluetoothPairingModal.qml:324, Modules/ControlCenter/Details/BluetoothDetail.qml:498", "comment": "" }, { @@ -4547,12 +4865,24 @@ "reference": "Modals/BluetoothPairingModal.qml:121", "comment": "" }, + { + "term": "Paired", + "context": "Paired", + "reference": "Modules/ControlCenter/Details/BluetoothDetail.qml:256", + "comment": "" + }, { "term": "Pairing failed", "context": "Pairing failed", "reference": "Modals/BluetoothPairingModal.qml:400, Modules/ControlCenter/Details/BluetoothDetail.qml:47", "comment": "" }, + { + "term": "Pairing...", + "context": "Pairing...", + "reference": "Modules/ControlCenter/Details/BluetoothDetail.qml:473, Modules/ControlCenter/Details/BluetoothDetail.qml:496", + "comment": "" + }, { "term": "Passkey:", "context": "Passkey:", @@ -4619,12 +4949,24 @@ "reference": "Modals/Settings/SettingsSidebar.qml:23", "comment": "" }, + { + "term": "Pin", + "context": "Pin", + "reference": "Modules/ControlCenter/Details/BluetoothDetail.qml:323, Modules/ControlCenter/Details/BrightnessDetail.qml:204, Modules/ControlCenter/Details/AudioInputDetail.qml:244, Modules/ControlCenter/Details/AudioOutputDetail.qml:254, Modules/ControlCenter/Details/NetworkDetail.qml:638", + "comment": "" + }, { "term": "Pin to Dock", "context": "Pin to Dock", "reference": "Modals/Spotlight/SpotlightContextMenuContent.qml:26, Modules/AppDrawer/AppDrawerPopout.qml:736, Modules/Dock/DockContextMenu.qml:379", "comment": "" }, + { + "term": "Pinned", + "context": "Pinned", + "reference": "Modules/ControlCenter/Details/BluetoothDetail.qml:323, Modules/ControlCenter/Details/BrightnessDetail.qml:204, Modules/ControlCenter/Details/AudioInputDetail.qml:244, Modules/ControlCenter/Details/AudioOutputDetail.qml:254, Modules/ControlCenter/Details/NetworkDetail.qml:638", + "comment": "" + }, { "term": "Place plugin directories here. Each plugin should have a plugin.json manifest file.", "context": "Place plugin directories here. Each plugin should have a plugin.json manifest file.", @@ -4632,8 +4974,8 @@ "comment": "" }, { - "term": "Place plugins in", - "context": "Place plugins in", + "term": "Place plugins in %1", + "context": "Place plugins in %1", "reference": "Modules/Settings/PluginsTab.qml:318", "comment": "" }, @@ -4673,6 +5015,18 @@ "reference": "Modules/Settings/SoundsTab.qml:117", "comment": "" }, + { + "term": "Plugged in", + "context": "Plugged in", + "reference": "Modules/ControlCenter/Widgets/BatteryPill.qml:30", + "comment": "" + }, + { + "term": "Plugin", + "context": "Plugin", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:238", + "comment": "" + }, { "term": "Plugin Directory", "context": "Plugin Directory", @@ -4730,7 +5084,7 @@ { "term": "Power", "context": "Power", - "reference": "Modules/Settings/WidgetsTab.qml:245", + "reference": "Modules/Settings/WidgetsTab.qml:245, Modules/ControlCenter/Details/BatteryDetail.qml:69", "comment": "" }, { @@ -4781,6 +5135,12 @@ "reference": "Modules/ControlCenter/Details/BatteryDetail.qml:242, Modules/DankBar/Popouts/BatteryPopout.qml:620", "comment": "" }, + { + "term": "Power profile management available", + "context": "Power profile management available", + "reference": "Modules/ControlCenter/Details/BatteryDetail.qml:103", + "comment": "" + }, { "term": "Power source", "context": "Power source", @@ -4820,7 +5180,7 @@ { "term": "Prevent screen timeout", "context": "Prevent screen timeout", - "reference": "Modules/Settings/WidgetsTab.qml:183", + "reference": "Modules/Settings/WidgetsTab.qml:183, Modules/ControlCenter/Models/WidgetModel.qml:94", "comment": "" }, { @@ -4829,6 +5189,12 @@ "reference": "Modules/Settings/LauncherTab.qml:177, Modules/Settings/NetworkTab.qml:173, Modules/Settings/Widgets/SettingsColorPicker.qml:42", "comment": "" }, + { + "term": "Print Server Management", + "context": "Print Server Management", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:198", + "comment": "" + }, { "term": "Print Server not available", "context": "Print Server not available", @@ -4868,7 +5234,7 @@ { "term": "Printers", "context": "Printers", - "reference": "Modals/Settings/SettingsSidebar.qml:197, Modules/Settings/PrinterTab.qml:153, Modules/Settings/PrinterTab.qml:539, Modules/ControlCenter/BuiltinPlugins/CupsWidget.qml:16", + "reference": "Modals/Settings/SettingsSidebar.qml:197, Modules/Settings/PrinterTab.qml:153, Modules/Settings/PrinterTab.qml:539, Modules/ControlCenter/Models/WidgetModel.qml:197, Modules/ControlCenter/BuiltinPlugins/CupsWidget.qml:16", "comment": "" }, { @@ -5046,8 +5412,14 @@ "comment": "" }, { - "term": "Requires DMS", - "context": "Requires DMS", + "term": "Requires 'dgop' tool", + "context": "Requires 'dgop' tool", + "reference": "Modules/Settings/WidgetsTab.qml:104, Modules/Settings/WidgetsTab.qml:112, Modules/Settings/WidgetsTab.qml:120, Modules/Settings/WidgetsTab.qml:128, Modules/Settings/WidgetsTab.qml:135, Modules/Settings/WidgetsTab.qml:213, Modules/ControlCenter/Models/WidgetModel.qml:174", + "comment": "" + }, + { + "term": "Requires DMS %1", + "context": "Requires DMS %1", "reference": "Modules/Settings/PluginListItem.qml:128", "comment": "" }, @@ -5057,6 +5429,12 @@ "reference": "Modules/Settings/WidgetsTab.qml:40", "comment": "" }, + { + "term": "Requires night mode support", + "context": "Requires night mode support", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:73", + "comment": "" + }, { "term": "Reset", "context": "Reset", @@ -5147,6 +5525,12 @@ "reference": "Modules/DankBar/Popouts/DWLLayoutPopout.qml:306", "comment": "" }, + { + "term": "Root Filesystem", + "context": "Root Filesystem", + "reference": "Modules/ControlCenter/Details/DiskUsageDetail.qml:125", + "comment": "" + }, { "term": "Run DMS Templates", "context": "Run DMS Templates", @@ -5222,7 +5606,7 @@ { "term": "Saved", "context": "Saved", - "reference": "Modules/Notepad/NotepadTextEditor.qml:591, Modules/Settings/NetworkTab.qml:1104", + "reference": "Modules/Notepad/NotepadTextEditor.qml:591, Modules/Settings/NetworkTab.qml:1104, Modules/ControlCenter/Details/NetworkDetail.qml:570", "comment": "" }, { @@ -5252,7 +5636,13 @@ { "term": "Scan", "context": "Scan", - "reference": "Modules/Settings/PluginsTab.qml:206", + "reference": "Modules/Settings/PluginsTab.qml:206, Modules/ControlCenter/Details/BluetoothDetail.qml:116", + "comment": "" + }, + { + "term": "Scanning", + "context": "Scanning", + "reference": "Modules/ControlCenter/Details/BluetoothDetail.qml:116", "comment": "" }, { @@ -5285,6 +5675,12 @@ "reference": "Modules/Settings/MediaPlayerTab.qml:34", "comment": "" }, + { + "term": "Scroll title if it doesn't fit in widget", + "context": "Scroll title if it doesn't fit in widget", + "reference": "Modules/Settings/MediaPlayerTab.qml:35", + "comment": "" + }, { "term": "Scrolling", "context": "Scrolling", @@ -5348,7 +5744,7 @@ { "term": "Secured", "context": "Secured", - "reference": "Modules/Settings/NetworkTab.qml:1091", + "reference": "Modules/Settings/NetworkTab.qml:1091, Modules/ControlCenter/Details/NetworkDetail.qml:564", "comment": "" }, { @@ -5552,7 +5948,13 @@ { "term": "Shortcuts", "context": "Shortcuts", - "reference": "Modules/Settings/KeybindsTab.qml:513, Modules/Settings/KeybindsTab.qml:513", + "reference": "Modules/Settings/KeybindsTab.qml:513", + "comment": "" + }, + { + "term": "Shortcuts (%1)", + "context": "Shortcuts (%1)", + "reference": "Modules/Settings/KeybindsTab.qml:513", "comment": "" }, { @@ -5981,6 +6383,12 @@ "reference": "Modules/Settings/DockTab.qml:136, Modules/Settings/DankBarTab.qml:843", "comment": "" }, + { + "term": "Speaker settings", + "context": "Speaker settings", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:120", + "comment": "" + }, { "term": "Speed", "context": "Speed", @@ -6191,6 +6599,12 @@ "reference": "Modules/Settings/SoundsTab.qml:147", "comment": "" }, + { + "term": "System theme toggle", + "context": "System theme toggle", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:78", + "comment": "" + }, { "term": "System toast notifications", "context": "System toast notifications", @@ -6245,6 +6659,12 @@ "reference": "Modals/Clipboard/ClipboardEntry.qml:80", "comment": "" }, + { + "term": "The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.", + "context": "The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.", + "reference": "Modals/ProcessListModal.qml:164", + "comment": "" + }, { "term": "The DMS_SOCKET environment variable is not set or the socket is unavailable. Automated plugin management requires the DMS_SOCKET.", "context": "The DMS_SOCKET environment variable is not set or the socket is unavailable. Automated plugin management requires the DMS_SOCKET.", @@ -6329,6 +6749,18 @@ "reference": "Modules/Settings/TimeWeatherTab.qml:28", "comment": "" }, + { + "term": "Time remaining: %1", + "context": "Time remaining: %1", + "reference": "Modules/ControlCenter/Details/BatteryDetail.qml:106", + "comment": "" + }, + { + "term": "Time until full: %1", + "context": "Time until full: %1", + "reference": "Modules/ControlCenter/Details/BatteryDetail.qml:106", + "comment": "" + }, { "term": "Timed Out", "context": "Timed Out", @@ -6518,7 +6950,31 @@ { "term": "Unknown", "context": "Unknown", - "reference": "Modules/Settings/PrinterTab.qml:1296, Modules/Settings/NetworkTab.qml:121, Modules/Settings/NetworkTab.qml:163, Modules/Settings/NetworkTab.qml:369, Modules/Settings/NetworkTab.qml:390, Modules/Settings/NetworkTab.qml:538, Modules/Settings/NetworkTab.qml:667, Modules/Settings/NetworkTab.qml:1071", + "reference": "Modules/Settings/PrinterTab.qml:1296, Modules/Settings/NetworkTab.qml:121, Modules/Settings/NetworkTab.qml:163, Modules/Settings/NetworkTab.qml:369, Modules/Settings/NetworkTab.qml:390, Modules/Settings/NetworkTab.qml:538, Modules/Settings/NetworkTab.qml:667, Modules/Settings/NetworkTab.qml:1071, Modules/ControlCenter/Details/BatteryDetail.qml:179, Modules/ControlCenter/Components/HeaderPane.qml:60", + "comment": "" + }, + { + "term": "Unknown Config", + "context": "Unknown Config", + "reference": "Modules/ControlCenter/Details/NetworkDetail.qml:306", + "comment": "" + }, + { + "term": "Unknown Device", + "context": "Unknown Device", + "reference": "Modules/ControlCenter/Details/BluetoothDetail.qml:234, Modules/ControlCenter/Details/BluetoothDetail.qml:461", + "comment": "" + }, + { + "term": "Unknown Monitor", + "context": "Unknown Monitor", + "reference": "Modules/ControlCenter/Details/BrightnessDetail.qml:176", + "comment": "" + }, + { + "term": "Unknown Network", + "context": "Unknown Network", + "reference": "Modules/ControlCenter/Details/NetworkDetail.qml:552", "comment": "" }, { @@ -6659,6 +7115,12 @@ "reference": "Modules/ProcessList/SystemTab.qml:453", "comment": "" }, + { + "term": "User", + "context": "User", + "reference": "Modules/ControlCenter/Components/HeaderPane.qml:54", + "comment": "" + }, { "term": "Username", "context": "Username", @@ -6680,7 +7142,7 @@ { "term": "VPN", "context": "VPN", - "reference": "Modules/Settings/WidgetsTabSection.qml:813, Modules/Settings/WidgetsTab.qml:175, Modules/Settings/NetworkTab.qml:1403", + "reference": "Modules/Settings/WidgetsTabSection.qml:813, Modules/Settings/WidgetsTab.qml:175, Modules/Settings/NetworkTab.qml:1403, Modules/ControlCenter/Models/WidgetModel.qml:187, Modules/ControlCenter/BuiltinPlugins/VpnWidget.qml:15", "comment": "" }, { @@ -6701,6 +7163,12 @@ "reference": "Services/VPNService.qml:143", "comment": "" }, + { + "term": "VPN connections", + "context": "VPN connections", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:188", + "comment": "" + }, { "term": "VPN deleted", "context": "VPN deleted", @@ -6708,11 +7176,17 @@ "comment": "" }, { - "term": "VPN imported: ", - "context": "VPN imported: ", + "term": "VPN imported: %1", + "context": "VPN imported: %1", "reference": "Services/VPNService.qml:91", "comment": "" }, + { + "term": "VPN not available", + "context": "VPN not available", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:192", + "comment": "" + }, { "term": "VPN status and quick connect", "context": "VPN status and quick connect", @@ -6821,6 +7295,12 @@ "reference": "Modules/Settings/SoundsTab.qml:106", "comment": "" }, + { + "term": "Volume Slider", + "context": "Volume Slider", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:135", + "comment": "" + }, { "term": "Volume, brightness, and other system OSDs", "context": "Volume, brightness, and other system OSDs", @@ -6899,10 +7379,22 @@ "reference": "Modals/WifiPasswordModal.qml:191", "comment": "" }, + { + "term": "Wi-Fi and Ethernet connection", + "context": "Wi-Fi and Ethernet connection", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:102", + "comment": "" + }, + { + "term": "Wi-Fi not available", + "context": "Wi-Fi not available", + "reference": "Modules/ControlCenter/Models/WidgetModel.qml:106", + "comment": "" + }, { "term": "WiFi", "context": "WiFi", - "reference": "Modules/Settings/NetworkTab.qml:159, Modules/Settings/NetworkTab.qml:206, Modules/Settings/NetworkTab.qml:730", + "reference": "Modules/Settings/NetworkTab.qml:159, Modules/Settings/NetworkTab.qml:206, Modules/Settings/NetworkTab.qml:730, Modules/ControlCenter/Details/NetworkDetail.qml:121", "comment": "" }, { @@ -7097,6 +7589,12 @@ "reference": "Modules/Settings/ClipboardTab.qml:152", "comment": "" }, + { + "term": "dgop not available", + "context": "dgop not available", + "reference": "Modules/ControlCenter/Details/DiskUsageDetail.qml:64, Modules/ControlCenter/Widgets/DiskUsagePill.qml:47", + "comment": "" + }, { "term": "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.", "context": "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.", @@ -7109,6 +7607,12 @@ "reference": "Services/KeybindsService.qml:217", "comment": "" }, + { + "term": "dms/outputs config exists but is not included in your compositor config. Display changes won't persist.", + "context": "dms/outputs config exists but is not included in your compositor config. Display changes won't persist.", + "reference": "Modules/Settings/DisplayConfig/IncludeWarningBox.qml:60", + "comment": "" + }, { "term": "e.g., firefox, kitty --title foo", "context": "e.g., firefox, kitty --title foo", @@ -7121,6 +7625,12 @@ "reference": "Widgets/KeybindItem.qml:1324", "comment": "" }, + { + "term": "e.g., notify-send 'Hello' && sleep 1", + "context": "e.g., notify-send 'Hello' && sleep 1", + "reference": "Widgets/KeybindItem.qml:1419", + "comment": "" + }, { "term": "events", "context": "events", diff --git a/quickshell/translations/extract_translations.py b/quickshell/translations/extract_translations.py index d86a84c0..0a100af7 100755 --- a/quickshell/translations/extract_translations.py +++ b/quickshell/translations/extract_translations.py @@ -7,23 +7,26 @@ from collections import defaultdict def extract_qstr_strings(root_dir): translations = defaultdict(lambda: {'contexts': set(), 'occurrences': []}) - qstr_pattern = re.compile(r'qsTr\(["\']([^"\']+)["\']\)') - i18n_pattern_with_context = re.compile(r'I18n\.tr\(["\']([^"\']+)["\']\s*,\s*["\']([^"\']+)["\']\)') - i18n_pattern_simple = re.compile(r'I18n\.tr\(["\']([^"\']+)["\']\)') + qstr_pattern_double = re.compile(r'qsTr\("([^"]+)"\)') + qstr_pattern_single = re.compile(r"qsTr\('([^']+)'\)") + i18n_pattern_with_context_double = re.compile(r'I18n\.tr\("([^"]+)"\s*,\s*"([^"]+)"\)') + i18n_pattern_with_context_single = re.compile(r"I18n\.tr\('([^']+)'\s*,\s*'([^']+)'\)") + i18n_pattern_simple_double = re.compile(r'I18n\.tr\("([^"]+)"\)') + i18n_pattern_simple_single = re.compile(r"I18n\.tr\('([^']+)'\)") for qml_file in Path(root_dir).rglob('*.qml'): relative_path = qml_file.relative_to(root_dir) with open(qml_file, 'r', encoding='utf-8') as f: for line_num, line in enumerate(f, 1): - qstr_matches = qstr_pattern.findall(line) + qstr_matches = qstr_pattern_double.findall(line) + qstr_pattern_single.findall(line) for match in qstr_matches: translations[match]['occurrences'].append({ 'file': str(relative_path), 'line': line_num }) - i18n_with_context = i18n_pattern_with_context.findall(line) + i18n_with_context = i18n_pattern_with_context_double.findall(line) + i18n_pattern_with_context_single.findall(line) for term, context in i18n_with_context: translations[term]['contexts'].add(context) translations[term]['occurrences'].append({ @@ -31,9 +34,10 @@ def extract_qstr_strings(root_dir): 'line': line_num }) - i18n_simple = i18n_pattern_simple.findall(line) - for match in i18n_simple: - if not i18n_pattern_with_context.search(line): + has_context = i18n_pattern_with_context_double.search(line) or i18n_pattern_with_context_single.search(line) + if not has_context: + i18n_simple = i18n_pattern_simple_double.findall(line) + i18n_pattern_simple_single.findall(line) + for match in i18n_simple: translations[match]['occurrences'].append({ 'file': str(relative_path), 'line': line_num diff --git a/quickshell/translations/template.json b/quickshell/translations/template.json index 84aa3ea6..fa5b43d7 100644 --- a/quickshell/translations/template.json +++ b/quickshell/translations/template.json @@ -350,7 +350,14 @@ "comment": "" }, { - "term": "Active: ", + "term": "Active: %1", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Active: %1 +%2", "translation": "", "context": "", "reference": "", @@ -412,6 +419,13 @@ "reference": "", "comment": "" }, + { + "term": "Add a custom prefix to all application launches. This can be used for things like 'uwsm-app', 'systemd-run', or other command wrappers.", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Adjust the number of columns in grid view mode.", "translation": "", @@ -489,6 +503,20 @@ "reference": "", "comment": "" }, + { + "term": "Always show the dock when niri's overview is open", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Always show when there's only one connected display", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Amount", "translation": "", @@ -622,6 +650,20 @@ "reference": "", "comment": "" }, + { + "term": "Audio Input", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Audio Output", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Audio Output Devices (", "translation": "", @@ -643,6 +685,13 @@ "reference": "", "comment": "" }, + { + "term": "Audio volume control", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Auth", "translation": "", @@ -875,7 +924,7 @@ "comment": "" }, { - "term": "Available Screens (", + "term": "Available Screens (%1)", "translation": "", "context": "", "reference": "", @@ -909,6 +958,13 @@ "reference": "", "comment": "" }, + { + "term": "Backlight device", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Balanced palette with focused accents (default).", "translation": "", @@ -937,6 +993,13 @@ "reference": "", "comment": "" }, + { + "term": "Battery and power management", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Battery level and power management", "translation": "", @@ -979,6 +1042,27 @@ "reference": "", "comment": "" }, + { + "term": "Block notifications", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Blocked", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Blue light filter", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Bluetooth", "translation": "", @@ -993,6 +1077,13 @@ "reference": "", "comment": "" }, + { + "term": "Bluetooth not available", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Blur on Overview", "translation": "", @@ -1077,6 +1168,20 @@ "reference": "", "comment": "" }, + { + "term": "Brightness Slider", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Brightness control not available", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Browse", "translation": "", @@ -1154,6 +1259,13 @@ "reference": "", "comment": "" }, + { + "term": "CUPS not available", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Camera", "translation": "", @@ -1175,6 +1287,13 @@ "reference": "", "comment": "" }, + { + "term": "Cannot pair", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Capabilities", "translation": "", @@ -1245,6 +1364,13 @@ "reference": "", "comment": "" }, + { + "term": "Charging", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Check for system updates", "translation": "", @@ -1266,6 +1392,20 @@ "reference": "", "comment": "" }, + { + "term": "Choose a color", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Choose colors from palette", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Choose icon", "translation": "", @@ -1371,6 +1511,20 @@ "reference": "", "comment": "" }, + { + "term": "Click 'Setup' to create dms/binds.kdl and add include to config.kdl.", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Click 'Setup' to create the outputs config and add include to your compositor config.", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Click Import to add a .ovpn or .conf", "translation": "", @@ -1714,6 +1868,13 @@ "reference": "", "comment": "" }, + { + "term": "Connecting...", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Contrast", "translation": "", @@ -1889,6 +2050,13 @@ "reference": "", "comment": "" }, + { + "term": "Current: %1", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Custom", "translation": "", @@ -1994,6 +2162,13 @@ "reference": "", "comment": "" }, + { + "term": "DDC/CI monitor", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "DEMO MODE - Click anywhere to exit", "translation": "", @@ -2260,6 +2435,13 @@ "reference": "", "comment": "" }, + { + "term": "Device connections", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Device paired", "translation": "", @@ -2323,6 +2505,13 @@ "reference": "", "comment": "" }, + { + "term": "Disabling WiFi...", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Discard", "translation": "", @@ -2421,6 +2610,13 @@ "reference": "", "comment": "" }, + { + "term": "Display brightness control", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Display configuration is not available. WLR output management protocol not supported.", "translation": "", @@ -2547,6 +2743,20 @@ "reference": "", "comment": "" }, + { + "term": "Don't Change", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Don't Save", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Door Open", "translation": "", @@ -2722,6 +2932,13 @@ "reference": "", "comment": "" }, + { + "term": "Enabling WiFi...", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "End", "translation": "", @@ -2785,6 +3002,13 @@ "reference": "", "comment": "" }, + { + "term": "Enter launch prefix (e.g., 'uwsm-app')", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Enter passkey for ", "translation": "", @@ -2841,6 +3065,13 @@ "reference": "", "comment": "" }, + { + "term": "Exponential", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "External Wallpaper Management", "translation": "", @@ -2912,7 +3143,7 @@ "comment": "" }, { - "term": "Failed to connect to ", + "term": "Failed to connect to %1", "translation": "", "context": "", "reference": "", @@ -2960,6 +3191,13 @@ "reference": "", "comment": "" }, + { + "term": "Failed to disable night mode", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Failed to disconnect VPN", "translation": "", @@ -2981,6 +3219,13 @@ "reference": "", "comment": "" }, + { + "term": "Failed to enable IP location", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Failed to enable WiFi", "translation": "", @@ -2995,6 +3240,13 @@ "reference": "", "comment": "" }, + { + "term": "Failed to enable night mode", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Failed to hold job", "translation": "", @@ -3093,6 +3345,34 @@ "reference": "", "comment": "" }, + { + "term": "Failed to set brightness", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Failed to set night mode location", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Failed to set night mode schedule", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Failed to set night mode temperature", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Failed to set profile image", "translation": "", @@ -3101,14 +3381,14 @@ "comment": "" }, { - "term": "Failed to set profile image: ", + "term": "Failed to set profile image: %1", "translation": "", "context": "", "reference": "", "comment": "" }, { - "term": "Failed to start connection to ", + "term": "Failed to start connection to %1", "translation": "", "context": "", "reference": "", @@ -3191,6 +3471,13 @@ "reference": "", "comment": "" }, + { + "term": "Filesystem usage monitoring", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Find in Text", "translation": "", @@ -3367,7 +3654,7 @@ "comment": "" }, { - "term": "Forgot network ", + "term": "Forgot network %1", "translation": "", "context": "", "reference": "", @@ -3849,6 +4136,13 @@ "reference": "", "comment": "" }, + { + "term": "Input Volume Slider", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Install plugins from the DMS plugin registry", "translation": "", @@ -3975,6 +4269,13 @@ "reference": "", "comment": "" }, + { + "term": "LED device", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Last launched %1", "translation": "", @@ -4087,6 +4388,13 @@ "reference": "", "comment": "" }, + { + "term": "Linear", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Lines: %1", "translation": "", @@ -4108,6 +4416,13 @@ "reference": "", "comment": "" }, + { + "term": "Loading codecs...", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Loading keybinds...", "translation": "", @@ -4262,6 +4577,13 @@ "reference": "", "comment": "" }, + { + "term": "Management", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Manual Coordinates", "translation": "", @@ -4507,6 +4829,20 @@ "reference": "", "comment": "" }, + { + "term": "Microphone settings", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Microphone volume control", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Middle Section", "translation": "", @@ -4850,6 +5186,20 @@ "reference": "", "comment": "" }, + { + "term": "No battery", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "No brightness devices available", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "No changes", "translation": "", @@ -4871,6 +5221,20 @@ "reference": "", "comment": "" }, + { + "term": "No disk data", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "No disk data available", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "No drivers found", "translation": "", @@ -4983,6 +5347,13 @@ "reference": "", "comment": "" }, + { + "term": "Not available", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Not connected", "translation": "", @@ -5305,6 +5676,13 @@ "reference": "", "comment": "" }, + { + "term": "Paired", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Pairing failed", "translation": "", @@ -5312,6 +5690,13 @@ "reference": "", "comment": "" }, + { + "term": "Pairing...", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Passkey:", "translation": "", @@ -5389,6 +5774,13 @@ "reference": "", "comment": "" }, + { + "term": "Pin", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Pin to Dock", "translation": "", @@ -5396,6 +5788,13 @@ "reference": "", "comment": "" }, + { + "term": "Pinned", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Place plugin directories here. Each plugin should have a plugin.json manifest file.", "translation": "", @@ -5404,7 +5803,7 @@ "comment": "" }, { - "term": "Place plugins in", + "term": "Place plugins in %1", "translation": "", "context": "", "reference": "", @@ -5452,6 +5851,20 @@ "reference": "", "comment": "" }, + { + "term": "Plugged in", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Plugin", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Plugin Directory", "translation": "", @@ -5578,6 +5991,13 @@ "reference": "", "comment": "" }, + { + "term": "Power profile management available", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Power source", "translation": "", @@ -5634,6 +6054,13 @@ "reference": "", "comment": "" }, + { + "term": "Print Server Management", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Print Server not available", "translation": "", @@ -5887,7 +6314,14 @@ "comment": "" }, { - "term": "Requires DMS", + "term": "Requires 'dgop' tool", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Requires DMS %1", "translation": "", "context": "", "reference": "", @@ -5900,6 +6334,13 @@ "reference": "", "comment": "" }, + { + "term": "Requires night mode support", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Reset", "translation": "", @@ -6005,6 +6446,13 @@ "reference": "", "comment": "" }, + { + "term": "Root Filesystem", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Run DMS Templates", "translation": "", @@ -6131,6 +6579,13 @@ "reference": "", "comment": "" }, + { + "term": "Scanning", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Scanning...", "translation": "", @@ -6166,6 +6621,13 @@ "reference": "", "comment": "" }, + { + "term": "Scroll title if it doesn't fit in widget", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Scrolling", "translation": "", @@ -6481,6 +6943,13 @@ "reference": "", "comment": "" }, + { + "term": "Shortcuts (%1)", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Show All Tags", "translation": "", @@ -6978,6 +7447,13 @@ "reference": "", "comment": "" }, + { + "term": "Speaker settings", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Speed", "translation": "", @@ -7223,6 +7699,13 @@ "reference": "", "comment": "" }, + { + "term": "System theme toggle", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "System toast notifications", "translation": "", @@ -7286,6 +7769,13 @@ "reference": "", "comment": "" }, + { + "term": "The 'dgop' tool is required for system monitoring.\\nPlease install dgop to use this feature.", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "The DMS_SOCKET environment variable is not set or the socket is unavailable. Automated plugin management requires the DMS_SOCKET.", "translation": "", @@ -7384,6 +7874,20 @@ "reference": "", "comment": "" }, + { + "term": "Time remaining: %1", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Time until full: %1", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Timed Out", "translation": "", @@ -7608,6 +8112,34 @@ "reference": "", "comment": "" }, + { + "term": "Unknown Config", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Unknown Device", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Unknown Monitor", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Unknown Network", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Unpin from Dock", "translation": "", @@ -7769,6 +8301,13 @@ "reference": "", "comment": "" }, + { + "term": "User", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Username", "translation": "", @@ -7818,6 +8357,13 @@ "reference": "", "comment": "" }, + { + "term": "VPN connections", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "VPN deleted", "translation": "", @@ -7826,7 +8372,14 @@ "comment": "" }, { - "term": "VPN imported: ", + "term": "VPN imported: %1", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "VPN not available", "translation": "", "context": "", "reference": "", @@ -7958,6 +8511,13 @@ "reference": "", "comment": "" }, + { + "term": "Volume Slider", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Volume, brightness, and other system OSDs", "translation": "", @@ -8049,6 +8609,20 @@ "reference": "", "comment": "" }, + { + "term": "Wi-Fi and Ethernet connection", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Wi-Fi not available", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "WiFi", "translation": "", @@ -8280,6 +8854,13 @@ "reference": "", "comment": "" }, + { + "term": "dgop not available", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.", "translation": "", @@ -8294,6 +8875,13 @@ "reference": "", "comment": "" }, + { + "term": "dms/outputs config exists but is not included in your compositor config. Display changes won't persist.", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "e.g., firefox, kitty --title foo", "translation": "", @@ -8308,6 +8896,13 @@ "reference": "", "comment": "" }, + { + "term": "e.g., notify-send 'Hello' && sleep 1", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "events", "translation": "",