From e529fdc1d6800c7a47dad9b5d6a74ca067e544c9 Mon Sep 17 00:00:00 2001
From: Volker Schukai <volker.schukai@schukai.com>
Date: Thu, 2 Feb 2023 14:54:24 +0100
Subject: [PATCH] fix: optimize i18n: transformer

---
 application/source/data/transformer.mjs     | 46 ++++++-------------
 application/source/i18n/translations.mjs    |  3 +-
 development/test/cases/data/transformer.mjs | 49 ++++++++++++++++-----
 3 files changed, 53 insertions(+), 45 deletions(-)

diff --git a/application/source/data/transformer.mjs b/application/source/data/transformer.mjs
index 9d87dbab6..c7788792d 100644
--- a/application/source/data/transformer.mjs
+++ b/application/source/data/transformer.mjs
@@ -9,6 +9,7 @@ import {Base} from "../types/base.mjs";
 import {getGlobal, getGlobalObject} from "../types/global.mjs";
 import {ID} from "../types/id.mjs";
 import {isArray, isObject, isString} from "../types/is.mjs";
+import {getDocumentTranslations, Translations} from "../i18n/translations.mjs";
 import {
     validateFunction,
     validateInteger,
@@ -167,6 +168,7 @@ function transform(value) {
 
     let element;
     let attribute;
+    let translations;
 
     switch (this.command) {
         case "static":
@@ -461,43 +463,21 @@ function transform(value) {
 
             throw new Error("type not supported");
 
-        // case "element-by-id":
-        //     return getGlobal("document").getElementById(convertToString(value));
-        //
-        // case "element-query":
-        // case "element-query-selector":
-        //     return getGlobal("document").querySelector(convertToString(value));
-        //
-        // case "element-value":
-        //     return getGlobal("document").getElementById(convertToString(value))?.value;
-        //    
-        // case "element-text":
-        //     return getGlobal("document").getElementById(convertToString(value))?.innerText;
-        //    
-        // case "element-html":
-        //     return getGlobal("document").getElementById(convertToString(value))?.innerHTML;
-        //    
-        // case "element-attribute":
-        //     let element = getGlobal("document").getElementById(convertToString(value));
-        //     let attribute = args.shift();
-        //     if (attribute === undefined) {
-        //         throw new Error("missing attribute parameter");
-        //     }
-        //     return element?.getAttribute(attribute);
-
+        case "i18n":
         case "translation":
-            element = getGlobal("document").getElementById(convertToString(value));
-            if (element === undefined) {
-                throw new Error("missing element parameter");
-            }
             
-            
-            attribute = args.shift();
-            if (attribute === undefined) {
-                throw new Error("missing attribute parameter");
+            translations = getDocumentTranslations();
+            if (!(translations instanceof Translations)) {
+                throw new Error("missing translations");
             }
-            return element?.getAttribute(attribute);
 
+            key = args.shift() || undefined;
+            if (key === undefined) {
+                key = value;
+            }
+                        
+            defaultValue = args.shift() || undefined;
+            return translations.getText(key, defaultValue);
 
         default:
             throw new Error(`unknown command ${this.command}`);
diff --git a/application/source/i18n/translations.mjs b/application/source/i18n/translations.mjs
index 2df47635c..2f344246c 100644
--- a/application/source/i18n/translations.mjs
+++ b/application/source/i18n/translations.mjs
@@ -6,6 +6,7 @@
  */
 
 import { getLinkedObjects,hasObjectLink} from "../dom/attributes.mjs";
+import {ATTRIBUTE_OBJECTLINK} from "../dom/constants.mjs";
 import {getDocument} from "../dom/util.mjs";
 import {Base} from "../types/base.mjs";
 import {isObject, isString} from "../types/is.mjs";
@@ -199,7 +200,7 @@ function getDocumentTranslations(element) {
     const d = getDocument()
 
     if (!(element instanceof HTMLElement)) {
-        element = d.querySelector("body");
+        element = d.querySelector('['+ATTRIBUTE_OBJECTLINK+'="' + translationsLinkSymbol.toString() + '"]');
     }
 
     if (!(element instanceof HTMLElement)) {
diff --git a/development/test/cases/data/transformer.mjs b/development/test/cases/data/transformer.mjs
index aa42eb7b7..1bea1896f 100644
--- a/development/test/cases/data/transformer.mjs
+++ b/development/test/cases/data/transformer.mjs
@@ -2,6 +2,7 @@
 
 import {expect} from "chai"
 import {Transformer} from "../../../../application/source/data/transformer.mjs";
+import {Embed} from "../../../../application/source/i18n/providers/embed.mjs";
 import {initJSDOM} from "../../util/jsdom.mjs";
 
 describe('Transformer', function () {
@@ -197,36 +198,62 @@ describe('Transformer', function () {
             }).to.throw(TypeError);
         });
     });
-    
+
 
     describe('i18n', function () {
 
         let html1 = `
-    <div id="test1">
-    </div>
+<div id="mock-translations"></div>
+<script type="application/json" data-monster-role="translations">
+    {
+        "test1": "xyz",
+        "test3": {
+            "other": "xyz"
+        }
+    }
+</script>  
 `;
 
-        beforeEach(() => {
+        beforeEach((done) => {
             let mocks = document.getElementById('mocks');
             mocks.innerHTML = html1;
-            
-            
+            let elem = document.getElementById('mock-translations');
+            Embed.assignTranslationsToElement(elem).then((o) => {
+                done()
+            })
+
+
         })
 
         afterEach(() => {
             let mocks = document.getElementById('mocks');
             mocks.innerHTML = "";
-        })        
-        
+        })
+
         before(function (done) {
             initJSDOM().then(() => {
                 done()
             });
         });
 
-        it('should', function () {
-           const t = new Transformer('i18n:en:de');
-        });
+        [
+            [ 'i18n:test1',"", "xyz"],
+            [ 'i18n:',"test1", "xyz"], // key by value
+            [ 'i18n::',"test1", "xyz"], // key by value no default
+            [ 'i18n::eee',"test2", "eee"], // key by value with default
+            [ 'i18n::ddd',"test2", "ddd"], // key by value and default
+
+        ].forEach(function (data) {
+
+            let a = data.shift()
+            let b = data.shift()
+            let c = data.shift()
+
+            it('should transform('+a+').run('+b+') return ' + JSON.stringify(c), function () {
+                const t = new Transformer(a);
+                expect(t.run(b)).to.be.eql(c);
+            });
+        })
     })
 
 
-- 
GitLab