@douglasneuroinformatics/libui 4.8.0 → 4.8.1
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/dist/{chunk-LUBCG4SG.js → chunk-D3AIKQQK.js} +2 -2
- package/dist/{chunk-QD5QDCYF.js → chunk-JRAEWBJS.js} +2 -2
- package/dist/{chunk-GT5NL2RJ.js → chunk-MCINJHF5.js} +4 -2
- package/dist/chunk-MCINJHF5.js.map +1 -0
- package/dist/components.js +3 -3
- package/dist/hooks.js +2 -2
- package/dist/i18n.js +1 -1
- package/dist/providers.js +3 -3
- package/package.json +1 -1
- package/src/i18n/__tests__/translator.test.ts +23 -0
- package/src/i18n/translator.ts +3 -1
- package/dist/chunk-GT5NL2RJ.js.map +0 -1
- /package/dist/{chunk-LUBCG4SG.js.map → chunk-D3AIKQQK.js.map} +0 -0
- /package/dist/{chunk-QD5QDCYF.js.map → chunk-JRAEWBJS.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
import {
|
|
3
3
|
i18n
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-MCINJHF5.js";
|
|
5
5
|
import {
|
|
6
6
|
isBrowser
|
|
7
7
|
} from "./chunk-HCQE34RL.js";
|
|
@@ -411,4 +411,4 @@ export {
|
|
|
411
411
|
useTranslation,
|
|
412
412
|
useWindowSize
|
|
413
413
|
};
|
|
414
|
-
//# sourceMappingURL=chunk-
|
|
414
|
+
//# sourceMappingURL=chunk-D3AIKQQK.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
useNotificationsStore,
|
|
4
4
|
useTranslation
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-D3AIKQQK.js";
|
|
6
6
|
import {
|
|
7
7
|
cn
|
|
8
8
|
} from "./chunk-HCQE34RL.js";
|
|
@@ -322,4 +322,4 @@ export {
|
|
|
322
322
|
Dialog,
|
|
323
323
|
NotificationHub
|
|
324
324
|
};
|
|
325
|
-
//# sourceMappingURL=chunk-
|
|
325
|
+
//# sourceMappingURL=chunk-JRAEWBJS.js.map
|
|
@@ -235,7 +235,9 @@ var Translator = class {
|
|
|
235
235
|
}
|
|
236
236
|
changeLanguage(language) {
|
|
237
237
|
__privateSet(this, _resolvedLanguage, language);
|
|
238
|
-
document
|
|
238
|
+
if (typeof document !== "undefined") {
|
|
239
|
+
document.documentElement.lang = language;
|
|
240
|
+
}
|
|
239
241
|
this.emitEvent("languageChange", [language]);
|
|
240
242
|
}
|
|
241
243
|
init({ defaultLanguage, translations }) {
|
|
@@ -303,4 +305,4 @@ var i18n = new Translator();
|
|
|
303
305
|
export {
|
|
304
306
|
i18n
|
|
305
307
|
};
|
|
306
|
-
//# sourceMappingURL=chunk-
|
|
308
|
+
//# sourceMappingURL=chunk-MCINJHF5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/i18n/translator.ts","../src/i18n/translations/libui.json","../src/i18n/index.ts"],"sourcesContent":["import { format } from '@douglasneuroinformatics/libjs';\nimport { get } from 'lodash-es';\nimport type { SetOptional } from 'type-fest';\n\nimport libui from './translations/libui.json';\n\nimport type {\n Language,\n TranslateFormatArgs,\n TranslateOptions,\n TranslationKey,\n Translations,\n TranslatorType\n} from './types';\n\ntype TranslatorEventMap = {\n languageChange: (...args: [language: Language]) => void;\n};\n\ntype TranslatorConfig = {\n defaultLanguage?: Language;\n translations: SetOptional<Translations, 'libui'>;\n};\n\nfunction InitializedOnly<T extends Translator, TArgs extends any[], TReturn>(\n target: (this: T, ...args: TArgs) => TReturn,\n context: ClassGetterDecoratorContext<T> | ClassMethodDecoratorContext<T> | ClassSetterDecoratorContext<T>\n) {\n const name = context.name.toString();\n function replacementMethod(this: T, ...args: TArgs): TReturn {\n if (!this.isInitialized) {\n throw new Error(`Cannot access ${context.kind} '${name}' of Translator instance before initialization`);\n }\n return target.call(this, ...args);\n }\n return replacementMethod;\n}\n\nexport class Translator implements TranslatorType<TranslationKey> {\n #config: Required<TranslatorConfig>;\n #eventHandlers: {\n [K in keyof TranslatorEventMap]: Set<TranslatorEventMap[K]>;\n };\n #resolvedLanguage: Language;\n\n constructor() {\n // in the implementation, these should only be accessed in methods decorated with @InitializedOnly\n this.#config = null!;\n this.#eventHandlers = {\n languageChange: new Set()\n };\n this.#resolvedLanguage = null!;\n }\n\n get isInitialized() {\n return this.#config !== null;\n }\n\n @InitializedOnly\n get resolvedLanguage() {\n return this.#resolvedLanguage;\n }\n\n addEventListener<TKey extends keyof TranslatorEventMap>(key: TKey, handler: TranslatorEventMap[TKey]) {\n this.#eventHandlers[key].add(handler);\n }\n\n @InitializedOnly\n changeLanguage(language: Language) {\n this.#resolvedLanguage = language;\n if (typeof document !== 'undefined') {\n document.documentElement.lang = language;\n }\n this.emitEvent('languageChange', [language]);\n }\n\n init({ defaultLanguage, translations }: TranslatorConfig) {\n if (this.isInitialized) {\n throw new Error('Cannot reinitialize Translator');\n }\n this.#config = {\n defaultLanguage: defaultLanguage ?? 'en',\n translations: {\n libui,\n ...translations\n }\n };\n this.changeLanguage(this.#config.defaultLanguage);\n }\n\n removeEventListener<TKey extends keyof TranslatorEventMap>(key: TKey, handler: TranslatorEventMap[TKey]) {\n return this.#eventHandlers[key].delete(handler);\n }\n\n @InitializedOnly\n t(target: TranslationKey | { [L in Language]?: string }, { args }: TranslateOptions = {}): string {\n let obj: { [key: string]: string };\n if (typeof target === 'string') {\n obj = (get(this.#config.translations, target) ?? {}) as { [key: string]: string };\n } else {\n obj = target;\n }\n const value = obj[this.#resolvedLanguage] ?? obj[this.#config.defaultLanguage];\n if (!value) {\n console.error(`Failed to extract translation from object '${JSON.stringify(obj)}'`);\n return '';\n }\n if (!args) {\n return value;\n }\n return format(value, ...this.getFormatArgs(args));\n }\n\n private emitEvent<TKey extends keyof TranslatorEventMap>(key: TKey, payload: Parameters<TranslatorEventMap[TKey]>) {\n this.#eventHandlers[key].forEach((fn: (...args: any[]) => any) => {\n fn(...payload);\n });\n }\n\n private getFormatArgs(args: TranslateFormatArgs) {\n if (Array.isArray(args)) {\n return args;\n }\n const result = args[this.#resolvedLanguage] ?? args[this.#config.defaultLanguage];\n if (!result) {\n console.error(`Failed to extract args from object '${JSON.stringify(args)}'`);\n return [];\n }\n return result;\n }\n}\n","{\n \"days\": {\n \"friday\": {\n \"en\": \"Friday\",\n \"fr\": \"Vendredi\"\n },\n \"monday\": {\n \"en\": \"Monday\",\n \"fr\": \"Lundi\"\n },\n \"saturday\": {\n \"en\": \"Saturday\",\n \"fr\": \"Samedi\"\n },\n \"sunday\": {\n \"en\": \"Sunday\",\n \"fr\": \"Dimanche\"\n },\n \"thursday\": {\n \"en\": \"Thursday\",\n \"fr\": \"Jeudi\"\n },\n \"tuesday\": {\n \"en\": \"Tuesday\",\n \"fr\": \"Mardi\"\n },\n \"wednesday\": {\n \"en\": \"Wednesday\",\n \"fr\": \"Mercredi\"\n }\n },\n \"form\": {\n \"append\": {\n \"en\": \"Append\",\n \"fr\": \"Ajouter\"\n },\n \"radioLabels\": {\n \"false\": {\n \"en\": \"False\",\n \"fr\": \"Faux\"\n },\n \"true\": {\n \"en\": \"True\",\n \"fr\": \"Vrai\"\n }\n },\n \"remove\": {\n \"en\": \"Remove\",\n \"fr\": \"Supprimer\"\n },\n \"required\": {\n \"en\": \"This field is required\",\n \"fr\": \"Ce champ est obligatoire\"\n },\n \"reset\": {\n \"en\": \"Reset\",\n \"fr\": \"Réinitialiser\"\n },\n \"submit\": {\n \"en\": \"Submit\",\n \"fr\": \"Soumettre\"\n }\n },\n \"months\": {\n \"april\": {\n \"en\": \"April\",\n \"fr\": \"Avril\"\n },\n \"august\": {\n \"en\": \"August\",\n \"fr\": \"Août\"\n },\n \"december\": {\n \"en\": \"December\",\n \"fr\": \"Décembre\"\n },\n \"february\": {\n \"en\": \"February\",\n \"fr\": \"Février\"\n },\n \"january\": {\n \"en\": \"January\",\n \"fr\": \"Janvier\"\n },\n \"july\": {\n \"en\": \"July\",\n \"fr\": \"Juillet\"\n },\n \"june\": {\n \"en\": \"June\",\n \"fr\": \"Juin\"\n },\n \"march\": {\n \"en\": \"March\",\n \"fr\": \"Mars\"\n },\n \"may\": {\n \"en\": \"May\",\n \"fr\": \"Mai\"\n },\n \"november\": {\n \"en\": \"November\",\n \"fr\": \"Novembre\"\n },\n \"october\": {\n \"en\": \"October\",\n \"fr\": \"Octobre\"\n },\n \"september\": {\n \"en\": \"September\",\n \"fr\": \"Septembre\"\n }\n },\n \"notifications\": {\n \"types\": {\n \"error\": {\n \"en\": \"Error\",\n \"fr\": \"Erreur\"\n },\n \"info\": {\n \"en\": \"Info\",\n \"fr\": \"Attention\"\n },\n \"success\": {\n \"en\": \"Success\",\n \"fr\": \"Succès\"\n },\n \"warning\": {\n \"en\": \"Warning\",\n \"fr\": \"Avertissement\"\n }\n }\n },\n \"oneTimePasswordInput\": {\n \"invalidCodeFormat\": {\n \"en\": \"Invalid code format\",\n \"fr\": \"Format de code invalide\"\n }\n },\n \"pagination\": {\n \"firstPage\": {\n \"en\": \"<< First\",\n \"fr\": \"<< Première\"\n },\n \"first\": {\n \"en\": \"First\",\n \"fr\": \"Première\"\n },\n \"info\": {\n \"en\": \"Showing {{first}} to {{last}} of {{total}} results\",\n \"fr\": \"Affichage de {{first}} à {{last}} sur {{total}} résultats\"\n },\n \"lastPage\": {\n \"en\": \"Last >>\",\n \"fr\": \"Dernière >>\"\n },\n \"last\": {\n \"en\": \"Last\",\n \"fr\": \"Dernière\"\n },\n \"next\": {\n \"en\": \"Next\",\n \"fr\": \"Suivant\"\n },\n \"previous\": {\n \"en\": \"Previous\",\n \"fr\": \"Précédent\"\n }\n },\n \"searchBar\": {\n \"placeholder\": {\n \"en\": \"Search...\",\n \"fr\": \"Rechercher...\"\n }\n },\n \"yes\": {\n \"en\": \"Yes\",\n \"fr\": \"Oui\"\n },\n \"no\": {\n \"en\": \"No\",\n \"fr\": \"Non\"\n }\n}\n","import { Translator } from './translator.ts';\n\nexport const i18n = new Translator();\n\nexport * from './types.ts';\n"],"mappings":"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","names":[]}
|
package/dist/components.js
CHANGED
|
@@ -6,15 +6,15 @@ import {
|
|
|
6
6
|
Dialog,
|
|
7
7
|
NotificationHub,
|
|
8
8
|
buttonVariants
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-JRAEWBJS.js";
|
|
10
10
|
import {
|
|
11
11
|
ChartContext,
|
|
12
12
|
useChart,
|
|
13
13
|
useNotificationsStore,
|
|
14
14
|
useTheme,
|
|
15
15
|
useTranslation
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
} from "./chunk-D3AIKQQK.js";
|
|
17
|
+
import "./chunk-MCINJHF5.js";
|
|
18
18
|
import {
|
|
19
19
|
cn
|
|
20
20
|
} from "./chunk-HCQE34RL.js";
|
package/dist/hooks.js
CHANGED
|
@@ -20,8 +20,8 @@ import {
|
|
|
20
20
|
useTheme,
|
|
21
21
|
useTranslation,
|
|
22
22
|
useWindowSize
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-
|
|
23
|
+
} from "./chunk-D3AIKQQK.js";
|
|
24
|
+
import "./chunk-MCINJHF5.js";
|
|
25
25
|
import "./chunk-HCQE34RL.js";
|
|
26
26
|
import "./chunk-5B62SIBQ.js";
|
|
27
27
|
export {
|
package/dist/i18n.js
CHANGED
package/dist/providers.js
CHANGED
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
Button,
|
|
4
4
|
Dialog,
|
|
5
5
|
NotificationHub
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-JRAEWBJS.js";
|
|
7
7
|
import {
|
|
8
8
|
useDestructiveActionStore,
|
|
9
9
|
useTranslation
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-D3AIKQQK.js";
|
|
11
|
+
import "./chunk-MCINJHF5.js";
|
|
12
12
|
import "./chunk-HCQE34RL.js";
|
|
13
13
|
import "./chunk-5B62SIBQ.js";
|
|
14
14
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@douglasneuroinformatics/libui",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "4.8.
|
|
4
|
+
"version": "4.8.1",
|
|
5
5
|
"packageManager": "pnpm@10.7.1",
|
|
6
6
|
"description": "Generic UI components for DNP projects, built using React and Tailwind CSS",
|
|
7
7
|
"author": "Joshua Unrau",
|
|
@@ -88,4 +88,27 @@ describe('Translator', () => {
|
|
|
88
88
|
)
|
|
89
89
|
).toBe('Bonjour, tout le monde');
|
|
90
90
|
});
|
|
91
|
+
|
|
92
|
+
it('should handle SSR environment where document is undefined', () => {
|
|
93
|
+
const ssrTranslator = new Translator();
|
|
94
|
+
const originalDocument = global.document;
|
|
95
|
+
|
|
96
|
+
// Simulate SSR environment
|
|
97
|
+
// @ts-expect-error - deliberately setting document to undefined for SSR test
|
|
98
|
+
delete global.document;
|
|
99
|
+
|
|
100
|
+
expect(() => {
|
|
101
|
+
ssrTranslator.init({ defaultLanguage: 'en', translations: {} });
|
|
102
|
+
}).not.toThrow();
|
|
103
|
+
|
|
104
|
+
expect(() => {
|
|
105
|
+
ssrTranslator.changeLanguage('fr');
|
|
106
|
+
}).not.toThrow();
|
|
107
|
+
|
|
108
|
+
expect(ssrTranslator.resolvedLanguage).toBe('fr');
|
|
109
|
+
expect(ssrTranslator.t('libui.days.monday')).toBe('Lundi');
|
|
110
|
+
|
|
111
|
+
// Restore document
|
|
112
|
+
global.document = originalDocument;
|
|
113
|
+
});
|
|
91
114
|
});
|
package/src/i18n/translator.ts
CHANGED
|
@@ -68,7 +68,9 @@ export class Translator implements TranslatorType<TranslationKey> {
|
|
|
68
68
|
@InitializedOnly
|
|
69
69
|
changeLanguage(language: Language) {
|
|
70
70
|
this.#resolvedLanguage = language;
|
|
71
|
-
document
|
|
71
|
+
if (typeof document !== 'undefined') {
|
|
72
|
+
document.documentElement.lang = language;
|
|
73
|
+
}
|
|
72
74
|
this.emitEvent('languageChange', [language]);
|
|
73
75
|
}
|
|
74
76
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/i18n/translator.ts","../src/i18n/translations/libui.json","../src/i18n/index.ts"],"sourcesContent":["import { format } from '@douglasneuroinformatics/libjs';\nimport { get } from 'lodash-es';\nimport type { SetOptional } from 'type-fest';\n\nimport libui from './translations/libui.json';\n\nimport type {\n Language,\n TranslateFormatArgs,\n TranslateOptions,\n TranslationKey,\n Translations,\n TranslatorType\n} from './types';\n\ntype TranslatorEventMap = {\n languageChange: (...args: [language: Language]) => void;\n};\n\ntype TranslatorConfig = {\n defaultLanguage?: Language;\n translations: SetOptional<Translations, 'libui'>;\n};\n\nfunction InitializedOnly<T extends Translator, TArgs extends any[], TReturn>(\n target: (this: T, ...args: TArgs) => TReturn,\n context: ClassGetterDecoratorContext<T> | ClassMethodDecoratorContext<T> | ClassSetterDecoratorContext<T>\n) {\n const name = context.name.toString();\n function replacementMethod(this: T, ...args: TArgs): TReturn {\n if (!this.isInitialized) {\n throw new Error(`Cannot access ${context.kind} '${name}' of Translator instance before initialization`);\n }\n return target.call(this, ...args);\n }\n return replacementMethod;\n}\n\nexport class Translator implements TranslatorType<TranslationKey> {\n #config: Required<TranslatorConfig>;\n #eventHandlers: {\n [K in keyof TranslatorEventMap]: Set<TranslatorEventMap[K]>;\n };\n #resolvedLanguage: Language;\n\n constructor() {\n // in the implementation, these should only be accessed in methods decorated with @InitializedOnly\n this.#config = null!;\n this.#eventHandlers = {\n languageChange: new Set()\n };\n this.#resolvedLanguage = null!;\n }\n\n get isInitialized() {\n return this.#config !== null;\n }\n\n @InitializedOnly\n get resolvedLanguage() {\n return this.#resolvedLanguage;\n }\n\n addEventListener<TKey extends keyof TranslatorEventMap>(key: TKey, handler: TranslatorEventMap[TKey]) {\n this.#eventHandlers[key].add(handler);\n }\n\n @InitializedOnly\n changeLanguage(language: Language) {\n this.#resolvedLanguage = language;\n document.documentElement.lang = language;\n this.emitEvent('languageChange', [language]);\n }\n\n init({ defaultLanguage, translations }: TranslatorConfig) {\n if (this.isInitialized) {\n throw new Error('Cannot reinitialize Translator');\n }\n this.#config = {\n defaultLanguage: defaultLanguage ?? 'en',\n translations: {\n libui,\n ...translations\n }\n };\n this.changeLanguage(this.#config.defaultLanguage);\n }\n\n removeEventListener<TKey extends keyof TranslatorEventMap>(key: TKey, handler: TranslatorEventMap[TKey]) {\n return this.#eventHandlers[key].delete(handler);\n }\n\n @InitializedOnly\n t(target: TranslationKey | { [L in Language]?: string }, { args }: TranslateOptions = {}): string {\n let obj: { [key: string]: string };\n if (typeof target === 'string') {\n obj = (get(this.#config.translations, target) ?? {}) as { [key: string]: string };\n } else {\n obj = target;\n }\n const value = obj[this.#resolvedLanguage] ?? obj[this.#config.defaultLanguage];\n if (!value) {\n console.error(`Failed to extract translation from object '${JSON.stringify(obj)}'`);\n return '';\n }\n if (!args) {\n return value;\n }\n return format(value, ...this.getFormatArgs(args));\n }\n\n private emitEvent<TKey extends keyof TranslatorEventMap>(key: TKey, payload: Parameters<TranslatorEventMap[TKey]>) {\n this.#eventHandlers[key].forEach((fn: (...args: any[]) => any) => {\n fn(...payload);\n });\n }\n\n private getFormatArgs(args: TranslateFormatArgs) {\n if (Array.isArray(args)) {\n return args;\n }\n const result = args[this.#resolvedLanguage] ?? args[this.#config.defaultLanguage];\n if (!result) {\n console.error(`Failed to extract args from object '${JSON.stringify(args)}'`);\n return [];\n }\n return result;\n }\n}\n","{\n \"days\": {\n \"friday\": {\n \"en\": \"Friday\",\n \"fr\": \"Vendredi\"\n },\n \"monday\": {\n \"en\": \"Monday\",\n \"fr\": \"Lundi\"\n },\n \"saturday\": {\n \"en\": \"Saturday\",\n \"fr\": \"Samedi\"\n },\n \"sunday\": {\n \"en\": \"Sunday\",\n \"fr\": \"Dimanche\"\n },\n \"thursday\": {\n \"en\": \"Thursday\",\n \"fr\": \"Jeudi\"\n },\n \"tuesday\": {\n \"en\": \"Tuesday\",\n \"fr\": \"Mardi\"\n },\n \"wednesday\": {\n \"en\": \"Wednesday\",\n \"fr\": \"Mercredi\"\n }\n },\n \"form\": {\n \"append\": {\n \"en\": \"Append\",\n \"fr\": \"Ajouter\"\n },\n \"radioLabels\": {\n \"false\": {\n \"en\": \"False\",\n \"fr\": \"Faux\"\n },\n \"true\": {\n \"en\": \"True\",\n \"fr\": \"Vrai\"\n }\n },\n \"remove\": {\n \"en\": \"Remove\",\n \"fr\": \"Supprimer\"\n },\n \"required\": {\n \"en\": \"This field is required\",\n \"fr\": \"Ce champ est obligatoire\"\n },\n \"reset\": {\n \"en\": \"Reset\",\n \"fr\": \"Réinitialiser\"\n },\n \"submit\": {\n \"en\": \"Submit\",\n \"fr\": \"Soumettre\"\n }\n },\n \"months\": {\n \"april\": {\n \"en\": \"April\",\n \"fr\": \"Avril\"\n },\n \"august\": {\n \"en\": \"August\",\n \"fr\": \"Août\"\n },\n \"december\": {\n \"en\": \"December\",\n \"fr\": \"Décembre\"\n },\n \"february\": {\n \"en\": \"February\",\n \"fr\": \"Février\"\n },\n \"january\": {\n \"en\": \"January\",\n \"fr\": \"Janvier\"\n },\n \"july\": {\n \"en\": \"July\",\n \"fr\": \"Juillet\"\n },\n \"june\": {\n \"en\": \"June\",\n \"fr\": \"Juin\"\n },\n \"march\": {\n \"en\": \"March\",\n \"fr\": \"Mars\"\n },\n \"may\": {\n \"en\": \"May\",\n \"fr\": \"Mai\"\n },\n \"november\": {\n \"en\": \"November\",\n \"fr\": \"Novembre\"\n },\n \"october\": {\n \"en\": \"October\",\n \"fr\": \"Octobre\"\n },\n \"september\": {\n \"en\": \"September\",\n \"fr\": \"Septembre\"\n }\n },\n \"notifications\": {\n \"types\": {\n \"error\": {\n \"en\": \"Error\",\n \"fr\": \"Erreur\"\n },\n \"info\": {\n \"en\": \"Info\",\n \"fr\": \"Attention\"\n },\n \"success\": {\n \"en\": \"Success\",\n \"fr\": \"Succès\"\n },\n \"warning\": {\n \"en\": \"Warning\",\n \"fr\": \"Avertissement\"\n }\n }\n },\n \"oneTimePasswordInput\": {\n \"invalidCodeFormat\": {\n \"en\": \"Invalid code format\",\n \"fr\": \"Format de code invalide\"\n }\n },\n \"pagination\": {\n \"firstPage\": {\n \"en\": \"<< First\",\n \"fr\": \"<< Première\"\n },\n \"first\": {\n \"en\": \"First\",\n \"fr\": \"Première\"\n },\n \"info\": {\n \"en\": \"Showing {{first}} to {{last}} of {{total}} results\",\n \"fr\": \"Affichage de {{first}} à {{last}} sur {{total}} résultats\"\n },\n \"lastPage\": {\n \"en\": \"Last >>\",\n \"fr\": \"Dernière >>\"\n },\n \"last\": {\n \"en\": \"Last\",\n \"fr\": \"Dernière\"\n },\n \"next\": {\n \"en\": \"Next\",\n \"fr\": \"Suivant\"\n },\n \"previous\": {\n \"en\": \"Previous\",\n \"fr\": \"Précédent\"\n }\n },\n \"searchBar\": {\n \"placeholder\": {\n \"en\": \"Search...\",\n \"fr\": \"Rechercher...\"\n }\n },\n \"yes\": {\n \"en\": \"Yes\",\n \"fr\": \"Oui\"\n },\n \"no\": {\n \"en\": \"No\",\n \"fr\": \"Non\"\n }\n}\n","import { Translator } from './translator.ts';\n\nexport const i18n = new Translator();\n\nexport * from './types.ts';\n"],"mappings":"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","names":[]}
|
|
File without changes
|
|
File without changes
|