diff --git a/network-indicator/BarWidget.qml b/network-indicator/BarWidget.qml index 691375072..d7fd1e8f0 100644 --- a/network-indicator/BarWidget.qml +++ b/network-indicator/BarWidget.qml @@ -7,222 +7,241 @@ import QtQuick.Layouts import Quickshell Item { - id: root - - property var pluginApi: null - - property ShellScreen screen - property string widgetId: "" - property string section: "" - property int sectionWidgetIndex: -1 - property int sectionWidgetsCount: 0 - - // ── Configuration ── - - property var cfg: pluginApi?.pluginSettings || ({}) - property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) - - property string arrowType: cfg.arrowType ?? defaults.arrowType - - property bool useCustomColors: cfg.useCustomColors ?? defaults.useCustomColors - property bool showNumbers: cfg.showNumbers ?? defaults.showNumbers - - property color colorSilent: root.useCustomColors && cfg.colorSilent || Color.mSurfaceVariant - property color colorTx: root.useCustomColors && cfg.colorTx || Color.mSecondary - property color colorRx: root.useCustomColors && cfg.colorRx || Color.mPrimary - property color colorText: root.useCustomColors && cfg.colorText || Color.mOnSurfaceVariant - - property int byteThresholdActive: cfg.byteThresholdActive ?? defaults.byteThresholdActive - property real fontSizeModifier: cfg.fontSizeModifier ?? defaults.fontSizeModifier - property real iconSizeModifier: cfg.iconSizeModifier ?? defaults.iconSizeModifier - property real spacingInbetween: cfg.spacingInbetween ?? defaults.spacingInbetween - property real contentMargin: cfg.contentMargin ?? defaults.contentMargin ?? Style.marginS - - property bool useCustomFont: cfg.useCustomFont ?? defaults.useCustomFont - property string customFontFamily: cfg.customFontFamily ?? defaults.customFontFamily - property bool customFontBold: cfg.customFontBold ?? defaults.customFontBold - property bool customFontItalic: cfg.customFontItalic ?? defaults.customFontItalic - - property bool horizontalNumbers: cfg.horizontalLayout ?? defaults.horizontalLayout - - readonly property string resolvedFontFamily: { - if (root.useCustomFont && root.customFontFamily) - return root.customFontFamily; - return Settings.data.ui.fontDefault; + id: root + + property var pluginApi: null + + property ShellScreen screen + property string widgetId: "" + property string section: "" + property int sectionWidgetIndex: -1 + property int sectionWidgetsCount: 0 + + property string txSpeed: (SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s").padStart(8, " ") + property string rxSpeed: (SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s").padStart(8, " ") + + // ── Configuration ── + + property var cfg: pluginApi?.pluginSettings || ({}) + property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) + + property string iconType: cfg.iconType ?? defaults.iconType + property int byteThresholdActive: cfg.byteThresholdActive ?? defaults.byteThresholdActive + property string layout: cfg.layout ?? defaults.layout + property var slots: cfg.slots ?? defaults.slots + + property real fontSizeModifier: cfg.fontSizeModifier ?? defaults.fontSizeModifier + property real iconSizeModifier: cfg.iconSizeModifier ?? defaults.iconSizeModifier + + property real columnSpacing: cfg.columnSpacing ?? defaults.columnSpacing + property real rowSpacing: cfg.rowSpacing ?? defaults.rowSpacing + property real paddingLeft: cfg.paddingLeft ?? defaults.paddingLeft + property real paddingRight: cfg.paddingRight ?? defaults.paddingRight + + property bool useCustomColors: cfg.useCustomColors ?? defaults.useCustomColors + property color colorSilent: root.useCustomColors && cfg.colorSilent || Color.mSurfaceVariant + property color colorTx: root.useCustomColors && cfg.colorTx || Color.mSecondary + property color colorRx: root.useCustomColors && cfg.colorRx || Color.mPrimary + property color colorText: root.useCustomColors && cfg.colorText || Color.mOnSurfaceVariant + + property bool useCustomFont: cfg.useCustomFont ?? defaults.useCustomFont + property string customFontFamily: cfg.customFontFamily ?? defaults.customFontFamily + property bool customFontBold: cfg.customFontBold ?? defaults.customFontBold + property bool customFontItalic: cfg.customFontItalic ?? defaults.customFontItalic + + readonly property string resolvedFontFamily: { + if (root.useCustomFont && root.customFontFamily) + return root.customFontFamily; + return Settings.data.ui.fontDefault; + } + + readonly property int resolvedFontWeight: { + if (root.useCustomFont && root.customFontBold) + return Font.Bold; + return Style.fontWeightMedium; + } + + readonly property bool resolvedFontItalic: root.useCustomFont && root.customFontItalic + + // ── Widget ── + + property bool txActive: SystemStatService.txSpeed >= root.byteThresholdActive + property bool rxActive: SystemStatService.rxSpeed >= root.byteThresholdActive + + property string barPosition: Settings.data.bar.position || "top" + property string barDensity: Settings.data.bar.density || "compact" + property bool barIsSpacious: barDensity != "mini" + property bool barIsVertical: barPosition === "left" || barPosition === "right" + + readonly property real contentWidth: barIsVertical ? Style.capsuleHeight : content.implicitWidth + root.paddingLeft + root.paddingRight + readonly property real contentHeight: barIsVertical ? Math.round(content.implicitHeight + Style.marginM * 2) : Style.capsuleHeight + + implicitWidth: contentWidth + implicitHeight: contentHeight + + NIcon { + id: txIconElement + icon: root.iconType + "-up" + color: root.txActive ? root.colorTx : root.colorSilent + pointSize: Style.fontSizeL * root.iconSizeModifier + } + + NIcon { + id: rxIconElement + icon: root.iconType + "-down" + color: root.rxActive ? root.colorRx : root.colorSilent + pointSize: Style.fontSizeL * root.iconSizeModifier + } + + NText { + id: txSpeedElement + text: root.txSpeed + color: root.colorText + pointSize: Style.barFontSize * root.fontSizeModifier + font.family: root.resolvedFontFamily + font.weight: root.resolvedFontWeight + font.italic: root.resolvedFontItalic + } + + NText { + id: rxSpeedElement + text: root.rxSpeed + color: root.colorText + pointSize: Style.barFontSize * root.fontSizeModifier + font.family: root.resolvedFontFamily + font.weight: root.resolvedFontWeight + font.italic: root.resolvedFontItalic + } + + function getElement(name) { + switch (name) { + case "txIcon": + return txIconElement; + case "rxIcon": + return rxIconElement; + case "txSpeed": + return txSpeedElement; + case "rxSpeed": + return rxSpeedElement; + default: + return null; } - - readonly property int resolvedFontWeight: { - if (root.useCustomFont && root.customFontBold) - return Font.Bold; - return Style.fontWeightMedium; + } + + readonly property var spacers: [spacer0, spacer1, spacer2, spacer3] + + Item { + id: spacer0 + } + Item { + id: spacer1 + } + Item { + id: spacer2 + } + Item { + id: spacer3 + } + + Rectangle { + id: visualCapsule + x: Style.pixelAlignCenter(parent.width, width) + y: Style.pixelAlignCenter(parent.height, height) + width: root.contentWidth + height: root.contentHeight + color: Style.capsuleColor + radius: Style.radiusM + border.color: Style.capsuleBorderColor + border.width: Style.capsuleBorderWidth + + GridLayout { + id: content + + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: root.paddingLeft + anchors.right: parent.right + anchors.rightMargin: root.paddingRight + + rows: root.layout === "horizontal" ? 1 : 2 + columns: root.layout === "horizontal" ? 4 : 2 + columnSpacing: root.columnSpacing + rowSpacing: root.rowSpacing } - - readonly property bool resolvedFontItalic: root.useCustomFont && root.customFontItalic - - readonly property bool numbersVisible: root.showNumbers && barIsSpacious && !barIsVertical - - property string barPosition: Settings.data.bar.position || "top" - property string barDensity: Settings.data.bar.density || "compact" - property bool barIsSpacious: barDensity != "mini" - property bool barIsVertical: barPosition === "left" || barPosition === "right" - - readonly property real contentWidth: barIsVertical ? Style.capsuleHeight : contentRow.implicitWidth + root.contentMargin * 2 - readonly property real contentHeight: barIsVertical ? Math.round(contentRow.implicitHeight + Style.marginM * 2) : Style.capsuleHeight - - implicitWidth: contentWidth - implicitHeight: contentHeight - - // ── Widget ── - - property string txSpeed: (SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s").padStart(8, " ") - property string rxSpeed: (SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s").padStart(8, " ") - - Rectangle { - id: visualCapsule - x: Style.pixelAlignCenter(parent.width, width) - y: Style.pixelAlignCenter(parent.height, height) - width: root.contentWidth - height: root.contentHeight - color: Style.capsuleColor - radius: Style.radiusM - border.color: Style.capsuleBorderColor - border.width: Style.capsuleBorderWidth - - RowLayout { - id: contentRow - anchors.centerIn: parent - spacing: Style.marginS - - // Vertical layout: stacked values to the left - Column { - visible: root.numbersVisible && !root.horizontalNumbers - spacing: root.spacingInbetween - - NText { - horizontalAlignment: Text.AlignRight - text: root.txSpeed - color: root.colorText - pointSize: Style.barFontSize * root.fontSizeModifier - font.family: root.resolvedFontFamily - font.weight: root.resolvedFontWeight - font.italic: root.resolvedFontItalic - } - - NText { - horizontalAlignment: Text.AlignRight - text: root.rxSpeed - color: root.colorText - pointSize: Style.barFontSize * root.fontSizeModifier - font.family: root.resolvedFontFamily - font.weight: root.resolvedFontWeight - font.italic: root.resolvedFontItalic - } - } - - // Horizontal layout: TX value left - NText { - visible: root.numbersVisible && root.horizontalNumbers - horizontalAlignment: Text.AlignRight - text: root.rxSpeed - color: root.colorText - pointSize: Style.barFontSize * root.fontSizeModifier - font.family: root.resolvedFontFamily - font.weight: root.resolvedFontWeight - font.italic: root.resolvedFontItalic - } - - // Icons - Column { - spacing: -10.0 + root.spacingInbetween - - NIcon { - icon: arrowType + "-up" - color: SystemStatService.txSpeed >= root.byteThresholdActive ? root.colorTx : root.colorSilent - pointSize: Style.fontSizeL * root.iconSizeModifier - } - - NIcon { - icon: arrowType + "-down" - color: SystemStatService.rxSpeed >= root.byteThresholdActive ? root.colorRx : root.colorSilent - pointSize: Style.fontSizeL * root.iconSizeModifier - } - } - - // Horizontal layout: RX value right - NText { - visible: root.numbersVisible && root.horizontalNumbers - horizontalAlignment: Text.AlignLeft - text: root.txSpeed - color: root.colorText - pointSize: Style.barFontSize * root.fontSizeModifier - font.family: root.resolvedFontFamily - font.weight: root.resolvedFontWeight - font.italic: root.resolvedFontItalic - } - } + } + + function rebuildLayout() { + rxIconElement.parent = root; + rxIconElement.visible = false; + rxSpeedElement.parent = root; + rxSpeedElement.visible = false; + txIconElement.parent = root; + txIconElement.visible = false; + txSpeedElement.parent = root; + txSpeedElement.visible = false; + + for (let s of spacers) { + s.parent = root; + s.visible = false; } - // ── Interaction ── - - HoverHandler { - id: hoverHandler - onHoveredChanged: { - if (hovered) { - closeTimer.stop(); - hoverTimer.start(); - } else { - hoverTimer.stop(); - closeTimer.start(); - } - } + for (let idx = 0; idx < root.slots.length; idx++) { + const elem = root.getElement(root.slots[idx]); + if (elem) { + elem.parent = content; + elem.visible = true; + } else { + const s = spacers[idx]; + s.parent = content; + s.visible = true; + } } + } - Timer { - id: hoverTimer - interval: 500 - onTriggered: { - if (hoverHandler.hovered && root.pluginApi && !pluginApi.panelOpenScreen) - pluginApi.openPanel(root.screen, root); - } - } + onSlotsChanged: rebuildLayout() + onLayoutChanged: rebuildLayout() + Component.onCompleted: rebuildLayout() - Timer { - id: closeTimer - interval: 250 - onTriggered: { - if (!hoverHandler.hovered && root.pluginApi && pluginApi.panelOpenScreen) - pluginApi.togglePanel(root.screen, root); - } - } + // ── Interaction ── - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.RightButton + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.LeftButton | Qt.RightButton - onPressed: mouse => { - if (mouse.button == Qt.RightButton) - PanelService.showContextMenu(contextMenu, root, screen); - } + onPressed: mouse => { + if (mouse.button == Qt.LeftButton) + pluginApi.togglePanel(root.screen, root); + + if (mouse.button == Qt.RightButton) + PanelService.showContextMenu(contextMenu, root, screen); + } - NPopupContextMenu { - id: contextMenu - - model: [ - { - "label": root.pluginApi?.tr("actions.widget-settings"), - "action": "widget-settings", - "icon": "settings" - }, - ] - - onTriggered: action => { - contextMenu.close(); - PanelService.closeContextMenu(screen); - - if (action === "widget-settings") { - BarService.openPluginSettings(screen, pluginApi.manifest); - } - } + NPopupContextMenu { + id: contextMenu + + model: [ + { + "label": root.pluginApi?.tr("actions.toggle-panel"), + "action": "toggle-panel", + "icon": "activity" + }, + { + "label": root.pluginApi?.tr("actions.widget-settings"), + "action": "widget-settings", + "icon": "settings" + }, + ] + + onTriggered: action => { + contextMenu.close(); + PanelService.closeContextMenu(screen); + + if (action === "toggle-panel") + pluginApi.togglePanel(root.screen, root); + else if (action === "widget-settings") { + BarService.openPluginSettings(screen, pluginApi.manifest); } + } } + } } diff --git a/network-indicator/Panel.qml b/network-indicator/Panel.qml index 1fbe98089..dee989fe6 100644 --- a/network-indicator/Panel.qml +++ b/network-indicator/Panel.qml @@ -1,103 +1,358 @@ +import QtQuick +import QtQuick.Layouts import qs.Commons -import qs.Modules.MainScreen import qs.Services.UI import qs.Services.System import qs.Widgets -import QtQuick -import QtQuick.Layouts Item { - id: root + id: root + + property var pluginApi: null - readonly property var geometryPlaceholder: panelContent - readonly property bool allowAttach: true + readonly property var geometryPlaceholder: panelContainer + readonly property bool allowAttach: true - property var pluginApi: null - property var cfg: pluginApi?.pluginSettings || ({}) - property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) - property string arrowType: cfg.arrowType ?? defaults.arrowType + property var cfg: pluginApi?.pluginSettings || ({}) + property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) + property string iconType: cfg.iconType ?? defaults.iconType ?? "arrow" - property real contentPreferredWidth: 440 * Style.uiScaleRatio - property real contentPreferredHeight: panelContent.implicitHeight + Style.marginL * 2 + property real contentPreferredWidth: 400 * Style.uiScaleRatio + property real contentPreferredHeight: Math.min(contentColumn.implicitHeight + Style.marginL * 2, 600 * Style.uiScaleRatio) + property bool useCustomColors: cfg.useCustomColors ?? defaults.useCustomColors + property color colorTx: root.useCustomColors && cfg.colorTx || Color.mSecondary + property color colorRx: root.useCustomColors && cfg.colorRx || Color.mPrimary + + anchors.fill: parent + + Component.onCompleted: { + if (pluginApi) + Logger.i("NetworkIndicator", "Panel initialized"); + } + + Rectangle { + id: panelContainer anchors.fill: parent + color: "transparent" + + ColumnLayout { + id: contentColumn + + anchors.fill: parent + anchors.margins: Style.marginL + spacing: Style.marginM + + // ── Header ── + + RowLayout { + Layout.fillWidth: true + spacing: Style.marginM + + NIcon { + icon: "activity" + pointSize: Style.fontSizeXL + color: Color.mPrimary + Layout.alignment: Qt.AlignVCenter + } + + NText { + text: root.pluginApi?.tr("panel.title") + pointSize: Style.fontSizeL + font.weight: Font.Bold + color: Color.mOnSurface + Layout.alignment: Qt.AlignVCenter + } + + Item { + Layout.fillWidth: true + } - Component.onCompleted: { - if (pluginApi) { - Logger.i("NetworkIndicator", "Panel initialized"); + NText { + text: `Interval ${(SystemStatService.networkIntervalMs / 1000)}s` + pointSize: Style.fontSizeXXS + color: Qt.alpha(Color.mOnSurface, 0.5) + Layout.alignment: Qt.AlignVCenter } + + NIconButton { + icon: "settings" + tooltipText: root.pluginApi?.tr("actions.widget-settings") + onClicked: { + const screen = root.pluginApi?.panelOpenScreen; + if (screen) { + root.pluginApi.closePanel(screen); + Qt.callLater(() => BarService.openPluginSettings(screen, root.pluginApi.manifest)); + } + } + Layout.alignment: Qt.AlignVCenter + } + + NIconButton { + icon: "close" + tooltipText: root.pluginApi?.tr("panel.close") + onClicked: { + const s = root.pluginApi?.panelOpenScreen; + if (s) + root.pluginApi.closePanel(s); + } + Layout.alignment: Qt.AlignVCenter + } + } + + // ── Download (RX) ── + + NBox { + Layout.fillWidth: true + Layout.preferredHeight: rxGraph.implicitHeight + Style.marginS * 2 + + NetworkGraph { + id: rxGraph + anchors.fill: parent + anchors.margins: Style.marginS + + label: root.pluginApi?.tr("panel.download") + iconName: root.iconType + "-down" + accentColor: root.colorRx + history: SystemStatService.rxSpeedHistory + maxValue: SystemStatService.rxMaxSpeed + currentSpeed: SystemStatService.rxSpeed + } + } + + // ── Upload (TX) ── + + NBox { + Layout.fillWidth: true + Layout.preferredHeight: txGraph.implicitHeight + Style.marginS * 2 + + NetworkGraph { + id: txGraph + anchors.fill: parent + anchors.margins: Style.marginS + + label: root.pluginApi?.tr("panel.upload") + iconName: root.iconType + "-up" + accentColor: root.colorTx + history: SystemStatService.txSpeedHistory + maxValue: SystemStatService.txMaxSpeed + currentSpeed: SystemStatService.txSpeed + } + } } + } - ColumnLayout { - id: panelContent + component NetworkGraph: ColumnLayout { + id: graphRoot + + required property string label + required property string iconName + required property color accentColor + required property var history + required property real maxValue + required property real currentSpeed + + function formatSpeed(bytesPerSec) { + return (SystemStatService.formatSpeed(bytesPerSec).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s"); + } + function timeAgo(idx) { + const n = graphRoot.history.length; + if (n < 2 || idx < 0) + return ""; + + const secsAgo = Math.round((n - 1 - idx) * SystemStatService.networkIntervalMs / 1000); + if (secsAgo < 60) + return secsAgo + "s ago"; + + const mins = Math.floor(secsAgo / 60); + const secs = secsAgo % 60; + return mins + "m " + secs + "s ago"; + } + + readonly property real yTickHigh: graphRoot.maxValue > 0 ? graphRoot.maxValue * 0.66 : 0 + readonly property real yTickLow: graphRoot.maxValue > 0 ? graphRoot.maxValue * 0.33 : 0 + readonly property real yAxisWidth: yAxisSizer.width + Style.marginXL + + spacing: Style.marginXS + + // Hidden text to measure the widest Y-axis label. + // TODO: find a better way. + NText { + id: yAxisSizer + visible: false + text: graphRoot.formatSpeed(graphRoot.yTickHigh) + pointSize: Style.fontSizeXS * 0.8 + } + + RowLayout { + Layout.fillWidth: true + spacing: Style.marginXS + + NIcon { + icon: graphRoot.iconName + pointSize: Style.fontSizeXS + color: graphRoot.accentColor + } + + NText { + text: graphRoot.label + pointSize: Style.fontSizeXS + color: graphRoot.accentColor + font.weight: Font.Medium + } + + Item { + Layout.fillWidth: true + } + + NText { + text: graphRoot.formatSpeed(graphRoot.currentSpeed) + pointSize: Style.fontSizeXS + color: graphRoot.accentColor + font.family: Settings.data.ui.fontFixed + } + } + + Item { + Layout.fillWidth: true + implicitHeight: 120 * Style.uiScaleRatio + + Item { + id: graphArea anchors.fill: parent - anchors.margins: Style.marginL - - NBox { - Layout.fillWidth: true - Layout.preferredHeight: 90 * Style.uiScaleRatio - - ColumnLayout { - anchors.fill: parent - anchors.margins: Style.marginS - anchors.bottomMargin: Style.radiusM * 0.5 - spacing: Style.marginXS - - RowLayout { - Layout.fillWidth: true - spacing: Style.marginXS - - NIcon { - icon: arrowType + "-down" - pointSize: Style.fontSizeXS - color: Color.mPrimary - } - - NText { - text: (SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s").padStart(8, " ") - pointSize: Style.fontSizeXS - color: Color.mPrimary - font.family: Settings.data.ui.fontFixed - Layout.rightMargin: Style.marginS - } - - NIcon { - icon: arrowType + "-up" - pointSize: Style.fontSizeXS - color: Color.mSecondary - } - - NText { - text: (SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s").padStart(8, " ") - pointSize: Style.fontSizeXS - color: Color.mSecondary - font.family: Settings.data.ui.fontFixed - } - - Item { - Layout.fillWidth: true - } - } - - NGraph { - Layout.fillWidth: true - Layout.fillHeight: true - values: SystemStatService.rxSpeedHistory - values2: SystemStatService.txSpeedHistory - minValue: 0 - maxValue: SystemStatService.rxMaxSpeed - minValue2: 0 - maxValue2: SystemStatService.txMaxSpeed - color: Color.mPrimary - color2: Color.mSecondary - strokeWidth: Math.max(1, Style.uiScaleRatio) - fill: true - fillOpacity: 0.15 - updateInterval: SystemStatService.networkIntervalMs - animateScale: true - } + + NGraph { + id: graph + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.rightMargin: graphRoot.yAxisWidth + values: graphRoot.history + minValue: 0 + maxValue: graphRoot.maxValue + color: graphRoot.accentColor + strokeWidth: Math.max(1, Style.uiScaleRatio) + fill: true + fillOpacity: 0.15 + updateInterval: SystemStatService.networkIntervalMs + animateScale: true + } + + // ── Y-axis scale ── + + Repeater { + model: [ + { + value: graphRoot.yTickHigh, + fraction: 0.66 + }, + { + value: graphRoot.yTickLow, + fraction: 0.33 + } + ] + + delegate: Item { + required property var modelData + anchors.left: parent.left + anchors.right: parent.right + y: graphArea.height * (1.0 - modelData.fraction) + visible: graphRoot.maxValue > 0 + + Rectangle { + id: horizontalLineYLabel + anchors.left: parent.left + anchors.right: yLabel.left + anchors.rightMargin: Style.marginXS + height: 1 + color: Qt.alpha(Color.mOnSurface, 0.08) + } + + Rectangle { + id: yLabel + anchors.right: parent.right + y: -height / 2 + implicitWidth: yLabelText.implicitWidth + Style.marginXS * 2 + implicitHeight: yLabelText.implicitHeight + 2 + radius: Style.radiusXS + color: Qt.alpha(graphRoot.accentColor, 0.10) + + NText { + id: yLabelText + anchors.centerIn: parent + text: graphRoot.formatSpeed(modelData.value) + pointSize: Style.fontSizeXS * 0.8 + color: Qt.alpha(graphRoot.accentColor, 0.7) + } + } + } + } + + // ── Hover ── + + MouseArea { + id: hover + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.rightMargin: graphRoot.yAxisWidth + hoverEnabled: true + + readonly property int idx: { + const n = graphRoot.history.length; + if (n < 2 || !containsMouse) + return -1; + return Math.max(0, Math.min(n - 1, Math.round(mouseX / width * (n - 1)))); + } + + readonly property real value: idx >= 0 ? (graphRoot.history[idx] ?? -1) : -1 + + Rectangle { + visible: hover.idx >= 0 + x: { + const n = graphRoot.history.length; + if (hover.idx < 0 || n < 2) + return 0; + return (hover.idx / (n - 1)) * parent.width - width / 2; + } + width: Style.borderS + height: parent.height + color: Qt.alpha(Color.mOnSurface, 0.25) + + Rectangle { + readonly property real posX: -implicitWidth / 2 + readonly property string _label: { + if (hover.value < 0) + return ""; + const speed = graphRoot.formatSpeed(hover.value); + const time = graphRoot.timeAgo(hover.idx); + return speed + (time ? " · " + time : ""); + } + + x: Math.max(-parent.x, Math.min(hover.width - parent.x - implicitWidth, posX)) + y: Style.marginXS + + implicitWidth: bubbleText.implicitWidth + Style.marginS * 2 + implicitHeight: bubbleText.implicitHeight + Style.marginXS * 2 + radius: Style.radiusS + color: Color.mSurfaceVariant + border.color: Qt.alpha(Color.mOnSurface, 0.15) + border.width: Style.borderS + + NText { + id: bubbleText + anchors.centerIn: parent + text: parent._label + pointSize: Style.fontSizeXS + color: Color.mOnSurface + } } + } } + } } + } } diff --git a/network-indicator/README.md b/network-indicator/README.md index 4ca37a9c9..72009a62e 100644 --- a/network-indicator/README.md +++ b/network-indicator/README.md @@ -1,18 +1,14 @@ # NetworkIndicator Plugin for Noctalia -A compact Noctalia bar widget that displays current network upload (TX) and download (RX) activity, with optional live throughput values and a hover-activated graph panel. +A Noctalia bar widget that displays current network upload (TX) and download (RX) activity. Includes optional live throughput values and a hover-activated graph panel. ## Features -- **TX/RX Activity Indicators**: Separate icons for upload (TX) and download (RX). -- **Active/Idle Coloring**: Icons switch between "active" and "silent" colors based on a configurable traffic threshold. -- **Optional Throughput Values**: Displays formatted TX/RX speeds as text (shown only when the bar is spacious and horizontal). -- **Vertical and Horizontal Layouts**: Stack TX/RX values on the left of the arrows, or place them side by side with arrows centered in between. -- **Unit Formatting**: Automatically switches between KB/s and MB/s, or can be configured to always display MB/s. +- **TX/RX Activity Indicators**: Icons for TX and RX with active/idle coloring based on a configurable traffic threshold. +- **Vertical and Horizontal Layouts**: Configurable cell grid: arrange up to four cells (TX icon, RX icon, TX speed, RX speed) in a horizontal row or a 2×2 grid. Cells can be left empty to show only icons or only values. +- **Network Graph Panel**: Click on the widget to open a live graph panel showing recent RX and TX history. - **Custom Font**: Override the default font for speed values, with optional bold and italic styles. -- **Network Graph Panel**: Hover over the widget to open a live graph showing RX and TX history from the system monitor. -- **Theme Support**: Uses Noctalia theme colors by default, with optional custom colors. -- **Configurable Settings**: Provides a comprehensive set of user-adjustable options. +- **Theme Support**: Uses theme colors by default; all colors can be overridden individually. ## Installation @@ -20,25 +16,21 @@ This plugin is part of the `noctalia-plugins` repository. ## Configuration -Access the plugin settings in Noctalia to configure the following options: - -- **Icon Type**: Select the icon style used for TX/RX: `arrow`, `arrow-bar`, `arrow-big`, `arrow-narrow`, `caret`, `chevron`, `chevron-compact`, `fold`. -- **Show Values**: Display formatted TX/RX speeds as numbers. Automatically hidden on vertical bars and when using "mini" density. -- **Force Megabytes**: Always display values in MB/s instead of switching to KB/s at low traffic levels. -- **Horizontal Layout**: Place TX and RX values side by side instead of stacked. -- **Minimum Width**: Set a minimum width for the widget to prevent resizing when values change. -- **Content Margin**: Horizontal padding on both sides of the widget content. -- **Show Active Threshold**: Set the traffic threshold in bytes per second (B/s) above which TX/RX is considered "active". -- **Vertical Spacing**: Adjust the spacing between the TX and RX elements. -- **Font Size Modifier**: Scale the text size. -- **Icon Size Modifier**: Scale the icon size. -- **Custom Font**: Override the default font with any installed font, with bold and italic options. -- **Custom Colors**: When enabled, configure TX Active, RX Active, RX/TX Inactive, Text, Font, and Background colors. +Access settings through the widget's context menu. + +**Layout**: Choose between horizontal (single row) and vertical (2×2 grid) cell arrangement. +**Cell Assignment**: Assign what each cell displays. Duplicates are not allowed. Use empty cells to reduce the widget to just icons or just speed values. +**Icon Type**: Select the icon style for the TX/RX indicators (`arrow`, `arrow-bar`, `arrow-big`, `arrow-narrow`, `caret`, `chevron`, `chevron-compact`, `fold`). +**Activity Threshold**: Traffic below this value (B/s) is treated as inactive, and icons switch to the idle color. +**Font & Icon Size**: Scale text and icon sizes relative to the defaults. +**Custom Font**: Override the default font for speed values, with optional bold and italic. +**Custom Colors**: Override theme colors for TX active, RX active, inactive, and text individually. +**Spacing & Padding**: Adjust left/right padding, column spacing, and row spacing. ## Usage - Add the widget to your Noctalia bar. -- Hover over the widget to open the network graph panel. +- Left-click the widget to open the network graph panel. - Right-click the widget to access settings. - Configure the plugin settings as required. @@ -50,4 +42,4 @@ Access the plugin settings in Noctalia to configure the following options: - The widget reads `SystemStatService.txSpeed` and `SystemStatService.rxSpeed`; the polling interval is determined by that service. - The graph panel uses `SystemStatService.rxSpeedHistory` and `SystemStatService.txSpeedHistory` with `NGraph` from the Noctalia Shell. -- The panel opens on hover with a short delay and closes automatically when the cursor leaves the widget. +- Unfortunately, the update interval `SystemStatService.networkIntervalMs` is currently hardcoded to `3000` by Noctalia. diff --git a/network-indicator/Settings.qml b/network-indicator/Settings.qml index a230bd733..16d2e6fdb 100644 --- a/network-indicator/Settings.qml +++ b/network-indicator/Settings.qml @@ -5,347 +5,397 @@ import QtQuick import QtQuick.Layouts ColumnLayout { - id: root - - readonly property var iconNames: ["arrow", "arrow-bar", "arrow-big", "arrow-narrow", "caret", "chevron", "chevron-compact", "fold"] - - property var pluginApi: null - - property var cfg: pluginApi?.pluginSettings || ({}) - property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) - - property string editArrowType: cfg.arrowType ?? defaults.arrowType - property int editByteThresholdActive: cfg.byteThresholdActive ?? defaults.byteThresholdActive - property real editFontSizeModifier: cfg.fontSizeModifier ?? defaults.fontSizeModifier - property bool editHorizontalLayout: cfg.horizontalLayout ?? defaults.horizontalLayout ?? false - property real editIconSizeModifier: cfg.iconSizeModifier ?? defaults.iconSizeModifier - property bool editShowNumbers: cfg.showNumbers ?? defaults.showNumbers - property real editSpacingInbetween: cfg.spacingInbetween ?? defaults.spacingInbetween - property real editContentMargin: cfg.contentMargin ?? defaults.contentMargin ?? Style.marginS - - property bool editUseCustomFont: cfg.useCustomFont ?? defaults.useCustomFont ?? false - property string editCustomFontFamily: cfg.customFontFamily ?? defaults.customFontFamily ?? "" - property bool editCustomFontBold: cfg.customFontBold ?? defaults.customFontBold ?? false - property bool editCustomFontItalic: cfg.customFontItalic ?? defaults.customFontItalic ?? false - - property bool editUseCustomColors: cfg.useCustomColors ?? defaults.useCustomColors ?? false - property color editColorBackground: editUseCustomColors && cfg.colorBackground || Style.capsuleColor - property color editColorFont: editUseCustomColors && cfg.colorFont || Color.mOnSurface - property color editColorRx: editUseCustomColors && cfg.colorRx || Color.mPrimary - property color editColorSilent: editUseCustomColors && cfg.colorSilent || Color.mSurfaceVariant - property color editColorText: editUseCustomColors && cfg.colorText || Qt.alpha(Color.mOnSurfaceVariant, 0.3) - property color editColorTx: editUseCustomColors && cfg.colorTx || Color.mSecondary - - property string barPosition: Settings.data.bar.position || "top" - property string barDensity: Settings.data.bar.density || "compact" - property bool barIsSpacious: barDensity !== "mini" - property bool barIsVertical: barPosition === "left" || barPosition === "right" - - function toIntOr(defaultValue, text) { - const v = parseInt(String(text).trim(), 10); - return isNaN(v) ? defaultValue : v; + id: root + + property var pluginApi: null + + property var cfg: pluginApi?.pluginSettings || ({}) + property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) + + // ── Options ── + + readonly property var slotOptions: [ + { + key: "txIcon", + name: pluginApi?.tr("settings.slot.txIcon") + }, + { + key: "rxIcon", + name: pluginApi?.tr("settings.slot.rxIcon") + }, + { + key: "txSpeed", + name: pluginApi?.tr("settings.slot.txSpeed") + }, + { + key: "rxSpeed", + name: pluginApi?.tr("settings.slot.rxSpeed") + }, + { + key: "none", + name: pluginApi?.tr("settings.slot.none") } - - function saveSettings() { - if (!pluginApi || !pluginApi.pluginSettings) { - Logger.e("NetworkIndicator", "Cannot save: pluginApi or pluginSettings is null"); - return; - } - - pluginApi.pluginSettings.arrowType = root.editArrowType; - pluginApi.pluginSettings.byteThresholdActive = root.editByteThresholdActive; - pluginApi.pluginSettings.showNumbers = root.editShowNumbers; - pluginApi.pluginSettings.horizontalLayout = root.editHorizontalLayout; - pluginApi.pluginSettings.fontSizeModifier = root.editFontSizeModifier; - pluginApi.pluginSettings.iconSizeModifier = root.editIconSizeModifier; - pluginApi.pluginSettings.spacingInbetween = root.editSpacingInbetween; - pluginApi.pluginSettings.contentMargin = root.editContentMargin; - - pluginApi.pluginSettings.useCustomFont = root.editUseCustomFont; - pluginApi.pluginSettings.customFontFamily = root.editCustomFontFamily; - pluginApi.pluginSettings.customFontBold = root.editCustomFontBold; - pluginApi.pluginSettings.customFontItalic = root.editCustomFontItalic; - - pluginApi.pluginSettings.useCustomColors = root.editUseCustomColors; - if (root.editUseCustomColors) { - pluginApi.pluginSettings.colorSilent = root.editColorSilent.toString(); - pluginApi.pluginSettings.colorTx = root.editColorTx.toString(); - pluginApi.pluginSettings.colorRx = root.editColorRx.toString(); - pluginApi.pluginSettings.colorText = root.editColorText.toString(); - pluginApi.pluginSettings.colorFont = root.editColorFont.toString(); - pluginApi.pluginSettings.colorBackground = root.editColorBackground.toString(); - } - - pluginApi.saveSettings(); - Logger.i("NetworkIndicator", "Settings saved"); + ] + + readonly property var layoutOptions: [ + { + key: "horizontal", + name: pluginApi?.tr("settings.layout.horizontal") + }, + { + key: "vertical", + name: pluginApi?.tr("settings.layout.vertical") } + ] - Layout.rightMargin: Style.marginL - spacing: Style.marginL + readonly property var iconNames: ["arrow", "arrow-bar", "arrow-big", "arrow-narrow", "caret", "chevron", "chevron-compact", "fold"] - // ── Icon ── + // ── Edit state ── - NComboBox { - currentKey: root.editArrowType - description: root.pluginApi?.tr("settings.iconType.desc") - label: root.pluginApi?.tr("settings.iconType.label") - model: root.iconNames.map(n => ({ - key: n, - name: n - })) - - onSelected: key => root.editArrowType = key - } + property string editLayout: cfg.layout ?? defaults.layout + property var editSlots: cfg.slots ?? defaults.slots + property string editIconType: cfg.iconType ?? defaults.iconType + property int editByteThresholdActive: cfg.byteThresholdActive ?? defaults.byteThresholdActive - NDivider { - Layout.fillWidth: true - } + property real editFontSizeModifier: cfg.fontSizeModifier ?? defaults.fontSizeModifier + property real editIconSizeModifier: cfg.iconSizeModifier ?? defaults.iconSizeModifier + property real editPaddingLeft: cfg.paddingLeft ?? defaults.PaddingLeft + property real editPaddingRight: cfg.paddingRight ?? defaults.paddingRight + property real editColumnSpacing: cfg.columnSpacing ?? defaults.columnSpacing + property real editRowSpacing: cfg.rowSpacing ?? defaults.rowSpacing - // ── General ── + property bool editUseCustomFont: cfg.useCustomFont ?? defaults.useCustomFonts + property string editCustomFontFamily: cfg.customFontFamily ?? defaults.customFontFamily + property bool editCustomFontBold: cfg.customFontBold ?? defaults.customFontBold + property bool editCustomFontItalic: cfg.customFontItalic ?? defaults.customFontItalic - NToggle { - checked: root.editShowNumbers - defaultValue: defaults.showNumbers ?? true - description: root.pluginApi?.tr("settings.showNumbers.desc") - label: root.pluginApi?.tr("settings.showNumbers.label") - visible: root.barIsSpacious && !root.barIsVertical + property bool editUseCustomColors: cfg.useCustomColors ?? defaults.useCustomColors + property color editColorTx: editUseCustomColors && cfg.colorTx || Color.mSecondary + property color editColorRx: editUseCustomColors && cfg.colorRx || Color.mPrimary + property color editColorSilent: editUseCustomColors && cfg.colorSilent || Color.mSurfaceVariant + property color editColorText: editUseCustomColors && cfg.colorText || Color.mOnSurfaceVariant - onToggled: c => root.editShowNumbers = c - } + // ── Helpers ── - NToggle { - checked: root.editHorizontalLayout - defaultValue: defaults.horizontalLayout ?? false - description: root.pluginApi?.tr("settings.horizontalLayout.desc") - label: root.pluginApi?.tr("settings.horizontalLayout.label") - visible: root.barIsSpacious && !root.barIsVertical + readonly property bool isVerticalLayout: editLayout === "vertical" - onToggled: c => root.editHorizontalLayout = c + function slotLabel(idx) { + if (root.isVerticalLayout) { + return ["Top Left", "Top Right", "Bottom Left", "Bottom Right"][idx]; } - - NDivider { - Layout.fillWidth: true + return ["Left", "Center Left", "Center Right", "Right"][idx]; + } + + function updateSlot(index, value) { + let copy = root.editSlots.slice(); + copy[index] = value; + root.editSlots = copy; + } + + function toIntOr(defaultValue, text) { + const v = parseInt(String(text).trim(), 10); + return isNaN(v) ? defaultValue : v; + } + + // ── Save ── + + function saveSettings() { + if (!pluginApi || !pluginApi.pluginSettings) { + Logger.e("NetworkIndicator", "Cannot save: pluginApi or pluginSettings is null"); + return; } - // ── Layout ── + const s = pluginApi.pluginSettings; - ColumnLayout { - Layout.fillWidth: true - spacing: Style.marginXXS + s.layout = root.editLayout; + s.slots = root.editSlots; + s.iconType = root.editIconType; + s.byteThresholdActive = root.editByteThresholdActive; - NLabel { - description: root.pluginApi?.tr("settings.contentMargin.desc") - label: root.pluginApi?.tr("settings.contentMargin.label") - } + s.fontSizeModifier = root.editFontSizeModifier; + s.iconSizeModifier = root.editIconSizeModifier; - NValueSlider { - Layout.fillWidth: true - from: 0 - stepSize: 1 - text: root.editContentMargin + "px" - to: 20 - value: root.editContentMargin + s.paddingLeft = root.editPaddingLeft; + s.paddingRight = root.editPaddingRight; + s.columnSpacing = root.editColumnSpacing; + s.rowSpacing = root.editRowSpacing; - onMoved: value => root.editContentMargin = value - } - } + s.useCustomFont = root.editUseCustomFont; + s.customFontFamily = root.editCustomFontFamily; + s.customFontBold = root.editCustomFontBold; + s.customFontItalic = root.editCustomFontItalic; - NTextInput { - label: pluginApi?.tr("settings.byteThresholdActive.label") - description: pluginApi?.tr("settings.byteThresholdActive.desc") - placeholderText: root.editByteThresholdActive + " bytes" - text: String(root.editByteThresholdActive) - onTextChanged: root.editByteThresholdActive = root.toIntOr(0, text) + s.useCustomColors = root.editUseCustomColors; + if (root.editUseCustomColors) { + s.colorTx = root.editColorTx.toString(); + s.colorRx = root.editColorRx.toString(); + s.colorSilent = root.editColorSilent.toString(); + s.colorText = root.editColorText.toString(); } - ColumnLayout { - Layout.fillWidth: true - spacing: Style.marginXXS - - NLabel { - description: root.pluginApi?.tr("settings.spacingInbetween.desc") - label: root.pluginApi?.tr("settings.spacingInbetween.label") - } - - NValueSlider { - Layout.fillWidth: true - from: -5 - stepSize: 1 - text: root.editSpacingInbetween.toFixed(0) - to: 5 - value: root.editSpacingInbetween - - onMoved: value => root.editSpacingInbetween = value - } - } + pluginApi.saveSettings(); + Logger.i("NetworkIndicator", "Settings saved"); + } - ColumnLayout { - Layout.fillWidth: true - spacing: Style.marginXXS - - NLabel { - description: root.pluginApi?.tr("settings.fontSizeModifier.desc") - label: root.pluginApi?.tr("settings.fontSizeModifier.label") - } - - NValueSlider { - Layout.fillWidth: true - from: 0.5 - stepSize: 0.05 - text: root.editFontSizeModifier.toFixed(2) - to: 1.5 - value: root.editFontSizeModifier - - onMoved: value => root.editFontSizeModifier = value - } - } + // ── UI ── - ColumnLayout { - Layout.fillWidth: true - spacing: Style.marginXXS - - NLabel { - description: root.pluginApi?.tr("settings.iconSizeModifier.desc") - label: root.pluginApi?.tr("settings.iconSizeModifier.label") - } - - NValueSlider { - Layout.fillWidth: true - from: 0.5 - stepSize: 0.05 - text: root.editIconSizeModifier.toFixed(2) - to: 1.5 - value: root.editIconSizeModifier - - onMoved: value => root.editIconSizeModifier = value - } - } + Layout.rightMargin: Style.marginL + spacing: Style.marginL + + // ── Layout ── + + NComboBox { + Layout.fillWidth: true + label: pluginApi?.tr("settings.layout.label") + description: pluginApi?.tr("settings.layout.desc") + currentKey: root.editLayout + model: root.layoutOptions + onSelected: key => root.editLayout = key + } - NDivider { - Layout.fillWidth: true + NDivider { + Layout.fillWidth: true + } + + // ── Slot assignment ── + + NLabel { + label: pluginApi?.tr("settings.slots.label") + description: pluginApi?.tr("settings.slots.desc") + } + + Repeater { + model: 4 + + NComboBox { + Layout.fillWidth: true + label: root.slotLabel(index) + currentKey: root.editSlots[index] ?? "none" + model: root.slotOptions + onSelected: key => root.updateSlot(index, key) + } + } + + NDivider { + Layout.fillWidth: true + } + + // ── Icon style ── + + NComboBox { + Layout.fillWidth: true + label: pluginApi?.tr("settings.iconType.label") + description: pluginApi?.tr("settings.iconType.desc") + currentKey: root.editIconType + model: root.iconNames.map(n => ({ + key: n, + name: n + })) + onSelected: key => root.editIconType = key + } + + // ── Activity threshold ── + + NTextInput { + label: pluginApi?.tr("settings.byteThresholdActive.label") + description: pluginApi?.tr("settings.byteThresholdActive.desc") + placeholderText: root.editByteThresholdActive + " bytes" + text: String(root.editByteThresholdActive) + onTextChanged: root.editByteThresholdActive = root.toIntOr(0, text) + } + + NDivider { + Layout.fillWidth: true + } + + // ── Size modifiers ── + + ColumnLayout { + Layout.fillWidth: true + spacing: Style.marginXXS + + NLabel { + label: pluginApi?.tr("settings.fontSizeModifier.label") + description: pluginApi?.tr("settings.fontSizeModifier.desc") } - // ── Font ── + NValueSlider { + Layout.fillWidth: true + from: 0.5 + to: 1.5 + stepSize: 0.05 + text: root.editFontSizeModifier.toFixed(2) + value: root.editFontSizeModifier + onMoved: value => root.editFontSizeModifier = value + } + } - NToggle { - checked: root.editUseCustomFont - defaultValue: defaults.useCustomFont ?? false - description: root.pluginApi?.tr("settings.useCustomFont.desc") - label: root.pluginApi?.tr("settings.useCustomFont.label") + ColumnLayout { + Layout.fillWidth: true + spacing: Style.marginXXS - onToggled: c => root.editUseCustomFont = c + NLabel { + label: pluginApi?.tr("settings.iconSizeModifier.label") + description: pluginApi?.tr("settings.iconSizeModifier.desc") } - ColumnLayout { - visible: root.editUseCustomFont - Layout.fillWidth: true - spacing: Style.marginL - - NSearchableComboBox { - label: root.pluginApi?.tr("settings.customFontFamily.label") - description: root.pluginApi?.tr("settings.customFontFamily.desc") - model: FontService.availableFonts - currentKey: root.editCustomFontFamily || Qt.application.font.family - placeholder: root.pluginApi?.tr("settings.customFontFamily.placeholder") - searchPlaceholder: root.pluginApi?.tr("settings.customFontFamily.searchPlaceholder") - popupHeight: 420 - - onSelected: key => { - root.editCustomFontFamily = (key === Qt.application.font.family) ? "" : key; - } - } - - NToggle { - checked: root.editCustomFontBold - defaultValue: defaults.customFontBold ?? false - description: root.pluginApi?.tr("settings.customFontBold.desc") - label: root.pluginApi?.tr("settings.customFontBold.label") - - onToggled: c => root.editCustomFontBold = c - } - - NToggle { - checked: root.editCustomFontItalic - defaultValue: defaults.customFontItalic ?? false - description: root.pluginApi?.tr("settings.customFontItalic.desc") - label: root.pluginApi?.tr("settings.customFontItalic.label") - - onToggled: c => root.editCustomFontItalic = c - } + NValueSlider { + Layout.fillWidth: true + from: 0.5 + to: 1.5 + stepSize: 0.05 + text: root.editIconSizeModifier.toFixed(2) + value: root.editIconSizeModifier + onMoved: value => root.editIconSizeModifier = value } + } + + NDivider { + Layout.fillWidth: true + } + + // ── Content padding ── + + NTextInput { + label: pluginApi?.tr("settings.rowSpacing.label") + description: pluginApi?.tr("settings.rowSpacing.desc") + placeholderText: root.editRowSpacing + " px" + text: String(root.editRowSpacing) + onTextChanged: root.editRowSpacing = root.toIntOr(0, text) + } + + NTextInput { + label: pluginApi?.tr("settings.columnSpacing.label") + description: pluginApi?.tr("settings.columnSpacing.desc") + placeholderText: root.editColumnSpacing + " px" + text: String(root.editColumnSpacing) + onTextChanged: root.editColumnSpacing = root.toIntOr(0, text) + } + + NTextInput { + label: pluginApi?.tr("settings.paddingLeft.label") + description: pluginApi?.tr("settings.paddingLeft.desc") + placeholderText: root.editPaddingLeft + " px" + text: String(root.editPaddingLeft) + onTextChanged: root.editPaddingLeft = root.toIntOr(0, text) + } + + NTextInput { + label: pluginApi?.tr("settings.paddingRight.label") + description: pluginApi?.tr("settings.paddingRight.desc") + placeholderText: root.editPaddingRight + " px" + text: String(root.editPaddingRight) + onTextChanged: root.editPaddingRight = root.toIntOr(0, text) + } + + NDivider { + Layout.fillWidth: true + } + + // ── Custom Font ── + + NToggle { + checked: root.editUseCustomFont + defaultValue: defaults.useCustomFont ?? false + description: pluginApi?.tr("settings.useCustomFont.desc") + label: pluginApi?.tr("settings.useCustomFont.label") + onToggled: c => root.editUseCustomFont = c + } + + ColumnLayout { + visible: root.editUseCustomFont + Layout.fillWidth: true + spacing: Style.marginL - NDivider { - Layout.fillWidth: true + NSearchableComboBox { + label: pluginApi?.tr("settings.customFontFamily.label") + description: pluginApi?.tr("settings.customFontFamily.desc") + model: FontService.availableFonts + currentKey: root.editCustomFontFamily || Qt.application.font.family + placeholder: pluginApi?.tr("settings.customFontFamily.placeholder") + searchPlaceholder: pluginApi?.tr("settings.customFontFamily.searchPlaceholder") + popupHeight: 420 + onSelected: key => { + root.editCustomFontFamily = (key === Qt.application.font.family) ? "" : key; + } } - // ── Colors ── + NToggle { + checked: root.editCustomFontBold + defaultValue: defaults.customFontBold ?? false + description: pluginApi?.tr("settings.customFontBold.desc") + label: pluginApi?.tr("settings.customFontBold.label") + onToggled: c => root.editCustomFontBold = c + } NToggle { - checked: root.editUseCustomColors - defaultValue: defaults.useCustomColors ?? false - description: root.pluginApi?.tr("settings.useCustomColors.desc") - label: root.pluginApi?.tr("settings.useCustomColors.label") + checked: root.editCustomFontItalic + defaultValue: defaults.customFontItalic ?? false + description: pluginApi?.tr("settings.customFontItalic.desc") + label: pluginApi?.tr("settings.customFontItalic.label") + onToggled: c => root.editCustomFontItalic = c + } + } + + // ── Custom Colors ── + + NToggle { + checked: root.editUseCustomColors + defaultValue: defaults.useCustomColors ?? false + description: pluginApi?.tr("settings.useCustomColors.desc") + label: pluginApi?.tr("settings.useCustomColors.label") + onToggled: c => root.editUseCustomColors = c + } + + ColumnLayout { + visible: root.editUseCustomColors + + RowLayout { + NLabel { + Layout.alignment: Qt.AlignTop + label: pluginApi?.tr("settings.colorTx.label") + description: pluginApi?.tr("settings.colorTx.desc") + } + NColorPicker { + selectedColor: root.editColorTx + onColorSelected: color => root.editColorTx = color + } + } + + RowLayout { + NLabel { + Layout.alignment: Qt.AlignTop + label: pluginApi?.tr("settings.colorRx.label") + description: pluginApi?.tr("settings.colorRx.desc") + } + NColorPicker { + selectedColor: root.editColorRx + onColorSelected: color => root.editColorRx = color + } + } - onToggled: c => root.editUseCustomColors = c + RowLayout { + NLabel { + Layout.alignment: Qt.AlignTop + label: pluginApi?.tr("settings.colorSilent.label") + description: pluginApi?.tr("settings.colorSilent.desc") + } + NColorPicker { + selectedColor: root.editColorSilent + onColorSelected: color => root.editColorSilent = color + } } - ColumnLayout { - visible: root.editUseCustomColors - - RowLayout { - NLabel { - Layout.alignment: Qt.AlignTop - description: root.pluginApi?.tr("settings.colorTx.desc") - label: root.pluginApi?.tr("settings.colorTx.label") - } - - NColorPicker { - selectedColor: root.editColorTx - - onColorSelected: color => root.editColorTx = color - } - } - - RowLayout { - NLabel { - Layout.alignment: Qt.AlignTop - description: root.pluginApi?.tr("settings.colorRx.desc") - label: root.pluginApi?.tr("settings.colorRx.label") - } - - NColorPicker { - selectedColor: root.editColorRx - - onColorSelected: color => root.editColorRx = color - } - } - - RowLayout { - NLabel { - Layout.alignment: Qt.AlignTop - description: root.pluginApi?.tr("settings.colorSilent.desc") - label: root.pluginApi?.tr("settings.colorSilent.label") - } - - NColorPicker { - selectedColor: root.editColorSilent - - onColorSelected: color => root.editColorSilent = color - } - } - - RowLayout { - NLabel { - Layout.alignment: Qt.AlignTop - description: root.pluginApi?.tr("settings.colorText.desc") - label: root.pluginApi?.tr("settings.colorText.label") - } - - NColorPicker { - selectedColor: root.editColorText - - onColorSelected: color => root.editColorText = color - } - } + RowLayout { + NLabel { + Layout.alignment: Qt.AlignTop + label: pluginApi?.tr("settings.colorText.label") + description: pluginApi?.tr("settings.colorText.desc") + } + NColorPicker { + selectedColor: root.editColorText + onColorSelected: color => root.editColorText = color + } } + } } diff --git a/network-indicator/i18n/de.json b/network-indicator/i18n/de.json index 1f4bcda16..10ab4c51f 100644 --- a/network-indicator/i18n/de.json +++ b/network-indicator/i18n/de.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "Widget-Einstellungen" + "widget-settings": "Widget-Einstellungen", + "toggle-panel": "Monitor umschalten" + }, + "panel": { + "title": "Netzwerkaktivität", + "close": "Schließen", + "download": "Download", + "upload": "Upload" }, "settings": { - "byteThresholdActive": { - "desc": "Aktivitätsschwellwert in Byte pro Sekunde (B/s) festlegen.", - "label": "Aktivitätsschwellwert anzeigen" - }, - "colorRx": { - "desc": "Symbolfarbe für Download (RX), wenn der Schwellwert überschritten ist.", - "label": "RX aktiv" + "layout": { + "label": "Layout", + "desc": "Zellen in einer Reihe (horizontal) oder in einem 2×2-Raster (vertikal) anordnen.", + "horizontal": "Horizontal", + "vertical": "Vertikal" + }, + "slots": { + "label": "Zellenbelegung", + "desc": "Wähle, was jede Zelle anzeigt. Keine Duplikate möglich. Z.\u00a0B. leere Zellen verwenden, um nur Symbole anzuzeigen." + }, + "slot": { + "txIcon": "TX-Symbol", + "rxIcon": "RX-Symbol", + "txSpeed": "TX-Geschwindigkeit", + "rxSpeed": "RX-Geschwindigkeit", + "none": "Leer" }, - "colorSilent": { - "desc": "Symbolfarbe, wenn der Datenverkehr unter dem Schwellwert liegt.", - "label": "RX/TX inaktiv" + "iconType": { + "desc": "Symbolstil für die TX/RX-Anzeigen auswählen.", + "label": "Symboltyp" }, - "colorText": { - "desc": "Textfarbe für RX- und TX-Werte festlegen.", - "label": "Text" + "byteThresholdActive": { + "desc": "Datenverkehr unter diesem Wert (B/s) wird als inaktiv angezeigt.", + "label": "Aktivitätsschwellwert" }, - "colorTx": { - "desc": "Symbolfarbe für Upload (TX), wenn der Schwellwert überschritten ist.", - "label": "TX aktiv" + "fontSizeModifier": { + "desc": "Schriftgröße relativ zum Standard skalieren.", + "label": "Schriftgröße" }, - "contentMargin": { - "desc": "Horizontaler Abstand auf beiden Seiten des Widget-Inhalts.", - "label": "Inhaltsrand" + "iconSizeModifier": { + "desc": "Symbolgröße relativ zum Standard skalieren.", + "label": "Symbolgröße" }, - "customFontBold": { - "desc": "Geschwindigkeitswerte fett darstellen.", - "label": "Fett" + "useCustomFont": { + "desc": "Standardschriftart für Geschwindigkeitswerte überschreiben.", + "label": "Eigene Schriftart" }, "customFontFamily": { "desc": "Schriftart für die Geschwindigkeitswerte wählen.", @@ -37,41 +53,49 @@ "placeholder": "Schriftart auswählen", "searchPlaceholder": "Schriften suchen…" }, + "customFontBold": { + "desc": "Geschwindigkeitswerte fett darstellen.", + "label": "Fett" + }, "customFontItalic": { "desc": "Geschwindigkeitswerte kursiv darstellen.", "label": "Kursiv" }, - "fontSizeModifier": { - "desc": "Schriftgröße relativ zum Standard skalieren.", - "label": "Schriftgrößen-Faktor" + "useCustomColors": { + "desc": "Eigene Farben statt der Standard-Themefarben verwenden.", + "label": "Eigene Farben" }, - "horizontalLayout": { - "desc": "TX- und RX-Werte nebeneinander statt übereinander anzeigen.", - "label": "Horizontales Layout" + "colorTx": { + "desc": "Symbolfarbe für Upload (TX), wenn der Schwellwert überschritten ist.", + "label": "TX aktiv" }, - "iconSizeModifier": { - "desc": "Symbolgröße relativ zum Standard skalieren.", - "label": "Symbolgrößen-Faktor" + "colorRx": { + "desc": "Symbolfarbe für Download (RX), wenn der Schwellwert überschritten ist.", + "label": "RX aktiv" }, - "iconType": { - "desc": "Symbolstil für die TX/RX-Anzeigen auswählen.", - "label": "Symboltyp" + "colorSilent": { + "desc": "Symbolfarbe, wenn der Datenverkehr unter dem Schwellwert liegt.", + "label": "Inaktiv" + }, + "colorText": { + "desc": "Textfarbe für Geschwindigkeitswerte.", + "label": "Text" }, - "showNumbers": { - "desc": "Aktuelle RX/TX-Geschwindigkeiten als Zahlen anzeigen.", - "label": "Werte anzeigen" + "paddingLeft": { + "label": "Abstand links", + "desc": "Innenabstand des Inhalts auf der linken Seite." }, - "spacingInbetween": { - "desc": "Den Abstand zwischen den RX/TX-Elementen anpassen.", - "label": "Vertikaler Abstand" + "paddingRight": { + "label": "Abstand rechts", + "desc": "Innenabstand des Inhalts auf der rechten Seite." }, - "useCustomColors": { - "desc": "Eigene Farben statt der Standard-Themefarben verwenden.", - "label": "Eigene Farben" + "columnSpacing": { + "label": "Spaltenabstand", + "desc": "Abstand zwischen Spalten im Rasterlayout." }, - "useCustomFont": { - "desc": "Standardschriftart für Geschwindigkeitswerte überschreiben.", - "label": "Eigene Schriftart" + "rowSpacing": { + "label": "Zeilenabstand", + "desc": "Abstand zwischen Zeilen im Rasterlayout (hat keine Wirkung im horizontalen Layout)." } } } diff --git a/network-indicator/i18n/en.json b/network-indicator/i18n/en.json index 60a1265af..b74166ab5 100644 --- a/network-indicator/i18n/en.json +++ b/network-indicator/i18n/en.json @@ -1,77 +1,101 @@ { "actions": { - "widget-settings": "Widget settings" + "widget-settings": "Widget settings", + "toggle-panel": "Toggle Monitor" + }, + "panel": { + "title": "Network Activity", + "close": "Close", + "download": "Download", + "upload": "Upload" }, "settings": { - "byteThresholdActive": { - "desc": "Set the activity threshold in bytes per second (B/s).", - "label": "Show Active Threshold" - }, - "colorRx": { - "desc": "Set the download (RX) icon color when above the threshold.", - "label": "RX Active" + "layout": { + "label": "Layout", + "desc": "Arrange cells in a row (horizontal) or a 2×2 grid (vertical).", + "horizontal": "Horizontal", + "vertical": "Vertical" + }, + "slots": { + "label": "Cell Assignment", + "desc": "Choose what each cell displays. No duplicates possible. E.g., use empty slots to only show icons." + }, + "slot": { + "txIcon": "TX Icon", + "rxIcon": "RX Icon", + "txSpeed": "TX Speed", + "rxSpeed": "RX Speed", + "none": "Empty" }, - "colorSilent": { - "desc": "Set the icon color when traffic is below the threshold.", - "label": "RX/TX Inactive" + "iconType": { + "label": "Icon Type", + "desc": "Choose the icon style used for the TX/RX indicators." }, - "colorText": { - "desc": "Set the text color used for both RX and TX values.", - "label": "Text" + "byteThresholdActive": { + "label": "Activity Threshold", + "desc": "Traffic below this value (B/s) is shown as inactive." }, - "colorTx": { - "desc": "Set the upload (TX) icon color when above the threshold.", - "label": "TX Active" + "fontSizeModifier": { + "label": "Font Size", + "desc": "Scale the text size relative to the default." }, - "contentMargin": { - "desc": "Horizontal padding on both sides of the widget content.", - "label": "Content Margin" + "iconSizeModifier": { + "label": "Icon Size", + "desc": "Scale the icon size relative to the default." }, - "customFontBold": { - "desc": "Render speed values in bold.", - "label": "Bold" + "useCustomFont": { + "label": "Custom Font", + "desc": "Override the default font for speed values." }, "customFontFamily": { - "desc": "Choose a font for the speed values.", "label": "Font", + "desc": "Choose a font for the speed values.", "placeholder": "Select a font", "searchPlaceholder": "Search fonts…" }, + "customFontBold": { + "label": "Bold", + "desc": "Render speed values in bold." + }, "customFontItalic": { - "desc": "Render speed values in italic.", - "label": "Italic" + "label": "Italic", + "desc": "Render speed values in italic." }, - "fontSizeModifier": { - "desc": "Scale the text size relative to the default.", - "label": "Font Size Modifier" + "useCustomColors": { + "label": "Custom Colors", + "desc": "Enable custom colors instead of theme defaults." }, - "horizontalLayout": { - "desc": "Place TX and RX values side by side instead of stacked.", - "label": "Horizontal Layout" + "colorTx": { + "label": "TX Active", + "desc": "Upload icon color when above the threshold." }, - "iconSizeModifier": { - "desc": "Scale the icon size relative to the default.", - "label": "Icon Size Modifier" + "colorRx": { + "label": "RX Active", + "desc": "Download icon color when above the threshold." }, - "iconType": { - "desc": "Choose the icon style used for the TX/RX indicators.", - "label": "Icon Type" + "colorSilent": { + "label": "Inactive", + "desc": "Icon color when traffic is below the threshold." }, - "showNumbers": { - "desc": "Display the current RX/TX speeds as numbers.", - "label": "Show Values" + "colorText": { + "label": "Text", + "desc": "Text color for speed values." }, - "spacingInbetween": { - "desc": "Adjust the spacing between RX/TX elements.", - "label": "Vertical Spacing" + "paddingLeft": { + "label": "Padding Left", + "desc": "Padding of the content on the left." }, - "useCustomColors": { - "desc": "Enable custom colors instead of theme defaults.", - "label": "Custom Colors" + "paddingRight": { + "label": "Padding Right", + "desc": "Padding of the content on the right." }, - "useCustomFont": { - "desc": "Override the default font for speed values.", - "label": "Custom Font" + "columnSpacing": { + "label": "Column Spacing", + "desc": "Spacing between columns in grid layout." + }, + "rowSpacing": { + "label": "Row Spacing", + "desc": "Spacing between rows in grid layout (has no effect in horizontal layout)." } } } diff --git a/network-indicator/i18n/es.json b/network-indicator/i18n/es.json index c379e3b10..125883f64 100644 --- a/network-indicator/i18n/es.json +++ b/network-indicator/i18n/es.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "Configuración del widget" + "widget-settings": "Configuración del widget", + "toggle-panel": "Alternar Monitor" + }, + "panel": { + "title": "Actividad de Red", + "close": "Cerrar", + "download": "Descarga", + "upload": "Subida" }, "settings": { - "byteThresholdActive": { - "desc": "Establecer el umbral de actividad en bytes por segundo (B/s).", - "label": "Mostrar umbral activo" + "layout": { + "label": "Diseño", + "desc": "Disponer las celdas en una fila (horizontal) o en una cuadrícula 2×2 (vertical).", + "horizontal": "Horizontal", + "vertical": "Vertical" + }, + "slots": { + "label": "Asignación de celdas", + "desc": "Elige qué muestra cada celda. No se permiten duplicados. P. ej., usa celdas vacías para mostrar solo iconos." + }, + "slot": { + "txIcon": "Icono TX", + "rxIcon": "Icono RX", + "txSpeed": "Velocidad TX", + "rxSpeed": "Velocidad RX", + "none": "Vacío" }, - "colorRx": { - "desc": "Establecer el color del icono de descarga (RX) cuando esté por encima del umbral.", - "label": "RX Activo" - }, - "colorSilent": { - "desc": "Establecer el color del icono cuando el tráfico esté por debajo del umbral.", - "label": "RX/TX Inactivo" + "iconType": { + "desc": "Elige el estilo de icono utilizado para los indicadores TX/RX.", + "label": "Tipo de icono" }, - "colorText": { - "desc": "Establecer el color del texto utilizado tanto para los valores RX como TX.", - "label": "Texto" + "byteThresholdActive": { + "desc": "El tráfico por debajo de este valor (B/s) se muestra como inactivo.", + "label": "Umbral de actividad" }, - "colorTx": { - "desc": "Establecer el color del icono de carga (TX) cuando esté por encima del umbral.", - "label": "TX Activo" + "fontSizeModifier": { + "desc": "Escalar el tamaño del texto en relación con el predeterminado.", + "label": "Tamaño de fuente" }, - "contentMargin": { - "desc": "Relleno horizontal en ambos lados del contenido del widget.", - "label": "Margen del contenido" + "iconSizeModifier": { + "desc": "Escalar el tamaño del icono en relación con el tamaño predeterminado.", + "label": "Tamaño del icono" }, - "customFontBold": { - "desc": "Mostrar los valores de velocidad en negrita.", - "label": "Negrita" + "useCustomFont": { + "desc": "Reemplazar la fuente predeterminada para los valores de velocidad.", + "label": "Fuente personalizada" }, "customFontFamily": { "desc": "Elegir una fuente para los valores de velocidad.", @@ -37,41 +53,49 @@ "placeholder": "Seleccionar fuente", "searchPlaceholder": "Buscar fuentes…" }, + "customFontBold": { + "desc": "Mostrar los valores de velocidad en negrita.", + "label": "Negrita" + }, "customFontItalic": { "desc": "Mostrar los valores de velocidad en cursiva.", "label": "Cursiva" }, - "fontSizeModifier": { - "desc": "Escalar el tamaño del texto en relación con el predeterminado.", - "label": "Modificador de tamaño de fuente" + "useCustomColors": { + "desc": "Activar colores personalizados en lugar de los predeterminados del tema.", + "label": "Colores personalizados" }, - "horizontalLayout": { - "desc": "Colocar los valores TX y RX uno al lado del otro en lugar de apilados.", - "label": "Diseño horizontal" + "colorTx": { + "desc": "Color del icono de subida (TX) cuando esté por encima del umbral.", + "label": "TX Activo" }, - "iconSizeModifier": { - "desc": "Escalar el tamaño del icono en relación con el tamaño predeterminado.", - "label": "Modificador del tamaño del icono" + "colorRx": { + "desc": "Color del icono de descarga (RX) cuando esté por encima del umbral.", + "label": "RX Activo" }, - "iconType": { - "desc": "Elige el estilo de icono utilizado para los indicadores TX/RX.", - "label": "Tipo de icono" + "colorSilent": { + "desc": "Color del icono cuando el tráfico esté por debajo del umbral.", + "label": "Inactivo" }, - "showNumbers": { - "desc": "Mostrar las velocidades actuales de RX/TX como números.", - "label": "Mostrar valores" + "colorText": { + "desc": "Color del texto para los valores de velocidad.", + "label": "Texto" }, - "spacingInbetween": { - "desc": "Ajustar el espaciado entre los elementos RX/TX.", - "label": "Espaciado vertical" + "paddingLeft": { + "label": "Relleno izquierdo", + "desc": "Relleno del contenido a la izquierda." }, - "useCustomColors": { - "desc": "Activar colores personalizados en lugar de los predeterminados del tema.", - "label": "Colores personalizados" + "paddingRight": { + "label": "Relleno derecho", + "desc": "Relleno del contenido a la derecha." }, - "useCustomFont": { - "desc": "Reemplazar la fuente predeterminada para los valores de velocidad.", - "label": "Fuente personalizada" + "columnSpacing": { + "label": "Espaciado de columnas", + "desc": "Espaciado entre columnas en el diseño de cuadrícula." + }, + "rowSpacing": { + "label": "Espaciado de filas", + "desc": "Espaciado entre filas en el diseño de cuadrícula (sin efecto en el diseño horizontal)." } } } diff --git a/network-indicator/i18n/fr.json b/network-indicator/i18n/fr.json index fe9d191c9..df155013c 100644 --- a/network-indicator/i18n/fr.json +++ b/network-indicator/i18n/fr.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "Paramètres du widget" + "widget-settings": "Paramètres du widget", + "toggle-panel": "Basculer le moniteur" + }, + "panel": { + "title": "Activité réseau", + "close": "Fermer", + "download": "Téléchargement", + "upload": "Téléversement" }, "settings": { - "byteThresholdActive": { - "desc": "Définir le seuil d'activité en octets par seconde (o/s).", - "label": "Afficher le seuil actif" + "layout": { + "label": "Disposition", + "desc": "Disposer les cellules en ligne (horizontal) ou en grille 2×2 (vertical).", + "horizontal": "Horizontal", + "vertical": "Vertical" + }, + "slots": { + "label": "Affectation des cellules", + "desc": "Choisir ce que chaque cellule affiche. Pas de doublons possibles. Ex. : utiliser des cellules vides pour n'afficher que les icônes." + }, + "slot": { + "txIcon": "Icône TX", + "rxIcon": "Icône RX", + "txSpeed": "Vitesse TX", + "rxSpeed": "Vitesse RX", + "none": "Vide" }, - "colorRx": { - "desc": "Définir la couleur de l'icône de téléchargement (RX) lorsque la valeur est supérieure au seuil.", - "label": "RX Active" - }, - "colorSilent": { - "desc": "Définir la couleur de l'icône lorsque le trafic est inférieur au seuil.", - "label": "RX/TX Inactif" + "iconType": { + "desc": "Choisissez le style d'icône utilisé pour les indicateurs TX/RX.", + "label": "Type d'icône" }, - "colorText": { - "desc": "Définir la couleur du texte utilisée pour les valeurs RX et TX.", - "label": "Texte" + "byteThresholdActive": { + "desc": "Le trafic en dessous de cette valeur (o/s) est affiché comme inactif.", + "label": "Seuil d'activité" }, - "colorTx": { - "desc": "Définir la couleur de l'icône de téléversement (TX) lorsque le seuil est dépassé.", - "label": "TX Active" + "fontSizeModifier": { + "desc": "Mettre à l'échelle la taille du texte par rapport à la taille par défaut.", + "label": "Taille de police" }, - "contentMargin": { - "desc": "Marge horizontale des deux côtés du contenu du widget.", - "label": "Marge du contenu" + "iconSizeModifier": { + "desc": "Ajuster la taille de l'icône par rapport à la taille par défaut.", + "label": "Taille d'icône" }, - "customFontBold": { - "desc": "Afficher les valeurs de vitesse en gras.", - "label": "Gras" + "useCustomFont": { + "desc": "Remplacer la police par défaut pour les valeurs de vitesse.", + "label": "Police personnalisée" }, "customFontFamily": { "desc": "Choisir une police pour les valeurs de vitesse.", @@ -37,41 +53,49 @@ "placeholder": "Sélectionner une police", "searchPlaceholder": "Rechercher des polices…" }, + "customFontBold": { + "desc": "Afficher les valeurs de vitesse en gras.", + "label": "Gras" + }, "customFontItalic": { "desc": "Afficher les valeurs de vitesse en italique.", "label": "Italique" }, - "fontSizeModifier": { - "desc": "Mettre à l'échelle la taille du texte par rapport à la taille par défaut.", - "label": "Modificateur de taille de police" + "useCustomColors": { + "desc": "Activer les couleurs personnalisées au lieu des couleurs par défaut du thème.", + "label": "Couleurs personnalisées" }, - "horizontalLayout": { - "desc": "Afficher les valeurs TX et RX côte à côte au lieu de les empiler.", - "label": "Disposition horizontale" + "colorTx": { + "desc": "Couleur de l'icône de téléversement (TX) lorsque le seuil est dépassé.", + "label": "TX Active" }, - "iconSizeModifier": { - "desc": "Ajuster la taille de l'icône par rapport à la taille par défaut.", - "label": "Modificateur de taille d'icône" + "colorRx": { + "desc": "Couleur de l'icône de téléchargement (RX) lorsque la valeur est supérieure au seuil.", + "label": "RX Active" }, - "iconType": { - "desc": "Choisissez le style d'icône utilisé pour les indicateurs TX/RX.", - "label": "Type d'icône" + "colorSilent": { + "desc": "Couleur de l'icône lorsque le trafic est inférieur au seuil.", + "label": "Inactif" }, - "showNumbers": { - "desc": "Afficher les vitesses RX/TX actuelles sous forme de nombres.", - "label": "Afficher les valeurs" + "colorText": { + "desc": "Couleur du texte pour les valeurs de vitesse.", + "label": "Texte" }, - "spacingInbetween": { - "desc": "Ajuster l'espacement entre les éléments RX/TX.", - "label": "Espacement vertical" + "paddingLeft": { + "label": "Marge intérieure gauche", + "desc": "Marge intérieure du contenu à gauche." }, - "useCustomColors": { - "desc": "Activer les couleurs personnalisées au lieu des couleurs par défaut du thème.", - "label": "Couleurs personnalisées" + "paddingRight": { + "label": "Marge intérieure droite", + "desc": "Marge intérieure du contenu à droite." }, - "useCustomFont": { - "desc": "Remplacer la police par défaut pour les valeurs de vitesse.", - "label": "Police personnalisée" + "columnSpacing": { + "label": "Espacement des colonnes", + "desc": "Espacement entre les colonnes dans la disposition en grille." + }, + "rowSpacing": { + "label": "Espacement des lignes", + "desc": "Espacement entre les lignes dans la disposition en grille (sans effet en disposition horizontale)." } } } diff --git a/network-indicator/i18n/hu.json b/network-indicator/i18n/hu.json index 76f7f283d..a10e23473 100644 --- a/network-indicator/i18n/hu.json +++ b/network-indicator/i18n/hu.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "Widget beállítások" + "widget-settings": "Widget beállítások", + "toggle-panel": "Monitor váltása" + }, + "panel": { + "title": "Hálózati aktivitás", + "close": "Bezárás", + "download": "Letöltés", + "upload": "Feltöltés" }, "settings": { - "byteThresholdActive": { - "desc": "Állítsa be az aktivitási küszöbértéket bájt/másodpercben (B/s).", - "label": "Aktív küszöbérték mutatása" + "layout": { + "label": "Elrendezés", + "desc": "Cellák elrendezése sorban (vízszintes) vagy 2×2-es rácsban (függőleges).", + "horizontal": "Vízszintes", + "vertical": "Függőleges" + }, + "slots": { + "label": "Cellák hozzárendelése", + "desc": "Válaszd ki, mit jelenítsen meg az egyes cellák. Duplikátumok nem lehetségesek. Pl. üres cellákkal csak ikonok jeleníthetők meg." + }, + "slot": { + "txIcon": "TX ikon", + "rxIcon": "RX ikon", + "txSpeed": "TX sebesség", + "rxSpeed": "RX sebesség", + "none": "Üres" }, - "colorRx": { - "desc": "Állítsa be a letöltés (RX) ikon színét, ha az meghaladja a küszöbértéket.", - "label": "RX Aktív" - }, - "colorSilent": { - "desc": "Állítsa be az ikon színét, ha a forgalom a küszöbérték alatt van.", - "label": "RX/TX inaktív" + "iconType": { + "desc": "Válaszd ki az TX/RX indikátorokhoz használt ikonkészletet.", + "label": "Ikon típusa" }, - "colorText": { - "desc": "Állítsa be az RX és TX értékekhez használt szövegszínt.", - "label": "Szöveg" + "byteThresholdActive": { + "desc": "Az e küszöbérték alatti forgalom (B/s) inaktívként jelenik meg.", + "label": "Aktivitási küszöbérték" }, - "colorTx": { - "desc": "Állítsa be a feltöltés (TX) ikon színét, ha a küszöbérték felett van.", - "label": "TX Aktív" + "fontSizeModifier": { + "desc": "A szövegméret skálázása az alapértelmezett mérethez képest.", + "label": "Betűméret" }, - "contentMargin": { - "desc": "Vízszetes padding a widget tartalma mindkét oldalán.", - "label": "Tartalom margó" + "iconSizeModifier": { + "desc": "Az ikonméret skálázása az alapértelmezett mérethez képest.", + "label": "Ikonméret" }, - "customFontBold": { - "desc": "Sebességértékek vastag betűvel.", - "label": "Vastag" + "useCustomFont": { + "desc": "Az alapértelmezett betűtípus felülírása a sebességértékekhez.", + "label": "Egyéni betűtípus" }, "customFontFamily": { "desc": "Válasszon betűtípust a sebességértékekhez.", @@ -37,41 +53,49 @@ "placeholder": "Betűtípus kiválasztása", "searchPlaceholder": "Betűtípusok keresése…" }, + "customFontBold": { + "desc": "Sebességértékek vastag betűvel.", + "label": "Vastag" + }, "customFontItalic": { "desc": "Sebességértékek dőlt betűvel.", "label": "Dőlt" }, - "fontSizeModifier": { - "desc": "A szövegméret skálázása az alapértelmezett mérethez képest.", - "label": "Betűméret módosító" + "useCustomColors": { + "desc": "Egyéni színek engedélyezése a téma alapértelmezett színei helyett.", + "label": "Egyéni színek" }, - "horizontalLayout": { - "desc": "TX és RX értékek egymás mellett, nem egymás alatt.", - "label": "Vízszintes elrendezés" + "colorTx": { + "desc": "Feltöltés (TX) ikon színe, ha a küszöbérték felett van.", + "label": "TX Aktív" }, - "iconSizeModifier": { - "desc": "Az ikonméret skálázása az alapértelmezett mérethez képest.", - "label": "Ikonméret módosító" + "colorRx": { + "desc": "Letöltés (RX) ikon színe, ha az meghaladja a küszöbértéket.", + "label": "RX Aktív" }, - "iconType": { - "desc": "Válaszd ki az TX/RX indikátorokhoz használt ikonkészletet.", - "label": "Ikon típusa" + "colorSilent": { + "desc": "Ikon színe, ha a forgalom a küszöbérték alatt van.", + "label": "Inaktív" }, - "showNumbers": { - "desc": "A pillanatnyi RX/TX sebességek megjelenítése számként.", - "label": "Értékek megjelenítése" + "colorText": { + "desc": "Szövegszín a sebességértékekhez.", + "label": "Szöveg" }, - "spacingInbetween": { - "desc": "Állítsa be a RX/TX elemek közötti távolságot.", - "label": "Függőleges térköz" + "paddingLeft": { + "label": "Bal oldali kitöltés", + "desc": "A tartalom kitöltése a bal oldalon." }, - "useCustomColors": { - "desc": "Egyéni színek engedélyezése a téma alapértelmezett színei helyett.", - "label": "Egyéni színek" + "paddingRight": { + "label": "Jobb oldali kitöltés", + "desc": "A tartalom kitöltése a jobb oldalon." }, - "useCustomFont": { - "desc": "Az alapértelmezett betűtípus felülírása a sebességértékekhez.", - "label": "Egyéni betűtípus" + "columnSpacing": { + "label": "Oszlopköz", + "desc": "Oszlopok közötti távolság a rácsos elrendezésben." + }, + "rowSpacing": { + "label": "Sorköz", + "desc": "Sorok közötti távolság a rácsos elrendezésben (nincs hatása vízszintes elrendezésben)." } } } diff --git a/network-indicator/i18n/it.json b/network-indicator/i18n/it.json index 23a4f54fc..6409c5e5e 100644 --- a/network-indicator/i18n/it.json +++ b/network-indicator/i18n/it.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "Impostazioni widget" + "widget-settings": "Impostazioni widget", + "toggle-panel": "Mostra/nascondi Monitor" + }, + "panel": { + "title": "Attività di rete", + "close": "Chiudi", + "download": "Download", + "upload": "Upload" }, "settings": { - "byteThresholdActive": { - "desc": "Imposta la soglia di attività in byte al secondo (B/s).", - "label": "Mostra soglia attiva" + "layout": { + "label": "Layout", + "desc": "Disporre le celle in una riga (orizzontale) o in una griglia 2×2 (verticale).", + "horizontal": "Orizzontale", + "vertical": "Verticale" + }, + "slots": { + "label": "Assegnazione celle", + "desc": "Scegli cosa mostra ogni cella. Non sono possibili duplicati. Es.: usa celle vuote per mostrare solo le icone." + }, + "slot": { + "txIcon": "Icona TX", + "rxIcon": "Icona RX", + "txSpeed": "Velocità TX", + "rxSpeed": "Velocità RX", + "none": "Vuoto" }, - "colorRx": { - "desc": "Imposta il colore dell'icona di download (RX) quando sopra la soglia.", - "label": "RX Attivo" - }, - "colorSilent": { - "desc": "Imposta il colore dell'icona quando il traffico è sotto la soglia.", - "label": "RX/TX Inattivo" + "iconType": { + "desc": "Scegli lo stile dell'icona usata per gli indicatori TX/RX.", + "label": "Tipo icona" }, - "colorText": { - "desc": "Imposta il colore del testo utilizzato per i valori RX e TX.", - "label": "Testo" + "byteThresholdActive": { + "desc": "Il traffico sotto questo valore (B/s) viene mostrato come inattivo.", + "label": "Soglia di attività" }, - "colorTx": { - "desc": "Imposta il colore dell'icona di upload (TX) quando sopra la soglia.", - "label": "TX Attivo" + "fontSizeModifier": { + "desc": "Scala la dimensione del testo rispetto al valore predefinito.", + "label": "Dimensione font" }, - "contentMargin": { - "desc": "Padding orizzontale su entrambi i lati del contenuto del widget.", - "label": "Margine contenuto" + "iconSizeModifier": { + "desc": "Scala la dimensione dell'icona rispetto al valore predefinito.", + "label": "Dimensione icona" }, - "customFontBold": { - "desc": "Visualizza i valori di velocità in grassetto.", - "label": "Grassetto" + "useCustomFont": { + "desc": "Sovrascrivi il font predefinito per i valori di velocità.", + "label": "Font personalizzato" }, "customFontFamily": { "desc": "Scegli un font per i valori di velocità.", @@ -37,41 +53,49 @@ "placeholder": "Seleziona un font", "searchPlaceholder": "Cerca font…" }, + "customFontBold": { + "desc": "Visualizza i valori di velocità in grassetto.", + "label": "Grassetto" + }, "customFontItalic": { "desc": "Visualizza i valori di velocità in corsivo.", "label": "Corsivo" }, - "fontSizeModifier": { - "desc": "Scala la dimensione del testo rispetto al valore predefinito.", - "label": "Modificatore dimensione font" + "useCustomColors": { + "desc": "Attiva i colori personalizzati invece dei colori predefiniti del tema.", + "label": "Colori personalizzati" }, - "horizontalLayout": { - "desc": "Posiziona i valori TX e RX fianco a fianco invece che impilati.", - "label": "Layout orizzontale" + "colorTx": { + "desc": "Colore dell'icona di upload (TX) quando sopra la soglia.", + "label": "TX Attivo" }, - "iconSizeModifier": { - "desc": "Scala la dimensione dell'icona rispetto al valore predefinito.", - "label": "Modificatore dimensione icona" + "colorRx": { + "desc": "Colore dell'icona di download (RX) quando sopra la soglia.", + "label": "RX Attivo" }, - "iconType": { - "desc": "Scegli lo stile dell'icona usata per gli indicatori TX/RX.", - "label": "Tipo icona" + "colorSilent": { + "desc": "Colore dell'icona quando il traffico è sotto la soglia.", + "label": "Inattivo" }, - "showNumbers": { - "desc": "Visualizza le velocità RX/TX attuali come numeri.", - "label": "Mostra valori" + "colorText": { + "desc": "Colore del testo per i valori di velocità.", + "label": "Testo" }, - "spacingInbetween": { - "desc": "Regola lo spazio tra gli elementi RX/TX.", - "label": "Spaziatura verticale" + "paddingLeft": { + "label": "Padding sinistro", + "desc": "Padding del contenuto a sinistra." }, - "useCustomColors": { - "desc": "Attiva i colori personalizzati invece dei colori predefiniti del tema.", - "label": "Colori personalizzati" + "paddingRight": { + "label": "Padding destro", + "desc": "Padding del contenuto a destra." }, - "useCustomFont": { - "desc": "Sovrascrivi il font predefinito per i valori di velocità.", - "label": "Font personalizzato" + "columnSpacing": { + "label": "Spaziatura colonne", + "desc": "Spaziatura tra le colonne nel layout a griglia." + }, + "rowSpacing": { + "label": "Spaziatura righe", + "desc": "Spaziatura tra le righe nel layout a griglia (senza effetto nel layout orizzontale)." } } } diff --git a/network-indicator/i18n/ja.json b/network-indicator/i18n/ja.json index c70c454f3..fcbb86b71 100644 --- a/network-indicator/i18n/ja.json +++ b/network-indicator/i18n/ja.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "ウィジェット設定" + "widget-settings": "ウィジェット設定", + "toggle-panel": "モニターの切替" + }, + "panel": { + "title": "ネットワークアクティビティ", + "close": "閉じる", + "download": "ダウンロード", + "upload": "アップロード" }, "settings": { - "byteThresholdActive": { - "desc": "アクティビティの閾値をバイト毎秒 (B/s) で設定します。", - "label": "アクティブ閾値を表示" + "layout": { + "label": "レイアウト", + "desc": "セルを一列(水平)または2×2グリッド(垂直)に配置します。", + "horizontal": "水平", + "vertical": "垂直" + }, + "slots": { + "label": "セルの割り当て", + "desc": "各セルの表示内容を選択します。重複は不可。例:空のセルを使ってアイコンのみ表示。" + }, + "slot": { + "txIcon": "TXアイコン", + "rxIcon": "RXアイコン", + "txSpeed": "TX速度", + "rxSpeed": "RX速度", + "none": "空" }, - "colorRx": { - "desc": "閾値を超えた場合のダウンロード (RX) アイコンの色を設定します。", - "label": "RX アクティブ" - }, - "colorSilent": { - "desc": "トラフィックが閾値を下回った場合に、アイコンの色を設定します。", - "label": "RX/TX 非アクティブ" + "iconType": { + "desc": "TX/RXインジケーターに使用するアイコンのスタイルを選択してください。", + "label": "アイコンの種類" }, - "colorText": { - "desc": "RX と TX の両方の値に使用するテキストの色を設定します。", - "label": "テキスト" + "byteThresholdActive": { + "desc": "この値(B/s)未満のトラフィックは非アクティブとして表示されます。", + "label": "アクティビティ閾値" }, - "colorTx": { - "desc": "閾値を超えた場合のアップロード (TX) アイコンの色を設定します。", - "label": "TX アクティブ" + "fontSizeModifier": { + "desc": "テキストのサイズをデフォルトを基準に調整します。", + "label": "フォントサイズ" }, - "contentMargin": { - "desc": "ウィジェットコンテンツの両サイドの水平パディング。", - "label": "コンテンツマージン" + "iconSizeModifier": { + "desc": "デフォルトに対するアイコンのサイズを調整します。", + "label": "アイコンサイズ" }, - "customFontBold": { - "desc": "速度値を太字で表示。", - "label": "太字" + "useCustomFont": { + "desc": "速度値のデフォルトフォントを上書き。", + "label": "カスタムフォント" }, "customFontFamily": { "desc": "速度値に使用するフォントを選択してください。", @@ -37,41 +53,49 @@ "placeholder": "フォントを選択", "searchPlaceholder": "フォントを検索…" }, + "customFontBold": { + "desc": "速度値を太字で表示。", + "label": "太字" + }, "customFontItalic": { "desc": "速度値を斜体で表示。", "label": "斜体" }, - "fontSizeModifier": { - "desc": "テキストのサイズをデフォルトを基準に調整します。", - "label": "フォントサイズ変更" + "useCustomColors": { + "desc": "テーマのデフォルトの代わりにカスタムカラーを有効にする。", + "label": "カスタムカラー" }, - "horizontalLayout": { - "desc": "TXとRXの値を縦並びではなく横並びで表示。", - "label": "水平レイアウト" + "colorTx": { + "desc": "閾値を超えた場合のアップロード (TX) アイコンの色。", + "label": "TX アクティブ" }, - "iconSizeModifier": { - "desc": "デフォルトに対するアイコンのサイズを調整します。", - "label": "アイコンサイズ変更" + "colorRx": { + "desc": "閾値を超えた場合のダウンロード (RX) アイコンの色。", + "label": "RX アクティブ" }, - "iconType": { - "desc": "TX/RXインジケーターに使用するアイコンのスタイルを選択してください。", - "label": "アイコンの種類" + "colorSilent": { + "desc": "トラフィックが閾値を下回った場合のアイコンの色。", + "label": "非アクティブ" }, - "showNumbers": { - "desc": "現在のRX/TX速度を数値で表示。", - "label": "値を表示" + "colorText": { + "desc": "速度値のテキスト色。", + "label": "テキスト" }, - "spacingInbetween": { - "desc": "RX/TX要素間の間隔を調整してください。", - "label": "垂直間隔" + "paddingLeft": { + "label": "左パディング", + "desc": "コンテンツの左側のパディング。" }, - "useCustomColors": { - "desc": "テーマのデフォルトの代わりにカスタムカラーを有効にする。", - "label": "カスタムカラー" + "paddingRight": { + "label": "右パディング", + "desc": "コンテンツの右側のパディング。" }, - "useCustomFont": { - "desc": "速度値のデフォルトフォントを上書き。", - "label": "カスタムフォント" + "columnSpacing": { + "label": "列間隔", + "desc": "グリッドレイアウトでの列間の間隔。" + }, + "rowSpacing": { + "label": "行間隔", + "desc": "グリッドレイアウトでの行間の間隔(水平レイアウトでは効果なし)。" } } } diff --git a/network-indicator/i18n/ku.json b/network-indicator/i18n/ku.json index 2e8562adc..50b369bc2 100644 --- a/network-indicator/i18n/ku.json +++ b/network-indicator/i18n/ku.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "Mîhengên widgetê" + "widget-settings": "Mîhengên widgetê", + "toggle-panel": "Monîtor veke/bigire" + }, + "panel": { + "title": "Çalakiya Torê", + "close": "Bigire", + "download": "Daxistin", + "upload": "Barkirin" }, "settings": { - "byteThresholdActive": { - "desc": "Sînorê çalakiyê bi bayt di duyemîn de (B/s) destnîşan bike.", - "label": "Derheqê Çalakîyê Nîşan Bide" - }, - "colorRx": { - "desc": "Rengê îkona daxistinê (RX) dema ku ji tixûbê derbas dibe, destnîşan bike.", - "label": "RX Çalak" + "layout": { + "label": "Sazmon", + "desc": "Hucreyan di rêzê de (asayî) an di torê 2×2 de (stûnî) bicîh bike.", + "horizontal": "Asayî", + "vertical": "Stûnî" + }, + "slots": { + "label": "Danîna Hucreyan", + "desc": "Hilbijêre ku her hucre çi nîşan bide. Dubare ne mumkin e. Mînak: ji bo tenê îkonan nîşan bidin hucreyan vala bihêle." + }, + "slot": { + "txIcon": "Îkona TX", + "rxIcon": "Îkona RX", + "txSpeed": "Leza TX", + "rxSpeed": "Leza RX", + "none": "Vala" }, - "colorSilent": { - "desc": "Îkon rengê dema trafîk ji binê tixûbê be, saz bike.", - "label": "RX/TX Neçalak" + "iconType": { + "desc": "Şêwaza îkonê ya ku ji bo nîşanderên TX/RX tê bikaranîn hilbijêre.", + "label": "Cureyê Îkonê" }, - "colorText": { - "desc": "Rengê nivîsê yê ku ji bo nirxên RX û TX tê bikaranîn, destnîşan bike.", - "label": "Nivîs" + "byteThresholdActive": { + "desc": "Trafîka li binê vê nirxê (B/s) wekî neçalak tê nîşandan.", + "label": "Sînorê Çalakiyê" }, - "colorTx": { - "desc": "Rengê îkona barkirinê (TX) dema ku ji tixûbê derbas dibe, destnîşan bike.", - "label": "TX Çalak" + "fontSizeModifier": { + "desc": "Mezinahiya nivîsê li gorî ya xwerû mezin bike.", + "label": "Mezinahiya Tîpan" }, - "contentMargin": { - "desc": "Peddinga asayî li her aliyê naveroka widgetê.", - "label": "Berkêşana Naverokê" + "iconSizeModifier": { + "desc": "Mezinahiya îkonê li gorî ya xwerû mezin bike.", + "label": "Mezinahiya Îkonê" }, - "customFontBold": { - "desc": "Nirxên lezê bi qalın ve bike.", - "label": "Qalın" + "useCustomFont": { + "desc": "Fontê xwerû ji bo nirxên lezê binpê bike.", + "label": "Fontê Xweser" }, "customFontFamily": { "desc": "Ji bo nirxên lezê fontek hilbijêre.", @@ -37,41 +53,49 @@ "placeholder": "Fontek hilbijêre", "searchPlaceholder": "Font lêgerîn…" }, + "customFontBold": { + "desc": "Nirxên lezê bi qalın ve bike.", + "label": "Qalın" + }, "customFontItalic": { "desc": "Nirxên lezê bi xwar ve bike.", "label": "Xwar" }, - "fontSizeModifier": { - "desc": "Mezinahiya nivîsê li gorî ya xwerû mezin bike.", - "label": "Guherînera Mezinahiya Tîpan" + "useCustomColors": { + "desc": "Rengên xweser li şûna rengên xwerû yên temayê çalak bike.", + "label": "Rengên Xweser" }, - "horizontalLayout": { - "desc": "Nirxên TX û RX li hev re biparêze, ne bi hev ve.", - "label": "Sazmona_ASAYÎ" + "colorTx": { + "desc": "Rengê îkona barkirinê (TX) dema ku ji tixûbê derbas dibe.", + "label": "TX Çalak" }, - "iconSizeModifier": { - "desc": "Mezinahiya îkonê li gorî ya xwerû mezin bike.", - "label": "Guherînerê Mezinahiya Îkonê" + "colorRx": { + "desc": "Rengê îkona daxistinê (RX) dema ku ji tixûbê derbas dibe.", + "label": "RX Çalak" }, - "iconType": { - "desc": "Şêwaza îkonê ya ku ji bo nîşanderên TX/RX tê bikaranîn hilbijêre.", - "label": "Cureyê Îkonê" + "colorSilent": { + "desc": "Rengê îkonê dema trafîk ji binê tixûbê be.", + "label": "Neçalak" + }, + "colorText": { + "desc": "Rengê nivîsê ji bo nirxên lezê.", + "label": "Nivîs" }, - "showNumbers": { - "desc": "Leza lezahenên RX/TX yên niha wekî hejmaran.", - "label": "Nîşan bide Nirxan" + "paddingLeft": { + "label": "Peddinga çepê", + "desc": "Peddinga naverokê li aliyê çepê." }, - "spacingInbetween": { - "desc": "Cihêtiya navbera elementên RX/TX eyar bike.", - "label": "Valahiya_Rastkirin" + "paddingRight": { + "label": "Peddinga rastê", + "desc": "Peddinga naverokê li aliyê rastê." }, - "useCustomColors": { - "desc": "Çalak bike rengên xwerû li şûna rengên xwerû yên temayê.", - "label": "Rengên Xweser" + "columnSpacing": { + "label": "Valahiya stûnan", + "desc": "Valahiya navbera stûnan di sazmona torê de." }, - "useCustomFont": { - "desc": "Fontê DEFAULT ji bo nirxên lezê binpê kirin.", - "label": "Fontê Xweser" + "rowSpacing": { + "label": "Valahiya rêzan", + "desc": "Valahiya navbera rêzan di sazmona torê de (di sazmona asayî de bêbandor e)." } } } diff --git a/network-indicator/i18n/nl.json b/network-indicator/i18n/nl.json index 560581f7a..423a540ad 100644 --- a/network-indicator/i18n/nl.json +++ b/network-indicator/i18n/nl.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "Widget-instellingen" + "widget-settings": "Widget-instellingen", + "toggle-panel": "Monitor in-/uitschakelen" + }, + "panel": { + "title": "Netwerkactiviteit", + "close": "Sluiten", + "download": "Download", + "upload": "Upload" }, "settings": { - "byteThresholdActive": { - "desc": "Stel de activiteitsdrempel in bytes per seconde (B/s) in.", - "label": "Actieve drempel weergeven" + "layout": { + "label": "Lay-out", + "desc": "Cellen in een rij (horizontaal) of in een 2×2-raster (verticaal) rangschikken.", + "horizontal": "Horizontaal", + "vertical": "Verticaal" + }, + "slots": { + "label": "Celtoewijzing", + "desc": "Kies wat elke cel weergeeft. Geen duplicaten mogelijk. Gebruik bijv. lege cellen om alleen pictogrammen te tonen." + }, + "slot": { + "txIcon": "TX-pictogram", + "rxIcon": "RX-pictogram", + "txSpeed": "TX-snelheid", + "rxSpeed": "RX-snelheid", + "none": "Leeg" }, - "colorRx": { - "desc": "Stel de kleur van het download (RX) pictogram in wanneer deze boven de drempelwaarde ligt.", - "label": "RX Actief" - }, - "colorSilent": { - "desc": "Stel de pictogramkleur in wanneer het verkeer onder de drempelwaarde is.", - "label": "RX/TX Inactief" + "iconType": { + "desc": "Kies de pictogramstijl die gebruikt wordt voor de TX/RX-indicatoren.", + "label": "Icoontype" }, - "colorText": { - "desc": "Stel de tekstkleur in die gebruikt wordt voor zowel RX- als TX-waarden.", - "label": "Tekst" + "byteThresholdActive": { + "desc": "Verkeer onder deze waarde (B/s) wordt als inactief weergegeven.", + "label": "Activiteitsdrempel" }, - "colorTx": { - "desc": "Stel de kleur van het upload (TX) icoon in wanneer boven de drempelwaarde.", - "label": "TX Actief" + "fontSizeModifier": { + "desc": "Schaal de tekstgrootte ten opzichte van de standaard.", + "label": "Lettergrootte" }, - "contentMargin": { - "desc": "Horizontale padding aan beide zijden van de widget-inhoud.", - "label": "Inhoudmarge" + "iconSizeModifier": { + "desc": "Schaal de pictogramgrootte ten opzichte van de standaard.", + "label": "Icoongrootte" }, - "customFontBold": { - "desc": "Geef snelheidswaarden vetgedrukt weer.", - "label": "Vet" + "useCustomFont": { + "desc": "Overschrijf het standaard lettertype voor snelheidswaarden.", + "label": "Aangepast lettertype" }, "customFontFamily": { "desc": "Kies een lettertype voor de snelheidswaarden.", @@ -37,41 +53,49 @@ "placeholder": "Selecteer lettertype", "searchPlaceholder": "Lettertypen zoeken…" }, + "customFontBold": { + "desc": "Geef snelheidswaarden vetgedrukt weer.", + "label": "Vet" + }, "customFontItalic": { "desc": "Geef snelheidswaarden scheefgedrukt weer.", "label": "Schuin" }, - "fontSizeModifier": { - "desc": "Schaal de tekstgrootte ten opzichte van de standaard.", - "label": "Lettergrootte aanpassing" + "useCustomColors": { + "desc": "Schakel aangepaste kleuren in in plaats van de standaard themakleuren.", + "label": "Aangepaste kleuren" }, - "horizontalLayout": { - "desc": "Plaats TX en RX waarden naast elkaar in plaats van gestapeld.", - "label": "Horizontale lay-out" + "colorTx": { + "desc": "Kleur van het upload (TX) pictogram wanneer boven de drempelwaarde.", + "label": "TX Actief" }, - "iconSizeModifier": { - "desc": "Schaal de pictogramgrootte ten opzichte van de standaard.", - "label": "Icoongrootte aanpassing" + "colorRx": { + "desc": "Kleur van het download (RX) pictogram wanneer boven de drempelwaarde.", + "label": "RX Actief" }, - "iconType": { - "desc": "Kies de pictogramstijl die gebruikt wordt voor de TX/RX-indicatoren.", - "label": "Icoontype" + "colorSilent": { + "desc": "Pictogramkleur wanneer het verkeer onder de drempelwaarde is.", + "label": "Inactief" }, - "showNumbers": { - "desc": "Toon de huidige RX/TX snelheden als getallen.", - "label": "Waarden weergeven" + "colorText": { + "desc": "Tekstkleur voor snelheidswaarden.", + "label": "Tekst" }, - "spacingInbetween": { - "desc": "Pas de afstand tussen de RX/TX-elementen aan.", - "label": "Verticale afstand" + "paddingLeft": { + "label": "Padding links", + "desc": "Padding van de inhoud aan de linkerkant." }, - "useCustomColors": { - "desc": "Schakel aangepaste kleuren in in plaats van de standaard themakleuren.", - "label": "Aangepaste kleuren" + "paddingRight": { + "label": "Padding rechts", + "desc": "Padding van de inhoud aan de rechterkant." }, - "useCustomFont": { - "desc": "Overschrijf het standaard lettertype voor snelheidswaarden.", - "label": "Aangepast lettertype" + "columnSpacing": { + "label": "Kolomafstand", + "desc": "Afstand tussen kolommen in rasterlay-out." + }, + "rowSpacing": { + "label": "Rijafstand", + "desc": "Afstand tussen rijen in rasterlay-out (heeft geen effect in horizontale lay-out)." } } } diff --git a/network-indicator/i18n/pl.json b/network-indicator/i18n/pl.json index b0b68a865..dcd24acce 100644 --- a/network-indicator/i18n/pl.json +++ b/network-indicator/i18n/pl.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "Ustawienia widgetu" + "widget-settings": "Ustawienia widgetu", + "toggle-panel": "Przełącz Monitor" + }, + "panel": { + "title": "Aktywność sieciowa", + "close": "Zamknij", + "download": "Pobieranie", + "upload": "Wysyłanie" }, "settings": { - "byteThresholdActive": { - "desc": "Ustaw próg aktywności w bajtach na sekundę (B/s).", - "label": "Pokaż Aktywny Próg" + "layout": { + "label": "Układ", + "desc": "Rozmieść komórki w rzędzie (poziomo) lub w siatce 2×2 (pionowo).", + "horizontal": "Poziomy", + "vertical": "Pionowy" + }, + "slots": { + "label": "Przypisanie komórek", + "desc": "Wybierz, co wyświetla każda komórka. Duplikaty nie są możliwe. Np. użyj pustych komórek, aby wyświetlać tylko ikony." + }, + "slot": { + "txIcon": "Ikona TX", + "rxIcon": "Ikona RX", + "txSpeed": "Prędkość TX", + "rxSpeed": "Prędkość RX", + "none": "Pusty" }, - "colorRx": { - "desc": "Ustaw kolor ikony pobierania (RX), gdy wartość przekroczy próg.", - "label": "RX Aktywny" - }, - "colorSilent": { - "desc": "Ustaw kolor ikony, gdy ruch jest poniżej progu.", - "label": "RX/TX Nieaktywne" + "iconType": { + "desc": "Wybierz styl ikony używany dla wskaźników TX/RX.", + "label": "Typ Ikony" }, - "colorText": { - "desc": "Ustaw kolor tekstu używany zarówno dla wartości RX, jak i TX.", - "label": "Tekst" + "byteThresholdActive": { + "desc": "Ruch poniżej tej wartości (B/s) jest wyświetlany jako nieaktywny.", + "label": "Próg aktywności" }, - "colorTx": { - "desc": "Ustaw kolor ikony wysyłania (TX), gdy przekroczony zostanie próg.", - "label": "TX Aktywny" + "fontSizeModifier": { + "desc": "Skaluj rozmiar tekstu względem domyślnego.", + "label": "Rozmiar czcionki" }, - "contentMargin": { - "desc": "Poziomy padding po obu stronach treści widgetu.", - "label": "Margines treści" + "iconSizeModifier": { + "desc": "Skaluj rozmiar ikony względem domyślnego.", + "label": "Rozmiar ikony" }, - "customFontBold": { - "desc": "Wyświetlaj wartości prędkości pogrubionym tekstem.", - "label": "Pogrubiony" + "useCustomFont": { + "desc": "Zastąp domyślną czcionkę dla wartości prędkości.", + "label": "Własna czcionka" }, "customFontFamily": { "desc": "Wybierz czcionkę dla wartości prędkości.", @@ -37,41 +53,49 @@ "placeholder": "Wybierz czcionkę", "searchPlaceholder": "Szukaj czcionek…" }, + "customFontBold": { + "desc": "Wyświetlaj wartości prędkości pogrubionym tekstem.", + "label": "Pogrubiony" + }, "customFontItalic": { "desc": "Wyświetlaj wartości prędkości kursywą.", "label": "Kursywa" }, - "fontSizeModifier": { - "desc": "Skaluj rozmiar tekstu względem domyślnego.", - "label": "Modyfikator rozmiaru czcionki" + "useCustomColors": { + "desc": "Włącz własne kolory zamiast domyślnych motywu.", + "label": "Własne kolory" }, - "horizontalLayout": { - "desc": "Umieść wartości TX i RX obok siebie zamiast jedna nad drugą.", - "label": "Układ poziomy" + "colorTx": { + "desc": "Kolor ikony wysyłania (TX), gdy przekroczony jest próg.", + "label": "TX Aktywny" }, - "iconSizeModifier": { - "desc": "Skaluj rozmiar ikony względem domyślnego.", - "label": "Modyfikator rozmiaru ikony" + "colorRx": { + "desc": "Kolor ikony pobierania (RX), gdy wartość przekroczy próg.", + "label": "RX Aktywny" }, - "iconType": { - "desc": "Wybierz styl ikony używany dla wskaźników TX/RX.", - "label": "Typ Ikony" + "colorSilent": { + "desc": "Kolor ikony, gdy ruch jest poniżej progu.", + "label": "Nieaktywne" }, - "showNumbers": { - "desc": "Wyświetlaj aktualne prędkości RX/TX jako liczby.", - "label": "Pokaż wartości" + "colorText": { + "desc": "Kolor tekstu dla wartości prędkości.", + "label": "Tekst" }, - "spacingInbetween": { - "desc": "Dostosuj odstępy między elementami RX/TX.", - "label": "Odstęp pionowy" + "paddingLeft": { + "label": "Padding lewy", + "desc": "Padding treści po lewej stronie." }, - "useCustomColors": { - "desc": "Włącz własne kolory zamiast domyślnych motywu.", - "label": "Własne kolory" + "paddingRight": { + "label": "Padding prawy", + "desc": "Padding treści po prawej stronie." }, - "useCustomFont": { - "desc": "Zastąp domyślną czcionkę dla wartości prędkości.", - "label": "Własna czcionka" + "columnSpacing": { + "label": "Odstęp kolumn", + "desc": "Odstęp między kolumnami w układzie siatki." + }, + "rowSpacing": { + "label": "Odstęp wierszy", + "desc": "Odstęp między wierszami w układzie siatki (bez efektu w układzie poziomym)." } } } diff --git a/network-indicator/i18n/pt.json b/network-indicator/i18n/pt.json index 551abdc50..ceefd199c 100644 --- a/network-indicator/i18n/pt.json +++ b/network-indicator/i18n/pt.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "Configurações do widget" + "widget-settings": "Configurações do widget", + "toggle-panel": "Alternar Monitor" + }, + "panel": { + "title": "Atividade de Rede", + "close": "Fechar", + "download": "Download", + "upload": "Upload" }, "settings": { - "byteThresholdActive": { - "desc": "Defina o limite de atividade em bytes por segundo (B/s).", - "label": "Mostrar Limiar Ativo" + "layout": { + "label": "Layout", + "desc": "Organizar células em linha (horizontal) ou em grelha 2×2 (vertical).", + "horizontal": "Horizontal", + "vertical": "Vertical" + }, + "slots": { + "label": "Atribuição de células", + "desc": "Escolha o que cada célula exibe. Não são possíveis duplicados. Ex.: use células vazias para mostrar apenas ícones." + }, + "slot": { + "txIcon": "Ícone TX", + "rxIcon": "Ícone RX", + "txSpeed": "Velocidade TX", + "rxSpeed": "Velocidade RX", + "none": "Vazio" }, - "colorRx": { - "desc": "Defina a cor do ícone de download (RX) quando acima do limite.", - "label": "RX Ativo" - }, - "colorSilent": { - "desc": "Definir a cor do ícone quando o tráfego estiver abaixo do limite.", - "label": "RX/TX Inativo" + "iconType": { + "desc": "Escolha o estilo do ícone usado para os indicadores TX/RX.", + "label": "Tipo de Ícone" }, - "colorText": { - "desc": "Definir a cor do texto usada para os valores de RX e TX.", - "label": "Texto" + "byteThresholdActive": { + "desc": "Tráfego abaixo deste valor (B/s) é mostrado como inativo.", + "label": "Limiar de atividade" }, - "colorTx": { - "desc": "Definir a cor do ícone de upload (TX) quando acima do limite.", - "label": "TX Ativo" + "fontSizeModifier": { + "desc": "Ajustar o tamanho do texto em relação ao padrão.", + "label": "Tamanho da fonte" }, - "contentMargin": { - "desc": "Padding horizontal em ambos os lados do conteúdo do widget.", - "label": "Margem do conteúdo" + "iconSizeModifier": { + "desc": "Dimensionar o tamanho do ícone em relação ao padrão.", + "label": "Tamanho do ícone" }, - "customFontBold": { - "desc": "Renderizar valores de velocidade em negrito.", - "label": "Negrito" + "useCustomFont": { + "desc": "Substituir a fonte padrão para valores de velocidade.", + "label": "Fonte Personalizada" }, "customFontFamily": { "desc": "Escolha uma fonte para os valores de velocidade.", @@ -37,41 +53,49 @@ "placeholder": "Selecionar fonte", "searchPlaceholder": "Pesquisar fontes…" }, + "customFontBold": { + "desc": "Renderizar valores de velocidade em negrito.", + "label": "Negrito" + }, "customFontItalic": { "desc": "Renderizar valores de velocidade em itálico.", "label": "Itálico" }, - "fontSizeModifier": { - "desc": "Ajustar o tamanho do texto em relação ao padrão.", - "label": "Modificador de Tamanho da Fonte" + "useCustomColors": { + "desc": "Ativar cores personalizadas em vez das cores padrão do tema.", + "label": "Cores Personalizadas" }, - "horizontalLayout": { - "desc": "Colocar valores TX e RX lado a lado em vez de empilhados.", - "label": "Layout Horizontal" + "colorTx": { + "desc": "Cor do ícone de upload (TX) quando acima do limite.", + "label": "TX Ativo" }, - "iconSizeModifier": { - "desc": "Dimensionar o tamanho do ícone em relação ao padrão.", - "label": "Modificador de Tamanho do Ícone" + "colorRx": { + "desc": "Cor do ícone de download (RX) quando acima do limite.", + "label": "RX Ativo" }, - "iconType": { - "desc": "Escolha o estilo do ícone usado para os indicadores TX/RX.", - "label": "Tipo de Ícone" + "colorSilent": { + "desc": "Cor do ícone quando o tráfego estiver abaixo do limite.", + "label": "Inativo" }, - "showNumbers": { - "desc": "Exibir as velocidades atuais de RX/TX como números.", - "label": "Mostrar Valores" + "colorText": { + "desc": "Cor do texto para valores de velocidade.", + "label": "Texto" }, - "spacingInbetween": { - "desc": "Ajustar o espaçamento entre os elementos RX/TX.", - "label": "Espaçamento vertical" + "paddingLeft": { + "label": "Padding esquerdo", + "desc": "Padding do conteúdo à esquerda." }, - "useCustomColors": { - "desc": "Ativar cores personalizadas em vez das cores padrão do tema.", - "label": "Cores Personalizadas" + "paddingRight": { + "label": "Padding direito", + "desc": "Padding do conteúdo à direita." }, - "useCustomFont": { - "desc": "Substituir a fonte padrão para valores de velocidade.", - "label": "Fonte Personalizada" + "columnSpacing": { + "label": "Espaçamento de colunas", + "desc": "Espaçamento entre colunas no layout de grelha." + }, + "rowSpacing": { + "label": "Espaçamento de linhas", + "desc": "Espaçamento entre linhas no layout de grelha (sem efeito no layout horizontal)." } } } diff --git a/network-indicator/i18n/ru.json b/network-indicator/i18n/ru.json index 0a2e595cb..5bb865a59 100644 --- a/network-indicator/i18n/ru.json +++ b/network-indicator/i18n/ru.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "Настройки виджета" + "widget-settings": "Настройки виджета", + "toggle-panel": "Переключить монитор" + }, + "panel": { + "title": "Сетевая активность", + "close": "Закрыть", + "download": "Загрузка", + "upload": "Отдача" }, "settings": { - "byteThresholdActive": { - "desc": "Установите порог активности в байтах в секунду (Б/с).", - "label": "Показать активный порог" + "layout": { + "label": "Раскладка", + "desc": "Расположить ячейки в ряд (горизонтально) или в сетку 2×2 (вертикально).", + "horizontal": "Горизонтальная", + "vertical": "Вертикальная" + }, + "slots": { + "label": "Назначение ячеек", + "desc": "Выберите, что отображает каждая ячейка. Дублирование невозможно. Напр., используйте пустые ячейки, чтобы показывать только значки." + }, + "slot": { + "txIcon": "Значок TX", + "rxIcon": "Значок RX", + "txSpeed": "Скорость TX", + "rxSpeed": "Скорость RX", + "none": "Пусто" }, - "colorRx": { - "desc": "Установите цвет значка загрузки (RX), когда он выше порогового значения.", - "label": "RX активен" - }, - "colorSilent": { - "desc": "Установите цвет значка, когда трафик ниже порогового значения.", - "label": "RX/TX неактивны" + "iconType": { + "desc": "Выберите стиль значков для индикаторов TX/RX.", + "label": "Тип значка" }, - "colorText": { - "desc": "Установите цвет текста для значений RX и TX.", - "label": "Текст" + "byteThresholdActive": { + "desc": "Трафик ниже этого значения (Б/с) отображается как неактивный.", + "label": "Порог активности" }, - "colorTx": { - "desc": "Установите цвет значка загрузки (TX) при превышении порогового значения.", - "label": "TX активен" + "fontSizeModifier": { + "desc": "Измените размер текста относительно размера по умолчанию.", + "label": "Размер шрифта" }, - "contentMargin": { - "desc": "Горизонтальный отступ по обеим сторонам содержимого виджета.", - "label": "Отступ содержимого" + "iconSizeModifier": { + "desc": "Измените размер значка относительно размера по умолчанию.", + "label": "Размер значка" }, - "customFontBold": { - "desc": "Отображать значения скорости жирным шрифтом.", - "label": "Жирный" + "useCustomFont": { + "desc": "Переопределите шрифт по умолчанию для значений скорости.", + "label": "Пользовательский шрифт" }, "customFontFamily": { "desc": "Выберите шрифт для значений скорости.", @@ -37,41 +53,49 @@ "placeholder": "Выбрать шрифт", "searchPlaceholder": "Поиск шрифтов…" }, + "customFontBold": { + "desc": "Отображать значения скорости жирным шрифтом.", + "label": "Жирный" + }, "customFontItalic": { "desc": "Отображать значения скорости курсивом.", "label": "Курсив" }, - "fontSizeModifier": { - "desc": "Измените размер текста относительно размера по умолчанию.", - "label": "Модификатор размера шрифта" + "useCustomColors": { + "desc": "Включите пользовательские цвета вместо цветов темы по умолчанию.", + "label": "Пользовательские цвета" }, - "horizontalLayout": { - "desc": "Разместите значения TX и RX рядом друг с другом, а не друг под другом.", - "label": "Горизонтальная раскладка" + "colorTx": { + "desc": "Цвет значка отдачи (TX) при превышении порогового значения.", + "label": "TX активен" }, - "iconSizeModifier": { - "desc": "Измените размер значка относительно размера по умолчанию.", - "label": "Модификатор размера значка" + "colorRx": { + "desc": "Цвет значка загрузки (RX), когда он выше порогового значения.", + "label": "RX активен" }, - "iconType": { - "desc": "Выберите стиль значков для индикаторов TX/RX.", - "label": "Тип значка" + "colorSilent": { + "desc": "Цвет значка, когда трафик ниже порогового значения.", + "label": "Неактивен" }, - "showNumbers": { - "desc": "Отображать текущие скорости RX/TX в виде чисел.", - "label": "Показать значения" + "colorText": { + "desc": "Цвет текста для значений скорости.", + "label": "Текст" }, - "spacingInbetween": { - "desc": "Отрегулируйте интервал между элементами RX/TX.", - "label": "Вертикальный интервал" + "paddingLeft": { + "label": "Отступ слева", + "desc": "Отступ содержимого слева." }, - "useCustomColors": { - "desc": "Включите пользовательские цвета вместо цветов темы по умолчанию.", - "label": "Пользовательские цвета" + "paddingRight": { + "label": "Отступ справа", + "desc": "Отступ содержимого справа." }, - "useCustomFont": { - "desc": "Переопределите шрифт по умолчанию для значений скорости.", - "label": "Пользовательский шрифт" + "columnSpacing": { + "label": "Расстояние между столбцами", + "desc": "Расстояние между столбцами в сеточной раскладке." + }, + "rowSpacing": { + "label": "Расстояние между строками", + "desc": "Расстояние между строками в сеточной раскладке (не действует в горизонтальной раскладке)." } } } diff --git a/network-indicator/i18n/tr.json b/network-indicator/i18n/tr.json index cfa3972f7..d5c923a49 100644 --- a/network-indicator/i18n/tr.json +++ b/network-indicator/i18n/tr.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "Widget Ayarları" + "widget-settings": "Widget Ayarları", + "toggle-panel": "Monitörü Aç/Kapat" + }, + "panel": { + "title": "Ağ Etkinliği", + "close": "Kapat", + "download": "İndirme", + "upload": "Yükleme" }, "settings": { - "byteThresholdActive": { - "desc": "Etkinlik eşiğini saniye başına bayt (B/s) cinsinden ayarlayın.", - "label": "Aktif Eşiği Göster" + "layout": { + "label": "Düzen", + "desc": "Hücreleri bir satırda (yatay) veya 2×2 ızgarada (dikey) düzenle.", + "horizontal": "Yatay", + "vertical": "Dikey" + }, + "slots": { + "label": "Hücre Ataması", + "desc": "Her hücrenin ne göstereceğini seç. Yinelenenlere izin verilmez. Örn. yalnızca simgeleri göstermek için boş hücreler kullan." + }, + "slot": { + "txIcon": "TX Simgesi", + "rxIcon": "RX Simgesi", + "txSpeed": "TX Hızı", + "rxSpeed": "RX Hızı", + "none": "Boş" }, - "colorRx": { - "desc": "Eşiğin üzerindeyken indirme (RX) simge rengini ayarla.", - "label": "RX Aktif" - }, - "colorSilent": { - "desc": "Trafiğin eşiğin altında olduğu durumlarda simge rengini ayarla.", - "label": "RX/TX Etkin Değil" + "iconType": { + "desc": "TX/RX göstergeleri için kullanılan simge stilini seçin.", + "label": "Simge Türü" }, - "colorText": { - "desc": "RX ve TX değerleri için kullanılan metin rengini ayarla.", - "label": "Metin" + "byteThresholdActive": { + "desc": "Bu değerin altındaki trafik (B/s) etkin değil olarak gösterilir.", + "label": "Etkinlik Eşiği" }, - "colorTx": { - "desc": "Eşik değerinin üzerindeyken yükleme (TX) simge rengini ayarla.", - "label": "TX Aktif" + "fontSizeModifier": { + "desc": "Metin boyutunu varsayılana göre ölçekle.", + "label": "Yazı Boyutu" }, - "contentMargin": { - "desc": "Widget içeriğinin her iki tarafında yatay dolgu.", - "label": "İçerik Kenar Boşluğu" + "iconSizeModifier": { + "desc": "Simge boyutunu varsayılan değere göre ölçekle.", + "label": "Simge Boyutu" }, - "customFontBold": { - "desc": "Hız değerlerini kalın olarak oluştur.", - "label": "Kalın" + "useCustomFont": { + "desc": "Hız değerleri için varsayılan yazı tipini geçersiz kıl.", + "label": "Özel Yazı Tipi" }, "customFontFamily": { "desc": "Hız değerleri için bir yazı tipi seçin.", @@ -37,41 +53,49 @@ "placeholder": "Yazı tipi seçin", "searchPlaceholder": "Yazı tipleri ara…" }, + "customFontBold": { + "desc": "Hız değerlerini kalın olarak oluştur.", + "label": "Kalın" + }, "customFontItalic": { "desc": "Hız değerlerini italik olarak oluştur.", "label": "İtalik" }, - "fontSizeModifier": { - "desc": "Metin boyutunu varsayılana göre ölçekle.", - "label": "Yazı Boyutu Değiştirici" + "useCustomColors": { + "desc": "Tema varsayılanları yerine özel renkleri etkinleştir.", + "label": "Özel Renkler" }, - "horizontalLayout": { - "desc": "TX ve RX değerlerini üst üste yerine yan yana yerleştir.", - "label": "Yatay Düzen" + "colorTx": { + "desc": "Eşiğin üzerindeyken yükleme (TX) simge rengi.", + "label": "TX Aktif" }, - "iconSizeModifier": { - "desc": "Simge boyutunu varsayılan değere göre ölçekle.", - "label": "Simge Boyutu Değiştirici" + "colorRx": { + "desc": "Eşiğin üzerindeyken indirme (RX) simge rengi.", + "label": "RX Aktif" }, - "iconType": { - "desc": "TX/RX göstergeleri için kullanılan simge stilini seçin.", - "label": "Simge Türü" + "colorSilent": { + "desc": "Trafiğin eşiğin altında olduğu durumlarda simge rengi.", + "label": "Etkin Değil" }, - "showNumbers": { - "desc": "Mevcut RX/TX hızlarını sayı olarak görüntüle.", - "label": "Değerleri Göster" + "colorText": { + "desc": "Hız değerleri için metin rengi.", + "label": "Metin" }, - "spacingInbetween": { - "desc": "RX/TX öğeleri arasındaki boşluğu ayarlayın.", - "label": "Dikey Aralık" + "paddingLeft": { + "label": "Sol Dolgu", + "desc": "İçeriğin sol tarafındaki dolgu." }, - "useCustomColors": { - "desc": "Tema varsayılanları yerine özel renkleri etkinleştir.", - "label": "Özel Renkler" + "paddingRight": { + "label": "Sağ Dolgu", + "desc": "İçeriğin sağ tarafındaki dolgu." }, - "useCustomFont": { - "desc": "Hız değerleri için varsayılan yazı tipini geçersiz kıl.", - "label": "Özel Yazı Tipi" + "columnSpacing": { + "label": "Sütun Aralığı", + "desc": "Izgara düzeninde sütunlar arası boşluk." + }, + "rowSpacing": { + "label": "Satır Aralığı", + "desc": "Izgara düzeninde satırlar arası boşluk (yatay düzende etkisizdir)." } } } diff --git a/network-indicator/i18n/uk-UA.json b/network-indicator/i18n/uk-UA.json index b1f74be3c..f1910fcc5 100644 --- a/network-indicator/i18n/uk-UA.json +++ b/network-indicator/i18n/uk-UA.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "Налаштування віджета" + "widget-settings": "Налаштування віджета", + "toggle-panel": "Перемкнути монітор" + }, + "panel": { + "title": "Мережева активність", + "close": "Закрити", + "download": "Завантаження", + "upload": "Вивантаження" }, "settings": { - "byteThresholdActive": { - "desc": "Встановіть поріг активності в байтах на секунду (Б/с).", - "label": "Показати активний поріг" + "layout": { + "label": "Розташування", + "desc": "Розмістити комірки в ряд (горизонтально) або у сітку 2×2 (вертикально).", + "horizontal": "Горизонтальне", + "vertical": "Вертикальне" + }, + "slots": { + "label": "Призначення комірок", + "desc": "Оберіть, що відображає кожна комірка. Дублікати неможливі. Напр., використовуйте порожні комірки, щоб показувати лише іконки." + }, + "slot": { + "txIcon": "Іконка TX", + "rxIcon": "Іконка RX", + "txSpeed": "Швидкість TX", + "rxSpeed": "Швидкість RX", + "none": "Порожньо" }, - "colorRx": { - "desc": "Встановіть колір значка завантаження (RX), коли він перевищує поріг.", - "label": "RX активний" - }, - "colorSilent": { - "desc": "Встановіть колір значка, коли трафік нижче порогового значення.", - "label": "RX/TX неактивні" + "iconType": { + "desc": "Виберіть стиль іконок, що використовуються для індикаторів TX/RX.", + "label": "Тип іконки" }, - "colorText": { - "desc": "Встановіть колір тексту, який використовується для значень RX та TX.", - "label": "Текст" + "byteThresholdActive": { + "desc": "Трафік нижче цього значення (Б/с) відображається як неактивний.", + "label": "Поріг активності" }, - "colorTx": { - "desc": "Встановіть колір піктограми завантаження (TX), коли значення перевищує поріг.", - "label": "TX активний" + "fontSizeModifier": { + "desc": "Змінити розмір тексту відносно стандартного.", + "label": "Розмір шрифту" }, - "contentMargin": { - "desc": "Горизонтальний відступ з обох боків вмісту віджета.", - "label": "Відступ вмісту" + "iconSizeModifier": { + "desc": "Змінюйте розмір значка відносно стандартного.", + "label": "Розмір значка" }, - "customFontBold": { - "desc": "Відображати значення швидкості жирним шрифтом.", - "label": "Жирний" + "useCustomFont": { + "desc": "Перевизначити шрифт за замовчуванням для значень швидкості.", + "label": "Користувацький шрифт" }, "customFontFamily": { "desc": "Оберіть шрифт для значень швидкості.", @@ -37,41 +53,49 @@ "placeholder": "Обрати шрифт", "searchPlaceholder": "Пошук шрифтів…" }, + "customFontBold": { + "desc": "Відображати значення швидкості жирним шрифтом.", + "label": "Жирний" + }, "customFontItalic": { "desc": "Відображати значення швидкості курсивом.", "label": "Курсив" }, - "fontSizeModifier": { - "desc": "Змінити розмір тексту відносно стандартного.", - "label": "Модифікатор розміру шрифту" + "useCustomColors": { + "desc": "Увімкнути власні кольори замість кольорів теми за замовчуванням.", + "label": "Користувацькі кольори" }, - "horizontalLayout": { - "desc": "Розмістити значення TX та RX поруч, а не один під одним.", - "label": "Горизонтальне розташування" + "colorTx": { + "desc": "Колір піктограми вивантаження (TX), коли значення перевищує поріг.", + "label": "TX активний" }, - "iconSizeModifier": { - "desc": "Змінюйте розмір значка відносно стандартного.", - "label": "Модифікатор розміру значка" + "colorRx": { + "desc": "Колір значка завантаження (RX), коли він перевищує поріг.", + "label": "RX активний" }, - "iconType": { - "desc": "Виберіть стиль іконок, що використовуються для індикаторів TX/RX.", - "label": "Тип іконки" + "colorSilent": { + "desc": "Колір значка, коли трафік нижче порогового значення.", + "label": "Неактивний" }, - "showNumbers": { - "desc": "Показувати поточні швидкості RX/TX у вигляді чисел.", - "label": "Показати значення" + "colorText": { + "desc": "Колір тексту для значень швидкості.", + "label": "Текст" }, - "spacingInbetween": { - "desc": "Відрегулюйте інтервал між елементами RX/TX.", - "label": "Вертикальний інтервал" + "paddingLeft": { + "label": "Відступ зліва", + "desc": "Відступ вмісту зліва." }, - "useCustomColors": { - "desc": "Увімкнути власні кольори замість кольорів теми за замовчуванням.", - "label": "Користувацькі кольори" + "paddingRight": { + "label": "Відступ справа", + "desc": "Відступ вмісту справа." }, - "useCustomFont": { - "desc": "Перевизначити шрифт за замовчуванням для значень швидкості.", - "label": "Користувацький шрифт" + "columnSpacing": { + "label": "Відстань між стовпцями", + "desc": "Відстань між стовпцями у сітковому розташуванні." + }, + "rowSpacing": { + "label": "Відстань між рядками", + "desc": "Відстань між рядками у сітковому розташуванні (не діє у горизонтальному розташуванні)." } } } diff --git a/network-indicator/i18n/zh-CN.json b/network-indicator/i18n/zh-CN.json index 9e9e6e14c..6ba9f2add 100644 --- a/network-indicator/i18n/zh-CN.json +++ b/network-indicator/i18n/zh-CN.json @@ -1,35 +1,51 @@ { "actions": { - "widget-settings": "小组件设置" + "widget-settings": "小组件设置", + "toggle-panel": "切换监控面板" + }, + "panel": { + "title": "网络活动", + "close": "关闭", + "download": "下载", + "upload": "上传" }, "settings": { - "byteThresholdActive": { - "desc": "设置活动阈值,单位为字节/秒 (B/s)。", - "label": "显示活动阈值" + "layout": { + "label": "布局", + "desc": "将单元格排列为一行(水平)或 2×2 网格(垂直)。", + "horizontal": "水平", + "vertical": "垂直" + }, + "slots": { + "label": "单元格分配", + "desc": "选择每个单元格显示的内容。不可重复。例如,使用空单元格仅显示图标。" + }, + "slot": { + "txIcon": "TX 图标", + "rxIcon": "RX 图标", + "txSpeed": "TX 速度", + "rxSpeed": "RX 速度", + "none": "空" }, - "colorRx": { - "desc": "设置高于阈值时的下载(RX)图标颜色。", - "label": "RX 活跃" - }, - "colorSilent": { - "desc": "当流量低于阈值时,设置图标颜色。", - "label": "RX/TX 非活跃" + "iconType": { + "desc": "选择用于 TX/RX 指示器的图标样式。", + "label": "图标类型" }, - "colorText": { - "desc": "设置用于RX和TX值的文本颜色。", - "label": "文本" + "byteThresholdActive": { + "desc": "低于此值(B/s)的流量显示为非活跃。", + "label": "活动阈值" }, - "colorTx": { - "desc": "设置上传(TX)图标颜色,当高于阈值时。", - "label": "TX 活跃" + "fontSizeModifier": { + "desc": "相对于默认值缩放文本大小。", + "label": "字体大小" }, - "contentMargin": { - "desc": "小组件内容两侧的水平内边距。", - "label": "内容边距" + "iconSizeModifier": { + "desc": "相对于默认值缩放图标大小。", + "label": "图标大小" }, - "customFontBold": { - "desc": "以粗体显示速度值。", - "label": "粗体" + "useCustomFont": { + "desc": "覆盖速度值的默认字体。", + "label": "自定义字体" }, "customFontFamily": { "desc": "为速度值选择字体。", @@ -37,41 +53,49 @@ "placeholder": "选择字体", "searchPlaceholder": "搜索字体…" }, + "customFontBold": { + "desc": "以粗体显示速度值。", + "label": "粗体" + }, "customFontItalic": { "desc": "以斜体显示速度值。", "label": "斜体" }, - "fontSizeModifier": { - "desc": "相对于默认值缩放文本大小。", - "label": "字体大小调整" + "useCustomColors": { + "desc": "启用自定义颜色,而非主题默认颜色。", + "label": "自定义颜色" }, - "horizontalLayout": { - "desc": "将TX和RX值并排显示,而不是堆叠。", - "label": "水平布局" + "colorTx": { + "desc": "超过阈值时的上传(TX)图标颜色。", + "label": "TX 活跃" }, - "iconSizeModifier": { - "desc": "相对于默认值缩放图标大小。", - "label": "图标大小调整" + "colorRx": { + "desc": "超过阈值时的下载(RX)图标颜色。", + "label": "RX 活跃" }, - "iconType": { - "desc": "选择用于 TX/RX 指示器的图标样式。", - "label": "图标类型" + "colorSilent": { + "desc": "当流量低于阈值时的图标颜色。", + "label": "非活跃" }, - "showNumbers": { - "desc": "以数字形式显示当前的 RX/TX 速度。", - "label": "显示数值" + "colorText": { + "desc": "速度值的文本颜色。", + "label": "文本" }, - "spacingInbetween": { - "desc": "调整RX/TX元素之间的间距。", - "label": "垂直间距" + "paddingLeft": { + "label": "左内边距", + "desc": "内容左侧的内边距。" }, - "useCustomColors": { - "desc": "启用自定义颜色,而非主题默认颜色。", - "label": "自定义颜色" + "paddingRight": { + "label": "右内边距", + "desc": "内容右侧的内边距。" }, - "useCustomFont": { - "desc": "覆盖速度值的默认字体。", - "label": "自定义字体" + "columnSpacing": { + "label": "列间距", + "desc": "网格布局中列之间的间距。" + }, + "rowSpacing": { + "label": "行间距", + "desc": "网格布局中行之间的间距(在水平布局中无效)。" } } } diff --git a/network-indicator/manifest.json b/network-indicator/manifest.json index ba44311cb..3cee05d13 100644 --- a/network-indicator/manifest.json +++ b/network-indicator/manifest.json @@ -1,17 +1,13 @@ { "id": "network-indicator", "name": "Network Indicator", - "version": "1.1.0", + "version": "2.0.0", "minNoctaliaVersion": "4.7.6", "author": "tonigineer", "license": "MIT", "repository": "https://github.com/noctalia-dev/noctalia-plugins", "description": "A `lively` network traffic indicator.", - "tags": [ - "Bar", - "Network", - "Indicator" - ], + "tags": ["Bar", "Network", "Indicator"], "entryPoints": { "barWidget": "BarWidget.qml", "panel": "Panel.qml", @@ -22,17 +18,20 @@ }, "metadata": { "defaultSettings": { - "arrowType": "caret", + "iconType": "caret", "byteThresholdActive": 5000, "fontSizeModifier": 0.75, "iconSizeModifier": 1.0, - "showNumbers": true, - "spacingInbetween": 0, "useCustomColors": false, "useCustomFont": false, "customFontBold": false, "customFontItalic": false, - "horizontalLayout": false + "columnSpacing": 0, + "rowSpacing": -8, + "paddingLeft": 5, + "paddingRight": 0, + "layout": "vertical", + "slots": ["txSpeed", "txIcon", "rxSpeed", "rxIcon"] } } } diff --git a/network-indicator/preview.png b/network-indicator/preview.png index 3244cdc68..de38727ff 100644 Binary files a/network-indicator/preview.png and b/network-indicator/preview.png differ