astro-i18nya 0.2.3 → 0.2.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 +23 -5
- package/dist/Trans.d.ts.map +1 -1
- package/dist/Trans.js +4 -1
- package/dist/Trans.js.map +1 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/util.d.ts +17 -5
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +23 -3
- package/dist/util.js.map +1 -1
- package/jest.config.ts +10 -3
- package/package.json +4 -12
- package/src/Trans.tsx +5 -2
- package/src/index.ts +14 -3
- package/src/util.test.ts +61 -0
- package/src/util.ts +33 -7
- package/babel.config.js +0 -8
package/README.md
CHANGED
|
@@ -4,8 +4,8 @@ I18n support for astro.
|
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
- Integration with `i18nya` and `astro`
|
|
8
|
-
- A `<Trans />` component that works better than the one in `react-i18next
|
|
7
|
+
- Integration with [`i18nya`](https://www.npmjs.com/package/i18nya) and [`astro`](https://astro.build/)
|
|
8
|
+
- A `<Trans />` component that works better than the one in [`react-i18next`](https://react.i18next.com/latest/trans-component)!
|
|
9
9
|
|
|
10
10
|
## Installation
|
|
11
11
|
|
|
@@ -42,12 +42,26 @@ Then for all pages in `src/pages/[...lang]/*.astro`:
|
|
|
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 `
|
|
45
|
+
// generate paths only for languages in your `langs/` folder!
|
|
46
46
|
export const getStaticPaths = makeGetStaticPaths(i18nya);
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
+
## Examples
|
|
50
|
+
|
|
51
|
+
See [`hello-astro`](https://github.com/FyraLabs/i18nya/tree/main/examples/hello-astro).
|
|
52
|
+
|
|
49
53
|
## Trans
|
|
50
54
|
|
|
55
|
+
This requires `experimentalReactChildren` in `astro.config.mjs`:
|
|
56
|
+
```
|
|
57
|
+
export default defineConfig({
|
|
58
|
+
integrations: [
|
|
59
|
+
react({ experimentalReactChildren: true }),
|
|
60
|
+
astro_i18nya(i18nya),
|
|
61
|
+
],
|
|
62
|
+
});
|
|
63
|
+
```
|
|
64
|
+
|
|
51
65
|
```tsx
|
|
52
66
|
<Trans t={t("test", { user: "John" })}>
|
|
53
67
|
<b />
|
|
@@ -58,6 +72,10 @@ export const getStaticPaths = makeGetStaticPaths(i18nya);
|
|
|
58
72
|
With `"test": "Hello <1>{{user}}</1>, welcome to <2><1>my site</1></2>."`, the above element will become:
|
|
59
73
|
|
|
60
74
|
```html
|
|
61
|
-
<b>
|
|
62
|
-
>.
|
|
75
|
+
Hello <b>John</b>, welcome to <a href="https://example.com"><b>my site</b></a>.
|
|
63
76
|
```
|
|
77
|
+
|
|
78
|
+
## `prefixDefaultLocale`
|
|
79
|
+
|
|
80
|
+
Pass `prefixDefaultLocale: true` to `astro_i18nya()` and `makeGetStaticPaths()`. See their respective JSDoc for more info.
|
|
81
|
+
|
package/dist/Trans.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Trans.d.ts","sourceRoot":"","sources":["../src/Trans.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAqB,SAAS,EAAE,MAAM,OAAO,CAAC;AAE1D,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,SAAS,CAAC;IACpB,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;0CAC+B,KAAK;AAAvC,
|
|
1
|
+
{"version":3,"file":"Trans.d.ts","sourceRoot":"","sources":["../src/Trans.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAqB,SAAS,EAAE,MAAM,OAAO,CAAC;AAE1D,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,SAAS,CAAC;IACpB,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;0CAC+B,KAAK;AAAvC,wBAyDsC"}
|
package/dist/Trans.js
CHANGED
|
@@ -36,7 +36,10 @@ export default (({ children, t }) => {
|
|
|
36
36
|
const tagStack = [];
|
|
37
37
|
for (let ch_idx = 0; ch_idx < t.length;) {
|
|
38
38
|
if (t.substring(ch_idx, ch_idx + 2) == "\\<") {
|
|
39
|
-
elms.
|
|
39
|
+
if (typeof elms[elms.length - 1] === "string")
|
|
40
|
+
elms[elms.length - 1] += "<";
|
|
41
|
+
else
|
|
42
|
+
elms.push("<");
|
|
40
43
|
ch_idx += 2;
|
|
41
44
|
continue;
|
|
42
45
|
}
|
package/dist/Trans.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Trans.js","sourceRoot":"","sources":["../src/Trans.tsx"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,4BAA4B;AAE5B,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAQ/D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAS,EAAE,EAAE;IACzC,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACvB,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9D,CAAC;IACF,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,OAAO,CAAC,CAAC,CAAC,eAAe;IAC3B,CAAC;IAED,MAAM,IAAI,GAAgB,EAAE,CAAC,CAAC,6BAA6B;IAC3D,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"Trans.js","sourceRoot":"","sources":["../src/Trans.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,14 @@ import type { AstroIntegration } from "astro";
|
|
|
3
3
|
import Trans from "./Trans.js";
|
|
4
4
|
import { listLang, getLangName, makeGetStaticPaths } from "./util.js";
|
|
5
5
|
export { Trans, listLang, getLangName, makeGetStaticPaths };
|
|
6
|
-
export
|
|
6
|
+
export type AstroI18nyaConfig = {
|
|
7
|
+
prefixDefaultLocale?: boolean;
|
|
8
|
+
redirectToDefaultLocale?: boolean;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Astro integration for i18nya.
|
|
12
|
+
* @param i18nya return value of `init()` from `i18nya`
|
|
13
|
+
* @param config routing behavior overrides
|
|
14
|
+
*/
|
|
15
|
+
export default function astro_i18nya<T extends string | number | symbol>(i18nya: I18Nya<T>, { prefixDefaultLocale, redirectToDefaultLocale }?: AstroI18nyaConfig): AstroIntegration;
|
|
7
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;AAE5D,MAAM,CAAC,OAAO,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EACrE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,EAAE,mBAA2B,EAAE,uBAA+B,EAAE,GAAE,iBAAsB,GACvF,gBAAgB,CAqBlB"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import Trans from "./Trans.js";
|
|
2
2
|
import { listLang, getLangName, makeGetStaticPaths } from "./util.js";
|
|
3
3
|
export { Trans, listLang, getLangName, makeGetStaticPaths };
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Astro integration for i18nya.
|
|
6
|
+
* @param i18nya return value of `init()` from `i18nya`
|
|
7
|
+
* @param config routing behavior overrides
|
|
8
|
+
*/
|
|
9
|
+
export default function astro_i18nya(i18nya, { prefixDefaultLocale = false, redirectToDefaultLocale = false } = {}) {
|
|
5
10
|
return {
|
|
6
11
|
name: "astro-i18nya",
|
|
7
12
|
hooks: {
|
|
@@ -11,8 +16,8 @@ export default function astroI18nya(i18nya) {
|
|
|
11
16
|
defaultLocale: i18nya.config.defaultLang,
|
|
12
17
|
locales: Object.keys(i18nya.translations),
|
|
13
18
|
routing: {
|
|
14
|
-
prefixDefaultLocale
|
|
15
|
-
redirectToDefaultLocale
|
|
19
|
+
prefixDefaultLocale,
|
|
20
|
+
redirectToDefaultLocale,
|
|
16
21
|
fallbackType: "redirect",
|
|
17
22
|
},
|
|
18
23
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;AAO5D;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAClC,MAAiB,EACjB,EAAE,mBAAmB,GAAG,KAAK,EAAE,uBAAuB,GAAG,KAAK,KAAwB,EAAE;IAExF,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE;YACL,oBAAoB,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;gBACzC,YAAY,CAAC;oBACX,IAAI,EAAE;wBACJ,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW;wBACxC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;wBACzC,OAAO,EAAE;4BACP,mBAAmB;4BACnB,uBAAuB;4BACvB,YAAY,EAAE,UAAU;yBACzB;qBACF;oBACD,uBAAuB;oBACvB,8DAA8D;iBAC/D,CAAC,CAAC;YACL,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/dist/util.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { GetStaticPathsResult } from "astro";
|
|
1
2
|
import type { I18Nya } from "i18nya";
|
|
2
3
|
/**
|
|
3
4
|
* Obtain the language name.
|
|
@@ -13,9 +14,20 @@ export declare const getLangName: (lang: string, displayLang?: string) => string
|
|
|
13
14
|
* @returns a map of language locale → language name
|
|
14
15
|
*/
|
|
15
16
|
export declare const listLang: <T extends string | number | symbol>(i18nya: I18Nya<T>, displayLang?: string) => Map<string, string>;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Build a `getStaticPaths` factory for Astro i18n routes.
|
|
19
|
+
*
|
|
20
|
+
* Returns a function that expands the provided `staticPaths` for every
|
|
21
|
+
* language in `i18nya.translations`. By default, the default language uses
|
|
22
|
+
* `{ params: { lang: undefined } }` so its route is not prefixed, while
|
|
23
|
+
* other languages use `{ params: { lang } }`. When `prefixDefaultLocale`
|
|
24
|
+
* is true, the default language also uses `{ params: { lang } }`.
|
|
25
|
+
*
|
|
26
|
+
* @param i18nya return value of `init()` from `i18nya`
|
|
27
|
+
* @param staticPaths original `getStaticPaths` array to be localized
|
|
28
|
+
* @returns a `getStaticPaths` function for Astro
|
|
29
|
+
*/
|
|
30
|
+
export declare const makeGetStaticPaths: <T extends string | number | symbol>(i18nya: I18Nya<T>, staticPaths?: GetStaticPathsResult, { prefixDefaultLocale }?: {
|
|
31
|
+
prefixDefaultLocale?: boolean;
|
|
32
|
+
}) => (() => GetStaticPathsResult);
|
|
21
33
|
//# sourceMappingURL=util.d.ts.map
|
package/dist/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,cAAc,MAAM,WAIjD,CAAC;AAEd;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EACzD,QAAQ,MAAM,CAAC,CAAC,CAAC,EACjB,cAAc,MAAM,wBAOnB,CAAC;AAEJ,eAAO,MAAM,kBAAkB,GAC5B,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,cAAc,MAAM,WAIjD,CAAC;AAEd;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EACzD,QAAQ,MAAM,CAAC,CAAC,CAAC,EACjB,cAAc,MAAM,wBAOnB,CAAC;AAEJ;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB,GAC5B,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EACjC,QAAQ,MAAM,CAAC,CAAC,CAAC,EACjB,cAAa,oBAAuC,EACpD,0BAAiC;IAAE,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAO,KACtE,CAAC,MAAM,oBAAoB,CAczB,CAAC"}
|
package/dist/util.js
CHANGED
|
@@ -18,7 +18,27 @@ export const listLang = (i18nya, displayLang) => new Map(Object.keys(i18nya.tran
|
|
|
18
18
|
l,
|
|
19
19
|
getLangName(l.replace("_", "-"), displayLang),
|
|
20
20
|
]));
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Build a `getStaticPaths` factory for Astro i18n routes.
|
|
23
|
+
*
|
|
24
|
+
* Returns a function that expands the provided `staticPaths` for every
|
|
25
|
+
* language in `i18nya.translations`. By default, the default language uses
|
|
26
|
+
* `{ params: { lang: undefined } }` so its route is not prefixed, while
|
|
27
|
+
* other languages use `{ params: { lang } }`. When `prefixDefaultLocale`
|
|
28
|
+
* is true, the default language also uses `{ params: { lang } }`.
|
|
29
|
+
*
|
|
30
|
+
* @param i18nya return value of `init()` from `i18nya`
|
|
31
|
+
* @param staticPaths original `getStaticPaths` array to be localized
|
|
32
|
+
* @returns a `getStaticPaths` function for Astro
|
|
33
|
+
*/
|
|
34
|
+
export const makeGetStaticPaths = (i18nya, staticPaths = [{ params: {} }], { prefixDefaultLocale = false } = {}) => () => staticPaths.flatMap(({ params, props }) => Object.keys(i18nya.translations)
|
|
35
|
+
.map((lang) => ({
|
|
36
|
+
props,
|
|
37
|
+
params: {
|
|
38
|
+
...params,
|
|
39
|
+
lang: lang === i18nya.config.defaultLang && !prefixDefaultLocale
|
|
40
|
+
? undefined
|
|
41
|
+
: lang,
|
|
42
|
+
},
|
|
43
|
+
})));
|
|
24
44
|
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,WAAoB,EAAE,EAAE,CAChE,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,EAAE;IAC3C,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,QAAQ;CAChB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AAEd;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,MAAiB,EACjB,WAAoB,EACpB,EAAE,CACF,IAAI,GAAG,CACL,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC1C,CAAC;IACD,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,WAAW,CAAC;CAC9C,CAAC,CACH,CAAC;AAEJ;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAC7B,CACE,MAAiB,EACjB,cAAoC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EACpD,EAAE,mBAAmB,GAAG,KAAK,KAAwC,EAAE,EACzC,EAAE,CAChC,GAAyB,EAAE,CACzB,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAwB,EAAE,CAC9D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;KAC7B,GAAG,CAAC,CAAC,IAAI,EAAsB,EAAE,CAAC,CAAC;IAClC,KAAK;IACL,MAAM,EAAE;QACN,GAAG,MAAM;QACT,IAAI,EACF,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,mBAAmB;YACxD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI;KACX;CACF,CAAC,CAAC,CACN,CAAC"}
|
package/jest.config.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
import type {Config} from 'jest';
|
|
1
|
+
import type { Config } from 'jest';
|
|
2
2
|
|
|
3
3
|
const config: Config = {
|
|
4
|
-
|
|
4
|
+
preset: "ts-jest",
|
|
5
|
+
testEnvironment: "jsdom",
|
|
6
|
+
testPathIgnorePatterns: [
|
|
7
|
+
"<rootDir>/dist"
|
|
8
|
+
],
|
|
9
|
+
transform: {
|
|
10
|
+
'^.+\\.(ts|tsx)$': 'ts-jest',
|
|
11
|
+
},
|
|
5
12
|
};
|
|
6
13
|
|
|
7
|
-
export default config;
|
|
14
|
+
export default config;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "astro-i18nya",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.5",
|
|
4
4
|
"description": "Astro integration for i18nya: i18n as small as a cat's paw",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -13,11 +13,6 @@
|
|
|
13
13
|
"type": "git",
|
|
14
14
|
"url": "git+https://github.com/FyraLabs/i18nya.git"
|
|
15
15
|
},
|
|
16
|
-
"jest": {
|
|
17
|
-
"testPathIgnorePatterns": [
|
|
18
|
-
"<rootDir>/dist"
|
|
19
|
-
]
|
|
20
|
-
},
|
|
21
16
|
"keywords": [
|
|
22
17
|
"astro",
|
|
23
18
|
"astro-integration",
|
|
@@ -35,25 +30,22 @@
|
|
|
35
30
|
},
|
|
36
31
|
"homepage": "https://github.com/FyraLabs/i18nya#readme",
|
|
37
32
|
"devDependencies": {
|
|
38
|
-
"@babel/core": "^7.28.5",
|
|
39
|
-
"@babel/preset-env": "^7.28.5",
|
|
40
|
-
"@babel/preset-react": "^7.28.5",
|
|
41
|
-
"@babel/preset-typescript": "^7.28.5",
|
|
42
33
|
"@testing-library/jest-dom": "^6.9.1",
|
|
43
34
|
"@testing-library/react": "^16.3.0",
|
|
44
35
|
"@types/jest": "^30.0.0",
|
|
45
36
|
"@types/node": "^24.10.1",
|
|
46
|
-
"
|
|
37
|
+
"@types/react": "^19.2.14",
|
|
47
38
|
"jest": "^30.2.0",
|
|
48
39
|
"jest-environment-jsdom": "^30.2.0",
|
|
49
40
|
"react-test-renderer": "^19.2.0",
|
|
41
|
+
"ts-jest": "^29.4.9",
|
|
50
42
|
"typescript": "^5.9.3"
|
|
51
43
|
},
|
|
52
44
|
"peerDependencies": {
|
|
53
45
|
"typescript": "^5"
|
|
54
46
|
},
|
|
55
47
|
"dependencies": {
|
|
56
|
-
"astro": "^
|
|
48
|
+
"astro": "^6.2.2",
|
|
57
49
|
"i18nya": "^0.2.0",
|
|
58
50
|
"react": "^19.2.0"
|
|
59
51
|
}
|
package/src/Trans.tsx
CHANGED
|
@@ -44,9 +44,12 @@ export default (({ children, t }: Props) => {
|
|
|
44
44
|
|
|
45
45
|
const elms: ReactNode[] = []; // resulting list of elements
|
|
46
46
|
const tagStack = [];
|
|
47
|
-
for (let ch_idx = 0; ch_idx < t.length;
|
|
47
|
+
for (let ch_idx = 0; ch_idx < t.length;) {
|
|
48
48
|
if (t.substring(ch_idx, ch_idx + 2) == "\\<") {
|
|
49
|
-
elms.
|
|
49
|
+
if (typeof elms[elms.length - 1] === "string")
|
|
50
|
+
elms[elms.length - 1] += "<";
|
|
51
|
+
else
|
|
52
|
+
elms.push("<");
|
|
50
53
|
ch_idx += 2;
|
|
51
54
|
continue;
|
|
52
55
|
}
|
package/src/index.ts
CHANGED
|
@@ -4,8 +4,19 @@ import Trans from "./Trans.js";
|
|
|
4
4
|
import { listLang, getLangName, makeGetStaticPaths } from "./util.js";
|
|
5
5
|
export { Trans, listLang, getLangName, makeGetStaticPaths };
|
|
6
6
|
|
|
7
|
-
export
|
|
7
|
+
export type AstroI18nyaConfig = {
|
|
8
|
+
prefixDefaultLocale?: boolean;
|
|
9
|
+
redirectToDefaultLocale?: boolean;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Astro integration for i18nya.
|
|
14
|
+
* @param i18nya return value of `init()` from `i18nya`
|
|
15
|
+
* @param config routing behavior overrides
|
|
16
|
+
*/
|
|
17
|
+
export default function astro_i18nya<T extends string | number | symbol>(
|
|
8
18
|
i18nya: I18Nya<T>,
|
|
19
|
+
{ prefixDefaultLocale = false, redirectToDefaultLocale = false }: AstroI18nyaConfig = {},
|
|
9
20
|
): AstroIntegration {
|
|
10
21
|
return {
|
|
11
22
|
name: "astro-i18nya",
|
|
@@ -16,8 +27,8 @@ export default function astroI18nya<T extends string | number | symbol>(
|
|
|
16
27
|
defaultLocale: i18nya.config.defaultLang,
|
|
17
28
|
locales: Object.keys(i18nya.translations),
|
|
18
29
|
routing: {
|
|
19
|
-
prefixDefaultLocale
|
|
20
|
-
redirectToDefaultLocale
|
|
30
|
+
prefixDefaultLocale,
|
|
31
|
+
redirectToDefaultLocale,
|
|
21
32
|
fallbackType: "redirect",
|
|
22
33
|
},
|
|
23
34
|
},
|
package/src/util.test.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { GetStaticPathsResult } from "astro";
|
|
2
|
+
import type { I18Nya } from "i18nya";
|
|
3
|
+
import { makeGetStaticPaths } from "./util";
|
|
4
|
+
|
|
5
|
+
const makeI18nya = (defaultLang: string, langs: string[]): I18Nya<string> =>
|
|
6
|
+
({
|
|
7
|
+
config: { defaultLang },
|
|
8
|
+
translations: Object.fromEntries(langs.map((lang) => [lang, {}])),
|
|
9
|
+
}) as I18Nya<string>;
|
|
10
|
+
|
|
11
|
+
describe("makeGetStaticPaths", () => {
|
|
12
|
+
it("expands static paths for each language", () => {
|
|
13
|
+
const i18nya = makeI18nya("en", ["en", "fr"]);
|
|
14
|
+
const staticPaths: GetStaticPathsResult = [
|
|
15
|
+
{ params: { slug: "hello" }, props: { id: 1 } },
|
|
16
|
+
{ params: { slug: "about" }, props: { id: 2 } },
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
const getStaticPaths = makeGetStaticPaths(i18nya, staticPaths);
|
|
20
|
+
const result = getStaticPaths();
|
|
21
|
+
|
|
22
|
+
expect(result).toEqual([
|
|
23
|
+
{ params: { slug: "hello", lang: undefined }, props: { id: 1 } },
|
|
24
|
+
{ params: { slug: "hello", lang: "fr" }, props: { id: 1 } },
|
|
25
|
+
{ params: { slug: "about", lang: undefined }, props: { id: 2 } },
|
|
26
|
+
{ params: { slug: "about", lang: "fr" }, props: { id: 2 } },
|
|
27
|
+
]);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("uses undefined for default language", () => {
|
|
31
|
+
const i18nya = makeI18nya("en", ["en", "ja"]);
|
|
32
|
+
const staticPaths: GetStaticPathsResult = [{ params: { slug: "home" } }];
|
|
33
|
+
|
|
34
|
+
const result = makeGetStaticPaths(i18nya, staticPaths)();
|
|
35
|
+
|
|
36
|
+
expect(result[0].params.lang).toBeUndefined();
|
|
37
|
+
expect(result[0].params.slug).toBe("home");
|
|
38
|
+
expect(result[1].params.lang).toBe("ja");
|
|
39
|
+
expect(result[1].params.slug).toBe("home");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("includes default language when prefixDefaultLocale is true", () => {
|
|
43
|
+
const i18nya = makeI18nya("en", ["en", "ja"]);
|
|
44
|
+
const staticPaths: GetStaticPathsResult = [{ params: { slug: "home" } }];
|
|
45
|
+
|
|
46
|
+
const result = makeGetStaticPaths(i18nya, staticPaths, { prefixDefaultLocale: true })();
|
|
47
|
+
|
|
48
|
+
expect(result[0].params.lang).toBe("en");
|
|
49
|
+
expect(result[0].params.slug).toBe("home");
|
|
50
|
+
expect(result[1].params.lang).toBe("ja");
|
|
51
|
+
expect(result[1].params.slug).toBe("home");
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("returns static paths even when no static paths are provided", () => {
|
|
55
|
+
const i18nya = makeI18nya("en", ["en", "fr"]);
|
|
56
|
+
const result = makeGetStaticPaths(i18nya)();
|
|
57
|
+
|
|
58
|
+
expect(result[0].params.lang).toBe(undefined);
|
|
59
|
+
expect(result[1].params.lang).toBe("fr");
|
|
60
|
+
});
|
|
61
|
+
});
|
package/src/util.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { GetStaticPathsItem, GetStaticPathsResult } from "astro";
|
|
1
2
|
import type { I18Nya } from "i18nya";
|
|
2
3
|
|
|
3
4
|
/**
|
|
@@ -29,11 +30,36 @@ export const listLang = <T extends string | number | symbol>(
|
|
|
29
30
|
]),
|
|
30
31
|
);
|
|
31
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Build a `getStaticPaths` factory for Astro i18n routes.
|
|
35
|
+
*
|
|
36
|
+
* Returns a function that expands the provided `staticPaths` for every
|
|
37
|
+
* language in `i18nya.translations`. By default, the default language uses
|
|
38
|
+
* `{ params: { lang: undefined } }` so its route is not prefixed, while
|
|
39
|
+
* other languages use `{ params: { lang } }`. When `prefixDefaultLocale`
|
|
40
|
+
* is true, the default language also uses `{ params: { lang } }`.
|
|
41
|
+
*
|
|
42
|
+
* @param i18nya return value of `init()` from `i18nya`
|
|
43
|
+
* @param staticPaths original `getStaticPaths` array to be localized
|
|
44
|
+
* @returns a `getStaticPaths` function for Astro
|
|
45
|
+
*/
|
|
32
46
|
export const makeGetStaticPaths =
|
|
33
|
-
<T extends string | number | symbol>(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
47
|
+
<T extends string | number | symbol>(
|
|
48
|
+
i18nya: I18Nya<T>,
|
|
49
|
+
staticPaths: GetStaticPathsResult = [{ params: {} }],
|
|
50
|
+
{ prefixDefaultLocale = false }: { prefixDefaultLocale?: boolean } = {},
|
|
51
|
+
): (() => GetStaticPathsResult) =>
|
|
52
|
+
(): GetStaticPathsResult =>
|
|
53
|
+
staticPaths.flatMap(({ params, props }): GetStaticPathsResult =>
|
|
54
|
+
Object.keys(i18nya.translations)
|
|
55
|
+
.map((lang): GetStaticPathsItem => ({
|
|
56
|
+
props,
|
|
57
|
+
params: {
|
|
58
|
+
...params,
|
|
59
|
+
lang:
|
|
60
|
+
lang === i18nya.config.defaultLang && !prefixDefaultLocale
|
|
61
|
+
? undefined
|
|
62
|
+
: lang,
|
|
63
|
+
},
|
|
64
|
+
})),
|
|
65
|
+
);
|