@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/formatters.md
CHANGED
|
@@ -49,37 +49,6 @@ author: aymericzip
|
|
|
49
49
|
|
|
50
50
|
<TOC/>
|
|
51
51
|
|
|
52
|
-
## Огляд
|
|
53
|
-
|
|
54
|
-
Intlayer надає набір легких хелперів, побудованих поверх рідних API `Intl`, а також кешований обгорток `Intl`, щоб уникнути повторного створення важких форматерів. Ці утиліти повністю враховують локаль і можуть використовуватися з основного пакета `intlayer`.
|
|
55
|
-
|
|
56
|
-
### Імпорт
|
|
57
|
-
|
|
58
|
-
```ts
|
|
59
|
-
import {
|
|
60
|
-
Intl,
|
|
61
|
-
number,
|
|
62
|
-
percentage,
|
|
63
|
-
currency,
|
|
64
|
-
date,
|
|
65
|
-
relativeTime,
|
|
66
|
-
units,
|
|
67
|
-
compact,
|
|
68
|
-
list,
|
|
69
|
-
getLocaleName,
|
|
70
|
-
getLocaleLang,
|
|
71
|
-
getLocaleFromPath,
|
|
72
|
-
getPathWithoutLocale,
|
|
73
|
-
getLocalizedUrl,
|
|
74
|
-
getHTMLTextDir,
|
|
75
|
-
getContent,
|
|
76
|
-
getTranslation,
|
|
77
|
-
getIntlayer,
|
|
78
|
-
} from "intlayer";
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
If you are using React, hooks are also available; see `react-intlayer/format`.
|
|
82
|
-
|
|
83
52
|
## Cached Intl
|
|
84
53
|
|
|
85
54
|
The exported `Intl` is a thin, cached wrapper around the global `Intl`. It memoizes instances of `NumberFormat`, `DateTimeFormat`, `RelativeTimeFormat`, `ListFormat`, `DisplayNames`, `Collator`, and `PluralRules`, which avoids rebuilding the same formatter repeatedly.
|
|
@@ -116,51 +85,6 @@ pluralRules.select(1); // "one"
|
|
|
116
85
|
pluralRules.select(2); // "інше"
|
|
117
86
|
```
|
|
118
87
|
|
|
119
|
-
### `Intl.DisplayNames`
|
|
120
|
-
|
|
121
|
-
Для локалізованих назв мов, регіонів, валют та писемностей:
|
|
122
|
-
|
|
123
|
-
```ts
|
|
124
|
-
import { Intl } from "intlayer";
|
|
125
|
-
|
|
126
|
-
const languageNames = new Intl.DisplayNames("en", { type: "language" });
|
|
127
|
-
languageNames.of("fr"); // "французька"
|
|
128
|
-
|
|
129
|
-
const regionNames = new Intl.DisplayNames("fr", { type: "region" });
|
|
130
|
-
regionNames.of("US"); // "Сполучені Штати"
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### `Intl.Collator`
|
|
134
|
-
|
|
135
|
-
Для порівняння рядків та сортування з урахуванням локалі:
|
|
136
|
-
|
|
137
|
-
```ts
|
|
138
|
-
import { Intl } from "intlayer";
|
|
139
|
-
|
|
140
|
-
const collator = new Intl.Collator("de", {
|
|
141
|
-
sensitivity: "base",
|
|
142
|
-
numeric: true,
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
const words = ["äpfel", "zebra", "100", "20"];
|
|
146
|
-
words.sort(collator.compare); // ["20", "100", "äpfel", "zebra"]
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
### `Intl.PluralRules`
|
|
150
|
-
|
|
151
|
-
Для визначення форм множини в різних локалях:
|
|
152
|
-
|
|
153
|
-
```ts
|
|
154
|
-
import { Intl } from "intlayer";
|
|
155
|
-
|
|
156
|
-
const pluralRules = new Intl.PluralRules("ar");
|
|
157
|
-
pluralRules.select(0); // "нуль"
|
|
158
|
-
pluralRules.select(1); // "один"
|
|
159
|
-
pluralRules.select(2); // "два"
|
|
160
|
-
pluralRules.select(3); // "кілька"
|
|
161
|
-
pluralRules.select(11); // "багато"
|
|
162
|
-
```
|
|
163
|
-
|
|
164
88
|
## Утиліти локалей
|
|
165
89
|
|
|
166
90
|
### `getLocaleName(displayLocale, targetLocale?)`
|
|
@@ -178,22 +102,6 @@ getLocaleName("de", "es"); // іспанською: "alemán"
|
|
|
178
102
|
- **displayLocale**: Локаль, для якої потрібно отримати назву
|
|
179
103
|
- **targetLocale**: Локаль, в якій відображається назва (за замовчуванням displayLocale)
|
|
180
104
|
|
|
181
|
-
### `getLocaleFromPath(inputUrl)`
|
|
182
|
-
|
|
183
|
-
Витягує сегмент локалі з URL або шляху:
|
|
184
|
-
|
|
185
|
-
```ts
|
|
186
|
-
import { getLocaleFromPath } from "intlayer";
|
|
187
|
-
|
|
188
|
-
getLocaleFromPath("/en/dashboard"); // "en"
|
|
189
|
-
getLocaleFromPath("/fr/dashboard"); // "fr"
|
|
190
|
-
getLocaleFromPath("/dashboard"); // "en" (default locale)
|
|
191
|
-
getLocaleFromPath("https://example.com/es/about"); // "es"
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
- **inputUrl**: Повний рядок URL або шлях (pathname) для обробки
|
|
195
|
-
- **returns**: Виявлена локаль або локаль за замовчуванням, якщо локаль не знайдена
|
|
196
|
-
|
|
197
105
|
### `getLocalizedUrl(url, currentLocale, locales?, defaultLocale?, prefixDefault?)`
|
|
198
106
|
|
|
199
107
|
Генерує локалізований URL для поточної локалі:
|
|
@@ -212,21 +120,6 @@ getLocalizedUrl("https://example.com/about", "fr", ["en", "fr"], "en", true); //
|
|
|
212
120
|
- **defaultLocale**: Необов'язкова локаль за замовчуванням (за замовчуванням, сконфігурована локаль за замовчуванням)
|
|
213
121
|
- **prefixDefault**: Чи додавати префікс для локалі за замовчуванням (за замовчуванням, сконфігуроване значення)
|
|
214
122
|
|
|
215
|
-
### `getHTMLTextDir(locale?)`
|
|
216
|
-
|
|
217
|
-
Повертає напрямок тексту для локалі:
|
|
218
|
-
|
|
219
|
-
```ts
|
|
220
|
-
import { getHTMLTextDir } from "intlayer";
|
|
221
|
-
|
|
222
|
-
getHTMLTextDir("en-US"); // повертає "ltr"
|
|
223
|
-
getHTMLTextDir("ar"); // повертає "rtl"
|
|
224
|
-
getHTMLTextDir("he"); // повертає "rtl"
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
- **locale**: Локаль, для якої потрібно отримати напрямок тексту (за замовчуванням, поточна локаль)
|
|
228
|
-
- **повертає**: `"ltr"`, `"rtl"`, або `"auto"`
|
|
229
|
-
|
|
230
123
|
### `getContent(node, nodeProps, locale?)`
|
|
231
124
|
|
|
232
125
|
Перетворює вузол контенту за допомогою всіх доступних плагінів (translation, enumeration, insertion тощо):
|
|
@@ -281,25 +174,6 @@ number("1000000", { locale: "fr" }); // "1 000 000"
|
|
|
281
174
|
number(1234.5, { minimumFractionDigits: 2 }); // "1,234.50"
|
|
282
175
|
```
|
|
283
176
|
|
|
284
|
-
### `percentage(value, options?)`
|
|
285
|
-
|
|
286
|
-
Форматує число у рядок відсотків.
|
|
287
|
-
|
|
288
|
-
Поведінка: значення більше за 1 інтерпретується як повні відсотки та нормалізується (наприклад, `25` → `25%`, `0.25` → `25%`).
|
|
289
|
-
|
|
290
|
-
- **value**: `number | string`
|
|
291
|
-
- **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
|
|
292
|
-
|
|
293
|
-
Приклади:
|
|
294
|
-
|
|
295
|
-
```ts
|
|
296
|
-
import { percentage } from "intlayer";
|
|
297
|
-
|
|
298
|
-
percentage(0.25); // "25%"
|
|
299
|
-
percentage(25); // "25%"
|
|
300
|
-
percentage(0.237, { minimumFractionDigits: 1 }); // "23.7%"
|
|
301
|
-
```
|
|
302
|
-
|
|
303
177
|
### `currency(value, options?)`
|
|
304
178
|
|
|
305
179
|
Форматує значення як локалізовану валюту. За замовчуванням `USD` з двома знаками після коми.
|
|
@@ -317,23 +191,6 @@ currency(1234.5, { currency: "EUR" }); // "€1,234.50"
|
|
|
317
191
|
currency("5000", { locale: "fr", currency: "CAD", currencyDisplay: "code" }); // "5 000,00 CAD"
|
|
318
192
|
```
|
|
319
193
|
|
|
320
|
-
### `date(date, optionsOrPreset?)`
|
|
321
|
-
|
|
322
|
-
Форматує значення дати/часу за допомогою `Intl.DateTimeFormat`.
|
|
323
|
-
|
|
324
|
-
- **date**: `Date | string | number`
|
|
325
|
-
- **optionsOrPreset**: `Intl.DateTimeFormatOptions & { locale?: LocalesValues }` або один із пресетів:
|
|
326
|
-
- Presets: `"short" | "long" | "dateOnly" | "timeOnly" | "full"`
|
|
327
|
-
|
|
328
|
-
Приклади:
|
|
329
|
-
|
|
330
|
-
```ts
|
|
331
|
-
import { date } from "intlayer";
|
|
332
|
-
|
|
333
|
-
date(new Date(), "short"); // наприклад: "08/02/25, 14:30"
|
|
334
|
-
date("2025-08-02T14:30:00Z", { locale: "fr", month: "long", day: "numeric" }); // "2 août"
|
|
335
|
-
```
|
|
336
|
-
|
|
337
194
|
### `relativeTime(from, to = new Date(), options?)`
|
|
338
195
|
|
|
339
196
|
Форматує відносний час між двома моментами за допомогою `Intl.RelativeTimeFormat`.
|
|
@@ -375,21 +232,9 @@ units(5, { unit: "kilometer", unitDisplay: "long", locale: "en-GB" }); // "5 к
|
|
|
375
232
|
units(1024, { unit: "byte", unitDisplay: "narrow" }); // "1,024B" (залежить від локалі)
|
|
376
233
|
```
|
|
377
234
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
Форматує число з використанням компактної нотації (наприклад, `1.2K`, `1M`).
|
|
235
|
+
## Vanilla JS / Node.js Formatters
|
|
381
236
|
|
|
382
|
-
|
|
383
|
-
- **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }` (використовує `notation: 'compact'` під капотом)
|
|
384
|
-
|
|
385
|
-
Приклади:
|
|
386
|
-
|
|
387
|
-
```ts
|
|
388
|
-
import { compact } from "intlayer";
|
|
389
|
-
|
|
390
|
-
compact(1200); // результат: "1.2K"
|
|
391
|
-
compact("1000000", { locale: "fr", compactDisplay: "long" }); // результат: "1 million"
|
|
392
|
-
```
|
|
237
|
+
Для контекстів без фреймворку імпортуйте форматери безпосередньо з `intlayer`. Зверніть увагу, що ви повинні передати locale вручну.
|
|
393
238
|
|
|
394
239
|
### `list(values, options?)`
|
|
395
240
|
|
|
@@ -410,6 +255,114 @@ list(["red", "green", "blue"], { locale: "fr", type: "disjunction" }); // "rouge
|
|
|
410
255
|
list([1, 2, 3], { type: "unit" }); // "1, 2, 3"
|
|
411
256
|
```
|
|
412
257
|
|
|
258
|
+
### Функції форматування
|
|
259
|
+
|
|
260
|
+
#### `number(value, options?)`
|
|
261
|
+
|
|
262
|
+
Форматує числове значення з врахуванням локалі для групування та десяткових знаків.
|
|
263
|
+
|
|
264
|
+
- **value**: `number | string`
|
|
265
|
+
- **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
|
|
266
|
+
|
|
267
|
+
```ts
|
|
268
|
+
number(123456.789); // "123,456.789" (in en-US)
|
|
269
|
+
number("1000000", { locale: "fr" }); // "1 000 000"
|
|
270
|
+
number(1234.5, { minimumFractionDigits: 2 }); // "1,234.50"
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
#### `percentage(value, options?)`
|
|
274
|
+
|
|
275
|
+
Форматує число як рядок відсотка. Значення більше 1 нормалізуються (наприклад, `25` → `25%`, `0.25` → `25%`).
|
|
276
|
+
|
|
277
|
+
- **value**: `number | string`
|
|
278
|
+
- **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
|
|
279
|
+
|
|
280
|
+
```ts
|
|
281
|
+
percentage(0.25); // "25%"
|
|
282
|
+
percentage(25); // "25%"
|
|
283
|
+
percentage(0.237, { minimumFractionDigits: 1 }); // "23.7%"
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
#### `currency(value, options?)`
|
|
287
|
+
|
|
288
|
+
Форматує значення як локалізовану валюту. За замовчуванням використовує `USD`.
|
|
289
|
+
|
|
290
|
+
- **value**: `number | string`
|
|
291
|
+
- **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
|
|
292
|
+
- Common: `currency`, `currencyDisplay` (`"symbol" | "code" | "name"`)
|
|
293
|
+
|
|
294
|
+
```ts
|
|
295
|
+
currency(1234.5, { currency: "EUR" }); // "€1,234.50"
|
|
296
|
+
currency("5000", { locale: "fr", currency: "CAD", currencyDisplay: "code" }); // "5 000,00 CAD"
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
#### `date(date, optionsOrPreset?)`
|
|
300
|
+
|
|
301
|
+
Форматує значення дати/часу.
|
|
302
|
+
|
|
303
|
+
- **date**: `Date | string | number`
|
|
304
|
+
- **optionsOrPreset**: `Intl.DateTimeFormatOptions & { locale?: LocalesValues }` або preset: `"short" | "long" | "dateOnly" | "timeOnly" | "full"`
|
|
305
|
+
|
|
306
|
+
```ts
|
|
307
|
+
date(new Date(), "short"); // наприклад, "08/02/25, 14:30"
|
|
308
|
+
date("2025-08-02T14:30:00Z", { locale: "fr", month: "long", day: "numeric" }); // "2 août"
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
#### `relativeTime(from, to?, options?)`
|
|
312
|
+
|
|
313
|
+
Форматує відносний час між двома моментами.
|
|
314
|
+
|
|
315
|
+
- **from**: `Date | string | number`
|
|
316
|
+
- **to**: `Date | string | number` (за замовчуванням `new Date()`)
|
|
317
|
+
- **options**: `{ locale?, unit?, numeric?, style? }`
|
|
318
|
+
|
|
319
|
+
```ts
|
|
320
|
+
const now = new Date();
|
|
321
|
+
const in3Days = new Date(now.getTime() + 3 * 864e5);
|
|
322
|
+
relativeTime(now, in3Days, { unit: "day" }); // "через 3 дні"
|
|
323
|
+
|
|
324
|
+
const twoHoursAgo = new Date(now.getTime() - 2 * 3600e3);
|
|
325
|
+
relativeTime(now, twoHoursAgo, { unit: "hour", numeric: "auto" }); // "2 години тому"
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
#### `units(value, options?)`
|
|
329
|
+
|
|
330
|
+
Форматує числове значення з одиницею виміру.
|
|
331
|
+
|
|
332
|
+
- **value**: `number | string`
|
|
333
|
+
- **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
|
|
334
|
+
- Common: `unit` (e.g., `"kilometer"`, `"byte"`), `unitDisplay` (`"short" | "narrow" | "long"`)
|
|
335
|
+
|
|
336
|
+
```ts
|
|
337
|
+
units(5, { unit: "kilometer", unitDisplay: "long", locale: "en-GB" }); // "5 kilometers"
|
|
338
|
+
units(1024, { unit: "byte", unitDisplay: "narrow" }); // "1,024B"
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
#### `compact(value, options?)`
|
|
342
|
+
|
|
343
|
+
Форматує число за допомогою компактного запису.
|
|
344
|
+
|
|
345
|
+
- **value**: `number | string`
|
|
346
|
+
- **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
|
|
347
|
+
|
|
348
|
+
```ts
|
|
349
|
+
compact(1200); // "1.2K"
|
|
350
|
+
compact("1000000", { locale: "fr", compactDisplay: "long" }); // "1 million"
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
#### `list(values, options?)`
|
|
354
|
+
|
|
355
|
+
Форматує масив у локалізований рядок списку.
|
|
356
|
+
|
|
357
|
+
- **values**: `(string | number)[]`
|
|
358
|
+
- **options**: `Intl.ListFormatOptions & { locale?: LocalesValues }`
|
|
359
|
+
- Поширені: `type` (`"conjunction" | "disjunction" | "unit"`), `style` (`"long" | "short" | "narrow"`)
|
|
360
|
+
|
|
361
|
+
```ts
|
|
362
|
+
list(["apple", "banana", "orange"]); // "apple, banana, and orange"
|
|
363
|
+
list(["red", "green", "blue"], { locale: "fr", type: "disjunction" }); // "rouge, vert ou bleu"
|
|
364
|
+
```
|
|
365
|
+
|
|
413
366
|
## Cached Intl
|
|
414
367
|
|
|
415
368
|
Експортований `Intl` з `intlayer` — це кешований wrapper навколо глобального `Intl`. Він мемоізує екземпляри форматерів (`NumberFormat`, `DateTimeFormat` тощо), щоб уникнути їхнього повторного створення та поліпшити продуктивність.
|
|
@@ -440,11 +393,19 @@ pluralRules.select(2); // "other"
|
|
|
440
393
|
|
|
441
394
|
### Додаткові функції Intl
|
|
442
395
|
|
|
443
|
-
|
|
396
|
+
#### `Intl.DisplayNames`
|
|
444
397
|
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
398
|
+
Для локалізованих назв мов, регіонів, валют та письмових систем:
|
|
399
|
+
|
|
400
|
+
```ts
|
|
401
|
+
import { Intl } from "intlayer";
|
|
402
|
+
|
|
403
|
+
const languageNames = new Intl.DisplayNames("en", { type: "language" });
|
|
404
|
+
languageNames.of("fr"); // "French"
|
|
405
|
+
|
|
406
|
+
const regionNames = new Intl.DisplayNames("fr", { type: "region" });
|
|
407
|
+
regionNames.of("US"); // "États-Unis"
|
|
408
|
+
```
|
|
448
409
|
|
|
449
410
|
#### `Intl.Collator`
|
|
450
411
|
|
|
@@ -491,33 +452,15 @@ getLocaleName("en", "fr"); // "anglais"
|
|
|
491
452
|
getLocaleName("de", "es"); // "alemán"
|
|
492
453
|
```
|
|
493
454
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
Форматери містяться в core-пакеті і реекспортуються з пакетів вищого рівня, щоб зробити імпорти зручними в різних середовищах виконання:
|
|
455
|
+
### `getLocaleLang(locale?)`
|
|
497
456
|
|
|
498
|
-
|
|
457
|
+
Витягує код мови з рядка локалі:
|
|
499
458
|
|
|
500
459
|
```ts
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
date,
|
|
506
|
-
relativeTime,
|
|
507
|
-
units,
|
|
508
|
-
compact,
|
|
509
|
-
list,
|
|
510
|
-
Intl,
|
|
511
|
-
getLocaleName,
|
|
512
|
-
getLocaleLang,
|
|
513
|
-
getLocaleFromPath,
|
|
514
|
-
getPathWithoutLocale,
|
|
515
|
-
getLocalizedUrl,
|
|
516
|
-
getHTMLTextDir,
|
|
517
|
-
getContent,
|
|
518
|
-
getTranslation,
|
|
519
|
-
getIntlayer,
|
|
520
|
-
} from "intlayer";
|
|
460
|
+
import { getLocaleLang } from "intlayer";
|
|
461
|
+
|
|
462
|
+
getLocaleLang("en-US"); // "en"
|
|
463
|
+
getLocaleLang("fr-CA"); // "fr"
|
|
521
464
|
```
|
|
522
465
|
|
|
523
466
|
### `getLocaleFromPath(inputUrl)`
|
package/docs/uk/intlayer_CMS.md
CHANGED
|
@@ -247,6 +247,158 @@ bun x intlayer dictionary push -d my-first-dictionary-key --env production
|
|
|
247
247
|
|
|
248
248
|
Потім ви зможете переглядати та керувати своїм словником у [Intlayer CMS](https://app.intlayer.org/content).
|
|
249
249
|
|
|
250
|
+
## Програмний доступ за допомогою `@intlayer/api` SDK
|
|
251
|
+
|
|
252
|
+
Крім CLI і візуального редактора, Intlayer поставляється з типізованим SDK у пакеті [`@intlayer/api`](https://www.npmjs.com/package/@intlayer/api). Це дозволяє вам розглядати CMS як **headless content database**: ви можете отримувати проекти, отримувати словники та безпосередньо змінювати їх з вашого власного додатку, скриптів або CI pipeline.
|
|
253
|
+
|
|
254
|
+
SDK обробляє автентифікацію за вас. Доки ваші `clientId` і `clientSecret` доступні (у вашій конфігурації Intlayer або середовищі), він автоматично отримує та оновлює OAuth2 access token та підписує кожен запит.
|
|
255
|
+
|
|
256
|
+
### Установка
|
|
257
|
+
|
|
258
|
+
```bash packageManager="npm"
|
|
259
|
+
npm install @intlayer/api
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
```bash packageManager="yarn"
|
|
263
|
+
yarn add @intlayer/api
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
```bash packageManager="pnpm"
|
|
267
|
+
pnpm add @intlayer/api
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
```bash packageManager="bun"
|
|
271
|
+
bun add @intlayer/api
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Як це працює: authenticator + endpoints
|
|
275
|
+
|
|
276
|
+
SDK розділений на **два окремі імпорти** навмисне, щоб зберегти ваш bundle компактним:
|
|
277
|
+
|
|
278
|
+
1. `createIntlayerCMS` — створює легкий **authenticator**. Він містить лише облікові дані та керований токен доступу; він нічого не знає про будь-який конкретний домен.
|
|
279
|
+
2. `dictionaryEndpoint`, `projectEndpoint`, … — привʼязки **endpoint** для кожного домену, кожна імпортується з власного підпапки (`@intlayer/api/dictionary`, `@intlayer/api/project`, …). Ви передаєте authenticator потрібному вам endpoint.
|
|
280
|
+
|
|
281
|
+
Оскільки кожний endpoint імпортується окремо, ваш bundle містить лише домени, які ви насправді використовуєте — імпортування `dictionaryEndpoint` ніколи не потягне за собою project, AI або будь-який інший клієнт домену.
|
|
282
|
+
|
|
283
|
+
```typescript fileName="cms.ts" codeFormat="typescript"
|
|
284
|
+
import { createIntlayerCMS } from "@intlayer/api";
|
|
285
|
+
|
|
286
|
+
// Конфігурація є необов'язковою: якщо її опущено, облікові дані читаються з
|
|
287
|
+
// `@intlayer/config/built`, що розв'язує змінні середовища INTLAYER_CLIENT_ID та
|
|
288
|
+
// INTLAYER_CLIENT_SECRET.
|
|
289
|
+
export const cmsAuthenticator = createIntlayerCMS();
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
> [!WARNING]
|
|
293
|
+
> Облікові дані CMS (`clientId` / `clientSecret`) надають **доступ до запису** вашого контенту. Завжди створюйте authenticator лише на **серверній стороні** (server actions, route handlers, scripts, CI). Ніколи не імпортуйте його в код на стороні клієнта та не розкривайте ваші облікові дані браузеру.
|
|
294
|
+
|
|
295
|
+
Якщо ви воліте не покладатися на конфігурацію на етапі збирання, передайте облікові дані явно:
|
|
296
|
+
|
|
297
|
+
```typescript fileName="cms.ts" codeFormat="typescript"
|
|
298
|
+
import { createIntlayerCMS } from "@intlayer/api";
|
|
299
|
+
|
|
300
|
+
export const cmsAuthenticator = createIntlayerCMS({
|
|
301
|
+
editor: {
|
|
302
|
+
clientId: process.env.INTLAYER_CLIENT_ID,
|
|
303
|
+
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
304
|
+
// Необов'язково, для самостійно розміщених backend:
|
|
305
|
+
// backendURL: process.env.INTLAYER_BACKEND_URL,
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
> Отримайте свої облікові дані, створивши новий ключ доступу в [Intlayer Dashboard - Projects](https://app.intlayer.org/projects).
|
|
311
|
+
|
|
312
|
+
### Завантажити проекти
|
|
313
|
+
|
|
314
|
+
```typescript fileName="projects.ts" codeFormat="typescript"
|
|
315
|
+
import { createIntlayerCMS } from "@intlayer/api";
|
|
316
|
+
import { projectEndpoint } from "@intlayer/api/project";
|
|
317
|
+
|
|
318
|
+
const cmsAuthenticator = createIntlayerCMS();
|
|
319
|
+
|
|
320
|
+
// Список проектів, доступних з вашими облікові даними
|
|
321
|
+
const { data: projects } =
|
|
322
|
+
await projectEndpoint(cmsAuthenticator).getProjects();
|
|
323
|
+
|
|
324
|
+
// Читання агрегованих інформацій про локалізацію вибраного проекту
|
|
325
|
+
const { data: insights } =
|
|
326
|
+
await projectEndpoint(cmsAuthenticator).getProjectInsights();
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Отримання словників
|
|
330
|
+
|
|
331
|
+
```typescript fileName="read-dictionaries.ts" codeFormat="typescript"
|
|
332
|
+
import { createIntlayerCMS } from "@intlayer/api";
|
|
333
|
+
import { dictionaryEndpoint } from "@intlayer/api/dictionary";
|
|
334
|
+
|
|
335
|
+
const cmsAuthenticator = createIntlayerCMS();
|
|
336
|
+
|
|
337
|
+
// Список усіх віддалених словників проекту
|
|
338
|
+
const { data: dictionaries } =
|
|
339
|
+
await dictionaryEndpoint(cmsAuthenticator).getDictionaries();
|
|
340
|
+
|
|
341
|
+
// Або отримайте один словник за ключем
|
|
342
|
+
const { data: dictionary } = await dictionaryEndpoint(
|
|
343
|
+
cmsAuthenticator
|
|
344
|
+
).getDictionary("my-first-dictionary-key");
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Отправка та оновлення словників
|
|
348
|
+
|
|
349
|
+
Використовуйте CMS як базу даних для запису вмісту назад:
|
|
350
|
+
|
|
351
|
+
```typescript fileName="write-dictionaries.ts" codeFormat="typescript"
|
|
352
|
+
import { createIntlayerCMS } from "@intlayer/api";
|
|
353
|
+
import { dictionaryEndpoint } from "@intlayer/api/dictionary";
|
|
354
|
+
|
|
355
|
+
const cmsAuthenticator = createIntlayerCMS();
|
|
356
|
+
|
|
357
|
+
// Створення нового словника
|
|
358
|
+
await dictionaryEndpoint(cmsAuthenticator).addDictionary({
|
|
359
|
+
key: "my-first-dictionary-key",
|
|
360
|
+
content: { title: "Hello world" },
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
// Upsert пакету словників (створення або оновлення в одному викликі)
|
|
364
|
+
await dictionaryEndpoint(cmsAuthenticator).pushDictionaries([
|
|
365
|
+
{ key: "home", content: { title: "Home" } },
|
|
366
|
+
{ key: "about", content: { title: "About" } },
|
|
367
|
+
]);
|
|
368
|
+
|
|
369
|
+
// Оновлення існуючого словника
|
|
370
|
+
await dictionaryEndpoint(cmsAuthenticator).updateDictionary({
|
|
371
|
+
id: "<dictionary-id>",
|
|
372
|
+
key: "home",
|
|
373
|
+
content: { title: "Updated title" },
|
|
374
|
+
});
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
> Порада: повторно використовуйте прив'язану endpoint, щоб уникнути повторень:
|
|
378
|
+
>
|
|
379
|
+
> ```typescript codeFormat="typescript"
|
|
380
|
+
> const dictionary = dictionaryEndpoint(cmsAuthenticator);
|
|
381
|
+
> await dictionary.pushDictionaries([myDictionary]);
|
|
382
|
+
> const { data } = await dictionary.getDictionaries();
|
|
383
|
+
> ```
|
|
384
|
+
|
|
385
|
+
### Вилучення одного методу
|
|
386
|
+
|
|
387
|
+
Кожен метод endpoint уже автентифікований та самостійний (він має власну обробку токена), тому ви можете вилучити один і передавати його навколо — наприклад, щоб інжектувати його як залежність:
|
|
388
|
+
|
|
389
|
+
```typescript fileName="push.ts" codeFormat="typescript"
|
|
390
|
+
import { createIntlayerCMS } from "@intlayer/api";
|
|
391
|
+
import { dictionaryEndpoint } from "@intlayer/api/dictionary";
|
|
392
|
+
|
|
393
|
+
const dictionary = dictionaryEndpoint(createIntlayerCMS());
|
|
394
|
+
|
|
395
|
+
// Уже автентифіковано — автоматично оновлює токен при кожному виклику
|
|
396
|
+
export const pushDictionaries = dictionary.pushDictionaries;
|
|
397
|
+
|
|
398
|
+
// Використання
|
|
399
|
+
await pushDictionaries([{ key: "home", content: { title: "Home" } }]);
|
|
400
|
+
```
|
|
401
|
+
|
|
250
402
|
## Live Sync
|
|
251
403
|
|
|
252
404
|
Live Sync дозволяє вашому застосунку відображати зміни контенту з CMS під час виконання. Немає потреби у перебудові або повторному розгортанні. Коли увімкнено, оновлення передаються на сервер Live Sync, який оновлює словники, які читає ваш застосунок.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-04-18
|
|
3
3
|
updatedAt: 2026-05-31
|
|
4
|
-
title: "Angular
|
|
5
|
-
description: "Більше ніякого i18next. Посібник 2026 зі створення багатомовного (i18n) застосунку Angular
|
|
4
|
+
title: "Angular 22 i18n - Повний посібник з перекладу вашого застосунку"
|
|
5
|
+
description: "Більше ніякого i18next. Посібник 2026 зі створення багатомовного (i18n) застосунку Angular 22. Перекладайте за допомогою ШІ-агентів та оптимізуйте розмір бандлу, SEO та продуктивність."
|
|
6
6
|
keywords:
|
|
7
7
|
- Інтернаціоналізація
|
|
8
8
|
- Документація
|
|
@@ -13,8 +13,8 @@ slugs:
|
|
|
13
13
|
- doc
|
|
14
14
|
- environment
|
|
15
15
|
- angular
|
|
16
|
-
applicationTemplate: https://github.com/aymericzip/intlayer-angular-
|
|
17
|
-
applicationShowcase: https://intlayer-angular-
|
|
16
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-angular-22-template
|
|
17
|
+
applicationShowcase: https://intlayer-angular-22-template.vercel.app/
|
|
18
18
|
history:
|
|
19
19
|
- version: 8.9.0
|
|
20
20
|
date: 2026-05-04
|
|
@@ -31,7 +31,7 @@ history:
|
|
|
31
31
|
author: aymericzip
|
|
32
32
|
---
|
|
33
33
|
|
|
34
|
-
# Перекладіть ваш вебсайт Angular
|
|
34
|
+
# Перекладіть ваш вебсайт Angular 22 (Vite) за допомогою Intlayer | Інтернаціоналізація (i18n)
|
|
35
35
|
|
|
36
36
|
## Зміст
|
|
37
37
|
|
|
@@ -94,7 +94,7 @@ Intlayer оптимізовано для ідеальної роботи з Angu
|
|
|
94
94
|
<Tab label="Код" value="code">
|
|
95
95
|
|
|
96
96
|
<iframe
|
|
97
|
-
src="https://ide.intlayer.org/aymericzip/intlayer-angular-
|
|
97
|
+
src="https://ide.intlayer.org/aymericzip/intlayer-angular-22-template?file=intlayer.config.ts"
|
|
98
98
|
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
99
99
|
title="Demo CodeSandbox - Як інтернаціоналізувати ваш додаток за допомогою Intlayer"
|
|
100
100
|
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
@@ -105,7 +105,7 @@ Intlayer оптимізовано для ідеальної роботи з Angu
|
|
|
105
105
|
<Tab label="Демо" value="demo">
|
|
106
106
|
|
|
107
107
|
<iframe
|
|
108
|
-
src="https://intlayer-angular-
|
|
108
|
+
src="https://intlayer-angular-22-template.vercel.app/"
|
|
109
109
|
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
110
110
|
title="Demo - intlayer-angular-template"
|
|
111
111
|
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
@@ -115,7 +115,7 @@ Intlayer оптимізовано для ідеальної роботи з Angu
|
|
|
115
115
|
</Tab>
|
|
116
116
|
</Tabs>
|
|
117
117
|
|
|
118
|
-
Перегляньте [Шаблон Додатку](https://github.com/aymericzip/intlayer-angular-
|
|
118
|
+
Перегляньте [Шаблон Додатку](https://github.com/aymericzip/intlayer-angular-22-template) на GitHub.
|
|
119
119
|
|
|
120
120
|
<Steps>
|
|
121
121
|
|
|
@@ -203,7 +203,7 @@ export default config;
|
|
|
203
203
|
|
|
204
204
|
<Step number={3} title="Інтеграція Intlayer у вашу конфігурацію Angular">
|
|
205
205
|
|
|
206
|
-
Щоб інтегрувати Intlayer з Angular CLI, вам потрібно використовувати кастомний збирач. У цьому посібнику передбачається, що ви використовуєте Vite/esbuild (за замовчуванням для проєктів Angular
|
|
206
|
+
Щоб інтегрувати Intlayer з Angular CLI, вам потрібно використовувати кастомний збирач. У цьому посібнику передбачається, що ви використовуєте Vite/esbuild (за замовчуванням для проєктів Angular 22).
|
|
207
207
|
|
|
208
208
|
Спершу змініть ваш `angular.json` для використання користувацького esbuild. Оновіть конфігурації `build` та `serve`:
|
|
209
209
|
|
|
@@ -42,32 +42,7 @@ history:
|
|
|
42
42
|
author: aymericzip
|
|
43
43
|
---
|
|
44
44
|
|
|
45
|
-
# Перекладіть ваш
|
|
46
|
-
|
|
47
|
-
<Tabs defaultTab="code">
|
|
48
|
-
<Tab label="Код" value="code">
|
|
49
|
-
|
|
50
|
-
<iframe
|
|
51
|
-
src="https://ide.intlayer.org/aymericzip/intlayer-next-14-template?file=intlayer.config.ts"
|
|
52
|
-
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
53
|
-
title="Демонстрація CodeSandbox. Як інтернаціоналізувати ваш додаток за допомогою Intlayer"
|
|
54
|
-
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
55
|
-
loading="lazy"
|
|
56
|
-
/>
|
|
57
|
-
|
|
58
|
-
</Tab>
|
|
59
|
-
<Tab label="Демо" value="demo">
|
|
60
|
-
|
|
61
|
-
<iframe
|
|
62
|
-
src="https://intlayer-next-14-template.vercel.app"
|
|
63
|
-
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
64
|
-
title="Демо - intlayer-next-14-template"
|
|
65
|
-
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
66
|
-
loading="lazy"
|
|
67
|
-
/>
|
|
68
|
-
|
|
69
|
-
</Tab>
|
|
70
|
-
</Tabs>
|
|
45
|
+
# Перекладіть ваш веб-сайт Next.js 14 та App Router за допомогою Intlayer | Інтернаціоналізація (i18n)
|
|
71
46
|
|
|
72
47
|
## Зміст
|
|
73
48
|
|