@iobroker/gui-components 10.0.4 → 10.0.5

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.
package/README.md CHANGED
@@ -36,7 +36,7 @@ npm create vite@latest src -- --template react-ts
36
36
  "dependencies": {
37
37
  "@emotion/react": "^11.14.0",
38
38
  "@emotion/styled": "^11.14.1",
39
- "@iobroker/gui-components": "^10.0.4",
39
+ "@iobroker/gui-components": "^10.0.5",
40
40
  "@mui/icons-material": "^9.0.1",
41
41
  "@mui/material": "^9.0.1",
42
42
  "react": "^19.2.5",
@@ -856,6 +856,10 @@ You can find the migration instructions:
856
856
  -->
857
857
 
858
858
  ## Changelog
859
+ ### 10.0.5 (2026-07-27)
860
+
861
+ - (@GermanBluefox) I18n was improved
862
+
859
863
  ### 10.0.4 (2026-07-26)
860
864
 
861
865
  - (@GermanBluefox) Better typing for the `ObjectBrowser` component
package/build/i18n.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>
2
+ * Copyright 2018-2026 Denis Haev (bluefox) <dogafox@gmail.com>
3
3
  *
4
4
  * MIT License
5
5
  *
@@ -9,6 +9,8 @@ declare global {
9
9
  sysLang: ioBroker.Languages;
10
10
  i18nShow: (filter: string | RegExp) => void;
11
11
  i18nDisableWarning: (disable: boolean) => void;
12
+ /** List of all languages with their translations. */
13
+ i18nTranslations: I18nDictionary;
12
14
  }
13
15
  }
14
16
  type I18nWordDictionary = Record<ioBroker.Languages, string>;
@@ -24,12 +26,8 @@ type I18nWordsWithPrefix = I18nDictionary & {
24
26
  * Translation string management.
25
27
  */
26
28
  export declare class I18n {
27
- /** List of all languages with their translations. */
28
- static translations: I18nDictionary;
29
29
  /** List of unknown translations during development. */
30
30
  static unknownTranslations: string[];
31
- /** The currently displayed language. */
32
- static lang: ioBroker.Languages;
33
31
  static _disableWarning: boolean;
34
32
  /**
35
33
  * Set the language to display
@@ -50,6 +48,7 @@ export declare class I18n {
50
48
  /**
51
49
  * Sets all translations (in all languages).
52
50
  *
51
+ * @deprecated Use {@link extendTranslations}
53
52
  * @param translations The translations to add.
54
53
  */
55
54
  static setTranslations(translations: I18nDictionary): void;
package/build/i18n.js CHANGED
@@ -1,19 +1,21 @@
1
1
  /**
2
- * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>
2
+ * Copyright 2018-2026 Denis Haev (bluefox) <dogafox@gmail.com>
3
3
  *
4
4
  * MIT License
5
5
  *
6
6
  */
7
+ // The dictionary and the current language live on `window` instead of in static class fields:
8
+ // module federation can hand a remote its own copy of this module, and only a global keeps every
9
+ // copy working on the same data. Both must exist before the first `extendTranslations` call, so
10
+ // they are initialized here at module scope - that runs before any consumer can reach the class.
11
+ window.i18nTranslations ||= {};
12
+ window.sysLang ||= 'en';
7
13
  /**
8
14
  * Translation string management.
9
15
  */
10
16
  export class I18n {
11
- /** List of all languages with their translations. */
12
- static translations = {};
13
17
  /** List of unknown translations during development. */
14
18
  static unknownTranslations = [];
15
- /** The currently displayed language. */
16
- static lang = window.sysLang || 'en';
17
19
  static _disableWarning = false;
18
20
  /**
19
21
  * Set the language to display
@@ -22,7 +24,7 @@ export class I18n {
22
24
  */
23
25
  static setLanguage(lang) {
24
26
  if (lang) {
25
- I18n.lang = lang;
27
+ window.sysLang = lang;
26
28
  }
27
29
  }
28
30
  /**
@@ -71,8 +73,8 @@ export class I18n {
71
73
  if (words.en && words.de && words.ru) {
72
74
  Object.keys(words).forEach(key => {
73
75
  const _lang = key;
74
- I18n.translations[_lang] ||= {};
75
- Object.assign(I18n.translations[_lang], words[_lang]);
76
+ window.i18nTranslations[_lang] ||= {};
77
+ Object.assign(window.i18nTranslations[_lang], words[_lang]);
76
78
  });
77
79
  }
78
80
  else {
@@ -81,7 +83,7 @@ export class I18n {
81
83
  const _word = words[word];
82
84
  Object.keys(_word).forEach(key => {
83
85
  const _lang = key;
84
- const languageDictionary = I18n.translations[_lang];
86
+ const languageDictionary = window.i18nTranslations[_lang];
85
87
  if (!languageDictionary) {
86
88
  console.warn(`Used unknown language: ${_lang}`);
87
89
  }
@@ -97,11 +99,11 @@ export class I18n {
97
99
  }
98
100
  else {
99
101
  // translations for one language
100
- if (!I18n.translations[lang]) {
102
+ if (!window.i18nTranslations[lang]) {
101
103
  console.warn(`Used unknown language: ${lang}`);
102
104
  }
103
- I18n.translations[lang] ||= {};
104
- const languageDictionary = I18n.translations[lang];
105
+ window.i18nTranslations[lang] ||= {};
106
+ const languageDictionary = window.i18nTranslations[lang];
105
107
  Object.keys(words).forEach(word => {
106
108
  if (!languageDictionary[word]) {
107
109
  languageDictionary[word] = words[word];
@@ -119,11 +121,12 @@ export class I18n {
119
121
  /**
120
122
  * Sets all translations (in all languages).
121
123
  *
124
+ * @deprecated Use {@link extendTranslations}
122
125
  * @param translations The translations to add.
123
126
  */
124
127
  static setTranslations(translations) {
125
128
  if (translations) {
126
- I18n.translations = translations;
129
+ I18n.extendTranslations(translations);
127
130
  }
128
131
  }
129
132
  /**
@@ -132,7 +135,7 @@ export class I18n {
132
135
  * @returns The current language.
133
136
  */
134
137
  static getLanguage() {
135
- return I18n.lang;
138
+ return window.sysLang;
136
139
  }
137
140
  /**
138
141
  * Translate the given string to the selected language
@@ -141,7 +144,7 @@ export class I18n {
141
144
  * @param args Optional arguments which will replace the first (second, third, ...) occurrences of %s
142
145
  */
143
146
  static t(word, ...args) {
144
- const translation = I18n.translations[I18n.lang];
147
+ const translation = window.i18nTranslations[window.sysLang];
145
148
  if (translation) {
146
149
  const w = translation[word];
147
150
  if (w) {
@@ -153,8 +156,8 @@ export class I18n {
153
156
  !I18n._disableWarning && console.log(`Translate: ${word}`);
154
157
  }
155
158
  // fallback to english
156
- if (I18n.lang !== 'en' && I18n.translations.en) {
157
- const wordEn = I18n.translations.en[word];
159
+ if (window.sysLang !== 'en' && window.i18nTranslations.en) {
160
+ const wordEn = window.i18nTranslations.en[word];
158
161
  if (wordEn) {
159
162
  word = wordEn;
160
163
  }
@@ -209,13 +212,4 @@ export class I18n {
209
212
  // install global handlers
210
213
  window.i18nShow = I18n.i18nShow;
211
214
  window.i18nDisableWarning = I18n.disableWarning;
212
- /*
213
- I18n.translations = {
214
- 'en': require('./i18n/en'),
215
- 'ru': require('./i18n/ru'),
216
- 'de': require('./i18n/de'),
217
- };
218
- I18n.fallbacks = true;
219
- I18n.t = function () {};
220
- */
221
215
  //# sourceMappingURL=i18n.js.map
package/build/i18n.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.js","sourceRoot":"./src/","sources":["i18n.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright 2018-2024 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\ndeclare global {\n interface Window {\n sysLang: ioBroker.Languages;\n i18nShow: (filter: string | RegExp) => void;\n i18nDisableWarning: (disable: boolean) => void;\n }\n}\n\ntype I18nWordDictionary = Record<ioBroker.Languages, string>;\n\ntype I18nWordsDictionary = Record<string, I18nWordDictionary>;\n\ntype I18nOneLanguageDictionary = Record<string, string>;\n\ntype I18nDictionary = {\n [lang in ioBroker.Languages]?: I18nOneLanguageDictionary;\n};\n\ntype I18nWordsWithPrefix = I18nDictionary & { prefix?: string };\n\n/**\n * Translation string management.\n */\nexport class I18n {\n /** List of all languages with their translations. */\n static translations: I18nDictionary = {};\n\n /** List of unknown translations during development. */\n static unknownTranslations: string[] = [];\n\n /** The currently displayed language. */\n static lang: ioBroker.Languages = window.sysLang || 'en';\n\n static _disableWarning: boolean = false;\n\n /**\n * Set the language to display\n *\n * @param lang The default language for translations.\n */\n static setLanguage(lang: ioBroker.Languages): void {\n if (lang) {\n I18n.lang = lang;\n }\n }\n\n /**\n * Add translations\n * User can provide two types of structures:\n * - {\"word1\": \"translated word1\", \"word2\": \"translated word2\"}, but in this case the lang must be provided\n * - {\"word1\": {\"en\": \"translated en word1\", \"de\": \"translated de word1\"}, \"word2\": {\"en\": \"translated en word2\", \"de\": \"translated de word2\"}}, but no lang must be provided\n *\n * @param words additional words for specific language\n * @param lang language for the words\n */\n static extendTranslations(\n words: I18nWordsWithPrefix | I18nOneLanguageDictionary | I18nWordsDictionary,\n lang?: ioBroker.Languages,\n ): void {\n // automatically extend all languages with prefix\n if ((words as I18nWordsWithPrefix).prefix) {\n const wordsWithPrefix = words as I18nWordsWithPrefix;\n if (typeof wordsWithPrefix.prefix === 'string') {\n const prefix = wordsWithPrefix.prefix;\n delete wordsWithPrefix.prefix;\n Object.keys(wordsWithPrefix).forEach(key => {\n const _lang = key as ioBroker.Languages;\n const _words: I18nOneLanguageDictionary = {};\n const wordsOfOneLanguage = wordsWithPrefix[_lang];\n Object.keys(wordsOfOneLanguage as Record<string, string>).forEach(word => {\n if (!word) {\n return;\n }\n if (wordsOfOneLanguage) {\n if (!word.startsWith(prefix)) {\n _words[`${prefix}${word}`] = wordsOfOneLanguage[word];\n } else {\n _words[word] = wordsOfOneLanguage[word];\n }\n }\n });\n words[_lang] = _words;\n });\n } else {\n console.warn('Found prefix in translations, but it is not a string');\n }\n }\n\n try {\n if (!lang) {\n // if it is a dictionary with all/many languages\n if (words.en && words.de && words.ru) {\n Object.keys(words).forEach(key => {\n const _lang = key as ioBroker.Languages;\n I18n.translations[_lang] ||= {};\n Object.assign(I18n.translations[_lang], words[_lang]);\n });\n } else {\n // It could be vice versa: words.word1 = {en: 'translated word1', de: 'übersetztes Wort2'}\n Object.keys(words).forEach(word => {\n const _word: I18nWordDictionary = (words as I18nWordsDictionary)[word];\n Object.keys(_word).forEach(key => {\n const _lang = key as ioBroker.Languages;\n const languageDictionary: I18nOneLanguageDictionary | undefined = I18n.translations[_lang];\n if (!languageDictionary) {\n console.warn(`Used unknown language: ${_lang}`);\n } else if (!languageDictionary[word]) {\n languageDictionary[word] = _word[_lang];\n } else if (languageDictionary[word] !== _word[_lang]) {\n console.warn(\n `Translation for word \"${word}\" in \"${_lang}\" was ignored: existing = \"${languageDictionary[word]}\", new = ${_word[_lang]}`,\n );\n }\n });\n });\n }\n } else {\n // translations for one language\n if (!I18n.translations[lang]) {\n console.warn(`Used unknown language: ${lang}`);\n }\n I18n.translations[lang] ||= {};\n const languageDictionary = I18n.translations[lang];\n Object.keys(words).forEach(word => {\n if (!languageDictionary[word]) {\n languageDictionary[word] = (words as I18nOneLanguageDictionary)[word];\n } else if (languageDictionary[word] !== (words as I18nOneLanguageDictionary)[word]) {\n console.warn(\n `Translation for word \"${word}\" in \"${lang}\" was ignored: existing = \"${languageDictionary[word]}\", new = ${(words as I18nOneLanguageDictionary)[word]}`,\n );\n }\n });\n }\n } catch (e: any) {\n console.error(`Cannot apply translations: ${e}`);\n }\n }\n\n /**\n * Sets all translations (in all languages).\n *\n * @param translations The translations to add.\n */\n static setTranslations(translations: I18nDictionary): void {\n if (translations) {\n I18n.translations = translations;\n }\n }\n\n /**\n * Get the currently chosen language.\n *\n * @returns The current language.\n */\n static getLanguage(): ioBroker.Languages {\n return I18n.lang;\n }\n\n /**\n * Translate the given string to the selected language\n *\n * @param word The (key) word to look up the string.\n * @param args Optional arguments which will replace the first (second, third, ...) occurrences of %s\n */\n static t(word: string, ...args: any[]): string {\n const translation = I18n.translations[I18n.lang];\n if (translation) {\n const w = translation[word];\n if (w) {\n word = w;\n } else {\n if (!I18n.unknownTranslations.includes(word)) {\n I18n.unknownTranslations.push(word);\n !I18n._disableWarning && console.log(`Translate: ${word}`);\n }\n // fallback to english\n if (I18n.lang !== 'en' && I18n.translations.en) {\n const wordEn = I18n.translations.en[word];\n if (wordEn) {\n word = wordEn;\n }\n }\n }\n }\n for (const arg of args) {\n word = word.replace('%s', arg);\n }\n return word;\n }\n\n /**\n * Show non-translated words\n * Required during development\n *\n * @param filter The filter to apply to the list of non-translated words.\n */\n static i18nShow(filter?: string | RegExp): void {\n /** List words with their translations. */\n const result: Record<string, string> = {};\n if (!filter) {\n I18n.unknownTranslations.forEach(word => (result[word] = word));\n console.log(JSON.stringify(result, null, 2));\n } else if (typeof filter === 'string') {\n I18n.unknownTranslations.forEach(word => {\n if (word.startsWith(filter)) {\n result[word] = word.replace(filter, '');\n }\n });\n console.log(JSON.stringify(result, null, 2));\n } else if (filter && typeof filter === 'object') {\n I18n.unknownTranslations.forEach(word => {\n if (filter.test(word)) {\n result[word] = word;\n }\n });\n console.log(JSON.stringify(result, null, 2));\n }\n }\n\n /**\n * Disable warning about non-translated words\n * Required during development\n *\n * @param disable Whether to disable the warning\n */\n static disableWarning(disable: boolean): void {\n I18n._disableWarning = !!disable;\n }\n}\n\n// install global handlers\nwindow.i18nShow = I18n.i18nShow;\nwindow.i18nDisableWarning = I18n.disableWarning;\n\n/*\nI18n.translations = {\n 'en': require('./i18n/en'),\n 'ru': require('./i18n/ru'),\n 'de': require('./i18n/de'),\n};\nI18n.fallbacks = true;\nI18n.t = function () {};\n*/\n"]}
1
+ {"version":3,"file":"i18n.js","sourceRoot":"./src/","sources":["i18n.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright 2018-2026 Denis Haev (bluefox) <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\ndeclare global {\n interface Window {\n sysLang: ioBroker.Languages;\n i18nShow: (filter: string | RegExp) => void;\n i18nDisableWarning: (disable: boolean) => void;\n /** List of all languages with their translations. */\n i18nTranslations: I18nDictionary;\n }\n}\n\ntype I18nWordDictionary = Record<ioBroker.Languages, string>;\n\ntype I18nWordsDictionary = Record<string, I18nWordDictionary>;\n\ntype I18nOneLanguageDictionary = Record<string, string>;\n\ntype I18nDictionary = {\n [lang in ioBroker.Languages]?: I18nOneLanguageDictionary;\n};\n\ntype I18nWordsWithPrefix = I18nDictionary & { prefix?: string };\n\n// The dictionary and the current language live on `window` instead of in static class fields:\n// module federation can hand a remote its own copy of this module, and only a global keeps every\n// copy working on the same data. Both must exist before the first `extendTranslations` call, so\n// they are initialized here at module scope - that runs before any consumer can reach the class.\nwindow.i18nTranslations ||= {};\nwindow.sysLang ||= 'en';\n\n/**\n * Translation string management.\n */\nexport class I18n {\n /** List of unknown translations during development. */\n static unknownTranslations: string[] = [];\n\n static _disableWarning: boolean = false;\n\n /**\n * Set the language to display\n *\n * @param lang The default language for translations.\n */\n static setLanguage(lang: ioBroker.Languages): void {\n if (lang) {\n window.sysLang = lang;\n }\n }\n\n /**\n * Add translations\n * User can provide two types of structures:\n * - {\"word1\": \"translated word1\", \"word2\": \"translated word2\"}, but in this case the lang must be provided\n * - {\"word1\": {\"en\": \"translated en word1\", \"de\": \"translated de word1\"}, \"word2\": {\"en\": \"translated en word2\", \"de\": \"translated de word2\"}}, but no lang must be provided\n *\n * @param words additional words for specific language\n * @param lang language for the words\n */\n static extendTranslations(\n words: I18nWordsWithPrefix | I18nOneLanguageDictionary | I18nWordsDictionary,\n lang?: ioBroker.Languages,\n ): void {\n // automatically extend all languages with prefix\n if ((words as I18nWordsWithPrefix).prefix) {\n const wordsWithPrefix = words as I18nWordsWithPrefix;\n if (typeof wordsWithPrefix.prefix === 'string') {\n const prefix = wordsWithPrefix.prefix;\n delete wordsWithPrefix.prefix;\n Object.keys(wordsWithPrefix).forEach(key => {\n const _lang = key as ioBroker.Languages;\n const _words: I18nOneLanguageDictionary = {};\n const wordsOfOneLanguage = wordsWithPrefix[_lang];\n Object.keys(wordsOfOneLanguage as Record<string, string>).forEach(word => {\n if (!word) {\n return;\n }\n if (wordsOfOneLanguage) {\n if (!word.startsWith(prefix)) {\n _words[`${prefix}${word}`] = wordsOfOneLanguage[word];\n } else {\n _words[word] = wordsOfOneLanguage[word];\n }\n }\n });\n words[_lang] = _words;\n });\n } else {\n console.warn('Found prefix in translations, but it is not a string');\n }\n }\n\n try {\n if (!lang) {\n // if it is a dictionary with all/many languages\n if (words.en && words.de && words.ru) {\n Object.keys(words).forEach(key => {\n const _lang = key as ioBroker.Languages;\n window.i18nTranslations[_lang] ||= {};\n Object.assign(window.i18nTranslations[_lang], words[_lang]);\n });\n } else {\n // It could be vice versa: words.word1 = {en: 'translated word1', de: 'übersetztes Wort2'}\n Object.keys(words).forEach(word => {\n const _word: I18nWordDictionary = (words as I18nWordsDictionary)[word];\n Object.keys(_word).forEach(key => {\n const _lang = key as ioBroker.Languages;\n const languageDictionary: I18nOneLanguageDictionary | undefined =\n window.i18nTranslations[_lang];\n if (!languageDictionary) {\n console.warn(`Used unknown language: ${_lang}`);\n } else if (!languageDictionary[word]) {\n languageDictionary[word] = _word[_lang];\n } else if (languageDictionary[word] !== _word[_lang]) {\n console.warn(\n `Translation for word \"${word}\" in \"${_lang}\" was ignored: existing = \"${languageDictionary[word]}\", new = ${_word[_lang]}`,\n );\n }\n });\n });\n }\n } else {\n // translations for one language\n if (!window.i18nTranslations[lang]) {\n console.warn(`Used unknown language: ${lang}`);\n }\n window.i18nTranslations[lang] ||= {};\n const languageDictionary = window.i18nTranslations[lang];\n Object.keys(words).forEach(word => {\n if (!languageDictionary[word]) {\n languageDictionary[word] = (words as I18nOneLanguageDictionary)[word];\n } else if (languageDictionary[word] !== (words as I18nOneLanguageDictionary)[word]) {\n console.warn(\n `Translation for word \"${word}\" in \"${lang}\" was ignored: existing = \"${languageDictionary[word]}\", new = ${(words as I18nOneLanguageDictionary)[word]}`,\n );\n }\n });\n }\n } catch (e: any) {\n console.error(`Cannot apply translations: ${e}`);\n }\n }\n\n /**\n * Sets all translations (in all languages).\n *\n * @deprecated Use {@link extendTranslations}\n * @param translations The translations to add.\n */\n static setTranslations(translations: I18nDictionary): void {\n if (translations) {\n I18n.extendTranslations(translations);\n }\n }\n\n /**\n * Get the currently chosen language.\n *\n * @returns The current language.\n */\n static getLanguage(): ioBroker.Languages {\n return window.sysLang;\n }\n\n /**\n * Translate the given string to the selected language\n *\n * @param word The (key) word to look up the string.\n * @param args Optional arguments which will replace the first (second, third, ...) occurrences of %s\n */\n static t(word: string, ...args: any[]): string {\n const translation = window.i18nTranslations[window.sysLang];\n if (translation) {\n const w = translation[word];\n if (w) {\n word = w;\n } else {\n if (!I18n.unknownTranslations.includes(word)) {\n I18n.unknownTranslations.push(word);\n !I18n._disableWarning && console.log(`Translate: ${word}`);\n }\n // fallback to english\n if (window.sysLang !== 'en' && window.i18nTranslations.en) {\n const wordEn = window.i18nTranslations.en[word];\n if (wordEn) {\n word = wordEn;\n }\n }\n }\n }\n for (const arg of args) {\n word = word.replace('%s', arg);\n }\n return word;\n }\n\n /**\n * Show non-translated words\n * Required during development\n *\n * @param filter The filter to apply to the list of non-translated words.\n */\n static i18nShow(filter?: string | RegExp): void {\n /** List words with their translations. */\n const result: Record<string, string> = {};\n if (!filter) {\n I18n.unknownTranslations.forEach(word => (result[word] = word));\n console.log(JSON.stringify(result, null, 2));\n } else if (typeof filter === 'string') {\n I18n.unknownTranslations.forEach(word => {\n if (word.startsWith(filter)) {\n result[word] = word.replace(filter, '');\n }\n });\n console.log(JSON.stringify(result, null, 2));\n } else if (filter && typeof filter === 'object') {\n I18n.unknownTranslations.forEach(word => {\n if (filter.test(word)) {\n result[word] = word;\n }\n });\n console.log(JSON.stringify(result, null, 2));\n }\n }\n\n /**\n * Disable warning about non-translated words\n * Required during development\n *\n * @param disable Whether to disable the warning\n */\n static disableWarning(disable: boolean): void {\n I18n._disableWarning = !!disable;\n }\n}\n\n// install global handlers\nwindow.i18nShow = I18n.i18nShow;\nwindow.i18nDisableWarning = I18n.disableWarning;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iobroker/gui-components",
3
- "version": "10.0.4",
3
+ "version": "10.0.5",
4
4
  "description": "Shared React components (React 19 / MUI 9) to develop ioBroker interfaces. Successor of @iobroker/adapter-react-v5.",
5
5
  "author": {
6
6
  "name": "bluefox",