summaryrefslogtreecommitdiffhomepage
path: root/modules/luci-mod-dsl
diff options
context:
space:
mode:
Diffstat (limited to 'modules/luci-mod-dsl')
-rw-r--r--modules/luci-mod-dsl/Makefile16
-rw-r--r--modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js368
-rw-r--r--modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js63
-rw-r--r--modules/luci-mod-dsl/po/da/dsl.po76
-rw-r--r--modules/luci-mod-dsl/po/es/dsl.po83
-rw-r--r--modules/luci-mod-dsl/po/it/dsl.po71
-rw-r--r--modules/luci-mod-dsl/po/nb_NO/dsl.po83
-rw-r--r--modules/luci-mod-dsl/po/pl/dsl.po77
-rw-r--r--modules/luci-mod-dsl/po/pt/dsl.po77
-rw-r--r--modules/luci-mod-dsl/po/pt_BR/dsl.po77
-rw-r--r--modules/luci-mod-dsl/po/ro/dsl.po78
-rw-r--r--modules/luci-mod-dsl/po/ru/dsl.po75
-rw-r--r--modules/luci-mod-dsl/po/sv/dsl.po79
-rw-r--r--modules/luci-mod-dsl/po/templates/dsl.pot65
-rw-r--r--modules/luci-mod-dsl/po/uk/dsl.po68
-rw-r--r--modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json13
-rw-r--r--modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json10
17 files changed, 1379 insertions, 0 deletions
diff --git a/modules/luci-mod-dsl/Makefile b/modules/luci-mod-dsl/Makefile
new file mode 100644
index 0000000000..3d2b0c6056
--- /dev/null
+++ b/modules/luci-mod-dsl/Makefile
@@ -0,0 +1,16 @@
+#
+# Copyright (C) 2022 Roland Barenbrug <roland@treslong.com>
+#
+# This is free software, licensed under the Apache License, Version 2.0
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=LUCI DSL spectrum graph
+LUCI_DEPENDS:=+luci-base +ltq-dsl-base
+
+PKG_LICENSE:=Apache-2.0
+
+include ../../luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js b/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js
new file mode 100644
index 0000000000..ba0d590c18
--- /dev/null
+++ b/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js
@@ -0,0 +1,368 @@
+//
+// Rendering of DSL spectrum graphs showing
+// US/DS SNR and US/DS bits/tone
+//
+// This version does depend on an ubus version that support DSL line stattiscis but
+// does not depend on chart.js or any other package
+
+class DataSet {
+ constructor (input, extractFunction) {
+ this.groupSize = input.groupsize;
+ this.numData = input.groups;
+ // needs to be validated with various input
+ this.maxX = this.numData * this.groupSize;
+ this.data = input.data.map(extractFunction,
+ {groupSize: this.groupSize}
+ );
+ }
+}
+
+function myBitsFunction(value, index, array) {
+ return({x: index, y: value, error: false});
+}
+
+function mySnrFunction(value, index, array) {
+ let result;
+
+ if (value == null) {
+ result = {
+ x: index * this.groupSize,
+ y: -40 ,
+ error: true
+ }
+ } else {
+ result = {
+ x: index * this.groupSize,
+ y: value,
+ error: false
+ }
+ }
+
+ return(result);
+}
+
+function myQLNFunction(value, index, array) {
+ let result;
+
+ if (value == null) {
+ result = {
+ x: index * this.groupSize,
+ y: - 150,
+ error: true
+ }
+ } else {
+ result = {
+ x: index * this.groupSize,
+ y: value,
+ error: false
+ }
+ }
+
+ return(result);
+}
+
+function myHLOGFunction(value, index, array) {
+ let result;
+
+ if (value == null) {
+ result = {
+ x: index * this.groupSize,
+ y: -100,
+ error: true
+ }
+ } else {
+ result = {
+ x: index * this.groupSize,
+ y: value,
+ error: false
+ }
+ }
+
+ return(result);
+}
+
+const usSnrData = new DataSet(window.json['snr']['upstream'], mySnrFunction);
+const dsSnrData = new DataSet(window.json['snr']['downstream'], mySnrFunction);
+const usBitsData = new DataSet(window.json['bits']['upstream'], myBitsFunction);
+const dsBitsData = new DataSet(window.json['bits']['downstream'], myBitsFunction);
+const usQLNData = new DataSet(window.json['qln']['upstream'], myQLNFunction);
+const dsQLNData = new DataSet(window.json['qln']['downstream'], myQLNFunction);
+const usHLOGData = new DataSet(window.json['hlog']['upstream'], myHLOGFunction);
+const dsHLOGData = new DataSet(window.json['hlog']['downstream'], myHLOGFunction);
+
+const marginX = 50;
+const marginY = 80;
+let darkMode = document.getElementsByTagName("body")[0].parentNode.dataset.darkmode;
+
+let bitsChart = {
+ "config": {
+ "canvas": document.getElementById("bitsChart"),
+ "ctx" : document.getElementById("bitsChart").getContext("2d"),
+ "minX" : 0,
+ "maxX" : Math.max(dsBitsData.maxX, usBitsData.maxX),
+ "stepX": Math.max(dsBitsData.maxX, usBitsData.maxX) / 16,
+ "graphWidth" : document.getElementById("bitsChart").width - 2 * marginX,
+ "lineWidth" : 1,
+ "titleX" : _("Sub-carrier"),
+ "minY" : 0,
+ "maxY" : 16,
+ "stepY": 2,
+ "graphHeight" : document.getElementById("bitsChart").height - 2 * marginY,
+ "titleY" : _("bits")
+ },
+ "dataSet" : [
+ {
+ "data" :usBitsData.data,
+ "color":"YellowGreen",
+ "title": ("Upstream bits allocation")
+ },
+ {
+ "data" : dsBitsData.data,
+ "color": "navy",
+ "title": _("Downstream bits allocation")
+ }
+ ]
+};
+
+let dBChart = {
+ "config": {
+ "canvas": document.getElementById("dbChart"),
+ "ctx" : document.getElementById("dbChart").getContext("2d"),
+ "minX" : 0,
+ "maxX" : Math.max(dsSnrData.maxX, usSnrData.maxX),
+ "stepX": Math.max(dsSnrData.maxX, usSnrData.maxX) / 16,
+ "graphWidth" : document.getElementById("dbChart").width - 2 * marginX,
+ "lineWidth": 4,
+ "titleX" : _("Sub-carrier"),
+ "minY" : -40,
+ "maxY" : 100,
+ "stepY": 10,
+ "graphHeight" : document.getElementById("dbChart").height - 2 * marginY,
+ "titleY" : _("dB")
+ },
+ "dataSet" : [
+ {
+ "data" :usSnrData.data,
+ "color":"Turquoise",
+ "title": _("Upstream SNR")
+ },
+ {
+ "data" : dsSnrData.data,
+ "color": "Coral",
+ "title" : _("Downstream SNR")
+ }
+ ]
+};
+
+let qLNChart = {
+ "config": {
+ "canvas": document.getElementById("qlnChart"),
+ "ctx" : document.getElementById("qlnChart").getContext("2d"),
+ "minX" : 0,
+ "maxX" : Math.max(dsQLNData.maxX, usQLNData.maxX),
+ "stepX": Math.max(dsQLNData.maxX, usQLNData.maxX) / 16,
+ "graphWidth" : document.getElementById("qlnChart").width - 2 * marginX,
+ "lineWidth": 4,
+ "titleX" : _("Sub-carrier"),
+ "minY" : -150,
+ "maxY" : -20,
+ "stepY": 10,
+ "graphHeight" : document.getElementById("qlnChart").height - 2 * marginY,
+ "titleY" : _("dBm/Hz")
+ },
+ "dataSet" : [
+ {
+ "data" :usQLNData.data,
+ "color":"brown",
+ "title": _("Upstream QLN")
+ },
+ {
+ "data" : dsQLNData.data,
+ "color": "teal",
+ "title" : _("Downstream QLN")
+ }
+ ]
+};
+
+let hLogChart = {
+ "config": {
+ "canvas": document.getElementById("hlogChart"),
+ "ctx" : document.getElementById("hlogChart").getContext("2d"),
+ "minX" : 0,
+ "maxX" : Math.max(dsHLOGData.maxX, usHLOGData.maxX),
+ "stepX": Math.max(dsHLOGData.maxX, usHLOGData.maxX) / 16,
+ "graphWidth" : document.getElementById("hlogChart").width - 2 * marginX,
+ "lineWidth": 4,
+ "titleX" : _("Sub-carrier"),
+ "minY" : -100,
+ "maxY" : 14,
+ "stepY": 10,
+ "graphHeight" : document.getElementById("hlogChart").height - 2 * marginY,
+ "titleY" : _("dB")
+ },
+ "dataSet" : [
+ {
+ "data" :usHLOGData.data,
+ "color":"#E8E800",
+ "title": _("Upstream HLOG")
+ },
+ {
+ "data" : dsHLOGData.data,
+ "color": "darkmagenta",
+ "title" : _("Downstream HLOG")
+ }
+ ]
+};
+
+function drawChart (info) {
+ drawAxisX(info.config, info.config.minX, info.config.maxX, info.config.stepX, info.config.titleX);
+ drawAxisY(info.config, info.config.minY, info.config.maxY, info.config.stepY, info.config.titleY);
+
+ drawLegend(info.config, info.dataSet);
+
+ drawData(info.config, info.dataSet[0].data, info.dataSet[0].color);
+ drawData(info.config, info.dataSet[1].data, info.dataSet[1].color);
+}
+
+function drawBlocks(config, dataPoints, color, borders) {
+ borders.map(drawBlock, {config, dataPoints, color, borders});
+}
+
+function drawData(config, dataPoints, color) {
+ let ctx = config.ctx;
+ let len = dataPoints.length;
+ let minX =config.minX;
+ let maxX = config.maxX;
+ let minY = config.minY;
+ let maxY = config.maxY;
+ let startX = (dataPoints[0].x - config.minX) / (config.maxX - config.minX)
+ let startY = (config.minY - config.minY) / (config.maxY - config.minY)
+
+ ctx.fillStyle = color;
+ ctx.beginPath();
+ ctx.moveTo(startX * config.graphWidth + marginX, marginY + config.graphHeight - startY * config.graphHeight);
+
+ for (let i = 1 ; i < len ; i++) {
+ let relX = (dataPoints[i].x - minX) / (maxX - minX);
+ let relY = (dataPoints[i].y - minY) / (maxY - minY);
+ ctx.lineTo(relX * config.graphWidth + marginX, marginY + config.graphHeight - relY * config.graphHeight);
+ }
+
+ let endX = (dataPoints[len-1].x - minX) / (maxX - minX)
+ let endY = (config.minY - minY) / (maxY - minY)
+
+ ctx.lineTo(endX * config.graphWidth + marginX, marginY + config.graphHeight - endY * config.graphHeight);
+ ctx.lineTo(startX * config.graphWidth + marginX, marginY + config.graphHeight - startY * config.graphHeight);
+ ctx.closePath();
+ ctx.fill();
+}
+
+function drawLegend(config, dataSet){
+ let ctx = config.ctx;
+ let graphWidth = config.graphWidth;
+ let graphHeight = config.graphHeight;
+
+ ctx.font = "12px Arial";
+ ctx.fillStyle = dataSet[0].color;
+ ctx.fillRect(0.5 * graphWidth + marginX - ctx.measureText(dataSet[0].title).width - 50, config.canvas.height - marginY*1/4 - 8, 30, 10);
+ ctx.strokeStyle = "#C0C0C0";
+ ctx.strokeRect(0.5 * graphWidth + marginX - ctx.measureText(dataSet[0].title).width - 50, config.canvas.height - marginY*1/4 - 8, 30, 10);
+
+ if (darkMode == "true") {
+ ctx.strokeStyle = "#505050";
+ ctx.fillStyle = "#A0A0A0";
+ } else {
+ ctx.strokeStyle = "#303030";
+ ctx.fillStyle = "#303030";
+ }
+
+ ctx.textAlign = "right"
+ ctx.fillText(dataSet[0].title, 0.5 * graphWidth + marginX - 10, config.canvas.height - marginY*1/4);
+
+ ctx.fillStyle = dataSet[1].color;
+ ctx.fillRect(0.5 * graphWidth + marginX, config.canvas.height - marginY*1/4 - 8, 30, 10);
+ ctx.strokeStyle = "#C0C0C0";
+ ctx.strokeRect(0.5 * graphWidth + marginX, config.canvas.height - marginY*1/4 - 8, 30, 10);
+
+ if (darkMode == "true") {
+ ctx.fillStyle = "#A0A0A0";
+ } else {
+ ctx.fillStyle = "#303030";
+ }
+
+ ctx.textAlign = "left"
+ ctx.fillText(dataSet[1].title, 0.5 * graphWidth + marginX + 40, config.canvas.height - marginY*1/4);
+}
+
+function drawAxisX(config, minValue, maxValue, step, title) {
+ let ctx = config.ctx;
+ let graphWidth = config.graphWidth;
+ let graphHeight = config.graphHeight;
+
+ ctx.font = "12px Arial";
+ ctx.textAlign = "center";
+
+ if (darkMode == "true") {
+ ctx.strokeStyle = "#505050";
+ ctx.fillStyle = "#A0A0A0";
+ } else {
+ ctx.strokeStyle = "#E0E0E0";
+ ctx.fillStyle = "#303030";
+ }
+
+ for (let x = minValue ; x <= maxValue ; x=x+step) {
+ let relX = (x - config.minX) / (config.maxX - config.minX);
+
+ ctx.fillText(x , relX * graphWidth + marginX, config.canvas.height - marginY*3/4);
+
+ ctx.beginPath();
+ ctx.moveTo(relX * graphWidth + marginX, marginY);
+ ctx.lineTo(relX * graphWidth + marginX, config.canvas.height - marginY);
+ ctx.stroke();
+ }
+
+ ctx.font = "12px Arial";
+ ctx.textAlign = "center";
+ ctx.fillText(title, config.canvas.width/2, config.canvas.height - marginY*2/4);
+}
+
+function drawAxisY(config, minValue, maxValue, step, title) {
+ let ctx = config.ctx
+ let graphWidth = config.graphWidth;
+ let graphHeight = config.graphHeight;
+
+ ctx.font = "12px Arial";
+ ctx.textAlign = "center";
+
+ if (darkMode == "true") {
+ ctx.strokeStyle = "#505050";
+ ctx.fillStyle = "#A0A0A0";
+ } else {
+ ctx.strokeStyle = "#E0E0E0";
+ ctx.fillStyle = "#303030";
+ }
+
+ for (let y = minValue ; y <= maxValue ; y=y+step) {
+ let relY = (y - config.minY) / (config.maxY - config.minY);
+
+ ctx.fillText(y , marginX *2 / 3, marginY + graphHeight - relY * graphHeight + 4);
+
+ ctx.beginPath();
+ ctx.moveTo(marginX, marginY + graphHeight - relY * graphHeight );
+ ctx.lineTo(config.canvas.width - marginX, marginY + graphHeight - relY * graphHeight);
+ ctx.stroke();
+ }
+
+ ctx.font = "12px Arial";
+ ctx.textAlign = "center";
+ ctx.translate(marginX/3, marginY + graphHeight / 2);
+ ctx.rotate(-3.14 /2);
+ ctx.fillText(title, 0, 0);
+ ctx.rotate(3.14 /2)
+ ctx.translate(-marginX/3,-(marginY + graphHeight / 2));
+}
+
+drawChart(dBChart);
+drawChart(bitsChart);
+drawChart(qLNChart);
+drawChart(hLogChart);
diff --git a/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js b/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js
new file mode 100644
index 0000000000..83884daa84
--- /dev/null
+++ b/modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js
@@ -0,0 +1,63 @@
+'use strict';
+'require view';
+'require fs';
+'require ui';
+'require rpc';
+
+var callDSLStatistics = rpc.declare({
+ object: 'dsl',
+ method: 'statistics',
+ expect: { '': {} }
+});
+
+return view.extend({
+ load: function() {
+ return Promise.all([
+ callDSLStatistics()
+ ]);
+ },
+
+ render: function(data) {
+ window.json = data[0];
+
+ var v = E([], [
+ E('h2', {'style': "height: 40px"}, [ _('DSL line spectrum') ]),
+ E('p', {}, _('Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise and Channel characteristics function (HLOG) per sub-carrier.')),
+ E('div', {'style': "height: 360px; width: 1024px"},
+ E('canvas', {
+ 'id': 'dbChart',
+ 'height': 360,
+ 'width': 1024},
+ ["chart"])
+ ),
+ E('div', {'style': "height: 360px; width:1024px"},
+ E('canvas', {
+ 'id': 'bitsChart',
+ 'height': 360,
+ 'width': 1024},
+ ["chart2"])
+ ),
+ E('div', {'style': "height: 360px; width:1024px"},
+ E('canvas', {
+ 'id': 'qlnChart',
+ 'height': 360,
+ 'width': 1024},
+ ["chart2"])
+ ),
+ E('div', {'style': "height: 360px; width:1024px"},
+ E('canvas', {
+ 'id': 'hlogChart',
+ 'height': 360,
+ 'width': 1024},
+ ["chart2"])
+ ),
+ E('script', {'src':'/luci-static/resources/view/status/dsl/graph.js'}, {})
+ ]);
+
+ return v;
+ },
+
+ handleSaveApply: null,
+ handleSave: null,
+ handleReset: null
+});
diff --git a/modules/luci-mod-dsl/po/da/dsl.po b/modules/luci-mod-dsl/po/da/dsl.po
new file mode 100644
index 0000000000..f7e67d056c
--- /dev/null
+++ b/modules/luci-mod-dsl/po/da/dsl.po
@@ -0,0 +1,76 @@
+msgid ""
+msgstr ""
+"PO-Revision-Date: 2022-11-25 14:34+0000\n"
+"Last-Translator: drax red <drax@outlook.dk>\n"
+"Language-Team: Danish <https://hosted.weblate.org/projects/openwrt/"
+"luci_modules_luci-mod-dsl/da/>\n"
+"Language: da\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.15-dev\n"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24
+#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3
+msgid "DSL line spectrum"
+msgstr "DSL linje spektrum"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:212
+msgid "Downstream HLOG"
+msgstr "Downstream HLOG"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:182
+msgid "Downstream QLN"
+msgstr "Downstream QLN"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:152
+msgid "Downstream SNR"
+msgstr "Downstream SNR"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:122
+msgid "Downstream bits allocation"
+msgstr "Downstream bittildeling"
+
+#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3
+msgid "Grant access to luci-mod-dsl spectrum"
+msgstr "Giv adgang til luci-mod-dsl-spektrum"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25
+msgid ""
+"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise "
+"and Channel characteristics function (HLOG) per sub-carrier."
+msgstr ""
+"Nedenstående grafer viser signal-til-støj-forhold, bitallokering, stille "
+"linjestøj og kanalkarakteristikfunktion (HLOG) pr. sub-carrier."
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:106
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:136
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:166
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:196
+msgid "Sub-carrier"
+msgstr "Sub-carrier"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:207
+msgid "Upstream HLOG"
+msgstr "Upstream HLOG"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:177
+msgid "Upstream QLN"
+msgstr "Upstream QLN"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:147
+msgid "Upstream SNR"
+msgstr "Upstream SNR"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:111
+msgid "bits"
+msgstr "bits"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:141
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:201
+msgid "dB"
+msgstr "dB"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:171
+msgid "dBm/Hz"
+msgstr "dBm/Hz"
diff --git a/modules/luci-mod-dsl/po/es/dsl.po b/modules/luci-mod-dsl/po/es/dsl.po
new file mode 100644
index 0000000000..bf3a18dbe8
--- /dev/null
+++ b/modules/luci-mod-dsl/po/es/dsl.po
@@ -0,0 +1,83 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-11-04 20:04+0000\n"
+"PO-Revision-Date: 2022-11-07 09:03+0000\n"
+"Last-Translator: Franco Castillo <castillofrancodamian@gmail.com>\n"
+"Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/"
+"luci_modules_luci-mod-dsl/es/>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.14.2\n"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24
+#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3
+#, fuzzy
+msgid "DSL line spectrum"
+msgstr "Espectro de línea DSL"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:212
+msgid "Downstream HLOG"
+msgstr "HLOG descendente"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:182
+msgid "Downstream QLN"
+msgstr "QLN descendente"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:152
+msgid "Downstream SNR"
+msgstr "SNR descendente"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:122
+#, fuzzy
+msgid "Downstream bits allocation"
+msgstr "Asignación de bits descendente"
+
+#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3
+msgid "Grant access to luci-mod-dsl spectrum"
+msgstr "Otorgar acceso al espectro luci-mod-dsl"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25
+msgid ""
+"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise "
+"and Channel characteristics function (HLOG) per sub-carrier."
+msgstr ""
+"Los siguientes gráficos muestran la relación señal/ruido, la asignación de "
+"bits, el ruido de línea silenciosa y la función de características del canal "
+"(HLOG) por subportadora."
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:106
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:136
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:166
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:196
+msgid "Sub-carrier"
+msgstr "Subportadora"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:207
+msgid "Upstream HLOG"
+msgstr "HLOG ascendente"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:177
+msgid "Upstream QLN"
+msgstr "QLN ascendente"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:147
+msgid "Upstream SNR"
+msgstr "SNR ascendente"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:111
+msgid "bits"
+msgstr "bits"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:141
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:201
+msgid "dB"
+msgstr "dB"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:171
+msgid "dBm/Hz"
+msgstr "dBm/Hz"
diff --git a/modules/luci-mod-dsl/po/it/dsl.po b/modules/luci-mod-dsl/po/it/dsl.po
new file mode 100644
index 0000000000..0c2aa93de1
--- /dev/null
+++ b/modules/luci-mod-dsl/po/it/dsl.po
@@ -0,0 +1,71 @@
+msgid ""
+msgstr ""
+"Language: it\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24
+#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3
+msgid "DSL line spectrum"
+msgstr "Spettro della linea DSL"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:212
+msgid "Downstream HLOG"
+msgstr "HLOG in ricezione"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:182
+msgid "Downstream QLN"
+msgstr "QLN in ricezione"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:152
+msgid "Downstream SNR"
+msgstr "SNR in ricezione"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:122
+msgid "Downstream bits allocation"
+msgstr "Allocazione bit in ricezione"
+
+#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3
+msgid "Grant access to luci-mod-dsl spectrum"
+msgstr "Permetti l'accesso allo spettro luci-mod-dsl"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25
+msgid ""
+"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise "
+"and Channel characteristics function (HLOG) per sub-carrier."
+msgstr ""
+"I grafici sottostanti mostrano il rapporto segnale-rumore, l'allocazione "
+"bit, il rumore di fondo e la funzione carratteristica del canale (HLOG) per "
+"sottoportante."
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:106
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:136
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:166
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:196
+msgid "Sub-carrier"
+msgstr "Sottoportante"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:207
+msgid "Upstream HLOG"
+msgstr "HLOG in invio"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:177
+msgid "Upstream QLN"
+msgstr "QLN in invio"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:147
+msgid "Upstream SNR"
+msgstr "SNR in invio"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:111
+msgid "bits"
+msgstr "bits"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:141
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:201
+msgid "dB"
+msgstr "dB"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:171
+msgid "dBm/Hz"
+msgstr "dBm/Hz"
diff --git a/modules/luci-mod-dsl/po/nb_NO/dsl.po b/modules/luci-mod-dsl/po/nb_NO/dsl.po
new file mode 100644
index 0000000000..446aa39334
--- /dev/null
+++ b/modules/luci-mod-dsl/po/nb_NO/dsl.po
@@ -0,0 +1,83 @@
+msgid ""
+msgstr ""
+"PO-Revision-Date: 2022-11-07 09:03+0000\n"
+"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
+"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/openwrt/"
+"luci_modules_luci-mod-dsl/nb_NO/>\n"
+"Language: nb_NO\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.14.2\n"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24
+#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3
+msgid "DSL line spectrum"
+msgstr "DSL-linje-spektrum"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:212
+#, fuzzy
+msgid "Downstream HLOG"
+msgstr "Nedstrøms-HLOG"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:182
+#, fuzzy
+msgid "Downstream QLN"
+msgstr "Nedstrøms-QLN"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:152
+#, fuzzy
+msgid "Downstream SNR"
+msgstr "Nedstrøms-SNR"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:122
+#, fuzzy
+msgid "Downstream bits allocation"
+msgstr "Nedstrøms-bit-tildeldning"
+
+#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3
+msgid "Grant access to luci-mod-dsl spectrum"
+msgstr "Innvilg tilgang til luci-mod-dsl -spektrum"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25
+#, fuzzy
+msgid ""
+"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise "
+"and Channel characteristics function (HLOG) per sub-carrier."
+msgstr ""
+"Diagrammene nedenfor viser signal-til-støy-forhold, bit-tildeldning, ledig-"
+"linje-støy, og kanalkarakteristikkfunksjoner (HLOG) per underoperatør."
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:106
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:136
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:166
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:196
+#, fuzzy
+msgid "Sub-carrier"
+msgstr "Underoperatør"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:207
+msgid "Upstream HLOG"
+msgstr "Oppstrøms-HLOG"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:177
+msgid "Upstream QLN"
+msgstr "Oppstrøms-QLN"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:147
+msgid "Upstream SNR"
+msgstr "Oppstrøms-SNR"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:111
+#, fuzzy
+msgid "bits"
+msgstr "bit"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:141
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:201
+msgid "dB"
+msgstr "dB"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:171
+msgid "dBm/Hz"
+msgstr "dBm/Hz"
diff --git a/modules/luci-mod-dsl/po/pl/dsl.po b/modules/luci-mod-dsl/po/pl/dsl.po
new file mode 100644
index 0000000000..ece453998c
--- /dev/null
+++ b/modules/luci-mod-dsl/po/pl/dsl.po
@@ -0,0 +1,77 @@
+msgid ""
+msgstr ""
+"PO-Revision-Date: 2022-11-07 09:03+0000\n"
+"Last-Translator: Matthaiks <kitynska@gmail.com>\n"
+"Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/"
+"luci_modules_luci-mod-dsl/pl/>\n"
+"Language: pl\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.14.2\n"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24
+#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3
+msgid "DSL line spectrum"
+msgstr "Widmo linii DSL"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:212
+msgid "Downstream HLOG"
+msgstr "HLOG przepustowości do abonamenta"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:182
+msgid "Downstream QLN"
+msgstr "QLN przepustowości do abonamenta"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:152
+msgid "Downstream SNR"
+msgstr "SNR przepustowości do abonamenta"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:122
+msgid "Downstream bits allocation"
+msgstr "Alokacja bitów przepustowości do abonamenta"
+
+#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3
+msgid "Grant access to luci-mod-dsl spectrum"
+msgstr "Przyznaj dostęp do widma luci-mod-dsl"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25
+msgid ""
+"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise "
+"and Channel characteristics function (HLOG) per sub-carrier."
+msgstr ""
+"Wykresy poniżej pokazują stosunek sygnału do szumu, przydział bitów, szum "
+"cichej linii i funkcję charakterystyki kanału (HLOG) dla każdej podnośnej."
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:106
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:136
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:166
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:196
+msgid "Sub-carrier"
+msgstr "Podnośna"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:207
+msgid "Upstream HLOG"
+msgstr "HLOG przepustowości od abonamenta"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:177
+msgid "Upstream QLN"
+msgstr "QLN przepustowości od abonamenta"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:147
+msgid "Upstream SNR"
+msgstr "SNR przepustowości od abonamenta"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:111
+msgid "bits"
+msgstr "bity"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:141
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:201
+msgid "dB"
+msgstr "dB"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:171
+msgid "dBm/Hz"
+msgstr "dBm/Hz"
diff --git a/modules/luci-mod-dsl/po/pt/dsl.po b/modules/luci-mod-dsl/po/pt/dsl.po
new file mode 100644
index 0000000000..6d4c623cdf
--- /dev/null
+++ b/modules/luci-mod-dsl/po/pt/dsl.po
@@ -0,0 +1,77 @@
+msgid ""
+msgstr ""
+"PO-Revision-Date: 2022-11-30 14:48+0000\n"
+"Last-Translator: Gonçalo Pereira <goncalo_pereira@outlook.pt>\n"
+"Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/"
+"luci_modules_luci-mod-dsl/pt/>\n"
+"Language: pt\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 4.15-dev\n"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24
+#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3
+msgid "DSL line spectrum"
+msgstr "Espectro de linha DSL"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:212
+msgid "Downstream HLOG"
+msgstr "HLOG a jusante"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:182
+msgid "Downstream QLN"
+msgstr "QLN a jusante"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:152
+msgid "Downstream SNR"
+msgstr "SNR a jusante"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:122
+msgid "Downstream bits allocation"
+msgstr "Alocação de bits a jusante"
+
+#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3
+msgid "Grant access to luci-mod-dsl spectrum"
+msgstr "Conceder acesso ao espectro luci-mod-dsl"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25
+msgid ""
+"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise "
+"and Channel characteristics function (HLOG) per sub-carrier."
+msgstr ""
+"Gráficos abaixo mostram relação sinal-ruído, alocação de bits, ruído de "
+"linha silenciosa e função de características do canal (HLOG) por sub-"
+"portadora."
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:106
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:136
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:166
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:196
+msgid "Sub-carrier"
+msgstr "Subportadora"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:207
+msgid "Upstream HLOG"
+msgstr "HLOG a montante"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:177
+msgid "Upstream QLN"
+msgstr "QLN a montante"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:147
+msgid "Upstream SNR"
+msgstr "SNR a montante"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:111
+msgid "bits"
+msgstr "bits"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:141
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:201
+msgid "dB"
+msgstr "dB"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:171
+msgid "dBm/Hz"
+msgstr "dBm/Hz"
diff --git a/modules/luci-mod-dsl/po/pt_BR/dsl.po b/modules/luci-mod-dsl/po/pt_BR/dsl.po
new file mode 100644
index 0000000000..f99977a8f5
--- /dev/null
+++ b/modules/luci-mod-dsl/po/pt_BR/dsl.po
@@ -0,0 +1,77 @@
+msgid ""
+msgstr ""
+"PO-Revision-Date: 2022-11-08 01:55+0000\n"
+"Last-Translator: Wellington Terumi Uemura <wellingtonuemura@gmail.com>\n"
+"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
+"openwrt/luci_modules_luci-mod-dsl/pt_BR/>\n"
+"Language: pt_BR\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 4.14.2\n"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24
+#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3
+msgid "DSL line spectrum"
+msgstr "Espectro da linha DSL"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:212
+msgid "Downstream HLOG"
+msgstr "HLOG do downstream"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:182
+msgid "Downstream QLN"
+msgstr "Downstream QLN"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:152
+msgid "Downstream SNR"
+msgstr "Downstream SNR"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:122
+msgid "Downstream bits allocation"
+msgstr "Alocação de bits do downstream"
+
+#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3
+msgid "Grant access to luci-mod-dsl spectrum"
+msgstr "Conceda acesso ao espectro luci-mod-dsl"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25
+msgid ""
+"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise "
+"and Channel characteristics function (HLOG) per sub-carrier."
+msgstr ""
+"Os gráficos abaixo mostram a relação sinal-ruído, alocação dos bits, ruído "
+"da linha silenciosa e a função das características de canal (HLOG) por "
+"subportadora."
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:106
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:136
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:166
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:196
+msgid "Sub-carrier"
+msgstr "Subportadora"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:207
+msgid "Upstream HLOG"
+msgstr "Upstream HLOG"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:177
+msgid "Upstream QLN"
+msgstr "Upstream QLN"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:147
+msgid "Upstream SNR"
+msgstr "Upstream SNR"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:111
+msgid "bits"
+msgstr "bits"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:141
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:201
+msgid "dB"
+msgstr "dB"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:171
+msgid "dBm/Hz"
+msgstr "dBm/Hz"
diff --git a/modules/luci-mod-dsl/po/ro/dsl.po b/modules/luci-mod-dsl/po/ro/dsl.po
new file mode 100644
index 0000000000..5215c0beac
--- /dev/null
+++ b/modules/luci-mod-dsl/po/ro/dsl.po
@@ -0,0 +1,78 @@
+msgid ""
+msgstr ""
+"PO-Revision-Date: 2022-11-17 11:47+0000\n"
+"Last-Translator: Mircea Vutcovici <mirceavutcovici@gmail.com>\n"
+"Language-Team: Romanian <https://hosted.weblate.org/projects/openwrt/"
+"luci_modules_luci-mod-dsl/ro/>\n"
+"Language: ro\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
+"20)) ? 1 : 2;\n"
+"X-Generator: Weblate 4.15-dev\n"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24
+#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3
+msgid "DSL line spectrum"
+msgstr "Spectrul liniei DSL"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:212
+msgid "Downstream HLOG"
+msgstr "HLOG în aval"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:182
+msgid "Downstream QLN"
+msgstr "QLN în aval"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:152
+msgid "Downstream SNR"
+msgstr "SNR în aval"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:122
+msgid "Downstream bits allocation"
+msgstr "Alocarea de biți în aval"
+
+#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3
+msgid "Grant access to luci-mod-dsl spectrum"
+msgstr "Acordă acces la spectrul luci-mod-dsl"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25
+msgid ""
+"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise "
+"and Channel characteristics function (HLOG) per sub-carrier."
+msgstr ""
+"Graficele de mai jos arată Raportul semnal-zgomot, Alocarea de biți, "
+"Zgomotul de linie liniștită și Funcția caracteristică a canalului (HLOG) "
+"pentru fiecare subpurtătoare."
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:106
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:136
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:166
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:196
+msgid "Sub-carrier"
+msgstr "Subpurtătoare"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:207
+msgid "Upstream HLOG"
+msgstr "HLOG în amonte"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:177
+msgid "Upstream QLN"
+msgstr "QLN în amonte"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:147
+msgid "Upstream SNR"
+msgstr "SNR în amonte"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:111
+msgid "bits"
+msgstr "biți"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:141
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:201
+msgid "dB"
+msgstr "dB"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:171
+msgid "dBm/Hz"
+msgstr "dBm/Hz"
diff --git a/modules/luci-mod-dsl/po/ru/dsl.po b/modules/luci-mod-dsl/po/ru/dsl.po
new file mode 100644
index 0000000000..253cb4700c
--- /dev/null
+++ b/modules/luci-mod-dsl/po/ru/dsl.po
@@ -0,0 +1,75 @@
+msgid ""
+msgstr ""
+"PO-Revision-Date: 2022-12-06 01:48+0000\n"
+"Last-Translator: Wolterhon <hotmottot.1@gmail.com>\n"
+"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
+"luci_modules_luci-mod-dsl/ru/>\n"
+"Language: ru\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.15-dev\n"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24
+#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3
+msgid "DSL line spectrum"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:212
+msgid "Downstream HLOG"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:182
+msgid "Downstream QLN"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:152
+msgid "Downstream SNR"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:122
+msgid "Downstream bits allocation"
+msgstr ""
+
+#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3
+msgid "Grant access to luci-mod-dsl spectrum"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25
+msgid ""
+"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise "
+"and Channel characteristics function (HLOG) per sub-carrier."
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:106
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:136
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:166
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:196
+msgid "Sub-carrier"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:207
+msgid "Upstream HLOG"
+msgstr "Входящий поток HLOG"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:177
+msgid "Upstream QLN"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:147
+msgid "Upstream SNR"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:111
+msgid "bits"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:141
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:201
+msgid "dB"
+msgstr "дБ"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:171
+msgid "dBm/Hz"
+msgstr ""
diff --git a/modules/luci-mod-dsl/po/sv/dsl.po b/modules/luci-mod-dsl/po/sv/dsl.po
new file mode 100644
index 0000000000..91f942b032
--- /dev/null
+++ b/modules/luci-mod-dsl/po/sv/dsl.po
@@ -0,0 +1,79 @@
+msgid ""
+msgstr ""
+"PO-Revision-Date: 2022-12-06 01:48+0000\n"
+"Last-Translator: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>\n"
+"Language-Team: Swedish <https://hosted.weblate.org/projects/openwrt/"
+"luci_modules_luci-mod-dsl/sv/>\n"
+"Language: sv\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.15-dev\n"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24
+#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3
+#, fuzzy
+msgid "DSL line spectrum"
+msgstr "Spektrum för DSL-lina"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:212
+msgid "Downstream HLOG"
+msgstr "Nedströms-HLOG"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:182
+msgid "Downstream QLN"
+msgstr "Nedströms-QLN"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:152
+msgid "Downstream SNR"
+msgstr "Nedströms-SNR"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:122
+msgid "Downstream bits allocation"
+msgstr "Bit-tilldelning nedströms"
+
+#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3
+#, fuzzy
+msgid "Grant access to luci-mod-dsl spectrum"
+msgstr "Ge åtkomst till spektrumet för luci-mod-dsl"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25
+#, fuzzy
+msgid ""
+"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise "
+"and Channel characteristics function (HLOG) per sub-carrier."
+msgstr ""
+"Diagrammerna nedan visar signal-till-brusförhållande, Bit-tilldelning, Tyst "
+"linjebrus och kanalens karaktäristiska funktion (HLOG) per under-leverantör."
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:106
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:136
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:166
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:196
+msgid "Sub-carrier"
+msgstr "Underoperatör"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:207
+msgid "Upstream HLOG"
+msgstr "Uppströms-HLOG"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:177
+msgid "Upstream QLN"
+msgstr "Uppströms QLN"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:147
+msgid "Upstream SNR"
+msgstr "Uppströms SNR"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:111
+msgid "bits"
+msgstr "bitar"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:141
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:201
+msgid "dB"
+msgstr "dB"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:171
+msgid "dBm/Hz"
+msgstr "dBm/Hz"
diff --git a/modules/luci-mod-dsl/po/templates/dsl.pot b/modules/luci-mod-dsl/po/templates/dsl.pot
new file mode 100644
index 0000000000..90a8657ab7
--- /dev/null
+++ b/modules/luci-mod-dsl/po/templates/dsl.pot
@@ -0,0 +1,65 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24
+#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3
+msgid "DSL line spectrum"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:212
+msgid "Downstream HLOG"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:182
+msgid "Downstream QLN"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:152
+msgid "Downstream SNR"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:122
+msgid "Downstream bits allocation"
+msgstr ""
+
+#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3
+msgid "Grant access to luci-mod-dsl spectrum"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25
+msgid ""
+"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise "
+"and Channel characteristics function (HLOG) per sub-carrier."
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:106
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:136
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:166
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:196
+msgid "Sub-carrier"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:207
+msgid "Upstream HLOG"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:177
+msgid "Upstream QLN"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:147
+msgid "Upstream SNR"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:111
+msgid "bits"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:141
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:201
+msgid "dB"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:171
+msgid "dBm/Hz"
+msgstr ""
diff --git a/modules/luci-mod-dsl/po/uk/dsl.po b/modules/luci-mod-dsl/po/uk/dsl.po
new file mode 100644
index 0000000000..94822bce15
--- /dev/null
+++ b/modules/luci-mod-dsl/po/uk/dsl.po
@@ -0,0 +1,68 @@
+msgid ""
+msgstr ""
+"Language: uk\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:24
+#: modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json:3
+msgid "DSL line spectrum"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:212
+msgid "Downstream HLOG"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:182
+msgid "Downstream QLN"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:152
+msgid "Downstream SNR"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:122
+msgid "Downstream bits allocation"
+msgstr ""
+
+#: modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json:3
+msgid "Grant access to luci-mod-dsl spectrum"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/spectrum.js:25
+msgid ""
+"Graphs below show Signal-to-noise ratio, Bit allocation, Quiet line noise "
+"and Channel characteristics function (HLOG) per sub-carrier."
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:106
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:136
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:166
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:196
+msgid "Sub-carrier"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:207
+msgid "Upstream HLOG"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:177
+msgid "Upstream QLN"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:147
+msgid "Upstream SNR"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:111
+msgid "bits"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:141
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:201
+msgid "dB"
+msgstr ""
+
+#: modules/luci-mod-dsl/htdocs/luci-static/resources/view/status/dsl/graph.js:171
+msgid "dBm/Hz"
+msgstr ""
diff --git a/modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json b/modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json
new file mode 100644
index 0000000000..76d56fd6d5
--- /dev/null
+++ b/modules/luci-mod-dsl/root/usr/share/luci/menu.d/luci-mod-dsl.json
@@ -0,0 +1,13 @@
+{
+ "admin/status/dsl": {
+ "title": "DSL line spectrum",
+ "order": 7,
+ "action": {
+ "type": "view",
+ "path": "status/dsl/spectrum"
+ },
+ "depends": {
+ "acl": [ "luci-mod-dsl-spectrum" ]
+ }
+ }
+}
diff --git a/modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json b/modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json
new file mode 100644
index 0000000000..7a5b6fcf4b
--- /dev/null
+++ b/modules/luci-mod-dsl/root/usr/share/rpcd/acl.d/luci-mod-dsl.json
@@ -0,0 +1,10 @@
+{
+ "luci-mod-dsl-spectrum": {
+ "description": "Grant access to luci-mod-dsl spectrum",
+ "read": {
+ "ubus": {
+ "dsl": [ "statistics" ]
+ }
+ }
+ }
+}