@schukai/monster 3.97.0 → 3.98.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.
Files changed (34) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/package.json +1 -1
  3. package/source/components/accessibility/locale-picker.mjs +553 -482
  4. package/source/components/accessibility/stylesheet/locale-picker.mjs +13 -6
  5. package/source/components/datatable/columnbar.mjs +50 -3
  6. package/source/components/datatable/constants.mjs +7 -0
  7. package/source/components/datatable/datatable/header.mjs +1 -0
  8. package/source/components/datatable/datatable.mjs +1168 -934
  9. package/source/components/datatable/filter/date-range.mjs +145 -14
  10. package/source/components/datatable/filter/input.mjs +50 -3
  11. package/source/components/datatable/filter/range.mjs +92 -7
  12. package/source/components/datatable/filter-button.mjs +46 -3
  13. package/source/components/datatable/filter.mjs +95 -10
  14. package/source/components/datatable/pagination.mjs +82 -7
  15. package/source/components/datatable/save-button.mjs +46 -3
  16. package/source/components/datatable/style/datatable.pcss +1 -0
  17. package/source/components/datatable/stylesheet/datatable.mjs +7 -14
  18. package/source/components/form/field-set.mjs +77 -6
  19. package/source/components/form/select.mjs +149 -30
  20. package/source/components/layout/details.mjs +50 -3
  21. package/source/components/layout/tabs.mjs +50 -3
  22. package/source/components/notify/monitor-attribute-errors.mjs +235 -0
  23. package/source/components/notify/style/monitor-attribute-errors.pcss +0 -0
  24. package/source/components/notify/stylesheet/monitor-attribute-errors.mjs +38 -0
  25. package/source/dom/customelement.mjs +3 -3
  26. package/source/i18n/locale.mjs +151 -151
  27. package/source/i18n/map/languages.mjs +88 -88
  28. package/source/i18n/util.mjs +122 -114
  29. package/source/monster.mjs +1 -0
  30. package/source/types/version.mjs +1 -1
  31. package/test/cases/monster.mjs +1 -1
  32. package/test/web/import.js +1 -0
  33. package/test/web/test.html +2 -2
  34. package/test/web/tests.js +432 -13
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Copyright © schukai GmbH and all contributing authors, 2025. All rights reserved.
3
+ * Node module: @schukai/monster
4
+ *
5
+ * This source code is licensed under the GNU Affero General Public License version 3 (AGPLv3).
6
+ * The full text of the license can be found at: https://www.gnu.org/licenses/agpl-3.0.en.html
7
+ *
8
+ * For those who do not wish to adhere to the AGPLv3, a commercial license is available.
9
+ * Acquiring a commercial license allows you to use this software without complying with the AGPLv3 terms.
10
+ * For more information about purchasing a commercial license, please contact schukai GmbH.
11
+ */
12
+
13
+ import { addAttributeToken } from "../../../dom/attributes.mjs";
14
+ import { ATTRIBUTE_ERRORMESSAGE } from "../../../dom/constants.mjs";
15
+
16
+ export { MonitorAttributeErrorsStyleSheet };
17
+
18
+ /**
19
+ * @private
20
+ * @type {CSSStyleSheet}
21
+ */
22
+ const MonitorAttributeErrorsStyleSheet = new CSSStyleSheet();
23
+
24
+ try {
25
+ MonitorAttributeErrorsStyleSheet.insertRule(
26
+ `
27
+ @layer monitorattributeerrors {
28
+
29
+ }`,
30
+ 0,
31
+ );
32
+ } catch (e) {
33
+ addAttributeToken(
34
+ document.getRootNode().querySelector("html"),
35
+ ATTRIBUTE_ERRORMESSAGE,
36
+ e + "",
37
+ );
38
+ }
@@ -235,7 +235,7 @@ class CustomElement extends HTMLElement {
235
235
  *
236
236
  * @param attribute
237
237
  * @param callback
238
- * @return {Monster.DOM.CustomElement}
238
+ * @return {CustomElement}
239
239
  */
240
240
  addAttributeObserver(attribute, callback) {
241
241
  validateFunction(callback);
@@ -246,7 +246,7 @@ class CustomElement extends HTMLElement {
246
246
  /**
247
247
  *
248
248
  * @param attribute
249
- * @return {Monster.DOM.CustomElement}
249
+ * @return {CustomElement}
250
250
  */
251
251
  removeAttributeObserver(attribute) {
252
252
  delete this[attributeObserverSymbol][attribute];
@@ -308,7 +308,7 @@ class CustomElement extends HTMLElement {
308
308
  *
309
309
  * Before you can use this method, you must have loaded the translations.
310
310
  *
311
- * @return {Monster.DOM.CustomElement}
311
+ * @return {CustomElement}
312
312
  * @throws {Error} Cannot find an element with translations. Add a translation object to the document.
313
313
  */
314
314
  updateI18n() {
@@ -12,12 +12,12 @@
12
12
  * SPDX-License-Identifier: AGPL-3.0
13
13
  */
14
14
 
15
- import {instanceSymbol} from "../constants.mjs";
16
- import {Base} from "../types/base.mjs";
17
- import {validateString} from "../types/validate.mjs";
18
- import {clone} from "../util/clone.mjs";
15
+ import { instanceSymbol } from "../constants.mjs";
16
+ import { Base } from "../types/base.mjs";
17
+ import { validateString } from "../types/validate.mjs";
18
+ import { clone } from "../util/clone.mjs";
19
19
 
20
- export {Locale, parseLocale};
20
+ export { Locale, parseLocale };
21
21
 
22
22
  /**
23
23
  * @type {symbol}
@@ -69,116 +69,116 @@ const localeStringSymbol = Symbol("localeString");
69
69
  * @see https://datatracker.ietf.org/doc/html/rfc3066
70
70
  */
71
71
  class Locale extends Base {
72
- /**
73
- * @param {string} language
74
- * @param {string} [region]
75
- * @param {string} [script]
76
- * @param {string} [variants]
77
- * @param {string} [extlang]
78
- * @param {string} [privateUse]
79
- * @throws {Error} unsupported locale
80
- */
81
- constructor(language, region, script, variants, extlang, privateUse) {
82
- super();
72
+ /**
73
+ * @param {string} language
74
+ * @param {string} [region]
75
+ * @param {string} [script]
76
+ * @param {string} [variants]
77
+ * @param {string} [extlang]
78
+ * @param {string} [privateUse]
79
+ * @throws {Error} unsupported locale
80
+ */
81
+ constructor(language, region, script, variants, extlang, privateUse) {
82
+ super();
83
83
 
84
- this[propertiesSymbol] = {
85
- language: language === undefined ? undefined : validateString(language),
86
- script: script === undefined ? undefined : validateString(script),
87
- region: region === undefined ? undefined : validateString(region),
88
- variants: variants === undefined ? undefined : validateString(variants),
89
- extlang: extlang === undefined ? undefined : validateString(extlang),
90
- privateUse:
91
- privateUse === undefined ? undefined : validateString(privateUse),
92
- };
84
+ this[propertiesSymbol] = {
85
+ language: language === undefined ? undefined : validateString(language),
86
+ script: script === undefined ? undefined : validateString(script),
87
+ region: region === undefined ? undefined : validateString(region),
88
+ variants: variants === undefined ? undefined : validateString(variants),
89
+ extlang: extlang === undefined ? undefined : validateString(extlang),
90
+ privateUse:
91
+ privateUse === undefined ? undefined : validateString(privateUse),
92
+ };
93
93
 
94
- const s = [];
95
- if (language !== undefined) s.push(language);
96
- if (script !== undefined) s.push(script);
97
- if (region !== undefined) s.push(region);
98
- if (variants !== undefined) s.push(variants);
99
- if (extlang !== undefined) s.push(extlang);
100
- if (privateUse !== undefined) s.push(privateUse);
94
+ const s = [];
95
+ if (language !== undefined) s.push(language);
96
+ if (script !== undefined) s.push(script);
97
+ if (region !== undefined) s.push(region);
98
+ if (variants !== undefined) s.push(variants);
99
+ if (extlang !== undefined) s.push(extlang);
100
+ if (privateUse !== undefined) s.push(privateUse);
101
101
 
102
- if (s.length === 0) {
103
- throw new Error("unsupported locale");
104
- }
102
+ if (s.length === 0) {
103
+ throw new Error("unsupported locale");
104
+ }
105
105
 
106
- this[localeStringSymbol] = s.join("-");
107
- }
106
+ this[localeStringSymbol] = s.join("-");
107
+ }
108
108
 
109
- /**
110
- * This method is called by the `instanceof` operator.
111
- * @return {symbol}
112
- * @since 3.27.0
113
- */
114
- static get [instanceSymbol]() {
115
- return Symbol.for("@schukai/monster/i18n/locale@@instance");
116
- }
109
+ /**
110
+ * This method is called by the `instanceof` operator.
111
+ * @return {symbol}
112
+ * @since 3.27.0
113
+ */
114
+ static get [instanceSymbol]() {
115
+ return Symbol.for("@schukai/monster/i18n/locale@@instance");
116
+ }
117
117
 
118
- /**
119
- * @return {string}
120
- */
121
- get localeString() {
122
- return this[localeStringSymbol];
123
- }
118
+ /**
119
+ * @return {string}
120
+ */
121
+ get localeString() {
122
+ return this[localeStringSymbol];
123
+ }
124
124
 
125
- /**
126
- * @return {string|undefined}
127
- */
128
- get language() {
129
- return this[propertiesSymbol].language;
130
- }
125
+ /**
126
+ * @return {string|undefined}
127
+ */
128
+ get language() {
129
+ return this[propertiesSymbol].language;
130
+ }
131
131
 
132
- /**
133
- * @return {string|undefined}
134
- */
135
- get region() {
136
- return this[propertiesSymbol].region;
137
- }
132
+ /**
133
+ * @return {string|undefined}
134
+ */
135
+ get region() {
136
+ return this[propertiesSymbol].region;
137
+ }
138
138
 
139
- /**
140
- * @return {string|undefined}
141
- */
142
- get script() {
143
- return this[propertiesSymbol].script;
144
- }
139
+ /**
140
+ * @return {string|undefined}
141
+ */
142
+ get script() {
143
+ return this[propertiesSymbol].script;
144
+ }
145
145
 
146
- /**
147
- * @return {string|undefined}
148
- */
149
- get variants() {
150
- return this[propertiesSymbol].variants;
151
- }
146
+ /**
147
+ * @return {string|undefined}
148
+ */
149
+ get variants() {
150
+ return this[propertiesSymbol].variants;
151
+ }
152
152
 
153
- /**
154
- * @return {string|undefined}
155
- */
156
- get extlang() {
157
- return this[propertiesSymbol].extlang;
158
- }
153
+ /**
154
+ * @return {string|undefined}
155
+ */
156
+ get extlang() {
157
+ return this[propertiesSymbol].extlang;
158
+ }
159
159
 
160
- /**
161
- * @return {string|undefined}
162
- */
163
- get privateUse() {
164
- return this[propertiesSymbol].privateValue;
165
- }
160
+ /**
161
+ * @return {string|undefined}
162
+ */
163
+ get privateUse() {
164
+ return this[propertiesSymbol].privateValue;
165
+ }
166
166
 
167
- /**
168
- * @return {string}
169
- */
170
- toString() {
171
- return `${this.localeString}`;
172
- }
167
+ /**
168
+ * @return {string}
169
+ */
170
+ toString() {
171
+ return `${this.localeString}`;
172
+ }
173
173
 
174
- /**
175
- * The structure has the following: language, script, region, variants, extlang, privateUse
176
- *
177
- * @return {Monster.I18n.LocaleMap}
178
- */
179
- getMap() {
180
- return clone(this[propertiesSymbol]);
181
- }
174
+ /**
175
+ * The structure has the following: language, script, region, variants, extlang, privateUse
176
+ *
177
+ * @return {Monster.I18n.LocaleMap}
178
+ */
179
+ getMap() {
180
+ return clone(this[propertiesSymbol]);
181
+ }
182
182
  }
183
183
 
184
184
  /**
@@ -260,63 +260,63 @@ class Locale extends Base {
260
260
  * @throws {Error} unsupported locale
261
261
  */
262
262
  function parseLocale(locale) {
263
- locale = validateString(locale).replace(/_/g, "-");
263
+ locale = validateString(locale).replace(/_/g, "-");
264
264
 
265
- let language;
266
- let region;
267
- let variants;
268
- let parts;
269
- let script;
270
- let extlang;
271
- const regexRegular =
272
- "(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)";
273
- const regexIrregular =
274
- "(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)";
275
- const regexGrandfathered = `(${regexIrregular}|${regexRegular})`;
276
- const regexPrivateUse = "(x(-[A-Za-z0-9]{1,8})+)";
277
- const regexSingleton = "[0-9A-WY-Za-wy-z]";
278
- const regexExtension = `(${regexSingleton}(-[A-Za-z0-9]{2,8})+)`;
279
- const regexVariant = "([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3})";
280
- const regexRegion = "([A-Za-z]{2}|[0-9]{3})";
281
- const regexScript = "([A-Za-z]{4})";
282
- const regexExtlang = "([A-Za-z]{3}(-[A-Za-z]{3}){0,2})";
283
- const regexLanguage = `(([A-Za-z]{2,3}(-${regexExtlang})?)|[A-Za-z]{4}|[A-Za-z]{5,8})`;
284
- const regexLangtag = `(${regexLanguage}(-${regexScript})?(-${regexRegion})?(-${regexVariant})*(-${regexExtension})*(-${regexPrivateUse})?)`;
285
- const regexLanguageTag = `^(${regexGrandfathered}|${regexLangtag}|${regexPrivateUse})$`;
286
- const regex = new RegExp(regexLanguageTag);
287
- let match;
265
+ let language;
266
+ let region;
267
+ let variants;
268
+ let parts;
269
+ let script;
270
+ let extlang;
271
+ const regexRegular =
272
+ "(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)";
273
+ const regexIrregular =
274
+ "(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)";
275
+ const regexGrandfathered = `(${regexIrregular}|${regexRegular})`;
276
+ const regexPrivateUse = "(x(-[A-Za-z0-9]{1,8})+)";
277
+ const regexSingleton = "[0-9A-WY-Za-wy-z]";
278
+ const regexExtension = `(${regexSingleton}(-[A-Za-z0-9]{2,8})+)`;
279
+ const regexVariant = "([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3})";
280
+ const regexRegion = "([A-Za-z]{2}|[0-9]{3})";
281
+ const regexScript = "([A-Za-z]{4})";
282
+ const regexExtlang = "([A-Za-z]{3}(-[A-Za-z]{3}){0,2})";
283
+ const regexLanguage = `(([A-Za-z]{2,3}(-${regexExtlang})?)|[A-Za-z]{4}|[A-Za-z]{5,8})`;
284
+ const regexLangtag = `(${regexLanguage}(-${regexScript})?(-${regexRegion})?(-${regexVariant})*(-${regexExtension})*(-${regexPrivateUse})?)`;
285
+ const regexLanguageTag = `^(${regexGrandfathered}|${regexLangtag}|${regexPrivateUse})$`;
286
+ const regex = new RegExp(regexLanguageTag);
287
+ let match;
288
288
 
289
- if ((match = regex.exec(locale)) !== null) {
290
- if (match.index === regex.lastIndex) {
291
- regex.lastIndex++;
292
- }
293
- }
289
+ if ((match = regex.exec(locale)) !== null) {
290
+ if (match.index === regex.lastIndex) {
291
+ regex.lastIndex++;
292
+ }
293
+ }
294
294
 
295
- if (match === undefined || match === null) {
296
- throw new Error("unsupported locale");
297
- }
295
+ if (match === undefined || match === null) {
296
+ throw new Error("unsupported locale");
297
+ }
298
298
 
299
- if (match[6] !== undefined) {
300
- language = match[6];
299
+ if (match[6] !== undefined) {
300
+ language = match[6];
301
301
 
302
- parts = language.split("-");
303
- if (parts.length > 1) {
304
- language = parts[0];
305
- extlang = parts[1];
306
- }
307
- }
302
+ parts = language.split("-");
303
+ if (parts.length > 1) {
304
+ language = parts[0];
305
+ extlang = parts[1];
306
+ }
307
+ }
308
308
 
309
- if (match[14] !== undefined) {
310
- region = match[14];
311
- }
309
+ if (match[14] !== undefined) {
310
+ region = match[14];
311
+ }
312
312
 
313
- if (match[12] !== undefined) {
314
- script = match[12];
315
- }
313
+ if (match[12] !== undefined) {
314
+ script = match[12];
315
+ }
316
316
 
317
- if (match[16] !== undefined) {
318
- variants = match[16];
319
- }
317
+ if (match[16] !== undefined) {
318
+ variants = match[16];
319
+ }
320
320
 
321
- return new Locale(language, region, script, variants, extlang);
321
+ return new Locale(language, region, script, variants, extlang);
322
322
  }
@@ -13,92 +13,92 @@
13
13
  */
14
14
 
15
15
  export const languages = {
16
- "en": "English",
17
- "en-GB": "English (United Kingdom)",
18
- "en-US": "English (United States)",
19
- "en-CA": "English (Canada)",
20
- "en-AU": "English (Australia)",
21
- "es": "Español",
22
- "es-ES": "Español (España)",
23
- "es-MX": "Español (México)",
24
- "es-AR": "Español (Argentina)",
25
- "zh": "中文",
26
- "zh-CN": "中文(简体)",
27
- "zh-TW": "中文(繁體)",
28
- "zh-HK": "中文(香港)",
29
- "fr": "Français",
30
- "fr-FR": "Français (France)",
31
- "fr-CA": "Français (Canada)",
32
- "fr-BE": "Français (Belgique)",
33
- "de": "Deutsch",
34
- "de-DE": "Deutsch (Deutschland)",
35
- "de-AT": "Deutsch (Österreich)",
36
- "de-CH": "Deutsch (Schweiz)",
37
- "ja": "日本語",
38
- "ru": "Русский",
39
- "ru-RU": "Русский (Россия)",
40
- "it": "Italiano",
41
- "it-IT": "Italiano (Italia)",
42
- "pt": "Português",
43
- "pt-PT": "Português (Portugal)",
44
- "pt-BR": "Português (Brasil)",
45
- "ko": "한국어",
46
- "ar": "العربية",
47
- "hi": "हिन्दी",
48
- "bn": "বাংলা",
49
- "pa": "ਪੰਜਾਬੀ",
50
- "id": "Bahasa Indonesia",
51
- "vi": "Tiếng Việt",
52
- "tr": "Türkçe",
53
- "tr-TR": "Türkçe (Türkiye)",
54
- "pl": "Polski",
55
- "pl-PL": "Polski (Polska)",
56
- "uk": "Українська",
57
- "uk-UA": "Українська (Україна)",
58
- "ro": "Română",
59
- "ro-RO": "Română (România)",
60
- "nl": "Nederlands",
61
- "nl-NL": "Nederlands (Nederland)",
62
- "el": "Ελληνικά",
63
- "el-GR": "Ελληνικά (Ελλάδα)",
64
- "hu": "Magyar",
65
- "hu-HU": "Magyar (Magyarország)",
66
- "sv": "Svenska",
67
- "sv-SE": "Svenska (Sverige)",
68
- "cs": "Čeština",
69
- "cs-CZ": "Čeština (Česká republika)",
70
- "bg": "Български",
71
- "bg-BG": "Български (България)",
72
- "da": "Dansk",
73
- "da-DK": "Dansk (Danmark)",
74
- "fi": "Suomi",
75
- "fi-FI": "Suomi (Suomi)",
76
- "sk": "Slovenčina",
77
- "sk-SK": "Slovenčina (Slovensko)",
78
- "he": "עברית",
79
- "th": "ไทย",
80
- "sr": "Српски",
81
- "sr-RS": "Српски (Србија)",
82
- "no": "Norsk",
83
- "no-NO": "Norsk (Norge)",
84
- "lt": "Lietuvių",
85
- "lt-LT": "Lietuvių (Lietuva)",
86
- "lv": "Latviešu",
87
- "lv-LV": "Latviešu (Latvija)",
88
- "et": "Eesti",
89
- "et-EE": "Eesti (Eesti)",
90
- "hr": "Hrvatski",
91
- "hr-HR": "Hrvatski (Hrvatska)",
92
- "sl": "Slovenščina",
93
- "sl-SI": "Slovenščina (Slovenija)",
94
- "mt": "Malti",
95
- "mt-MT": "Malti (Malta)",
96
- "is": "Íslenska",
97
- "is-IS": "Íslenska (Ísland)",
98
- "ga": "Gaeilge",
99
- "ga-IE": "Gaeilge (Éire)",
100
- "cy": "Cymraeg",
101
- "cy-GB": "Cymraeg (Y Deyrnas Unedig)",
102
- "sq": "Shqip",
103
- "sq-AL": "Shqip (Shqipëria)"
16
+ en: "English",
17
+ "en-GB": "English (United Kingdom)",
18
+ "en-US": "English (United States)",
19
+ "en-CA": "English (Canada)",
20
+ "en-AU": "English (Australia)",
21
+ es: "Español",
22
+ "es-ES": "Español (España)",
23
+ "es-MX": "Español (México)",
24
+ "es-AR": "Español (Argentina)",
25
+ zh: "中文",
26
+ "zh-CN": "中文(简体)",
27
+ "zh-TW": "中文(繁體)",
28
+ "zh-HK": "中文(香港)",
29
+ fr: "Français",
30
+ "fr-FR": "Français (France)",
31
+ "fr-CA": "Français (Canada)",
32
+ "fr-BE": "Français (Belgique)",
33
+ de: "Deutsch",
34
+ "de-DE": "Deutsch (Deutschland)",
35
+ "de-AT": "Deutsch (Österreich)",
36
+ "de-CH": "Deutsch (Schweiz)",
37
+ ja: "日本語",
38
+ ru: "Русский",
39
+ "ru-RU": "Русский (Россия)",
40
+ it: "Italiano",
41
+ "it-IT": "Italiano (Italia)",
42
+ pt: "Português",
43
+ "pt-PT": "Português (Portugal)",
44
+ "pt-BR": "Português (Brasil)",
45
+ ko: "한국어",
46
+ ar: "العربية",
47
+ hi: "हिन्दी",
48
+ bn: "বাংলা",
49
+ pa: "ਪੰਜਾਬੀ",
50
+ id: "Bahasa Indonesia",
51
+ vi: "Tiếng Việt",
52
+ tr: "Türkçe",
53
+ "tr-TR": "Türkçe (Türkiye)",
54
+ pl: "Polski",
55
+ "pl-PL": "Polski (Polska)",
56
+ uk: "Українська",
57
+ "uk-UA": "Українська (Україна)",
58
+ ro: "Română",
59
+ "ro-RO": "Română (România)",
60
+ nl: "Nederlands",
61
+ "nl-NL": "Nederlands (Nederland)",
62
+ el: "Ελληνικά",
63
+ "el-GR": "Ελληνικά (Ελλάδα)",
64
+ hu: "Magyar",
65
+ "hu-HU": "Magyar (Magyarország)",
66
+ sv: "Svenska",
67
+ "sv-SE": "Svenska (Sverige)",
68
+ cs: "Čeština",
69
+ "cs-CZ": "Čeština (Česká republika)",
70
+ bg: "Български",
71
+ "bg-BG": "Български (България)",
72
+ da: "Dansk",
73
+ "da-DK": "Dansk (Danmark)",
74
+ fi: "Suomi",
75
+ "fi-FI": "Suomi (Suomi)",
76
+ sk: "Slovenčina",
77
+ "sk-SK": "Slovenčina (Slovensko)",
78
+ he: "עברית",
79
+ th: "ไทย",
80
+ sr: "Српски",
81
+ "sr-RS": "Српски (Србија)",
82
+ no: "Norsk",
83
+ "no-NO": "Norsk (Norge)",
84
+ lt: "Lietuvių",
85
+ "lt-LT": "Lietuvių (Lietuva)",
86
+ lv: "Latviešu",
87
+ "lv-LV": "Latviešu (Latvija)",
88
+ et: "Eesti",
89
+ "et-EE": "Eesti (Eesti)",
90
+ hr: "Hrvatski",
91
+ "hr-HR": "Hrvatski (Hrvatska)",
92
+ sl: "Slovenščina",
93
+ "sl-SI": "Slovenščina (Slovenija)",
94
+ mt: "Malti",
95
+ "mt-MT": "Malti (Malta)",
96
+ is: "Íslenska",
97
+ "is-IS": "Íslenska (Ísland)",
98
+ ga: "Gaeilge",
99
+ "ga-IE": "Gaeilge (Éire)",
100
+ cy: "Cymraeg",
101
+ "cy-GB": "Cymraeg (Y Deyrnas Unedig)",
102
+ sq: "Shqip",
103
+ "sq-AL": "Shqip (Shqipëria)",
104
104
  };