@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
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-07-08
|
|
3
|
+
updatedAt: 2026-07-08
|
|
4
|
+
title: Intlayer Analytics | 跟踪内容曝光并运行 A/B 测试
|
|
5
|
+
description: 探索 @intlayer/analytics 如何跟踪页面/区域设置浏览量和内容曝光,以及如何使用它对您的 Intlayer 内容运行 A/B 测试。
|
|
6
|
+
keywords:
|
|
7
|
+
- 分析 (Analytics)
|
|
8
|
+
- A/B 测试
|
|
9
|
+
- 受众 (Audience)
|
|
10
|
+
- 国际化 (Internationalization)
|
|
11
|
+
- 文档
|
|
12
|
+
- Intlayer
|
|
13
|
+
- Next.js
|
|
14
|
+
- JavaScript
|
|
15
|
+
- React
|
|
16
|
+
slugs:
|
|
17
|
+
- doc
|
|
18
|
+
- concept
|
|
19
|
+
- analytics
|
|
20
|
+
history:
|
|
21
|
+
- version: 9.0.0
|
|
22
|
+
date: 2026-07-08
|
|
23
|
+
changes: "Init doc — @intlayer/analytics 包,Provider/Node级别跟踪,A/B 测试,仪表板"
|
|
24
|
+
author: aymericzip
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# Intlayer Analytics 文档
|
|
28
|
+
|
|
29
|
+
`@intlayer/analytics` 是一个可选的配套包,它可以告诉您**哪些内容实际显示给了您的访问者** —— 哪个页面、哪个区域设置(locale)以及哪个特定的翻译内容片段 —— 从而让您能够了解您的受众并**对内容运行 A/B 测试**。
|
|
30
|
+
|
|
31
|
+
## 目录
|
|
32
|
+
|
|
33
|
+
<TOC/>
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 跟踪内容
|
|
38
|
+
|
|
39
|
+
`@intlayer/analytics` 会批处理三种类型的匿名事件:
|
|
40
|
+
|
|
41
|
+
| 事件 (Event) | 捕获位置 | 它的作用 |
|
|
42
|
+
| ------------------ | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
|
43
|
+
| `page_view` | Provider 级别 (`IntlayerProvider`) | 会话在首次加载、路由更改或切换区域设置时查看了哪个页面和区域设置。 |
|
|
44
|
+
| `content_exposure` | Node 级别 (`useIntlayer` / 解释器插件) | 实际解析并显示了哪个字典键 (dictionary key) / 键路径 —— 并且,如果它是实验的一部分,具体是哪个**变体 (variant)**。 |
|
|
45
|
+
| `conversion` | 任何调用 `useConversion()` 的地方 | 将达成的目标(注册、点击、购买等)归因于该会话所暴露的 A/B 变体。 |
|
|
46
|
+
|
|
47
|
+
事件收集在内存中,并作为**大约每 20 秒一次的单一批量请求**发送 —— 而不是在每次击键或渲染时发送 —— 因此分析功能永远不会影响首次渲染时间,也不会在每次交互时增加网络请求。
|
|
48
|
+
|
|
49
|
+
## 它如何为内容的 A/B 测试提供支持
|
|
50
|
+
|
|
51
|
+
Intlayer 已经允许您声明内容 [变体 (Variants)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dynamic_dictionaries/index.md)(例如,一个具有 `control` 和 `black_friday` 变体的 `hero-banner` 字典)。`@intlayer/analytics` 完成了整个循环:
|
|
52
|
+
|
|
53
|
+
1. `getVariant(experimentKey, variants)` 确定性地将每个匿名会话分配给一个变体 —— 它是会话 ID 和实验键 (experiment key) 的纯函数,因此分配在**整个会话期间保持稳定**,并且在首次渲染之前**不需要服务器往返**(无闪烁,无布局偏移)。
|
|
54
|
+
2. 每个 `content_exposure` 事件都会携带所显示的 `variant`。
|
|
55
|
+
3. `useConversion()` 允许您将目标(例如 `"cta_click"`)归因于该变体。
|
|
56
|
+
4. 仪表板的实验结果端点 (endpoint) 比较各变体的转化率,包括统计显著性(z 检验)。
|
|
57
|
+
|
|
58
|
+
## 安装
|
|
59
|
+
|
|
60
|
+
`@intlayer/analytics` 是一个**对等 (peer)、可选**的依赖项 —— 框架包永远不会自动安装它。请将其与 `intlayer` 一起添加:
|
|
61
|
+
|
|
62
|
+
```bash packageManager="npm"
|
|
63
|
+
npm install @intlayer/analytics
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```bash packageManager="yarn"
|
|
67
|
+
yarn add @intlayer/analytics
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```bash packageManager="pnpm"
|
|
71
|
+
pnpm add @intlayer/analytics
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
```bash packageManager="bun"
|
|
75
|
+
bun add @intlayer/analytics
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
如果您不安装它,每个集成点都将解析为空操作 (no-op) —— 请参阅下文的[未安装时零成本](#未安装时零成本)。
|
|
79
|
+
|
|
80
|
+
## 配置
|
|
81
|
+
|
|
82
|
+
Analytics **重用了现有的 `editor` 配置块** —— 没有单独的 `analytics` 配置模式需要填写:
|
|
83
|
+
|
|
84
|
+
```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
|
|
85
|
+
import type { IntlayerConfig } from "intlayer";
|
|
86
|
+
|
|
87
|
+
const config: IntlayerConfig = {
|
|
88
|
+
editor: {
|
|
89
|
+
backendURL: "https://back.intlayer.org", // 也用作分析数据摄取端点
|
|
90
|
+
clientId: "your-client-id", // 也用作分析项目密钥
|
|
91
|
+
clientSecret: "your-client-secret",
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export default config;
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
- `editor.backendURL` — 发送分析事件的基本 URL (`POST {backendURL}/api/analytics/events`)。
|
|
99
|
+
- `editor.clientId` — 归因于每个摄取事件的公共项目密钥。它也充当**启用开关**:在配置 `clientId` 之前,分析将保持完全禁用(并被摇树优化去除,见下文)。
|
|
100
|
+
|
|
101
|
+
如果您自托管 Intlayer,分析会自动指向您自己的实例,因为它共享 `editor.backendURL`。
|
|
102
|
+
|
|
103
|
+
## 框架支持
|
|
104
|
+
|
|
105
|
+
Analytics 已连接到 `react-intlayer` 共享的 `IntlayerProvider` 中,因此今天只要使用该 provider 的任何地方都可以使用它:
|
|
106
|
+
|
|
107
|
+
| 框架 | 状态 |
|
|
108
|
+
| -------------------------------------------------------- | -------------------------------------------------------------------------- |
|
|
109
|
+
| React | ✅ 可用 |
|
|
110
|
+
| Next.js (`next-intlayer`) | ✅ 可用 (通过 `react-intlayer`) |
|
|
111
|
+
| React Native / Expo (`react-native-intlayer`) | ✅ 可用 (通过 `react-intlayer`) |
|
|
112
|
+
| Vue, Svelte, Angular, Solid, Preact, Lit, Astro, Vanilla | 🚧 计划中 — 相同的客户端,遵循 `@intlayer/editor` 推出模式的提供商级别绑定 |
|
|
113
|
+
|
|
114
|
+
## 使用方法
|
|
115
|
+
|
|
116
|
+
### 自动 Provider 级别跟踪
|
|
117
|
+
|
|
118
|
+
无需更改代码。一旦安装了 `@intlayer/analytics` 并配置了 `editor.clientId`,`IntlayerProvider` 会自动:
|
|
119
|
+
|
|
120
|
+
- 在挂载时初始化分析客户端,
|
|
121
|
+
- 在初始加载时记录一个 `page_view`,
|
|
122
|
+
- 在每次更改区域设置时记录一个 `page_view`,
|
|
123
|
+
- 启动约 20 秒的刷新循环,并在卸载/关闭选项卡时刷新任何剩余事件(通过 `navigator.sendBeacon`,回退至 `fetch(..., { keepalive: true })`)。
|
|
124
|
+
|
|
125
|
+
### 自动 Node 级别跟踪
|
|
126
|
+
|
|
127
|
+
每次 `useIntlayer` 解析用于显示的内容片段时,解释器都会为该确切的 `dictionaryKey` + 键路径 + 区域设置报告一个 `content_exposure` 事件 —— 同样,无需更改代码。在刷新窗口内同一节点的重复曝光会合并为一个带有 `count`(计数)的事件,因此重新渲染 50 次的列表不会发送 50 个事件。
|
|
128
|
+
|
|
129
|
+
### 跟踪 A/B 测试的转化
|
|
130
|
+
|
|
131
|
+
使用 `useConversion()` 将目标归因于会话看到的变体:
|
|
132
|
+
|
|
133
|
+
```tsx fileName="CTAButton.tsx" codeFormat="tsx"
|
|
134
|
+
import { useConversion } from "react-intlayer";
|
|
135
|
+
|
|
136
|
+
const CTAButton = () => {
|
|
137
|
+
const trackConversion = useConversion();
|
|
138
|
+
|
|
139
|
+
return (
|
|
140
|
+
<button
|
|
141
|
+
onClick={() =>
|
|
142
|
+
trackConversion({
|
|
143
|
+
experimentKey: "homepage-hero",
|
|
144
|
+
variant: "black_friday",
|
|
145
|
+
goal: "cta_click",
|
|
146
|
+
})
|
|
147
|
+
}
|
|
148
|
+
>
|
|
149
|
+
开始使用
|
|
150
|
+
</button>
|
|
151
|
+
);
|
|
152
|
+
};
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 在客户端解析变体
|
|
156
|
+
|
|
157
|
+
```tsx fileName="useHeroVariant.ts" codeFormat="tsx"
|
|
158
|
+
import { getGlobalAnalyticsClient } from "@intlayer/analytics/client";
|
|
159
|
+
|
|
160
|
+
const client = getGlobalAnalyticsClient();
|
|
161
|
+
const variant = client?.getVariant("homepage-hero", [
|
|
162
|
+
"control",
|
|
163
|
+
"black_friday",
|
|
164
|
+
]);
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## 隐私与性能
|
|
168
|
+
|
|
169
|
+
- **设计上匿名**:会话由轮换 ID 标识;后端永远只存储该 ID 的 **SHA-256 哈希值** —— 从不存储原始 ID,从不存储 IP 地址。
|
|
170
|
+
- **位置是粗略的**:只有一个国家/地区代码,该代码从 CDN 地理位置标头(`cf-ipcountry`、`x-vercel-ip-country` 等)派生 —— 不会读取或存储 IP。
|
|
171
|
+
- **默认情况下 URL 排除搜索参数**,因此永远不会捕获查询字符串。
|
|
172
|
+
- **采样**:`sampleRate` 允许您在高流量应用程序中仅保留一小部分内容曝光事件。
|
|
173
|
+
- **批处理**:大约每 20 秒发送一个请求 (`flushInterval`),或者如果缓冲区满了则提前发送 (`maxBufferSize`) —— 永远不会每个事件发送一个请求。
|
|
174
|
+
|
|
175
|
+
### 未安装时零成本
|
|
176
|
+
|
|
177
|
+
`@intlayer/analytics` 遵循与 `@intlayer/editor` 完全相同的可选依赖模式:
|
|
178
|
+
|
|
179
|
+
- 每个集成点通过**包裹在 `try/catch` 中的动态 `import()`** 加载包 —— 从未安装 `@intlayer/analytics` 的应用程序永远不会支付包大小或运行时成本,也永远不会看到错误;
|
|
180
|
+
- 一个编译时环境变量(`INTLAYER_ANALYTICS_ENABLED`),当没有配置 `editor.clientId` 时,它会由 `@intlayer/config` 自动设置为 `'false'`,允许打包器 (bundlers) **将整个集成作为死代码消除 (dead-code-eliminate)**;
|
|
181
|
+
- 分析在 Intlayer 编辑器/CMS 预览 iframe 中被禁用,因此编辑器会话永远不会算作真实流量。
|
|
182
|
+
|
|
183
|
+
## 仪表板:Analytics 页面
|
|
184
|
+
|
|
185
|
+
一旦您的项目收集了事件,[Intlayer 仪表板](https://app.intlayer.org/analytics) 中的 **Analytics(分析)** 页面(选择项目后在侧边栏中可见)会显示:
|
|
186
|
+
|
|
187
|
+
- **活跃用户** — 选定滚动窗口(7 / 30 / 90 天)内的独立访客。
|
|
188
|
+
- **今日用户** 和 **过去 7 天的用户**。
|
|
189
|
+
- 选定窗口内的 **页面浏览量**。
|
|
190
|
+
- 每日独立访客的 **演变图**。
|
|
191
|
+
- **区域设置 (Locales)** 和 **位置 (Location)** 细分选项卡,按区域设置和国家/地区对您的受众进行排名。
|
|
192
|
+
|
|
193
|
+
## 后端 API 参考
|
|
194
|
+
|
|
195
|
+
所有读取端点都需要身份验证;数据摄取是公开的,并且由主体中的 `clientId` 进行归因。
|
|
196
|
+
|
|
197
|
+
| 方法 (Method) | 端点 (Endpoint) | 描述 |
|
|
198
|
+
| ------------- | ------------------------------------------- | ---------------------------------------------------------- |
|
|
199
|
+
| `POST` | `/api/analytics/events` | 摄取一批事件(公开,由主体中的 `clientId` 归因)。 |
|
|
200
|
+
| `GET` | `/api/analytics/overview` | 认证项目的页面/区域设置总数。 |
|
|
201
|
+
| `GET` | `/api/analytics/audience?days=30` | 独立访客,页面浏览量,每日序列,区域设置 + 国家/地区分类。 |
|
|
202
|
+
| `GET` | `/api/analytics/content-stats` | 每个内容的曝光总数,按字典键 / 键路径 / 区域设置分组。 |
|
|
203
|
+
| `GET` | `/api/analytics/experiments/:experimentKey` | A/B 实验中每个变体的转化率和统计显著性。 |
|
|
204
|
+
|
|
205
|
+
您还可以使用 [CMS SDK](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_CMS.md) 以编程方式调用这些端点:
|
|
206
|
+
|
|
207
|
+
```ts fileName="analytics.ts"
|
|
208
|
+
import { createIntlayerCMS } from "@intlayer/api";
|
|
209
|
+
import { analyticsEndpoint } from "@intlayer/api/analytics";
|
|
210
|
+
|
|
211
|
+
const cms = createIntlayerCMS();
|
|
212
|
+
|
|
213
|
+
const { data: audience } = await analyticsEndpoint(cms).getAudience(30);
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## 有用的链接
|
|
217
|
+
|
|
218
|
+
- [动态字典 - 集合与变体 (Collections & Variants)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dynamic_dictionaries/index.md)
|
|
219
|
+
- [Intlayer CMS - CMS SDK](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_CMS.md)
|
|
220
|
+
- [Intlayer 可视化编辑器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_visual_editor.md)
|
|
221
|
+
- [配置参考](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)
|
|
222
|
+
- [自托管指南](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/self_hosting.md)
|
package/docs/zh/autoFill.md
CHANGED
|
@@ -75,11 +75,30 @@ Intlayer 还将考虑以下自动填充指令:
|
|
|
75
75
|
|
|
76
76
|
使用路径选项写入另一个文件时,填充机制通过内容声明文件之间的 _主从_ 关系工作。主(master)文件作为真实来源,当它被更新时,Intlayer 将自动将这些更改应用到由路径指定的派生(填充)声明文件。
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
### 按语言环境自定义
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
您也可以使用对象为每个语言环境自定义行为:
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
```ts fileName="intlayer.config.ts"
|
|
83
|
+
const config: IntlayerConfig = {
|
|
84
|
+
content: {
|
|
85
|
+
internationalization: {
|
|
86
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.POLISH],
|
|
87
|
+
defaultLocale: Locales.ENGLISH,
|
|
88
|
+
requiredLocales: [Locales.ENGLISH], // 建议设置以避免在 t 函数中出现"Property 'pl' is missing in type '{ en: string; xxx }"错误
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
dictionary: {
|
|
92
|
+
fill: {
|
|
93
|
+
en: true, // 为英文填充并编辑当前文件
|
|
94
|
+
fr: "./translations/fr.json", // 为法文创建单独的文件
|
|
95
|
+
es: false, // 禁用西班牙文的填充
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
这允许您在同一项目中为不同的语言环境设置不同的填充行为。
|
|
83
102
|
|
|
84
103
|
```ts fileName="src/components/example/example.content.ts"
|
|
85
104
|
import { Locales, type Dictionary } from "intlayer";
|
|
@@ -87,18 +106,18 @@ import { Locales, type Dictionary } from "intlayer";
|
|
|
87
106
|
const exampleContent = {
|
|
88
107
|
key: "example",
|
|
89
108
|
locale: Locales.ENGLISH,
|
|
90
|
-
|
|
109
|
+
fill: "./example.content.json",
|
|
91
110
|
content: {
|
|
92
|
-
contentExample: "
|
|
111
|
+
contentExample: "This is an example of content",
|
|
93
112
|
},
|
|
94
113
|
} satisfies Dictionary;
|
|
95
114
|
|
|
96
115
|
export default exampleContent;
|
|
97
116
|
```
|
|
98
117
|
|
|
99
|
-
|
|
118
|
+
这是一个[按语言环境的内容声明文件](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/per_locale_file.md),使用了 `fill` 指令。
|
|
100
119
|
|
|
101
|
-
|
|
120
|
+
然后,当您运行以下命令时:
|
|
102
121
|
|
|
103
122
|
```bash packageManager="npm"
|
|
104
123
|
npx intlayer fill --file 'src/components/example/example.content.ts'
|
|
@@ -116,7 +135,7 @@ pnpm intlayer fill --file 'src/components/example/example.content.ts'
|
|
|
116
135
|
bun x intlayer fill --file 'src/components/example/example.content.ts'
|
|
117
136
|
```
|
|
118
137
|
|
|
119
|
-
Intlayer
|
|
138
|
+
Intlayer 将自动在 `src/components/example/example.content.json` 生成派生声明文件,填充主文件中尚未声明的所有语言环境。
|
|
120
139
|
|
|
121
140
|
```json5 fileName="src/components/example/example.content.json"
|
|
122
141
|
{
|
|
@@ -133,7 +152,7 @@ Intlayer 将自动生成派生的声明文件,路径为 `src/components/exampl
|
|
|
133
152
|
}
|
|
134
153
|
```
|
|
135
154
|
|
|
136
|
-
|
|
155
|
+
之后,两个声明文件将被合并为一个单一字典,可以使用标准的 `useIntlayer("example")` hook (react) / composable (vue) 访问。
|
|
137
156
|
|
|
138
157
|
## 全局配置
|
|
139
158
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-11-25
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-08-09
|
|
4
4
|
title: 优化 i18n 打包体积与性能
|
|
5
5
|
description: 通过优化国际化(i18n)内容来减小应用程序包的大小。了解如何利用 Intlayer 实现字典的 tree shaking 和延迟加载(lazy loading)。
|
|
6
6
|
keywords:
|
|
@@ -16,6 +16,12 @@ slugs:
|
|
|
16
16
|
- concept
|
|
17
17
|
- bundle-optimization
|
|
18
18
|
history:
|
|
19
|
+
- version: 9.2.1
|
|
20
|
+
date: 2026-08-09
|
|
21
|
+
changes: "`purge` 和 `minify` 现在可通过 `@intlayer/swc` 在 Next.js 上工作 — 无需 `babel.config.js`"
|
|
22
|
+
- version: 8.12.0
|
|
23
|
+
date: 2026-06-24
|
|
24
|
+
changes: "在参考表中按所需的流水线顺序列出 Babel 插件(extract → purge → minify → optimize)"
|
|
19
25
|
- version: 8.12.0
|
|
20
26
|
date: 2026-06-07
|
|
21
27
|
changes: "为 Babel/Webpack 引入了 `intlayerPurgeBabelPlugin` 和 `intlayerMinifyBabelPlugin`,明确了插件管线"
|
|
@@ -191,12 +197,14 @@ Intlayer 的构建优化被划分为若干个职责单一的插件。了解它
|
|
|
191
197
|
|
|
192
198
|
这些被直接运用在基于 Webpack 设置的 `babel.config.js` 当中(比如使用了 Babel 的 Next.js、CRA,或是自定义的 Webpack 等)。
|
|
193
199
|
|
|
200
|
+
下表按所需的流水线顺序列出它们(与它们必须在 `babel.config.js` 中出现的顺序相同):
|
|
201
|
+
|
|
194
202
|
| 插件 | 功能说明 |
|
|
195
203
|
| :---------------------------- | :--------------------------------------------------------------------------------------------------- |
|
|
196
204
|
| `intlayerExtractBabelPlugin` | 扫描 `.content.ts` 文件并把编译好的字典写入 `.intlayer/` |
|
|
197
|
-
| `intlayerOptimizeBabelPlugin` | 将 `useIntlayer('key')` 重写为 `useDictionary(hash)` 并注入匹配对应字典的 `import` 语句 |
|
|
198
205
|
| `intlayerPurgeBabelPlugin` | 扫描所有源代码文件,从已编译的 `.intlayer/**/*.json` 字典文件中删除**未被使用的内容字段** |
|
|
199
206
|
| `intlayerMinifyBabelPlugin` | **重命名内容字段的键(keys)** 为简短的字母别名(例如 `title` 变成 `a`),作用范围包括 JSON 与源代码 |
|
|
207
|
+
| `intlayerOptimizeBabelPlugin` | 将 `useIntlayer('key')` 重写为 `useDictionary(hash)` 并注入匹配对应字典的 `import` 语句 |
|
|
200
208
|
|
|
201
209
|
> **插件的执行顺序很重要。** 在你的 `babel.config.js` 里,purge 和 minify 的插件必须放置在 optimize 插件**之前**。优化步骤(optimize)会把 `useIntlayer('key')` 替换为模糊的 `useDictionary(hash)`,此举抹除了能够让 purge 和 minify 识别哪些字段被使用过的字典 key 信息。
|
|
202
210
|
|
|
@@ -205,9 +213,9 @@ Intlayer 的构建优化被划分为若干个职责单一的插件。了解它
|
|
|
205
213
|
| 选项助手 | 配套插件 |
|
|
206
214
|
| :--------------------------- | :---------------------------- |
|
|
207
215
|
| `getExtractPluginOptions()` | `intlayerExtractBabelPlugin` |
|
|
208
|
-
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
209
216
|
| `getPurgePluginOptions()` | `intlayerPurgeBabelPlugin` |
|
|
210
217
|
| `getMinifyPluginOptions()` | `intlayerMinifyBabelPlugin` |
|
|
218
|
+
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
211
219
|
|
|
212
220
|
### Vite 插件 (`vite-intlayer`)
|
|
213
221
|
|
|
@@ -220,6 +228,20 @@ Vite 用户**不需要直接对它们进行配置**。当你在 `vite.config.ts`
|
|
|
220
228
|
| Dictionary minify | 等同于 `intlayerMinifyBabelPlugin` 的 JSON 写入步骤 |
|
|
221
229
|
| Babel transform | 等同于 `intlayerMinifyBabelPlugin` 的代码重命名步骤 + `intlayerOptimizeBabelPlugin` |
|
|
222
230
|
|
|
231
|
+
### SWC 插件(`@intlayer/swc`)
|
|
232
|
+
|
|
233
|
+
Next.js 用户同样**从不直接配置这些**。自 **v9.2.1** 起,`next.config.ts` 中的 `withIntlayer()` 仅凭 `build.purge` 和 `build.minify` 两个标志就会运行完整流水线 —— 清除、压缩和导入重写。
|
|
234
|
+
|
|
235
|
+
工作被分成两部分,因为 SWC Wasm 插件一次只转换一个文件,且无法访问文件系统:
|
|
236
|
+
|
|
237
|
+
| 阶段 | 运行位置 | 作用 |
|
|
238
|
+
| :--------------------------------- | :----------------------------- | :----------------------------------------------------------- |
|
|
239
|
+
| 使用分析 + JSON 清除/压缩 | Node,位于 `withIntlayer()` 内 | 读取每个组件源文件,重写 `.intlayer/**/*.json`,生成重命名表 |
|
|
240
|
+
| 源码重写(`content.title` → `.a`) | `@intlayer/swc`(Wasm) | 将重命名表应用到你代码中对应的属性访问 |
|
|
241
|
+
| 导入重写(`useIntlayer` → dict) | `@intlayer/swc`(Wasm) | 与 `intlayerOptimizeBabelPlugin` 相同 |
|
|
242
|
+
|
|
243
|
+
判断_哪些_字段未被使用以及每个字段获得_什么_别名,需要跨文件状态和文件 I/O,因此这一半在 Node 中运行;SWC 插件只接收生成的表。
|
|
244
|
+
|
|
223
245
|
## 各平台配置指南
|
|
224
246
|
|
|
225
247
|
<Tabs>
|
|
@@ -227,10 +249,12 @@ Vite 用户**不需要直接对它们进行配置**。当你在 `vite.config.ts`
|
|
|
227
249
|
|
|
228
250
|
### Next.js
|
|
229
251
|
|
|
230
|
-
Next.js
|
|
252
|
+
Next.js 需要 `@intlayer/swc` 插件,因为 Next.js 使用 SWC 进行构建。自 **v9.2.1** 起,这一个包即可覆盖整条流水线 —— 优化(导入重写)、清除和压缩。
|
|
231
253
|
|
|
232
254
|
> 该插件并未默认安装,因为 SWC 插件在 Next.js 当中目前仍处于实验阶段。未来这部分有可能会发生改变。
|
|
233
255
|
|
|
256
|
+
> **Next.js 16.1.0 是最低版本。** 它是首个基于 SWC 向前兼容 Wasm 插件 ABI 构建的版本;更早的版本会拒绝该插件。`withIntlayer` 会读取你项目的 Next.js 版本,低于 16.1.0 时干脆不注册该插件 —— 这些构建仍会成功,只是在没有打包优化的情况下运行。
|
|
257
|
+
|
|
234
258
|
<Tabs>
|
|
235
259
|
<Tab value="npm">
|
|
236
260
|
|
|
@@ -265,33 +289,40 @@ intlayer-swc-plugin = "*"
|
|
|
265
289
|
|
|
266
290
|
安装完毕后,Intlayer 将会自动侦测并使用该插件。
|
|
267
291
|
|
|
268
|
-
|
|
292
|
+
**清除和压缩**阶段(字段移除与字段重命名)不需要额外的包,也不需要 `babel.config.js`。用 `withIntlayer` 包裹你的配置,并在 `intlayer.config.ts` 中开启相应标志:
|
|
269
293
|
|
|
270
|
-
```
|
|
271
|
-
|
|
294
|
+
```typescript fileName="next.config.ts"
|
|
295
|
+
import { withIntlayer } from "next-intlayer/server";
|
|
296
|
+
import type { NextConfig } from "next";
|
|
297
|
+
|
|
298
|
+
const nextConfig: NextConfig = {/* 你的配置 */};
|
|
299
|
+
|
|
300
|
+
export default withIntlayer(nextConfig);
|
|
272
301
|
```
|
|
273
302
|
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
intlayerPurgeBabelPlugin,
|
|
277
|
-
intlayerMinifyBabelPlugin,
|
|
278
|
-
getPurgePluginOptions,
|
|
279
|
-
getMinifyPluginOptions,
|
|
280
|
-
} = require("@intlayer/babel");
|
|
303
|
+
```typescript fileName="intlayer.config.ts"
|
|
304
|
+
import type { IntlayerConfig } from "intlayer";
|
|
281
305
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
// Minify: 对 JSON 以及源代码里的内容字段的键(keys)进行重命名
|
|
288
|
-
[intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
|
|
289
|
-
// 注意: 在这里不需要使用 intlayerOptimizeBabelPlugin,因为
|
|
290
|
-
// @intlayer/swc 已经处理了 useIntlayer → useDictionary 的重写过程。
|
|
291
|
-
],
|
|
306
|
+
const config: IntlayerConfig = {
|
|
307
|
+
build: {
|
|
308
|
+
purge: true, // 从打包的 JSON 中移除未使用的内容字段
|
|
309
|
+
minify: true, // 将内容字段键重命名为简短别名
|
|
310
|
+
},
|
|
292
311
|
};
|
|
312
|
+
|
|
313
|
+
export default config;
|
|
293
314
|
```
|
|
294
315
|
|
|
316
|
+
在 `next build` 期间,`withIntlayer` 会分析你的源码、重写已编译的字典,并将生成的字段重命名表传给 `@intlayer/swc`,由它更新你代码中对应的属性访问。
|
|
317
|
+
|
|
318
|
+
> 请使用异步的 `withIntlayer`,而不是 `withIntlayerSync`。同步版本不会运行分析流水线,因此清除和压缩对它没有效果。
|
|
319
|
+
|
|
320
|
+
> 清除和压缩仅在 `next build` 时运行 —— 优化流水线在 `next dev` 期间是关闭的。
|
|
321
|
+
|
|
322
|
+
> 当配置了兼容适配器调用方时它们也会被禁用(`swcExtraCallers`,由 `@intlayer/next-intl`、`@intlayer/react-i18next` 等兼容包设置):这些调用点对使用分析器不可见,因此清除会移除代码仍在读取的字段。导入重写仍保持启用。
|
|
323
|
+
|
|
324
|
+
**更早的版本(9.2.1 之前)** 需要 `@intlayer/babel` 以及一个声明 `intlayerPurgeBabelPlugin` 和 `intlayerMinifyBabelPlugin` 的 `babel.config.js`。该文件不再需要,可以删除。
|
|
325
|
+
|
|
295
326
|
</Tab>
|
|
296
327
|
<Tab value="vite">
|
|
297
328
|
|
|
@@ -447,6 +478,8 @@ export default config;
|
|
|
447
478
|
|
|
448
479
|
> 如果在 `optimize` 被设为 `false`、又或是启用了可视化编辑器也就是当 `editor.enabled` 设定为了 `true` 时(由于编辑器需要保留字段名称以便做后续处理),重命名这个操作都将会被跳过。
|
|
449
480
|
|
|
481
|
+
> 在 Next.js 上,当 `@intlayer/swc` 未安装或无法加载时(Next.js 低于 16.1.0),压缩同样会被跳过。重写源码访问的正是这个插件,因此在没有它的情况下重命名字典,会让你的代码读取已不存在的字段名。
|
|
482
|
+
|
|
450
483
|
> 同理,如果是利用了 `importMode: 'fetch'` 来载入字段时此过程同样不适用。因为它们的内容会以原始命名由后端 API 所提供,对客户端内容随意重命名会破坏客户端与服务端的匹配契约。
|
|
451
484
|
|
|
452
485
|
### 字段清除 / Purging (去掉未被引用的字段内容)
|
|
@@ -475,7 +508,7 @@ export default config;
|
|
|
475
508
|
{ "title": "…", "subtitle": "…" }
|
|
476
509
|
```
|
|
477
510
|
|
|
478
|
-
> 与前边提到的类似,当 `optimize` 是 `false` 或是开启了可视化编辑器(`editor.enabled` 取值 `true`) 时,它会选择跳过对数据的清除操作。
|
|
511
|
+
> 与前边提到的类似,当 `optimize` 是 `false` 或是开启了可视化编辑器(`editor.enabled` 取值 `true`) 时,它会选择跳过对数据的清除操作。 在 Next.js 上,当 `@intlayer/swc` 不可用以及配置了兼容适配器调用方时,还会被额外跳过。
|
|
479
512
|
|
|
480
513
|
> 当检测到某份代码因为异常无法顺利解析、又或者当把由 `useIntlayer` 输出的值以静态解析器难以预测分析的模式在不同组件中来回丢(比如被打包成对象传入等而未被进行解构)的时候,它同样会跳过,以此保守地保留整部字典的全部信息,避免意外发生。
|
|
481
514
|
|
package/docs/zh/configuration.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-08-13
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-08-06
|
|
4
4
|
title: 配置
|
|
5
5
|
description: 了解如何为您的应用程序配置 Intlayer。了解可用于根据您的需求自定义 Intlayer 的各种设置和选项。
|
|
6
6
|
keywords:
|
|
@@ -14,6 +14,9 @@ slugs:
|
|
|
14
14
|
- concept
|
|
15
15
|
- configuration
|
|
16
16
|
history:
|
|
17
|
+
- version: 9.1.3
|
|
18
|
+
date: 2026-08-06
|
|
19
|
+
changes: "将 `routing.enableProxy` 改为三态:未设置(auto)、`true`、`false`"
|
|
17
20
|
- version: 9.0.0
|
|
18
21
|
date: 2026-07-11
|
|
19
22
|
changes: "添加 `analytics` 配置"
|
|
@@ -235,6 +238,18 @@ const config: IntlayerConfig = {
|
|
|
235
238
|
*/
|
|
236
239
|
mode: "prefix-no-default",
|
|
237
240
|
|
|
241
|
+
/**
|
|
242
|
+
* 启用 Intlayer 语言环境路由代理(中间件)。
|
|
243
|
+
* 负责在 dev、preview 和 SSR 中进行语言环境检测、重定向和重写。
|
|
244
|
+
* - 未设置(auto):dev 和 preview 服务器忽略 Cookie 和请求头中存储的语言环境,
|
|
245
|
+
* 保持路由由 URL 驱动。前缀仍会解析,语言环境仍会持久化,
|
|
246
|
+
* Accept-Language 检测仍然生效。生产环境下的行为与 `true` 相同。
|
|
247
|
+
* - true:在所有环境中启用完整行为。
|
|
248
|
+
* - false:不进行语言环境路由。
|
|
249
|
+
* 默认值:undefined(auto)
|
|
250
|
+
*/
|
|
251
|
+
enableProxy: undefined,
|
|
252
|
+
|
|
238
253
|
/**
|
|
239
254
|
* 用户选择的区域设置存储在哪里。
|
|
240
255
|
* 选项:'cookie', 'localStorage', 'sessionStorage', 'header' 或这些选项的数组。
|
|
@@ -716,13 +731,14 @@ export default config;
|
|
|
716
731
|
|
|
717
732
|
控制路由行为的设置,包括 URL 结构、区域设置存储和中间件管理。
|
|
718
733
|
|
|
719
|
-
| 字段
|
|
720
|
-
|
|
|
721
|
-
| `mode`
|
|
722
|
-
| `
|
|
723
|
-
| `
|
|
724
|
-
| `
|
|
725
|
-
| `
|
|
734
|
+
| 字段 | 说明 | 类型 | 默认值 | 示例 | 备注 |
|
|
735
|
+
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
736
|
+
| `mode` | 区域设置管理的 URL 路由模式。 | `'prefix-no-default'` | <br/> `'prefix-all'` | <br/> `'no-prefix'` | <br/> `'search-params'` | `'prefix-no-default'` | `'prefix-no-default'`: `/dashboard` (en) 或 `/fr/dashboard` (fr)。 `'prefix-all'`: `/en/dashboard` 。 `'no-prefix'`: 区域设置以其他方式管理。 `'search-params'`: `/dashboard?locale=fr` | 不影响 cookie 管理或本地存储。 |
|
|
737
|
+
| `enableProxy` | 启用 Intlayer 语言环境路由代理(中间件)。 | `boolean` | <br/> `undefined` | `undefined`(auto) | `true` | • 未设置(auto):dev 和 preview 服务器忽略 Cookie/请求头中存储的语言环境作为重定向来源;前缀、持久化和 `Accept-Language` 检测仍然生效。生产环境下的行为与 `true` 相同。<br/>• `true`:在任何地方都启用完整行为。<br/>• `false`:不进行语言环境路由。在 Next.js 中,`intlayerProxy` 中间件将变为直通。 |
|
|
738
|
+
| `storage` | 客户端区域设置存储的配置。 | `false` | <br/> `'cookie'` | <br/> `'localStorage'` | <br/> `'sessionStorage'` | <br/> `'header'` | <br/> `CookiesAttributes` | <br/> `StorageAttributes` | <br/> `Array` | `['cookie', 'header']` | `'localStorage'` <br/> `[{ type: 'cookie', name: 'custom-locale', secure: true }]` | 参阅下方的存储参数表。 |
|
|
739
|
+
| `basePath` | 应用程序 URL 的基础路径。 | `string` | `''` | `'/my-app'` | 如果您的应用程序位于 `https://example.com/my-app`,则 basePath 为 `'/my-app'`,指向 URL 为 `https://example.com/my-app/en` 。 |
|
|
740
|
+
| `rewrite` | 自定义 URL 重写规则,用于覆盖特定路径的默认路由模式。支持动态参数 `[param]`。 | `Record<string, StrictModeLocaleMap<string>>` | `undefined` | 见下方示例 | • 重写规则优先级高于 `mode`。<br/>• 与 Next.js 和 Vite 配合。 <br/>• `getLocalizedUrl()` 自动应用适当的规则。<br/>• 见 [自定义 URL 重写](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/custom_url_rewrites.md)。 |
|
|
741
|
+
| `domains` | 将区域设置映射到域主机名以进行基于域的路由。设置后,区域设置的 URL 将使用该域作为基础(绝对 URL),并且不会向路径添加区域设置前缀。 | `Partial<Record<Locale, string>>` | `undefined` | `{ zh: 'intlayer.zh', fr: 'intlayer.org' }` | • 如果主机名中未包含,默认协议为 `https://`。<br/>• 域本身标识区域设置,因此不会添加 `/zh/` 前缀。<br/>• `getLocalizedUrl('/', 'zh')` 返回 `https://intlayer.zh/`。 |
|
|
726
742
|
|
|
727
743
|
**`rewrite` 示例**:
|
|
728
744
|
|
|
@@ -25,6 +25,8 @@ author: aymericzip
|
|
|
25
25
|
|
|
26
26
|
# 文件内容 / 在 Intlayer 中嵌入文件
|
|
27
27
|
|
|
28
|
+
在 Intlayer 中,`file` 函数允许将外部文件内容嵌入到字典中。这种方法确保 Intlayer 识别源文件,从而与 Intlayer Visual Editor 和 CMS 实现无缝集成。
|
|
29
|
+
|
|
28
30
|
## 文件嵌入的工作原理
|
|
29
31
|
|
|
30
32
|
在 Intlayer 中,`file` 函数允许将外部文件内容嵌入到字典中。这种方法确保 Intlayer 识别源文件,实现与 Intlayer 可视化编辑器和 CMS 的无缝集成。与直接使用 `import`、`require` 或 `fs` 文件读取方法不同,使用 `file` 会将文件与字典关联,使 Intlayer 能够在文件被编辑时动态跟踪和更新内容。
|
|
@@ -64,6 +64,53 @@ export default firstDictionary;
|
|
|
64
64
|
}
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
+
### 使用 Nest 进行引用
|
|
68
|
+
|
|
69
|
+
现在,创建另一个内容模块,使用 `nest` 函数来引用上述内容。您可以引用整个内容或特定的嵌套值:
|
|
70
|
+
|
|
71
|
+
```typescript fileName="secondDictionary.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
72
|
+
import { nest, type Dictionary } from "intlayer";
|
|
73
|
+
|
|
74
|
+
const myNestingContent = {
|
|
75
|
+
key: "key_of_my_second_dictionary",
|
|
76
|
+
content: {
|
|
77
|
+
// 引用整个字典:
|
|
78
|
+
fullNestedContent: nest("key_of_my_first_dictionary"),
|
|
79
|
+
// 引用特定的嵌套值:
|
|
80
|
+
partialNestedContent: nest(
|
|
81
|
+
"key_of_my_first_dictionary",
|
|
82
|
+
"subContent.contentNumber"
|
|
83
|
+
),
|
|
84
|
+
},
|
|
85
|
+
} satisfies Dictionary;
|
|
86
|
+
|
|
87
|
+
export default myNestingContent;
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```json fileName="secondDictionary.content.json" contentDeclarationFormat="json"
|
|
91
|
+
{
|
|
92
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
93
|
+
"key": "key_of_my_second_dictionary",
|
|
94
|
+
"content": {
|
|
95
|
+
"fullNestedContent": {
|
|
96
|
+
"nodeType": "nested",
|
|
97
|
+
"nested": {
|
|
98
|
+
"dictionaryKey": "key_of_my_first_dictionary"
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"partialNestedContent": {
|
|
102
|
+
"nodeType": "nested",
|
|
103
|
+
"nested": {
|
|
104
|
+
"dictionaryKey": "key_of_my_first_dictionary",
|
|
105
|
+
"path": "subContent.contentNumber"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
作为第二个参数,您可以指定该内容中嵌套值的路径。如果未提供路径,则返回引用字典的全部内容。
|
|
113
|
+
|
|
67
114
|
## 设置嵌套
|
|
68
115
|
|
|
69
116
|
<Tabs group="framework">
|
|
@@ -258,36 +305,6 @@ document.getElementById("nested")!.textContent = content.partialNestedContent;
|
|
|
258
305
|
</Tab>
|
|
259
306
|
</Tabs>
|
|
260
307
|
|
|
261
|
-
## 在 React Intlayer 中使用嵌套
|
|
262
|
-
|
|
263
|
-
要在 React 组件中使用嵌套内容,可以利用 `react-intlayer` 包中的 `useIntlayer` 钩子。此钩子根据指定的键检索正确的内容。以下是如何使用它的示例:
|
|
264
|
-
|
|
265
|
-
```tsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]}
|
|
266
|
-
import type { FC } from "react";
|
|
267
|
-
import { useIntlayer } from "react-intlayer";
|
|
268
|
-
|
|
269
|
-
const NestComponent: FC = () => {
|
|
270
|
-
const { fullNestedContent, partialNestedContent } = useIntlayer(
|
|
271
|
-
"key_of_my_second_dictionary"
|
|
272
|
-
);
|
|
273
|
-
|
|
274
|
-
return (
|
|
275
|
-
<div>
|
|
276
|
-
<p>
|
|
277
|
-
Full Nested Content: {JSON.stringify(fullNestedContent)}
|
|
278
|
-
{/* 输出: {"content": "content", "subContent": {"contentNumber": 0, "contentString": "string"}} */}
|
|
279
|
-
</p>
|
|
280
|
-
<p>
|
|
281
|
-
Partial Nested Value: {partialNestedContent}
|
|
282
|
-
{/* 输出: 0 */}
|
|
283
|
-
</p>
|
|
284
|
-
</div>
|
|
285
|
-
);
|
|
286
|
-
};
|
|
287
|
-
|
|
288
|
-
export default NestComponent;
|
|
289
|
-
```
|
|
290
|
-
|
|
291
308
|
## 其他资源
|
|
292
309
|
|
|
293
310
|
有关配置和使用的更多详细信息,请参考以下资源:
|