@intlayer/docs 9.1.3 → 9.2.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/rag_powered_documentation_assistant.md +7 -0
- package/blog/de/rag_powered_documentation_assistant.md +6 -0
- package/blog/en-GB/rag_powered_documentation_assistant.md +6 -0
- package/blog/es/rag_powered_documentation_assistant.md +7 -0
- package/blog/fr/i18n_meaning.md +7 -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/next-i18next_vs_next-intl_vs_intlayer.md +119 -42
- package/blog/hi/rag_powered_documentation_assistant.md +7 -0
- package/blog/id/rag_powered_documentation_assistant.md +6 -0
- package/blog/it/rag_powered_documentation_assistant.md +6 -0
- package/blog/ja/rag_powered_documentation_assistant.md +7 -0
- package/blog/ko/list_i18n_technologies/frameworks/react.md +7 -7
- package/blog/ko/rag_powered_documentation_assistant.md +6 -0
- package/blog/pl/rag_powered_documentation_assistant.md +6 -0
- package/blog/pt/rag_powered_documentation_assistant.md +6 -0
- 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/rag_powered_documentation_assistant.md +6 -0
- package/blog/vi/rag_powered_documentation_assistant.md +6 -0
- 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/generated/blog.entry.cjs +27 -27
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +234 -214
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +17 -17
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +2 -2
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +27 -27
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +234 -214
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +17 -17
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +2 -2
- package/dist/esm/generated/legal.entry.mjs.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/docs/ar/analytics.md +222 -0
- package/docs/ar/autoFill.md +28 -9
- 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/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/configuration.md +25 -8
- package/docs/bn/intlayer_with_angular_21.md +9 -9
- 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/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/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/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-GB/analytics.md +222 -0
- package/docs/en-GB/autoFill.md +26 -7
- 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/configuration.md +25 -8
- package/docs/nl/intlayer_with_angular_21.md +9 -9
- package/docs/pl/analytics.md +220 -0
- 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/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/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/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/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/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/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/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/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/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/configuration.md +25 -8
- package/docs/ur/intlayer_with_angular_21.md +9 -9
- package/docs/vi/analytics.md +222 -0
- 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/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/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/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/intlayer_with_angular_21.md +7 -7
- package/package.json +6 -6
- package/src/generated/blog.entry.ts +27 -27
- package/src/generated/docs.entry.ts +234 -214
- package/src/generated/frequentQuestions.entry.ts +17 -17
- package/src/generated/legal.entry.ts +2 -2
|
@@ -93,9 +93,306 @@ Intlayer 不仅仅是一个 i18n 解决方案,还提供了一个**自托管的
|
|
|
93
93
|
|
|
94
94
|
---
|
|
95
95
|
|
|
96
|
-
|
|
96
|
+
## 在 Vite 和 Vanilla JS 应用中设置 Intlayer 的分步指南
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
<Steps>
|
|
99
|
+
|
|
100
|
+
<Step number={1} title="安装依赖">
|
|
101
|
+
|
|
102
|
+
使用 npm 安装必要的包:
|
|
103
|
+
|
|
104
|
+
```bash packageManager="npm"
|
|
105
|
+
npx intlayer init --interactive
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
```bash packageManager="pnpm"
|
|
109
|
+
pnpm dlx intlayer@canary init --interactive
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
```bash packageManager="yarn"
|
|
113
|
+
yarn dlx intlayer@canary init --interactive
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```bash packageManager="bun"
|
|
117
|
+
bunx intlayer@canary init --interactive
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
> `--interactive` 标志是可选的。如果你是 AI 代理,请使用 `intlayer-cli init`。
|
|
121
|
+
|
|
122
|
+
> 此命令将检测你的环境并安装所需的包。例如:
|
|
123
|
+
|
|
124
|
+
```bash packageManager="npm"
|
|
125
|
+
npm install intlayer vanilla-intlayer
|
|
126
|
+
npm install vite-intlayer --save-dev
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
```bash packageManager="pnpm"
|
|
130
|
+
pnpm add intlayer vanilla-intlayer
|
|
131
|
+
pnpm add vite-intlayer --save-dev
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
```bash packageManager="yarn"
|
|
135
|
+
yarn add intlayer vanilla-intlayer
|
|
136
|
+
yarn add vite-intlayer --save-dev
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
```bash packageManager="bun"
|
|
140
|
+
bun add intlayer vanilla-intlayer
|
|
141
|
+
bun add vite-intlayer --dev
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
- **intlayer**
|
|
145
|
+
核心包,提供国际化工具,用于配置管理、翻译、[内容声明](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/content_file.md)、代码转换和 [CLI 命令](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/index.md)。
|
|
146
|
+
|
|
147
|
+
- **vanilla-intlayer**
|
|
148
|
+
将 Intlayer 与纯 JavaScript / TypeScript 应用集成的包。它提供一个 pub/sub 单例 (`IntlayerClient`) 和基于回调的辅助函数 (`useIntlayer`、`useLocale` 等),使你的应用的任何部分都可以对语言环境变化做出反应,而无需依赖 UI 框架。
|
|
149
|
+
|
|
150
|
+
- **vite-intlayer**
|
|
151
|
+
包含用于将 Intlayer 与 [Vite bundler](https://vite.dev/guide/why.html#why-bundle-for-production) 集成的 Vite 插件,以及用于检测用户首选语言环境、管理 cookie 和处理 URL 重定向的中间件。
|
|
152
|
+
|
|
153
|
+
</Step>
|
|
154
|
+
|
|
155
|
+
<Step number={2} title="项目配置">
|
|
156
|
+
|
|
157
|
+
创建一个配置文件以配置应用的语言:
|
|
158
|
+
|
|
159
|
+
```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
|
|
160
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
161
|
+
|
|
162
|
+
const config: IntlayerConfig = {
|
|
163
|
+
internationalization: {
|
|
164
|
+
locales: [
|
|
165
|
+
Locales.ENGLISH,
|
|
166
|
+
Locales.FRENCH,
|
|
167
|
+
Locales.SPANISH,
|
|
168
|
+
// 你的其他语言环境
|
|
169
|
+
],
|
|
170
|
+
defaultLocale: Locales.ENGLISH,
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
export default config;
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
> 通过此配置文件,你可以设置本地化 URL、中间件重定向、cookie 名称、内容声明的位置和扩展名、禁用控制台中的 Intlayer 日志等。有关可用参数的完整列表,请参考 [配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)。
|
|
178
|
+
|
|
179
|
+
</Step>
|
|
180
|
+
|
|
181
|
+
<Step number={3} title="在你的 Vite 配置中集成 Intlayer">
|
|
182
|
+
|
|
183
|
+
将 intlayer 插件添加到你的配置中。
|
|
184
|
+
|
|
185
|
+
```typescript fileName="vite.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
|
|
186
|
+
import { defineConfig } from "vite";
|
|
187
|
+
import { intlayer } from "vite-intlayer";
|
|
188
|
+
|
|
189
|
+
// https://vitejs.dev/config/
|
|
190
|
+
export default defineConfig({
|
|
191
|
+
plugins: [
|
|
192
|
+
intlayer({
|
|
193
|
+
proxy: {
|
|
194
|
+
ignore: (req) => req.url?.startsWith("/api"),
|
|
195
|
+
},
|
|
196
|
+
}),
|
|
197
|
+
],
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
> `intlayer()` Vite 插件用于将 Intlayer 与 Vite 集成。它确保内容声明文件的构建,并在开发模式下监视它们。它在 Vite 应用中定义 Intlayer 环境变量。此外,它提供别名以优化性能。
|
|
202
|
+
|
|
203
|
+
</Step>
|
|
204
|
+
|
|
205
|
+
<Step number={4} title="在你的入口点引导 Intlayer">
|
|
206
|
+
|
|
207
|
+
在渲染任何内容**之前**调用 `installIntlayer()`,以便全局语言环境单例已准备好。
|
|
208
|
+
|
|
209
|
+
```typescript fileName="src/main.ts" codeFormat="typescript"
|
|
210
|
+
import { installIntlayer } from "vanilla-intlayer";
|
|
211
|
+
|
|
212
|
+
// 必须在渲染任何 i18n 内容之前调用。
|
|
213
|
+
installIntlayer();
|
|
214
|
+
|
|
215
|
+
// 导入并运行你的应用模块。
|
|
216
|
+
import "./app.js";
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
如果你还使用 `md()` 内容声明(Markdown),请也安装 markdown 渲染器:
|
|
220
|
+
|
|
221
|
+
```typescript fileName="src/main.ts" codeFormat="typescript"
|
|
222
|
+
import { installIntlayer, installIntlayerMarkdown } from "vanilla-intlayer";
|
|
223
|
+
|
|
224
|
+
installIntlayer();
|
|
225
|
+
installIntlayerMarkdown();
|
|
226
|
+
|
|
227
|
+
import "./app.js";
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
</Step>
|
|
231
|
+
|
|
232
|
+
<Step number={5} title="声明你的内容">
|
|
233
|
+
|
|
234
|
+
创建并管理内容声明以存储翻译:
|
|
235
|
+
|
|
236
|
+
```typescript fileName="src/app.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
237
|
+
import { insert, t, type Dictionary } from "intlayer";
|
|
238
|
+
|
|
239
|
+
const appContent = {
|
|
240
|
+
key: "app",
|
|
241
|
+
content: {
|
|
242
|
+
title: "Vite + Vanilla",
|
|
243
|
+
|
|
244
|
+
viteLogoLabel: t({
|
|
245
|
+
zh: "Vite 标志",
|
|
246
|
+
en: "Vite Logo",
|
|
247
|
+
fr: "Logo Vite",
|
|
248
|
+
es: "Logo Vite",
|
|
249
|
+
}),
|
|
250
|
+
|
|
251
|
+
count: insert(
|
|
252
|
+
t({
|
|
253
|
+
zh: "计数是 {{count}}",
|
|
254
|
+
en: "count is {{count}}",
|
|
255
|
+
fr: "le compte est {{count}}",
|
|
256
|
+
es: "el recuento es {{count}}",
|
|
257
|
+
})
|
|
258
|
+
),
|
|
259
|
+
|
|
260
|
+
readTheDocs: t({
|
|
261
|
+
zh: "点击 Vite 标志以了解更多信息",
|
|
262
|
+
en: "Click on the Vite logo to learn more",
|
|
263
|
+
fr: "Cliquez sur le logo Vite pour en savoir plus",
|
|
264
|
+
es: "Haga clic en el logotipo de Vite para obtener más información",
|
|
265
|
+
}),
|
|
266
|
+
},
|
|
267
|
+
} satisfies Dictionary;
|
|
268
|
+
|
|
269
|
+
export default appContent;
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
```json fileName="src/app.content.json" contentDeclarationFormat="json"
|
|
273
|
+
{
|
|
274
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
275
|
+
"key": "app",
|
|
276
|
+
"content": {
|
|
277
|
+
"title": "Vite + Vanilla",
|
|
278
|
+
"viteLogoLabel": {
|
|
279
|
+
"nodeType": "translation",
|
|
280
|
+
"translation": {
|
|
281
|
+
"zh": "Vite 标志",
|
|
282
|
+
"en": "Vite Logo",
|
|
283
|
+
"fr": "Logo Vite",
|
|
284
|
+
"es": "Logo Vite"
|
|
285
|
+
}
|
|
286
|
+
},
|
|
287
|
+
"count": {
|
|
288
|
+
"nodeType": "insertion",
|
|
289
|
+
"insertion": {
|
|
290
|
+
"nodeType": "translation",
|
|
291
|
+
"translation": {
|
|
292
|
+
"zh": "计数是 {{count}}",
|
|
293
|
+
"en": "count is {{count}}",
|
|
294
|
+
"fr": "le compte est {{count}}",
|
|
295
|
+
"es": "el recuento es {{count}}"
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
"readTheDocs": {
|
|
300
|
+
"nodeType": "translation",
|
|
301
|
+
"translation": {
|
|
302
|
+
"zh": "点击 Vite 标志以了解更多信息",
|
|
303
|
+
"en": "Click on the Vite logo to learn more",
|
|
304
|
+
"fr": "Cliquez sur le logo Vite pour en savoir plus",
|
|
305
|
+
"es": "Haga clic en el logotipo de Vite para obtener más información"
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
> 你的内容声明可以在应用的任何地方定义,只要它们包含在 `contentDir` 目录中(默认情况下为 `./src`)。并匹配内容声明文件扩展名(默认为 `.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}`)。
|
|
313
|
+
>
|
|
314
|
+
> 有关更多详细信息,请参考 [内容声明文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/content_file.md)。
|
|
315
|
+
|
|
316
|
+
</Step>
|
|
317
|
+
|
|
318
|
+
<Step number={6} title="在你的 JavaScript 中使用 Intlayer">
|
|
319
|
+
|
|
320
|
+
`vanilla-intlayer` 镜像了 `react-intlayer` 的表面 API:`useIntlayer(key, locale?)` 直接返回翻译的内容。在结果上链接 `.onChange()` 以订阅语言环境变化 - 这是 React 重新渲染的显式等效物。
|
|
321
|
+
|
|
322
|
+
```typescript fileName="src/main.ts" codeFormat="typescript"
|
|
323
|
+
import { installIntlayer, useIntlayer } from "vanilla-intlayer";
|
|
324
|
+
|
|
325
|
+
installIntlayer();
|
|
326
|
+
|
|
327
|
+
// 获取当前语言环境的初始内容。
|
|
328
|
+
// 链接 .onChange() 以在语言环境每次变化时收到通知。
|
|
329
|
+
const content = useIntlayer("app").onChange((newContent) => {
|
|
330
|
+
// 重新渲染或仅修补受影响的 DOM 节点
|
|
331
|
+
document.querySelector<HTMLHeadingElement>("h1")!.textContent = String(
|
|
332
|
+
newContent.title
|
|
333
|
+
);
|
|
334
|
+
document.querySelector<HTMLParagraphElement>(".read-the-docs")!.textContent =
|
|
335
|
+
String(newContent.readTheDocs);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// 初始渲染
|
|
339
|
+
document.querySelector<HTMLHeadingElement>("h1")!.textContent = String(
|
|
340
|
+
content.title
|
|
341
|
+
);
|
|
342
|
+
document.querySelector<HTMLParagraphElement>(".read-the-docs")!.textContent =
|
|
343
|
+
String(content.readTheDocs);
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
> 通过在 `String()` 中包装叶值来将其作为字符串访问,这调用节点的 `toString()` 方法并返回翻译的文本。
|
|
347
|
+
>
|
|
348
|
+
> 当你需要用于原生 HTML 属性的值时(例如 `alt`、`aria-label`),直接使用 `.value`:
|
|
349
|
+
>
|
|
350
|
+
> ```typescript
|
|
351
|
+
> img.alt = content.viteLogoLabel.value;
|
|
352
|
+
> ```
|
|
353
|
+
|
|
354
|
+
</Step>
|
|
355
|
+
|
|
356
|
+
<Step number={7} title="更改你的内容的语言" isOptional={true}>
|
|
357
|
+
|
|
358
|
+
要更改你的内容的语言,请使用 `useLocale` 公开的 `setLocale` 函数。
|
|
359
|
+
|
|
360
|
+
```typescript fileName="src/locale-switcher.ts" codeFormat="typescript"
|
|
361
|
+
import { getLocaleName } from "intlayer";
|
|
362
|
+
import { useLocale } from "vanilla-intlayer";
|
|
363
|
+
|
|
364
|
+
export function setupLocaleSwitcher(container: HTMLElement): () => void {
|
|
365
|
+
const { locale, availableLocales, setLocale, subscribe } = useLocale();
|
|
366
|
+
|
|
367
|
+
const select = document.createElement("select");
|
|
368
|
+
select.setAttribute("aria-label", "Language");
|
|
369
|
+
|
|
370
|
+
const render = (currentLocale: string) => {
|
|
371
|
+
select.innerHTML = availableLocales
|
|
372
|
+
.map(
|
|
373
|
+
(loc) =>
|
|
374
|
+
`<option value="${loc}"${loc === currentLocale ? " selected" : ""}>
|
|
375
|
+
${getLocaleName(loc)}
|
|
376
|
+
</option>`
|
|
377
|
+
)
|
|
378
|
+
.join("");
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
render(locale);
|
|
382
|
+
container.appendChild(select);
|
|
383
|
+
|
|
384
|
+
select.addEventListener("change", () => setLocale(select.value as any));
|
|
385
|
+
|
|
386
|
+
// 保持下拉菜单与其他地方的语言环境变化同步
|
|
387
|
+
return subscribe((newLocale) => render(newLocale));
|
|
388
|
+
}
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
</Step>
|
|
392
|
+
|
|
393
|
+
<Step number={8} title="渲染 Markdown 和 HTML 内容" isOptional={true}>
|
|
394
|
+
|
|
395
|
+
Intlayer 支持 `md()` 和 `html()` 内容声明。在 vanilla JS 中,编译的输出通过 `innerHTML` 作为原始 HTML 插入。
|
|
99
396
|
|
|
100
397
|
```typescript fileName="src/app.content.ts" contentDeclarationFormat=["typescript", "esm", "cjs"]
|
|
101
398
|
import { md, t, type Dictionary } from "intlayer";
|
|
@@ -106,6 +403,7 @@ const appContent = {
|
|
|
106
403
|
// ...
|
|
107
404
|
editNote: md(
|
|
108
405
|
t({
|
|
406
|
+
zh: "编辑 `src/main.ts` 并保存以测试 **HMR**",
|
|
109
407
|
en: "Edit `src/main.ts` and save to test **HMR**",
|
|
110
408
|
fr: "Modifiez `src/main.ts` et enregistrez pour tester **HMR**",
|
|
111
409
|
es: "Edite `src/main.ts` y guarde para probar **HMR**",
|
|
@@ -138,10 +436,10 @@ document.querySelector<HTMLDivElement>(".edit-note")!.innerHTML =
|
|
|
138
436
|
```
|
|
139
437
|
|
|
140
438
|
> [!TIP]
|
|
141
|
-
> `String(content.editNote)`
|
|
439
|
+
> `String(content.editNote)` 调用 `IntlayerNode` 上的 `toString()`,它返回原始 Markdown 字符串。将其传递给 `compileMarkdown` 以获取 HTML 字符串,然后通过 `innerHTML` 设置它。
|
|
142
440
|
|
|
143
441
|
> [!WARNING]
|
|
144
|
-
> 仅对受信任的内容使用 `innerHTML`。如果
|
|
442
|
+
> 仅对受信任的内容使用 `innerHTML`。如果 markdown 来自用户输入,请先进行清理(例如使用 DOMPurify)。你可以动态安装清理渲染器:
|
|
145
443
|
>
|
|
146
444
|
> ```typescript
|
|
147
445
|
> import { installIntlayerMarkdownDynamic } from "vanilla-intlayer";
|
|
@@ -152,6 +450,201 @@ document.querySelector<HTMLDivElement>(".edit-note")!.innerHTML =
|
|
|
152
450
|
> });
|
|
153
451
|
> ```
|
|
154
452
|
|
|
453
|
+
</Step>
|
|
454
|
+
|
|
455
|
+
<Step number={9} title="向你的应用添加本地化路由" isOptional={true}>
|
|
456
|
+
|
|
457
|
+
要为每种语言创建唯一的路由(对 SEO 有用),你可以在 Vite 配置中使用 `intlayerProxy` 进行服务器端语言环境检测。
|
|
458
|
+
|
|
459
|
+
首先,将 `intlayerProxy` 添加到你的 Vite 配置:
|
|
460
|
+
|
|
461
|
+
> 请注意,要在生产中使用 `intlayerProxy`,你需要将 `vite-intlayer` 从 `devDependencies` 移到 `dependencies`。
|
|
462
|
+
|
|
463
|
+
> 从 Intlayer v9 开始,`intlayerProxy()` 直接捆绑到 `intlayer()` 插件中,并通过 `routing.enableProxy` 选项默认启用(默认为 `true`)。单独注册如下所示现在是可选的 — 为了向后兼容和需要控制插件顺序的设置而保留。设置 `routing.enableProxy: false` 以选择退出。有关更多信息,请参见 [v9 发布说明](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/releases/v9.md)。
|
|
464
|
+
|
|
465
|
+
```typescript {3,7} fileName="vite.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
|
|
466
|
+
import { defineConfig } from "vite";
|
|
467
|
+
import { intlayer } from "vite-intlayer";
|
|
468
|
+
|
|
469
|
+
export default defineConfig({
|
|
470
|
+
plugins: [
|
|
471
|
+
intlayer({
|
|
472
|
+
proxy: {
|
|
473
|
+
ignore: (req) => req.url?.startsWith("/api"),
|
|
474
|
+
},
|
|
475
|
+
}),
|
|
476
|
+
],
|
|
477
|
+
});
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
</Step>
|
|
481
|
+
|
|
482
|
+
<Step number={10} title="当语言环境更改时更改 URL" isOptional={true}>
|
|
483
|
+
|
|
484
|
+
要在语言环境更改时更新浏览器 URL,请在安装 Intlayer 后调用 `useRewriteURL()`:
|
|
485
|
+
|
|
486
|
+
```typescript fileName="src/main.ts" codeFormat="typescript"
|
|
487
|
+
import { installIntlayer, useRewriteURL } from "vanilla-intlayer";
|
|
488
|
+
|
|
489
|
+
installIntlayer();
|
|
490
|
+
|
|
491
|
+
// 立即重写 URL,并在随后的每次语言环境更改时重写。
|
|
492
|
+
// 返回一个用于清理的取消订阅函数。
|
|
493
|
+
const stopRewriteURL = useRewriteURL();
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
</Step>
|
|
497
|
+
|
|
498
|
+
<Step number={11} title="切换 HTML 语言和方向属性" isOptional={true}>
|
|
499
|
+
|
|
500
|
+
更新 `<html>` 标签的 `lang` 和 `dir` 属性以匹配当前语言环境,以实现可访问性和 SEO。
|
|
501
|
+
|
|
502
|
+
```typescript fileName="src/main.ts" codeFormat="typescript"
|
|
503
|
+
import { getHTMLTextDir } from "intlayer";
|
|
504
|
+
import { installIntlayer, useLocale } from "vanilla-intlayer";
|
|
505
|
+
|
|
506
|
+
installIntlayer();
|
|
507
|
+
|
|
508
|
+
useLocale({
|
|
509
|
+
onLocaleChange: (locale) => {
|
|
510
|
+
document.documentElement.lang = locale;
|
|
511
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
512
|
+
},
|
|
513
|
+
});
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
</Step>
|
|
517
|
+
|
|
518
|
+
<Step number={12} title="按语言环境延迟加载字典" isOptional={true}>
|
|
519
|
+
|
|
520
|
+
对于大型应用,你可能希望将每个语言环境的字典拆分为其自己的块。使用 `useDictionaryDynamic` 以及 Vite 的动态 `import()`:
|
|
521
|
+
|
|
522
|
+
```typescript fileName="src/app.ts" codeFormat="typescript"
|
|
523
|
+
import { installIntlayer, useDictionaryDynamic } from "vanilla-intlayer";
|
|
524
|
+
|
|
525
|
+
installIntlayer();
|
|
526
|
+
|
|
527
|
+
const unsubscribe = useDictionaryDynamic(
|
|
528
|
+
{
|
|
529
|
+
en: () => import("../.intlayer/dictionaries/en/app.mjs"),
|
|
530
|
+
fr: () => import("../.intlayer/dictionaries/fr/app.mjs"),
|
|
531
|
+
es: () => import("../.intlayer/dictionaries/es/app.mjs"),
|
|
532
|
+
},
|
|
533
|
+
"app"
|
|
534
|
+
).onChange((content) => {
|
|
535
|
+
document.querySelector("h1")!.textContent = String(content.title);
|
|
536
|
+
});
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
> 每个语言环境的包仅在该语言环境变为活跃时才被获取,结果被缓存 - 随后对同一语言环境的切换是即时的。
|
|
540
|
+
|
|
541
|
+
</Step>
|
|
542
|
+
|
|
543
|
+
<Step number={13} title="提取你的组件的内容" isOptional={true}>
|
|
544
|
+
|
|
545
|
+
如果你有现有的 codebase,转换数千个文件可能会耗时。
|
|
546
|
+
|
|
547
|
+
为了简化此过程,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) 来转换你的组件并提取内容。
|
|
548
|
+
|
|
549
|
+
要设置它,你可以在 `intlayer.config.ts` 文件中添加一个 `compiler` 部分:
|
|
550
|
+
|
|
551
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
552
|
+
import { type IntlayerConfig } from "intlayer";
|
|
553
|
+
|
|
554
|
+
const config: IntlayerConfig = {
|
|
555
|
+
// ... 配置的其余部分
|
|
556
|
+
compiler: {
|
|
557
|
+
/**
|
|
558
|
+
* 指示是否应启用编译器。
|
|
559
|
+
*/
|
|
560
|
+
enabled: true,
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* 定义输出文件路径
|
|
564
|
+
*/
|
|
565
|
+
output: ({ fileName, extension }) => `./${fileName}${extension}`,
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* 指示转换后是否应保存组件。
|
|
569
|
+
*
|
|
570
|
+
* - 如果为 `true`,编译器将在磁盘中重写组件文件。所以转换将是永久的,编译器将跳过下一个过程的转换。这样,编译器可以转换应用,然后可以被移除。
|
|
571
|
+
*
|
|
572
|
+
* - 如果为 `false`,编译器将仅在构建输出中注入 `useIntlayer()` 函数调用,并保持基础 codebase 完整。转换将仅在内存中进行。
|
|
573
|
+
*/
|
|
574
|
+
saveComponents: false,
|
|
575
|
+
|
|
576
|
+
/**
|
|
577
|
+
* 字典键前缀
|
|
578
|
+
*/
|
|
579
|
+
dictionaryKeyPrefix: "",
|
|
580
|
+
},
|
|
581
|
+
};
|
|
582
|
+
|
|
583
|
+
export default config;
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
<Tabs>
|
|
587
|
+
<Tab value='Extract command'>
|
|
588
|
+
|
|
589
|
+
运行提取器来转换你的组件并提取内容
|
|
590
|
+
|
|
591
|
+
```bash packageManager="npm"
|
|
592
|
+
npx intlayer extract
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
```bash packageManager="pnpm"
|
|
596
|
+
pnpm intlayer extract
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
```bash packageManager="yarn"
|
|
600
|
+
yarn intlayer extract
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
```bash packageManager="bun"
|
|
604
|
+
bun x intlayer extract
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
</Tab>
|
|
608
|
+
<Tab value='Babel compiler'>
|
|
609
|
+
|
|
610
|
+
> 从 v9 开始,`intlayerCompiler` 包含在 `intlayer` 插件中。所以你不需要手动添加它。
|
|
611
|
+
|
|
612
|
+
更新你的 `vite.config.ts` 以包含 `intlayerCompiler` 插件:
|
|
613
|
+
|
|
614
|
+
```ts fileName="vite.config.ts"
|
|
615
|
+
import { defineConfig } from "vite";
|
|
616
|
+
import { intlayer, intlayerCompiler } from "vite-intlayer";
|
|
617
|
+
|
|
618
|
+
export default defineConfig({
|
|
619
|
+
plugins: [
|
|
620
|
+
intlayer(),
|
|
621
|
+
intlayerCompiler(), // 添加编译器插件
|
|
622
|
+
],
|
|
623
|
+
});
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
```bash packageManager="npm"
|
|
627
|
+
npm run build # 或 npm run dev
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
```bash packageManager="pnpm"
|
|
631
|
+
pnpm run build # 或 pnpm run dev
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
```bash packageManager="yarn"
|
|
635
|
+
yarn build # 或 yarn dev
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
```bash packageManager="bun"
|
|
639
|
+
bun run build # 或 bun run dev
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
</Tab>
|
|
643
|
+
</Tabs>
|
|
644
|
+
</Step>
|
|
645
|
+
|
|
646
|
+
</Steps>
|
|
647
|
+
|
|
155
648
|
### (可选)站点地图与 robots.txt(构建时生成)
|
|
156
649
|
|
|
157
650
|
Intlayer 提供 `generateSitemap` 与 `getMultilingualUrls`,可将面向爬虫的多语言 `sitemap.xml` 和 `robots.txt` 格式化并自动写入 `public/`。实践中在 Vite **之前**运行小型 Node 脚本(例如 npm 的 `predev` / `prebuild`)即可在构建或开发时生成这些文件。
|
package/docs/zh/mcp_server.md
CHANGED
|
@@ -252,20 +252,14 @@ bun x intlayer init mcp
|
|
|
252
252
|
|
|
253
253
|
按照[官方文档](https://modelcontextprotocol.io/quickstart/user)来配置 MCP server 在 Claude Code 中。
|
|
254
254
|
|
|
255
|
-
|
|
255
|
+
### 本地服务器 (stdio) (推荐)
|
|
256
256
|
|
|
257
|
-
|
|
257
|
+
要通过 stdio 将 Intlayer MCP 服务器连接到 Claude Code:
|
|
258
258
|
|
|
259
259
|
```bash
|
|
260
|
-
|
|
261
|
-
npm install -g @intlayer/mcp
|
|
262
|
-
|
|
263
|
-
# 或直接使用 npx(推荐)
|
|
264
|
-
npx @intlayer/mcp
|
|
260
|
+
claude mcp add intlayer npx -y @intlayer/mcp
|
|
265
261
|
```
|
|
266
262
|
|
|
267
|
-
---
|
|
268
|
-
|
|
269
263
|
### 远程服务器 (Streamable HTTP)
|
|
270
264
|
|
|
271
265
|
要使用 Streamable HTTP (SSE) 将 Intlayer MCP 服务器连接到 Claude Code:
|
|
@@ -66,30 +66,32 @@ getLocalizedUrl(
|
|
|
66
66
|
- **Type**: `Locales`
|
|
67
67
|
- **Required**: Yes
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
- `
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
- `
|
|
80
|
-
|
|
81
|
-
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
- `
|
|
85
|
-
|
|
86
|
-
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
- `
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
69
|
+
### 可选参数
|
|
70
|
+
|
|
71
|
+
- `options?: object`
|
|
72
|
+
- **Description**: URL 本地化行为的配置对象。
|
|
73
|
+
- **Type**: `object`
|
|
74
|
+
- **Required**: No (Optional)
|
|
75
|
+
|
|
76
|
+
- `options.locales?: Locales[]`
|
|
77
|
+
- **Description**: 支持的 locale 数组。如果未提供,将使用项目配置中配置的 locale。
|
|
78
|
+
- **Type**: `Locales[]`
|
|
79
|
+
- **Default**: [`Project Configuration`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md#middleware)
|
|
80
|
+
|
|
81
|
+
- `options.defaultLocale?: Locales`
|
|
82
|
+
- **Description**: 应用程序的默认 locale。如果未提供,将使用项目配置中配置的默认 locale。
|
|
83
|
+
- **Type**: `Locales`
|
|
84
|
+
- **Default**: [`Project Configuration`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md#middleware)
|
|
85
|
+
|
|
86
|
+
- `options.mode?: 'prefix-no-default' | 'prefix-all' | 'no-prefix' | 'search-params'`
|
|
87
|
+
- **Description**: 用于 locale 处理的 URL 路由模式。如果未提供,将使用项目配置中配置的模式。
|
|
88
|
+
- **Type**: `'prefix-no-default' | 'prefix-all' | 'no-prefix' | 'search-params'`
|
|
89
|
+
- **Default**: [`Project Configuration`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md#middleware)
|
|
90
|
+
- **Modes**:
|
|
91
|
+
- `prefix-no-default`: 默认 locale 无前缀,其他 locale 有前缀
|
|
92
|
+
- `prefix-all`: 所有 locale(包括默认 locale)都有前缀
|
|
93
|
+
- `no-prefix`: URL 中无 locale 前缀
|
|
94
|
+
- `search-params`: 使用查询参数表示 locale(例如 `?locale=fr`)
|
|
93
95
|
|
|
94
96
|
### 返回值
|
|
95
97
|
|
|
@@ -50,26 +50,12 @@ getMultilingualUrls(
|
|
|
50
50
|
|
|
51
51
|
## 参数
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
### 必需参数
|
|
54
54
|
|
|
55
55
|
- `url: string`
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
- `locales: Locales[]`
|
|
60
|
-
- **描述**:可选的支持语言环境数组。默认为项目中配置的语言环境。
|
|
61
|
-
- **类型**:`Locales[]`
|
|
62
|
-
- **默认值**:`localesDefault`
|
|
63
|
-
|
|
64
|
-
- `defaultLocale: Locales`
|
|
65
|
-
- **描述**:应用的默认语言环境。默认为项目中配置的默认语言环境。
|
|
66
|
-
- **类型**:`Locales`
|
|
67
|
-
- **默认值**:`defaultLocaleDefault`
|
|
68
|
-
|
|
69
|
-
- `prefixDefault: boolean`
|
|
70
|
-
- **描述**:是否为默认语言环境添加前缀。默认为项目中配置的值。
|
|
71
|
-
- **类型**:`boolean`
|
|
72
|
-
- **默认值**:`prefixDefaultDefault`
|
|
56
|
+
- **描述**: 原始 URL 字符串,用于添加区域前缀。
|
|
57
|
+
- **类型**: `string`
|
|
58
|
+
- **必需**: 是
|
|
73
59
|
|
|
74
60
|
### 可选参数
|
|
75
61
|
|
|
@@ -37,6 +37,26 @@ npm install vite-intlayer
|
|
|
37
37
|
|
|
38
38
|
导入:
|
|
39
39
|
|
|
40
|
+
```ts
|
|
41
|
+
import { ... } from "vite-intlayer";
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
| 导出 | 描述 | 相关文档 |
|
|
45
|
+
| -------------------------- | --------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
46
|
+
| `intlayer` | 主要 Vite 插件。准备字典、配置别名、启动开发服务器监听器,以及(从 v9 开始)捆绑代理和编译器。 | [intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayer.md) |
|
|
47
|
+
| `intlayerPlugin` | (**已弃用**) `intlayer` 的别名。 | [intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayer.md) |
|
|
48
|
+
| `intLayerPlugin` | (**已弃用**) `intlayer` 的别名。 | [intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayer.md) |
|
|
49
|
+
| `intlayerProxy` | 本地化路由中间件插件(检测、重定向、重写)。从 v9 开始,它捆绑在 `intlayer()` 内部 — 仅在需要时单独注册。 | [intlayerProxy](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerProxy.md) |
|
|
50
|
+
| `intlayerMiddleware` | (**已弃用**) `intlayerProxy` 的别名。 | [intlayerProxy](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerProxy.md) |
|
|
51
|
+
| `intLayerMiddlewarePlugin` | (**已弃用**) `intlayerProxy` 的别名。 | [intlayerProxy](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerProxy.md) |
|
|
52
|
+
| `intlayerCompiler` | 从组件中提取内联内容声明并将其写入字典。从 v9 开始,它捆绑在 `intlayer()` 内部。 | [intlayerCompiler](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerCompiler.md) |
|
|
53
|
+
| `intlayerPrune` | 从生产 bundle 中树摇未使用的字典字段。 | [intlayerPrune](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerPrune.md) |
|
|
54
|
+
| `intlayerMinify` | 压缩编译后的字典 JSON 文件,并可选地破坏字段名。 | [intlayerMinify](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerMinify.md) |
|
|
55
|
+
|
|
56
|
+
### 插件
|
|
57
|
+
|
|
58
|
+
导入:
|
|
59
|
+
|
|
40
60
|
```tsx
|
|
41
61
|
import "vite-intlayer";
|
|
42
62
|
```
|
|
@@ -48,3 +68,12 @@ import "vite-intlayer";
|
|
|
48
68
|
| `intlayerProxy` | 开发时的中间件插件,用于处理语言检测和路由。 | - |
|
|
49
69
|
| `intlayerMiddleware` | (**已弃用**) `intlayerProxy` 的别名。 | - |
|
|
50
70
|
| `intlayerPrune` | 用于在构建期间对未使用的字典进行 tree-shake 和修剪的插件。 | [intlayerPrune](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerPrune.md) |
|
|
71
|
+
|
|
72
|
+
### 类型
|
|
73
|
+
|
|
74
|
+
| 导出 | 描述 |
|
|
75
|
+
| ---------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
76
|
+
| `IntlayerPluginOptions` | `intlayer()` 接受的选项。扩展 `GetConfigurationOptions`,添加 `compatCallers` 和 `proxy`。 |
|
|
77
|
+
| `IntlayerProxyPluginOptions` | `intlayerProxy()` 和 `createIntlayerProxyHandler()` 接受的选项。包括 `ignore` 和 `configOptions`。 |
|
|
78
|
+
| `IntlayerCompilerOptions` | `intlayerCompiler()` 接受的选项。包括 `configOptions` 和 `compilerConfig`。 |
|
|
79
|
+
| `CompatCallerConfig` | 从 `@intlayer/babel` 重新导出。描述用于字段使用分析的 compat-adapter 调用者模式。 |
|