@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
package/docs/uk/live-sync.md
CHANGED
|
@@ -24,26 +24,9 @@ history:
|
|
|
24
24
|
author: aymericzip
|
|
25
25
|
---
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
# Документація Hook useDictionary
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
```tsx fileName="./ComponentExample.tsx" codeFormat={["typescript", "esm"]}
|
|
32
|
-
import type { FC } from "react";
|
|
33
|
-
import { useDictionary } from "react-intlayer";
|
|
34
|
-
import componentContent from "./component.content";
|
|
35
|
-
|
|
36
|
-
const ComponentExample: FC = () => {
|
|
37
|
-
const { title, content } = useDictionary(componentContent);
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<div>
|
|
41
|
-
<h1>{title}</h1>
|
|
42
|
-
<p>{content}</p>
|
|
43
|
-
</div>
|
|
44
|
-
);
|
|
45
|
-
};
|
|
46
|
-
```
|
|
29
|
+
Hook `useDictionary` дозволяє обробляти об'єкт, який виглядає як словник (містить ключі та вміст) та обробляти переклади, перелічення тощо всередині нього. На відміну від `useIntlayer`, який призначений для роботи з генерованими деклараціями словників, `useDictionary` є більш гнучким і може використовуватися з будь-яким об'єктом, що відповідає структурі словника.
|
|
47
30
|
|
|
48
31
|
## Інтеграція на сервері
|
|
49
32
|
|
|
@@ -48,3 +48,18 @@ import "vite-intlayer";
|
|
|
48
48
|
| `intlayerProxy` | Плагін middleware для розробки, що обробляє визначення локалі та маршрутизацію. | - |
|
|
49
49
|
| `intlayerMiddleware` | (**Застарілий**) Аліас для `intlayerProxy`. | - |
|
|
50
50
|
| `intlayerPrune` | Плагін для tree-shake та видалення невикористаних словників під час збірки. | [intlayerPrune](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/vite-intlayer/intlayerPrune.md) |
|
|
51
|
+
|
|
52
|
+
### Утиліти
|
|
53
|
+
|
|
54
|
+
| Export | Опис | Пов'язана документація |
|
|
55
|
+
| ---------------------------- | -------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
56
|
+
| `createIntlayerProxyHandler` | Повертає framework-agnostic Node.js `(req, res, next)` middleware з логікою маршрутизації локалей. | [intlayerProxy](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/vite-intlayer/intlayerProxy.md) |
|
|
57
|
+
|
|
58
|
+
### Типи
|
|
59
|
+
|
|
60
|
+
| Export | Опис |
|
|
61
|
+
| ---------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
|
62
|
+
| `IntlayerPluginOptions` | Параметри, прийняті `intlayer()`. Розширює `GetConfigurationOptions` за допомогою `compatCallers` та `proxy`. |
|
|
63
|
+
| `IntlayerProxyPluginOptions` | Параметри, прийняті `intlayerProxy()` та `createIntlayerProxyHandler()`. Включає `ignore` та `configOptions`. |
|
|
64
|
+
| `IntlayerCompilerOptions` | Параметри, прийняті `intlayerCompiler()`. Включає `configOptions` та `compilerConfig`. |
|
|
65
|
+
| `CompatCallerConfig` | Re-export з `@intlayer/babel`. Описує compat-adapter caller pattern для аналізу field-usage. |
|
|
@@ -39,11 +39,126 @@ export default defineConfig({
|
|
|
39
39
|
});
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
##
|
|
42
|
+
## Опції
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
```ts
|
|
45
|
+
import type { IntlayerPluginOptions } from "vite-intlayer";
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`IntlayerPluginOptions` розширює `GetConfigurationOptions` (див. `@intlayer/config`) з наступними додатковими полями:
|
|
49
|
+
|
|
50
|
+
| Опція | Тип | За замовчуванням | Опис |
|
|
51
|
+
| --------------- | ------------------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
52
|
+
| `compatCallers` | `CompatCallerConfig[]` | `[]` | Додаткові шаблони для пакетів compat-adapter (наприклад `@intlayer/react-i18next`). Передаються до аналізатора використання полів під час збирання. |
|
|
53
|
+
| `proxy` | `{ ignore?: (req) => boolean }` | `undefined` | Опції, передані до вбудованого проксі маршрутизації локалі. Використовуйте `ignore`, щоб виключити певні шляхи (наприклад маршрути API) із маршрутизації локалі. |
|
|
54
|
+
|
|
55
|
+
Усі інші опції (`override`, `configFile`, …) передаються безпосередньо до `getConfiguration()`.
|
|
56
|
+
|
|
57
|
+
### Приклади
|
|
58
|
+
|
|
59
|
+
#### Ігнорування маршрутів API від маршрутизації локалі
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
// vite.config.ts
|
|
63
|
+
import { defineConfig } from "vite";
|
|
64
|
+
import { intlayer } from "vite-intlayer";
|
|
65
|
+
|
|
66
|
+
export default defineConfig({
|
|
67
|
+
plugins: [
|
|
68
|
+
intlayer({
|
|
69
|
+
proxy: {
|
|
70
|
+
ignore: (req) => req.url?.startsWith("/api"),
|
|
71
|
+
},
|
|
72
|
+
}),
|
|
73
|
+
],
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
#### З користувацьким шляхом до файлу конфігурації
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
export default defineConfig({
|
|
81
|
+
plugins: [
|
|
82
|
+
intlayer({
|
|
83
|
+
configFile: "./config/intlayer.config.ts",
|
|
84
|
+
}),
|
|
85
|
+
],
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
#### З compat-adapter callers
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
import { intlayer } from "vite-intlayer";
|
|
93
|
+
import { reactI18nextCallerConfig } from "@intlayer/react-i18next/plugin";
|
|
94
|
+
|
|
95
|
+
export default defineConfig({
|
|
96
|
+
plugins: [
|
|
97
|
+
intlayer({
|
|
98
|
+
compatCallers: [reactI18nextCallerConfig],
|
|
99
|
+
}),
|
|
100
|
+
],
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Що робить плагін
|
|
105
|
+
|
|
106
|
+
### 1. Підготовка словника
|
|
107
|
+
|
|
108
|
+
Перед початком збірки (та один раз на годину в режимі розробки), `intlayer` викликає `prepareIntlayer` для компіляції всіх файлів `.content.ts` в оптимізовані JSON-словники, які зберігаються в `.intlayer/`.
|
|
109
|
+
|
|
110
|
+
### 2. Module aliases
|
|
111
|
+
|
|
112
|
+
Плагін додає Vite resolve aliases, щоб `import { myDict } from 'intlayer/dictionaries/my-dict'` розв'язувався до скомпільованого JSON файлу на диску. SSR builds використовують `ssr.noExternal`, щоб забезпечити, що всі пакети `@intlayer/*` об'єднані з застосованими aliases.
|
|
113
|
+
|
|
114
|
+
### 3. Dev-server watcher
|
|
115
|
+
|
|
116
|
+
У режимі розробки запускається `chokidar` watcher. Коли змінюється файл `.content.ts`, словники перекомпілюються, а Vite's HMR поширює оновлення на браузер.
|
|
117
|
+
|
|
118
|
+
### 4. Bundled locale-routing proxy (v9+)
|
|
119
|
+
|
|
120
|
+
З версії Intlayer v9 middleware `intlayerProxy` реєструється автоматично всередині `intlayer()`. Він обробляє:
|
|
121
|
+
|
|
122
|
+
- Визначення локалі за префіксом URL, cookies та заголовком `Accept-Language`.
|
|
123
|
+
- 301 переспрямування, коли визначена локаль не відповідає поточному URL.
|
|
124
|
+
- Внутрішні переписування URL, щоб framework бачив правильний параметр маршруту `[locale]`.
|
|
125
|
+
|
|
126
|
+
Proxy керується параметром `routing.enableProxy` (за замовчуванням `true`) у конфігурації Intlayer. Щоб повністю відключити його:
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
// intlayer.config.ts
|
|
130
|
+
import { defineConfig } from "intlayer";
|
|
131
|
+
|
|
132
|
+
export default defineConfig({
|
|
133
|
+
routing: { enableProxy: false },
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Щоб налаштувати поведінку proxy без окремого виклику `intlayerProxy()`, передайте опції `proxy` до основного плагіна:
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
intlayer({ proxy: { ignore: (req) => req.url?.startsWith("/api") } });
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Див. [документацію intlayerProxy](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/vite-intlayer/intlayerProxy.md) для повного довідника поведінки маршрутизації.
|
|
144
|
+
|
|
145
|
+
### 5. Bundled compiler (v9+)
|
|
146
|
+
|
|
147
|
+
Коли `compiler.enabled` має значення `true` **та** `compiler.output` встановлено у вашій конфігурації Intlayer, `intlayer()` автоматично реєструє `intlayerCompiler`. Компілятор витягує вбудовані декларації контенту, написані безпосередньо у файлах компонентів, і записує їх у словники під час трансформації. Дивіться [документацію intlayerCompiler](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/vite-intlayer/intlayerCompiler.md).
|
|
148
|
+
|
|
149
|
+
### 6. Оптимізація збірки
|
|
150
|
+
|
|
151
|
+
Під час виробничої збірки плагін додає:
|
|
152
|
+
|
|
153
|
+
- **intlayerOptimize** – трансформація Babel, яка перезаписує `useIntlayer('key')` → `useDictionary(hash)` та вводить прямий імпорт JSON.
|
|
154
|
+
- **intlayerPrune** – видаляє невикористовувані поля вмісту з JSON словника.
|
|
155
|
+
- **intlayerMinify** – стискує JSON словника та за потреби мангліфікує назви полів.
|
|
156
|
+
|
|
157
|
+
Ці функції неактивні в режимі розробки.
|
|
158
|
+
|
|
159
|
+
## Застарілі псевдоніми
|
|
45
160
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
161
|
+
| Застарілий експорт | Заміна |
|
|
162
|
+
| ------------------ | ---------- |
|
|
163
|
+
| `intlayerPlugin` | `intlayer` |
|
|
164
|
+
| `intLayerPlugin` | `intlayer` |
|
|
@@ -30,16 +30,89 @@ author: aymericzip
|
|
|
30
30
|
|
|
31
31
|
## Використання
|
|
32
32
|
|
|
33
|
+
### У складі `intlayer()` (рекомендовано)
|
|
34
|
+
|
|
35
|
+
Увімкніть pruning через конфіг Intlayer, і основний плагін буде керувати всім:
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
// intlayer.config.ts
|
|
39
|
+
import { defineConfig } from "intlayer";
|
|
40
|
+
|
|
41
|
+
export default defineConfig({
|
|
42
|
+
build: {
|
|
43
|
+
optimize: true, // вмикає як pruning, так і minify
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
// vite.config.ts
|
|
50
|
+
import { defineConfig } from "vite";
|
|
51
|
+
import { intlayer } from "vite-intlayer";
|
|
52
|
+
|
|
53
|
+
export default defineConfig({
|
|
54
|
+
plugins: [intlayer()],
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Standalone
|
|
59
|
+
|
|
60
|
+
Якщо ви вручну складаєте стек плагінів, `intlayerPrune` та `intlayerMinify` спільно використовують об'єкт `PruneContext`, який має бути створений один раз і передан обом:
|
|
61
|
+
|
|
33
62
|
```ts
|
|
34
63
|
// vite.config.ts
|
|
35
64
|
import { defineConfig } from "vite";
|
|
36
|
-
import {
|
|
65
|
+
import { intlayerPrune, intlayerMinify } from "vite-intlayer";
|
|
66
|
+
import { createPruneContext } from "@intlayer/babel";
|
|
67
|
+
import { getConfiguration } from "@intlayer/config/node";
|
|
68
|
+
|
|
69
|
+
const intlayerConfig = getConfiguration();
|
|
70
|
+
const pruneContext = createPruneContext();
|
|
37
71
|
|
|
38
72
|
export default defineConfig({
|
|
39
|
-
plugins: [
|
|
73
|
+
plugins: [
|
|
74
|
+
intlayerPrune(intlayerConfig, pruneContext),
|
|
75
|
+
intlayerMinify(intlayerConfig, pruneContext), // опціональний, читає з того ж контексту
|
|
76
|
+
],
|
|
40
77
|
});
|
|
41
78
|
```
|
|
42
79
|
|
|
43
|
-
##
|
|
80
|
+
## Як це працює
|
|
81
|
+
|
|
82
|
+
### 1. Аналіз використання (buildStart)
|
|
83
|
+
|
|
84
|
+
Під час `buildStart` плагін `intlayerOptimize` (також частина `intlayer()`) сканує кожен файл вихідного коду компонента зі списку `build.filesList`. Для кожного виклику `useIntlayer('key')` або `getIntlayer('key')` він записує точно які поля доступні, наприклад:
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
const { title, description } = useIntlayer("myDict");
|
|
88
|
+
// записує: myDict → { title, description }
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Це будує `pruneContext.fieldUsageMap` перед тим, як запустяться будь-які виклики `transform`.
|
|
92
|
+
|
|
93
|
+
### 2. JSON pruning (transform, enforce: 'pre')
|
|
94
|
+
|
|
95
|
+
Коли Vite обробляє скомпільований JSON-файл словника, `intlayerPrune` перехоплює його перед вбудованим JSON → ESM перетворенням Vite. Він читає карту використання полів із `pruneContext` та видаляє будь-яке поле контенту, яке не входить до записаного набору використання.
|
|
96
|
+
|
|
97
|
+
Підтримуються дві форми контенту:
|
|
98
|
+
|
|
99
|
+
- **Статичні словники** — `{ nodeType: "translation", translation: { en: {...}, fr: {...} } }`. Поля обрізаються за локалю всередині `translation`.
|
|
100
|
+
- **Динамічні (за локалю) словники** — плоске `{ fieldA: ..., fieldB: ... }`. Поля обрізаються на верхньому рівні.
|
|
101
|
+
|
|
102
|
+
### 3. Граничні випадки
|
|
103
|
+
|
|
104
|
+
Якщо структуру вмісту словника не можна розпізнати (наприклад, незвичайна вкладена форма), він додається до `pruneContext.dictionariesWithEdgeCases` і **залишається без змін**. Записується попередження. `intlayerMinify` також пропускає ці словники.
|
|
105
|
+
|
|
106
|
+
### 4. Карта перейменування полів
|
|
107
|
+
|
|
108
|
+
Коли pruning успішно завершується, `intlayerPrune` також записує `pruneContext.dictionaryKeyToFieldRenameMap` — відображення оригінальних назв полів на короткі псевдоніми. `intlayerMinify` читає цю карту для перейменування полів у вихідному JSON, а pass перейменування Babel в `intlayerOptimize` оновлює доступи до властивостей у вихідних файлах відповідно.
|
|
109
|
+
|
|
110
|
+
## Умови активації
|
|
111
|
+
|
|
112
|
+
`intlayerPrune` активний **лише** коли всі наступні умови виконані:
|
|
113
|
+
|
|
114
|
+
1. Команда Vite — `build`.
|
|
115
|
+
2. `build.optimize` має значення `true` (або `undefined`, що за замовчуванням дорівнює `true` для збірок).
|
|
116
|
+
3. `build.purge` має значення `true` у вашій конфігурації Intlayer.
|
|
44
117
|
|
|
45
|
-
|
|
118
|
+
Він автоматично **вимикається**, коли `editor.enabled` має значення `true`, оскільки редактору потрібна повна змістова частина словника.
|
package/docs/uk/releases/v9.md
CHANGED
|
@@ -373,21 +373,6 @@ curl -fsSL https://intlayer.org/install.sh | sh
|
|
|
373
373
|
|
|
374
374
|
Встановлювач завантажує `docker-compose.yml` та `.env`, автоматично генерує необхідні секрети та запускає `docker compose up -d`. Все — дашборд, API, база даних, сховище об'єктів та транзакційна електронна пошта — працює локально у контейнерах.
|
|
375
375
|
|
|
376
|
-
### Включені сервіси
|
|
377
|
-
|
|
378
|
-
| Сервіс | Призначення |
|
|
379
|
-
| ----------------------------------------- | ------------------------------------------------------------------------------ |
|
|
380
|
-
| **app** (TanStack Start) | UI дашборду на порту `3000` |
|
|
381
|
-
| **backend** (Fastify/Bun) | REST API на порту `3100` |
|
|
382
|
-
| **MongoDB 7** (одновузловий набір реплік) | Основна база даних |
|
|
383
|
-
| **Redis 7** | Черги завдань та кешування |
|
|
384
|
-
| **MinIO** | S3-сумісне сховище об'єктів (аватари, знімки екрана) |
|
|
385
|
-
| **Mailpit** | Локальний SMTP-приймач + веб-інтерфейс для транзакційної пошти на порту `8025` |
|
|
386
|
-
|
|
387
|
-
Chromium (що використовується для генерації знімків екрана через Puppeteer) вбудований у образ бекенду — додатковий контейнер не потрібен.
|
|
388
|
-
|
|
389
|
-
---
|
|
390
|
-
|
|
391
376
|
## Примітки щодо міграції з v8
|
|
392
377
|
|
|
393
378
|
Якщо ви оновлюєтеся з v8, зверніть увагу, що v9 не містить критичних змін (breaking changes). Проте ось ключові зміни:
|
package/docs/uk/self_hosting.md
CHANGED
|
@@ -64,6 +64,32 @@ Chromium (використовується для генерації скрін
|
|
|
64
64
|
|
|
65
65
|
## Швидкий старт
|
|
66
66
|
|
|
67
|
+
Витягніть і запустіть опубліковану image, надавши ваші облікові дані та секрети MongoDB Atlas:
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
docker run -d --name intlayer \
|
|
71
|
+
-p 3000:3000 \
|
|
72
|
+
-p 3100:3100 \
|
|
73
|
+
-p 9000:9000 \
|
|
74
|
+
-p 9001:9001 \
|
|
75
|
+
-v intlayer-data:/data \
|
|
76
|
+
-e DB_ID="<atlas-user>" \
|
|
77
|
+
-e DB_MDP="<atlas-password>" \
|
|
78
|
+
-e DB_CLUSTER="<cluster>.xxxxx.mongodb.net" \
|
|
79
|
+
-e BETTER_AUTH_SECRET="$(openssl rand -hex 32)" \
|
|
80
|
+
-e S3_SECRET_ACCESS_KEY="$(openssl rand -hex 16)" \
|
|
81
|
+
-e RESEND_API_KEY="<your-resend-key>" \
|
|
82
|
+
aymericzip/intlayer-selfhost
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Потім відкрийте **http://localhost:3000**.
|
|
86
|
+
|
|
87
|
+
> Dashboard доступний на `localhost`. Див. [Обмеження](#limitations) — користувацькі домени не підтримуються опублікованою image.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Швидкий старт
|
|
92
|
+
|
|
67
93
|
```sh
|
|
68
94
|
curl -fsSL https://intlayer.org/install.sh | sh
|
|
69
95
|
```
|
|
@@ -99,7 +125,16 @@ curl -fsSL https://intlayer.org/install.sh | sh
|
|
|
99
125
|
|
|
100
126
|
## Змінні середовища
|
|
101
127
|
|
|
102
|
-
|
|
128
|
+
### Обов'язково
|
|
129
|
+
|
|
130
|
+
| Variable | Example | Description |
|
|
131
|
+
| ---------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
132
|
+
| `DB_ID` | `intlayer` | MongoDB Atlas користувач |
|
|
133
|
+
| `DB_MDP` | _(ваш пароль)_ | MongoDB Atlas пароль |
|
|
134
|
+
| `DB_CLUSTER` | `cluster0.xxxxx.mongodb.net` | MongoDB Atlas cluster хост (використовується в URI `mongodb+srv://`) |
|
|
135
|
+
| `BETTER_AUTH_SECRET` | _(згенерований)_ | 32-байтовий secret для підписання сеансу |
|
|
136
|
+
| `S3_SECRET_ACCESS_KEY` | _(згенерований)_ | Secret для bundled MinIO |
|
|
137
|
+
| `RESEND_API_KEY` | _(ваш ключ)_ | Transactional email через Resend. Обов'язково для першого запуску, якщо ви не налаштуєте глобальний SMTP mailer (див. [Global mailer](#global-mailer)) |
|
|
103
138
|
|
|
104
139
|
### Обов'язкові (автоматично генеруються або запитуються)
|
|
105
140
|
|
|
@@ -141,6 +176,26 @@ curl -fsSL https://intlayer.org/install.sh | sh
|
|
|
141
176
|
|
|
142
177
|
---
|
|
143
178
|
|
|
179
|
+
### Глобальний поштовик
|
|
180
|
+
|
|
181
|
+
За замовчуванням усі транзакційні електронні листи відправляються через Resend з використанням `RESEND_API_KEY`. Самостійно розгорнуті розгортання можуть натомість маршрутизувати **кожну** електронну пошту — включаючи не-організаційні листи, такі як скидання паролів і магічні посилання — через глобальний поштовик, налаштований за допомогою змінних середовища.
|
|
182
|
+
|
|
183
|
+
Встановіть `MAIL_PROVIDER`, щоб активувати це. Коли не встановлено, використовується поштовик за замовчуванням Resend.
|
|
184
|
+
|
|
185
|
+
| Змінна | Приклад | Опис |
|
|
186
|
+
| -------------------- | ------------------------------ | ---------------------------------------------------------------------------------------------------- |
|
|
187
|
+
| `MAIL_PROVIDER` | `smtp` | Глобальний транспорт: `smtp` або `resend`. Залиште не встановленим для використання за замовчуванням |
|
|
188
|
+
| `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Заголовок відправника. Приймає просту адресу або формат `Name <email>` |
|
|
189
|
+
| `MAIL_SMTP_HOST` | `smtp.acme.com` | Хост SMTP (обов'язково, коли `MAIL_PROVIDER=smtp`) |
|
|
190
|
+
| `MAIL_SMTP_PORT` | `587` | Порт SMTP (за замовчуванням `587`) |
|
|
191
|
+
| `MAIL_SMTP_SECURE` | `false` | Неявний TLS. Встановіть `true` для порту `465` |
|
|
192
|
+
| `MAIL_SMTP_USER` | _(ваш користувач)_ | Ім'я користувача SMTP (необов'язково; пропустіть для незаповнених реле) |
|
|
193
|
+
| `MAIL_SMTP_PASSWORD` | _(ваш пароль)_ | Пароль SMTP |
|
|
194
|
+
|
|
195
|
+
> Пріоритет: власний поштовик організації (налаштований з панелі керування **Organization**) має пріоритет над глобальним поштовиком, який у свою чергу має пріоритет над ключем Resend за замовчуванням.
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
144
199
|
## Підключення вашого проекту Intlayer
|
|
145
200
|
|
|
146
201
|
Після запуску стека направте свій проект на самостійно розгорнутий бекенд та дашборд замість `intlayer.org`.
|
|
@@ -259,47 +314,11 @@ docker run --rm \
|
|
|
259
314
|
|
|
260
315
|
---
|
|
261
316
|
|
|
262
|
-
##
|
|
263
|
-
|
|
264
|
-
Для виробничих розгортань розмістіть зворотний проксі перед контейнерами застосунку та бекенду замість прямого їх виставлення.
|
|
265
|
-
|
|
266
|
-
### Приклад Nginx
|
|
267
|
-
|
|
268
|
-
```nginx
|
|
269
|
-
server {
|
|
270
|
-
listen 80;
|
|
271
|
-
server_name cms.example.com;
|
|
272
|
-
|
|
273
|
-
location / {
|
|
274
|
-
proxy_pass http://localhost:3000;
|
|
275
|
-
proxy_set_header Host $host;
|
|
276
|
-
proxy_set_header X-Real-IP $remote_addr;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
317
|
+
## Обмеження
|
|
279
318
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
location / {
|
|
285
|
-
proxy_pass http://localhost:3100;
|
|
286
|
-
proxy_set_header Host $host;
|
|
287
|
-
proxy_set_header X-Real-IP $remote_addr;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
Оновіть наступні змінні `.env`, щоб вони відповідали вашим публічним доменам:
|
|
293
|
-
|
|
294
|
-
```sh
|
|
295
|
-
BACKEND_URL=https://api.example.com
|
|
296
|
-
APP_URL=https://cms.example.com
|
|
297
|
-
DOMAIN=example.com
|
|
298
|
-
VITE_BACKEND_URL=https://api.example.com
|
|
299
|
-
VITE_DOMAIN=example.com
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
> Змінні `VITE_*` вбудовуються в образ дашборду під час збірки. Якщо ви зміните їх після збірки образу, вам потрібно перезібрати образ `app` (`docker compose build app`) або використовувати ін'єкцію конфігурації під час виконання.
|
|
319
|
+
- **MongoDB має бути зовнішньою (Atlas).** Backend підключається лише через `mongodb+srv://` (побудований на основі `DB_ID` / `DB_MDP` / `DB_CLUSTER`), тому звичайний `mongodb://host:27017` — включаючи вбудований `mongod` контейнера — не може бути використаний. Надайте кластер MongoDB Atlas.
|
|
320
|
+
- **Немає користувацького домену.** Усі `VITE_*` URL-адреси, видимі браузером, вбудовуються в додаток під час збирання, а опублікований образ поставляється зі значеннями `localhost`. Доступ до панелі керування має здійснюватися через `http://localhost:3000`; обслуговування її на публічному домені потребувало б перебудови образу з цільовими URL-адресами вбудованими та не підтримується з коробки.
|
|
321
|
+
- **Email вимагає працюючого mailer.** Перша установка примушує перевірку електронної пошти, тому має бути налаштований або `RESEND_API_KEY`, або [глобальний SMTP mailer](#global-mailer) (`MAIL_PROVIDER=smtp` + `MAIL_SMTP_*`). Після того як перший адміністратор увійде, кожна організація також може налаштувати власний SMTP або Resend mailer з панелі керування.
|
|
303
322
|
|
|
304
323
|
---
|
|
305
324
|
|
|
@@ -315,15 +334,6 @@ docker compose logs mongo
|
|
|
315
334
|
docker compose logs redis
|
|
316
335
|
```
|
|
317
336
|
|
|
318
|
-
### Дашборд не може дістатися до API
|
|
319
|
-
|
|
320
|
-
Переконайтеся, що `VITE_BACKEND_URL` відповідає URL-адресі, за якою бекенд доступний з **браузера** (не мережі Docker). Якщо ви змінили порт бекенду або додали зворотний проксі, перезіберіть образ дашборду:
|
|
321
|
-
|
|
322
|
-
```sh
|
|
323
|
-
docker compose build app
|
|
324
|
-
docker compose up -d app
|
|
325
|
-
```
|
|
326
|
-
|
|
327
337
|
### Електронні листи не надсилаються
|
|
328
338
|
|
|
329
339
|
За замовчуванням усі вихідні електронні листи захоплюються Mailpit. Відкрийте `http://localhost:8025`, щоб побачити надіслані повідомлення. Щоб надсилати реальні електронні листи, встановіть `MAIL_PROVIDER=resend` та `RESEND_API_KEY=<ваш-ключ>` у `.env`, а потім перезапустіть бекенд:
|
|
@@ -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` فائلوں کو اسکین کرتا ہے اور مرتب کی گئی (compiled) ڈکشنریوں کو `.intlayer/` میں لکھتا ہے |
|
|
197
|
-
| `intlayerOptimizeBabelPlugin` | `useIntlayer('key')` کو `useDictionary(hash)` میں بدل دیتا ہے اور متعلقہ ڈکشنری کا `import` شامل (inject) کرتا ہے |
|
|
198
205
|
| `intlayerPurgeBabelPlugin` | تمام سورس (source) فائلوں کو اسکین کرتا ہے، مرتب شدہ `.intlayer/**/*.json` ڈکشنری فائلوں سے **غیر استعمال شدہ مواد (unused content fields)** کو ہٹا دیتا ہے |
|
|
199
206
|
| `intlayerMinifyBabelPlugin` | JSON فائلوں اور سورس کوڈ دونوں میں **مواد کی فیلڈ کیز (keys) کا نام بدل کر** چھوٹے حروف تہجی (alias) رکھ دیتا ہے (جیسے `title` → `a`) |
|
|
207
|
+
| `intlayerOptimizeBabelPlugin` | `useIntlayer('key')` کو `useDictionary(hash)` میں بدل دیتا ہے اور متعلقہ ڈکشنری کا `import` شامل (inject) کرتا ہے |
|
|
200
208
|
|
|
201
209
|
> **پلگ ان کی ترتیب اہم ہے۔** آپ کے `babel.config.js` میں purge اور minify کے پلگ انز کا optimize پلگ ان سے **پہلے** ہونا لازمی ہے۔ optimize مرحلہ (pass) `useIntlayer('key')` کو ایک مبہم `useDictionary(hash)` کال سے بدل دیتا ہے، جس سے ڈکشنری کی (key) کی وہ معلومات مٹ جاتی ہے جس کی purge اور minify مراحل کو ضرورت ہوتی ہے تاکہ وہ جان سکیں کہ کون سی فیلڈز استعمال ہو رہی ہیں۔
|
|
202
210
|
|
|
@@ -205,9 +213,9 @@ Intlayer کا بلڈ آپٹیمائزیشن کئی الگ الگ پلگ انز
|
|
|
205
213
|
| آپشنز ہیلپر (Options helper) | کس کے ساتھ استعمال ہوتا ہے |
|
|
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 کے صارفین **انہیں کبھی بھی براہ راست کنفیگ
|
|
|
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` فلیگز کی بنیاد پر مکمل پائپ لائن چلاتا ہے — purge، minify اور import کی دوبارہ تحریر۔
|
|
234
|
+
|
|
235
|
+
کام دو حصوں میں بٹا ہوا ہے، کیونکہ SWC کا Wasm پلگ اِن ایک وقت میں ایک ہی فائل کو تبدیل کرتا ہے اور اسے فائل سسٹم تک رسائی نہیں ہوتی:
|
|
236
|
+
|
|
237
|
+
| مرحلہ | کہاں چلتا ہے | کیا کرتا ہے |
|
|
238
|
+
| :-------------------------------------------- | :----------------------------- | :--------------------------------------------------------------------------------------------------------- |
|
|
239
|
+
| استعمال کا تجزیہ + JSON purge/minify | Node، `withIntlayer()` کے اندر | ہر کمپوننٹ سورس فائل پڑھتا ہے، `.intlayer/**/*.json` دوبارہ لکھتا ہے، اور نام بدلنے کی جدولیں تیار کرتا ہے |
|
|
240
|
+
| سورس کی دوبارہ تحریر (`content.title` ← `.a`) | `@intlayer/swc` (Wasm) | نام بدلنے کی جدولیں آپ کے کوڈ میں متعلقہ پراپرٹی رسائیوں پر لاگو کرتا ہے |
|
|
241
|
+
| Import کی دوبارہ تحریر (`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 کے صارفین **انہیں کبھی بھی براہ راست کنفیگ
|
|
|
227
249
|
|
|
228
250
|
### Next.js
|
|
229
251
|
|
|
230
|
-
Next.js کو
|
|
252
|
+
Next.js کو `@intlayer/swc` پلگ اِن درکار ہے، کیونکہ Next.js بلڈ کے لیے SWC استعمال کرتا ہے۔ **v9.2.1** سے یہ اکیلا پیکیج پوری پائپ لائن کا احاطہ کرتا ہے — آپٹیمائز (import کی دوبارہ تحریر)، purge اور minify۔
|
|
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
|
+
**Purge اور minify** مراحل (فیلڈ ہٹانا اور فیلڈ کا نام بدلنا) کے لیے کسی اضافی پیکیج یا `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 اور سورس کوڈ میں مواد کی فیلڈ کیز کا نام بدلیں
|
|
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
|
+
> `withIntlayerSync` نہیں بلکہ غیر ہم وقت (async) `withIntlayer` استعمال کریں۔ ہم وقت نسخہ تجزیے کی پائپ لائن نہیں چلاتا، اس لیے اس کے ساتھ purge اور minify کا کوئی اثر نہیں ہوتا۔
|
|
319
|
+
|
|
320
|
+
> Purge اور minify صرف `next build` پر چلتے ہیں — آپٹیمائز پائپ لائن `next dev` کے دوران بند رہتی ہے۔
|
|
321
|
+
|
|
322
|
+
> جب کمپیٹ اڈاپٹر کالرز ترتیب دیے گئے ہوں تب بھی یہ غیر فعال ہو جاتے ہیں (`swcExtraCallers`، جنہیں `@intlayer/next-intl` یا `@intlayer/react-i18next` جیسے کمپیٹ پیکیجز مقرر کرتے ہیں): وہ کال سائٹس استعمال کے تجزیہ کار کو نظر نہیں آتیں، اس لیے purge ایسے فیلڈز ہٹا دیتا جو کوڈ اب بھی پڑھتا ہے۔ Import کی دوبارہ تحریر فعال رہتی ہے۔
|
|
323
|
+
|
|
324
|
+
**پرانے ورژنز (9.2.1 سے پہلے)** میں `@intlayer/babel` اور ایک ایسی `babel.config.js` درکار تھی جو `intlayerPurgeBabelPlugin` اور `intlayerMinifyBabelPlugin` کا اعلان کرے۔ اب اس فائل کی ضرورت نہیں اور اسے حذف کیا جا سکتا ہے۔
|
|
325
|
+
|
|
295
326
|
</Tab>
|
|
296
327
|
<Tab value="vite">
|
|
297
328
|
|
|
@@ -447,6 +478,8 @@ export default config;
|
|
|
447
478
|
|
|
448
479
|
> منی فیکیشن کو چھوڑ (skipped) دیا جاتا ہے جب `optimize` کی ویلیو `false` ہو، یا جب `editor.enabled` کی ویلیو `true` ہو (ویژول ایڈیٹر کو ایڈیٹنگ کی اجازت دینے کے لیے اصل فیلڈ کے ناموں کی ضرورت ہوتی ہے)۔
|
|
449
480
|
|
|
481
|
+
> Next.js پر، minification تب بھی چھوڑ دی جاتی ہے جب `@intlayer/swc` نصب نہ ہو یا لوڈ نہ ہو سکے (16.1.0 سے نیچے کا Next.js)۔ سورس میں رسائیوں کو دوبارہ لکھنے والا نصف حصہ یہی پلگ اِن ہے، اس لیے اس کے بغیر ڈکشنریز کے نام بدلنے سے آپ کا کوڈ ایسے فیلڈ نام پڑھتا رہ جائے گا جو اب موجود نہیں۔
|
|
482
|
+
|
|
450
483
|
> منی فیکیشن ان ڈکشنریوں کے لیے بھی نظرانداز کی جاتی ہے جنہیں `importMode: 'fetch'` کے ذریعے لوڈ کیا گیا ہو کیونکہ ان کا JSON ریموٹ API سے اصل فیلڈ ناموں کے ساتھ پیش کیا جاتا ہے — کلائنٹ سائیڈ کیز کا نام بدلنے سے سرور/کلائنٹ کا کنٹریکٹ (contract) ٹوٹ جائے گا۔
|
|
451
484
|
|
|
452
485
|
### پرجنگ (غیر استعمال شدہ فیلڈز کو ہٹانا)
|
|
@@ -475,7 +508,7 @@ export default config;
|
|
|
475
508
|
{ "title": "…", "subtitle": "…" }
|
|
476
509
|
```
|
|
477
510
|
|
|
478
|
-
> جب `optimize` کی ویلیو `false` ہو یا جب `editor.enabled` کی ویلیو `true` ہو تو پرجنگ (Purging) چھوڑ (skipped) دی جاتی ہے۔
|
|
511
|
+
> جب `optimize` کی ویلیو `false` ہو یا جب `editor.enabled` کی ویلیو `true` ہو تو پرجنگ (Purging) چھوڑ (skipped) دی جاتی ہے۔ Next.js پر یہ تب بھی چھوڑ دیا جاتا ہے جب `@intlayer/swc` دستیاب نہ ہو، اور جب کمپیٹ اڈاپٹر کالرز ترتیب دیے گئے ہوں۔
|
|
479
512
|
|
|
480
513
|
> پرجنگ کو حفاظتی تدابیر (conservatively) کے طور پر ان حالات میں بھی چھوڑ دیا جاتا ہے جب کوئی سورس فائل پارس (parse) نہیں ہو پاتی، یا جب `useIntlayer` کا نتیجہ کسی ویری ایبل کو تفویض (assign) کر دیا جائے اور پھر ان طریقوں سے آگے بڑھایا جائے جن کا اسٹیٹک اینالائزر کھوج نہیں لگا سکتا (جیسے اسپریڈ کو کسی آبجیکٹ میں ڈالنا، ڈسٹرکچر کیے بغیر پروپ کے طور پر بھیجنا)۔ ان صورتوں میں، مکمل ڈکشنری محفوظ رکھی جاتی ہے۔
|
|
481
514
|
|