@intlayer/docs 9.1.3 → 9.3.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/blog/ar/index.md +1 -1
- package/blog/ar/rag_powered_documentation_assistant.md +7 -0
- package/blog/de/index.md +1 -1
- package/blog/de/rag_powered_documentation_assistant.md +6 -0
- package/blog/en/index.md +1 -1
- package/blog/en-GB/index.md +1 -1
- package/blog/en-GB/rag_powered_documentation_assistant.md +6 -0
- package/blog/es/index.md +1 -1
- package/blog/es/rag_powered_documentation_assistant.md +7 -0
- package/blog/fr/i18n_meaning.md +7 -1
- package/blog/fr/index.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/angular.md +5 -1
- package/blog/fr/rag_powered_documentation_assistant.md +6 -0
- package/blog/hi/index.md +1 -1
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +119 -42
- package/blog/hi/rag_powered_documentation_assistant.md +7 -0
- package/blog/id/index.md +1 -1
- package/blog/id/rag_powered_documentation_assistant.md +6 -0
- package/blog/it/index.md +1 -1
- package/blog/it/rag_powered_documentation_assistant.md +6 -0
- package/blog/ja/index.md +1 -1
- package/blog/ja/rag_powered_documentation_assistant.md +7 -0
- package/blog/ko/index.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/react.md +7 -7
- package/blog/ko/rag_powered_documentation_assistant.md +6 -0
- package/blog/pl/index.md +1 -1
- package/blog/pl/rag_powered_documentation_assistant.md +6 -0
- package/blog/pt/index.md +1 -1
- package/blog/pt/rag_powered_documentation_assistant.md +6 -0
- package/blog/ru/index.md +1 -1
- package/blog/ru/rag_powered_documentation_assistant.md +7 -0
- package/blog/tr/intlayer_with_react-intl.md +3 -1
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +175 -42
- package/blog/tr/rag_powered_documentation_assistant.md +6 -0
- package/blog/uk/index.md +1 -1
- package/blog/uk/rag_powered_documentation_assistant.md +6 -0
- package/blog/vi/index.md +1 -1
- package/blog/vi/rag_powered_documentation_assistant.md +6 -0
- package/blog/zh/index.md +1 -1
- package/blog/zh/intlayer_with_i18next.md +87 -28
- package/blog/zh/intlayer_with_next-i18next.md +86 -29
- package/blog/zh/intlayer_with_next-intl.md +88 -28
- package/blog/zh/intlayer_with_react-i18next.md +87 -28
- package/blog/zh/intlayer_with_react-intl.md +88 -27
- package/blog/zh/intlayer_with_vue-i18n.md +117 -8
- package/blog/zh/rag_powered_documentation_assistant.md +6 -0
- package/dist/cjs/common.cjs +24 -1
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +58 -31
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +265 -218
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +48 -21
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +33 -6
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/common.mjs +24 -1
- package/dist/esm/common.mjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +58 -31
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +265 -218
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +48 -21
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +33 -6
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/docs/ar/analytics.md +222 -0
- package/docs/ar/autoFill.md +28 -9
- package/docs/ar/bundle_optimization.md +58 -25
- package/docs/ar/configuration.md +25 -8
- package/docs/ar/dictionary/file.md +3 -1
- package/docs/ar/dictionary/nesting.md +47 -30
- package/docs/ar/formatters.md +148 -193
- package/docs/ar/intlayer_CMS.md +152 -0
- package/docs/ar/intlayer_with_angular_21.md +9 -9
- package/docs/ar/intlayer_with_nextjs_14.md +1 -28
- package/docs/ar/intlayer_with_nextjs_15.md +1 -33
- package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +40 -83
- package/docs/ar/intlayer_with_solid_start.md +1078 -0
- package/docs/ar/intlayer_with_vite+vue.md +1 -3
- package/docs/ar/live-sync.md +4 -0
- package/docs/ar/packages/intlayer/getLocalizedUrl.md +26 -24
- package/docs/ar/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/ar/packages/react-intlayer/useDictionary.md +4 -21
- package/docs/ar/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/ar/packages/vite-intlayer/exports.md +15 -0
- package/docs/ar/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/ar/packages/vite-intlayer/intlayerPrune.md +70 -3
- package/docs/ar/releases/v9.md +0 -37
- package/docs/ar/self_hosting.md +46 -49
- package/docs/bn/bundle_optimization.md +58 -25
- package/docs/bn/configuration.md +25 -8
- package/docs/bn/intlayer_with_angular_21.md +9 -9
- package/docs/cs/bundle_optimization.md +58 -25
- package/docs/cs/configuration.md +25 -8
- package/docs/cs/intlayer_with_angular_21.md +9 -9
- package/docs/de/analytics.md +222 -0
- package/docs/de/autoFill.md +28 -9
- package/docs/de/bundle_optimization.md +58 -25
- package/docs/de/configuration.md +25 -8
- package/docs/de/dictionary/file.md +3 -1
- package/docs/de/dictionary/nesting.md +47 -31
- package/docs/de/formatters.md +208 -334
- package/docs/de/intlayer_CMS.md +66 -15
- package/docs/de/intlayer_with_angular_21.md +9 -9
- package/docs/de/intlayer_with_nestjs.md +11 -7
- package/docs/de/intlayer_with_nextjs_14.md +1 -28
- package/docs/de/intlayer_with_nextjs_15.md +1 -33
- package/docs/de/intlayer_with_solid_start.md +1078 -0
- package/docs/de/intlayer_with_vite+vue.md +1 -3
- package/docs/de/live-sync.md +4 -0
- package/docs/de/packages/intlayer/getLocalizedUrl.md +33 -25
- package/docs/de/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/de/packages/react-intlayer/useDictionary.md +2 -5
- package/docs/de/packages/vite-intlayer/exports.md +15 -0
- package/docs/de/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/de/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/de/releases/v9.md +0 -15
- package/docs/de/self_hosting.md +46 -50
- package/docs/en/bundle_optimization.md +51 -23
- package/docs/en/cli/doc-review.md +13 -2
- package/docs/en/configuration.md +24 -15
- package/docs/en/intlayer_with_angular_21.md +9 -9
- package/docs/en/intlayer_with_solid_start.md +1091 -0
- package/docs/en/intlayer_with_vite+solid.md +12 -0
- package/docs/en/live-sync.md +4 -0
- package/docs/en-GB/analytics.md +222 -0
- package/docs/en-GB/autoFill.md +26 -7
- package/docs/en-GB/bundle_optimization.md +58 -25
- package/docs/en-GB/configuration.md +25 -8
- package/docs/en-GB/dictionary/file.md +2 -0
- package/docs/en-GB/dictionary/nesting.md +64 -205
- package/docs/en-GB/formatters.md +146 -181
- package/docs/en-GB/intlayer_CMS.md +152 -0
- package/docs/en-GB/intlayer_with_angular_21.md +9 -9
- package/docs/en-GB/intlayer_with_nestjs.md +6 -2
- package/docs/en-GB/intlayer_with_nextjs_14.md +0 -27
- package/docs/en-GB/intlayer_with_nextjs_15.md +1 -33
- package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +40 -82
- package/docs/en-GB/intlayer_with_solid_start.md +1078 -0
- package/docs/en-GB/intlayer_with_vite+vue.md +1 -3
- package/docs/en-GB/live-sync.md +4 -0
- package/docs/en-GB/packages/intlayer/getLocalizedUrl.md +30 -22
- package/docs/en-GB/packages/intlayer/getMultilingualUrls.md +16 -48
- package/docs/en-GB/packages/vite-intlayer/exports.md +15 -0
- package/docs/en-GB/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/en-GB/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/en-GB/self_hosting.md +60 -49
- package/docs/es/analytics.md +222 -0
- package/docs/es/autoFill.md +28 -9
- package/docs/es/bundle_optimization.md +58 -25
- package/docs/es/configuration.md +24 -7
- package/docs/es/dictionary/file.md +3 -1
- package/docs/es/dictionary/nesting.md +47 -30
- package/docs/es/formatters.md +114 -168
- package/docs/es/intlayer_CMS.md +35 -10
- package/docs/es/intlayer_with_angular_21.md +9 -9
- package/docs/es/intlayer_with_nextjs_14.md +1 -28
- package/docs/es/intlayer_with_nextjs_15.md +1 -33
- package/docs/es/intlayer_with_solid_start.md +1078 -0
- package/docs/es/live-sync.md +4 -0
- package/docs/es/packages/intlayer/getLocalizedUrl.md +31 -23
- package/docs/es/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/es/packages/vite-intlayer/exports.md +15 -0
- package/docs/es/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/es/packages/vite-intlayer/intlayerPrune.md +69 -2
- package/docs/es/releases/v9.md +0 -15
- package/docs/es/self_hosting.md +46 -49
- package/docs/fr/analytics.md +222 -0
- package/docs/fr/autoFill.md +27 -8
- package/docs/fr/bundle_optimization.md +58 -25
- package/docs/fr/configuration.md +25 -8
- package/docs/fr/dictionary/file.md +2 -0
- package/docs/fr/dictionary/nesting.md +37 -184
- package/docs/fr/formatters.md +95 -236
- package/docs/fr/intlayer_CMS.md +66 -15
- package/docs/fr/intlayer_with_angular_21.md +9 -9
- package/docs/fr/intlayer_with_nextjs_14.md +1 -28
- package/docs/fr/intlayer_with_nextjs_15.md +1 -33
- package/docs/fr/intlayer_with_solid_start.md +1078 -0
- package/docs/fr/live-sync.md +4 -0
- package/docs/fr/packages/intlayer/getLocalizedUrl.md +37 -27
- package/docs/fr/packages/intlayer/getMultilingualUrls.md +18 -20
- package/docs/fr/packages/vite-intlayer/exports.md +15 -0
- package/docs/fr/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/fr/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/fr/releases/v9.md +0 -15
- package/docs/fr/self_hosting.md +46 -49
- package/docs/hi/analytics.md +222 -0
- package/docs/hi/autoFill.md +28 -9
- package/docs/hi/bundle_optimization.md +58 -25
- package/docs/hi/configuration.md +25 -8
- package/docs/hi/dictionary/file.md +3 -1
- package/docs/hi/dictionary/nesting.md +47 -30
- package/docs/hi/formatters.md +233 -334
- package/docs/hi/how_works_intlayer.md +3 -1
- package/docs/hi/intlayer_CMS.md +152 -0
- package/docs/hi/intlayer_with_angular_21.md +9 -9
- package/docs/hi/intlayer_with_nestjs.md +11 -7
- package/docs/hi/intlayer_with_nextjs_14.md +1 -28
- package/docs/hi/intlayer_with_nextjs_15.md +1 -33
- package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +40 -83
- package/docs/hi/intlayer_with_solid_start.md +1077 -0
- package/docs/hi/intlayer_with_vite+preact.md +56 -49
- package/docs/hi/intlayer_with_vite+react.md +48 -41
- package/docs/hi/intlayer_with_vite+solid.md +32 -41
- package/docs/hi/intlayer_with_vite+vue.md +49 -44
- package/docs/hi/live-sync.md +4 -0
- package/docs/hi/packages/intlayer/getLocalizedUrl.md +26 -24
- package/docs/hi/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/hi/packages/next-intlayer/t.md +33 -1
- package/docs/hi/packages/react-intlayer/useDictionary.md +4 -21
- package/docs/hi/packages/vite-intlayer/exports.md +15 -0
- package/docs/hi/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/hi/packages/vite-intlayer/intlayerPrune.md +78 -5
- package/docs/hi/plugins/sync-json.md +9 -9
- package/docs/hi/releases/v9.md +0 -15
- package/docs/hi/self_hosting.md +38 -51
- package/docs/id/analytics.md +223 -0
- package/docs/id/bundle_optimization.md +58 -25
- package/docs/id/configuration.md +25 -8
- package/docs/id/dictionary/nesting.md +37 -184
- package/docs/id/formatters.md +208 -305
- package/docs/id/intlayer_CMS.md +164 -0
- package/docs/id/intlayer_with_angular_21.md +9 -9
- package/docs/id/intlayer_with_nextjs_14.md +1 -26
- package/docs/id/intlayer_with_react_router_v7_fs_routes.md +70 -63
- package/docs/id/intlayer_with_solid_start.md +1078 -0
- package/docs/id/live-sync.md +4 -0
- package/docs/id/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/id/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/id/packages/vite-intlayer/exports.md +15 -0
- package/docs/id/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/id/packages/vite-intlayer/intlayerPrune.md +78 -5
- package/docs/id/releases/v9.md +12 -0
- package/docs/id/self_hosting.md +61 -50
- package/docs/it/analytics.md +222 -0
- package/docs/it/autoFill.md +27 -8
- package/docs/it/bundle_optimization.md +58 -25
- package/docs/it/configuration.md +25 -8
- package/docs/it/dictionary/file.md +3 -1
- package/docs/it/dictionary/nesting.md +47 -30
- package/docs/it/formatters.md +114 -168
- package/docs/it/intlayer_CMS.md +66 -15
- package/docs/it/intlayer_with_angular_21.md +9 -9
- package/docs/it/intlayer_with_nestjs.md +11 -7
- package/docs/it/intlayer_with_nextjs_14.md +1 -28
- package/docs/it/intlayer_with_nextjs_15.md +1 -33
- package/docs/it/intlayer_with_solid_start.md +1078 -0
- package/docs/it/intlayer_with_vite+vue.md +1 -3
- package/docs/it/live-sync.md +4 -0
- package/docs/it/packages/intlayer/getLocalizedUrl.md +34 -26
- package/docs/it/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/it/packages/react-intlayer/useDictionary.md +4 -21
- package/docs/it/packages/vite-intlayer/exports.md +15 -0
- package/docs/it/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/it/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/it/releases/v9.md +0 -15
- package/docs/it/self_hosting.md +60 -49
- package/docs/ja/analytics.md +222 -0
- package/docs/ja/autoFill.md +28 -9
- package/docs/ja/bundle_optimization.md +58 -25
- package/docs/ja/configuration.md +25 -8
- package/docs/ja/dictionary/content_file.md +15 -7
- package/docs/ja/dictionary/file.md +3 -1
- package/docs/ja/dictionary/nesting.md +47 -30
- package/docs/ja/formatters.md +133 -187
- package/docs/ja/intlayer_visual_editor.md +3 -1
- package/docs/ja/intlayer_with_angular_21.md +6 -6
- package/docs/ja/intlayer_with_nestjs.md +2 -12
- package/docs/ja/intlayer_with_nextjs_14.md +1 -28
- package/docs/ja/intlayer_with_nextjs_15.md +1 -33
- package/docs/ja/intlayer_with_react_router_v7.md +456 -20
- package/docs/ja/intlayer_with_solid_start.md +1078 -0
- package/docs/ja/intlayer_with_vite+preact.md +73 -41
- package/docs/ja/intlayer_with_vite+vue.md +1 -3
- package/docs/ja/live-sync.md +4 -0
- package/docs/ja/mcp_server.md +3 -9
- package/docs/ja/packages/intlayer/getLocalizedUrl.md +26 -24
- package/docs/ja/packages/intlayer/getMultilingualUrls.md +3 -17
- package/docs/ja/packages/vite-intlayer/exports.md +15 -0
- package/docs/ja/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/ja/packages/vite-intlayer/intlayerPrune.md +79 -6
- package/docs/ja/releases/v9.md +12 -0
- package/docs/ja/self_hosting.md +46 -50
- package/docs/ko/analytics.md +222 -0
- package/docs/ko/autoFill.md +28 -9
- package/docs/ko/bundle_optimization.md +58 -25
- package/docs/ko/configuration.md +25 -8
- package/docs/ko/dictionary/file.md +3 -1
- package/docs/ko/dictionary/nesting.md +47 -30
- package/docs/ko/formatters.md +133 -187
- package/docs/ko/intlayer_with_angular_21.md +9 -9
- package/docs/ko/intlayer_with_lynx+react.md +133 -39
- package/docs/ko/intlayer_with_nextjs_14.md +1 -28
- package/docs/ko/intlayer_with_nextjs_15.md +1 -33
- package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +40 -188
- package/docs/ko/intlayer_with_solid_start.md +1078 -0
- package/docs/ko/intlayer_with_vite+preact.md +57 -23
- package/docs/ko/intlayer_with_vite+vue.md +1 -3
- package/docs/ko/live-sync.md +4 -0
- package/docs/ko/packages/intlayer/getLocalizedUrl.md +26 -24
- package/docs/ko/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/ko/packages/vite-intlayer/exports.md +15 -0
- package/docs/ko/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/ko/packages/vite-intlayer/intlayerPrune.md +79 -6
- package/docs/ko/releases/v9.md +12 -0
- package/docs/ko/self_hosting.md +60 -49
- package/docs/nl/bundle_optimization.md +58 -25
- package/docs/nl/configuration.md +25 -8
- package/docs/nl/intlayer_with_angular_21.md +9 -9
- package/docs/pl/analytics.md +220 -0
- package/docs/pl/bundle_optimization.md +58 -25
- package/docs/pl/configuration.md +25 -8
- package/docs/pl/dictionary/nesting.md +47 -30
- package/docs/pl/formatters.md +208 -305
- package/docs/pl/intlayer_CMS.md +152 -0
- package/docs/pl/intlayer_with_angular_21.md +9 -9
- package/docs/pl/intlayer_with_nextjs_14.md +1 -26
- package/docs/pl/intlayer_with_solid_start.md +1078 -0
- package/docs/pl/live-sync.md +4 -0
- package/docs/pl/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/pl/packages/react-intlayer/useDictionary.md +2 -19
- package/docs/pl/packages/vite-intlayer/exports.md +15 -0
- package/docs/pl/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/pl/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/pl/releases/v9.md +0 -15
- package/docs/pl/self_hosting.md +60 -49
- package/docs/pt/analytics.md +222 -0
- package/docs/pt/bundle_optimization.md +58 -24
- package/docs/pt/configuration.md +25 -8
- package/docs/pt/dictionary/file.md +3 -1
- package/docs/pt/dictionary/nesting.md +47 -30
- package/docs/pt/formatters.md +112 -168
- package/docs/pt/intlayer_CMS.md +66 -15
- package/docs/pt/intlayer_with_angular_21.md +9 -9
- package/docs/pt/intlayer_with_astro_lit.md +26 -1
- package/docs/pt/intlayer_with_nextjs_14.md +1 -28
- package/docs/pt/intlayer_with_nextjs_15.md +1 -33
- package/docs/pt/intlayer_with_solid_start.md +1078 -0
- package/docs/pt/intlayer_with_vite+vue.md +1 -3
- package/docs/pt/live-sync.md +4 -0
- package/docs/pt/packages/intlayer/getLocalizedUrl.md +34 -26
- package/docs/pt/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/pt/packages/vite-intlayer/exports.md +15 -0
- package/docs/pt/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/pt/packages/vite-intlayer/intlayerPrune.md +78 -6
- package/docs/pt/releases/v9.md +0 -15
- package/docs/pt/self_hosting.md +60 -49
- package/docs/ru/analytics.md +222 -0
- package/docs/ru/autoFill.md +27 -8
- package/docs/ru/bundle_optimization.md +58 -25
- package/docs/ru/configuration.md +25 -8
- package/docs/ru/dictionary/file.md +3 -1
- package/docs/ru/dictionary/nesting.md +64 -205
- package/docs/ru/formatters.md +108 -128
- package/docs/ru/intlayer_with_angular_21.md +9 -9
- package/docs/ru/intlayer_with_nextjs_14.md +1 -28
- package/docs/ru/intlayer_with_nextjs_15.md +1 -33
- package/docs/ru/intlayer_with_solid_start.md +1078 -0
- package/docs/ru/intlayer_with_vite+vue.md +1 -3
- package/docs/ru/live-sync.md +4 -0
- package/docs/ru/packages/intlayer/getLocalizedUrl.md +34 -26
- package/docs/ru/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/ru/packages/react-intlayer/useDictionary.md +4 -21
- package/docs/ru/packages/vite-intlayer/exports.md +15 -0
- package/docs/ru/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/ru/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/ru/releases/v9.md +0 -15
- package/docs/ru/self_hosting.md +60 -49
- package/docs/tr/analytics.md +222 -0
- package/docs/tr/autoFill.md +28 -9
- package/docs/tr/bundle_optimization.md +58 -25
- package/docs/tr/configuration.md +25 -8
- package/docs/tr/dictionary/file.md +2 -0
- package/docs/tr/dictionary/nesting.md +47 -30
- package/docs/tr/formatters.md +144 -190
- package/docs/tr/intlayer_CMS.md +152 -0
- package/docs/tr/intlayer_with_angular_21.md +9 -9
- package/docs/tr/intlayer_with_nestjs.md +2 -12
- package/docs/tr/intlayer_with_nextjs_15.md +1 -33
- package/docs/tr/intlayer_with_solid_start.md +1078 -0
- package/docs/tr/intlayer_with_vite+vue.md +1 -3
- package/docs/tr/live-sync.md +4 -0
- package/docs/tr/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/tr/packages/vite-intlayer/exports.md +15 -0
- package/docs/tr/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/tr/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/tr/self_hosting.md +47 -50
- package/docs/uk/analytics.md +222 -0
- package/docs/uk/bundle_optimization.md +58 -25
- package/docs/uk/configuration.md +25 -8
- package/docs/uk/dictionary/nesting.md +47 -30
- package/docs/uk/formatters.md +128 -185
- package/docs/uk/intlayer_CMS.md +152 -0
- package/docs/uk/intlayer_with_angular_21.md +9 -9
- package/docs/uk/intlayer_with_nextjs_14.md +1 -26
- package/docs/uk/intlayer_with_solid_start.md +1078 -0
- package/docs/uk/live-sync.md +4 -0
- package/docs/uk/packages/react-intlayer/useDictionary.md +2 -19
- package/docs/uk/packages/vite-intlayer/exports.md +15 -0
- package/docs/uk/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/uk/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/uk/releases/v9.md +0 -15
- package/docs/uk/self_hosting.md +60 -50
- package/docs/ur/bundle_optimization.md +58 -25
- package/docs/ur/configuration.md +25 -8
- package/docs/ur/intlayer_with_angular_21.md +9 -9
- package/docs/vi/analytics.md +222 -0
- package/docs/vi/bundle_optimization.md +58 -25
- package/docs/vi/configuration.md +24 -8
- package/docs/vi/dictionary/nesting.md +37 -184
- package/docs/vi/formatters.md +208 -309
- package/docs/vi/intlayer_CMS.md +164 -0
- package/docs/vi/intlayer_with_angular_21.md +9 -9
- package/docs/vi/intlayer_with_nextjs_14.md +0 -25
- package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +70 -63
- package/docs/vi/intlayer_with_solid_start.md +1078 -0
- package/docs/vi/live-sync.md +4 -0
- package/docs/vi/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/vi/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/vi/packages/vite-intlayer/exports.md +15 -0
- package/docs/vi/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/vi/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/vi/plugins/sync-json.md +6 -6
- package/docs/vi/releases/v9.md +12 -0
- package/docs/vi/self_hosting.md +61 -50
- package/docs/zh/CI_CD.md +4 -0
- package/docs/zh/analytics.md +222 -0
- package/docs/zh/autoFill.md +28 -9
- package/docs/zh/bundle_optimization.md +58 -25
- package/docs/zh/configuration.md +24 -8
- package/docs/zh/dictionary/file.md +2 -0
- package/docs/zh/dictionary/nesting.md +47 -30
- package/docs/zh/formatters.md +140 -188
- package/docs/zh/intlayer_CMS.md +164 -0
- package/docs/zh/intlayer_with_analog.md +193 -3
- package/docs/zh/intlayer_with_angular_19.md +272 -3
- package/docs/zh/intlayer_with_angular_21.md +7 -7
- package/docs/zh/intlayer_with_create_react_app.md +348 -26
- package/docs/zh/intlayer_with_lynx+react.md +263 -4
- package/docs/zh/intlayer_with_nextjs_14.md +1 -28
- package/docs/zh/intlayer_with_nextjs_15.md +1 -33
- package/docs/zh/intlayer_with_nextjs_no_locale_path.md +558 -1
- package/docs/zh/intlayer_with_nuxt.md +182 -7
- package/docs/zh/intlayer_with_react_router_v7.md +183 -25
- package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +306 -42
- package/docs/zh/intlayer_with_solid_start.md +1077 -0
- package/docs/zh/intlayer_with_storybook.md +260 -3
- package/docs/zh/intlayer_with_svelte_kit.md +428 -48
- package/docs/zh/intlayer_with_tanstack+solid.md +713 -13
- package/docs/zh/intlayer_with_tanstack.md +731 -20
- package/docs/zh/intlayer_with_vanilla.md +314 -4
- package/docs/zh/intlayer_with_vite+lit.md +465 -4
- package/docs/zh/intlayer_with_vite+preact.md +422 -116
- package/docs/zh/intlayer_with_vite+react.md +324 -45
- package/docs/zh/intlayer_with_vite+react_compiler.md +228 -13
- package/docs/zh/intlayer_with_vite+solid.md +462 -32
- package/docs/zh/intlayer_with_vite+vanilla.md +497 -4
- package/docs/zh/live-sync.md +4 -0
- package/docs/zh/mcp_server.md +3 -9
- package/docs/zh/packages/intlayer/getLocalizedUrl.md +26 -24
- package/docs/zh/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/zh/packages/vite-intlayer/exports.md +29 -0
- package/docs/zh/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/zh/packages/vite-intlayer/intlayerPrune.md +79 -6
- package/docs/zh/releases/v9.md +12 -0
- package/docs/zh/self_hosting.md +60 -50
- package/docs/zh-TW/bundle_optimization.md +58 -25
- package/docs/zh-TW/intlayer_with_angular_21.md +7 -7
- package/package.json +7 -7
- package/src/common.ts +39 -2
- package/src/generated/blog.entry.ts +66 -34
- package/src/generated/docs.entry.ts +273 -221
- package/src/generated/frequentQuestions.entry.ts +56 -24
- package/src/generated/legal.entry.ts +41 -9
|
@@ -94,33 +94,192 @@ Intlayer 不仅仅是一个 i18n 解决方案,还提供了一个**自托管的
|
|
|
94
94
|
|
|
95
95
|
---
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
## 在 SvelteKit 应用中设置 Intlayer 的分步指南
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
查看 GitHub 上的[应用模板](https://github.com/aymericzip/intlayer-sveltekit-template)。
|
|
100
|
+
|
|
101
|
+
要开始,创建一个新的 SvelteKit 项目。以下是我们将创建的最终结构:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
.
|
|
105
|
+
├── intlayer.config.ts
|
|
106
|
+
├── package.json
|
|
107
|
+
├── src
|
|
108
|
+
│ ├── app.d.ts
|
|
109
|
+
│ ├── app.html
|
|
110
|
+
│ ├── hooks.server.ts
|
|
111
|
+
│ ├── lib
|
|
112
|
+
│ │ ├── getLocale.ts
|
|
113
|
+
│ │ ├── LocaleSwitcher.svelte
|
|
114
|
+
│ │ └── LocalizedLink.svelte
|
|
115
|
+
│ ├── params
|
|
116
|
+
│ │ └── locale.ts
|
|
117
|
+
│ └── routes
|
|
118
|
+
│ ├── [[locale=locale]]
|
|
119
|
+
│ │ ├── +layout.svelte
|
|
120
|
+
│ │ ├── +layout.ts
|
|
121
|
+
│ │ ├── +page.svelte
|
|
122
|
+
│ │ ├── +page.ts
|
|
123
|
+
│ │ ├── about
|
|
124
|
+
│ │ │ ├── +page.svelte
|
|
125
|
+
│ │ │ ├── +page.ts
|
|
126
|
+
│ │ │ └── page.content.ts
|
|
127
|
+
│ │ ├── Counter.content.ts
|
|
128
|
+
│ │ ├── Counter.svelte
|
|
129
|
+
│ │ ├── Header.content.ts
|
|
130
|
+
│ │ ├── Header.svelte
|
|
131
|
+
│ │ ├── home.content.ts
|
|
132
|
+
│ │ └── layout.content.ts
|
|
133
|
+
│ ├── +layout.svelte
|
|
134
|
+
│ └── layout.css
|
|
135
|
+
├── static
|
|
136
|
+
│ ├── favicon.svg
|
|
137
|
+
│ └── robots.txt
|
|
138
|
+
├── svelte.config.js
|
|
139
|
+
├── tsconfig.json
|
|
140
|
+
└── vite.config.ts
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
<Steps>
|
|
144
|
+
|
|
145
|
+
<Step number={1} title="安装依赖项">
|
|
146
|
+
|
|
147
|
+
使用 npm 安装必要的包:
|
|
148
|
+
|
|
149
|
+
```bash packageManager="npm"
|
|
150
|
+
npx intlayer init --interactive
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
```bash packageManager="pnpm"
|
|
154
|
+
pnpm dlx intlayer@canary init --interactive
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
```bash packageManager="yarn"
|
|
158
|
+
yarn dlx intlayer@canary init --interactive
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
```bash packageManager="bun"
|
|
162
|
+
bunx intlayer@canary init --interactive
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
> `--interactive` 标志是可选的。如果你是 AI 代理,请使用 `intlayer-cli init`。
|
|
166
|
+
|
|
167
|
+
> 此命令将检测你的环境并安装所需的包。例如:
|
|
168
|
+
|
|
169
|
+
```bash packageManager="npm"
|
|
170
|
+
npm install intlayer svelte-intlayer
|
|
171
|
+
npm install vite-intlayer --save-dev
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
```bash packageManager="pnpm"
|
|
175
|
+
pnpm add intlayer svelte-intlayer
|
|
176
|
+
pnpm add vite-intlayer --save-dev
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
```bash packageManager="yarn"
|
|
180
|
+
yarn add intlayer svelte-intlayer
|
|
181
|
+
yarn add vite-intlayer --save-dev
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
```bash packageManager="bun"
|
|
185
|
+
bun add intlayer svelte-intlayer
|
|
186
|
+
bun add vite-intlayer --save-dev
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
- **intlayer**:核心 i18n 包。
|
|
190
|
+
- **svelte-intlayer**:为 Svelte/SvelteKit 提供上下文提供者和 store。
|
|
191
|
+
- **vite-intlayer**:Vite 插件,用于将内容声明与构建过程集成。
|
|
192
|
+
|
|
193
|
+
</Step>
|
|
194
|
+
|
|
195
|
+
<Step number={2} title="配置你的项目">
|
|
196
|
+
|
|
197
|
+
在项目根目录创建一个配置文件:
|
|
198
|
+
|
|
199
|
+
```typescript fileName="intlayer.config.ts"
|
|
200
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
201
|
+
|
|
202
|
+
const config: IntlayerConfig = {
|
|
203
|
+
internationalization: {
|
|
204
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
205
|
+
defaultLocale: Locales.ENGLISH,
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
export default config;
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
</Step>
|
|
213
|
+
|
|
214
|
+
<Step number={3} title="在 Vite 配置中集成 Intlayer">
|
|
215
|
+
|
|
216
|
+
更新你的 `vite.config.ts` 以包含 Intlayer 插件。此插件处理你的内容文件的转译。
|
|
217
|
+
|
|
218
|
+
```typescript fileName="vite.config.ts"
|
|
219
|
+
import { sveltekit } from "@sveltejs/kit/vite";
|
|
220
|
+
import { defineConfig } from "vite";
|
|
221
|
+
import { intlayer } from "vite-intlayer";
|
|
222
|
+
|
|
223
|
+
export default defineConfig({
|
|
224
|
+
plugins: [intlayer(), sveltekit()], // 顺序很重要,Intlayer 应放在 SvelteKit 之前
|
|
225
|
+
});
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
</Step>
|
|
229
|
+
|
|
230
|
+
<Step number={4} title="声明你的内容">
|
|
231
|
+
|
|
232
|
+
在你的 `src` 文件夹的任何地方创建内容声明文件(例如 `src/lib/content` 或在你的组件旁边)。这些文件使用 `t()` 函数为每个语言环境定义应用的可翻译内容。
|
|
233
|
+
|
|
234
|
+
```ts fileName="src/features/hero/hero.content.ts" contentDeclarationFormat=["typescript", "esm", "cjs"]
|
|
235
|
+
import { t, type Dictionary } from "intlayer";
|
|
236
|
+
|
|
237
|
+
const heroContent = {
|
|
238
|
+
key: "hero-section",
|
|
239
|
+
content: {
|
|
240
|
+
title: t({
|
|
241
|
+
zh: "欢迎使用 SvelteKit",
|
|
242
|
+
en: "Welcome to SvelteKit",
|
|
243
|
+
fr: "Bienvenue sur SvelteKit",
|
|
244
|
+
es: "Bienvenido a SvelteKit",
|
|
245
|
+
}),
|
|
246
|
+
},
|
|
247
|
+
} satisfies Dictionary;
|
|
248
|
+
|
|
249
|
+
export default heroContent;
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
</Step>
|
|
253
|
+
|
|
254
|
+
<Step number={5} title="在你的组件中使用 Intlayer">
|
|
255
|
+
|
|
256
|
+
现在你可以在任何 Svelte 组件中使用 `useIntlayer` 函数。它返回一个响应式 store,在语言环境改变时自动更新。该函数将自动遵守当前的语言环境(在 SSR 和客户端导航期间)。
|
|
257
|
+
|
|
258
|
+
> **注意:** `useIntlayer` 返回一个 Svelte store,因此你需要使用 `$` 前缀来访问其响应式值(例如 `$content.title`)。
|
|
100
259
|
|
|
101
260
|
```svelte fileName="src/lib/components/Component.svelte"
|
|
102
261
|
<script lang="ts">
|
|
103
262
|
import { useIntlayer } from "svelte-intlayer";
|
|
104
263
|
|
|
105
|
-
// "hero-section"
|
|
264
|
+
// "hero-section" 对应于第 4 步中定义的 key
|
|
106
265
|
const content = useIntlayer("hero-section");
|
|
107
266
|
</script>
|
|
108
267
|
|
|
109
|
-
<!--
|
|
268
|
+
<!-- 将内容呈现为简单内容 -->
|
|
110
269
|
<h1>{$content.title}</h1>
|
|
111
|
-
<!--
|
|
270
|
+
<!-- 使用编辑器呈现可编辑的内容 -->
|
|
112
271
|
<h1>{@const Title = $content.title}<Title /></h1>
|
|
113
|
-
<!--
|
|
272
|
+
<!-- 将内容呈现为字符串 -->
|
|
114
273
|
<div aria-label={$content.title.value}></div>
|
|
115
274
|
<div aria-label={$content.title.toString()}></div>
|
|
116
275
|
<div aria-label={String($content.title)}></div>
|
|
117
276
|
```
|
|
118
277
|
|
|
119
|
-
|
|
278
|
+
</Step>
|
|
120
279
|
|
|
121
|
-
<Step number={6} title="设置路由">
|
|
280
|
+
<Step number={6} title="设置路由" isOptional={true}>
|
|
122
281
|
|
|
123
|
-
|
|
282
|
+
以下步骤展示如何在 SvelteKit 中设置基于语言环境的路由。这允许你的 URL 包含语言环境前缀(例如 `/en/about`、`/fr/about`),以获得更好的 SEO 和用户体验。
|
|
124
283
|
|
|
125
284
|
```bash
|
|
126
285
|
.
|
|
@@ -128,26 +287,241 @@ Intlayer 不仅仅是一个 i18n 解决方案,还提供了一个**自托管的
|
|
|
128
287
|
├── app.d.ts # 定义语言环境类型
|
|
129
288
|
├── hooks.server.ts # 管理语言环境路由
|
|
130
289
|
├── lib
|
|
131
|
-
│
|
|
290
|
+
│ └── getLocale.ts # 从 header、cookies 检查语言环境
|
|
132
291
|
├── params
|
|
133
|
-
│
|
|
292
|
+
│ └── locale.ts # 定义语言环境参数
|
|
134
293
|
└── routes
|
|
135
|
-
├── [[locale=locale]] #
|
|
136
|
-
│
|
|
137
|
-
│
|
|
138
|
-
│
|
|
139
|
-
│
|
|
140
|
-
│
|
|
141
|
-
│
|
|
142
|
-
│
|
|
143
|
-
└── +layout.svelte #
|
|
294
|
+
├── [[locale=locale]] # 用路由组包装以设置语言环境
|
|
295
|
+
│ ├── +layout.svelte # 路由的本地布局
|
|
296
|
+
│ ├── +layout.ts
|
|
297
|
+
│ ├── +page.svelte
|
|
298
|
+
│ ├── +page.ts
|
|
299
|
+
│ └── about
|
|
300
|
+
│ ├── +page.svelte
|
|
301
|
+
│ └── +page.ts
|
|
302
|
+
└── +layout.svelte # 用于字体和全局样式的根布局
|
|
144
303
|
```
|
|
145
304
|
|
|
146
305
|
</Step>
|
|
147
306
|
|
|
148
|
-
<Step number={
|
|
307
|
+
<Step number={7} title="处理服务器端语言环境检测">
|
|
308
|
+
|
|
309
|
+
在 SvelteKit 中,服务器需要知道用户的语言环境以在 SSR 期间呈现正确的内容。我们使用 `hooks.server.ts` 从 URL 或 cookies 检测语言环境。
|
|
310
|
+
|
|
311
|
+
创建或修改 `src/hooks.server.ts`:
|
|
312
|
+
|
|
313
|
+
```typescript fileName="src/hooks.server.ts"
|
|
314
|
+
import type { Handle } from "@sveltejs/kit";
|
|
315
|
+
import { getLocalizedUrl } from "intlayer";
|
|
316
|
+
import { getLocale } from "$lib/getLocale";
|
|
317
|
+
|
|
318
|
+
export const handle: Handle = async ({ event, resolve }) => {
|
|
319
|
+
const detectedLocale = getLocale(event);
|
|
320
|
+
|
|
321
|
+
// 检查当前路径是否已以语言环境开头(例如 /fr、/en)
|
|
322
|
+
const pathname = event.url.pathname;
|
|
323
|
+
const targetPathname = getLocalizedUrl(pathname, detectedLocale);
|
|
324
|
+
|
|
325
|
+
// 如果 URL 中没有语言环境(例如用户访问 "/"),则重定向他们
|
|
326
|
+
if (targetPathname !== pathname) {
|
|
327
|
+
return new Response(undefined, {
|
|
328
|
+
headers: { Location: targetPathname },
|
|
329
|
+
status: 307, // 临时重定向
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return resolve(event, {
|
|
334
|
+
transformPageChunk: ({ html }) => html.replace("%lang%", detectedLocale),
|
|
335
|
+
});
|
|
336
|
+
};
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
然后,创建一个 helper 来从请求事件获取用户的语言环境:
|
|
340
|
+
|
|
341
|
+
```typescript fileName="src/lib/getLocale.ts"
|
|
342
|
+
import {
|
|
343
|
+
configuration,
|
|
344
|
+
getLocaleFromStorage,
|
|
345
|
+
localeDetector,
|
|
346
|
+
type Locale,
|
|
347
|
+
} from "intlayer";
|
|
348
|
+
import type { RequestEvent } from "@sveltejs/kit";
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* 从请求事件获取用户的语言环境。
|
|
352
|
+
* 此函数在 `src/hooks.server.ts` 中的 `handle` hook 中使用。
|
|
353
|
+
*
|
|
354
|
+
* 它首先尝试从 Intlayer storage(cookies 或自定义 headers)获取语言环境。
|
|
355
|
+
* 如果找不到语言环境,它会回退到浏览器的 "Accept-Language" 协商。
|
|
356
|
+
*
|
|
357
|
+
* @param event - 来自 SvelteKit 的请求事件
|
|
358
|
+
* @returns 用户的语言环境
|
|
359
|
+
*/
|
|
360
|
+
export const getLocale = (event: RequestEvent): Locale => {
|
|
361
|
+
const defaultLocale = configuration?.internationalization?.defaultLocale;
|
|
362
|
+
|
|
363
|
+
// 尝试从 Intlayer storage(Cookies 或 headers)获取语言环境
|
|
364
|
+
const storedLocale = getLocaleFromStorage({
|
|
365
|
+
// SvelteKit cookies 访问
|
|
366
|
+
getCookie: (name: string) => event.cookies.get(name) ?? null,
|
|
367
|
+
// SvelteKit headers 访问
|
|
368
|
+
getHeader: (name: string) => event.request.headers.get(name) ?? null,
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
if (storedLocale) {
|
|
372
|
+
return storedLocale;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// 回退到浏览器 "Accept-Language" 协商
|
|
376
|
+
const negotiatorHeaders: Record<string, string> = {};
|
|
377
|
+
|
|
378
|
+
// 将 SvelteKit Headers 对象转换为普通的 Record<string, string>
|
|
379
|
+
event.request.headers.forEach((value, key) => {
|
|
380
|
+
negotiatorHeaders[key] = value;
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
// 从 `Accept-Language` header 检查语言环境
|
|
384
|
+
const userFallbackLocale = localeDetector(negotiatorHeaders);
|
|
385
|
+
|
|
386
|
+
if (userFallbackLocale) {
|
|
387
|
+
return userFallbackLocale;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// 如果未找到匹配项,返回默认语言环境
|
|
391
|
+
return defaultLocale;
|
|
392
|
+
};
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
> `getLocaleFromStorage` 将根据你的配置从 header 或 cookie 检查语言环境。有关更多详情,请参阅[配置](https://intlayer.org/doc/configuration)。
|
|
396
|
+
|
|
397
|
+
> `localeDetector` 函数将处理 `Accept-Language` header 并返回最佳匹配。
|
|
398
|
+
|
|
399
|
+
如果语言环境未配置,我们想返回 404 错误。为了简化这一点,我们可以创建一个 `match` 函数来检查语言环境是否有效:
|
|
400
|
+
|
|
401
|
+
```ts fileName="/src/params/locale.ts"
|
|
402
|
+
import { defaultLocale, locales, type Locale } from "intlayer";
|
|
403
|
+
export const match = (param: Locale = defaultLocale): boolean =>
|
|
404
|
+
locales.includes(param);
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
> **注意:** 确保你的 `src/app.d.ts` 包含语言环境定义:
|
|
408
|
+
>
|
|
409
|
+
> ```typescript
|
|
410
|
+
> declare global {
|
|
411
|
+
> namespace App {
|
|
412
|
+
> interface Locals {
|
|
413
|
+
> locale: import("intlayer").Locale;
|
|
414
|
+
> }
|
|
415
|
+
> }
|
|
416
|
+
> }
|
|
417
|
+
> ```
|
|
418
|
+
|
|
419
|
+
对于 `+layout.svelte` 文件,我们可以删除所有内容,只保留与 i18n 无关的静态内容:
|
|
420
|
+
|
|
421
|
+
```svelte fileName="src/+layout.svelte"
|
|
422
|
+
<script lang="ts">
|
|
423
|
+
import './layout.css';
|
|
424
|
+
|
|
425
|
+
let { children } = $props();
|
|
426
|
+
</script>
|
|
427
|
+
|
|
428
|
+
<div class="app">
|
|
429
|
+
{@render children()}
|
|
430
|
+
</div>
|
|
431
|
+
|
|
432
|
+
<style>
|
|
433
|
+
.app {
|
|
434
|
+
/* */
|
|
435
|
+
}
|
|
436
|
+
</style>
|
|
437
|
+
```
|
|
149
438
|
|
|
150
|
-
|
|
439
|
+
然后,在 `[[locale=locale]]` 组下创建一个新页面和布局:
|
|
440
|
+
|
|
441
|
+
```ts fileName="src/routes/[[locale=locale]]/+layout.ts"
|
|
442
|
+
import type { Load } from "@sveltejs/kit";
|
|
443
|
+
import { defaultLocale, type Locale } from "intlayer";
|
|
444
|
+
|
|
445
|
+
export const prerender = true;
|
|
446
|
+
|
|
447
|
+
// 使用通用 Load 类型
|
|
448
|
+
export const load: Load = ({ params }) => {
|
|
449
|
+
const locale: Locale = (params.locale as Locale) ?? defaultLocale;
|
|
450
|
+
|
|
451
|
+
return {
|
|
452
|
+
locale,
|
|
453
|
+
};
|
|
454
|
+
};
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
```svelte fileName="src/routes/[[locale=locale]]/+layout.svelte"
|
|
458
|
+
<script lang="ts">
|
|
459
|
+
import type { Snippet } from 'svelte';
|
|
460
|
+
import { useIntlayer, setupIntlayer } from "svelte-intlayer";
|
|
461
|
+
import Header from './Header.svelte';
|
|
462
|
+
import type { LayoutData } from './$types';
|
|
463
|
+
|
|
464
|
+
let { children, data }: { children: Snippet, data: LayoutData } = $props();
|
|
465
|
+
|
|
466
|
+
// 使用路由中的语言环境初始化 Intlayer
|
|
467
|
+
$effect(() => {
|
|
468
|
+
setupIntlayer(data.locale);
|
|
469
|
+
});
|
|
470
|
+
// 使用布局内容字典
|
|
471
|
+
const layoutContent = useIntlayer('layout');
|
|
472
|
+
</script>
|
|
473
|
+
|
|
474
|
+
<Header />
|
|
475
|
+
|
|
476
|
+
<main>
|
|
477
|
+
{@render children()}
|
|
478
|
+
</main>
|
|
479
|
+
|
|
480
|
+
<footer>
|
|
481
|
+
<p>
|
|
482
|
+
{$layoutContent.footer.prefix.value}{' '}
|
|
483
|
+
<a href="https://svelte.dev/docs/kit">{$layoutContent.footer.linkLabel.value}</a>{' '}
|
|
484
|
+
{$layoutContent.footer.suffix.value}
|
|
485
|
+
</p>
|
|
486
|
+
</footer>
|
|
487
|
+
|
|
488
|
+
<style>
|
|
489
|
+
/* */
|
|
490
|
+
</style>
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
```ts fileName="src/routes/[[locale=locale]]/+page.ts"
|
|
494
|
+
export const prerender = true;
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
```svelte fileName="src/routes/[[locale=locale]]/+page.svelte"
|
|
498
|
+
<script lang="ts">
|
|
499
|
+
import { useIntlayer } from "svelte-intlayer";
|
|
500
|
+
|
|
501
|
+
// 使用 home 内容字典
|
|
502
|
+
const homeContent = useIntlayer('home');
|
|
503
|
+
</script>
|
|
504
|
+
|
|
505
|
+
<svelte:head>
|
|
506
|
+
<title>{$homeContent.title.value}</title>
|
|
507
|
+
</svelte:head>
|
|
508
|
+
|
|
509
|
+
<section>
|
|
510
|
+
<h1>
|
|
511
|
+
{$homeContent.title}
|
|
512
|
+
</h1>
|
|
513
|
+
</section>
|
|
514
|
+
|
|
515
|
+
<style>
|
|
516
|
+
/* */
|
|
517
|
+
</style>
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
</Step>
|
|
521
|
+
|
|
522
|
+
<Step number={8} title="国际化链接" isOptional={true}>
|
|
523
|
+
|
|
524
|
+
为了 SEO,建议用语言环境前缀你的路由(例如 `/en/about`、`/fr/about`)。此组件自动用当前语言环境前缀任何链接。
|
|
151
525
|
|
|
152
526
|
```svelte fileName="src/lib/components/LocalizedLink.svelte"
|
|
153
527
|
<script lang="ts">
|
|
@@ -157,7 +531,7 @@ Intlayer 不仅仅是一个 i18n 解决方案,还提供了一个**自托管的
|
|
|
157
531
|
let { href = "" } = $props();
|
|
158
532
|
const { locale } = useLocale();
|
|
159
533
|
|
|
160
|
-
//
|
|
534
|
+
// 使用当前语言环境前缀 URL 的 Helper
|
|
161
535
|
$: localizedHref = getLocalizedUrl(href, $locale);
|
|
162
536
|
</script>
|
|
163
537
|
|
|
@@ -166,7 +540,7 @@ Intlayer 不仅仅是一个 i18n 解决方案,还提供了一个**自托管的
|
|
|
166
540
|
</a>
|
|
167
541
|
```
|
|
168
542
|
|
|
169
|
-
如果你使用 SvelteKit
|
|
543
|
+
如果你使用 SvelteKit 中的 `goto`,你可以使用相同的逻辑与 `getLocalizedUrl` 来导航到本地化的 URL:
|
|
170
544
|
|
|
171
545
|
```typescript
|
|
172
546
|
import { goto } from "$app/navigation";
|
|
@@ -180,7 +554,7 @@ goto(localizedPath); // 根据语言环境导航到 /en/about 或 /fr/about
|
|
|
180
554
|
|
|
181
555
|
</Step>
|
|
182
556
|
|
|
183
|
-
<Step number={9} title="语言切换器">
|
|
557
|
+
<Step number={9} title="语言切换器" isOptional={true}>
|
|
184
558
|
|
|
185
559
|
为了允许用户切换语言,更新 URL。
|
|
186
560
|
|
|
@@ -206,7 +580,7 @@ goto(localizedPath); // 根据语言环境导航到 /en/about 或 /fr/about
|
|
|
206
580
|
href={getLocalizedUrl($page.url.pathname, localeEl)}
|
|
207
581
|
onclick={(e) => {
|
|
208
582
|
e.preventDefault();
|
|
209
|
-
setLocale(localeEl); //
|
|
583
|
+
setLocale(localeEl); // 将在 store 中设置语言环境并触发 onLocaleChange
|
|
210
584
|
}}
|
|
211
585
|
class:active={$locale === localeEl}
|
|
212
586
|
>
|
|
@@ -223,9 +597,11 @@ goto(localizedPath); // 根据语言环境导航到 /en/about 或 /fr/about
|
|
|
223
597
|
|
|
224
598
|
</Step>
|
|
225
599
|
|
|
226
|
-
<Step number={10} title="添加后端代理">
|
|
600
|
+
<Step number={10} title="添加后端代理" isOptional={true}>
|
|
227
601
|
|
|
228
|
-
|
|
602
|
+
要将后端代理添加到你的 SvelteKit 应用,你可以使用 `vite-intlayer` 插件提供的 `intlayerProxy` 函数。此插件将根据 URL、cookies 和浏览器语言首选项自动检测用户的最佳语言环境。
|
|
603
|
+
|
|
604
|
+
> 自 Intlayer v9 起,`intlayerProxy()` 直接捆绑到 `intlayer()` 插件中,并通过 `routing.enableProxy` 选项(默认值为 `true`)默认启用。如下所示单独注册现在是可选的 — 为了向后兼容以及需要控制插件顺序的设置而保留。设置 `routing.enableProxy: false` 来选择不使用。查看 [v9 发布说明](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/releases/v9.md)。
|
|
229
605
|
|
|
230
606
|
```ts fileName="vite.config.ts"
|
|
231
607
|
import { defineConfig } from "vite";
|
|
@@ -241,19 +617,19 @@ export default defineConfig({
|
|
|
241
617
|
},
|
|
242
618
|
}),
|
|
243
619
|
sveltekit(),
|
|
244
|
-
],
|
|
620
|
+
],
|
|
245
621
|
});
|
|
246
622
|
```
|
|
247
623
|
|
|
248
624
|
</Step>
|
|
249
625
|
|
|
250
|
-
<Step number={11} title="设置 intlayer 编辑器 / CMS">
|
|
626
|
+
<Step number={11} title="设置 intlayer 编辑器 / CMS" isOptional={true}>
|
|
251
627
|
|
|
252
|
-
要设置 intlayer
|
|
628
|
+
要设置 intlayer 编辑器,你必须遵循 [intlayer 编辑器文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_visual_editor.md)。
|
|
253
629
|
|
|
254
|
-
要设置 intlayer CMS
|
|
630
|
+
要设置 intlayer CMS,你必须遵循 [intlayer CMS 文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_CMS.md)。
|
|
255
631
|
|
|
256
|
-
|
|
632
|
+
为了能够可视化 intlayer 编辑器选择器,你必须在你的 intlayer 内容中使用组件语法。
|
|
257
633
|
|
|
258
634
|
```svelte fileName="Component.svelte"
|
|
259
635
|
<script lang="ts">
|
|
@@ -264,32 +640,32 @@ export default defineConfig({
|
|
|
264
640
|
|
|
265
641
|
<div>
|
|
266
642
|
|
|
267
|
-
<!--
|
|
643
|
+
<!-- 将内容呈现为简单内容 -->
|
|
268
644
|
<h1>{$content.title}</h1>
|
|
269
645
|
|
|
270
|
-
<!--
|
|
646
|
+
<!-- 将内容呈现为组件(编辑器需要) -->
|
|
271
647
|
{@const Component = $content.component}<Component />
|
|
272
648
|
</div>
|
|
273
649
|
```
|
|
274
650
|
|
|
275
651
|
</Step>
|
|
276
652
|
|
|
277
|
-
<Step number={
|
|
653
|
+
<Step number={12} title="提取你的组件内容" isOptional={true}>
|
|
278
654
|
|
|
279
|
-
|
|
655
|
+
如果你有现有的 codebase,转换数千个文件可能很耗时。
|
|
280
656
|
|
|
281
|
-
|
|
657
|
+
为了简化这个过程,Intlayer 提供了一个[编译器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/compiler.md) / [提取器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/extract.md)来转换你的组件并提取内容。
|
|
282
658
|
|
|
283
|
-
|
|
659
|
+
要设置它,你可以在你的 `intlayer.config.ts` 文件中添加一个 `compiler` 部分:
|
|
284
660
|
|
|
285
661
|
```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
|
|
286
662
|
import { type IntlayerConfig } from "intlayer";
|
|
287
663
|
|
|
288
664
|
const config: IntlayerConfig = {
|
|
289
|
-
// ...
|
|
665
|
+
// ... 你的配置的其余部分
|
|
290
666
|
compiler: {
|
|
291
667
|
/**
|
|
292
|
-
*
|
|
668
|
+
* 指示编译器是否应启用。
|
|
293
669
|
*/
|
|
294
670
|
enabled: true,
|
|
295
671
|
|
|
@@ -299,12 +675,16 @@ const config: IntlayerConfig = {
|
|
|
299
675
|
output: ({ fileName, extension }) => `./${fileName}${extension}`,
|
|
300
676
|
|
|
301
677
|
/**
|
|
302
|
-
*
|
|
678
|
+
* 指示组件在转换后是否应保存。
|
|
679
|
+
*
|
|
680
|
+
* - 如果为 `true`,编译器将在磁盘中重写组件文件。所以转换将是永久的,编译器将跳过下一个过程的转换。这样,编译器可以转换应用,然后可以将其删除。
|
|
681
|
+
*
|
|
682
|
+
* - 如果为 `false`,编译器将仅在构建输出中注入 `useIntlayer()` 函数调用,并保持基础 codebase 完整。转换将仅在内存中进行。
|
|
303
683
|
*/
|
|
304
684
|
saveComponents: false,
|
|
305
685
|
|
|
306
686
|
/**
|
|
307
|
-
*
|
|
687
|
+
* 字典 key 前缀
|
|
308
688
|
*/
|
|
309
689
|
dictionaryKeyPrefix: "",
|
|
310
690
|
},
|
|
@@ -316,7 +696,7 @@ export default config;
|
|
|
316
696
|
<Tabs>
|
|
317
697
|
<Tab value='提取命令'>
|
|
318
698
|
|
|
319
|
-
|
|
699
|
+
运行提取器来转换你的组件并提取内容
|
|
320
700
|
|
|
321
701
|
```bash packageManager="npm"
|
|
322
702
|
npx intlayer extract
|
|
@@ -337,9 +717,9 @@ bun x intlayer extract
|
|
|
337
717
|
</Tab>
|
|
338
718
|
<Tab value='Babel 编译器'>
|
|
339
719
|
|
|
340
|
-
>
|
|
720
|
+
> 自 v9 起,`intlayerCompiler` 包含在 `intlayer` 插件中。所以你不需要手动添加它。
|
|
341
721
|
|
|
342
|
-
|
|
722
|
+
更新你的 `vite.config.ts` 以包含 `intlayerCompiler` 插件:
|
|
343
723
|
|
|
344
724
|
```ts fileName="vite.config.ts"
|
|
345
725
|
import { defineConfig } from "vite";
|
|
@@ -348,7 +728,7 @@ import { intlayer, intlayerCompiler } from "vite-intlayer";
|
|
|
348
728
|
export default defineConfig({
|
|
349
729
|
plugins: [
|
|
350
730
|
intlayer(),
|
|
351
|
-
intlayerCompiler(), //
|
|
731
|
+
intlayerCompiler(), // 添加编译器插件
|
|
352
732
|
],
|
|
353
733
|
});
|
|
354
734
|
```
|
|
@@ -366,7 +746,7 @@ yarn build # 或 yarn dev
|
|
|
366
746
|
```
|
|
367
747
|
|
|
368
748
|
```bash packageManager="bun"
|
|
369
|
-
bun run build #
|
|
749
|
+
bun run build # 或 bun run dev
|
|
370
750
|
```
|
|
371
751
|
|
|
372
752
|
</Tab>
|