@intlayer/docs 8.4.9 → 8.5.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.
- package/dist/cjs/generated/docs.entry.cjs +40 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +40 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +2 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/dictionary/html.md +22 -22
- package/docs/ar/dictionary/markdown.md +18 -18
- package/docs/ar/intlayer_with_analog.md +2 -13
- package/docs/ar/intlayer_with_angular.md +1 -12
- package/docs/ar/intlayer_with_nextjs_14.md +1 -1
- package/docs/ar/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ar/intlayer_with_react_router_v7.md +6 -1
- package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/ar/intlayer_with_storybook.md +2 -5
- package/docs/ar/intlayer_with_svelte_kit.md +9 -5
- package/docs/ar/intlayer_with_vite+lit.md +738 -0
- package/docs/ar/intlayer_with_vite+react.md +16 -4
- package/docs/ar/intlayer_with_vite+solid.md +1 -1
- package/docs/ar/intlayer_with_vite+svelte.md +13 -6
- package/docs/ar/intlayer_with_vite+vanilla.md +722 -0
- package/docs/ar/intlayer_with_vite+vue.md +21 -5
- package/docs/ar/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/ar/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/ar/releases/v8.md +27 -27
- package/docs/bn/intlayer_with_storybook.md +2 -5
- package/docs/bn/intlayer_with_vite+lit.md +738 -0
- package/docs/bn/intlayer_with_vite+vanilla.md +722 -0
- package/docs/cs/intlayer_with_storybook.md +2 -5
- package/docs/cs/intlayer_with_vite+lit.md +738 -0
- package/docs/cs/intlayer_with_vite+vanilla.md +722 -0
- package/docs/de/dictionary/html.md +146 -24
- package/docs/de/dictionary/markdown.md +143 -25
- package/docs/de/intlayer_with_analog.md +2 -13
- package/docs/de/intlayer_with_angular.md +1 -12
- package/docs/de/intlayer_with_nextjs_14.md +1 -1
- package/docs/de/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/de/intlayer_with_react_router_v7.md +6 -1
- package/docs/de/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/de/intlayer_with_storybook.md +2 -5
- package/docs/de/intlayer_with_svelte_kit.md +9 -5
- package/docs/de/intlayer_with_vite+lit.md +747 -0
- package/docs/de/intlayer_with_vite+react.md +16 -4
- package/docs/de/intlayer_with_vite+solid.md +1 -1
- package/docs/de/intlayer_with_vite+svelte.md +19 -6
- package/docs/de/intlayer_with_vite+vanilla.md +722 -0
- package/docs/de/intlayer_with_vite+vue.md +21 -5
- package/docs/de/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/de/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/de/releases/v8.md +27 -27
- package/docs/en/compiler.md +4 -1
- package/docs/en/configuration.md +4 -1
- package/docs/en/dictionary/html.md +146 -24
- package/docs/en/dictionary/markdown.md +143 -21
- package/docs/en/intlayer_with_analog.md +3 -14
- package/docs/en/intlayer_with_angular.md +1 -12
- package/docs/en/intlayer_with_nextjs_14.md +1 -1
- package/docs/en/intlayer_with_nextjs_16.md +12 -3
- package/docs/en/intlayer_with_nextjs_compiler.md +16 -4
- package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en/intlayer_with_react_router_v7.md +17 -4
- package/docs/en/intlayer_with_react_router_v7_fs_routes.md +18 -4
- package/docs/en/intlayer_with_storybook.md +2 -5
- package/docs/en/intlayer_with_svelte_kit.md +21 -8
- package/docs/en/intlayer_with_tanstack.md +12 -3
- package/docs/en/intlayer_with_vite+lit.md +750 -0
- package/docs/en/intlayer_with_vite+preact.md +31 -3
- package/docs/en/intlayer_with_vite+react.md +28 -7
- package/docs/en/intlayer_with_vite+react_compiler.md +4 -1
- package/docs/en/intlayer_with_vite+solid.md +31 -3
- package/docs/en/intlayer_with_vite+svelte.md +30 -9
- package/docs/en/intlayer_with_vite+vanilla.md +725 -0
- package/docs/en/intlayer_with_vite+vue.md +28 -7
- package/docs/en/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/en/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/en/readme.md +1 -0
- package/docs/en/releases/v8.md +27 -27
- package/docs/en-GB/compiler.md +4 -1
- package/docs/en-GB/configuration.md +4 -1
- package/docs/en-GB/dictionary/html.md +22 -22
- package/docs/en-GB/dictionary/markdown.md +18 -18
- package/docs/en-GB/intlayer_with_analog.md +2 -13
- package/docs/en-GB/intlayer_with_angular.md +1 -12
- package/docs/en-GB/intlayer_with_nextjs_14.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en-GB/intlayer_with_react_router_v7.md +6 -1
- package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/en-GB/intlayer_with_storybook.md +2 -5
- package/docs/en-GB/intlayer_with_svelte_kit.md +9 -5
- package/docs/en-GB/intlayer_with_vite+lit.md +750 -0
- package/docs/en-GB/intlayer_with_vite+react.md +15 -3
- package/docs/en-GB/intlayer_with_vite+solid.md +1 -1
- package/docs/en-GB/intlayer_with_vite+svelte.md +17 -5
- package/docs/en-GB/intlayer_with_vite+vanilla.md +725 -0
- package/docs/en-GB/intlayer_with_vite+vue.md +16 -4
- package/docs/en-GB/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/en-GB/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/en-GB/releases/v8.md +27 -27
- package/docs/es/dictionary/html.md +147 -25
- package/docs/es/dictionary/markdown.md +143 -25
- package/docs/es/intlayer_with_analog.md +2 -13
- package/docs/es/intlayer_with_angular.md +1 -12
- package/docs/es/intlayer_with_nextjs_14.md +1 -1
- package/docs/es/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/es/intlayer_with_react_router_v7.md +6 -1
- package/docs/es/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/es/intlayer_with_storybook.md +2 -5
- package/docs/es/intlayer_with_svelte_kit.md +9 -5
- package/docs/es/intlayer_with_vite+lit.md +747 -0
- package/docs/es/intlayer_with_vite+react.md +16 -4
- package/docs/es/intlayer_with_vite+solid.md +1 -1
- package/docs/es/intlayer_with_vite+svelte.md +16 -6
- package/docs/es/intlayer_with_vite+vanilla.md +722 -0
- package/docs/es/intlayer_with_vite+vue.md +21 -5
- package/docs/es/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/es/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/es/releases/v8.md +27 -27
- package/docs/fr/dictionary/html.md +146 -24
- package/docs/fr/dictionary/markdown.md +143 -25
- package/docs/fr/intlayer_with_analog.md +2 -13
- package/docs/fr/intlayer_with_angular.md +1 -12
- package/docs/fr/intlayer_with_nextjs_14.md +1 -1
- package/docs/fr/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/fr/intlayer_with_react_router_v7.md +6 -1
- package/docs/fr/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/fr/intlayer_with_storybook.md +2 -5
- package/docs/fr/intlayer_with_svelte_kit.md +9 -5
- package/docs/fr/intlayer_with_vite+lit.md +747 -0
- package/docs/fr/intlayer_with_vite+react.md +16 -4
- package/docs/fr/intlayer_with_vite+solid.md +1 -1
- package/docs/fr/intlayer_with_vite+svelte.md +19 -6
- package/docs/fr/intlayer_with_vite+vanilla.md +722 -0
- package/docs/fr/intlayer_with_vite+vue.md +21 -5
- package/docs/fr/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/fr/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/fr/releases/v8.md +27 -27
- package/docs/hi/dictionary/html.md +22 -22
- package/docs/hi/dictionary/markdown.md +18 -18
- package/docs/hi/intlayer_with_analog.md +2 -13
- package/docs/hi/intlayer_with_angular.md +1 -12
- package/docs/hi/intlayer_with_nextjs_14.md +1 -1
- package/docs/hi/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/hi/intlayer_with_react_router_v7.md +6 -1
- package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/hi/intlayer_with_storybook.md +2 -5
- package/docs/hi/intlayer_with_svelte_kit.md +9 -5
- package/docs/hi/intlayer_with_vite+lit.md +738 -0
- package/docs/hi/intlayer_with_vite+react.md +16 -4
- package/docs/hi/intlayer_with_vite+solid.md +1 -1
- package/docs/hi/intlayer_with_vite+svelte.md +13 -6
- package/docs/hi/intlayer_with_vite+vanilla.md +722 -0
- package/docs/hi/intlayer_with_vite+vue.md +21 -5
- package/docs/hi/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/hi/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/hi/releases/v8.md +27 -27
- package/docs/id/dictionary/html.md +22 -22
- package/docs/id/dictionary/markdown.md +18 -18
- package/docs/id/intlayer_with_analog.md +2 -13
- package/docs/id/intlayer_with_angular.md +1 -12
- package/docs/id/intlayer_with_nextjs_14.md +1 -1
- package/docs/id/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/id/intlayer_with_react_router_v7.md +6 -1
- package/docs/id/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/id/intlayer_with_storybook.md +2 -5
- package/docs/id/intlayer_with_svelte_kit.md +9 -5
- package/docs/id/intlayer_with_vite+lit.md +738 -0
- package/docs/id/intlayer_with_vite+react.md +16 -4
- package/docs/id/intlayer_with_vite+solid.md +1 -1
- package/docs/id/intlayer_with_vite+svelte.md +13 -6
- package/docs/id/intlayer_with_vite+vanilla.md +722 -0
- package/docs/id/intlayer_with_vite+vue.md +16 -4
- package/docs/id/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/id/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/id/releases/v8.md +27 -27
- package/docs/it/dictionary/html.md +146 -24
- package/docs/it/dictionary/markdown.md +143 -21
- package/docs/it/intlayer_with_analog.md +2 -13
- package/docs/it/intlayer_with_angular.md +1 -12
- package/docs/it/intlayer_with_nextjs_14.md +1 -1
- package/docs/it/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/it/intlayer_with_react_router_v7.md +6 -1
- package/docs/it/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/it/intlayer_with_storybook.md +2 -5
- package/docs/it/intlayer_with_svelte_kit.md +9 -5
- package/docs/it/intlayer_with_vite+lit.md +747 -0
- package/docs/it/intlayer_with_vite+react.md +16 -4
- package/docs/it/intlayer_with_vite+solid.md +1 -1
- package/docs/it/intlayer_with_vite+svelte.md +13 -6
- package/docs/it/intlayer_with_vite+vanilla.md +722 -0
- package/docs/it/intlayer_with_vite+vue.md +21 -5
- package/docs/it/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/it/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/it/releases/v8.md +27 -27
- package/docs/ja/dictionary/html.md +148 -27
- package/docs/ja/dictionary/markdown.md +139 -24
- package/docs/ja/intlayer_with_analog.md +2 -13
- package/docs/ja/intlayer_with_angular.md +1 -12
- package/docs/ja/intlayer_with_nextjs_14.md +1 -1
- package/docs/ja/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ja/intlayer_with_react_router_v7.md +6 -1
- package/docs/ja/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/ja/intlayer_with_storybook.md +2 -5
- package/docs/ja/intlayer_with_vite+lit.md +747 -0
- package/docs/ja/intlayer_with_vite+solid.md +1 -1
- package/docs/ja/intlayer_with_vite+svelte.md +13 -6
- package/docs/ja/intlayer_with_vite+vanilla.md +722 -0
- package/docs/ja/intlayer_with_vite+vue.md +21 -5
- package/docs/ja/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/ja/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/ja/releases/v8.md +27 -27
- package/docs/ko/dictionary/html.md +149 -28
- package/docs/ko/dictionary/markdown.md +143 -25
- package/docs/ko/intlayer_with_analog.md +2 -13
- package/docs/ko/intlayer_with_angular.md +1 -12
- package/docs/ko/intlayer_with_nextjs_14.md +1 -1
- package/docs/ko/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ko/intlayer_with_react_router_v7.md +6 -1
- package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/ko/intlayer_with_storybook.md +2 -5
- package/docs/ko/intlayer_with_svelte_kit.md +9 -5
- package/docs/ko/intlayer_with_vite+lit.md +747 -0
- package/docs/ko/intlayer_with_vite+react.md +16 -4
- package/docs/ko/intlayer_with_vite+solid.md +1 -1
- package/docs/ko/intlayer_with_vite+svelte.md +13 -6
- package/docs/ko/intlayer_with_vite+vanilla.md +722 -0
- package/docs/ko/intlayer_with_vite+vue.md +21 -5
- package/docs/ko/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/ko/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/ko/releases/v8.md +27 -27
- package/docs/nl/intlayer_with_storybook.md +2 -5
- package/docs/nl/intlayer_with_vite+lit.md +738 -0
- package/docs/nl/intlayer_with_vite+vanilla.md +722 -0
- package/docs/pl/dictionary/html.md +146 -24
- package/docs/pl/dictionary/markdown.md +143 -25
- package/docs/pl/intlayer_with_analog.md +2 -13
- package/docs/pl/intlayer_with_angular.md +1 -12
- package/docs/pl/intlayer_with_nextjs_14.md +1 -1
- package/docs/pl/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/pl/intlayer_with_react_router_v7.md +6 -1
- package/docs/pl/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/pl/intlayer_with_storybook.md +2 -5
- package/docs/pl/intlayer_with_svelte_kit.md +9 -5
- package/docs/pl/intlayer_with_vite+lit.md +738 -0
- package/docs/pl/intlayer_with_vite+react.md +16 -4
- package/docs/pl/intlayer_with_vite+solid.md +1 -1
- package/docs/pl/intlayer_with_vite+svelte.md +13 -6
- package/docs/pl/intlayer_with_vite+vanilla.md +722 -0
- package/docs/pl/intlayer_with_vite+vue.md +16 -4
- package/docs/pl/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/pl/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/pl/releases/v8.md +27 -27
- package/docs/pt/dictionary/html.md +127 -24
- package/docs/pt/dictionary/markdown.md +143 -25
- package/docs/pt/intlayer_with_analog.md +2 -13
- package/docs/pt/intlayer_with_angular.md +1 -12
- package/docs/pt/intlayer_with_nextjs_14.md +1 -1
- package/docs/pt/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/pt/intlayer_with_react_router_v7.md +6 -1
- package/docs/pt/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/pt/intlayer_with_storybook.md +2 -5
- package/docs/pt/intlayer_with_svelte_kit.md +9 -5
- package/docs/pt/intlayer_with_vite+lit.md +747 -0
- package/docs/pt/intlayer_with_vite+react.md +16 -4
- package/docs/pt/intlayer_with_vite+solid.md +1 -1
- package/docs/pt/intlayer_with_vite+svelte.md +16 -6
- package/docs/pt/intlayer_with_vite+vanilla.md +722 -0
- package/docs/pt/intlayer_with_vite+vue.md +21 -5
- package/docs/pt/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/pt/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/pt/releases/v8.md +27 -27
- package/docs/ru/dictionary/html.md +148 -27
- package/docs/ru/dictionary/markdown.md +143 -23
- package/docs/ru/intlayer_with_analog.md +2 -13
- package/docs/ru/intlayer_with_angular.md +1 -12
- package/docs/ru/intlayer_with_nextjs_14.md +1 -1
- package/docs/ru/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ru/intlayer_with_react_router_v7.md +6 -1
- package/docs/ru/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/ru/intlayer_with_storybook.md +2 -5
- package/docs/ru/intlayer_with_svelte_kit.md +9 -5
- package/docs/ru/intlayer_with_vite+lit.md +747 -0
- package/docs/ru/intlayer_with_vite+react.md +16 -4
- package/docs/ru/intlayer_with_vite+solid.md +1 -1
- package/docs/ru/intlayer_with_vite+svelte.md +13 -6
- package/docs/ru/intlayer_with_vite+vanilla.md +722 -0
- package/docs/ru/intlayer_with_vite+vue.md +21 -5
- package/docs/ru/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/ru/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/ru/releases/v8.md +27 -27
- package/docs/tr/dictionary/html.md +129 -27
- package/docs/tr/dictionary/markdown.md +143 -23
- package/docs/tr/intlayer_with_analog.md +2 -13
- package/docs/tr/intlayer_with_angular.md +1 -12
- package/docs/tr/intlayer_with_nextjs_14.md +1 -1
- package/docs/tr/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/tr/intlayer_with_react_router_v7.md +6 -1
- package/docs/tr/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/tr/intlayer_with_storybook.md +2 -5
- package/docs/tr/intlayer_with_svelte_kit.md +9 -5
- package/docs/tr/intlayer_with_vite+lit.md +738 -0
- package/docs/tr/intlayer_with_vite+react.md +16 -4
- package/docs/tr/intlayer_with_vite+solid.md +1 -1
- package/docs/tr/intlayer_with_vite+svelte.md +13 -6
- package/docs/tr/intlayer_with_vite+vanilla.md +722 -0
- package/docs/tr/intlayer_with_vite+vue.md +16 -4
- package/docs/tr/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/tr/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/tr/releases/v8.md +27 -27
- package/docs/uk/dictionary/html.md +22 -22
- package/docs/uk/dictionary/markdown.md +18 -18
- package/docs/uk/intlayer_with_analog.md +2 -13
- package/docs/uk/intlayer_with_angular.md +1 -12
- package/docs/uk/intlayer_with_nextjs_14.md +1 -1
- package/docs/uk/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/uk/intlayer_with_react_router_v7.md +5 -1
- package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/uk/intlayer_with_storybook.md +2 -5
- package/docs/uk/intlayer_with_svelte_kit.md +9 -5
- package/docs/uk/intlayer_with_vite+lit.md +738 -0
- package/docs/uk/intlayer_with_vite+react.md +16 -4
- package/docs/uk/intlayer_with_vite+solid.md +1 -1
- package/docs/uk/intlayer_with_vite+svelte.md +18 -6
- package/docs/uk/intlayer_with_vite+vanilla.md +722 -0
- package/docs/uk/intlayer_with_vite+vue.md +16 -4
- package/docs/uk/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/uk/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/uk/releases/v8.md +27 -27
- package/docs/ur/intlayer_with_storybook.md +2 -5
- package/docs/ur/intlayer_with_vite+lit.md +738 -0
- package/docs/ur/intlayer_with_vite+vanilla.md +722 -0
- package/docs/vi/dictionary/html.md +22 -22
- package/docs/vi/dictionary/markdown.md +18 -18
- package/docs/vi/intlayer_with_analog.md +2 -13
- package/docs/vi/intlayer_with_angular.md +1 -12
- package/docs/vi/intlayer_with_nextjs_14.md +1 -1
- package/docs/vi/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/vi/intlayer_with_react_router_v7.md +6 -1
- package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/vi/intlayer_with_storybook.md +2 -5
- package/docs/vi/intlayer_with_svelte_kit.md +9 -5
- package/docs/vi/intlayer_with_vite+lit.md +738 -0
- package/docs/vi/intlayer_with_vite+react.md +16 -4
- package/docs/vi/intlayer_with_vite+solid.md +1 -1
- package/docs/vi/intlayer_with_vite+svelte.md +17 -5
- package/docs/vi/intlayer_with_vite+vanilla.md +722 -0
- package/docs/vi/intlayer_with_vite+vue.md +16 -4
- package/docs/vi/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/vi/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/vi/releases/v8.md +27 -27
- package/docs/zh/dictionary/html.md +148 -27
- package/docs/zh/dictionary/markdown.md +143 -21
- package/docs/zh/intlayer_with_analog.md +2 -13
- package/docs/zh/intlayer_with_angular.md +1 -12
- package/docs/zh/intlayer_with_nextjs_14.md +1 -1
- package/docs/zh/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/zh/intlayer_with_react_router_v7.md +6 -1
- package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +6 -1
- package/docs/zh/intlayer_with_storybook.md +2 -5
- package/docs/zh/intlayer_with_svelte_kit.md +9 -5
- package/docs/zh/intlayer_with_vite+lit.md +747 -0
- package/docs/zh/intlayer_with_vite+react.md +16 -4
- package/docs/zh/intlayer_with_vite+solid.md +1 -1
- package/docs/zh/intlayer_with_vite+svelte.md +16 -6
- package/docs/zh/intlayer_with_vite+vanilla.md +722 -0
- package/docs/zh/intlayer_with_vite+vue.md +16 -4
- package/docs/zh/packages/react-intlayer/MarkdownRenderer.md +1 -1
- package/docs/zh/packages/svelte-intlayer/useRewriteURL.md +1 -1
- package/docs/zh/releases/v8.md +27 -27
- package/package.json +8 -8
- package/src/generated/docs.entry.ts +40 -0
|
@@ -0,0 +1,722 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-03-23
|
|
3
|
+
updatedAt: 2026-03-23
|
|
4
|
+
title: i18n Vite + Vanilla JS - Cách dịch ứng dụng Vanilla JS vào năm 2026
|
|
5
|
+
description: Khám phá cách làm cho website Vite và Vanilla JS của bạn đa ngôn ngữ. Làm theo tài liệu để quốc tế hóa (i18n) và dịch nó.
|
|
6
|
+
keywords:
|
|
7
|
+
- Quốc tế hóa
|
|
8
|
+
- Tài liệu
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Vite
|
|
11
|
+
- Vanilla JS
|
|
12
|
+
- JavaScript
|
|
13
|
+
- TypeScript
|
|
14
|
+
- HTML
|
|
15
|
+
slugs:
|
|
16
|
+
- doc
|
|
17
|
+
- environment
|
|
18
|
+
- vite-and-vanilla
|
|
19
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-vite-vanilla-template
|
|
20
|
+
history:
|
|
21
|
+
- version: 8.4.10
|
|
22
|
+
date: 2026-03-23
|
|
23
|
+
changes: "Init history"
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Dịch website Vite và Vanilla JS của bạn bằng Intlayer | Quốc tế hóa (i18n)
|
|
27
|
+
|
|
28
|
+
## Mục lục
|
|
29
|
+
|
|
30
|
+
<TOC/>
|
|
31
|
+
|
|
32
|
+
## Intlayer là gì?
|
|
33
|
+
|
|
34
|
+
**Intlayer** là một thư viện quốc tế hóa (i18n) mã nguồn mở và sáng tạo được thiết kế để đơn giản hóa việc hỗ trợ đa ngôn ngữ trong các ứng dụng web hiện đại.
|
|
35
|
+
|
|
36
|
+
Với Intlayer, bạn có thể:
|
|
37
|
+
|
|
38
|
+
- **Dễ dàng quản lý các bản dịch** bằng cách sử dụng các từ điển khai báo ở cấp độ thành phần.
|
|
39
|
+
- **Bản địa hóa động metadata**, route và nội dung.
|
|
40
|
+
- **Đảm bảo hỗ trợ TypeScript** với các kiểu dữ liệu được tạo tự động, cải thiện tính năng tự động hoàn thành và phát hiện lỗi.
|
|
41
|
+
- **Tận dụng các tính năng nâng cao**, như phát hiện và chuyển đổi ngôn ngữ động.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Hướng dẫn từng bước để thiết lập Intlayer trong ứng dụng Vite và Vanilla JS
|
|
46
|
+
|
|
47
|
+
### Bước 1: Cài đặt các phụ thuộc
|
|
48
|
+
|
|
49
|
+
Cài đặt các gói cần thiết bằng npm:
|
|
50
|
+
|
|
51
|
+
```bash packageManager="npm"
|
|
52
|
+
npm install intlayer vanilla-intlayer
|
|
53
|
+
npm install vite-intlayer --save-dev
|
|
54
|
+
npx intlayer init
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
```bash packageManager="pnpm"
|
|
58
|
+
pnpm add intlayer vanilla-intlayer
|
|
59
|
+
pnpm add vite-intlayer --save-dev
|
|
60
|
+
pnpm intlayer init
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```bash packageManager="yarn"
|
|
64
|
+
yarn add intlayer vanilla-intlayer
|
|
65
|
+
yarn add vite-intlayer --save-dev
|
|
66
|
+
yarn intlayer init
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
```bash packageManager="bun"
|
|
70
|
+
bun add intlayer vanilla-intlayer
|
|
71
|
+
bun add vite-intlayer --dev
|
|
72
|
+
bunx intlayer init
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
- **intlayer**
|
|
76
|
+
Gói cốt lõi cung cấp các công cụ quốc tế hóa để quản lý cấu hình, dịch thuật, [khai báo nội dung](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md), chuyển đổi mã nguồn và [lệnh CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/cli/index.md).
|
|
77
|
+
|
|
78
|
+
- **vanilla-intlayer**
|
|
79
|
+
Gói tích hợp Intlayer với các ứng dụng JavaScript / TypeScript thuần túy. Nó cung cấp một pub/sub singleton (`IntlayerClient`) và các hàm hỗ trợ dựa trên callback (`useIntlayer`, `useLocale`, v.v.) để bất kỳ phần nào trong ứng dụng của bạn cũng có thể phản ứng với các thay đổi ngôn ngữ mà không phụ thuộc vào framework UI.
|
|
80
|
+
|
|
81
|
+
- **vite-intlayer**
|
|
82
|
+
Bao gồm plugin Vite để tích hợp Intlayer với [Vite bundler](https://vite.dev/guide/why.html#why-bundle-for-production), cũng như middleware để phát hiện ngôn ngữ ưa thích của người dùng, quản lý cookie và xử lý chuyển hướng URL.
|
|
83
|
+
|
|
84
|
+
### Bước 2: Cấu hình dự án của bạn
|
|
85
|
+
|
|
86
|
+
Tạo một tệp cấu hình để thiết lập các ngôn ngữ cho ứng dụng của bạn:
|
|
87
|
+
|
|
88
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
89
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
90
|
+
|
|
91
|
+
const config: IntlayerConfig = {
|
|
92
|
+
internationalization: {
|
|
93
|
+
locales: [
|
|
94
|
+
Locales.ENGLISH,
|
|
95
|
+
Locales.FRENCH,
|
|
96
|
+
Locales.SPANISH,
|
|
97
|
+
// Các ngôn ngữ khác của bạn
|
|
98
|
+
],
|
|
99
|
+
defaultLocale: Locales.ENGLISH,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export default config;
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
107
|
+
import { Locales } from "intlayer";
|
|
108
|
+
|
|
109
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
110
|
+
const config = {
|
|
111
|
+
internationalization: {
|
|
112
|
+
locales: [
|
|
113
|
+
Locales.ENGLISH,
|
|
114
|
+
Locales.FRENCH,
|
|
115
|
+
Locales.SPANISH,
|
|
116
|
+
// Các ngôn ngữ khác của bạn
|
|
117
|
+
],
|
|
118
|
+
defaultLocale: Locales.ENGLISH,
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
export default config;
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
126
|
+
const { Locales } = require("intlayer");
|
|
127
|
+
|
|
128
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
129
|
+
const config = {
|
|
130
|
+
internationalization: {
|
|
131
|
+
locales: [
|
|
132
|
+
Locales.ENGLISH,
|
|
133
|
+
Locales.FRENCH,
|
|
134
|
+
Locales.SPANISH,
|
|
135
|
+
// Các ngôn ngữ khác của bạn
|
|
136
|
+
],
|
|
137
|
+
defaultLocale: Locales.ENGLISH,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
module.exports = config;
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
> Thông qua tệp cấu hình này, bạn có thể thiết lập URL được bản địa hóa, chuyển hướng middleware, tên cookie, vị trí và phần mở rộng của các khai báo nội dung, tắt log Intlayer trong console, và nhiều hơn nữa. Để biết danh sách đầy đủ các tham số khả dụng, hãy tham khảo [tài liệu cấu hình](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/configuration.md).
|
|
145
|
+
|
|
146
|
+
### Bước 3: Tích hợp Intlayer vào cấu hình Vite của bạn
|
|
147
|
+
|
|
148
|
+
Thêm plugin intlayer vào cấu hình của bạn.
|
|
149
|
+
|
|
150
|
+
```typescript fileName="vite.config.ts" codeFormat="typescript"
|
|
151
|
+
import { defineConfig } from "vite";
|
|
152
|
+
import { intlayer } from "vite-intlayer";
|
|
153
|
+
|
|
154
|
+
// https://vitejs.dev/config/
|
|
155
|
+
export default defineConfig({
|
|
156
|
+
plugins: [intlayer()],
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
```javascript fileName="vite.config.mjs" codeFormat="esm"
|
|
161
|
+
import { defineConfig } from "vite";
|
|
162
|
+
import { intlayer } from "vite-intlayer";
|
|
163
|
+
|
|
164
|
+
// https://vitejs.dev/config/
|
|
165
|
+
export default defineConfig({
|
|
166
|
+
plugins: [intlayer()],
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
```javascript fileName="vite.config.cjs" codeFormat="commonjs"
|
|
171
|
+
const { defineConfig } = require("vite");
|
|
172
|
+
const { intlayer } = require("vite-intlayer");
|
|
173
|
+
|
|
174
|
+
// https://vitejs.dev/config/
|
|
175
|
+
module.exports = defineConfig({
|
|
176
|
+
plugins: [intlayer()],
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
> Plugin Vite `intlayer()` được sử dụng để tích hợp Intlayer với Vite. Nó đảm bảo việc xây dựng các tệp khai báo nội dung và theo dõi chúng trong chế độ phát triển. Nó định nghĩa các biến môi trường Intlayer trong ứng dụng Vite. Ngoài ra, nó cung cấp các alias để tối ưu hóa hiệu suất.
|
|
181
|
+
|
|
182
|
+
### Bước 4: Khởi tạo Intlayer trong entry point của bạn
|
|
183
|
+
|
|
184
|
+
Gọi `installIntlayer()` **trước khi** bất kỳ nội dung nào được render để ngôn ngữ singleton toàn cầu sẵn sàng.
|
|
185
|
+
|
|
186
|
+
```typescript fileName="src/main.ts" codeFormat="typescript"
|
|
187
|
+
import { installIntlayer } from "vanilla-intlayer";
|
|
188
|
+
|
|
189
|
+
// Phải được gọi trước khi render bất kỳ nội dung i18n nào.
|
|
190
|
+
installIntlayer();
|
|
191
|
+
|
|
192
|
+
// Import và chạy các module ứng dụng của bạn.
|
|
193
|
+
import "./app.js";
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Nếu bạn cũng sử dụng khai báo nội dung `md()` (Markdown), hãy cài đặt thêm trình render markdown:
|
|
197
|
+
|
|
198
|
+
```typescript fileName="src/main.ts" codeFormat="typescript"
|
|
199
|
+
import { installIntlayer, installIntlayerMarkdown } from "vanilla-intlayer";
|
|
200
|
+
|
|
201
|
+
installIntlayer();
|
|
202
|
+
installIntlayerMarkdown();
|
|
203
|
+
|
|
204
|
+
import "./app.js";
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Bước 5: Khai báo nội dung của bạn
|
|
208
|
+
|
|
209
|
+
Tạo và quản lý các khai báo nội dung để lưu trữ các bản dịch:
|
|
210
|
+
|
|
211
|
+
```typescript fileName="src/app.content.ts" contentDeclarationFormat="typescript"
|
|
212
|
+
import { insert, t, type Dictionary } from "intlayer";
|
|
213
|
+
|
|
214
|
+
const appContent = {
|
|
215
|
+
key: "app",
|
|
216
|
+
content: {
|
|
217
|
+
title: "Vite + Vanilla",
|
|
218
|
+
|
|
219
|
+
viteLogoLabel: t({
|
|
220
|
+
en: "Vite Logo",
|
|
221
|
+
fr: "Logo Vite",
|
|
222
|
+
es: "Logo Vite",
|
|
223
|
+
}),
|
|
224
|
+
|
|
225
|
+
count: insert(
|
|
226
|
+
t({
|
|
227
|
+
en: "count is {{count}}",
|
|
228
|
+
fr: "le compte est {{count}}",
|
|
229
|
+
es: "el recuento es {{count}}",
|
|
230
|
+
})
|
|
231
|
+
),
|
|
232
|
+
|
|
233
|
+
readTheDocs: t({
|
|
234
|
+
en: "Click on the Vite logo to learn more",
|
|
235
|
+
fr: "Cliquez sur le logo Vite pour en savoir plus",
|
|
236
|
+
es: "Nhấp vào logo Vite để tìm hiểu thêm",
|
|
237
|
+
}),
|
|
238
|
+
},
|
|
239
|
+
} satisfies Dictionary;
|
|
240
|
+
|
|
241
|
+
export default appContent;
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
```javascript fileName="src/app.content.mjs" contentDeclarationFormat="esm"
|
|
245
|
+
import { insert, t } from "intlayer";
|
|
246
|
+
|
|
247
|
+
/** @type {import('intlayer').Dictionary} */
|
|
248
|
+
const appContent = {
|
|
249
|
+
key: "app",
|
|
250
|
+
content: {
|
|
251
|
+
title: "Vite + Vanilla",
|
|
252
|
+
|
|
253
|
+
viteLogoLabel: t({
|
|
254
|
+
en: "Vite Logo",
|
|
255
|
+
fr: "Logo Vite",
|
|
256
|
+
es: "Logo Vite",
|
|
257
|
+
}),
|
|
258
|
+
|
|
259
|
+
count: insert(
|
|
260
|
+
t({
|
|
261
|
+
en: "count is {{count}}",
|
|
262
|
+
fr: "le compte est {{count}}",
|
|
263
|
+
es: "el recuento es {{count}}",
|
|
264
|
+
})
|
|
265
|
+
),
|
|
266
|
+
|
|
267
|
+
readTheDocs: t({
|
|
268
|
+
en: "Click on the Vite logo to learn more",
|
|
269
|
+
fr: "Cliquez sur le logo Vite pour en savoir plus",
|
|
270
|
+
es: "Nhấp vào logo Vite để tìm hiểu thêm",
|
|
271
|
+
}),
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
export default appContent;
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
```javascript fileName="src/app.content.cjs" contentDeclarationFormat="commonjs"
|
|
279
|
+
const { insert, t } = require("intlayer");
|
|
280
|
+
|
|
281
|
+
/** @type {import('intlayer').Dictionary} */
|
|
282
|
+
const appContent = {
|
|
283
|
+
key: "app",
|
|
284
|
+
content: {
|
|
285
|
+
title: "Vite + Vanilla",
|
|
286
|
+
|
|
287
|
+
viteLogoLabel: t({
|
|
288
|
+
en: "Vite Logo",
|
|
289
|
+
fr: "Logo Vite",
|
|
290
|
+
es: "Logo Vite",
|
|
291
|
+
}),
|
|
292
|
+
|
|
293
|
+
count: insert(
|
|
294
|
+
t({
|
|
295
|
+
en: "count is {{count}}",
|
|
296
|
+
fr: "le compte est {{count}}",
|
|
297
|
+
es: "el recuento es {{count}}",
|
|
298
|
+
})
|
|
299
|
+
),
|
|
300
|
+
|
|
301
|
+
readTheDocs: t({
|
|
302
|
+
en: "Click on the Vite logo to learn more",
|
|
303
|
+
fr: "Cliquez sur le logo Vite pour en savoir plus",
|
|
304
|
+
es: "Nhấp vào logo Vite để tìm hiểu thêm",
|
|
305
|
+
}),
|
|
306
|
+
},
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
module.exports = appContent;
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
```json fileName="src/app.content.json" contentDeclarationFormat="json"
|
|
313
|
+
{
|
|
314
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
315
|
+
"key": "app",
|
|
316
|
+
"content": {
|
|
317
|
+
"title": "Vite + Vanilla",
|
|
318
|
+
"viteLogoLabel": {
|
|
319
|
+
"nodeType": "translation",
|
|
320
|
+
"translation": {
|
|
321
|
+
"en": "Vite Logo",
|
|
322
|
+
"fr": "Logo Vite",
|
|
323
|
+
"es": "Logo Vite"
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
"count": {
|
|
327
|
+
"nodeType": "insertion",
|
|
328
|
+
"insertion": {
|
|
329
|
+
"nodeType": "translation",
|
|
330
|
+
"translation": {
|
|
331
|
+
"en": "count is {{count}}",
|
|
332
|
+
"fr": "le compte est {{count}}",
|
|
333
|
+
"es": "el recuento es {{count}}"
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
"readTheDocs": {
|
|
338
|
+
"nodeType": "translation",
|
|
339
|
+
"translation": {
|
|
340
|
+
"en": "Click on the Vite logo to learn more",
|
|
341
|
+
"fr": "Cliquez sur le logo Vite pour en savoir plus",
|
|
342
|
+
"es": "Nhấp vào logo Vite để tìm hiểu thêm"
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
> Các khai báo nội dung của bạn có thể được định nghĩa ở bất kỳ đâu trong ứng dụng miễn là chúng được bao gồm trong thư mục `contentDir` (mặc định là `./src`) và khớp với phần mở rộng tệp khai báo nội dung (mặc định là `.content.{json,ts,tsx,js,jsx,mjs,cjs}`).
|
|
350
|
+
>
|
|
351
|
+
> Để biết thêm chi tiết, hãy tham khảo [tài liệu khai báo nội dung](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md).
|
|
352
|
+
|
|
353
|
+
### Bước 6: Sử dụng Intlayer trong JavaScript của bạn
|
|
354
|
+
|
|
355
|
+
`vanilla-intlayer` ánh xạ API của `react-intlayer`: `useIntlayer(key, locale?)` trả về nội dung đã dịch trực tiếp. Chuỗi hàm `.onChange()` vào kết quả để đăng ký theo dõi các thay đổi ngôn ngữ — tương đương với việc re-render trong React.
|
|
356
|
+
|
|
357
|
+
```typescript fileName="src/main.ts" codeFormat="typescript"
|
|
358
|
+
import { installIntlayer, useIntlayer } from "vanilla-intlayer";
|
|
359
|
+
|
|
360
|
+
installIntlayer();
|
|
361
|
+
|
|
362
|
+
// Lấy nội dung ban đầu cho ngôn ngữ hiện tại.
|
|
363
|
+
// Chuỗi hàm .onChange() để được thông báo mỗi khi ngôn ngữ thay đổi.
|
|
364
|
+
const content = useIntlayer("app").onChange((newContent) => {
|
|
365
|
+
// Chỉ re-render hoặc cập nhật các node DOM bị ảnh hưởng
|
|
366
|
+
document.querySelector<HTMLHeadingElement>("h1")!.textContent = String(
|
|
367
|
+
newContent.title
|
|
368
|
+
);
|
|
369
|
+
document.querySelector<HTMLParagraphElement>(".read-the-docs")!.textContent =
|
|
370
|
+
String(newContent.readTheDocs);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
// Render lần đầu
|
|
374
|
+
document.querySelector<HTMLHeadingElement>("h1")!.textContent = String(
|
|
375
|
+
content.title
|
|
376
|
+
);
|
|
377
|
+
document.querySelector<HTMLParagraphElement>(".read-the-docs")!.textContent =
|
|
378
|
+
String(content.readTheDocs);
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
> Truy cập các giá trị lá dưới dạng chuỗi bằng cách bao bọc chúng trong `String()`, việc này sẽ gọi phương thức `toString()` của node và trả về văn bản đã dịch.
|
|
382
|
+
>
|
|
383
|
+
> Khi bạn cần giá trị cho một thuộc tính HTML thuần (ví dụ: `alt`, `aria-label`), hãy sử dụng trực tiếp `.value`:
|
|
384
|
+
>
|
|
385
|
+
> ```typescript
|
|
386
|
+
> img.alt = content.viteLogoLabel.value;
|
|
387
|
+
> ```
|
|
388
|
+
|
|
389
|
+
### (Tùy chọn) Bước 7: Thay đổi ngôn ngữ nội dung của bạn
|
|
390
|
+
|
|
391
|
+
Để thay đổi ngôn ngữ nội dung, hãy sử dụng hàm `setLocale` được cung cấp bởi `useLocale`.
|
|
392
|
+
|
|
393
|
+
```typescript fileName="src/locale-switcher.ts" codeFormat="typescript"
|
|
394
|
+
import { getLocaleName } from "intlayer";
|
|
395
|
+
import { useLocale } from "vanilla-intlayer";
|
|
396
|
+
|
|
397
|
+
export function setupLocaleSwitcher(container: HTMLElement): () => void {
|
|
398
|
+
const { locale, availableLocales, setLocale, subscribe } = useLocale();
|
|
399
|
+
|
|
400
|
+
const select = document.createElement("select");
|
|
401
|
+
select.setAttribute("aria-label", "Language");
|
|
402
|
+
|
|
403
|
+
const render = (currentLocale: string) => {
|
|
404
|
+
select.innerHTML = availableLocales
|
|
405
|
+
.map(
|
|
406
|
+
(loc) =>
|
|
407
|
+
`<option value="${loc}"${loc === currentLocale ? " selected" : ""}>
|
|
408
|
+
${getLocaleName(loc)}
|
|
409
|
+
</option>`
|
|
410
|
+
)
|
|
411
|
+
.join("");
|
|
412
|
+
};
|
|
413
|
+
|
|
414
|
+
render(locale);
|
|
415
|
+
container.appendChild(select);
|
|
416
|
+
|
|
417
|
+
select.addEventListener("change", () => setLocale(select.value as any));
|
|
418
|
+
|
|
419
|
+
// Giữ dropdown đồng bộ khi ngôn ngữ thay đổi từ nơi khác
|
|
420
|
+
return subscribe((newLocale) => render(newLocale));
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### (Tùy chọn) Bước 8: Render nội dung Markdown và HTML
|
|
425
|
+
|
|
426
|
+
Intlayer hỗ trợ khai báo nội dung dưới dạng `md()` và `html()`. Trong Vanilla JS, đầu ra đã biên dịch được chèn dưới dạng HTML thô qua `innerHTML`.
|
|
427
|
+
|
|
428
|
+
```typescript fileName="src/app.content.ts" contentDeclarationFormat="typescript"
|
|
429
|
+
import { md, t, type Dictionary } from "intlayer";
|
|
430
|
+
|
|
431
|
+
const appContent = {
|
|
432
|
+
key: "app",
|
|
433
|
+
content: {
|
|
434
|
+
// ...
|
|
435
|
+
editNote: md(
|
|
436
|
+
t({
|
|
437
|
+
en: "Edit `src/main.ts` and save to test **HMR**",
|
|
438
|
+
fr: "Modifiez `src/main.ts` et enregistrez pour tester **HMR**",
|
|
439
|
+
es: "Edite `src/main.ts` y guarde para probar **HMR**",
|
|
440
|
+
})
|
|
441
|
+
),
|
|
442
|
+
},
|
|
443
|
+
} satisfies Dictionary;
|
|
444
|
+
|
|
445
|
+
export default appContent;
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
Biên dịch và chèn HTML:
|
|
449
|
+
|
|
450
|
+
```typescript fileName="src/main.ts" codeFormat="typescript"
|
|
451
|
+
import {
|
|
452
|
+
compileMarkdown,
|
|
453
|
+
installIntlayerMarkdown,
|
|
454
|
+
useIntlayer,
|
|
455
|
+
} from "vanilla-intlayer";
|
|
456
|
+
|
|
457
|
+
installIntlayerMarkdown();
|
|
458
|
+
|
|
459
|
+
const content = useIntlayer("app").onChange((newContent) => {
|
|
460
|
+
const el = document.querySelector<HTMLDivElement>(".edit-note")!;
|
|
461
|
+
el.innerHTML = compileMarkdown(String(newContent.editNote));
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
document.querySelector<HTMLDivElement>(".edit-note")!.innerHTML =
|
|
465
|
+
compileMarkdown(String(content.editNote));
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
> [!TIP]
|
|
469
|
+
> `String(content.editNote)` gọi `toString()` trên `IntlayerNode` để trả về chuỗi Markdown thô. Truyền nó vào `compileMarkdown` để lấy chuỗi HTML, sau đó thiết lập qua `innerHTML`.
|
|
470
|
+
|
|
471
|
+
> [!WARNING]
|
|
472
|
+
> Chỉ sử dụng `innerHTML` với nội dung tin cậy. Nếu markdown đến từ đầu vào của người dùng, hãy lọc sạch nó trước (ví dụ với DOMPurify). Bạn có thể cài đặt trình render lọc sạch một cách linh hoạt:
|
|
473
|
+
>
|
|
474
|
+
> ```typescript
|
|
475
|
+
> import { installIntlayerMarkdownDynamic } from "vanilla-intlayer";
|
|
476
|
+
>
|
|
477
|
+
> await installIntlayerMarkdownDynamic(async () => {
|
|
478
|
+
> const DOMPurify = await import("dompurify");
|
|
479
|
+
> return (markdown) => DOMPurify.sanitize(compileMarkdown(markdown));
|
|
480
|
+
> });
|
|
481
|
+
> ```
|
|
482
|
+
|
|
483
|
+
### (Tùy chọn) Bước 9: Thêm Localized Routing vào ứng dụng của bạn
|
|
484
|
+
|
|
485
|
+
Để tạo các route duy nhất cho mỗi ngôn ngữ (hữu ích cho SEO), bạn có thể sử dụng `intlayerProxy` trong cấu hình Vite của mình để phát hiện ngôn ngữ ở phía server.
|
|
486
|
+
|
|
487
|
+
Đầu tiên, thêm `intlayerProxy` vào cấu hình Vite của bạn:
|
|
488
|
+
|
|
489
|
+
> Lưu ý rằng để sử dụng `intlayerProxy` trong môi trường production, bạn cần chuyển `vite-intlayer` từ `devDependencies` sang `dependencies`.
|
|
490
|
+
|
|
491
|
+
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
492
|
+
import { defineConfig } from "vite";
|
|
493
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
494
|
+
|
|
495
|
+
export default defineConfig({
|
|
496
|
+
plugins: [
|
|
497
|
+
intlayerProxy(), // nên đặt đầu tiên
|
|
498
|
+
intlayer(),
|
|
499
|
+
],
|
|
500
|
+
});
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
|
|
504
|
+
import { defineConfig } from "vite";
|
|
505
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
506
|
+
|
|
507
|
+
export default defineConfig({
|
|
508
|
+
plugins: [
|
|
509
|
+
intlayerProxy(), // nên đặt đầu tiên
|
|
510
|
+
intlayer(),
|
|
511
|
+
],
|
|
512
|
+
});
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
|
|
516
|
+
const { defineConfig } = require("vite");
|
|
517
|
+
const { intlayer, intlayerProxy } = require("vite-intlayer");
|
|
518
|
+
|
|
519
|
+
module.exports = defineConfig({
|
|
520
|
+
plugins: [
|
|
521
|
+
intlayerProxy(), // nên đặt đầu tiên
|
|
522
|
+
intlayer(),
|
|
523
|
+
],
|
|
524
|
+
});
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
### (Tùy chọn) Bước 10: Thay đổi URL khi ngôn ngữ thay đổi
|
|
528
|
+
|
|
529
|
+
Để cập nhật URL trình duyệt khi ngôn ngữ thay đổi, hãy gọi `useRewriteURL()` sau khi cài đặt Intlayer:
|
|
530
|
+
|
|
531
|
+
```typescript fileName="src/main.ts" codeFormat="typescript"
|
|
532
|
+
import { installIntlayer, useRewriteURL } from "vanilla-intlayer";
|
|
533
|
+
|
|
534
|
+
installIntlayer();
|
|
535
|
+
|
|
536
|
+
// Viết lại URL ngay lập tức và mỗi khi ngôn ngữ thay đổi sau đó.
|
|
537
|
+
// Trả về một hàm hủy đăng ký để dọn dẹp.
|
|
538
|
+
const stopRewriteURL = useRewriteURL();
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
### (Tùy chọn) Bước 11: Chuyển đổi thuộc tính Language và Direction của HTML
|
|
542
|
+
|
|
543
|
+
Cập nhật các thuộc tính `lang` và `dir` của thẻ `<html>` để khớp với ngôn ngữ hiện tại nhằm hỗ trợ truy cập và SEO.
|
|
544
|
+
|
|
545
|
+
```typescript fileName="src/main.ts" codeFormat="typescript"
|
|
546
|
+
import { getHTMLTextDir } from "intlayer";
|
|
547
|
+
import { installIntlayer, useLocale } from "vanilla-intlayer";
|
|
548
|
+
|
|
549
|
+
installIntlayer();
|
|
550
|
+
|
|
551
|
+
useLocale({
|
|
552
|
+
onLocaleChange: (locale) => {
|
|
553
|
+
document.documentElement.lang = locale;
|
|
554
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
555
|
+
},
|
|
556
|
+
});
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### (Tùy chọn) Bước 12: Lazy-load từ điển theo ngôn ngữ
|
|
560
|
+
|
|
561
|
+
Đối với các ứng dụng lớn, bạn có thể muốn chia từ điển của mỗi ngôn ngữ thành một phần (chunk) riêng. Sử dụng `useDictionaryDynamic` cùng với `import()` động của Vite:
|
|
562
|
+
|
|
563
|
+
```typescript fileName="src/app.ts" codeFormat="typescript"
|
|
564
|
+
import { installIntlayer, useDictionaryDynamic } from "vanilla-intlayer";
|
|
565
|
+
|
|
566
|
+
installIntlayer();
|
|
567
|
+
|
|
568
|
+
const unsubscribe = useDictionaryDynamic(
|
|
569
|
+
{
|
|
570
|
+
en: () => import("../.intlayer/dictionaries/en/app.mjs"),
|
|
571
|
+
fr: () => import("../.intlayer/dictionaries/fr/app.mjs"),
|
|
572
|
+
es: () => import("../.intlayer/dictionaries/es/app.mjs"),
|
|
573
|
+
},
|
|
574
|
+
"app"
|
|
575
|
+
).onChange((content) => {
|
|
576
|
+
document.querySelector("h1")!.textContent = String(content.title);
|
|
577
|
+
});
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
> Mỗi bundle ngôn ngữ chỉ được tải khi ngôn ngữ đó được kích hoạt và kết quả được lưu vào cache — các lần chuyển đổi sau đó sang cùng một ngôn ngữ sẽ diễn ra tức thì.
|
|
581
|
+
|
|
582
|
+
### (Tùy chọn) Bước 13: Trích xuất nội dung từ các thành phần của bạn
|
|
583
|
+
|
|
584
|
+
Nếu bạn có một codebase hiện có, việc chuyển đổi hàng ngàn tệp có thể tốn thời gian.
|
|
585
|
+
|
|
586
|
+
Để giảm bớt quá trình này, Intlayer đề xuất một [trình biên dịch](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/compiler.md) / [trình trích xuất](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/cli/extract.md) để chuyển đổi các thành phần và trích xuất nội dung.
|
|
587
|
+
|
|
588
|
+
Để thiết lập, bạn có thể thêm một phần `compiler` trong tệp `intlayer.config.ts` của mình:
|
|
589
|
+
|
|
590
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
591
|
+
import { type IntlayerConfig } from "intlayer";
|
|
592
|
+
|
|
593
|
+
const config: IntlayerConfig = {
|
|
594
|
+
// ... Cấu hình còn lại của bạn
|
|
595
|
+
compiler: {
|
|
596
|
+
/**
|
|
597
|
+
* Chỉ định xem trình biên dịch có nên được bật hay không.
|
|
598
|
+
*/
|
|
599
|
+
enabled: true,
|
|
600
|
+
|
|
601
|
+
/**
|
|
602
|
+
* Định nghĩa đường dẫn các tệp đầu ra
|
|
603
|
+
*/
|
|
604
|
+
output: ({ fileName, extension }) => `./${fileName}${extension}`,
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Chỉ định xem các thành phần có nên được lưu lại sau khi được chuyển đổi hay không.
|
|
608
|
+
* Bằng cách đó, trình biên dịch có thể chỉ chạy một lần để chuyển đổi ứng dụng, và sau đó nó có thể được gỡ bỏ.
|
|
609
|
+
*/
|
|
610
|
+
saveComponents: false,
|
|
611
|
+
|
|
612
|
+
/**
|
|
613
|
+
* Tiền tố phím từ điển
|
|
614
|
+
*/
|
|
615
|
+
dictionaryKeyPrefix: "",
|
|
616
|
+
},
|
|
617
|
+
};
|
|
618
|
+
|
|
619
|
+
export default config;
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
<Tabs>
|
|
623
|
+
<Tab value='Lệnh Extract'>
|
|
624
|
+
|
|
625
|
+
Chạy trình trích xuất để chuyển đổi các thành phần và trích xuất nội dung
|
|
626
|
+
|
|
627
|
+
```bash packageManager="npm"
|
|
628
|
+
npx intlayer extract
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
```bash packageManager="pnpm"
|
|
632
|
+
pnpm intlayer extract
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
```bash packageManager="yarn"
|
|
636
|
+
yarn intlayer extract
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
```bash packageManager="bun"
|
|
640
|
+
bunx intlayer extract
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
</Tab>
|
|
644
|
+
<Tab value='Trình biên dịch Babel'>
|
|
645
|
+
|
|
646
|
+
Cập nhật `vite.config.ts` của bạn để bao gồm plugin `intlayerCompiler`:
|
|
647
|
+
|
|
648
|
+
```ts fileName="vite.config.ts"
|
|
649
|
+
import { defineConfig } from "vite";
|
|
650
|
+
import { intlayer, intlayerCompiler } from "vite-intlayer";
|
|
651
|
+
|
|
652
|
+
export default defineConfig({
|
|
653
|
+
plugins: [
|
|
654
|
+
intlayer(),
|
|
655
|
+
intlayerCompiler(), // Thêm plugin trình biên dịch
|
|
656
|
+
],
|
|
657
|
+
});
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
```bash packageManager="npm"
|
|
661
|
+
npm run build # Hoặc npm run dev
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
```bash packageManager="pnpm"
|
|
665
|
+
pnpm run build # Hoặc pnpm run dev
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
```bash packageManager="yarn"
|
|
669
|
+
yarn build # Hoặc yarn dev
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
```bash packageManager="bun"
|
|
673
|
+
bun run build # Hoặc bun run dev
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
</Tab>
|
|
677
|
+
</Tabs>
|
|
678
|
+
|
|
679
|
+
### Cấu hình TypeScript
|
|
680
|
+
|
|
681
|
+
Đảm bảo cấu hình TypeScript của bạn bao gồm các kiểu dữ liệu được tạo tự động.
|
|
682
|
+
|
|
683
|
+
```json5 fileName="tsconfig.json"
|
|
684
|
+
{
|
|
685
|
+
"compilerOptions": {
|
|
686
|
+
// ...
|
|
687
|
+
},
|
|
688
|
+
"include": ["src", ".intlayer/**/*.ts"],
|
|
689
|
+
}
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
### Cấu hình Git
|
|
693
|
+
|
|
694
|
+
Khuyên dùng việc bỏ qua các tệp được tạo bởi Intlayer. Điều này cho phép bạn tránh việc commit chúng vào kho lưu trữ Git của mình.
|
|
695
|
+
|
|
696
|
+
Để làm điều này, bạn có thể thêm các chỉ dẫn sau vào tệp `.gitignore` của mình:
|
|
697
|
+
|
|
698
|
+
```bash
|
|
699
|
+
# Bỏ qua các tệp được tạo bởi Intlayer
|
|
700
|
+
.intlayer
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
### Extension VS Code
|
|
704
|
+
|
|
705
|
+
Để cải thiện trải nghiệm phát triển của bạn với Intlayer, bạn có thể cài đặt **Extension Intlayer VS Code** chính thức.
|
|
706
|
+
|
|
707
|
+
[Cài đặt từ VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
708
|
+
|
|
709
|
+
Extension này cung cấp:
|
|
710
|
+
|
|
711
|
+
- **Tự động hoàn thành** cho các khóa bản dịch.
|
|
712
|
+
- **Phát hiện lỗi theo thời gian thực** cho các bản dịch bị thiếu.
|
|
713
|
+
- **Xem trước nội dung đã dịch** trực tiếp.
|
|
714
|
+
- **Quick actions** để dễ dàng tạo và cập nhật các bản dịch.
|
|
715
|
+
|
|
716
|
+
Để biết thêm chi tiết về cách sử dụng extension, hãy tham khảo [tài liệu Extension Intlayer VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
717
|
+
|
|
718
|
+
---
|
|
719
|
+
|
|
720
|
+
### Đi xa hơn
|
|
721
|
+
|
|
722
|
+
Để tìm hiểu sâu hơn, bạn có thể triển khai [trình soạn thảo trực quan](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_visual_editor.md) hoặc bên ngoài hóa nội dung của bạn bằng [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_CMS.md).
|