SVGHMI: allow i18n of formated strings of HMI:Messages. This was by construction impossible since formating was given as an argument. Now added optional "format" labelled element in HMI:Display, so that it can be translated, when labelled "_format".
--- a/svghmi/svghmi.js Sun Feb 14 05:30:29 2021 +0100
+++ b/svghmi/svghmi.js Sun Feb 14 19:15:20 2021 +0100
@@ -1,9 +1,7 @@
// svghmi.js
-var updates = {};
var need_cache_apply = [];
-
function dispatch_value(index, value) {
let widgets = subscribers(index);
@@ -204,35 +202,42 @@
}
});
-var translated = false;
+function svg_text_to_multiline(elt) {
+ return(Array.prototype.map.call(elt.children, x=>x.textContent).join("\\\\n"));
+}
+
+function multiline_to_svg_text(elt, str) {
+ str.split('\\\\n').map((line,i) => {elt.children[i].textContent = line;});
+}
function switch_langnum(langnum) {
if(langnum == current_lang) {
return;
}
- if (!translated) {
- translated = true;
- for (let translation of translations) {
- let [objs] = translation;
- translation.push(Array.prototype.map.call(objs[0].children, x=>x.textContent).join("\\\\n"));
- }
- }
-
for (let translation of translations) {
let [objs, msgs, orig] = translation;
let msg = langnum == 0 ? orig : msgs[langnum - 1];
for (let obj of objs) {
- msg.split('\\\\n').map((line,i) => {obj.children[i].textContent = line;});
+ multiline_to_svg_text(obj, msg);
+ obj.setAttribute("lang",langnum);
}
}
current_lang = langnum;
}
+
+// backup original texts
+for (let translation of translations) {
+ let [objs] = translation;
+ translation.push(svg_text_to_multiline(objs[0]));
+}
+
var lang_local_index = hmi_local_index("lang");
subscribers(lang_local_index).add({
indexes: [lang_local_index],
new_hmi_value: function(index, value, oldval) {
switch_langnum(value);
+ switch_page();
}
});
var current_lang = 0;
@@ -397,7 +402,6 @@
jumps_need_update = true;
requestHMIAnimation();
-
jump_history.push([page_name, page_index]);
if(jump_history.length > 42)
jump_history.shift();
--- a/svghmi/widget_display.ysl2 Sun Feb 14 05:30:29 2021 +0100
+++ b/svghmi/widget_display.ysl2 Sun Feb 14 19:15:20 2021 +0100
@@ -7,15 +7,20 @@
frequency = 5;
dispatch(value, oldval, index) {
this.fields[index] = value;
- this.element.textContent = this.args.length == 1 ? vsprintf(this.args[0],this.fields) : this.fields.join(' ');
+ this.request_animate();
}
}
||
template "widget[@type='Display']", mode="widget_defs" {
param "hmi_element";
- if "$hmi_element[not(self::svg:text)]"
- error > Display Widget id="«$hmi_element/@id»" is not a svg::text element
+
+ const "format" optional_labels("format");
+ const "has_format","string-length($format)>0";
+ value "$format";
+
+ if "$hmi_element[not(self::svg:text)] and not($has_format)"
+ error > Display Widget id="«$hmi_element/@id»" must be a svg::text element itself or a group containing a svg:text element labelled "format"
const "field_initializer" foreach "path" {
choose{
@@ -25,6 +30,28 @@
if "position()!=last()" > ,
}
| fields: [«$field_initializer»],
+ | animate: function(){
+ choose {
+ when "$has_format" {
+ | if(this.format_elt.getAttribute("lang")) {
+ | this.format = svg_text_to_multiline(this.format_elt);
+ | this.format_elt.removeAttribute("lang");
+ | }
+ | let str = vsprintf(this.format,this.fields);
+ | multiline_to_svg_text(this.format_elt, str);
+ }
+ otherwise {
+ | let str = this.args.length == 1 ? vsprintf(this.args[0],this.fields) : this.fields.join(' ');
+ | multiline_to_svg_text(this.element, str);
+ }
+ }
+ | },
+ |
+ if "$has_format" {
+ | init: function() {
+ | this.format = svg_text_to_multiline(this.format_elt);
+ | },
+ }
}
emit "preamble:display"
--- a/svghmi/widgets_common.ysl2 Sun Feb 14 05:30:29 2021 +0100
+++ b/svghmi/widgets_common.ysl2 Sun Feb 14 19:15:20 2021 +0100
@@ -65,6 +65,7 @@
emit "preamble:local-variable-indexes" {
||
+
let hmi_locals = {};
var last_remote_index = hmitree_types.length - 1;
var next_available_index = hmitree_types.length;
@@ -95,6 +96,7 @@
]);
var persistent_indexes = new Map();
var cache = hmitree_types.map(_ignored => undefined);
+ var updates = {};
function page_local_index(varname, pagename){
let pagevars = hmi_locals[pagename];
@@ -155,11 +157,11 @@
if(!this.unsubscribable)
for(let i = 0; i < this.indexes.length; i++) {
/* flush updates pending because of inhibition */
- let inhibition = this.inhibit[index];
+ let inhibition = this.inhibit[i];
if(inhibition != undefined){
clearTimeout(inhibition);
- this.lastapply[index] = undefined;
- this.unhinibit(index);
+ this.lastapply[i] = undefined;
+ this.unhinibit(i);
}
let index = this.indexes[i];
if(this.relativeness[i])
Binary file tests/svghmi_i18n/svghmi_0@svghmi/fr_FR.mo has changed
--- a/tests/svghmi_i18n/svghmi_0@svghmi/fr_FR.po Sun Feb 14 05:30:29 2021 +0100
+++ b/tests/svghmi_i18n/svghmi_0@svghmi/fr_FR.po Sun Feb 14 19:15:20 2021 +0100
@@ -5,8 +5,8 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"POT-Creation-Date: 2021-01-22 10:38+CET\n"
-"PO-Revision-Date: 2021-01-22 10:39+0100\n"
+"POT-Creation-Date: 2021-02-14 18:36+CET\n"
+"PO-Revision-Date: 2021-02-14 18:37+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr_FR\n"
@@ -14,9 +14,12 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: SVGHMI 1.0\n"
-"X-Generator: Poedit 2.3\n"
+"X-Generator: Poedit 2.4.2\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+msgid "height is %d meters"
+msgstr "la hauteur est de %d metres"
+
msgid "This is an integer value : %d"
msgstr "C'est un nombre entier : %d"
--- a/tests/svghmi_i18n/svghmi_0@svghmi/messages.pot Sun Feb 14 05:30:29 2021 +0100
+++ b/tests/svghmi_i18n/svghmi_0@svghmi/messages.pot Sun Feb 14 19:15:20 2021 +0100
@@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2021-02-09 16:59+CET\n"
+"POT-Creation-Date: 2021-02-14 19:05+CET\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -15,6 +15,10 @@
"Generated-By: SVGHMI 1.0\n"
+#:svghmi.svg: format:text424
+msgid "height is %d meters"
+msgstr ""
+
#:svghmi.svg: formatfortext:text5271
msgid "This is an integer value : %d"
msgstr ""
Binary file tests/svghmi_i18n/svghmi_0@svghmi/sl_SI.mo has changed
--- a/tests/svghmi_i18n/svghmi_0@svghmi/sl_SI.po Sun Feb 14 05:30:29 2021 +0100
+++ b/tests/svghmi_i18n/svghmi_0@svghmi/sl_SI.po Sun Feb 14 19:15:20 2021 +0100
@@ -5,17 +5,21 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"POT-Creation-Date: 2021-01-22 11:13+CET\n"
-"PO-Revision-Date: 2021-01-22 11:22+0100\n"
+"POT-Creation-Date: 2021-02-14 18:36+CET\n"
+"PO-Revision-Date: 2021-02-14 18:38+0100\n"
+"Last-Translator: \n"
"Language-Team: \n"
+"Language: sl_SI\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: SVGHMI 1.0\n"
-"X-Generator: Poedit 2.3\n"
-"Last-Translator: \n"
-"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100>=3 && n%100<=4 ? 2 : 3);\n"
-"Language: sl_SI\n"
+"X-Generator: Poedit 2.4.2\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100>=3 && n"
+"%100<=4 ? 2 : 3);\n"
+
+msgid "height is %d meters"
+msgstr "To je celo število %d m"
msgid "This is an integer value : %d"
msgstr "To je celo število %d"
--- a/tests/svghmi_i18n/svghmi_0@svghmi/svghmi.svg Sun Feb 14 05:30:29 2021 +0100
+++ b/tests/svghmi_i18n/svghmi_0@svghmi/svghmi.svg Sun Feb 14 19:15:20 2021 +0100
@@ -2415,12 +2415,12 @@
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:document-units="px"
- inkscape:current-layer="hmi0"
+ inkscape:current-layer="g436"
showgrid="false"
units="px"
- inkscape:zoom="2"
- inkscape:cx="1015.4336"
- inkscape:cy="539.83485"
+ inkscape:zoom="0.70710678"
+ inkscape:cx="575.80285"
+ inkscape:cy="308.66839"
inkscape:window-width="1939"
inkscape:window-height="844"
inkscape:window-x="3325"
@@ -2613,4 +2613,20 @@
inkscape:transform-center-y="10.92088"
inkscape:label="button" />
</g>
+ <g
+ inkscape:label="HMI:Display@/TARGETPRESSURE"
+ id="g436"
+ transform="translate(381.33428,-264.45794)">
+ <text
+ inkscape:label="_format"
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="375.02609"
+ y="571.66504"
+ id="text424"><tspan
+ sodipodi:role="line"
+ x="375.02609"
+ y="571.66504"
+ id="tspan438">height is %d meters</tspan></text>
+ </g>
</svg>