@schukai/monster 3.4.2 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ import {Embed} from '@schukai/monster/source/i18n/providers/embed.mjs';
2
+
3
+ // read from scritp tag with id i18n
4
+ const translation = new Embed('i18n');
5
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schukai/monster",
3
- "version": "3.4.2",
3
+ "version": "3.5.0",
4
4
  "description": "Monster is a simple library for creating fast, robust and lightweight websites.",
5
5
  "keywords": [
6
6
  "framework",
@@ -81,7 +81,7 @@ class Server extends Datasource {
81
81
 
82
82
 
83
83
  /**
84
- *
84
+ * @private
85
85
  * @param self
86
86
  * @param obj
87
87
  * @returns {*}
@@ -6,8 +6,8 @@
6
6
  */
7
7
 
8
8
  import {parseLocale} from "../i18n/locale.mjs";
9
-
10
9
  import {getDocument} from "./util.mjs";
10
+ import {getGlobalObject} from "../types/global.mjs";
11
11
 
12
12
  export {getLocaleOfDocument}
13
13
 
@@ -46,6 +46,40 @@ function getLocaleOfDocument() {
46
46
  return new parseLocale(locale)
47
47
  }
48
48
  }
49
+
50
+ let navigatorLanguage = getNavigatorLanguage();
51
+ if (navigatorLanguage) {
52
+ return parseLocale(navigatorLanguage);
53
+ }
49
54
 
50
55
  return parseLocale(DEFAULT_LANGUAGE);
51
56
  }
57
+
58
+ /**
59
+ * @private
60
+ * @returns {string|undefined|*}
61
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/language
62
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/languages
63
+ */
64
+ const getNavigatorLanguage = () => {
65
+ const navigator = getGlobalObject('navigator');
66
+ if (navigator === undefined) {
67
+ return undefined;
68
+ }
69
+
70
+ if (navigator.hasOwnProperty('language')) {
71
+ const language = navigator.language;
72
+ if (typeof language === 'string' && language.length > 0) {
73
+ return language;
74
+ }
75
+
76
+ }
77
+
78
+ const languages = navigator?.languages;
79
+ if (Array.isArray(languages) && languages.length>0) {
80
+ return languages[0];
81
+ }
82
+
83
+ return undefined;
84
+
85
+ }
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Copyright schukai GmbH and contributors 2022. All Rights Reserved.
3
+ * Node module: @schukai/monster
4
+ * This file is licensed under the AGPLv3 License.
5
+ * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
+ */
7
+
8
+ import {internalSymbol} from "../../constants.mjs";
9
+ import {extend} from "../../data/extend.mjs";
10
+ import { getGlobalObject} from "../../types/global.mjs";
11
+ import {isString} from "../../types/is.mjs";
12
+ import {validateObject, validateString} from "../../types/validate.mjs";
13
+ import {parseLocale} from "../locale.mjs";
14
+ import {Provider} from "../provider.mjs";
15
+ import {Translations} from "../translations.mjs";
16
+
17
+ export {Embed}
18
+
19
+ /**
20
+ * The Embed provider retrieves a JSON file from the given Script Tag.
21
+ *
22
+ * @externalExample ../../../example/i18n/providers/embed.mjs
23
+ * @license AGPLv3
24
+ * @since 1.13.0
25
+ * @copyright schukai GmbH
26
+ * @memberOf Monster.I18n.Providers
27
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc3066}
28
+ * @tutorial i18n-locale-and-formatter
29
+ */
30
+ class Embed extends Provider {
31
+
32
+ /**
33
+ * ```html
34
+ * <script id="translations" type="application/json">
35
+ * {
36
+ * "hello": "Hallo"
37
+ * }
38
+ * </script>
39
+ * ```
40
+ *
41
+ *
42
+ * ```javascript
43
+ * new Embed('translations')
44
+ * ```
45
+ *
46
+ * @param {string} id
47
+ * @param {Object} options
48
+ */
49
+ constructor(id, options) {
50
+ super(options);
51
+
52
+ if (options === undefined) {
53
+ options = {};
54
+ }
55
+
56
+ validateString(id);
57
+
58
+ /**
59
+ * @property {string}
60
+ */
61
+ this.textId = id;
62
+
63
+ /**
64
+ * @private
65
+ * @property {Object} options
66
+ */
67
+ this[internalSymbol] = extend({}, super.defaults, this.defaults, validateObject(options));
68
+
69
+ }
70
+
71
+ /**
72
+ * Defaults
73
+ *
74
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API}
75
+ */
76
+ get defaults() {
77
+ return extend({}, super.defaults);
78
+ }
79
+
80
+ /**
81
+ *
82
+ * @param {Locale|string} locale
83
+ * @return {Promise}
84
+ */
85
+ getTranslations(locale) {
86
+
87
+ if (isString(locale)) {
88
+ locale = parseLocale(locale);
89
+ }
90
+
91
+ return new Promise((resolve, reject) => {
92
+
93
+ let text = getGlobalObject('document').getElementById(this.textId);
94
+
95
+ if (text === null) {
96
+ reject(new Error('Text not found'));
97
+ return;
98
+ }
99
+
100
+ let translations = null;
101
+ try {
102
+ translations = JSON.parse(text.innerHTML);
103
+ } catch (e) {
104
+ reject(e);
105
+ return;
106
+ }
107
+
108
+
109
+ if (translations === null) {
110
+ reject(new Error('Translations not found or invalid'));
111
+ return;
112
+ }
113
+
114
+ const t = new Translations(locale);
115
+ t.assignTranslations(translations)
116
+
117
+ resolve(t);
118
+
119
+ });
120
+
121
+ }
122
+
123
+
124
+ }
125
+
@@ -84,16 +84,17 @@ export {Fetch}
84
84
  */
85
85
  get defaults() {
86
86
 
87
- return {
88
- fetch: {
89
- method: 'GET', // *GET, POST, PUT, DELETE, etc.
90
- mode: 'cors', // no-cors, *cors, same-origin
91
- cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
92
- credentials: 'omit', // include, *same-origin, omit
93
- redirect: 'follow', // manual, *follow, error
94
- 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
95
- }
96
- }
87
+ return extend(
88
+ {
89
+ fetch: {
90
+ method: 'GET', // *GET, POST, PUT, DELETE, etc.
91
+ mode: 'cors', // no-cors, *cors, same-origin
92
+ cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
93
+ credentials: 'omit', // include, *same-origin, omit
94
+ redirect: 'follow', // manual, *follow, error
95
+ 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
96
+ }
97
+ }, super.defaults);
97
98
 
98
99
  }
99
100
 
@@ -142,13 +142,16 @@ class Translations extends Base {
142
142
  }
143
143
 
144
144
  /**
145
- * This method can be used to transfer overlays from an object. The keys are transferred and the values are entered as text.
146
- *
147
- * The values can either be character strings or, in the case of texts with plural forms, objects. The plural forms must be stored as text via a standard key "zero", "one", "two", "few", "many" and "other".
148
- *
145
+ * This method can be used to transfer overlays from an object. The keys are transferred, and the values are entered
146
+ * as text.
147
+ *
148
+ * The values can either be character strings or, in the case of texts with plural forms, objects. The plural forms
149
+ * must be stored as text via a standard key "zero", "one", "two", "few", "many" and "other".
150
+ *
149
151
  * Additionally, the key default can be specified, which will be used if no other key fits.
150
- *
151
- * In some languages, like for example in german, there is no own more number at the value 0. In these languages the function applies additionally zero.
152
+ *
153
+ * In some languages, like for example in German, there is no own more number at the value 0. In these languages,
154
+ * the function applies additionally zero.
152
155
  *
153
156
  * ```
154
157
  * translations.assignTranslations({
@@ -149,7 +149,7 @@ function getMonsterVersion() {
149
149
  }
150
150
 
151
151
  /** don't touch, replaced by make with package.json version */
152
- monsterVersion = new Version('3.4.2')
152
+ monsterVersion = new Version('3.5.0')
153
153
 
154
154
  return monsterVersion;
155
155
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  import {expect} from "chai"
4
4
 
5
+ import {Locale} from "../../../../application/source/i18n/locale.mjs";
5
6
  import {getLocaleOfDocument} from "../../../../application/source/dom/locale.mjs";
6
7
  import {initJSDOM} from "../../util/jsdom.mjs";
7
8
 
@@ -32,10 +33,24 @@ describe('Attributes', function () {
32
33
  node.setAttribute('lang', a);
33
34
  expect(getLocaleOfDocument().toString()).to.be.equal(a);
34
35
  })
36
+
37
+
35
38
 
36
39
  });
37
40
 
38
41
 
39
42
  });
43
+
44
+
45
+ it('return language en', function () {
46
+ let html = document.getElementsByTagName('html');
47
+ let node = html.item(0);
48
+
49
+ node.removeAttribute('lang');
50
+ const locale = getLocaleOfDocument();
51
+ expect(locale).to.be.instanceOf(Locale);
52
+ expect(locale.localeString).to.be.equal('en-US');
53
+ })
54
+
40
55
 
41
56
  })
@@ -0,0 +1,72 @@
1
+ import {expect} from "chai"
2
+
3
+
4
+ import {Embed} from "../../../../../application/source/i18n/providers/embed.mjs";
5
+ import {Translations} from "../../../../../application/source/i18n/translations.mjs";
6
+ import {getGlobal} from "../../../../../application/source/types/global.mjs";
7
+ import {initJSDOM} from "../../../util/jsdom.mjs";
8
+
9
+
10
+ const global = getGlobal();
11
+
12
+ const html1 = `
13
+ <script id="templocale" type="application/json">
14
+ {
15
+ "key": "translation"
16
+ }
17
+ </script>
18
+ `;
19
+
20
+ describe('Translation Provider Embed', function () {
21
+
22
+ before(function (done) {
23
+ initJSDOM().then(() => {
24
+ done()
25
+ });
26
+ });
27
+
28
+
29
+ afterEach(() => {
30
+ let mocks = document.getElementById('mocks');
31
+ mocks.innerHTML = "";
32
+ });
33
+
34
+ beforeEach(() => {
35
+ let mocks = document.getElementById('mocks');
36
+ mocks.innerHTML = html1;
37
+
38
+ })
39
+
40
+ describe('get mock data and create translation', function () {
41
+
42
+ it('embed', function (done) {
43
+
44
+ const e = new Embed('templocale');
45
+ let p = e.getTranslations('en');
46
+ expect(p).is.instanceof(Promise);
47
+
48
+ p.then(r => {
49
+
50
+ try {
51
+ expect(r).is.instanceof(Translations);
52
+
53
+ let t = r.getText('key')
54
+ expect(t).is.equal('translation');
55
+
56
+
57
+ done();
58
+ } catch (e) {
59
+ done(e);
60
+ }
61
+
62
+
63
+ }).catch(e => {
64
+ done(e);
65
+ })
66
+
67
+ });
68
+
69
+ });
70
+
71
+
72
+ });
@@ -7,7 +7,7 @@ describe('Monster', function () {
7
7
  let monsterVersion
8
8
 
9
9
  /** don´t touch, replaced by make with package.json version */
10
- monsterVersion = new Version('3.4.2')
10
+ monsterVersion = new Version('3.5.0')
11
11
 
12
12
  let m = getMonsterVersion();
13
13