From 7546c24e80a034cf6a72e70eec8bee041645eae2 Mon Sep 17 00:00:00 2001 From: Florian Gail Date: Sun, 12 Jul 2026 11:49:09 +0200 Subject: [PATCH 1/2] Translate palette labels and fallback names via the message catalog Route each node's paletteLabel and the empty-name fallback label through this._() so they resolve from the i18n catalog instead of hard-coded strings. Add paletteLabel and label.fallback keys (en-US + de) per node; the universe fallback interpolates via {{universe}}. --- dist/nodes/sacn-in/locales/de/sacn-in.json | 2 ++ dist/nodes/sacn-in/locales/en-US/sacn-in.json | 2 ++ dist/nodes/sacn-in/sacn-in.html | 6 ++++-- dist/nodes/sacn-out/locales/de/sacn-out.json | 2 ++ dist/nodes/sacn-out/locales/en-US/sacn-out.json | 2 ++ dist/nodes/sacn-out/sacn-out.html | 6 ++++-- .../nodes/scene-controller/locales/de/scene-controller.json | 2 ++ .../scene-controller/locales/en-US/scene-controller.json | 2 ++ dist/nodes/scene-controller/scene-controller.html | 6 ++++-- src/nodes/sacn-in/init.ts | 6 ++++-- src/nodes/sacn-in/locales/de.json | 2 ++ src/nodes/sacn-in/locales/en-US.json | 2 ++ src/nodes/sacn-out/init.ts | 6 ++++-- src/nodes/sacn-out/locales/de.json | 2 ++ src/nodes/sacn-out/locales/en-US.json | 2 ++ src/nodes/scene-controller/init.ts | 6 ++++-- src/nodes/scene-controller/locales/de.json | 2 ++ src/nodes/scene-controller/locales/en-US.json | 2 ++ 18 files changed, 48 insertions(+), 12 deletions(-) diff --git a/dist/nodes/sacn-in/locales/de/sacn-in.json b/dist/nodes/sacn-in/locales/de/sacn-in.json index 0ac2f79..1c10812 100644 --- a/dist/nodes/sacn-in/locales/de/sacn-in.json +++ b/dist/nodes/sacn-in/locales/de/sacn-in.json @@ -1,6 +1,8 @@ { "sacn-in": { + "paletteLabel": "sACN Eingang", "label": { + "fallback": "sACN Eingang · U{{universe}}", "interface": "IP-Adresse des Interfaces", "mode": "Modus", "mode_direct": "Direkt", diff --git a/dist/nodes/sacn-in/locales/en-US/sacn-in.json b/dist/nodes/sacn-in/locales/en-US/sacn-in.json index bf870e0..484d640 100644 --- a/dist/nodes/sacn-in/locales/en-US/sacn-in.json +++ b/dist/nodes/sacn-in/locales/en-US/sacn-in.json @@ -1,6 +1,8 @@ { "sacn-in": { + "paletteLabel": "sACN in", "label": { + "fallback": "sACN in · U{{universe}}", "interface": "IP-address of interface", "mode": "mode", "mode_direct": "direct", diff --git a/dist/nodes/sacn-in/sacn-in.html b/dist/nodes/sacn-in/sacn-in.html index 4f15d62..247bb3b 100644 --- a/dist/nodes/sacn-in/sacn-in.html +++ b/dist/nodes/sacn-in/sacn-in.html @@ -268,10 +268,12 @@

References

}, inputs: 1, outputs: 1, - paletteLabel: "sACN in", + paletteLabel: function () { + return this._("sacn-in.paletteLabel"); + }, icon: "sacn-in.svg", label: function () { - return this.name || `sACN in · U${this.universe}`; + return this.name || this._("sacn-in.label.fallback", { universe: this.universe }); }, labelStyle: function () { return this.name ? "node_label_italic" : ""; diff --git a/dist/nodes/sacn-out/locales/de/sacn-out.json b/dist/nodes/sacn-out/locales/de/sacn-out.json index 80a05ec..0254c69 100644 --- a/dist/nodes/sacn-out/locales/de/sacn-out.json +++ b/dist/nodes/sacn-out/locales/de/sacn-out.json @@ -1,6 +1,8 @@ { "sacn-out": { + "paletteLabel": "sACN Ausgang", "label": { + "fallback": "sACN Ausgang · U{{universe}}", "interface": "IP-Adresse des Interfaces", "port": "Port", "priority": "Priorität", diff --git a/dist/nodes/sacn-out/locales/en-US/sacn-out.json b/dist/nodes/sacn-out/locales/en-US/sacn-out.json index 425c6cb..a773418 100644 --- a/dist/nodes/sacn-out/locales/en-US/sacn-out.json +++ b/dist/nodes/sacn-out/locales/en-US/sacn-out.json @@ -1,6 +1,8 @@ { "sacn-out": { + "paletteLabel": "sACN out", "label": { + "fallback": "sACN out · U{{universe}}", "interface": "IP-address of interface", "port": "port", "priority": "priority", diff --git a/dist/nodes/sacn-out/sacn-out.html b/dist/nodes/sacn-out/sacn-out.html index 8fdfda5..0c1d65f 100644 --- a/dist/nodes/sacn-out/sacn-out.html +++ b/dist/nodes/sacn-out/sacn-out.html @@ -209,10 +209,12 @@

References

}, inputs: 1, outputs: 0, - paletteLabel: "sACN out", + paletteLabel: function () { + return this._("sacn-out.paletteLabel"); + }, icon: "sacn-out.svg", label: function () { - return this.name || `sACN out · U${this.universe}`; + return this.name || this._("sacn-out.label.fallback", { universe: this.universe }); }, labelStyle: function () { return this.name ? "node_label_italic" : ""; diff --git a/dist/nodes/scene-controller/locales/de/scene-controller.json b/dist/nodes/scene-controller/locales/de/scene-controller.json index dbd233b..ecbf2e7 100644 --- a/dist/nodes/scene-controller/locales/de/scene-controller.json +++ b/dist/nodes/scene-controller/locales/de/scene-controller.json @@ -1,6 +1,8 @@ { "scene-controller": { + "paletteLabel": "Szenen-Controller", "label": { + "fallback": "Szenen-Controller", "values": "Werte", "values_percent": "Prozent (0–100)", "values_absolute": "Absolut (0–255)" diff --git a/dist/nodes/scene-controller/locales/en-US/scene-controller.json b/dist/nodes/scene-controller/locales/en-US/scene-controller.json index 579358a..7148fec 100644 --- a/dist/nodes/scene-controller/locales/en-US/scene-controller.json +++ b/dist/nodes/scene-controller/locales/en-US/scene-controller.json @@ -1,6 +1,8 @@ { "scene-controller": { + "paletteLabel": "Scene-Controller", "label": { + "fallback": "Scene-Controller", "values": "values", "values_percent": "percent (0–100)", "values_absolute": "absolute (0–255)" diff --git a/dist/nodes/scene-controller/scene-controller.html b/dist/nodes/scene-controller/scene-controller.html index 812dccd..4cab07b 100644 --- a/dist/nodes/scene-controller/scene-controller.html +++ b/dist/nodes/scene-controller/scene-controller.html @@ -94,10 +94,12 @@

References

}, inputs: 1, outputs: 1, - paletteLabel: "Scene-Controller", + paletteLabel: function () { + return this._("scene-controller.paletteLabel"); + }, icon: "scene-controller.svg", label: function () { - return this.name || "Scene-Controller"; + return this.name || this._("scene-controller.label.fallback"); }, labelStyle: function () { return this.name ? "node_label_italic" : ""; diff --git a/src/nodes/sacn-in/init.ts b/src/nodes/sacn-in/init.ts index 2c5607f..55cc8f7 100644 --- a/src/nodes/sacn-in/init.ts +++ b/src/nodes/sacn-in/init.ts @@ -118,10 +118,12 @@ const def: EditorNodeDef = { }, inputs: 1, outputs: 1, - paletteLabel: "sACN in", + paletteLabel: function () { + return this._("sacn-in.paletteLabel"); + }, icon: "sacn-in.svg", label: function () { - return this.name || `sACN in · U${this.universe}`; + return this.name || this._("sacn-in.label.fallback", { universe: this.universe }); }, labelStyle: function () { return this.name ? "node_label_italic" : ""; diff --git a/src/nodes/sacn-in/locales/de.json b/src/nodes/sacn-in/locales/de.json index 718e366..ce1ae67 100644 --- a/src/nodes/sacn-in/locales/de.json +++ b/src/nodes/sacn-in/locales/de.json @@ -1,5 +1,7 @@ { + "paletteLabel": "sACN Eingang", "label": { + "fallback": "sACN Eingang · U{{universe}}", "interface": "IP-Adresse des Interfaces", "mode": "Modus", "mode_direct": "Direkt", diff --git a/src/nodes/sacn-in/locales/en-US.json b/src/nodes/sacn-in/locales/en-US.json index d9bd63d..77c3f8f 100644 --- a/src/nodes/sacn-in/locales/en-US.json +++ b/src/nodes/sacn-in/locales/en-US.json @@ -1,5 +1,7 @@ { + "paletteLabel": "sACN in", "label": { + "fallback": "sACN in · U{{universe}}", "interface": "IP-address of interface", "mode": "mode", "mode_direct": "direct", diff --git a/src/nodes/sacn-out/init.ts b/src/nodes/sacn-out/init.ts index 58a50a0..ecc312f 100644 --- a/src/nodes/sacn-out/init.ts +++ b/src/nodes/sacn-out/init.ts @@ -113,10 +113,12 @@ const def: EditorNodeDef = { }, inputs: 1, outputs: 0, - paletteLabel: "sACN out", + paletteLabel: function () { + return this._("sacn-out.paletteLabel"); + }, icon: "sacn-out.svg", label: function () { - return this.name || `sACN out · U${this.universe}`; + return this.name || this._("sacn-out.label.fallback", { universe: this.universe }); }, labelStyle: function () { return this.name ? "node_label_italic" : ""; diff --git a/src/nodes/sacn-out/locales/de.json b/src/nodes/sacn-out/locales/de.json index 9f9db0c..a016d0e 100644 --- a/src/nodes/sacn-out/locales/de.json +++ b/src/nodes/sacn-out/locales/de.json @@ -1,5 +1,7 @@ { + "paletteLabel": "sACN Ausgang", "label": { + "fallback": "sACN Ausgang · U{{universe}}", "interface": "IP-Adresse des Interfaces", "port": "Port", "priority": "Priorität", diff --git a/src/nodes/sacn-out/locales/en-US.json b/src/nodes/sacn-out/locales/en-US.json index 631a9aa..a98df4c 100644 --- a/src/nodes/sacn-out/locales/en-US.json +++ b/src/nodes/sacn-out/locales/en-US.json @@ -1,5 +1,7 @@ { + "paletteLabel": "sACN out", "label": { + "fallback": "sACN out · U{{universe}}", "interface": "IP-address of interface", "port": "port", "priority": "priority", diff --git a/src/nodes/scene-controller/init.ts b/src/nodes/scene-controller/init.ts index a845323..d75df3a 100644 --- a/src/nodes/scene-controller/init.ts +++ b/src/nodes/scene-controller/init.ts @@ -20,10 +20,12 @@ const def: EditorNodeDef = { }, inputs: 1, outputs: 1, - paletteLabel: "Scene-Controller", + paletteLabel: function () { + return this._("scene-controller.paletteLabel"); + }, icon: "scene-controller.svg", label: function () { - return this.name || "Scene-Controller"; + return this.name || this._("scene-controller.label.fallback"); }, labelStyle: function () { return this.name ? "node_label_italic" : ""; diff --git a/src/nodes/scene-controller/locales/de.json b/src/nodes/scene-controller/locales/de.json index 238deef..7be2547 100644 --- a/src/nodes/scene-controller/locales/de.json +++ b/src/nodes/scene-controller/locales/de.json @@ -1,5 +1,7 @@ { + "paletteLabel": "Szenen-Controller", "label": { + "fallback": "Szenen-Controller", "values": "Werte", "values_percent": "Prozent (0–100)", "values_absolute": "Absolut (0–255)" diff --git a/src/nodes/scene-controller/locales/en-US.json b/src/nodes/scene-controller/locales/en-US.json index 312a78c..f4026ea 100644 --- a/src/nodes/scene-controller/locales/en-US.json +++ b/src/nodes/scene-controller/locales/en-US.json @@ -1,5 +1,7 @@ { + "paletteLabel": "Scene-Controller", "label": { + "fallback": "Scene-Controller", "values": "values", "values_percent": "percent (0–100)", "values_absolute": "absolute (0–255)" From 17941a978792a5c03750625b9c438daf80d89b22 Mon Sep 17 00:00:00 2001 From: Florian Gail Date: Sun, 12 Jul 2026 16:04:28 +0200 Subject: [PATCH 2/2] Use Node-RED interpolation syntax for the universe in node labels Node-RED configures i18next with __var__ interpolation delimiters, not the i18next default {{var}}. The universe placeholder in the sacn-in and sacn-out fallback labels therefore rendered literally instead of being substituted. --- dist/nodes/sacn-in/locales/de/sacn-in.json | 2 +- dist/nodes/sacn-in/locales/en-US/sacn-in.json | 2 +- dist/nodes/sacn-out/locales/de/sacn-out.json | 2 +- dist/nodes/sacn-out/locales/en-US/sacn-out.json | 2 +- src/nodes/sacn-in/locales/de.json | 2 +- src/nodes/sacn-in/locales/en-US.json | 2 +- src/nodes/sacn-out/locales/de.json | 2 +- src/nodes/sacn-out/locales/en-US.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dist/nodes/sacn-in/locales/de/sacn-in.json b/dist/nodes/sacn-in/locales/de/sacn-in.json index 1c10812..94268e7 100644 --- a/dist/nodes/sacn-in/locales/de/sacn-in.json +++ b/dist/nodes/sacn-in/locales/de/sacn-in.json @@ -2,7 +2,7 @@ "sacn-in": { "paletteLabel": "sACN Eingang", "label": { - "fallback": "sACN Eingang · U{{universe}}", + "fallback": "sACN Eingang · U__universe__", "interface": "IP-Adresse des Interfaces", "mode": "Modus", "mode_direct": "Direkt", diff --git a/dist/nodes/sacn-in/locales/en-US/sacn-in.json b/dist/nodes/sacn-in/locales/en-US/sacn-in.json index 484d640..a913663 100644 --- a/dist/nodes/sacn-in/locales/en-US/sacn-in.json +++ b/dist/nodes/sacn-in/locales/en-US/sacn-in.json @@ -2,7 +2,7 @@ "sacn-in": { "paletteLabel": "sACN in", "label": { - "fallback": "sACN in · U{{universe}}", + "fallback": "sACN in · U__universe__", "interface": "IP-address of interface", "mode": "mode", "mode_direct": "direct", diff --git a/dist/nodes/sacn-out/locales/de/sacn-out.json b/dist/nodes/sacn-out/locales/de/sacn-out.json index 0254c69..093ad49 100644 --- a/dist/nodes/sacn-out/locales/de/sacn-out.json +++ b/dist/nodes/sacn-out/locales/de/sacn-out.json @@ -2,7 +2,7 @@ "sacn-out": { "paletteLabel": "sACN Ausgang", "label": { - "fallback": "sACN Ausgang · U{{universe}}", + "fallback": "sACN Ausgang · U__universe__", "interface": "IP-Adresse des Interfaces", "port": "Port", "priority": "Priorität", diff --git a/dist/nodes/sacn-out/locales/en-US/sacn-out.json b/dist/nodes/sacn-out/locales/en-US/sacn-out.json index a773418..18ee038 100644 --- a/dist/nodes/sacn-out/locales/en-US/sacn-out.json +++ b/dist/nodes/sacn-out/locales/en-US/sacn-out.json @@ -2,7 +2,7 @@ "sacn-out": { "paletteLabel": "sACN out", "label": { - "fallback": "sACN out · U{{universe}}", + "fallback": "sACN out · U__universe__", "interface": "IP-address of interface", "port": "port", "priority": "priority", diff --git a/src/nodes/sacn-in/locales/de.json b/src/nodes/sacn-in/locales/de.json index ce1ae67..0b3aabe 100644 --- a/src/nodes/sacn-in/locales/de.json +++ b/src/nodes/sacn-in/locales/de.json @@ -1,7 +1,7 @@ { "paletteLabel": "sACN Eingang", "label": { - "fallback": "sACN Eingang · U{{universe}}", + "fallback": "sACN Eingang · U__universe__", "interface": "IP-Adresse des Interfaces", "mode": "Modus", "mode_direct": "Direkt", diff --git a/src/nodes/sacn-in/locales/en-US.json b/src/nodes/sacn-in/locales/en-US.json index 77c3f8f..80a622a 100644 --- a/src/nodes/sacn-in/locales/en-US.json +++ b/src/nodes/sacn-in/locales/en-US.json @@ -1,7 +1,7 @@ { "paletteLabel": "sACN in", "label": { - "fallback": "sACN in · U{{universe}}", + "fallback": "sACN in · U__universe__", "interface": "IP-address of interface", "mode": "mode", "mode_direct": "direct", diff --git a/src/nodes/sacn-out/locales/de.json b/src/nodes/sacn-out/locales/de.json index a016d0e..e5971bf 100644 --- a/src/nodes/sacn-out/locales/de.json +++ b/src/nodes/sacn-out/locales/de.json @@ -1,7 +1,7 @@ { "paletteLabel": "sACN Ausgang", "label": { - "fallback": "sACN Ausgang · U{{universe}}", + "fallback": "sACN Ausgang · U__universe__", "interface": "IP-Adresse des Interfaces", "port": "Port", "priority": "Priorität", diff --git a/src/nodes/sacn-out/locales/en-US.json b/src/nodes/sacn-out/locales/en-US.json index a98df4c..bd53bc0 100644 --- a/src/nodes/sacn-out/locales/en-US.json +++ b/src/nodes/sacn-out/locales/en-US.json @@ -1,7 +1,7 @@ { "paletteLabel": "sACN out", "label": { - "fallback": "sACN out · U{{universe}}", + "fallback": "sACN out · U__universe__", "interface": "IP-address of interface", "port": "port", "priority": "priority",