i18nya 0.1.3 → 0.2.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/astro-i18nya/README.md +2 -2
- package/astro-i18nya/package.json +1 -1
- package/astro-i18nya/src/util.ts +9 -4
- package/bun.lock +20 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +10 -6
package/astro-i18nya/README.md
CHANGED
|
@@ -36,13 +36,13 @@ export default defineConfig({
|
|
|
36
36
|
});
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
Then for all pages in `src/pages/[lang]/*.astro`:
|
|
39
|
+
Then for all pages in `src/pages/[...lang]/*.astro`:
|
|
40
40
|
|
|
41
41
|
```ts
|
|
42
42
|
import i18nya, { makeT } from "../../i18n.ts";
|
|
43
43
|
import { makeGetStaticPaths } from "astro-i18nya";
|
|
44
44
|
const t = makeT(Astro.params.lang);
|
|
45
|
-
// generate paths only for languages in your `langs/` folder!
|
|
45
|
+
// generate paths only for languages in your `[...langs]/` folder!
|
|
46
46
|
export const getStaticPaths = makeGetStaticPaths(i18nya);
|
|
47
47
|
```
|
|
48
48
|
|
package/astro-i18nya/src/util.ts
CHANGED
|
@@ -7,7 +7,10 @@ import type { I18Nya } from "i18nya";
|
|
|
7
7
|
* @returns language name
|
|
8
8
|
*/
|
|
9
9
|
export const getLangName = (lang: string, displayLang?: string) =>
|
|
10
|
-
new Intl.DisplayNames([displayLang ?? lang], {
|
|
10
|
+
new Intl.DisplayNames([displayLang ?? lang], {
|
|
11
|
+
type: "language",
|
|
12
|
+
style: "narrow",
|
|
13
|
+
}).of(lang);
|
|
11
14
|
|
|
12
15
|
/**
|
|
13
16
|
* List out available languages.
|
|
@@ -29,6 +32,8 @@ export const listLang = <T extends string | number | symbol>(
|
|
|
29
32
|
export const makeGetStaticPaths =
|
|
30
33
|
<T extends string | number | symbol>(i18nya: I18Nya<T>) =>
|
|
31
34
|
async () =>
|
|
32
|
-
Object.keys(i18nya.translations)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
Object.keys(i18nya.translations).map((lang) =>
|
|
36
|
+
lang === i18nya.config.defaultLang
|
|
37
|
+
? { params: { lang: undefined } }
|
|
38
|
+
: { params: { lang: lang } },
|
|
39
|
+
);
|
package/bun.lock
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lockfileVersion": 1,
|
|
3
|
+
"configVersion": 0,
|
|
4
|
+
"workspaces": {
|
|
5
|
+
"": {
|
|
6
|
+
"name": "i18nya",
|
|
7
|
+
"devDependencies": {
|
|
8
|
+
"@types/node": "^24.10.1",
|
|
9
|
+
"typescript": "^5.9.3",
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
"packages": {
|
|
14
|
+
"@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="],
|
|
15
|
+
|
|
16
|
+
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
|
17
|
+
|
|
18
|
+
"undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
|
|
19
|
+
}
|
|
20
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type I18NyaKey = string | number | symbol;
|
|
2
|
+
export type I18NyaConfig<T extends I18NyaKey> = {
|
|
3
|
+
/** Path to directory containing language files */
|
|
4
|
+
langDir: string;
|
|
5
|
+
/** Locale ID for default language */
|
|
6
|
+
defaultLang: string;
|
|
7
|
+
fallbackLangs?: Record<string, string>;
|
|
8
|
+
/** Feed in `import.meta.glob("./langs/*.json", { eager: true })` */
|
|
9
|
+
viteImports?: Record<string, {
|
|
10
|
+
default: Record<T, string>;
|
|
11
|
+
}>;
|
|
12
|
+
};
|
|
13
|
+
export type I18Nya<T extends I18NyaKey> = {
|
|
14
|
+
translations: Record<string, Record<T, string>>;
|
|
15
|
+
makeT: (lang?: string) => (key: T, its?: Interpolations) => string;
|
|
16
|
+
config: I18NyaConfig<T>;
|
|
17
|
+
};
|
|
18
|
+
export type Interpolations = Record<string, string | {
|
|
19
|
+
toString(): string;
|
|
20
|
+
}>;
|
|
21
|
+
export declare const init: <T extends string | number | symbol = string>(config: I18NyaConfig<T>) => Promise<I18Nya<T>>;
|
|
22
|
+
export default init;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjD,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,SAAS,IAAI;IAC9C,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;CAC9D,CAAC;AAEF,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,SAAS,IAAI;IACxC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,KAAK,MAAM,CAAC;IACnE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,QAAQ,IAAI,MAAM,CAAA;CAAE,CAAC,CAAC;AAG7E,eAAO,MAAM,IAAI,GAAU,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EACpE,QAAQ,YAAY,CAAC,CAAC,CAAC,uBAwCxB,CAAC;AACF,eAAe,IAAI,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const opts = { with: { type: "json" } };
|
|
2
|
+
export const init = async (config) => {
|
|
3
|
+
const { langDir, defaultLang: rootLang = "en", fallbackLangs = {}, viteImports = undefined, } = config;
|
|
4
|
+
let i18nya = {
|
|
5
|
+
translations: {},
|
|
6
|
+
makeT: (lang = rootLang) => (key, its = {}) => {
|
|
7
|
+
let s;
|
|
8
|
+
for (; !(s = i18nya.translations[lang]?.[key]); lang = fallbackLangs[lang] ?? rootLang)
|
|
9
|
+
if (lang === rootLang)
|
|
10
|
+
return String(key);
|
|
11
|
+
for (const [k, v] of Object.entries(its))
|
|
12
|
+
s = s.replace(`{{${k}}}`, `${v}`);
|
|
13
|
+
return s;
|
|
14
|
+
},
|
|
15
|
+
config,
|
|
16
|
+
};
|
|
17
|
+
if (viteImports) {
|
|
18
|
+
for (const [k, v] of Object.entries(viteImports))
|
|
19
|
+
i18nya.translations[k.slice(langDir.length + 1, -5)] = v.default;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const { readdirSync } = await import("fs");
|
|
23
|
+
const { resolve } = await import("path");
|
|
24
|
+
for (const entry of readdirSync(langDir, { withFileTypes: true })) {
|
|
25
|
+
if (entry.isFile() && entry.name.endsWith(".json")) {
|
|
26
|
+
const imp = await import(resolve(langDir, entry.name), opts);
|
|
27
|
+
i18nya.translations[entry.name.slice(0, -5)] = imp.default;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return i18nya;
|
|
32
|
+
};
|
|
33
|
+
export default init;
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmBA,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;AAExC,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EACvB,MAAuB,EACvB,EAAE;IACF,MAAM,EACJ,OAAO,EACP,WAAW,EAAE,QAAQ,GAAG,IAAI,EAC5B,aAAa,GAAG,EAAE,EAClB,WAAW,GAAG,SAAS,GACxB,GAAG,MAAM,CAAC;IACX,IAAI,MAAM,GAAc;QACtB,YAAY,EAAE,EAAE;QAChB,KAAK,EACH,CAAC,IAAI,GAAG,QAAQ,EAAE,EAAE,CACpB,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE;YAChB,IAAI,CAAqB,CAAC;YAC1B,OAEE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EACvC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,QAAQ;gBAEtC,IAAI,IAAI,KAAK,QAAQ;oBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;gBACtC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,CAAC;QACX,CAAC;QACH,MAAM;KACP,CAAC;IACF,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;YAC9C,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAClE,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC7D,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AACF,eAAe,IAAI,CAAC"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -12,7 +12,7 @@ export type I18NyaConfig<T extends I18NyaKey> = {
|
|
|
12
12
|
|
|
13
13
|
export type I18Nya<T extends I18NyaKey> = {
|
|
14
14
|
translations: Record<string, Record<T, string>>;
|
|
15
|
-
makeT: (lang
|
|
15
|
+
makeT: (lang?: string) => (key: T, its?: Interpolations) => string;
|
|
16
16
|
config: I18NyaConfig<T>;
|
|
17
17
|
};
|
|
18
18
|
|
|
@@ -25,17 +25,21 @@ export const init = async <T extends string | number | symbol = string>(
|
|
|
25
25
|
const {
|
|
26
26
|
langDir,
|
|
27
27
|
defaultLang: rootLang = "en",
|
|
28
|
-
fallbackLangs
|
|
28
|
+
fallbackLangs = {},
|
|
29
29
|
viteImports = undefined,
|
|
30
30
|
} = config;
|
|
31
31
|
let i18nya: I18Nya<T> = {
|
|
32
32
|
translations: {},
|
|
33
33
|
makeT:
|
|
34
|
-
(
|
|
35
|
-
(
|
|
34
|
+
(lang = rootLang) =>
|
|
35
|
+
(key, its = {}) => {
|
|
36
36
|
let s: string | undefined;
|
|
37
|
-
for (
|
|
38
|
-
|
|
37
|
+
for (
|
|
38
|
+
;
|
|
39
|
+
!(s = i18nya.translations[lang]?.[key]);
|
|
40
|
+
lang = fallbackLangs[lang] ?? rootLang
|
|
41
|
+
)
|
|
42
|
+
if (lang === rootLang) return String(key);
|
|
39
43
|
for (const [k, v] of Object.entries(its))
|
|
40
44
|
s = s.replace(`{{${k}}}`, `${v}`);
|
|
41
45
|
return s;
|