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