Skip to content
Snippets Groups Projects
Verified Commit b881ddc4 authored by Volker Schukai's avatar Volker Schukai :alien:
Browse files

feat: new embed i18n provider

parent 1c1c0d3b
No related branches found
No related tags found
No related merge requests found
import {Embed} from '@schukai/monster/source/i18n/providers/embed.mjs';
// read from scritp tag with id i18n
const translation = new Embed('i18n');
/**
* Copyright schukai GmbH and contributors 2022. All Rights Reserved.
* Node module: @schukai/monster
* This file is licensed under the AGPLv3 License.
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
*/
import {internalSymbol} from "../../constants.mjs";
import {extend} from "../../data/extend.mjs";
import { getGlobalObject} from "../../types/global.mjs";
import {isString} from "../../types/is.mjs";
import {validateObject, validateString} from "../../types/validate.mjs";
import {parseLocale} from "../locale.mjs";
import {Provider} from "../provider.mjs";
import {Translations} from "../translations.mjs";
export {Embed}
/**
* The Embed provider retrieves a JSON file from the given Script Tag.
*
* @externalExample ../../../example/i18n/providers/embed.mjs
* @license AGPLv3
* @since 1.13.0
* @copyright schukai GmbH
* @memberOf Monster.I18n.Providers
* @see {@link https://datatracker.ietf.org/doc/html/rfc3066}
* @tutorial i18n-locale-and-formatter
*/
class Embed extends Provider {
/**
* ```html
* <script id="translations" type="application/json">
* {
* "hello": "Hallo"
* }
* </script>
* ```
*
*
* ```javascript
* new Embed('translations')
* ```
*
* @param {string} id
* @param {Object} options
*/
constructor(id, options) {
super(options);
if (options === undefined) {
options = {};
}
validateString(id);
/**
* @property {string}
*/
this.textId = id;
/**
* @private
* @property {Object} options
*/
this[internalSymbol] = extend({}, super.defaults, this.defaults, validateObject(options));
}
/**
* Defaults
*
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API}
*/
get defaults() {
return extend({}, super.defaults);
}
/**
*
* @param {Locale|string} locale
* @return {Promise}
*/
getTranslations(locale) {
if (isString(locale)) {
locale = parseLocale(locale);
}
return new Promise((resolve, reject) => {
let text = getGlobalObject('document').getElementById(this.textId);
if (text === null) {
reject(new Error('Text not found'));
return;
}
let translations = null;
try {
translations = JSON.parse(text.innerHTML);
} catch (e) {
reject(e);
return;
}
if (translations === null) {
reject(new Error('Translations not found or invalid'));
return;
}
const t = new Translations(locale);
t.assignTranslations(translations)
resolve(t);
});
}
}
......@@ -84,7 +84,8 @@ export {Fetch}
*/
get defaults() {
return {
return extend(
{
fetch: {
method: 'GET', // *GET, POST, PUT, DELETE, etc.
mode: 'cors', // no-cors, *cors, same-origin
......@@ -93,7 +94,7 @@ export {Fetch}
redirect: 'follow', // manual, *follow, error
referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
}
}
}, super.defaults);
}
......
import {expect} from "chai"
import {Embed} from "../../../../../application/source/i18n/providers/embed.mjs";
import {Translations} from "../../../../../application/source/i18n/translations.mjs";
import {getGlobal} from "../../../../../application/source/types/global.mjs";
import {initJSDOM} from "../../../util/jsdom.mjs";
const global = getGlobal();
const html1 = `
<script id="templocale" type="application/json">
{
"key": "translation"
}
</script>
`;
describe('Translation Provider Embed', function () {
before(function (done) {
initJSDOM().then(() => {
done()
});
});
afterEach(() => {
let mocks = document.getElementById('mocks');
mocks.innerHTML = "";
});
beforeEach(() => {
let mocks = document.getElementById('mocks');
mocks.innerHTML = html1;
})
describe('get mock data and create translation', function () {
it('embed', function (done) {
const e = new Embed('templocale');
let p = e.getTranslations('en');
expect(p).is.instanceof(Promise);
p.then(r => {
try {
expect(r).is.instanceof(Translations);
let t = r.getText('key')
expect(t).is.equal('translation');
done();
} catch (e) {
done(e);
}
}).catch(e => {
done(e);
})
});
});
});
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment