@stackkit-translate/core 1.0.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -0
  3. package/dist/browser-lang.d.ts +3 -0
  4. package/dist/browser-lang.d.ts.map +1 -0
  5. package/dist/browser-lang.js +8 -0
  6. package/dist/browser-lang.js.map +1 -0
  7. package/dist/compile-messages.d.ts +4 -0
  8. package/dist/compile-messages.d.ts.map +1 -0
  9. package/dist/compile-messages.js +22 -0
  10. package/dist/compile-messages.js.map +1 -0
  11. package/dist/compiler.d.ts +3 -0
  12. package/dist/compiler.d.ts.map +1 -0
  13. package/dist/compiler.js +6 -0
  14. package/dist/compiler.js.map +1 -0
  15. package/dist/direction.d.ts +5 -0
  16. package/dist/direction.d.ts.map +1 -0
  17. package/dist/direction.js +26 -0
  18. package/dist/direction.js.map +1 -0
  19. package/dist/document-lang.d.ts +3 -0
  20. package/dist/document-lang.d.ts.map +1 -0
  21. package/dist/document-lang.js +11 -0
  22. package/dist/document-lang.js.map +1 -0
  23. package/dist/index.d.ts +12 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +11 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/parser.d.ts +3 -0
  28. package/dist/parser.d.ts.map +1 -0
  29. package/dist/parser.js +12 -0
  30. package/dist/parser.js.map +1 -0
  31. package/dist/plugin-messageformat.d.ts +10 -0
  32. package/dist/plugin-messageformat.d.ts.map +1 -0
  33. package/dist/plugin-messageformat.js +135 -0
  34. package/dist/plugin-messageformat.js.map +1 -0
  35. package/dist/plugins.d.ts +12 -0
  36. package/dist/plugins.d.ts.map +1 -0
  37. package/dist/plugins.js +18 -0
  38. package/dist/plugins.js.map +1 -0
  39. package/dist/store.d.ts +5 -0
  40. package/dist/store.d.ts.map +1 -0
  41. package/dist/store.js +41 -0
  42. package/dist/store.js.map +1 -0
  43. package/dist/translate-engine.d.ts +3 -0
  44. package/dist/translate-engine.d.ts.map +1 -0
  45. package/dist/translate-engine.js +198 -0
  46. package/dist/translate-engine.js.map +1 -0
  47. package/dist/types.d.ts +75 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +51 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rajkishor Sahu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,97 @@
1
+ # @stackkit-translate/core
2
+
3
+ Framework-agnostic runtime i18n engine for JSON locales — `createTranslate()`, nested keys, `{{param}}` interpolation, lazy loaders, plugins, and ngx-translate-style APIs (`use`, `setTranslation`, `reloadLang`, `resetLang`, `getBrowserLang`).
4
+
5
+ **Current release: 1.0.0** — Foundation for all `@stackkit-translate/*` adapters. See [monorepo CHANGELOG](../../CHANGELOG.md).
6
+
7
+ **Docs & demo:** [translate docs](https://stackkit-translate.vercel.app/) — [interactive demo](https://stackkit-translate.vercel.app/demo) and [API reference](https://stackkit-translate.vercel.app/api/core).
8
+
9
+ > Ships as ESM with TypeScript declarations. Works in **Node 18+** and modern browsers. Framework packages (`@stackkit-translate/angular`, `@stackkit-translate/react`, `@stackkit-translate/js`) depend on this package.
10
+
11
+ **Keywords:** `translate` `i18n` `localization` `typescript` `runtime-i18n` `ngx-translate`
12
+
13
+ ## Install
14
+
15
+ ```bash
16
+ npm install @stackkit-translate/core
17
+ # Pair with a loader for HTTP JSON:
18
+ npm install @stackkit-translate/http
19
+ ```
20
+
21
+ ## Usage — in-memory locales
22
+
23
+ ```ts
24
+ import { createTranslate } from "@stackkit-translate/core";
25
+
26
+ const translate = createTranslate({
27
+ lang: "en",
28
+ fallbackLang: "en",
29
+ translations: {
30
+ en: { HELLO: "Hello, {{name}}!" },
31
+ fr: { HELLO: "Bonjour, {{name}} !" }
32
+ }
33
+ });
34
+
35
+ translate.t("HELLO", { name: "Ada" }); // "Hello, Ada!"
36
+ await translate.use("fr");
37
+ translate.t("HELLO", { name: "Ada" }); // "Bonjour, Ada !"
38
+ ```
39
+
40
+ ## Usage — lazy JSON loader
41
+
42
+ ```ts
43
+ import { createTranslate } from "@stackkit-translate/core";
44
+ import { createFetchLoader } from "@stackkit-translate/http";
45
+
46
+ const translate = createTranslate({
47
+ lang: "en",
48
+ fallbackLang: "en",
49
+ loader: createFetchLoader({ prefix: "/assets/i18n/", suffix: ".json" })
50
+ });
51
+
52
+ await translate.use("fr");
53
+ translate.t("HOME.TITLE");
54
+ ```
55
+
56
+ ## Usage — MessageFormat plugin (community)
57
+
58
+ ```ts
59
+ import { applyTranslatePlugins, createMessageFormatPlugin, createTranslate } from "@stackkit-translate/core";
60
+
61
+ const translate = createTranslate({
62
+ lang: "en",
63
+ translations: {
64
+ en: { ITEMS: "{count, plural, one {# item} other {# items}}" }
65
+ },
66
+ plugins: [createMessageFormatPlugin()]
67
+ });
68
+ ```
69
+
70
+ ## API (selected)
71
+
72
+ | API | Description |
73
+ | --- | --- |
74
+ | `createTranslate(config)` | Create a translation instance. |
75
+ | `translate.t(key, params?)` | Synchronous lookup with interpolation. |
76
+ | `translate.use(lang)` | Switch active locale (loads via loader when configured). |
77
+ | `translate.setTranslation(lang, tree, merge?)` | Merge or replace in-memory translations. |
78
+ | `translate.reloadLang(lang)` | Reload from loader. |
79
+ | `translate.resetLang(lang)` | Clear cached locale. |
80
+ | `getBrowserLang()` | Detect browser language prefix (`en` from `en-US`). |
81
+ | `getDirection(lang)` | `ltr` or `rtl` for document layout. |
82
+ | `createMessageFormatPlugin()` | Lightweight plural/select MessageFormat plugin. |
83
+
84
+ Full surface: [API reference](https://stackkit-translate.vercel.app/api/core).
85
+
86
+ ## Related packages
87
+
88
+ - [`@stackkit-translate/http`](https://www.npmjs.com/package/@stackkit-translate/http) — fetch JSON/JS locale files.
89
+ - [`@stackkit-translate/angular`](https://www.npmjs.com/package/@stackkit-translate/angular) — `TranslateService`, pipe, directive.
90
+ - [`@stackkit-translate/react`](https://www.npmjs.com/package/@stackkit-translate/react) — `TranslateProvider`, `useTranslate()`.
91
+ - [`@stackkit-translate/js`](https://www.npmjs.com/package/@stackkit-translate/js) — vanilla `createTranslateHost()` and `bindDom()`.
92
+ - [`@stackkit-translate/enterprise`](https://www.npmjs.com/package/@stackkit-translate/enterprise) — optional ICU, SSR, TMS, audit, and licence gating.
93
+ - [`@stackkit-translate/cli`](https://www.npmjs.com/package/@stackkit-translate/cli) — `translate-extract` and typegen.
94
+
95
+ ## License
96
+
97
+ [MIT](./LICENSE)
@@ -0,0 +1,3 @@
1
+ /** Browser locale prefix (e.g. `en` from `en-US`). Matches ngx-translate TranslateService.getBrowserLang(). */
2
+ export declare function getBrowserLang(): string | undefined;
3
+ //# sourceMappingURL=browser-lang.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-lang.d.ts","sourceRoot":"","sources":["../src/browser-lang.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAKnD"}
@@ -0,0 +1,8 @@
1
+ /** Browser locale prefix (e.g. `en` from `en-US`). Matches ngx-translate TranslateService.getBrowserLang(). */
2
+ export function getBrowserLang() {
3
+ if (typeof navigator === "undefined") {
4
+ return undefined;
5
+ }
6
+ return navigator.language.split("-")[0];
7
+ }
8
+ //# sourceMappingURL=browser-lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-lang.js","sourceRoot":"","sources":["../src/browser-lang.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,MAAM,UAAU,cAAc;IAC5B,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { TranslateCompiler, TranslationValue } from "./types.js";
2
+ /** Preprocess every message string at load time (ngx-translate TranslateCompiler style). */
3
+ export declare function createCompileMessagesCompiler(transform: (key: string, value: TranslationValue) => string): TranslateCompiler;
4
+ //# sourceMappingURL=compile-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile-messages.d.ts","sourceRoot":"","sources":["../src/compile-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAmB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAqBvF,4FAA4F;AAC5F,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,KAAK,MAAM,GAC1D,iBAAiB,CAMnB"}
@@ -0,0 +1,22 @@
1
+ function mapLeaves(tree, prefix, visit) {
2
+ const out = {};
3
+ for (const [key, value] of Object.entries(tree)) {
4
+ const path = prefix ? `${prefix}.${key}` : key;
5
+ if (typeof value === "string") {
6
+ out[key] = visit(path, value);
7
+ }
8
+ else {
9
+ out[key] = mapLeaves(value, path, visit);
10
+ }
11
+ }
12
+ return out;
13
+ }
14
+ /** Preprocess every message string at load time (ngx-translate TranslateCompiler style). */
15
+ export function createCompileMessagesCompiler(transform) {
16
+ return {
17
+ compile(tree) {
18
+ return mapLeaves(tree, "", transform);
19
+ }
20
+ };
21
+ }
22
+ //# sourceMappingURL=compile-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile-messages.js","sourceRoot":"","sources":["../src/compile-messages.ts"],"names":[],"mappings":"AAEA,SAAS,SAAS,CAChB,IAAqB,EACrB,MAAc,EACd,KAA6C;IAE7C,MAAM,GAAG,GAAoB,EAAE,CAAC;IAEhC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,6BAA6B,CAC3C,SAA2D;IAE3D,OAAO;QACL,OAAO,CAAC,IAAqB;YAC3B,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TranslateCompiler } from "./types.js";
2
+ export declare const defaultCompiler: TranslateCompiler;
3
+ //# sourceMappingURL=compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,YAAY,CAAC;AAErE,eAAO,MAAM,eAAe,EAAE,iBAI7B,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const defaultCompiler = {
2
+ compile(tree) {
3
+ return tree;
4
+ }
5
+ };
6
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAsB;IAChD,OAAO,CAAC,IAAqB;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Resolve document text direction for a BCP 47 language tag (e.g. `ar`, `ar-SA`, `en`). */
2
+ export declare function getDirection(lang: string): "ltr" | "rtl";
3
+ /** Whether the language tag is treated as right-to-left. */
4
+ export declare function isRtlLang(lang: string): boolean;
5
+ //# sourceMappingURL=direction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direction.d.ts","sourceRoot":"","sources":["../src/direction.ts"],"names":[],"mappings":"AAcA,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAMxD;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C"}
@@ -0,0 +1,26 @@
1
+ /** ISO 639-1 language codes that typically use right-to-left scripts. */
2
+ const RTL_LANG_CODES = new Set([
3
+ "ar",
4
+ "dv",
5
+ "fa",
6
+ "he",
7
+ "ku",
8
+ "ps",
9
+ "sd",
10
+ "ug",
11
+ "ur",
12
+ "yi"
13
+ ]);
14
+ /** Resolve document text direction for a BCP 47 language tag (e.g. `ar`, `ar-SA`, `en`). */
15
+ export function getDirection(lang) {
16
+ const code = lang.trim().split("-")[0]?.toLowerCase();
17
+ if (!code) {
18
+ return "ltr";
19
+ }
20
+ return RTL_LANG_CODES.has(code) ? "rtl" : "ltr";
21
+ }
22
+ /** Whether the language tag is treated as right-to-left. */
23
+ export function isRtlLang(lang) {
24
+ return getDirection(lang) === "rtl";
25
+ }
26
+ //# sourceMappingURL=direction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direction.js","sourceRoot":"","sources":["../src/direction.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;CACL,CAAC,CAAC;AAEH,4FAA4F;AAC5F,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACtD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAClD,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;AACtC,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Apply `lang` and `dir` on the document element (no-op without a DOM). */
2
+ export declare function applyDocumentLang(lang: string, doc?: Document): void;
3
+ //# sourceMappingURL=document-lang.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-lang.d.ts","sourceRoot":"","sources":["../src/document-lang.ts"],"names":[],"mappings":"AAEA,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,IAAI,CAOpE"}
@@ -0,0 +1,11 @@
1
+ import { getDirection } from "./direction.js";
2
+ /** Apply `lang` and `dir` on the document element (no-op without a DOM). */
3
+ export function applyDocumentLang(lang, doc) {
4
+ const root = doc?.documentElement;
5
+ if (!root) {
6
+ return;
7
+ }
8
+ root.lang = lang;
9
+ root.dir = getDirection(lang);
10
+ }
11
+ //# sourceMappingURL=document-lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-lang.js","sourceRoot":"","sources":["../src/document-lang.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,4EAA4E;AAC5E,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,GAAc;IAC5D,MAAM,IAAI,GAAG,GAAG,EAAE,eAAe,CAAC;IAClC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACjB,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { createTranslate } from "./translate-engine.js";
2
+ export { defaultCompiler } from "./compiler.js";
3
+ export { createCompileMessagesCompiler } from "./compile-messages.js";
4
+ export { defaultParser } from "./parser.js";
5
+ export { applyTranslatePlugins, runTranslatePluginInits, type TranslatePlugin } from "./plugins.js";
6
+ export { createMessageFormatPlugin, createMessageFormatParser } from "./plugin-messageformat.js";
7
+ export { getDirection, isRtlLang } from "./direction.js";
8
+ export { applyDocumentLang } from "./document-lang.js";
9
+ export { getBrowserLang } from "./browser-lang.js";
10
+ export { getNestedValue, mergeTrees, setNestedValue } from "./store.js";
11
+ export type { FallbackLangChangeEvent, InterpolateParams, LangChangeEvent, MissingKeyEvent, MissingTranslationHandler, TranslateCompiler, TranslateConfig, TranslateEventMap, TranslateInstance, TranslateLoader, TranslateParser, TranslationChangeEvent, TranslationTree, TranslationValue } from "./types.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxE,YAAY,EACV,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ export { createTranslate } from "./translate-engine.js";
2
+ export { defaultCompiler } from "./compiler.js";
3
+ export { createCompileMessagesCompiler } from "./compile-messages.js";
4
+ export { defaultParser } from "./parser.js";
5
+ export { applyTranslatePlugins, runTranslatePluginInits } from "./plugins.js";
6
+ export { createMessageFormatPlugin, createMessageFormatParser } from "./plugin-messageformat.js";
7
+ export { getDirection, isRtlLang } from "./direction.js";
8
+ export { applyDocumentLang } from "./document-lang.js";
9
+ export { getBrowserLang } from "./browser-lang.js";
10
+ export { getNestedValue, mergeTrees, setNestedValue } from "./store.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EAExB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TranslateParser } from "./types.js";
2
+ export declare const defaultParser: TranslateParser;
3
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,eAAe,EAAE,MAAM,YAAY,CAAC;AAErE,eAAO,MAAM,aAAa,EAAE,eAU3B,CAAC"}
package/dist/parser.js ADDED
@@ -0,0 +1,12 @@
1
+ export const defaultParser = {
2
+ interpolate(template, params) {
3
+ if (!params) {
4
+ return template;
5
+ }
6
+ return template.replace(/\{\{\s*(\w+)\s*\}\}/g, (_, key) => {
7
+ const value = params[key];
8
+ return value === undefined || value === null ? `{{${key}}}` : String(value);
9
+ });
10
+ }
11
+ };
12
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAoB;IAC5C,WAAW,CAAC,QAAgB,EAAE,MAA0B;QACtD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;YACjE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { TranslateParser } from "./types.js";
2
+ import type { TranslatePlugin } from "./plugins.js";
3
+ export declare function createMessageFormatParser(base?: TranslateParser): TranslateParser;
4
+ /**
5
+ * ngx-translate-messageformat-plugin style community plugin.
6
+ * Supports `{var, plural, …}`, `{var, select, …}`, `=n` exact matches, and `{{param}}`.
7
+ * Full ICU / MF2 lives in @stackkit-translate/enterprise (createIcuParser).
8
+ */
9
+ export declare function createMessageFormatPlugin(): TranslatePlugin;
10
+ //# sourceMappingURL=plugin-messageformat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-messageformat.d.ts","sourceRoot":"","sources":["../src/plugin-messageformat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsC,eAAe,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAwIpD,wBAAgB,yBAAyB,CAAC,IAAI,GAAE,eAA+B,GAAG,eAAe,CAOhG;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,eAAe,CAQ3D"}
@@ -0,0 +1,135 @@
1
+ import { defaultParser } from "./parser.js";
2
+ const PLURAL_BLOCK = /\{(\w+),\s*plural,\s*((?:=\d+\s*\{[^}]*\}\s*|one\s*\{[^}]*\}\s*|other\s*\{[^}]*\}\s*)+)\}/;
3
+ const SELECT_BLOCK = /\{(\w+),\s*select,\s*((?:\w+\s*\{[^}]*\}\s*)+)\}/;
4
+ function parseBranches(body) {
5
+ const branches = [];
6
+ let i = 0;
7
+ while (i < body.length) {
8
+ while (i < body.length && /\s/.test(body[i])) {
9
+ i++;
10
+ }
11
+ if (i >= body.length) {
12
+ break;
13
+ }
14
+ const keywordStart = i;
15
+ while (i < body.length && !/\s/.test(body[i])) {
16
+ i++;
17
+ }
18
+ const keyword = body.slice(keywordStart, i).trim();
19
+ if (!keyword) {
20
+ break;
21
+ }
22
+ while (i < body.length && /\s/.test(body[i])) {
23
+ i++;
24
+ }
25
+ if (body[i] !== "{") {
26
+ break;
27
+ }
28
+ let depth = 0;
29
+ const textStart = i;
30
+ for (; i < body.length; i++) {
31
+ const ch = body[i];
32
+ if (ch === "{") {
33
+ depth++;
34
+ }
35
+ else if (ch === "}") {
36
+ depth--;
37
+ if (depth === 0) {
38
+ branches.push({ keyword, text: body.slice(textStart + 1, i) });
39
+ i++;
40
+ break;
41
+ }
42
+ }
43
+ }
44
+ }
45
+ return branches;
46
+ }
47
+ function pickPluralBranch(branches, count) {
48
+ const exact = branches.find((b) => b.keyword === `=${count}`);
49
+ if (exact) {
50
+ return exact.text;
51
+ }
52
+ if (count === 1) {
53
+ const one = branches.find((b) => b.keyword === "one");
54
+ if (one) {
55
+ return one.text;
56
+ }
57
+ }
58
+ const other = branches.find((b) => b.keyword === "other");
59
+ return other?.text ?? branches[branches.length - 1]?.text ?? "";
60
+ }
61
+ function pickSelectBranch(branches, value) {
62
+ const match = branches.find((b) => b.keyword === value);
63
+ if (match) {
64
+ return match.text;
65
+ }
66
+ const other = branches.find((b) => b.keyword === "other");
67
+ return other?.text ?? branches[branches.length - 1]?.text ?? "";
68
+ }
69
+ function scalarParam(params, key) {
70
+ const value = params[key];
71
+ if (typeof value === "boolean") {
72
+ return value ? "true" : "false";
73
+ }
74
+ if (value === undefined || value === null) {
75
+ return "";
76
+ }
77
+ return value;
78
+ }
79
+ function formatPluralLite(template, params) {
80
+ const match = PLURAL_BLOCK.exec(template);
81
+ if (!match || !params) {
82
+ return template;
83
+ }
84
+ const [, key, body] = match;
85
+ const raw = scalarParam(params, key);
86
+ const count = typeof raw === "number" ? raw : Number(raw);
87
+ const branch = pickPluralBranch(parseBranches(body), Number.isFinite(count) ? count : 0);
88
+ const resolved = branch.replace(/#/g, String(raw));
89
+ return template.replace(PLURAL_BLOCK, resolved);
90
+ }
91
+ function formatSelectLite(template, params) {
92
+ const match = SELECT_BLOCK.exec(template);
93
+ if (!match || !params) {
94
+ return template;
95
+ }
96
+ const [, key, body] = match;
97
+ const value = String(scalarParam(params, key));
98
+ const branch = pickSelectBranch(parseBranches(body), value);
99
+ return template.replace(SELECT_BLOCK, branch);
100
+ }
101
+ function formatMessageFormatLite(template, params) {
102
+ let result = template;
103
+ for (let i = 0; i < 4; i++) {
104
+ const nextPlural = formatPluralLite(result, params);
105
+ const nextSelect = formatSelectLite(nextPlural, params);
106
+ if (nextSelect === result) {
107
+ break;
108
+ }
109
+ result = nextSelect;
110
+ }
111
+ return result;
112
+ }
113
+ export function createMessageFormatParser(base = defaultParser) {
114
+ return {
115
+ interpolate(template, params) {
116
+ const withMf = formatMessageFormatLite(template, params);
117
+ return base.interpolate(withMf, params);
118
+ }
119
+ };
120
+ }
121
+ /**
122
+ * ngx-translate-messageformat-plugin style community plugin.
123
+ * Supports `{var, plural, …}`, `{var, select, …}`, `=n` exact matches, and `{{param}}`.
124
+ * Full ICU / MF2 lives in @stackkit-translate/enterprise (createIcuParser).
125
+ */
126
+ export function createMessageFormatPlugin() {
127
+ return {
128
+ id: "messageformat-lite",
129
+ extendConfig: (config) => ({
130
+ ...config,
131
+ parser: createMessageFormatParser(config.parser ?? defaultParser)
132
+ })
133
+ };
134
+ }
135
+ //# sourceMappingURL=plugin-messageformat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-messageformat.js","sourceRoot":"","sources":["../src/plugin-messageformat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { TranslateConfig, TranslateInstance } from "./types.js";
2
+ /** Public plugin contract — community extensions and enterprise modules register the same way. */
3
+ export type TranslatePlugin = {
4
+ id: string;
5
+ /** Adjust config before createTranslate runs. */
6
+ extendConfig?: (config: TranslateConfig) => TranslateConfig;
7
+ /** Called after the engine is created. Return cleanup to run on destroy. */
8
+ onInit?: (translate: TranslateInstance) => void | (() => void);
9
+ };
10
+ export declare function applyTranslatePlugins(config: TranslateConfig, plugins: TranslatePlugin[]): TranslateConfig;
11
+ export declare function runTranslatePluginInits(translate: TranslateInstance, plugins: TranslatePlugin[]): () => void;
12
+ //# sourceMappingURL=plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAErE,kGAAkG;AAClG,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,iDAAiD;IACjD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,eAAe,CAAC;IAC5D,4EAA4E;IAC5E,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;CAChE,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,CAE1G;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,eAAe,EAAE,GACzB,MAAM,IAAI,CAeZ"}
@@ -0,0 +1,18 @@
1
+ export function applyTranslatePlugins(config, plugins) {
2
+ return plugins.reduce((next, plugin) => plugin.extendConfig?.(next) ?? next, config);
3
+ }
4
+ export function runTranslatePluginInits(translate, plugins) {
5
+ const cleanups = [];
6
+ for (const plugin of plugins) {
7
+ const cleanup = plugin.onInit?.(translate);
8
+ if (typeof cleanup === "function") {
9
+ cleanups.push(cleanup);
10
+ }
11
+ }
12
+ return () => {
13
+ for (const cleanup of cleanups) {
14
+ cleanup();
15
+ }
16
+ };
17
+ }
18
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,qBAAqB,CAAC,MAAuB,EAAE,OAA0B;IACvF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,SAA4B,EAC5B,OAA0B;IAE1B,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,EAAE;QACV,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { TranslationTree, TranslationValue } from "./types.js";
2
+ export declare function getNestedValue(tree: TranslationTree, key: string): TranslationValue | undefined;
3
+ export declare function setNestedValue(tree: TranslationTree, key: string, value: TranslationValue): void;
4
+ export declare function mergeTrees(base: TranslationTree, patch: TranslationTree): TranslationTree;
5
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAY/F;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAchG;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,GAAG,eAAe,CAkBzF"}
package/dist/store.js ADDED
@@ -0,0 +1,41 @@
1
+ export function getNestedValue(tree, key) {
2
+ const parts = key.split(".");
3
+ let current = tree;
4
+ for (const part of parts) {
5
+ if (current === undefined || typeof current === "string") {
6
+ return undefined;
7
+ }
8
+ current = current[part];
9
+ }
10
+ return typeof current === "string" ? current : undefined;
11
+ }
12
+ export function setNestedValue(tree, key, value) {
13
+ const parts = key.split(".");
14
+ let current = tree;
15
+ for (let i = 0; i < parts.length - 1; i++) {
16
+ const part = parts[i];
17
+ const next = current[part];
18
+ if (typeof next === "string" || next === undefined) {
19
+ current[part] = {};
20
+ }
21
+ current = current[part];
22
+ }
23
+ current[parts[parts.length - 1]] = value;
24
+ }
25
+ export function mergeTrees(base, patch) {
26
+ const result = { ...base };
27
+ for (const [key, value] of Object.entries(patch)) {
28
+ const existing = result[key];
29
+ if (existing &&
30
+ typeof existing === "object" &&
31
+ typeof value === "object" &&
32
+ !Array.isArray(value)) {
33
+ result[key] = mergeTrees(existing, value);
34
+ }
35
+ else {
36
+ result[key] = value;
37
+ }
38
+ }
39
+ return result;
40
+ }
41
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,IAAqB,EAAE,GAAW;IAC/D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,OAAO,GAAmD,IAAI,CAAC;IAEnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAqB,EAAE,GAAW,EAAE,KAAuB;IACxF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,IAAI,CAAoB,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAqB,EAAE,KAAsB;IACtE,MAAM,MAAM,GAAoB,EAAE,GAAG,IAAI,EAAE,CAAC;IAE5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,IACE,QAAQ;YACR,OAAO,QAAQ,KAAK,QAAQ;YAC5B,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EACrB,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TranslateConfig, TranslateInstance } from "./types.js";
2
+ export declare function createTranslate(config?: TranslateConfig): TranslateInstance;
3
+ //# sourceMappingURL=translate-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate-engine.d.ts","sourceRoot":"","sources":["../src/translate-engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAMV,eAAe,EAEf,iBAAiB,EAGlB,MAAM,YAAY,CAAC;AAUpB,wBAAgB,eAAe,CAAC,MAAM,GAAE,eAAoB,GAAG,iBAAiB,CAiO/E"}
@@ -0,0 +1,198 @@
1
+ import { defaultCompiler } from "./compiler.js";
2
+ import { defaultParser } from "./parser.js";
3
+ import { getNestedValue, mergeTrees, setNestedValue } from "./store.js";
4
+ const defaultMissingHandler = {
5
+ handle(key) {
6
+ return key;
7
+ }
8
+ };
9
+ export function createTranslate(config = {}) {
10
+ const compiler = config.compiler ?? defaultCompiler;
11
+ const parser = config.parser ?? defaultParser;
12
+ const missingHandler = config.missingTranslationHandler ?? defaultMissingHandler;
13
+ const loader = config.loader;
14
+ let currentLang = config.lang ?? "en";
15
+ let fallbackLang = config.fallbackLang ?? null;
16
+ const knownLangs = new Set();
17
+ const translations = new Map();
18
+ const listeners = {};
19
+ let useGeneration = 0;
20
+ let destroyed = false;
21
+ if (config.translations) {
22
+ for (const [lang, tree] of Object.entries(config.translations)) {
23
+ translations.set(lang, compiler.compile(tree));
24
+ knownLangs.add(lang);
25
+ }
26
+ }
27
+ if (currentLang) {
28
+ knownLangs.add(currentLang);
29
+ }
30
+ if (fallbackLang) {
31
+ knownLangs.add(fallbackLang);
32
+ }
33
+ function emit(event, payload) {
34
+ listeners[event]?.forEach((handler) => handler(payload));
35
+ }
36
+ function resolveKey(key, lang) {
37
+ const tree = translations.get(lang);
38
+ if (!tree) {
39
+ return undefined;
40
+ }
41
+ return getNestedValue(tree, key);
42
+ }
43
+ function lookup(key) {
44
+ const primary = resolveKey(key, currentLang);
45
+ if (primary !== undefined) {
46
+ return primary;
47
+ }
48
+ if (fallbackLang && fallbackLang !== currentLang) {
49
+ const fallback = resolveKey(key, fallbackLang);
50
+ if (fallback !== undefined) {
51
+ return fallback;
52
+ }
53
+ }
54
+ if (config.reportMissingKeys) {
55
+ emit("missingKey", { key, lang: currentLang, fallbackLang });
56
+ }
57
+ return missingHandler.handle(key, currentLang, fallbackLang);
58
+ }
59
+ function translateOne(key, params) {
60
+ return parser.interpolate(lookup(key), params);
61
+ }
62
+ async function ensureLoaded(lang) {
63
+ if (translations.has(lang)) {
64
+ return translations.get(lang);
65
+ }
66
+ if (!loader) {
67
+ translations.set(lang, {});
68
+ knownLangs.add(lang);
69
+ return {};
70
+ }
71
+ const raw = await loader.load(lang);
72
+ const compiled = compiler.compile(raw);
73
+ translations.set(lang, compiled);
74
+ knownLangs.add(lang);
75
+ return compiled;
76
+ }
77
+ async function loadLang(lang, generation) {
78
+ const tree = await ensureLoaded(lang);
79
+ if (generation !== useGeneration || destroyed) {
80
+ return tree;
81
+ }
82
+ return tree;
83
+ }
84
+ const instance = {
85
+ async use(lang) {
86
+ const generation = ++useGeneration;
87
+ currentLang = lang;
88
+ knownLangs.add(lang);
89
+ const tree = await loadLang(lang, generation);
90
+ if (generation === useGeneration && !destroyed) {
91
+ emit("langChange", { lang, translations: tree });
92
+ }
93
+ return tree;
94
+ },
95
+ async setFallbackLang(lang) {
96
+ fallbackLang = lang;
97
+ knownLangs.add(lang);
98
+ const tree = await ensureLoaded(lang);
99
+ emit("fallbackLangChange", { lang, translations: tree });
100
+ return tree;
101
+ },
102
+ t(key, params) {
103
+ if (Array.isArray(key)) {
104
+ const result = {};
105
+ for (const k of key) {
106
+ result[k] = translateOne(k, params);
107
+ }
108
+ return result;
109
+ }
110
+ return translateOne(key, params);
111
+ },
112
+ async tAsync(key, params) {
113
+ await ensureLoaded(currentLang);
114
+ if (fallbackLang) {
115
+ await ensureLoaded(fallbackLang);
116
+ }
117
+ if (Array.isArray(key)) {
118
+ const result = {};
119
+ for (const k of key) {
120
+ result[k] = translateOne(k, params);
121
+ }
122
+ return result;
123
+ }
124
+ return translateOne(key, params);
125
+ },
126
+ setTranslation(lang, tree, merge = false) {
127
+ const compiled = compiler.compile(tree);
128
+ const existing = translations.get(lang);
129
+ translations.set(lang, merge && existing ? mergeTrees(existing, compiled) : compiled);
130
+ knownLangs.add(lang);
131
+ emit("translationChange", {
132
+ lang,
133
+ translations: translations.get(lang)
134
+ });
135
+ },
136
+ set(key, value, lang) {
137
+ const targetLang = lang ?? currentLang;
138
+ const tree = translations.get(targetLang) ?? {};
139
+ setNestedValue(tree, key, value);
140
+ translations.set(targetLang, tree);
141
+ knownLangs.add(targetLang);
142
+ emit("translationChange", { lang: targetLang, translations: tree });
143
+ },
144
+ getCurrentLang() {
145
+ return currentLang;
146
+ },
147
+ getFallbackLang() {
148
+ return fallbackLang;
149
+ },
150
+ getLangs() {
151
+ return [...knownLangs];
152
+ },
153
+ getTranslation(lang) {
154
+ const target = lang ?? currentLang;
155
+ return translations.get(target) ?? {};
156
+ },
157
+ addLangs(langs) {
158
+ for (const lang of langs) {
159
+ knownLangs.add(lang);
160
+ }
161
+ },
162
+ async reloadLang(lang) {
163
+ translations.delete(lang);
164
+ const tree = await ensureLoaded(lang);
165
+ if (lang === currentLang) {
166
+ emit("translationChange", { lang, translations: tree });
167
+ }
168
+ return tree;
169
+ },
170
+ resetLang(lang) {
171
+ translations.delete(lang);
172
+ if (knownLangs.has(lang) && !loader) {
173
+ translations.set(lang, {});
174
+ }
175
+ },
176
+ on(event, handler) {
177
+ if (!listeners[event]) {
178
+ listeners[event] = new Set();
179
+ }
180
+ listeners[event].add(handler);
181
+ return () => listeners[event]?.delete(handler);
182
+ },
183
+ destroy() {
184
+ destroyed = true;
185
+ for (const key of Object.keys(listeners)) {
186
+ listeners[key]?.clear();
187
+ }
188
+ }
189
+ };
190
+ if (fallbackLang) {
191
+ void ensureLoaded(fallbackLang);
192
+ }
193
+ if (currentLang && !translations.has(currentLang) && loader) {
194
+ void instance.use(currentLang);
195
+ }
196
+ return instance;
197
+ }
198
+ //# sourceMappingURL=translate-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate-engine.js","sourceRoot":"","sources":["../src/translate-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ export type TranslationValue = string;
2
+ export interface TranslationTree {
3
+ [key: string]: TranslationValue | TranslationTree;
4
+ }
5
+ export type InterpolateParams = Record<string, string | number | boolean>;
6
+ export type TranslateLoader = {
7
+ load(lang: string): Promise<TranslationTree>;
8
+ };
9
+ export type TranslateCompiler = {
10
+ compile(tree: TranslationTree): TranslationTree;
11
+ };
12
+ export type TranslateParser = {
13
+ interpolate(template: string, params?: InterpolateParams): string;
14
+ };
15
+ export type MissingTranslationHandler = {
16
+ handle(key: string, lang: string, fallbackLang: string | null): string;
17
+ };
18
+ export type MissingKeyEvent = {
19
+ key: string;
20
+ lang: string;
21
+ fallbackLang: string | null;
22
+ };
23
+ export type TranslateEventMap = {
24
+ langChange: LangChangeEvent;
25
+ translationChange: TranslationChangeEvent;
26
+ fallbackLangChange: FallbackLangChangeEvent;
27
+ missingKey: MissingKeyEvent;
28
+ };
29
+ export type LangChangeEvent = {
30
+ lang: string;
31
+ translations: TranslationTree;
32
+ };
33
+ export type TranslationChangeEvent = {
34
+ lang: string;
35
+ translations: TranslationTree;
36
+ };
37
+ export type FallbackLangChangeEvent = {
38
+ lang: string;
39
+ translations: TranslationTree;
40
+ };
41
+ export type TranslateConfig = {
42
+ lang?: string;
43
+ fallbackLang?: string;
44
+ loader?: TranslateLoader;
45
+ compiler?: TranslateCompiler;
46
+ parser?: TranslateParser;
47
+ missingTranslationHandler?: MissingTranslationHandler;
48
+ /** When true, emit `missingKey` before the missing-translation handler runs. */
49
+ reportMissingKeys?: boolean;
50
+ translations?: Record<string, TranslationTree>;
51
+ /** Merge child-module translations into parent scope (TranslateModule.forChild). */
52
+ extend?: boolean;
53
+ /** Isolated child scope — do not inherit parent translations (ngx-translate isolate). */
54
+ isolate?: boolean;
55
+ };
56
+ export type TranslateInstance = {
57
+ use(lang: string): Promise<TranslationTree>;
58
+ setFallbackLang(lang: string): Promise<TranslationTree>;
59
+ t(key: string, params?: InterpolateParams): string;
60
+ t(keys: string[], params?: InterpolateParams): Record<string, string>;
61
+ tAsync(key: string, params?: InterpolateParams): Promise<string>;
62
+ tAsync(keys: string[], params?: InterpolateParams): Promise<Record<string, string>>;
63
+ setTranslation(lang: string, translations: TranslationTree, merge?: boolean): void;
64
+ set(key: string, value: TranslationValue, lang?: string): void;
65
+ getCurrentLang(): string;
66
+ getFallbackLang(): string | null;
67
+ getLangs(): readonly string[];
68
+ getTranslation(lang?: string): TranslationTree;
69
+ addLangs(langs: string[]): void;
70
+ reloadLang(lang: string): Promise<TranslationTree>;
71
+ resetLang(lang: string): void;
72
+ on<E extends keyof TranslateEventMap>(event: E, handler: (payload: TranslateEventMap[E]) => void): () => void;
73
+ destroy(): void;
74
+ };
75
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@stackkit-translate/core",
3
+ "version": "1.0.0",
4
+ "description": "Framework-neutral runtime i18n engine.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "LICENSE"
19
+ ],
20
+ "sideEffects": false,
21
+ "scripts": {
22
+ "build": "tsc -p tsconfig.json",
23
+ "test": "vitest run",
24
+ "prepack": "node ../../scripts/assert-pack-ready.mjs"
25
+ },
26
+ "keywords": [
27
+ "translate",
28
+ "i18n",
29
+ "localization",
30
+ "typescript",
31
+ "runtime-i18n",
32
+ "ngx-translate"
33
+ ],
34
+ "license": "MIT",
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "engines": {
39
+ "node": ">=18"
40
+ },
41
+ "author": "Rajkishor Sahu",
42
+ "homepage": "https://github.com/rajkishorsahu89/translate/tree/main/packages/core#readme",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "git+https://github.com/rajkishorsahu89/translate.git",
46
+ "directory": "packages/core"
47
+ },
48
+ "bugs": {
49
+ "url": "https://github.com/rajkishorsahu89/translate/issues"
50
+ }
51
+ }