@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
|
@@ -71,9 +71,284 @@ Intlayer 不仅仅是一个 i18n 解决方案,还提供了一个**自托管的
|
|
|
71
71
|
|
|
72
72
|
---
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
## 在 Vite 和 React 应用中分步设置 Intlayer 指南
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
<Tabs defaultTab="video">
|
|
77
|
+
<Tab label="Video" value="video">
|
|
78
|
+
|
|
79
|
+
<iframe title="The best i18n solution for Vite and React? Discover Intlayer" class="m-auto aspect-16/9 w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/dS9L7uJeak4?si=VaKmrYMmXjo3xpk2"/>
|
|
80
|
+
|
|
81
|
+
</Tab>
|
|
82
|
+
<Tab label="Code" value="code">
|
|
83
|
+
|
|
84
|
+
<iframe
|
|
85
|
+
src="https://ide.intlayer.org/aymericzip/intlayer-vite-react-template?file=intlayer.config.ts"
|
|
86
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
87
|
+
title="Demo CodeSandbox - How to Internationalize your application using Intlayer"
|
|
88
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
89
|
+
loading="lazy"
|
|
90
|
+
/>
|
|
91
|
+
|
|
92
|
+
</Tab>
|
|
93
|
+
<Tab label="Demo" value="demo">
|
|
94
|
+
|
|
95
|
+
<iframe
|
|
96
|
+
src="https://intlayer-vite-react-template.vercel.app"
|
|
97
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
98
|
+
title="Demo - intlayer-vite-react-template"
|
|
99
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
100
|
+
loading="lazy"
|
|
101
|
+
/>
|
|
102
|
+
|
|
103
|
+
</Tab>
|
|
104
|
+
</Tabs>
|
|
105
|
+
|
|
106
|
+
在 GitHub 上查看 [应用模板](https://github.com/aymericzip/intlayer-vite-react-template)。
|
|
107
|
+
|
|
108
|
+
<Steps>
|
|
109
|
+
|
|
110
|
+
<Step number={1} title="安装依赖项">
|
|
111
|
+
|
|
112
|
+
使用 npm 安装必要的包:
|
|
113
|
+
|
|
114
|
+
```bash packageManager="npm"
|
|
115
|
+
npx intlayer init --interactive
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
```bash packageManager="pnpm"
|
|
119
|
+
pnpm dlx intlayer@canary init --interactive
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
```bash packageManager="yarn"
|
|
123
|
+
yarn dlx intlayer@canary init --interactive
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
```bash packageManager="bun"
|
|
127
|
+
bunx intlayer@canary init --interactive
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
> `--interactive` 标志是可选的。如果你是 AI 代理,请使用 `intlayer-cli init`。
|
|
131
|
+
|
|
132
|
+
> 此命令将检测你的环境并安装所需的包。例如:
|
|
133
|
+
|
|
134
|
+
```bash packageManager="npm"
|
|
135
|
+
npm install intlayer react-intlayer
|
|
136
|
+
npm install vite-intlayer --save-dev
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
```bash packageManager="pnpm"
|
|
140
|
+
pnpm add intlayer react-intlayer
|
|
141
|
+
pnpm add vite-intlayer --save-dev
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
```bash packageManager="yarn"
|
|
145
|
+
yarn add intlayer react-intlayer
|
|
146
|
+
yarn add vite-intlayer --save-dev
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
```bash packageManager="bun"
|
|
150
|
+
bun add intlayer react-intlayer
|
|
151
|
+
bun add vite-intlayer --dev
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
- **intlayer**
|
|
155
|
+
核心包,为配置管理、翻译、[内容声明](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)提供国际化工具。
|
|
156
|
+
|
|
157
|
+
- **react-intlayer**
|
|
158
|
+
将 Intlayer 与 React 应用集成的包。它提供用于 React 国际化的上下文提供者和钩子。
|
|
159
|
+
|
|
160
|
+
- **vite-intlayer**
|
|
161
|
+
包含用于将 Intlayer 与 [Vite bundler](https://vite.dev/guide/why.html#why-bundle-for-production) 集成的 Vite 插件,以及用于检测用户首选语言区域、管理 cookie 和处理 URL 重定向的中间件。
|
|
162
|
+
|
|
163
|
+
</Step>
|
|
164
|
+
|
|
165
|
+
<Step number={2} title="配置你的项目">
|
|
166
|
+
|
|
167
|
+
创建配置文件以配置应用的语言:
|
|
168
|
+
|
|
169
|
+
```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
|
|
170
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
171
|
+
|
|
172
|
+
const config: IntlayerConfig = {
|
|
173
|
+
internationalization: {
|
|
174
|
+
locales: [
|
|
175
|
+
Locales.ENGLISH,
|
|
176
|
+
Locales.FRENCH,
|
|
177
|
+
Locales.SPANISH,
|
|
178
|
+
// 你的其他语言区域
|
|
179
|
+
],
|
|
180
|
+
defaultLocale: Locales.ENGLISH,
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
export default config;
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
> 通过此配置文件,你可以设置本地化 URL、中间件重定向、cookie 名称、内容声明的位置和扩展名、禁用控制台中的 Intlayer 日志等。有关可用参数的完整列表,请参阅 [配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)。
|
|
188
|
+
|
|
189
|
+
</Step>
|
|
190
|
+
|
|
191
|
+
<Step number={3} title="在 Vite 配置中集成 Intlayer">
|
|
192
|
+
|
|
193
|
+
将 intlayer 插件添加到你的配置中。
|
|
194
|
+
|
|
195
|
+
```typescript fileName="vite.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
|
|
196
|
+
import { defineConfig } from "vite";
|
|
197
|
+
import react from "@vitejs/plugin-react-swc";
|
|
198
|
+
import { intlayer } from "vite-intlayer";
|
|
199
|
+
|
|
200
|
+
// https://vitejs.dev/config/
|
|
201
|
+
export default defineConfig({
|
|
202
|
+
plugins: [react(), intlayer()],
|
|
203
|
+
});
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
> `intlayer()` Vite 插件用于将 Intlayer 与 Vite 集成。它确保构建内容声明文件,并在开发模式中监视它们。它在 Vite 应用中定义 Intlayer 环境变量。此外,它提供别名以优化性能。
|
|
207
|
+
|
|
208
|
+
</Step>
|
|
209
|
+
|
|
210
|
+
<Step number={4} title="声明你的内容">
|
|
211
|
+
|
|
212
|
+
创建和管理你的内容声明以存储翻译:
|
|
213
|
+
|
|
214
|
+
```tsx fileName="src/app.content.tsx" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
215
|
+
import { t, type Dictionary } from "intlayer";
|
|
216
|
+
import type { ReactNode } from "react";
|
|
217
|
+
|
|
218
|
+
const appContent = {
|
|
219
|
+
key: "app",
|
|
220
|
+
content: {
|
|
221
|
+
viteLogo: t({
|
|
222
|
+
zh: "Vite 徽标",
|
|
223
|
+
en: "Vite logo",
|
|
224
|
+
fr: "Logo Vite",
|
|
225
|
+
es: "Logo Vite",
|
|
226
|
+
}),
|
|
227
|
+
reactLogo: t({
|
|
228
|
+
zh: "React 徽标",
|
|
229
|
+
en: "React logo",
|
|
230
|
+
fr: "Logo React",
|
|
231
|
+
es: "Logo React",
|
|
232
|
+
}),
|
|
233
|
+
|
|
234
|
+
title: "Vite + React",
|
|
235
|
+
|
|
236
|
+
count: t({
|
|
237
|
+
zh: "计数是 ",
|
|
238
|
+
en: "count is ",
|
|
239
|
+
fr: "le compte est ",
|
|
240
|
+
es: "el recuento es ",
|
|
241
|
+
}),
|
|
242
|
+
|
|
243
|
+
edit: t<ReactNode>({
|
|
244
|
+
zh: (
|
|
245
|
+
<>
|
|
246
|
+
编辑 <code>src/App.tsx</code> 并保存以测试 HMR
|
|
247
|
+
</>
|
|
248
|
+
),
|
|
249
|
+
en: (
|
|
250
|
+
<>
|
|
251
|
+
Edit <code>src/App.tsx</code> and save to test HMR
|
|
252
|
+
</>
|
|
253
|
+
),
|
|
254
|
+
fr: (
|
|
255
|
+
<>
|
|
256
|
+
Éditez <code>src/App.tsx</code> et enregistrez pour tester HMR
|
|
257
|
+
</>
|
|
258
|
+
),
|
|
259
|
+
es: (
|
|
260
|
+
<>
|
|
261
|
+
Edita <code>src/App.tsx</code> y guarda para probar HMR
|
|
262
|
+
</>
|
|
263
|
+
),
|
|
264
|
+
}),
|
|
265
|
+
|
|
266
|
+
readTheDocs: t({
|
|
267
|
+
zh: "点击 Vite 和 React 徽标了解更多信息",
|
|
268
|
+
en: "Click on the Vite and React logos to learn more",
|
|
269
|
+
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
270
|
+
es: "Haga clic en los logotipos de Vite y React para obtener más información",
|
|
271
|
+
}),
|
|
272
|
+
},
|
|
273
|
+
} satisfies Dictionary;
|
|
274
|
+
|
|
275
|
+
export default appContent;
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
```json fileName="src/app.content.json" contentDeclarationFormat="json"
|
|
279
|
+
{
|
|
280
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
281
|
+
"key": "app",
|
|
282
|
+
"content": {
|
|
283
|
+
"viteLogo": {
|
|
284
|
+
"nodeType": "translation",
|
|
285
|
+
"translation": {
|
|
286
|
+
"zh": "Vite 徽标",
|
|
287
|
+
"en": "Vite logo",
|
|
288
|
+
"fr": "Logo Vite",
|
|
289
|
+
"es": "Logo Vite"
|
|
290
|
+
}
|
|
291
|
+
},
|
|
292
|
+
"reactLogo": {
|
|
293
|
+
"nodeType": "translation",
|
|
294
|
+
"translation": {
|
|
295
|
+
"zh": "React 徽标",
|
|
296
|
+
"en": "React logo",
|
|
297
|
+
"fr": "Logo React",
|
|
298
|
+
"es": "Logo React"
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
"title": {
|
|
302
|
+
"nodeType": "translation",
|
|
303
|
+
"translation": {
|
|
304
|
+
"zh": "Vite + React",
|
|
305
|
+
"en": "Vite + React",
|
|
306
|
+
"fr": "Vite + React",
|
|
307
|
+
"es": "Vite + React"
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
"count": {
|
|
311
|
+
"nodeType": "translation",
|
|
312
|
+
"translation": {
|
|
313
|
+
"zh": "计数是 ",
|
|
314
|
+
"en": "count is ",
|
|
315
|
+
"fr": "le compte est ",
|
|
316
|
+
"es": "el recuento es "
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
"edit": {
|
|
320
|
+
"nodeType": "translation",
|
|
321
|
+
"translation": {
|
|
322
|
+
"zh": "编辑 src/App.tsx 并保存以测试 HMR",
|
|
323
|
+
"en": "Edit src/App.tsx and save to test HMR",
|
|
324
|
+
"fr": "Éditez src/App.tsx et enregistrez pour tester HMR",
|
|
325
|
+
"es": "Edita src/App.tsx y guarda para probar HMR"
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
"readTheDocs": {
|
|
329
|
+
"nodeType": "translation",
|
|
330
|
+
"translation": {
|
|
331
|
+
"zh": "点击 Vite 和 React 徽标了解更多信息",
|
|
332
|
+
"en": "Click on the Vite and React logos to learn more",
|
|
333
|
+
"fr": "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
334
|
+
"es": "Haga clic en los logotipos de Vite y React para obtener más información"
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
> 你的内容声明可以定义在应用的任何地方,只要它们包含在 `contentDir` 目录中(默认为 `./src`)。并匹配内容声明文件扩展名(默认为 `.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}`)。
|
|
342
|
+
|
|
343
|
+
> 有关更多详细信息,请参阅 [内容声明文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/content_file.md)。
|
|
344
|
+
|
|
345
|
+
> 如果你的内容文件包含 TSX 代码,你应该考虑在内容文件中导入 `import React from "react";`。
|
|
346
|
+
|
|
347
|
+
</Step>
|
|
348
|
+
|
|
349
|
+
<Step number={5} title="在代码中使用 Intlayer">
|
|
350
|
+
|
|
351
|
+
在整个应用中访问你的内容字典:
|
|
77
352
|
|
|
78
353
|
```tsx {5,9} fileName="src/App.tsx" codeFormat={["typescript", "esm"]}
|
|
79
354
|
import { useState, type FC } from "react";
|
|
@@ -122,7 +397,7 @@ const App: FC = () => (
|
|
|
122
397
|
export default App;
|
|
123
398
|
```
|
|
124
399
|
|
|
125
|
-
>
|
|
400
|
+
> 如果你想在 `string` 属性中使用你的内容,例如 `alt`、`title`、`href`、`aria-label` 等,你可以使用函数的值,如下所示:
|
|
126
401
|
|
|
127
402
|
> ```html
|
|
128
403
|
> <img src="{content.image.src.value}" alt="{content.image.value}" />
|
|
@@ -130,15 +405,15 @@ export default App;
|
|
|
130
405
|
> <img src="{String(content.image.src)}" alt="{String(content.image)}" />
|
|
131
406
|
> ```
|
|
132
407
|
|
|
133
|
-
>
|
|
408
|
+
> 要了解更多关于 `useIntlayer` 钩子的信息,请参阅 [文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useIntlayer.md)。
|
|
134
409
|
|
|
135
|
-
>
|
|
410
|
+
> 如果你的应用已经存在,你可以使用 [Intlayer 编译器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/compiler.md)以及 [extract 命令](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/extract.md)在瞬间转换数千个组件。
|
|
136
411
|
|
|
137
|
-
|
|
412
|
+
</Step>
|
|
138
413
|
|
|
139
|
-
<Step number={6} title="更改内容的语言">
|
|
414
|
+
<Step number={6} title="更改内容的语言" isOptional={true}>
|
|
140
415
|
|
|
141
|
-
|
|
416
|
+
要更改内容的语言,你可以使用 `useLocale` 钩子提供的 `setLocale` 函数。此函数允许你设置应用的语言区域并相应地更新内容。
|
|
142
417
|
|
|
143
418
|
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat={["typescript", "esm"]}
|
|
144
419
|
import type { FC } from "react";
|
|
@@ -149,19 +424,21 @@ const LocaleSwitcher: FC = () => {
|
|
|
149
424
|
const { setLocale } = useLocale();
|
|
150
425
|
|
|
151
426
|
return (
|
|
152
|
-
<button onClick={() => setLocale(Locales.English)}
|
|
427
|
+
<button onClick={() => setLocale(Locales.English)}>
|
|
428
|
+
Change Language to English
|
|
429
|
+
</button>
|
|
153
430
|
);
|
|
154
431
|
};
|
|
155
432
|
```
|
|
156
433
|
|
|
157
|
-
>
|
|
434
|
+
> 要了解更多关于 `useLocale` 钩子的信息,请参阅 [文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useLocale.md)。
|
|
158
435
|
|
|
159
436
|
</Step>
|
|
160
437
|
|
|
161
|
-
<Step number={7} title="
|
|
438
|
+
<Step number={7} title="将本地化路由添加到你的应用" isOptional={true}>
|
|
162
439
|
|
|
163
|
-
此步骤的目的是为每种语言创建唯一的路由。这对于 SEO 和 SEO 友好的 URL
|
|
164
|
-
|
|
440
|
+
此步骤的目的是为每种语言创建唯一的路由。这对于 SEO 和 SEO 友好的 URL 很有用。
|
|
441
|
+
例如:
|
|
165
442
|
|
|
166
443
|
```plaintext
|
|
167
444
|
- https://example.com/about
|
|
@@ -169,31 +446,31 @@ const LocaleSwitcher: FC = () => {
|
|
|
169
446
|
- https://example.com/fr/about
|
|
170
447
|
```
|
|
171
448
|
|
|
172
|
-
>
|
|
449
|
+
> 默认情况下,默认语言区域的路由没有前缀。如果你想为默认语言区域加前缀,你可以在配置中设置 `middleware.prefixDefault` 选项为 `true`。有关更多信息,请参阅 [配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)。
|
|
173
450
|
|
|
174
|
-
|
|
451
|
+
要将本地化路由添加到你的应用,你可以创建一个 `LocaleRouter` 组件,该组件包装你应用的路由并处理基于语言区域的路由。以下是使用 [React Router](https://reactrouter.com/home) 的示例:
|
|
175
452
|
|
|
176
453
|
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat={["typescript", "esm"]}
|
|
177
454
|
import { localeMap } from "intlayer"; // 来自 'intlayer' 的实用函数和类型
|
|
178
|
-
import type { FC, PropsWithChildren } from "react"; // React
|
|
179
|
-
import { IntlayerProvider } from "react-intlayer"; //
|
|
180
|
-
import { BrowserRouter, Route, Routes } from "react-router-dom"; //
|
|
455
|
+
import type { FC, PropsWithChildren } from "react"; // React 功能组件和 props 的类型
|
|
456
|
+
import { IntlayerProvider } from "react-intlayer"; // 国际化上下文的提供者
|
|
457
|
+
import { BrowserRouter, Route, Routes } from "react-router-dom"; // 用于管理导航的路由器组件
|
|
181
458
|
|
|
182
459
|
/**
|
|
183
|
-
*
|
|
184
|
-
* 它使用 React Router
|
|
460
|
+
* 设置特定于语言区域的路由的路由器组件。
|
|
461
|
+
* 它使用 React Router 来管理导航和渲染本地化的组件。
|
|
185
462
|
*/
|
|
186
463
|
export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
187
464
|
<BrowserRouter>
|
|
188
465
|
<Routes>
|
|
189
466
|
{localeMap(({ locale, urlPrefix }) => (
|
|
190
467
|
<Route
|
|
191
|
-
//
|
|
468
|
+
// 路由模式以捕获语言区域(例如 /en/、/fr/)并匹配所有后续路径
|
|
192
469
|
path={`${urlPrefix}/*`}
|
|
193
470
|
key={locale}
|
|
194
471
|
element={
|
|
195
472
|
<IntlayerProvider locale={locale}>{children}</IntlayerProvider>
|
|
196
|
-
} //
|
|
473
|
+
} // 用语言区域管理包装子元素
|
|
197
474
|
/>
|
|
198
475
|
))}
|
|
199
476
|
</Routes>
|
|
@@ -201,9 +478,9 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
201
478
|
);
|
|
202
479
|
```
|
|
203
480
|
|
|
204
|
-
>
|
|
481
|
+
> 注意:如果你使用 `routing.mode: 'no-prefix' | 'search-params'`,你可能不需要使用 `localeMap` 函数。
|
|
205
482
|
|
|
206
|
-
|
|
483
|
+
然后,你可以在应用中使用 `LocaleRouter` 组件:
|
|
207
484
|
|
|
208
485
|
```tsx fileName="src/App.tsx" codeFormat={["typescript", "esm"]}
|
|
209
486
|
import { LocaleRouter } from "./components/LocaleRouter";
|
|
@@ -218,9 +495,11 @@ const App: FC = () => (
|
|
|
218
495
|
);
|
|
219
496
|
```
|
|
220
497
|
|
|
221
|
-
|
|
498
|
+
同时,你还可以使用 `intlayerProxy` 为你的应用添加服务端路由。此插件将根据 URL 自动检测当前语言区域并设置适当的语言区域 cookie。如果未指定语言区域,该插件将根据用户的浏览器语言偏好确定最合适的语言区域。如果未检测到语言区域,它将重定向到默认语言区域。
|
|
499
|
+
|
|
500
|
+
> 注意,要在生产环境中使用 `intlayerProxy`,你需要将 `vite-intlayer` 包从 `devDependencies` 转移到 `dependencies`。
|
|
222
501
|
|
|
223
|
-
>
|
|
502
|
+
> 从 Intlayer v9 开始,`intlayerProxy()` 被直接捆绑到 `intlayer()` 插件中,并通过 `routing.enableProxy` 选项(默认为 `true`)启用。如下所示单独注册现在是可选的 — 为了向后兼容和需要控制插件顺序的设置而保留。设置 `routing.enableProxy: false` 以选择退出。请参阅 [v9 发布说明](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/releases/v9.md)。
|
|
224
503
|
|
|
225
504
|
```typescript {3,7} fileName="vite.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
|
|
226
505
|
import { defineConfig } from "vite";
|
|
@@ -242,9 +521,9 @@ export default defineConfig({
|
|
|
242
521
|
|
|
243
522
|
</Step>
|
|
244
523
|
|
|
245
|
-
<Step number={8} title="
|
|
524
|
+
<Step number={8} title="当语言区域改变时改变 URL" isOptional={true}>
|
|
246
525
|
|
|
247
|
-
|
|
526
|
+
要在语言区域改变时改变 URL,你可以使用 `useLocale` 钩子提供的 `onLocaleChange` 属性。同时,你可以使用 `react-router-dom` 中的 `useLocation` 和 `useNavigate` 钩子来更新 URL 路径。
|
|
248
527
|
|
|
249
528
|
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat={["typescript", "esm"]}
|
|
250
529
|
import { useLocation, useNavigate } from "react-router-dom";
|
|
@@ -258,13 +537,13 @@ import { useLocale } from "react-intlayer";
|
|
|
258
537
|
import { type FC } from "react";
|
|
259
538
|
|
|
260
539
|
const LocaleSwitcher: FC = () => {
|
|
261
|
-
const { pathname, search } = useLocation(); //
|
|
540
|
+
const { pathname, search } = useLocation(); // 获取当前 URL 路径。例如:/fr/about?foo=bar
|
|
262
541
|
const navigate = useNavigate();
|
|
263
542
|
|
|
264
543
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
265
544
|
onLocaleChange: (locale) => {
|
|
266
|
-
//
|
|
267
|
-
//
|
|
545
|
+
// 使用更新后的语言区域构造 URL
|
|
546
|
+
// 例如:/es/about?foo=bar
|
|
268
547
|
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
269
548
|
|
|
270
549
|
// 更新 URL 路径
|
|
@@ -288,19 +567,19 @@ const LocaleSwitcher: FC = () => {
|
|
|
288
567
|
key={localeItem}
|
|
289
568
|
>
|
|
290
569
|
<span>
|
|
291
|
-
{/*
|
|
570
|
+
{/* 语言区域 - 例如 FR */}
|
|
292
571
|
{localeItem}
|
|
293
572
|
</span>
|
|
294
573
|
<span>
|
|
295
|
-
{/*
|
|
574
|
+
{/* 使用其自己的语言区域的语言 - 例如 Français */}
|
|
296
575
|
{getLocaleName(localeItem, locale)}
|
|
297
576
|
</span>
|
|
298
577
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
299
|
-
{/*
|
|
578
|
+
{/* 使用当前语言区域的语言 - 例如当前语言区域设置为 Locales.SPANISH 时的 Francés */}
|
|
300
579
|
{getLocaleName(localeItem)}
|
|
301
580
|
</span>
|
|
302
581
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
303
|
-
{/*
|
|
582
|
+
{/* 英文中的语言 - 例如 French */}
|
|
304
583
|
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
305
584
|
</span>
|
|
306
585
|
</a>
|
|
@@ -318,25 +597,25 @@ const LocaleSwitcher: FC = () => {
|
|
|
318
597
|
> - [`getLocalizedUrl` 钩子](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/intlayer/getLocalizedUrl.md)
|
|
319
598
|
> - [`getHTMLTextDir` 钩子](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/intlayer/getHTMLTextDir.md)
|
|
320
599
|
> - [`hrefLang` 属性](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=fr)
|
|
321
|
-
> - [`lang` 属性](https://developer.mozilla.org/
|
|
322
|
-
> - [`dir` 属性](https://developer.mozilla.org/
|
|
323
|
-
> - [`aria-current` 属性](https://developer.mozilla.org/
|
|
600
|
+
> - [`lang` 属性](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)
|
|
601
|
+
> - [`dir` 属性](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir)
|
|
602
|
+
> - [`aria-current` 属性](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)
|
|
324
603
|
|
|
325
|
-
|
|
604
|
+
以下是更新的 **步骤 9**,包含添加的解释和精炼的代码示例:
|
|
326
605
|
|
|
327
606
|
---
|
|
328
607
|
|
|
329
608
|
</Step>
|
|
330
609
|
|
|
331
|
-
<Step number={9} title="切换HTML
|
|
610
|
+
<Step number={9} title="切换 HTML 语言和方向属性" isOptional={true}>
|
|
332
611
|
|
|
333
|
-
|
|
612
|
+
当你的应用支持多种语言时,至关重要的是更新 `<html>` 标签的 `lang` 和 `dir` 属性以匹配当前语言区域。这样做可以确保:
|
|
334
613
|
|
|
335
|
-
-
|
|
336
|
-
- **文本渲染**:`dir
|
|
337
|
-
-
|
|
614
|
+
- **可访问性**:屏幕阅读器和辅助技术依赖于正确的 `lang` 属性来准确发音和解释内容。
|
|
615
|
+
- **文本渲染**:`dir`(方向)属性确保文本以适当的顺序呈现(例如,英文为从左到右,阿拉伯文或希伯来文为从右到左),这对于可读性至关重要。
|
|
616
|
+
- **SEO**:搜索引擎使用 `lang` 属性来确定你的页面的语言,帮助在搜索结果中提供正确的本地化内容。
|
|
338
617
|
|
|
339
|
-
|
|
618
|
+
通过在语言区域改变时动态更新这些属性,你可以为所有支持的语言的用户保证一致和可访问的体验。
|
|
340
619
|
|
|
341
620
|
#### 实现该 Hook
|
|
342
621
|
|