@intlayer/docs 9.1.3 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/rag_powered_documentation_assistant.md +7 -0
- package/blog/de/rag_powered_documentation_assistant.md +6 -0
- package/blog/en-GB/rag_powered_documentation_assistant.md +6 -0
- package/blog/es/rag_powered_documentation_assistant.md +7 -0
- package/blog/fr/i18n_meaning.md +7 -1
- package/blog/fr/list_i18n_technologies/frameworks/angular.md +5 -1
- package/blog/fr/rag_powered_documentation_assistant.md +6 -0
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +119 -42
- package/blog/hi/rag_powered_documentation_assistant.md +7 -0
- package/blog/id/rag_powered_documentation_assistant.md +6 -0
- package/blog/it/rag_powered_documentation_assistant.md +6 -0
- package/blog/ja/rag_powered_documentation_assistant.md +7 -0
- package/blog/ko/list_i18n_technologies/frameworks/react.md +7 -7
- package/blog/ko/rag_powered_documentation_assistant.md +6 -0
- package/blog/pl/rag_powered_documentation_assistant.md +6 -0
- package/blog/pt/rag_powered_documentation_assistant.md +6 -0
- package/blog/ru/rag_powered_documentation_assistant.md +7 -0
- package/blog/tr/intlayer_with_react-intl.md +3 -1
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +175 -42
- package/blog/tr/rag_powered_documentation_assistant.md +6 -0
- package/blog/uk/rag_powered_documentation_assistant.md +6 -0
- package/blog/vi/rag_powered_documentation_assistant.md +6 -0
- package/blog/zh/intlayer_with_i18next.md +87 -28
- package/blog/zh/intlayer_with_next-i18next.md +86 -29
- package/blog/zh/intlayer_with_next-intl.md +88 -28
- package/blog/zh/intlayer_with_react-i18next.md +87 -28
- package/blog/zh/intlayer_with_react-intl.md +88 -27
- package/blog/zh/intlayer_with_vue-i18n.md +117 -8
- package/blog/zh/rag_powered_documentation_assistant.md +6 -0
- package/dist/cjs/generated/blog.entry.cjs +27 -27
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +234 -214
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +17 -17
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +2 -2
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +27 -27
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +234 -214
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +17 -17
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +2 -2
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/analytics.md +222 -0
- package/docs/ar/autoFill.md +28 -9
- package/docs/ar/configuration.md +25 -8
- package/docs/ar/dictionary/file.md +3 -1
- package/docs/ar/dictionary/nesting.md +47 -30
- package/docs/ar/formatters.md +148 -193
- package/docs/ar/intlayer_CMS.md +152 -0
- package/docs/ar/intlayer_with_angular_21.md +9 -9
- package/docs/ar/intlayer_with_nextjs_14.md +1 -28
- package/docs/ar/intlayer_with_nextjs_15.md +1 -33
- package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +40 -83
- package/docs/ar/intlayer_with_solid_start.md +1078 -0
- package/docs/ar/intlayer_with_vite+vue.md +1 -3
- package/docs/ar/packages/intlayer/getLocalizedUrl.md +26 -24
- package/docs/ar/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/ar/packages/react-intlayer/useDictionary.md +4 -21
- package/docs/ar/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/ar/packages/vite-intlayer/exports.md +15 -0
- package/docs/ar/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/ar/packages/vite-intlayer/intlayerPrune.md +70 -3
- package/docs/ar/releases/v9.md +0 -37
- package/docs/ar/self_hosting.md +46 -49
- package/docs/bn/configuration.md +25 -8
- package/docs/bn/intlayer_with_angular_21.md +9 -9
- package/docs/cs/configuration.md +25 -8
- package/docs/cs/intlayer_with_angular_21.md +9 -9
- package/docs/de/analytics.md +222 -0
- package/docs/de/autoFill.md +28 -9
- package/docs/de/configuration.md +25 -8
- package/docs/de/dictionary/file.md +3 -1
- package/docs/de/dictionary/nesting.md +47 -31
- package/docs/de/formatters.md +208 -334
- package/docs/de/intlayer_CMS.md +66 -15
- package/docs/de/intlayer_with_angular_21.md +9 -9
- package/docs/de/intlayer_with_nestjs.md +11 -7
- package/docs/de/intlayer_with_nextjs_14.md +1 -28
- package/docs/de/intlayer_with_nextjs_15.md +1 -33
- package/docs/de/intlayer_with_solid_start.md +1078 -0
- package/docs/de/intlayer_with_vite+vue.md +1 -3
- package/docs/de/packages/intlayer/getLocalizedUrl.md +33 -25
- package/docs/de/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/de/packages/react-intlayer/useDictionary.md +2 -5
- package/docs/de/packages/vite-intlayer/exports.md +15 -0
- package/docs/de/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/de/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/de/releases/v9.md +0 -15
- package/docs/de/self_hosting.md +46 -50
- package/docs/en/cli/doc-review.md +13 -2
- package/docs/en/configuration.md +24 -15
- package/docs/en/intlayer_with_angular_21.md +9 -9
- package/docs/en/intlayer_with_solid_start.md +1091 -0
- package/docs/en/intlayer_with_vite+solid.md +12 -0
- package/docs/en-GB/analytics.md +222 -0
- package/docs/en-GB/autoFill.md +26 -7
- package/docs/en-GB/configuration.md +25 -8
- package/docs/en-GB/dictionary/file.md +2 -0
- package/docs/en-GB/dictionary/nesting.md +64 -205
- package/docs/en-GB/formatters.md +146 -181
- package/docs/en-GB/intlayer_CMS.md +152 -0
- package/docs/en-GB/intlayer_with_angular_21.md +9 -9
- package/docs/en-GB/intlayer_with_nestjs.md +6 -2
- package/docs/en-GB/intlayer_with_nextjs_14.md +0 -27
- package/docs/en-GB/intlayer_with_nextjs_15.md +1 -33
- package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +40 -82
- package/docs/en-GB/intlayer_with_solid_start.md +1078 -0
- package/docs/en-GB/intlayer_with_vite+vue.md +1 -3
- package/docs/en-GB/packages/intlayer/getLocalizedUrl.md +30 -22
- package/docs/en-GB/packages/intlayer/getMultilingualUrls.md +16 -48
- package/docs/en-GB/packages/vite-intlayer/exports.md +15 -0
- package/docs/en-GB/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/en-GB/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/en-GB/self_hosting.md +60 -49
- package/docs/es/analytics.md +222 -0
- package/docs/es/autoFill.md +28 -9
- package/docs/es/configuration.md +24 -7
- package/docs/es/dictionary/file.md +3 -1
- package/docs/es/dictionary/nesting.md +47 -30
- package/docs/es/formatters.md +114 -168
- package/docs/es/intlayer_CMS.md +35 -10
- package/docs/es/intlayer_with_angular_21.md +9 -9
- package/docs/es/intlayer_with_nextjs_14.md +1 -28
- package/docs/es/intlayer_with_nextjs_15.md +1 -33
- package/docs/es/intlayer_with_solid_start.md +1078 -0
- package/docs/es/packages/intlayer/getLocalizedUrl.md +31 -23
- package/docs/es/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/es/packages/vite-intlayer/exports.md +15 -0
- package/docs/es/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/es/packages/vite-intlayer/intlayerPrune.md +69 -2
- package/docs/es/releases/v9.md +0 -15
- package/docs/es/self_hosting.md +46 -49
- package/docs/fr/analytics.md +222 -0
- package/docs/fr/autoFill.md +27 -8
- package/docs/fr/configuration.md +25 -8
- package/docs/fr/dictionary/file.md +2 -0
- package/docs/fr/dictionary/nesting.md +37 -184
- package/docs/fr/formatters.md +95 -236
- package/docs/fr/intlayer_CMS.md +66 -15
- package/docs/fr/intlayer_with_angular_21.md +9 -9
- package/docs/fr/intlayer_with_nextjs_14.md +1 -28
- package/docs/fr/intlayer_with_nextjs_15.md +1 -33
- package/docs/fr/intlayer_with_solid_start.md +1078 -0
- package/docs/fr/packages/intlayer/getLocalizedUrl.md +37 -27
- package/docs/fr/packages/intlayer/getMultilingualUrls.md +18 -20
- package/docs/fr/packages/vite-intlayer/exports.md +15 -0
- package/docs/fr/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/fr/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/fr/releases/v9.md +0 -15
- package/docs/fr/self_hosting.md +46 -49
- package/docs/hi/analytics.md +222 -0
- package/docs/hi/autoFill.md +28 -9
- package/docs/hi/configuration.md +25 -8
- package/docs/hi/dictionary/file.md +3 -1
- package/docs/hi/dictionary/nesting.md +47 -30
- package/docs/hi/formatters.md +233 -334
- package/docs/hi/how_works_intlayer.md +3 -1
- package/docs/hi/intlayer_CMS.md +152 -0
- package/docs/hi/intlayer_with_angular_21.md +9 -9
- package/docs/hi/intlayer_with_nestjs.md +11 -7
- package/docs/hi/intlayer_with_nextjs_14.md +1 -28
- package/docs/hi/intlayer_with_nextjs_15.md +1 -33
- package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +40 -83
- package/docs/hi/intlayer_with_solid_start.md +1077 -0
- package/docs/hi/intlayer_with_vite+preact.md +56 -49
- package/docs/hi/intlayer_with_vite+react.md +48 -41
- package/docs/hi/intlayer_with_vite+solid.md +32 -41
- package/docs/hi/intlayer_with_vite+vue.md +49 -44
- package/docs/hi/packages/intlayer/getLocalizedUrl.md +26 -24
- package/docs/hi/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/hi/packages/next-intlayer/t.md +33 -1
- package/docs/hi/packages/react-intlayer/useDictionary.md +4 -21
- package/docs/hi/packages/vite-intlayer/exports.md +15 -0
- package/docs/hi/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/hi/packages/vite-intlayer/intlayerPrune.md +78 -5
- package/docs/hi/plugins/sync-json.md +9 -9
- package/docs/hi/releases/v9.md +0 -15
- package/docs/hi/self_hosting.md +38 -51
- package/docs/id/analytics.md +223 -0
- package/docs/id/configuration.md +25 -8
- package/docs/id/dictionary/nesting.md +37 -184
- package/docs/id/formatters.md +208 -305
- package/docs/id/intlayer_CMS.md +164 -0
- package/docs/id/intlayer_with_angular_21.md +9 -9
- package/docs/id/intlayer_with_nextjs_14.md +1 -26
- package/docs/id/intlayer_with_react_router_v7_fs_routes.md +70 -63
- package/docs/id/intlayer_with_solid_start.md +1078 -0
- package/docs/id/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/id/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/id/packages/vite-intlayer/exports.md +15 -0
- package/docs/id/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/id/packages/vite-intlayer/intlayerPrune.md +78 -5
- package/docs/id/releases/v9.md +12 -0
- package/docs/id/self_hosting.md +61 -50
- package/docs/it/analytics.md +222 -0
- package/docs/it/autoFill.md +27 -8
- package/docs/it/configuration.md +25 -8
- package/docs/it/dictionary/file.md +3 -1
- package/docs/it/dictionary/nesting.md +47 -30
- package/docs/it/formatters.md +114 -168
- package/docs/it/intlayer_CMS.md +66 -15
- package/docs/it/intlayer_with_angular_21.md +9 -9
- package/docs/it/intlayer_with_nestjs.md +11 -7
- package/docs/it/intlayer_with_nextjs_14.md +1 -28
- package/docs/it/intlayer_with_nextjs_15.md +1 -33
- package/docs/it/intlayer_with_solid_start.md +1078 -0
- package/docs/it/intlayer_with_vite+vue.md +1 -3
- package/docs/it/packages/intlayer/getLocalizedUrl.md +34 -26
- package/docs/it/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/it/packages/react-intlayer/useDictionary.md +4 -21
- package/docs/it/packages/vite-intlayer/exports.md +15 -0
- package/docs/it/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/it/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/it/releases/v9.md +0 -15
- package/docs/it/self_hosting.md +60 -49
- package/docs/ja/analytics.md +222 -0
- package/docs/ja/autoFill.md +28 -9
- package/docs/ja/configuration.md +25 -8
- package/docs/ja/dictionary/content_file.md +15 -7
- package/docs/ja/dictionary/file.md +3 -1
- package/docs/ja/dictionary/nesting.md +47 -30
- package/docs/ja/formatters.md +133 -187
- package/docs/ja/intlayer_visual_editor.md +3 -1
- package/docs/ja/intlayer_with_angular_21.md +6 -6
- package/docs/ja/intlayer_with_nestjs.md +2 -12
- package/docs/ja/intlayer_with_nextjs_14.md +1 -28
- package/docs/ja/intlayer_with_nextjs_15.md +1 -33
- package/docs/ja/intlayer_with_react_router_v7.md +456 -20
- package/docs/ja/intlayer_with_solid_start.md +1078 -0
- package/docs/ja/intlayer_with_vite+preact.md +73 -41
- package/docs/ja/intlayer_with_vite+vue.md +1 -3
- package/docs/ja/mcp_server.md +3 -9
- package/docs/ja/packages/intlayer/getLocalizedUrl.md +26 -24
- package/docs/ja/packages/intlayer/getMultilingualUrls.md +3 -17
- package/docs/ja/packages/vite-intlayer/exports.md +15 -0
- package/docs/ja/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/ja/packages/vite-intlayer/intlayerPrune.md +79 -6
- package/docs/ja/releases/v9.md +12 -0
- package/docs/ja/self_hosting.md +46 -50
- package/docs/ko/analytics.md +222 -0
- package/docs/ko/autoFill.md +28 -9
- package/docs/ko/configuration.md +25 -8
- package/docs/ko/dictionary/file.md +3 -1
- package/docs/ko/dictionary/nesting.md +47 -30
- package/docs/ko/formatters.md +133 -187
- package/docs/ko/intlayer_with_angular_21.md +9 -9
- package/docs/ko/intlayer_with_lynx+react.md +133 -39
- package/docs/ko/intlayer_with_nextjs_14.md +1 -28
- package/docs/ko/intlayer_with_nextjs_15.md +1 -33
- package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +40 -188
- package/docs/ko/intlayer_with_solid_start.md +1078 -0
- package/docs/ko/intlayer_with_vite+preact.md +57 -23
- package/docs/ko/intlayer_with_vite+vue.md +1 -3
- package/docs/ko/packages/intlayer/getLocalizedUrl.md +26 -24
- package/docs/ko/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/ko/packages/vite-intlayer/exports.md +15 -0
- package/docs/ko/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/ko/packages/vite-intlayer/intlayerPrune.md +79 -6
- package/docs/ko/releases/v9.md +12 -0
- package/docs/ko/self_hosting.md +60 -49
- package/docs/nl/configuration.md +25 -8
- package/docs/nl/intlayer_with_angular_21.md +9 -9
- package/docs/pl/analytics.md +220 -0
- package/docs/pl/configuration.md +25 -8
- package/docs/pl/dictionary/nesting.md +47 -30
- package/docs/pl/formatters.md +208 -305
- package/docs/pl/intlayer_CMS.md +152 -0
- package/docs/pl/intlayer_with_angular_21.md +9 -9
- package/docs/pl/intlayer_with_nextjs_14.md +1 -26
- package/docs/pl/intlayer_with_solid_start.md +1078 -0
- package/docs/pl/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/pl/packages/react-intlayer/useDictionary.md +2 -19
- package/docs/pl/packages/vite-intlayer/exports.md +15 -0
- package/docs/pl/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/pl/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/pl/releases/v9.md +0 -15
- package/docs/pl/self_hosting.md +60 -49
- package/docs/pt/analytics.md +222 -0
- package/docs/pt/configuration.md +25 -8
- package/docs/pt/dictionary/file.md +3 -1
- package/docs/pt/dictionary/nesting.md +47 -30
- package/docs/pt/formatters.md +112 -168
- package/docs/pt/intlayer_CMS.md +66 -15
- package/docs/pt/intlayer_with_angular_21.md +9 -9
- package/docs/pt/intlayer_with_astro_lit.md +26 -1
- package/docs/pt/intlayer_with_nextjs_14.md +1 -28
- package/docs/pt/intlayer_with_nextjs_15.md +1 -33
- package/docs/pt/intlayer_with_solid_start.md +1078 -0
- package/docs/pt/intlayer_with_vite+vue.md +1 -3
- package/docs/pt/packages/intlayer/getLocalizedUrl.md +34 -26
- package/docs/pt/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/pt/packages/vite-intlayer/exports.md +15 -0
- package/docs/pt/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/pt/packages/vite-intlayer/intlayerPrune.md +78 -6
- package/docs/pt/releases/v9.md +0 -15
- package/docs/pt/self_hosting.md +60 -49
- package/docs/ru/analytics.md +222 -0
- package/docs/ru/autoFill.md +27 -8
- package/docs/ru/configuration.md +25 -8
- package/docs/ru/dictionary/file.md +3 -1
- package/docs/ru/dictionary/nesting.md +64 -205
- package/docs/ru/formatters.md +108 -128
- package/docs/ru/intlayer_with_angular_21.md +9 -9
- package/docs/ru/intlayer_with_nextjs_14.md +1 -28
- package/docs/ru/intlayer_with_nextjs_15.md +1 -33
- package/docs/ru/intlayer_with_solid_start.md +1078 -0
- package/docs/ru/intlayer_with_vite+vue.md +1 -3
- package/docs/ru/packages/intlayer/getLocalizedUrl.md +34 -26
- package/docs/ru/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/ru/packages/react-intlayer/useDictionary.md +4 -21
- package/docs/ru/packages/vite-intlayer/exports.md +15 -0
- package/docs/ru/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/ru/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/ru/releases/v9.md +0 -15
- package/docs/ru/self_hosting.md +60 -49
- package/docs/tr/analytics.md +222 -0
- package/docs/tr/autoFill.md +28 -9
- package/docs/tr/configuration.md +25 -8
- package/docs/tr/dictionary/file.md +2 -0
- package/docs/tr/dictionary/nesting.md +47 -30
- package/docs/tr/formatters.md +144 -190
- package/docs/tr/intlayer_CMS.md +152 -0
- package/docs/tr/intlayer_with_angular_21.md +9 -9
- package/docs/tr/intlayer_with_nestjs.md +2 -12
- package/docs/tr/intlayer_with_nextjs_15.md +1 -33
- package/docs/tr/intlayer_with_solid_start.md +1078 -0
- package/docs/tr/intlayer_with_vite+vue.md +1 -3
- package/docs/tr/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/tr/packages/vite-intlayer/exports.md +15 -0
- package/docs/tr/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/tr/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/tr/self_hosting.md +47 -50
- package/docs/uk/analytics.md +222 -0
- package/docs/uk/configuration.md +25 -8
- package/docs/uk/dictionary/nesting.md +47 -30
- package/docs/uk/formatters.md +128 -185
- package/docs/uk/intlayer_CMS.md +152 -0
- package/docs/uk/intlayer_with_angular_21.md +9 -9
- package/docs/uk/intlayer_with_nextjs_14.md +1 -26
- package/docs/uk/intlayer_with_solid_start.md +1078 -0
- package/docs/uk/packages/react-intlayer/useDictionary.md +2 -19
- package/docs/uk/packages/vite-intlayer/exports.md +15 -0
- package/docs/uk/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/uk/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/uk/releases/v9.md +0 -15
- package/docs/uk/self_hosting.md +60 -50
- package/docs/ur/configuration.md +25 -8
- package/docs/ur/intlayer_with_angular_21.md +9 -9
- package/docs/vi/analytics.md +222 -0
- package/docs/vi/configuration.md +24 -8
- package/docs/vi/dictionary/nesting.md +37 -184
- package/docs/vi/formatters.md +208 -309
- package/docs/vi/intlayer_CMS.md +164 -0
- package/docs/vi/intlayer_with_angular_21.md +9 -9
- package/docs/vi/intlayer_with_nextjs_14.md +0 -25
- package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +70 -63
- package/docs/vi/intlayer_with_solid_start.md +1078 -0
- package/docs/vi/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/vi/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/vi/packages/vite-intlayer/exports.md +15 -0
- package/docs/vi/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/vi/packages/vite-intlayer/intlayerPrune.md +77 -4
- package/docs/vi/plugins/sync-json.md +6 -6
- package/docs/vi/releases/v9.md +12 -0
- package/docs/vi/self_hosting.md +61 -50
- package/docs/zh/CI_CD.md +4 -0
- package/docs/zh/analytics.md +222 -0
- package/docs/zh/autoFill.md +28 -9
- package/docs/zh/configuration.md +24 -8
- package/docs/zh/dictionary/file.md +2 -0
- package/docs/zh/dictionary/nesting.md +47 -30
- package/docs/zh/formatters.md +140 -188
- package/docs/zh/intlayer_CMS.md +164 -0
- package/docs/zh/intlayer_with_analog.md +193 -3
- package/docs/zh/intlayer_with_angular_19.md +272 -3
- package/docs/zh/intlayer_with_angular_21.md +7 -7
- package/docs/zh/intlayer_with_create_react_app.md +348 -26
- package/docs/zh/intlayer_with_lynx+react.md +263 -4
- package/docs/zh/intlayer_with_nextjs_14.md +1 -28
- package/docs/zh/intlayer_with_nextjs_15.md +1 -33
- package/docs/zh/intlayer_with_nextjs_no_locale_path.md +558 -1
- package/docs/zh/intlayer_with_nuxt.md +182 -7
- package/docs/zh/intlayer_with_react_router_v7.md +183 -25
- package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +306 -42
- package/docs/zh/intlayer_with_solid_start.md +1077 -0
- package/docs/zh/intlayer_with_storybook.md +260 -3
- package/docs/zh/intlayer_with_svelte_kit.md +428 -48
- package/docs/zh/intlayer_with_tanstack+solid.md +713 -13
- package/docs/zh/intlayer_with_tanstack.md +731 -20
- package/docs/zh/intlayer_with_vanilla.md +314 -4
- package/docs/zh/intlayer_with_vite+lit.md +465 -4
- package/docs/zh/intlayer_with_vite+preact.md +422 -116
- package/docs/zh/intlayer_with_vite+react.md +324 -45
- package/docs/zh/intlayer_with_vite+react_compiler.md +228 -13
- package/docs/zh/intlayer_with_vite+solid.md +462 -32
- package/docs/zh/intlayer_with_vite+vanilla.md +497 -4
- package/docs/zh/mcp_server.md +3 -9
- package/docs/zh/packages/intlayer/getLocalizedUrl.md +26 -24
- package/docs/zh/packages/intlayer/getMultilingualUrls.md +4 -18
- package/docs/zh/packages/vite-intlayer/exports.md +29 -0
- package/docs/zh/packages/vite-intlayer/intlayer.md +121 -6
- package/docs/zh/packages/vite-intlayer/intlayerPrune.md +79 -6
- package/docs/zh/releases/v9.md +12 -0
- package/docs/zh/self_hosting.md +60 -50
- package/docs/zh-TW/intlayer_with_angular_21.md +7 -7
- package/package.json +6 -6
- package/src/generated/blog.entry.ts +27 -27
- package/src/generated/docs.entry.ts +234 -214
- package/src/generated/frequentQuestions.entry.ts +17 -17
- package/src/generated/legal.entry.ts +2 -2
|
@@ -50,26 +50,12 @@ getMultilingualUrls(
|
|
|
50
50
|
|
|
51
51
|
## Tham số
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
### Các Tham Số Bắt Buộc
|
|
54
54
|
|
|
55
55
|
- `url: string`
|
|
56
|
-
- **
|
|
57
|
-
- **
|
|
58
|
-
|
|
59
|
-
- `locales: Locales[]`
|
|
60
|
-
- **Mô tả**: Mảng tùy chọn các ngôn ngữ được hỗ trợ. Mặc định là các ngôn ngữ đã cấu hình trong dự án.
|
|
61
|
-
- **Kiểu**: `Locales[]`
|
|
62
|
-
- **Mặc định**: `localesDefault`
|
|
63
|
-
|
|
64
|
-
- `defaultLocale: Locales`
|
|
65
|
-
- **Mô tả**: Ngôn ngữ mặc định cho ứng dụng. Mặc định là ngôn ngữ mặc định đã cấu hình trong dự án.
|
|
66
|
-
- **Kiểu**: `Locales`
|
|
67
|
-
- **Mặc định**: `defaultLocaleDefault`
|
|
68
|
-
|
|
69
|
-
- `prefixDefault: boolean`
|
|
70
|
-
- **Mô tả**: Có thêm tiền tố cho ngôn ngữ mặc định hay không. Mặc định theo giá trị đã cấu hình trong dự án.
|
|
71
|
-
- **Kiểu**: `boolean`
|
|
72
|
-
- **Mặc định**: `prefixDefaultDefault`
|
|
56
|
+
- **Description**: Chuỗi URL gốc được thêm tiền tố với các locale.
|
|
57
|
+
- **Type**: `string`
|
|
58
|
+
- **Required**: Yes
|
|
73
59
|
|
|
74
60
|
### Tham số tùy chọn
|
|
75
61
|
|
|
@@ -25,9 +25,9 @@ history:
|
|
|
25
25
|
author: aymericzip
|
|
26
26
|
---
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
# Tài liệu Hook useIntlayer
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
Hook `useIntlayer` cho phép bạn truy xuất nội dung được bản địa hóa từ một từ điển bằng khóa của nó. Nó dựa trên `useDictionary` nhưng tự động đưa vào một phiên bản tối ưu hóa của từ điển từ các khai báo được tạo ra.
|
|
31
31
|
|
|
32
32
|
## Ví dụ sử dụng trong React
|
|
33
33
|
|
|
@@ -48,3 +48,18 @@ import "vite-intlayer";
|
|
|
48
48
|
| `intlayerProxy` | Plugin middleware cho môi trường phát triển để xử lý phát hiện locale và định tuyến. | - |
|
|
49
49
|
| `intlayerMiddleware` | (**Không còn được khuyến nghị**) Bí danh cho `intlayerProxy`. | - |
|
|
50
50
|
| `intlayerPrune` | Plugin để tree-shake và loại bỏ các từ điển không dùng trong quá trình build. | [intlayerPrune](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/vite-intlayer/intlayerPrune.md) |
|
|
51
|
+
|
|
52
|
+
### Tiện ích
|
|
53
|
+
|
|
54
|
+
| Export | Mô tả | Tài liệu liên quan |
|
|
55
|
+
| ---------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
56
|
+
| `createIntlayerProxyHandler` | Trả về middleware Node.js `(req, res, next)` độc lập với framework với logic định tuyến theo locale. | [intlayerProxy](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/vite-intlayer/intlayerProxy.md) |
|
|
57
|
+
|
|
58
|
+
### Types
|
|
59
|
+
|
|
60
|
+
| Export | Description |
|
|
61
|
+
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
|
|
62
|
+
| `IntlayerPluginOptions` | Các tùy chọn được chấp nhận bởi `intlayer()`. Extends `GetConfigurationOptions` với `compatCallers` và `proxy`. |
|
|
63
|
+
| `IntlayerProxyPluginOptions` | Các tùy chọn được chấp nhận bởi `intlayerProxy()` và `createIntlayerProxyHandler()`. Bao gồm `ignore` và `configOptions`. |
|
|
64
|
+
| `IntlayerCompilerOptions` | Các tùy chọn được chấp nhận bởi `intlayerCompiler()`. Bao gồm `configOptions` và `compilerConfig`. |
|
|
65
|
+
| `CompatCallerConfig` | Re-export từ `@intlayer/babel`. Mô tả một compat-adapter caller pattern cho field-usage analysis. |
|
|
@@ -39,11 +39,126 @@ export default defineConfig({
|
|
|
39
39
|
});
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
##
|
|
42
|
+
## Tùy chọn
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
```ts
|
|
45
|
+
import type { IntlayerPluginOptions } from "vite-intlayer";
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`IntlayerPluginOptions` extends `GetConfigurationOptions` (see `@intlayer/config`) với các trường bổ sung sau:
|
|
49
|
+
|
|
50
|
+
| Option | Type | Default | Description |
|
|
51
|
+
| --------------- | ------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
52
|
+
| `compatCallers` | `CompatCallerConfig[]` | `[]` | Các mẫu caller bổ sung cho các gói compat-adapter (ví dụ: `@intlayer/react-i18next`). Được truyền tới bộ phân tích field-usage tại thời điểm xây dựng. |
|
|
53
|
+
| `proxy` | `{ ignore?: (req) => boolean }` | `undefined` | Các tùy chọn được chuyển tiếp tới proxy định tuyến locale được đóng gói. Sử dụng `ignore` để loại trừ các đường dẫn cụ thể (ví dụ: các API routes) khỏi định tuyến locale. |
|
|
54
|
+
|
|
55
|
+
Tất cả các tùy chọn khác (`override`, `configFile`, …) được chuyển tiếp trực tiếp tới `getConfiguration()`.
|
|
56
|
+
|
|
57
|
+
### Ví dụ
|
|
58
|
+
|
|
59
|
+
#### Bỏ qua các tuyến đường API khỏi định tuyến locale
|
|
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
|
+
#### Với đường dẫn tệp cấu hình tùy chỉnh
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
export default defineConfig({
|
|
81
|
+
plugins: [
|
|
82
|
+
intlayer({
|
|
83
|
+
configFile: "./config/intlayer.config.ts",
|
|
84
|
+
}),
|
|
85
|
+
],
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
#### Với 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
|
+
## Những gì plugin làm
|
|
105
|
+
|
|
106
|
+
### 1. Chuẩn bị từ điển
|
|
107
|
+
|
|
108
|
+
Trước khi build bắt đầu (và mỗi giờ một lần trong dev), `intlayer` gọi `prepareIntlayer` để biên dịch tất cả các tệp `.content.ts` thành các từ điển JSON được tối ưu hóa được lưu trữ trong `.intlayer/`.
|
|
109
|
+
|
|
110
|
+
### 2. Module aliases
|
|
111
|
+
|
|
112
|
+
Plugin thêm các Vite resolve aliases để `import { myDict } from 'intlayer/dictionaries/my-dict'` giải quyết thành file JSON được biên dịch trên đĩa. SSR builds sử dụng `ssr.noExternal` để đảm bảo tất cả các package `@intlayer/*` được bundle với aliases được áp dụng.
|
|
113
|
+
|
|
114
|
+
### 3. Dev-server watcher
|
|
115
|
+
|
|
116
|
+
Ở chế độ phát triển, một `chokidar` watcher được khởi động. Khi một file `.content.ts` thay đổi, các từ điển được biên dịch lại và HMR của Vite truyền bá cập nhật tới trình duyệt.
|
|
117
|
+
|
|
118
|
+
### 4. Proxy định tuyến locale được đóng gói (v9+)
|
|
119
|
+
|
|
120
|
+
Kể từ Intlayer v9, middleware `intlayerProxy` được đăng ký tự động bên trong `intlayer()`. Nó xử lý:
|
|
121
|
+
|
|
122
|
+
- Phát hiện locale từ tiền tố URL, cookies và header `Accept-Language`.
|
|
123
|
+
- Chuyển hướng 301 khi locale được phát hiện không khớp với URL hiện tại.
|
|
124
|
+
- Viết lại URL nội bộ để framework nhìn thấy tham số route `[locale]` chính xác.
|
|
125
|
+
|
|
126
|
+
Proxy được kiểm soát bởi `routing.enableProxy` (mặc định `true`) trong cấu hình Intlayer của bạn. Để tắt nó hoàn toàn:
|
|
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
|
+
Để tùy chỉnh hành vi proxy mà không cần gọi `intlayerProxy()` riêng biệt, hãy truyền các tùy chọn `proxy` cho plugin chính:
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
intlayer({ proxy: { ignore: (req) => req.url?.startsWith("/api") } });
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Xem [tài liệu intlayerProxy](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/vite-intlayer/intlayerProxy.md) để tham khảo đầy đủ về hành vi định tuyến.
|
|
144
|
+
|
|
145
|
+
### 5. Trình biên dịch được đóng gói (v9+)
|
|
146
|
+
|
|
147
|
+
Khi `compiler.enabled` là `true` **và** `compiler.output` được đặt trong cấu hình Intlayer của bạn, `intlayer()` sẽ tự động đăng ký `intlayerCompiler`. Trình biên dịch trích xuất các khai báo nội dung nội tuyến được viết trực tiếp bên trong các tệp thành phần và ghi chúng vào các từ điển tại thời điểm chuyển đổi. Xem [tài liệu intlayerCompiler](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/vite-intlayer/intlayerCompiler.md).
|
|
148
|
+
|
|
149
|
+
### 6. Tối ưu hóa Build
|
|
150
|
+
|
|
151
|
+
Trong quá trình build production, plugin thêm:
|
|
152
|
+
|
|
153
|
+
- **intlayerOptimize** – Babel transform viết lại `useIntlayer('key')` → `useDictionary(hash)` và inject các JSON imports trực tiếp.
|
|
154
|
+
- **intlayerPrune** – loại bỏ các content fields không sử dụng từ dictionary JSON.
|
|
155
|
+
- **intlayerMinify** – nén dictionary JSON và tùy chọn mangle tên các field.
|
|
156
|
+
|
|
157
|
+
Những tính năng này không hoạt động trong chế độ development.
|
|
158
|
+
|
|
159
|
+
## Các alias không được dùng nữa
|
|
45
160
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
161
|
+
| Export không được dùng nữa | Thay thế |
|
|
162
|
+
| -------------------------- | ---------- |
|
|
163
|
+
| `intlayerPlugin` | `intlayer` |
|
|
164
|
+
| `intLayerPlugin` | `intlayer` |
|
|
@@ -30,16 +30,89 @@ Plugin Vite `intlayerPrune` được sử dụng để thực hiện tree-shakin
|
|
|
30
30
|
|
|
31
31
|
## Cách sử dụng
|
|
32
32
|
|
|
33
|
+
### Như một phần của `intlayer()` (được khuyến nghị)
|
|
34
|
+
|
|
35
|
+
Bật pruning thông qua cấu hình Intlayer của bạn và plugin chính sẽ xử lý mọi thứ:
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
// intlayer.config.ts
|
|
39
|
+
import { defineConfig } from "intlayer";
|
|
40
|
+
|
|
41
|
+
export default defineConfig({
|
|
42
|
+
build: {
|
|
43
|
+
optimize: true, // kích hoạt cả prune và 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
|
+
### Độc lập
|
|
59
|
+
|
|
60
|
+
Nếu bạn đang soạn stack plugin thủ công, `intlayerPrune` và `intlayerMinify` chia sẻ một object `PruneContext` phải được tạo một lần và truyền cho cả hai:
|
|
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), // tuỳ chọn, đọc từ cùng một context
|
|
76
|
+
],
|
|
40
77
|
});
|
|
41
78
|
```
|
|
42
79
|
|
|
43
|
-
##
|
|
80
|
+
## Cách thức hoạt động
|
|
81
|
+
|
|
82
|
+
### 1. Phân tích cách sử dụng (buildStart)
|
|
83
|
+
|
|
84
|
+
Trong `buildStart`, plugin `intlayerOptimize` (cũng là một phần của `intlayer()`) quét mọi tệp nguồn component được liệt kê trong `build.filesList`. Với mỗi lệnh gọi `useIntlayer('key')` hoặc `getIntlayer('key')`, nó ghi lại chính xác những trường nào được truy cập, ví dụ:
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
const { title, description } = useIntlayer("myDict");
|
|
88
|
+
// records: myDict → { title, description }
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Điều này xây dựng `pruneContext.fieldUsageMap` trước khi bất kỳ lệnh gọi `transform` nào chạy.
|
|
92
|
+
|
|
93
|
+
### 2. JSON pruning (transform, enforce: 'pre')
|
|
94
|
+
|
|
95
|
+
When Vite processes a compiled dictionary JSON file, `intlayerPrune` intercepts it before Vite's built-in JSON → ESM conversion. It reads the field-usage map from `pruneContext` and removes any content field that is not in the recorded usage set.
|
|
96
|
+
|
|
97
|
+
Two content shapes are supported:
|
|
98
|
+
|
|
99
|
+
- **Static dictionaries** — `{ nodeType: "translation", translation: { en: {...}, fr: {...} } }`. Fields are pruned per-locale inside `translation`.
|
|
100
|
+
- **Dynamic (per-locale) dictionaries** — flat `{ fieldA: ..., fieldB: ... }`. Fields are pruned at the top level.
|
|
101
|
+
|
|
102
|
+
### 3. Các trường hợp đặc biệt
|
|
103
|
+
|
|
104
|
+
Nếu cấu trúc nội dung của một dictionary không thể được nhận dạng (ví dụ: một hình dạng lồng ghép không thông thường), nó sẽ được thêm vào `pruneContext.dictionariesWithEdgeCases` và **được để nguyên**. Một cảnh báo sẽ được ghi lại. `intlayerMinify` cũng bỏ qua những dictionary này.
|
|
105
|
+
|
|
106
|
+
### 4. Field-rename map
|
|
107
|
+
|
|
108
|
+
Khi pruning thành công, `intlayerPrune` cũng ghi `pruneContext.dictionaryKeyToFieldRenameMap` — một ánh xạ từ tên trường gốc sang các bí danh ngắn. `intlayerMinify` đọc bản đồ này để đổi tên các trường trong JSON đầu ra, và Babel rename pass của `intlayerOptimize` cập nhật các truy cập thuộc tính trong các tệp nguồn tương ứng.
|
|
109
|
+
|
|
110
|
+
## Điều kiện kích hoạt
|
|
111
|
+
|
|
112
|
+
`intlayerPrune` được kích hoạt **chỉ khi** tất cả các điều kiện sau đây đều đúng:
|
|
113
|
+
|
|
114
|
+
1. Lệnh Vite là `build`.
|
|
115
|
+
2. `build.optimize` là `true` (hoặc `undefined`, mặc định là `true` cho các bản build).
|
|
116
|
+
3. `build.purge` là `true` trong cấu hình Intlayer của bạn.
|
|
44
117
|
|
|
45
|
-
|
|
118
|
+
Nó được tự động **vô hiệu hóa** khi `editor.enabled` là `true` vì trình chỉnh sửa cần toàn bộ nội dung từ điển.
|
|
@@ -170,11 +170,11 @@ const config: IntlayerConfig = {
|
|
|
170
170
|
export default config;
|
|
171
171
|
```
|
|
172
172
|
|
|
173
|
-
|
|
173
|
+
#### Cách thức hoạt động
|
|
174
174
|
|
|
175
|
-
-
|
|
176
|
-
-
|
|
177
|
-
-
|
|
175
|
+
- Read: plugin khám phá các tệp JSON từ builder `source` của bạn và tải chúng dưới dạng từ điển Intlayer.
|
|
176
|
+
- Write: sau khi builds và fills, nó ghi JSON được localize trở lại cùng các đường dẫn (với một dòng mới cuối cùng để tránh vấn đề định dạng).
|
|
177
|
+
- Auto‑fill: plugin khai báo đường dẫn `autoFill` cho mỗi từ điển. Chạy `intlayer fill` cập nhật chỉ các bản dịch bị thiếu trong các tệp JSON của bạn theo mặc định.
|
|
178
178
|
|
|
179
179
|
API:
|
|
180
180
|
|
|
@@ -183,8 +183,8 @@ syncJSON({
|
|
|
183
183
|
source: ({ key, locale }) => string, // bắt buộc
|
|
184
184
|
location?: string, // nhãn tùy chọn, mặc định: "plugin"
|
|
185
185
|
priority?: number, // ưu tiên tùy chọn để giải quyết xung đột, mặc định: 0
|
|
186
|
-
format?: 'intlayer' | 'icu' | 'i18next', //
|
|
187
|
-
splitKeys?: boolean, // tùy chọn, chia một tệp thành một từ điển cho mỗi khóa cấp cao nhất (tự động phát hiện)
|
|
186
|
+
format?: 'intlayer' | 'icu' | 'i18next', // formatter tùy chọn, được sử dụng cho tính tương thích runtime của intlayer
|
|
187
|
+
splitKeys?: boolean, // tùy chọn, chia một tệp duy nhất thành một từ điển cho mỗi khóa cấp cao nhất (tự động phát hiện)
|
|
188
188
|
});
|
|
189
189
|
```
|
|
190
190
|
|
package/docs/vi/releases/v9.md
CHANGED
|
@@ -362,6 +362,18 @@ await dictionaryEndpoint(cms).pushDictionaries([myDictionary]);
|
|
|
362
362
|
|
|
363
363
|
---
|
|
364
364
|
|
|
365
|
+
## Tự Hosting
|
|
366
|
+
|
|
367
|
+
Intlayer v9 cung cấp hỗ trợ hạng nhất cho việc chạy instance Intlayer của riêng bạn với một lệnh duy nhất. Không cần tài khoản Intlayer Cloud.
|
|
368
|
+
|
|
369
|
+
```sh
|
|
370
|
+
curl -fsSL https://intlayer.org/install.sh | sh
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
Trình cài đặt tải xuống `docker-compose.yml` và `.env`, tự động tạo các secrets cần thiết, và chạy `docker compose up -d`. Mọi thứ — dashboard, API, cơ sở dữ liệu, object storage, và email giao dịch — chạy cục bộ trong các container.
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
365
377
|
## Lưu ý khi migration từ v8
|
|
366
378
|
|
|
367
379
|
Nếu bạn đang nâng cấp từ v8, lưu ý rằng v9 không bao gồm các breaking change. Tuy nhiên, dưới đây là các thay đổi chính:
|
package/docs/vi/self_hosting.md
CHANGED
|
@@ -64,6 +64,32 @@ Chromium (được sử dụng để tạo ảnh chụp màn hình Puppeteer) đ
|
|
|
64
64
|
|
|
65
65
|
## Bắt đầu nhanh
|
|
66
66
|
|
|
67
|
+
Pull và chạy image được công bố, cung cấp thông tin xác thực và bí mật MongoDB Atlas của bạn:
|
|
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
|
+
Sau đó mở **http://localhost:3000**.
|
|
86
|
+
|
|
87
|
+
> Dashboard được phục vụ trên `localhost`. Xem [Limitations](#limitations) — các miền tùy chỉnh không được hỗ trợ bởi image được công bố.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Bắt đầu nhanh
|
|
92
|
+
|
|
67
93
|
```sh
|
|
68
94
|
curl -fsSL https://intlayer.org/install.sh | sh
|
|
69
95
|
```
|
|
@@ -97,9 +123,18 @@ Các cổng nội bộ (mongo, redis) không được phơi bày ra host theo m
|
|
|
97
123
|
|
|
98
124
|
---
|
|
99
125
|
|
|
100
|
-
##
|
|
126
|
+
## Biến môi trường
|
|
127
|
+
|
|
128
|
+
### Bắt buộc
|
|
101
129
|
|
|
102
|
-
|
|
130
|
+
| Variable | Example | Description |
|
|
131
|
+
| ---------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
132
|
+
| `DB_ID` | `intlayer` | MongoDB Atlas user |
|
|
133
|
+
| `DB_MDP` | _(your password)_ | MongoDB Atlas password |
|
|
134
|
+
| `DB_CLUSTER` | `cluster0.xxxxx.mongodb.net` | MongoDB Atlas cluster host (used in the `mongodb+srv://` URI) |
|
|
135
|
+
| `BETTER_AUTH_SECRET` | _(generated)_ | 32-byte secret for session signing |
|
|
136
|
+
| `S3_SECRET_ACCESS_KEY` | _(generated)_ | Secret for the bundled MinIO |
|
|
137
|
+
| `RESEND_API_KEY` | _(your key)_ | Transactional email via Resend. Required for first-run setup unless you configure a global SMTP mailer (see [Global mailer](#global-mailer)) |
|
|
103
138
|
|
|
104
139
|
### Bắt buộc (tự động tạo hoặc được nhắc nhở)
|
|
105
140
|
|
|
@@ -141,6 +176,26 @@ Trình cài đặt tạo ra một file `.env` sẵn sàng để sử dụng. B
|
|
|
141
176
|
|
|
142
177
|
---
|
|
143
178
|
|
|
179
|
+
### Mailer toàn cầu
|
|
180
|
+
|
|
181
|
+
Theo mặc định, tất cả các email giao dịch được gửi qua Resend sử dụng `RESEND_API_KEY`. Các triển khai tự lưu trữ có thể thay vào đó định tuyến **mọi** email — bao gồm các email không thuộc tổ chức như đặt lại mật khẩu và liên kết ma thuật — qua một mailer toàn cầu được định cấu hình bằng các biến môi trường.
|
|
182
|
+
|
|
183
|
+
Đặt `MAIL_PROVIDER` để kích hoạt nó. Khi không được đặt, mailer Resend mặc định được sử dụng.
|
|
184
|
+
|
|
185
|
+
| Variable | Example | Description |
|
|
186
|
+
| -------------------- | ------------------------------ | -------------------------------------------------------------------------------- |
|
|
187
|
+
| `MAIL_PROVIDER` | `smtp` | Vận chuyển toàn cầu: `smtp` hoặc `resend`. Để không được đặt để sử dụng mặc định |
|
|
188
|
+
| `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Tiêu đề người gửi. Chấp nhận địa chỉ đơn thuần hoặc định dạng `Name <email>` |
|
|
189
|
+
| `MAIL_SMTP_HOST` | `smtp.acme.com` | SMTP host (bắt buộc khi `MAIL_PROVIDER=smtp`) |
|
|
190
|
+
| `MAIL_SMTP_PORT` | `587` | SMTP port (mặc định là `587`) |
|
|
191
|
+
| `MAIL_SMTP_SECURE` | `false` | TLS ẩn. Đặt `true` cho cổng `465` |
|
|
192
|
+
| `MAIL_SMTP_USER` | _(your user)_ | Tên người dùng SMTP (tùy chọn; bỏ qua đối với relay không xác thực) |
|
|
193
|
+
| `MAIL_SMTP_PASSWORD` | _(your password)_ | Mật khẩu SMTP |
|
|
194
|
+
|
|
195
|
+
> Thứ tự ưu tiên: mailer riêng của một tổ chức (được định cấu hình từ bảng điều khiển **Organization**) có ưu tiên hơn mailer toàn cầu, cái này lần lượt có ưu tiên hơn khóa Resend mặc định.
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
144
199
|
## Kết nối dự án Intlayer của bạn
|
|
145
200
|
|
|
146
201
|
Khi stack đang chạy, hãy trỏ dự án của bạn đến backend và dashboard được tự host thay vì `intlayer.org`.
|
|
@@ -259,47 +314,11 @@ docker run --rm \
|
|
|
259
314
|
|
|
260
315
|
---
|
|
261
316
|
|
|
262
|
-
##
|
|
263
|
-
|
|
264
|
-
Đối với các triển khai production, hãy đặt một reverse proxy phía trước các container app và backend thay vì phơi bày chúng trực tiếp.
|
|
265
|
-
|
|
266
|
-
### Ví dụ 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
|
+
## Hạn chế
|
|
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
|
-
Cập nhật các biến `.env` sau để khớp với các miền công khai của bạn:
|
|
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
|
-
> Các biến `VITE_*` được tích hợp vào image dashboard tại thời điểm build. Nếu bạn thay đổi chúng sau khi image được build, bạn cần build lại image `app` (`docker compose build app`) hoặc sử dụng cấu hình runtime injection.
|
|
319
|
+
- **MongoDB phải là external (Atlas).** Backend chỉ kết nối qua `mongodb+srv://` (được xây dựng từ `DB_ID` / `DB_MDP` / `DB_CLUSTER`), do đó `mongodb://host:27017` đơn giản — bao gồm cả `mongod` được bao gồm của container — không thể được sử dụng. Cung cấp một cluster MongoDB Atlas.
|
|
320
|
+
- **Không có tên miền tùy chỉnh.** Tất cả các `VITE_*` URLs hướng tới trình duyệt được nhúng inline vào ứng dụng tại thời điểm xây dựng, và hình ảnh được xuất bản có các giá trị `localhost`. Dashboard phải được truy cập tại `http://localhost:3000`; phục vụ nó trên một tên miền công khai sẽ yêu cầu xây dựng lại hình ảnh với các URL mục tiêu được xây dựng sẵn và không được hỗ trợ ra khỏi hộp.
|
|
321
|
+
- **Email yêu cầu một mailer hoạt động.** Thiết lập lần chạy đầu tiên thực thi xác minh email, do đó `RESEND_API_KEY` hoặc một [mailer SMTP toàn cục](#global-mailer) (`MAIL_PROVIDER=smtp` + `MAIL_SMTP_*`) phải được cấu hình. Sau khi admin đầu tiên đăng nhập, mỗi tổ chức cũng có thể cấu hình mailer SMTP hoặc Resend riêng của nó từ dashboard.
|
|
303
322
|
|
|
304
323
|
---
|
|
305
324
|
|
|
@@ -324,14 +343,6 @@ docker compose build app
|
|
|
324
343
|
docker compose up -d app
|
|
325
344
|
```
|
|
326
345
|
|
|
327
|
-
### Email không gửi được
|
|
328
|
-
|
|
329
|
-
Theo mặc định, tất cả email gửi đi được Mailpit thu nhận. Mở `http://localhost:8025` để xem các tin nhắn đã gửi. Để gửi email thật, hãy đặt `MAIL_PROVIDER=resend` và `RESEND_API_KEY=<your-key>` trong `.env`, sau đó khởi động lại backend:
|
|
330
|
-
|
|
331
|
-
```sh
|
|
332
|
-
docker compose restart backend
|
|
333
|
-
```
|
|
334
|
-
|
|
335
346
|
### Thiếu MinIO bucket
|
|
336
347
|
|
|
337
348
|
Nếu dịch vụ một lần chạy `minio-init` không chạy (hoặc chạy trước khi MinIO sẵn sàng), hãy tạo bucket thủ công:
|
package/docs/zh/CI_CD.md
CHANGED
|
@@ -30,6 +30,10 @@ Intlayer 允许自动生成内容声明文件的翻译。根据您的工作流
|
|
|
30
30
|
|
|
31
31
|
使用 Intlayer,你可以采用一种工作流程,其中只需在本地声明单一语言环境,而所有翻译都通过 CMS 远程管理。这允许内容和翻译与代码库完全分离,为内容编辑提供更多灵活性,并支持 Live Sync(无需重新构建应用程序即可应用更改)。
|
|
32
32
|
|
|
33
|
+
## 使用 CMS
|
|
34
|
+
|
|
35
|
+
使用 Intlayer,您可以采用一种工作流程,其中仅在本地声明单个语言环境,而所有翻译都通过 CMS 远程管理。这样可以使内容和翻译完全与代码库分离,为内容编辑人员提供更多灵活性,并支持实时同步(无需重建应用程序即可应用更改)。
|
|
36
|
+
|
|
33
37
|
### 示例配置
|
|
34
38
|
|
|
35
39
|
```ts fileName="intlayer.config.ts"
|