@intlayer/docs 7.0.6 → 7.0.8-canary.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/i18n_using_next-i18next.md +1068 -0
- package/blog/ar/i18n_using_next-intl.md +768 -0
- package/blog/ar/intlayer_with_react-intl.md +0 -4
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +5 -4
- package/blog/de/i18n_using_next-i18next.md +1107 -0
- package/blog/de/i18n_using_next-intl.md +760 -0
- package/blog/de/intlayer_with_react-intl.md +0 -4
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/en/i18n_using_next-i18next.md +1073 -0
- package/blog/en/i18n_using_next-intl.md +757 -0
- package/blog/en/intlayer_with_i18next.md +71 -8
- package/blog/en/intlayer_with_next-i18next.md +71 -8
- package/blog/en/intlayer_with_next-intl.md +71 -8
- package/blog/en/intlayer_with_react-i18next.md +69 -8
- package/blog/en/intlayer_with_react-intl.md +68 -9
- package/blog/en/intlayer_with_vue-i18n.md +68 -7
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/blog/en/vue-i18n_vs_intlayer.md +2 -0
- package/blog/en-GB/i18n_using_next-i18next.md +1074 -0
- package/blog/en-GB/i18n_using_next-intl.md +757 -0
- package/blog/en-GB/intlayer_with_i18next.md +15 -6
- package/blog/en-GB/intlayer_with_next-i18next.md +16 -6
- package/blog/en-GB/intlayer_with_next-intl.md +16 -6
- package/blog/en-GB/intlayer_with_react-i18next.md +16 -7
- package/blog/en-GB/intlayer_with_react-intl.md +14 -9
- package/blog/en-GB/intlayer_with_vue-i18n.md +16 -7
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/blog/en-GB/vue-i18n_vs_intlayer.md +2 -0
- package/blog/es/i18n_using_next-i18next.md +1066 -0
- package/blog/es/i18n_using_next-intl.md +757 -0
- package/blog/es/intlayer_with_react-intl.md +0 -4
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/fr/i18n_using_next-i18next.md +1078 -0
- package/blog/fr/i18n_using_next-intl.md +759 -0
- package/blog/fr/intlayer_with_react-intl.md +0 -4
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/hi/i18n_using_next-i18next.md +1068 -0
- package/blog/hi/i18n_using_next-intl.md +758 -0
- package/blog/hi/intlayer_with_react-intl.md +0 -4
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/id/i18n_using_next-i18next.md +1078 -0
- package/blog/id/i18n_using_next-intl.md +757 -0
- package/blog/id/index.md +69 -0
- package/blog/id/internationalization_and_SEO.md +364 -0
- package/blog/id/intlayer_with_react-intl.md +0 -4
- package/blog/id/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/id/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/id/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/id/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/id/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/id/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/id/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/id/list_i18n_technologies/frameworks/svelte.md +131 -0
- package/blog/id/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +1500 -0
- package/blog/id/nextjs-multilingual-seo-comparison.md +361 -0
- package/blog/id/rag_powered_documentation_assistant.md +288 -0
- package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/id/vue-i18n_vs_intlayer.md +278 -0
- package/blog/id/what_is_internationalization.md +166 -0
- package/blog/it/i18n_using_next-i18next.md +1078 -0
- package/blog/it/i18n_using_next-intl.md +758 -0
- package/blog/it/intlayer_with_react-intl.md +0 -4
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +4 -0
- package/blog/it/vue-i18n_vs_intlayer.md +2 -0
- package/blog/ja/i18n_using_next-i18next.md +1078 -0
- package/blog/ja/i18n_using_next-intl.md +758 -0
- package/blog/ja/intlayer_with_react-intl.md +0 -4
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/ko/i18n_using_next-i18next.md +1075 -0
- package/blog/ko/i18n_using_next-intl.md +759 -0
- package/blog/ko/intlayer_with_react-intl.md +0 -4
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/pl/i18n_using_next-i18next.md +1078 -0
- package/blog/pl/i18n_using_next-intl.md +758 -0
- package/blog/pl/index.md +69 -0
- package/blog/pl/internationalization_and_SEO.md +363 -0
- package/blog/pl/intlayer_with_react-intl.md +0 -4
- package/blog/pl/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/pl/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/pl/list_i18n_technologies/CMS/wordpress.md +196 -0
- package/blog/pl/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/pl/list_i18n_technologies/frameworks/flutter.md +151 -0
- package/blog/pl/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/pl/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/pl/list_i18n_technologies/frameworks/svelte.md +131 -0
- package/blog/pl/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +1501 -0
- package/blog/pl/nextjs-multilingual-seo-comparison.md +362 -0
- package/blog/pl/rag_powered_documentation_assistant.md +288 -0
- package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/pl/vue-i18n_vs_intlayer.md +278 -0
- package/blog/pl/what_is_internationalization.md +167 -0
- package/blog/pt/i18n_using_next-i18next.md +1067 -0
- package/blog/pt/i18n_using_next-intl.md +760 -0
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/ru/i18n_using_next-i18next.md +1106 -0
- package/blog/ru/i18n_using_next-intl.md +759 -0
- package/blog/ru/intlayer_with_react-intl.md +0 -4
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/tr/i18n_using_next-i18next.md +1078 -0
- package/blog/tr/i18n_using_next-intl.md +760 -0
- package/blog/tr/intlayer_with_react-intl.md +0 -4
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/blog/tr/vue-i18n_vs_intlayer.md +2 -0
- package/blog/vi/i18n_using_next-i18next.md +1080 -0
- package/blog/vi/i18n_using_next-intl.md +758 -0
- package/blog/vi/index.md +69 -0
- package/blog/vi/internationalization_and_SEO.md +363 -0
- package/blog/vi/intlayer_with_react-intl.md +0 -4
- package/blog/vi/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/vi/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/vi/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/vi/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/vi/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/vi/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/vi/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/vi/list_i18n_technologies/frameworks/svelte.md +131 -0
- package/blog/vi/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +1520 -0
- package/blog/vi/nextjs-multilingual-seo-comparison.md +362 -0
- package/blog/vi/rag_powered_documentation_assistant.md +288 -0
- package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/vi/vue-i18n_vs_intlayer.md +278 -0
- package/blog/vi/what_is_internationalization.md +168 -0
- package/blog/zh/i18n_using_next-i18next.md +1105 -0
- package/blog/zh/i18n_using_next-intl.md +758 -0
- package/blog/zh/intlayer_with_react-intl.md +0 -4
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/dist/cjs/common.cjs +0 -4
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +38 -6
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +0 -6
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +0 -6
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +0 -6
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +38 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +2 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/docs/ar/component_i18n.md +1 -1
- package/docs/ar/configuration.md +6 -0
- package/docs/ar/intlayer_cli.md +8 -3
- package/docs/ar/intlayer_with_next-i18next.md +619 -0
- package/docs/ar/intlayer_with_next-intl.md +446 -0
- package/docs/ar/intlayer_with_nextjs_16.md +21 -0
- package/docs/ar/intlayer_with_tanstack.md +4 -0
- package/docs/ar/intlayer_with_vite+react.md +4 -0
- package/docs/de/component_i18n.md +1 -1
- package/docs/de/configuration.md +6 -0
- package/docs/de/intlayer_cli.md +8 -3
- package/docs/de/intlayer_with_next-i18next.md +627 -0
- package/docs/de/intlayer_with_next-intl.md +451 -0
- package/docs/de/intlayer_with_nextjs_16.md +21 -0
- package/docs/de/intlayer_with_tanstack.md +4 -0
- package/docs/de/intlayer_with_vite+react.md +4 -0
- package/docs/en/component_i18n.md +1 -1
- package/docs/en/intlayer_cli.md +8 -1
- package/docs/en/intlayer_with_astro.md +10 -2
- package/docs/en/intlayer_with_create_react_app.md +8 -0
- package/docs/en/intlayer_with_lynx+react.md +8 -0
- package/docs/en/intlayer_with_nestjs.md +10 -0
- package/docs/en/intlayer_with_nextjs_14.md +10 -2
- package/docs/en/intlayer_with_nextjs_15.md +21 -4
- package/docs/en/intlayer_with_nextjs_16.md +17 -0
- package/docs/en/intlayer_with_nuxt.md +8 -0
- package/docs/en/intlayer_with_react_native+expo.md +10 -2
- package/docs/en/intlayer_with_react_router_v7.md +8 -0
- package/docs/en/intlayer_with_tanstack.md +10 -0
- package/docs/en/intlayer_with_vite+preact.md +10 -2
- package/docs/en/intlayer_with_vite+react.md +21 -4
- package/docs/en/intlayer_with_vite+vue.md +10 -2
- package/docs/en-GB/component_i18n.md +1 -1
- package/docs/en-GB/configuration.md +6 -0
- package/docs/en-GB/intlayer_cli.md +8 -3
- package/docs/en-GB/intlayer_with_angular.md +4 -4
- package/docs/en-GB/intlayer_with_express.md +4 -4
- package/docs/en-GB/intlayer_with_lynx+react.md +12 -12
- package/{blog/en/_intlayer_with_next-i18next.md → docs/en-GB/intlayer_with_next-i18next.md} +241 -42
- package/{blog/en/_intlayer_with_next-intl.md → docs/en-GB/intlayer_with_next-intl.md} +144 -29
- package/docs/en-GB/intlayer_with_nextjs_16.md +21 -0
- package/docs/en-GB/intlayer_with_tanstack.md +5 -1
- package/docs/en-GB/intlayer_with_vite+react.md +4 -0
- package/docs/en-GB/packages/next-intlayer/t.md +2 -2
- package/docs/es/component_i18n.md +1 -1
- package/docs/es/configuration.md +6 -0
- package/docs/es/intlayer_cli.md +8 -3
- package/docs/es/intlayer_with_next-i18next.md +628 -0
- package/docs/es/intlayer_with_next-intl.md +446 -0
- package/docs/es/intlayer_with_nextjs_16.md +21 -0
- package/docs/es/intlayer_with_tanstack.md +4 -0
- package/docs/es/intlayer_with_vite+react.md +4 -0
- package/docs/fr/configuration.md +6 -0
- package/docs/fr/intlayer_cli.md +8 -3
- package/docs/fr/intlayer_with_next-i18next.md +628 -0
- package/docs/fr/intlayer_with_next-intl.md +446 -0
- package/docs/fr/intlayer_with_nextjs_16.md +23 -2
- package/docs/fr/intlayer_with_tanstack.md +4 -0
- package/docs/fr/intlayer_with_vite+react.md +4 -0
- package/docs/hi/component_i18n.md +1 -1
- package/docs/hi/configuration.md +6 -0
- package/docs/hi/intlayer_cli.md +8 -0
- package/docs/hi/intlayer_with_next-i18next.md +628 -0
- package/docs/hi/intlayer_with_next-intl.md +446 -0
- package/docs/hi/intlayer_with_nextjs_16.md +21 -0
- package/docs/hi/intlayer_with_tanstack.md +4 -0
- package/docs/hi/intlayer_with_vite+react.md +4 -0
- package/docs/id/CI_CD.md +198 -0
- package/docs/id/autoFill.md +284 -0
- package/docs/id/component_i18n.md +186 -0
- package/docs/id/configuration.md +710 -0
- package/docs/id/dictionary/condition.md +231 -0
- package/docs/id/dictionary/content_file.md +1092 -0
- package/docs/id/dictionary/enumeration.md +245 -0
- package/docs/id/dictionary/file.md +237 -0
- package/docs/id/dictionary/function_fetching.md +214 -0
- package/docs/id/dictionary/gender.md +273 -0
- package/docs/id/dictionary/insertion.md +192 -0
- package/docs/id/dictionary/markdown.md +381 -0
- package/docs/id/dictionary/nesting.md +273 -0
- package/docs/id/dictionary/translation.md +310 -0
- package/docs/id/formatters.md +596 -0
- package/docs/id/how_works_intlayer.md +256 -0
- package/docs/id/index.md +176 -0
- package/docs/id/interest_of_intlayer.md +293 -0
- package/docs/id/intlayer_CMS.md +549 -0
- package/docs/id/intlayer_cli.md +850 -0
- package/docs/id/intlayer_visual_editor.md +288 -0
- package/docs/id/intlayer_with_angular.md +694 -0
- package/docs/id/intlayer_with_astro.md +252 -0
- package/docs/id/intlayer_with_create_react_app.md +1233 -0
- package/docs/id/intlayer_with_express.md +411 -0
- package/docs/id/intlayer_with_lynx+react.md +518 -0
- package/docs/id/intlayer_with_nestjs.md +272 -0
- package/docs/id/intlayer_with_next-i18next.md +628 -0
- package/docs/id/intlayer_with_next-intl.md +446 -0
- package/docs/id/intlayer_with_nextjs_14.md +1617 -0
- package/docs/id/intlayer_with_nextjs_15.md +1698 -0
- package/docs/id/intlayer_with_nextjs_16.md +21 -0
- package/docs/id/intlayer_with_nextjs_page_router.md +1478 -0
- package/docs/id/intlayer_with_nuxt.md +808 -0
- package/docs/id/intlayer_with_react_native+expo.md +699 -0
- package/docs/id/intlayer_with_react_router_v7.md +496 -0
- package/docs/id/intlayer_with_tanstack.md +564 -0
- package/docs/id/intlayer_with_vite+preact.md +1737 -0
- package/docs/id/intlayer_with_vite+react.md +1413 -0
- package/docs/id/intlayer_with_vite+solid.md +289 -0
- package/docs/id/intlayer_with_vite+svelte.md +289 -0
- package/docs/id/intlayer_with_vite+vue.md +1088 -0
- package/docs/id/introduction.md +218 -0
- package/docs/id/locale_mapper.md +242 -0
- package/docs/id/mcp_server.md +211 -0
- package/docs/id/packages/express-intlayer/t.md +458 -0
- package/docs/id/packages/intlayer/getConfiguration.md +145 -0
- package/docs/id/packages/intlayer/getEnumeration.md +159 -0
- package/docs/id/packages/intlayer/getHTMLTextDir.md +122 -0
- package/docs/id/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/id/packages/intlayer/getLocaleName.md +119 -0
- package/docs/id/packages/intlayer/getLocalizedUrl.md +309 -0
- package/docs/id/packages/intlayer/getMultilingualUrls.md +223 -0
- package/docs/id/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/id/packages/intlayer/getTranslation.md +190 -0
- package/docs/id/packages/intlayer/getTranslationContent.md +188 -0
- package/docs/id/packages/next-intlayer/t.md +352 -0
- package/docs/id/packages/next-intlayer/useDictionary.md +271 -0
- package/docs/id/packages/next-intlayer/useIntlayer.md +264 -0
- package/docs/id/packages/next-intlayer/useLocale.md +166 -0
- package/docs/id/packages/react-intlayer/t.md +303 -0
- package/docs/id/packages/react-intlayer/useDictionary.md +287 -0
- package/docs/id/packages/react-intlayer/useI18n.md +267 -0
- package/docs/id/packages/react-intlayer/useIntlayer.md +254 -0
- package/docs/id/packages/react-intlayer/useLocale.md +210 -0
- package/docs/id/per_locale_file.md +323 -0
- package/docs/id/readme.md +261 -0
- package/docs/id/releases/v6.md +305 -0
- package/docs/id/roadmap.md +362 -0
- package/docs/id/testing.md +202 -0
- package/docs/id/vs_code_extension.md +126 -0
- package/docs/it/component_i18n.md +1 -1
- package/docs/it/configuration.md +6 -0
- package/docs/it/intlayer_cli.md +8 -3
- package/docs/it/intlayer_with_next-i18next.md +628 -0
- package/docs/it/intlayer_with_next-intl.md +446 -0
- package/docs/it/intlayer_with_nextjs_16.md +21 -0
- package/docs/it/intlayer_with_tanstack.md +4 -0
- package/docs/it/intlayer_with_vite+react.md +4 -0
- package/docs/ja/component_i18n.md +1 -1
- package/docs/ja/configuration.md +6 -0
- package/docs/ja/intlayer_cli.md +8 -3
- package/docs/ja/intlayer_with_next-i18next.md +627 -0
- package/docs/ja/intlayer_with_next-intl.md +446 -0
- package/docs/ja/intlayer_with_nextjs_16.md +21 -0
- package/docs/ja/intlayer_with_tanstack.md +4 -0
- package/docs/ja/intlayer_with_vite+react.md +4 -0
- package/docs/ko/configuration.md +6 -0
- package/docs/ko/intlayer_cli.md +8 -3
- package/docs/ko/intlayer_with_next-i18next.md +627 -0
- package/docs/ko/intlayer_with_next-intl.md +446 -0
- package/docs/ko/intlayer_with_nextjs_16.md +21 -0
- package/docs/ko/intlayer_with_tanstack.md +4 -0
- package/docs/ko/intlayer_with_vite+react.md +4 -0
- package/docs/pl/CI_CD.md +198 -0
- package/docs/pl/autoFill.md +284 -0
- package/docs/pl/component_i18n.md +186 -0
- package/docs/pl/configuration.md +710 -0
- package/docs/pl/dictionary/condition.md +232 -0
- package/docs/pl/dictionary/content_file.md +1130 -0
- package/docs/pl/dictionary/enumeration.md +245 -0
- package/docs/pl/dictionary/file.md +234 -0
- package/docs/pl/dictionary/function_fetching.md +214 -0
- package/docs/pl/dictionary/gender.md +276 -0
- package/docs/pl/dictionary/insertion.md +188 -0
- package/docs/pl/dictionary/markdown.md +408 -0
- package/docs/pl/dictionary/nesting.md +273 -0
- package/docs/pl/dictionary/translation.md +310 -0
- package/docs/pl/formatters.md +596 -0
- package/docs/pl/how_works_intlayer.md +256 -0
- package/docs/pl/index.md +176 -0
- package/docs/pl/interest_of_intlayer.md +291 -0
- package/docs/pl/intlayer_CMS.md +549 -0
- package/docs/pl/intlayer_cli.md +857 -0
- package/docs/pl/intlayer_visual_editor.md +288 -0
- package/docs/pl/intlayer_with_angular.md +690 -0
- package/docs/pl/intlayer_with_astro.md +280 -0
- package/docs/pl/intlayer_with_create_react_app.md +1235 -0
- package/docs/pl/intlayer_with_express.md +411 -0
- package/docs/pl/intlayer_with_lynx+react.md +518 -0
- package/docs/pl/intlayer_with_nestjs.md +272 -0
- package/docs/pl/intlayer_with_next-i18next.md +628 -0
- package/docs/pl/intlayer_with_next-intl.md +446 -0
- package/docs/pl/intlayer_with_nextjs_14.md +1594 -0
- package/docs/pl/intlayer_with_nextjs_15.md +1701 -0
- package/docs/pl/intlayer_with_nextjs_16.md +21 -0
- package/docs/pl/intlayer_with_nextjs_page_router.md +1513 -0
- package/docs/pl/intlayer_with_nuxt.md +885 -0
- package/docs/pl/intlayer_with_react_native+expo.md +698 -0
- package/docs/pl/intlayer_with_react_router_v7.md +503 -0
- package/docs/pl/intlayer_with_tanstack.md +562 -0
- package/docs/pl/intlayer_with_vite+preact.md +1736 -0
- package/docs/pl/intlayer_with_vite+react.md +1438 -0
- package/docs/pl/intlayer_with_vite+solid.md +290 -0
- package/docs/pl/intlayer_with_vite+svelte.md +289 -0
- package/docs/pl/intlayer_with_vite+vue.md +1116 -0
- package/docs/pl/introduction.md +209 -0
- package/docs/pl/locale_mapper.md +242 -0
- package/docs/pl/mcp_server.md +211 -0
- package/docs/pl/packages/express-intlayer/t.md +458 -0
- package/docs/pl/packages/intlayer/getConfiguration.md +146 -0
- package/docs/pl/packages/intlayer/getEnumeration.md +160 -0
- package/docs/pl/packages/intlayer/getHTMLTextDir.md +121 -0
- package/docs/pl/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/pl/packages/intlayer/getLocaleName.md +118 -0
- package/docs/pl/packages/intlayer/getLocalizedUrl.md +300 -0
- package/docs/pl/packages/intlayer/getMultilingualUrls.md +221 -0
- package/docs/pl/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/pl/packages/intlayer/getTranslation.md +190 -0
- package/docs/pl/packages/intlayer/getTranslationContent.md +189 -0
- package/docs/pl/packages/next-intlayer/t.md +353 -0
- package/docs/pl/packages/next-intlayer/useDictionary.md +270 -0
- package/docs/pl/packages/next-intlayer/useIntlayer.md +263 -0
- package/docs/pl/packages/next-intlayer/useLocale.md +166 -0
- package/docs/pl/packages/react-intlayer/t.md +303 -0
- package/docs/pl/packages/react-intlayer/useDictionary.md +289 -0
- package/docs/pl/packages/react-intlayer/useI18n.md +249 -0
- package/docs/pl/packages/react-intlayer/useIntlayer.md +256 -0
- package/docs/pl/packages/react-intlayer/useLocale.md +210 -0
- package/docs/pl/per_locale_file.md +321 -0
- package/docs/pl/readme.md +261 -0
- package/docs/pl/releases/v6.md +305 -0
- package/docs/pl/roadmap.md +362 -0
- package/docs/pl/testing.md +202 -0
- package/docs/pl/vs_code_extension.md +126 -0
- package/docs/pt/component_i18n.md +1 -1
- package/docs/pt/configuration.md +6 -0
- package/docs/pt/intlayer_cli.md +8 -3
- package/docs/pt/intlayer_with_next-i18next.md +627 -0
- package/docs/pt/intlayer_with_next-intl.md +446 -0
- package/docs/pt/intlayer_with_nextjs_16.md +21 -0
- package/docs/pt/intlayer_with_tanstack.md +4 -0
- package/docs/pt/intlayer_with_vite+react.md +4 -0
- package/docs/ru/component_i18n.md +1 -1
- package/docs/ru/configuration.md +6 -0
- package/docs/ru/intlayer_cli.md +301 -22
- package/docs/ru/intlayer_with_next-i18next.md +629 -0
- package/docs/ru/intlayer_with_next-intl.md +448 -0
- package/docs/ru/intlayer_with_nextjs_16.md +21 -0
- package/docs/ru/intlayer_with_tanstack.md +4 -0
- package/docs/ru/intlayer_with_vite+react.md +4 -0
- package/docs/tr/component_i18n.md +1 -1
- package/docs/tr/configuration.md +6 -0
- package/docs/tr/intlayer_cli.md +8 -0
- package/docs/tr/intlayer_with_next-i18next.md +627 -0
- package/docs/tr/intlayer_with_next-intl.md +446 -0
- package/docs/tr/intlayer_with_nextjs_16.md +21 -0
- package/docs/tr/intlayer_with_tanstack.md +4 -0
- package/docs/tr/intlayer_with_vite+react.md +4 -0
- package/docs/vi/CI_CD.md +198 -0
- package/docs/vi/autoFill.md +284 -0
- package/docs/vi/component_i18n.md +186 -0
- package/docs/vi/configuration.md +710 -0
- package/docs/vi/dictionary/condition.md +237 -0
- package/docs/vi/dictionary/content_file.md +1115 -0
- package/docs/vi/dictionary/enumeration.md +255 -0
- package/docs/vi/dictionary/file.md +234 -0
- package/docs/vi/dictionary/function_fetching.md +212 -0
- package/docs/vi/dictionary/gender.md +275 -0
- package/docs/vi/dictionary/insertion.md +191 -0
- package/docs/vi/dictionary/markdown.md +381 -0
- package/docs/vi/dictionary/nesting.md +273 -0
- package/docs/vi/dictionary/translation.md +309 -0
- package/docs/vi/formatters.md +595 -0
- package/docs/vi/how_works_intlayer.md +256 -0
- package/docs/vi/index.md +174 -0
- package/docs/vi/interest_of_intlayer.md +292 -0
- package/docs/vi/intlayer_CMS.md +549 -0
- package/docs/vi/intlayer_cli.md +850 -0
- package/docs/vi/intlayer_visual_editor.md +288 -0
- package/docs/vi/intlayer_with_angular.md +692 -0
- package/docs/vi/intlayer_with_astro.md +252 -0
- package/docs/vi/intlayer_with_create_react_app.md +1230 -0
- package/docs/vi/intlayer_with_express.md +409 -0
- package/docs/vi/intlayer_with_lynx+react.md +520 -0
- package/docs/vi/intlayer_with_nestjs.md +272 -0
- package/docs/vi/intlayer_with_next-i18next.md +628 -0
- package/docs/vi/intlayer_with_next-intl.md +446 -0
- package/docs/vi/intlayer_with_nextjs_14.md +1584 -0
- package/docs/vi/intlayer_with_nextjs_15.md +1738 -0
- package/docs/vi/intlayer_with_nextjs_16.md +21 -0
- package/docs/vi/intlayer_with_nextjs_page_router.md +1504 -0
- package/docs/vi/intlayer_with_nuxt.md +821 -0
- package/docs/vi/intlayer_with_react_native+expo.md +700 -0
- package/docs/vi/intlayer_with_react_router_v7.md +498 -0
- package/docs/vi/intlayer_with_tanstack.md +562 -0
- package/docs/vi/intlayer_with_vite+preact.md +1722 -0
- package/docs/vi/intlayer_with_vite+react.md +1407 -0
- package/docs/vi/intlayer_with_vite+solid.md +287 -0
- package/docs/vi/intlayer_with_vite+svelte.md +289 -0
- package/docs/vi/intlayer_with_vite+vue.md +1071 -0
- package/docs/vi/introduction.md +215 -0
- package/docs/vi/locale_mapper.md +242 -0
- package/docs/vi/mcp_server.md +211 -0
- package/docs/vi/packages/express-intlayer/t.md +457 -0
- package/docs/vi/packages/intlayer/getConfiguration.md +145 -0
- package/docs/vi/packages/intlayer/getEnumeration.md +162 -0
- package/docs/vi/packages/intlayer/getHTMLTextDir.md +121 -0
- package/docs/vi/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/vi/packages/intlayer/getLocaleName.md +129 -0
- package/docs/vi/packages/intlayer/getLocalizedUrl.md +309 -0
- package/docs/vi/packages/intlayer/getMultilingualUrls.md +221 -0
- package/docs/vi/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/vi/packages/intlayer/getTranslation.md +201 -0
- package/docs/vi/packages/intlayer/getTranslationContent.md +188 -0
- package/docs/vi/packages/next-intlayer/t.md +352 -0
- package/docs/vi/packages/next-intlayer/useDictionary.md +273 -0
- package/docs/vi/packages/next-intlayer/useIntlayer.md +264 -0
- package/docs/vi/packages/next-intlayer/useLocale.md +166 -0
- package/docs/vi/packages/react-intlayer/t.md +304 -0
- package/docs/vi/packages/react-intlayer/useDictionary.md +288 -0
- package/docs/vi/packages/react-intlayer/useI18n.md +295 -0
- package/docs/vi/packages/react-intlayer/useIntlayer.md +256 -0
- package/docs/vi/packages/react-intlayer/useLocale.md +210 -0
- package/docs/vi/per_locale_file.md +326 -0
- package/docs/vi/readme.md +261 -0
- package/docs/vi/releases/v6.md +305 -0
- package/docs/vi/roadmap.md +346 -0
- package/docs/vi/testing.md +202 -0
- package/docs/vi/vs_code_extension.md +126 -0
- package/docs/zh/configuration.md +6 -0
- package/docs/zh/intlayer_cli.md +8 -3
- package/docs/zh/intlayer_with_next-i18next.md +628 -0
- package/docs/zh/intlayer_with_next-intl.md +448 -0
- package/docs/zh/intlayer_with_nextjs_16.md +21 -0
- package/docs/zh/intlayer_with_tanstack.md +4 -0
- package/docs/zh/intlayer_with_vite+react.md +4 -0
- package/frequent_questions/ar/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ar/array_as_content_declaration.md +1 -2
- package/frequent_questions/ar/build_dictionaries.md +1 -2
- package/frequent_questions/ar/build_error_CI_CD.md +1 -2
- package/frequent_questions/ar/bun_set_up.md +1 -2
- package/frequent_questions/ar/customized_locale_list.md +1 -2
- package/frequent_questions/ar/domain_routing.md +1 -2
- package/frequent_questions/ar/esbuild_error.md +1 -2
- package/frequent_questions/ar/get_locale_cookie.md +1 -2
- package/frequent_questions/ar/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ar/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ar/static_rendering.md +1 -3
- package/frequent_questions/ar/translated_path_url.md +1 -2
- package/frequent_questions/ar/unknown_command.md +1 -2
- package/frequent_questions/de/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/de/array_as_content_declaration.md +1 -2
- package/frequent_questions/de/build_dictionaries.md +1 -2
- package/frequent_questions/de/build_error_CI_CD.md +1 -2
- package/frequent_questions/de/bun_set_up.md +1 -2
- package/frequent_questions/de/customized_locale_list.md +1 -2
- package/frequent_questions/de/domain_routing.md +1 -2
- package/frequent_questions/de/esbuild_error.md +1 -2
- package/frequent_questions/de/get_locale_cookie.md +1 -2
- package/frequent_questions/de/intlayer_command_undefined.md +1 -2
- package/frequent_questions/de/locale_incorect_in_url.md +1 -2
- package/frequent_questions/de/static_rendering.md +1 -3
- package/frequent_questions/de/translated_path_url.md +1 -2
- package/frequent_questions/de/unknown_command.md +1 -2
- package/frequent_questions/en/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/en/array_as_content_declaration.md +1 -2
- package/frequent_questions/en/build_dictionaries.md +1 -2
- package/frequent_questions/en/build_error_CI_CD.md +1 -2
- package/frequent_questions/en/bun_set_up.md +1 -2
- package/frequent_questions/en/customized_locale_list.md +1 -2
- package/frequent_questions/en/domain_routing.md +1 -2
- package/frequent_questions/en/esbuild_error.md +1 -2
- package/frequent_questions/en/get_locale_cookie.md +1 -2
- package/frequent_questions/en/intlayer_command_undefined.md +1 -2
- package/frequent_questions/en/locale_incorect_in_url.md +1 -2
- package/frequent_questions/en/static_rendering.md +1 -3
- package/frequent_questions/en/translated_path_url.md +1 -2
- package/frequent_questions/en/unknown_command.md +1 -2
- package/frequent_questions/en-GB/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/en-GB/array_as_content_declaration.md +1 -2
- package/frequent_questions/en-GB/build_dictionaries.md +1 -2
- package/frequent_questions/en-GB/build_error_CI_CD.md +1 -2
- package/frequent_questions/en-GB/bun_set_up.md +1 -2
- package/frequent_questions/en-GB/customized_locale_list.md +1 -2
- package/frequent_questions/en-GB/domain_routing.md +1 -2
- package/frequent_questions/en-GB/esbuild_error.md +1 -2
- package/frequent_questions/en-GB/get_locale_cookie.md +1 -2
- package/frequent_questions/en-GB/intlayer_command_undefined.md +1 -2
- package/frequent_questions/en-GB/locale_incorect_in_url.md +1 -2
- package/frequent_questions/en-GB/static_rendering.md +1 -3
- package/frequent_questions/en-GB/translated_path_url.md +1 -2
- package/frequent_questions/en-GB/unknown_command.md +1 -2
- package/frequent_questions/es/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/es/array_as_content_declaration.md +1 -2
- package/frequent_questions/es/build_dictionaries.md +1 -2
- package/frequent_questions/es/build_error_CI_CD.md +1 -2
- package/frequent_questions/es/bun_set_up.md +1 -2
- package/frequent_questions/es/customized_locale_list.md +1 -2
- package/frequent_questions/es/domain_routing.md +1 -2
- package/frequent_questions/es/esbuild_error.md +1 -2
- package/frequent_questions/es/get_locale_cookie.md +1 -2
- package/frequent_questions/es/intlayer_command_undefined.md +1 -2
- package/frequent_questions/es/locale_incorect_in_url.md +1 -2
- package/frequent_questions/es/static_rendering.md +1 -3
- package/frequent_questions/es/translated_path_url.md +1 -2
- package/frequent_questions/es/unknown_command.md +1 -2
- package/frequent_questions/fr/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/fr/array_as_content_declaration.md +1 -2
- package/frequent_questions/fr/build_dictionaries.md +1 -2
- package/frequent_questions/fr/build_error_CI_CD.md +1 -2
- package/frequent_questions/fr/bun_set_up.md +1 -2
- package/frequent_questions/fr/customized_locale_list.md +1 -2
- package/frequent_questions/fr/domain_routing.md +1 -2
- package/frequent_questions/fr/esbuild_error.md +1 -2
- package/frequent_questions/fr/get_locale_cookie.md +1 -2
- package/frequent_questions/fr/intlayer_command_undefined.md +1 -2
- package/frequent_questions/fr/locale_incorect_in_url.md +1 -2
- package/frequent_questions/fr/static_rendering.md +1 -3
- package/frequent_questions/fr/translated_path_url.md +1 -2
- package/frequent_questions/fr/unknown_command.md +1 -2
- package/frequent_questions/hi/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/hi/array_as_content_declaration.md +1 -2
- package/frequent_questions/hi/build_dictionaries.md +1 -2
- package/frequent_questions/hi/build_error_CI_CD.md +1 -2
- package/frequent_questions/hi/bun_set_up.md +1 -2
- package/frequent_questions/hi/customized_locale_list.md +1 -2
- package/frequent_questions/hi/domain_routing.md +1 -2
- package/frequent_questions/hi/esbuild_error.md +1 -2
- package/frequent_questions/hi/get_locale_cookie.md +1 -2
- package/frequent_questions/hi/intlayer_command_undefined.md +1 -2
- package/frequent_questions/hi/locale_incorect_in_url.md +1 -2
- package/frequent_questions/hi/static_rendering.md +1 -3
- package/frequent_questions/hi/translated_path_url.md +1 -2
- package/frequent_questions/hi/unknown_command.md +1 -2
- package/frequent_questions/id/SSR_Next_no_[locale].md +104 -0
- package/frequent_questions/id/array_as_content_declaration.md +71 -0
- package/frequent_questions/id/build_dictionaries.md +58 -0
- package/frequent_questions/id/build_error_CI_CD.md +74 -0
- package/frequent_questions/id/bun_set_up.md +53 -0
- package/frequent_questions/id/customized_locale_list.md +64 -0
- package/frequent_questions/id/domain_routing.md +113 -0
- package/frequent_questions/id/esbuild_error.md +29 -0
- package/frequent_questions/id/get_locale_cookie.md +142 -0
- package/frequent_questions/id/intlayer_command_undefined.md +155 -0
- package/frequent_questions/id/locale_incorect_in_url.md +73 -0
- package/frequent_questions/id/static_rendering.md +44 -0
- package/frequent_questions/id/translated_path_url.md +55 -0
- package/frequent_questions/id/unknown_command.md +97 -0
- package/frequent_questions/it/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/it/array_as_content_declaration.md +1 -2
- package/frequent_questions/it/build_dictionaries.md +1 -2
- package/frequent_questions/it/build_error_CI_CD.md +1 -2
- package/frequent_questions/it/bun_set_up.md +1 -2
- package/frequent_questions/it/customized_locale_list.md +1 -2
- package/frequent_questions/it/domain_routing.md +1 -2
- package/frequent_questions/it/esbuild_error.md +1 -2
- package/frequent_questions/it/get_locale_cookie.md +1 -2
- package/frequent_questions/it/intlayer_command_undefined.md +1 -2
- package/frequent_questions/it/locale_incorect_in_url.md +1 -2
- package/frequent_questions/it/static_rendering.md +1 -3
- package/frequent_questions/it/translated_path_url.md +1 -2
- package/frequent_questions/it/unknown_command.md +1 -2
- package/frequent_questions/ja/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ja/array_as_content_declaration.md +1 -2
- package/frequent_questions/ja/build_dictionaries.md +1 -2
- package/frequent_questions/ja/build_error_CI_CD.md +1 -2
- package/frequent_questions/ja/bun_set_up.md +1 -2
- package/frequent_questions/ja/customized_locale_list.md +1 -2
- package/frequent_questions/ja/domain_routing.md +1 -2
- package/frequent_questions/ja/esbuild_error.md +1 -2
- package/frequent_questions/ja/get_locale_cookie.md +1 -2
- package/frequent_questions/ja/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ja/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ja/static_rendering.md +1 -3
- package/frequent_questions/ja/translated_path_url.md +1 -2
- package/frequent_questions/ja/unknown_command.md +1 -2
- package/frequent_questions/ko/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ko/array_as_content_declaration.md +1 -2
- package/frequent_questions/ko/build_dictionaries.md +1 -2
- package/frequent_questions/ko/build_error_CI_CD.md +1 -2
- package/frequent_questions/ko/bun_set_up.md +1 -2
- package/frequent_questions/ko/customized_locale_list.md +1 -2
- package/frequent_questions/ko/domain_routing.md +1 -2
- package/frequent_questions/ko/esbuild_error.md +1 -2
- package/frequent_questions/ko/get_locale_cookie.md +1 -2
- package/frequent_questions/ko/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ko/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ko/static_rendering.md +1 -3
- package/frequent_questions/ko/translated_path_url.md +1 -2
- package/frequent_questions/ko/unknown_command.md +1 -2
- package/frequent_questions/pl/SSR_Next_no_[locale].md +104 -0
- package/frequent_questions/pl/array_as_content_declaration.md +71 -0
- package/frequent_questions/pl/build_dictionaries.md +58 -0
- package/frequent_questions/pl/build_error_CI_CD.md +74 -0
- package/frequent_questions/pl/bun_set_up.md +54 -0
- package/frequent_questions/pl/customized_locale_list.md +64 -0
- package/frequent_questions/pl/domain_routing.md +113 -0
- package/frequent_questions/pl/esbuild_error.md +29 -0
- package/frequent_questions/pl/get_locale_cookie.md +142 -0
- package/frequent_questions/pl/intlayer_command_undefined.md +155 -0
- package/frequent_questions/pl/locale_incorect_in_url.md +73 -0
- package/frequent_questions/pl/static_rendering.md +44 -0
- package/frequent_questions/pl/translated_path_url.md +55 -0
- package/frequent_questions/pl/unknown_command.md +97 -0
- package/frequent_questions/pt/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/pt/array_as_content_declaration.md +1 -2
- package/frequent_questions/pt/build_dictionaries.md +1 -2
- package/frequent_questions/pt/build_error_CI_CD.md +1 -2
- package/frequent_questions/pt/bun_set_up.md +1 -2
- package/frequent_questions/pt/customized_locale_list.md +1 -2
- package/frequent_questions/pt/domain_routing.md +1 -2
- package/frequent_questions/pt/esbuild_error.md +1 -2
- package/frequent_questions/pt/get_locale_cookie.md +1 -2
- package/frequent_questions/pt/intlayer_command_undefined.md +1 -2
- package/frequent_questions/pt/locale_incorect_in_url.md +1 -2
- package/frequent_questions/pt/static_rendering.md +1 -3
- package/frequent_questions/pt/translated_path_url.md +1 -2
- package/frequent_questions/pt/unknown_command.md +1 -2
- package/frequent_questions/ru/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ru/array_as_content_declaration.md +1 -2
- package/frequent_questions/ru/build_dictionaries.md +1 -2
- package/frequent_questions/ru/build_error_CI_CD.md +1 -2
- package/frequent_questions/ru/bun_set_up.md +1 -2
- package/frequent_questions/ru/customized_locale_list.md +1 -2
- package/frequent_questions/ru/domain_routing.md +1 -2
- package/frequent_questions/ru/esbuild_error.md +1 -2
- package/frequent_questions/ru/get_locale_cookie.md +1 -2
- package/frequent_questions/ru/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ru/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ru/static_rendering.md +1 -2
- package/frequent_questions/ru/translated_path_url.md +1 -2
- package/frequent_questions/ru/unknown_command.md +1 -2
- package/frequent_questions/tr/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/tr/array_as_content_declaration.md +1 -2
- package/frequent_questions/tr/build_dictionaries.md +1 -2
- package/frequent_questions/tr/build_error_CI_CD.md +1 -2
- package/frequent_questions/tr/bun_set_up.md +1 -2
- package/frequent_questions/tr/customized_locale_list.md +1 -2
- package/frequent_questions/tr/domain_routing.md +1 -2
- package/frequent_questions/tr/esbuild_error.md +1 -2
- package/frequent_questions/tr/get_locale_cookie.md +1 -2
- package/frequent_questions/tr/intlayer_command_undefined.md +1 -2
- package/frequent_questions/tr/locale_incorect_in_url.md +1 -2
- package/frequent_questions/tr/static_rendering.md +1 -2
- package/frequent_questions/tr/translated_path_url.md +1 -2
- package/frequent_questions/tr/unknown_command.md +1 -2
- package/frequent_questions/vi/SSR_Next_no_[locale].md +106 -0
- package/frequent_questions/vi/array_as_content_declaration.md +71 -0
- package/frequent_questions/vi/build_dictionaries.md +58 -0
- package/frequent_questions/vi/build_error_CI_CD.md +74 -0
- package/frequent_questions/vi/bun_set_up.md +53 -0
- package/frequent_questions/vi/customized_locale_list.md +64 -0
- package/frequent_questions/vi/domain_routing.md +113 -0
- package/frequent_questions/vi/esbuild_error.md +29 -0
- package/frequent_questions/vi/get_locale_cookie.md +142 -0
- package/frequent_questions/vi/intlayer_command_undefined.md +155 -0
- package/frequent_questions/vi/locale_incorect_in_url.md +73 -0
- package/frequent_questions/vi/static_rendering.md +44 -0
- package/frequent_questions/vi/translated_path_url.md +55 -0
- package/frequent_questions/vi/unknown_command.md +97 -0
- package/frequent_questions/zh/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/zh/array_as_content_declaration.md +1 -2
- package/frequent_questions/zh/build_dictionaries.md +1 -2
- package/frequent_questions/zh/build_error_CI_CD.md +1 -2
- package/frequent_questions/zh/bun_set_up.md +1 -2
- package/frequent_questions/zh/customized_locale_list.md +1 -2
- package/frequent_questions/zh/domain_routing.md +1 -2
- package/frequent_questions/zh/esbuild_error.md +1 -2
- package/frequent_questions/zh/get_locale_cookie.md +1 -2
- package/frequent_questions/zh/intlayer_command_undefined.md +1 -2
- package/frequent_questions/zh/locale_incorect_in_url.md +1 -2
- package/frequent_questions/zh/static_rendering.md +1 -3
- package/frequent_questions/zh/translated_path_url.md +1 -2
- package/frequent_questions/zh/unknown_command.md +1 -2
- package/legal/id/privacy_notice.md +83 -0
- package/legal/id/terms_of_service.md +55 -0
- package/legal/pl/privacy_notice.md +83 -0
- package/legal/pl/terms_of_service.md +55 -0
- package/legal/vi/privacy_notice.md +83 -0
- package/legal/vi/terms_of_service.md +55 -0
- package/package.json +19 -18
- package/src/generated/blog.entry.ts +38 -0
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-10-05
|
|
3
|
+
updatedAt: 2025-10-05
|
|
4
|
+
title: Comment traduire votre Next.js 15 avec next-i18next – guide i18n 2025
|
|
5
|
+
description: Un guide pratique et prêt pour la production pour internationaliser une application Next.js 15 App Router avec i18next/next-i18next et l'améliorer avec Intlayer.
|
|
6
|
+
keywords:
|
|
7
|
+
- Internationalisation
|
|
8
|
+
- Documentation
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Next.js 15
|
|
11
|
+
- next-i18next
|
|
12
|
+
- i18next
|
|
13
|
+
- JavaScript
|
|
14
|
+
- React
|
|
15
|
+
slugs:
|
|
16
|
+
- doc
|
|
17
|
+
- next-i18next
|
|
18
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-next-i18next-template
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Traduisez votre site Next.js 15 utilisant next-i18next avec Intlayer | Internationalisation (i18n)
|
|
22
|
+
|
|
23
|
+
### À qui s'adresse ce guide
|
|
24
|
+
|
|
25
|
+
- **Junior** : Suivez les étapes exactes et copiez les blocs de code. Vous obtiendrez une application multilingue fonctionnelle.
|
|
26
|
+
- **Intermédiaire** : Utilisez les checklists et les conseils de bonnes pratiques pour éviter les pièges courants.
|
|
27
|
+
- **Senior** : Parcourez la structure générale, les sections SEO et automatisation ; vous y trouverez des valeurs par défaut pertinentes et des points d'extension.
|
|
28
|
+
|
|
29
|
+
### Ce que vous allez construire
|
|
30
|
+
|
|
31
|
+
- Projet App Router avec des routes localisées (ex. : `/`, `/fr/...`)
|
|
32
|
+
- Configuration i18n avec locales, locale par défaut, support RTL
|
|
33
|
+
- Initialisation i18n côté serveur et un provider côté client
|
|
34
|
+
- Traductions avec namespaces chargées à la demande
|
|
35
|
+
- SEO avec `hreflang`, `sitemap` localisé, `robots`
|
|
36
|
+
- Middleware pour le routage selon la locale
|
|
37
|
+
- Intégration Intlayer pour automatiser les workflows de traduction (tests, remplissage IA, synchronisation JSON)
|
|
38
|
+
|
|
39
|
+
> Note : next-i18next est construit sur i18next. Ce guide utilise les primitives i18next compatibles avec next-i18next dans l’App Router, tout en gardant une architecture simple et prête pour la production.
|
|
40
|
+
> Pour une comparaison plus large, voir [next-i18next vs next-i18next vs Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/fr/next-i18next_vs_next-i18next_vs_intlayer.md).
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 1) Structure du projet
|
|
45
|
+
|
|
46
|
+
Installez les dépendances next-i18next :
|
|
47
|
+
|
|
48
|
+
```bash packageManager="npm"
|
|
49
|
+
npm install next-i18next i18next react-i18next i18next-resources-to-backend
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```bash packageManager="pnpm"
|
|
53
|
+
pnpm add next-i18next i18next react-i18next i18next-resources-to-backend
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```bash packageManager="yarn"
|
|
57
|
+
yarn add next-i18next i18next react-i18next i18next-resources-to-backend
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Commencez avec une structure claire. Gardez les messages séparés par locale et namespace.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
.
|
|
64
|
+
├── i18n.config.ts
|
|
65
|
+
└── src
|
|
66
|
+
├── locales
|
|
67
|
+
│ ├── en
|
|
68
|
+
│ │ ├── common.json
|
|
69
|
+
│ │ └── about.json
|
|
70
|
+
│ └── fr
|
|
71
|
+
│ ├── common.json
|
|
72
|
+
│ └── about.json
|
|
73
|
+
├── app
|
|
74
|
+
│ ├── i18n
|
|
75
|
+
│ │ └── server.ts
|
|
76
|
+
│ └── [locale]
|
|
77
|
+
│ ├── layout.tsx
|
|
78
|
+
│ └── about.tsx
|
|
79
|
+
└── components
|
|
80
|
+
├── I18nProvider.tsx
|
|
81
|
+
├── ClientComponent.tsx
|
|
82
|
+
└── ServerComponent.tsx
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Checklist (intermédiaire/senior) :
|
|
86
|
+
|
|
87
|
+
- Gardez un JSON par namespace et par locale
|
|
88
|
+
- Ne centralisez pas trop les messages ; utilisez des namespaces petits, spécifiques à une page ou une fonctionnalité
|
|
89
|
+
- Évitez d’importer toutes les locales en même temps ; chargez uniquement ce dont vous avez besoin
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 2) Installer les dépendances
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
bash
|
|
97
|
+
pnpm add i18next react-i18next i18next-resources-to-backend
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Si vous prévoyez d'utiliser les APIs ou la configuration interop de next-i18next, ajoutez également :
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
pnpm add next-i18next
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 3) Configuration i18n principale
|
|
109
|
+
|
|
110
|
+
Définissez les locales, la locale par défaut, les langues RTL, et les helpers pour les chemins/URLs localisés.
|
|
111
|
+
|
|
112
|
+
```ts fileName="i18n.config.ts"
|
|
113
|
+
export const locales = ["en", "fr"] as const;
|
|
114
|
+
export type Locale = (typeof locales)[number];
|
|
115
|
+
|
|
116
|
+
export const defaultLocale: Locale = "en";
|
|
117
|
+
|
|
118
|
+
export const rtlLocales = ["ar", "he", "fa", "ur"] as const;
|
|
119
|
+
export const isRtl = (locale: string) =>
|
|
120
|
+
(rtlLocales as readonly string[]).includes(locale);
|
|
121
|
+
|
|
122
|
+
export function localizedPath(locale: string, path: string) {
|
|
123
|
+
return locale === defaultLocale ? path : "/" + locale + path;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const ORIGIN = "https://example.com";
|
|
127
|
+
export function abs(locale: string, path: string) {
|
|
128
|
+
return ORIGIN + localizedPath(locale, path);
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Note importante : Si vous utilisez `next-i18next.config.js`, assurez-vous qu'il soit aligné avec `i18n.config.ts` pour éviter toute dérive.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 4) Initialisation i18n côté serveur
|
|
137
|
+
|
|
138
|
+
Initialisez i18next sur le serveur avec un backend dynamique qui importe uniquement le JSON de locale/espace de noms requis.
|
|
139
|
+
|
|
140
|
+
```ts fileName="src/app/i18n/server.ts"
|
|
141
|
+
import { createInstance } from "i18next";
|
|
142
|
+
import { initReactI18next } from "react-i18next/initReactI18next";
|
|
143
|
+
import resourcesToBackend from "i18next-resources-to-backend";
|
|
144
|
+
import { defaultLocale } from "@/i18n.config";
|
|
145
|
+
|
|
146
|
+
// Charger les ressources JSON depuis src/locales/<locale>/<namespace>.json
|
|
147
|
+
const backend = resourcesToBackend(
|
|
148
|
+
(locale: string, namespace: string) =>
|
|
149
|
+
import(`../../locales/${locale}/${namespace}.json`)
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
export async function initI18next(
|
|
153
|
+
locale: string,
|
|
154
|
+
namespaces: string[] = ["common"]
|
|
155
|
+
) {
|
|
156
|
+
const i18n = createInstance();
|
|
157
|
+
await i18n
|
|
158
|
+
.use(initReactI18next)
|
|
159
|
+
.use(backend)
|
|
160
|
+
.init({
|
|
161
|
+
lng: locale,
|
|
162
|
+
fallbackLng: defaultLocale,
|
|
163
|
+
ns: namespaces,
|
|
164
|
+
defaultNS: "common",
|
|
165
|
+
interpolation: { escapeValue: false },
|
|
166
|
+
react: { useSuspense: false },
|
|
167
|
+
});
|
|
168
|
+
return i18n;
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Note intermédiaire : Gardez la liste des namespaces courte par page pour limiter la charge. Évitez les bundles globaux « attrape-tout ».
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 5) Fournisseur client pour les composants React
|
|
177
|
+
|
|
178
|
+
Encapsulez les composants client avec un provider qui reflète la configuration serveur et charge uniquement les namespaces demandés.
|
|
179
|
+
|
|
180
|
+
```tsx fileName="src/components/I18nProvider.tsx"
|
|
181
|
+
"use client";
|
|
182
|
+
|
|
183
|
+
import * as React from "react";
|
|
184
|
+
import { I18nextProvider } from "react-i18next";
|
|
185
|
+
import { createInstance } from "i18next";
|
|
186
|
+
import { initReactI18next } from "react-i18next/initReactI18next";
|
|
187
|
+
import resourcesToBackend from "i18next-resources-to-backend";
|
|
188
|
+
import { defaultLocale } from "@/i18n.config";
|
|
189
|
+
|
|
190
|
+
const backend = resourcesToBackend(
|
|
191
|
+
(locale: string, namespace: string) =>
|
|
192
|
+
import(`../../locales/${locale}/${namespace}.json`)
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
type Props = {
|
|
196
|
+
locale: string;
|
|
197
|
+
namespaces?: string[];
|
|
198
|
+
resources?: Record<string, any>; // { ns: bundle }
|
|
199
|
+
children: React.ReactNode;
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
export default function I18nProvider({
|
|
203
|
+
locale,
|
|
204
|
+
namespaces = ["common"],
|
|
205
|
+
resources,
|
|
206
|
+
children,
|
|
207
|
+
}: Props) {
|
|
208
|
+
const [i18n] = React.useState(() => {
|
|
209
|
+
const i = createInstance();
|
|
210
|
+
|
|
211
|
+
i.use(initReactI18next)
|
|
212
|
+
.use(backend)
|
|
213
|
+
.init({
|
|
214
|
+
lng: locale,
|
|
215
|
+
fallbackLng: defaultLocale,
|
|
216
|
+
ns: namespaces,
|
|
217
|
+
resources: resources ? { [locale]: resources } : undefined,
|
|
218
|
+
defaultNS: "common",
|
|
219
|
+
interpolation: { escapeValue: false },
|
|
220
|
+
react: { useSuspense: false },
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
return i;
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
return <I18nextProvider i18n={i18n}>{children}</I18nextProvider>;
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Astuce pour débutant : Vous n'avez pas besoin de transmettre tous les messages au client. Commencez uniquement avec les namespaces de la page.
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 6) Mise en page et routes localisées
|
|
235
|
+
|
|
236
|
+
Définissez la langue et la direction, et pré-générez les routes par locale pour favoriser le rendu statique.
|
|
237
|
+
|
|
238
|
+
```tsx fileName="src/app/[locale]/layout.tsx"
|
|
239
|
+
import type { ReactNode } from "react";
|
|
240
|
+
import { locales, defaultLocale, isRtl, type Locale } from "@/i18n.config";
|
|
241
|
+
|
|
242
|
+
export const dynamicParams = false;
|
|
243
|
+
|
|
244
|
+
export function generateStaticParams() {
|
|
245
|
+
return locales.map((locale) => ({ locale }));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export default function LocaleLayout({
|
|
249
|
+
children,
|
|
250
|
+
params,
|
|
251
|
+
}: {
|
|
252
|
+
children: ReactNode;
|
|
253
|
+
params: { locale: string };
|
|
254
|
+
}) {
|
|
255
|
+
const locale: Locale = (locales as readonly string[]).includes(params.locale)
|
|
256
|
+
? (params.locale as any)
|
|
257
|
+
: defaultLocale;
|
|
258
|
+
|
|
259
|
+
const dir = isRtl(locale) ? "rtl" : "ltr";
|
|
260
|
+
|
|
261
|
+
return (
|
|
262
|
+
<html lang={locale} dir={dir}>
|
|
263
|
+
<body>{children}</body>
|
|
264
|
+
</html>
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## 7) Exemple de page avec utilisation serveur + client
|
|
272
|
+
|
|
273
|
+
```tsx fileName="src/app/[locale]/about.tsx"
|
|
274
|
+
import I18nProvider from "@/components/I18nProvider";
|
|
275
|
+
import { initI18next } from "@/app/i18n/server";
|
|
276
|
+
import type { Locale } from "@/i18n.config";
|
|
277
|
+
import ClientComponent from "@/components/ClientComponent";
|
|
278
|
+
import ServerComponent from "@/components/ServerComponent";
|
|
279
|
+
|
|
280
|
+
// Forcer le rendu statique pour la page
|
|
281
|
+
export const dynamic = "force-static";
|
|
282
|
+
|
|
283
|
+
export default async function AboutPage({
|
|
284
|
+
params: { locale },
|
|
285
|
+
}: {
|
|
286
|
+
params: { locale: Locale };
|
|
287
|
+
}) {
|
|
288
|
+
const namespaces = ["common", "about"] as const;
|
|
289
|
+
|
|
290
|
+
const i18n = await initI18next(locale, [...namespaces]);
|
|
291
|
+
const tAbout = i18n.getFixedT(locale, "about");
|
|
292
|
+
|
|
293
|
+
return (
|
|
294
|
+
<I18nProvider locale={locale} namespaces={[...namespaces]}>
|
|
295
|
+
<main>
|
|
296
|
+
<h1>{tAbout("title")}</h1>
|
|
297
|
+
|
|
298
|
+
<ClientComponent />
|
|
299
|
+
<ServerComponent t={tAbout} locale={locale} count={0} />
|
|
300
|
+
</main>
|
|
301
|
+
</I18nProvider>
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
Traductions (un JSON par namespace sous `src/locales/...`):
|
|
307
|
+
|
|
308
|
+
```json fileName="src/locales/en/about.json"
|
|
309
|
+
{
|
|
310
|
+
"title": "À propos",
|
|
311
|
+
"description": "Description de la page À propos",
|
|
312
|
+
"counter": {
|
|
313
|
+
"label": "Compteur",
|
|
314
|
+
"increment": "Incrémenter"
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
```json fileName="src/locales/fr/about.json"
|
|
320
|
+
{
|
|
321
|
+
"title": "À propos",
|
|
322
|
+
"description": "Description de la page À propos",
|
|
323
|
+
"counter": {
|
|
324
|
+
"label": "Compteur",
|
|
325
|
+
"increment": "Incrémenter"
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
Composant client (charge uniquement le namespace requis) :
|
|
331
|
+
|
|
332
|
+
```tsx fileName="src/components/ClientComponent.tsx"
|
|
333
|
+
"use client";
|
|
334
|
+
|
|
335
|
+
import React, { useState } from "react";
|
|
336
|
+
import { useTranslation } from "react-i18next";
|
|
337
|
+
|
|
338
|
+
const ClientComponent = () => {
|
|
339
|
+
const { t, i18n } = useTranslation("about");
|
|
340
|
+
const [count, setCount] = useState(0);
|
|
341
|
+
|
|
342
|
+
const numberFormat = new Intl.NumberFormat(i18n.language);
|
|
343
|
+
|
|
344
|
+
return (
|
|
345
|
+
<div>
|
|
346
|
+
<p>{numberFormat.format(count)}</p>
|
|
347
|
+
<button
|
|
348
|
+
aria-label={t("counter.label")}
|
|
349
|
+
onClick={() => setCount((c) => c + 1)}
|
|
350
|
+
>
|
|
351
|
+
{t("counter.increment")}
|
|
352
|
+
</button>
|
|
353
|
+
</div>
|
|
354
|
+
);
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
export default ClientComponent;
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
> Assurez-vous que la page/le provider inclut uniquement les namespaces dont vous avez besoin (par exemple, `about`).
|
|
361
|
+
> Si vous utilisez React < 19, mémoïsez les formateurs lourds comme `Intl.NumberFormat`.
|
|
362
|
+
|
|
363
|
+
Composant serveur synchrone intégré sous une frontière client :
|
|
364
|
+
|
|
365
|
+
```tsx fileName="src/components/ServerComponent.tsx"
|
|
366
|
+
type ServerComponentProps = {
|
|
367
|
+
t: (key: string) => string;
|
|
368
|
+
locale: string;
|
|
369
|
+
count: number;
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
const ServerComponent = ({ t, locale, count }: ServerComponentProps) => {
|
|
373
|
+
const formatted = new Intl.NumberFormat(locale).format(count);
|
|
374
|
+
|
|
375
|
+
return (
|
|
376
|
+
<div>
|
|
377
|
+
<p>{formatted}</p>
|
|
378
|
+
<button aria-label={t("counter.label")}>{t("counter.increment")}</button>
|
|
379
|
+
</div>
|
|
380
|
+
);
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
export default ServerComponent;
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## 8) SEO : Métadonnées, Hreflang, Sitemap, Robots
|
|
389
|
+
|
|
390
|
+
La traduction du contenu est un moyen d'améliorer la portée. Configurez soigneusement le SEO multilingue.
|
|
391
|
+
|
|
392
|
+
Bonnes pratiques :
|
|
393
|
+
|
|
394
|
+
- Définir `lang` et `dir` à la racine
|
|
395
|
+
- Ajouter `alternates.languages` pour chaque locale (+ `x-default`)
|
|
396
|
+
- Lister les URLs traduites dans `sitemap.xml` et utiliser `hreflang`
|
|
397
|
+
- Exclure les zones privées localisées (ex. `/fr/admin`) dans `robots.txt`
|
|
398
|
+
|
|
399
|
+
```tsx fileName="src/app/[locale]/about/layout.tsx"
|
|
400
|
+
import type { Metadata } from "next";
|
|
401
|
+
import { locales, defaultLocale, localizedPath } from "@/i18n.config";
|
|
402
|
+
|
|
403
|
+
export async function generateMetadata({
|
|
404
|
+
params,
|
|
405
|
+
}: {
|
|
406
|
+
params: { locale: string };
|
|
407
|
+
}): Promise<Metadata> {
|
|
408
|
+
const { locale } = params;
|
|
409
|
+
|
|
410
|
+
// Importer le bon bundle JSON depuis src/locales
|
|
411
|
+
const messages = (await import("@/locales/" + locale + "/about.json"))
|
|
412
|
+
.default;
|
|
413
|
+
|
|
414
|
+
const languages = Object.fromEntries(
|
|
415
|
+
locales.map((locale) => [locale, localizedPath(locale, "/about")])
|
|
416
|
+
);
|
|
417
|
+
|
|
418
|
+
return {
|
|
419
|
+
title: messages.title,
|
|
420
|
+
description: messages.description,
|
|
421
|
+
alternates: {
|
|
422
|
+
canonical: localizedPath(locale, "/about"),
|
|
423
|
+
languages: { ...languages, "x-default": "/about" },
|
|
424
|
+
},
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
export default async function AboutPage() {
|
|
429
|
+
return <h1>À propos</h1>;
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
```ts fileName="src/app/sitemap.ts"
|
|
434
|
+
import type { MetadataRoute } from "next";
|
|
435
|
+
import { locales, defaultLocale, abs } from "@/i18n.config";
|
|
436
|
+
|
|
437
|
+
export default function sitemap(): MetadataRoute.Sitemap {
|
|
438
|
+
const languages = Object.fromEntries(
|
|
439
|
+
locales.map((locale) => [locale, abs(locale, "/about")])
|
|
440
|
+
);
|
|
441
|
+
|
|
442
|
+
return [
|
|
443
|
+
{
|
|
444
|
+
url: abs(defaultLocale, "/about"),
|
|
445
|
+
lastModified: new Date(),
|
|
446
|
+
changeFrequency: "monthly",
|
|
447
|
+
priority: 0.7,
|
|
448
|
+
alternates: { languages },
|
|
449
|
+
},
|
|
450
|
+
];
|
|
451
|
+
}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
```ts fileName="src/app/robots.ts"
|
|
455
|
+
import type { MetadataRoute } from "next";
|
|
456
|
+
import { locales, defaultLocale, localizedPath } from "@/i18n.config";
|
|
457
|
+
|
|
458
|
+
const ORIGIN = "https://example.com";
|
|
459
|
+
|
|
460
|
+
const expandAllLocales = (path: string) => [
|
|
461
|
+
localizedPath(defaultLocale, path),
|
|
462
|
+
...locales
|
|
463
|
+
.filter((locale) => locale !== defaultLocale)
|
|
464
|
+
.map((locale) => localizedPath(locale, path)),
|
|
465
|
+
];
|
|
466
|
+
|
|
467
|
+
export default function robots(): MetadataRoute.Robots {
|
|
468
|
+
const disallow = [
|
|
469
|
+
...expandAllLocales("/dashboard"),
|
|
470
|
+
...expandAllLocales("/admin"),
|
|
471
|
+
];
|
|
472
|
+
|
|
473
|
+
return {
|
|
474
|
+
rules: { userAgent: "*", allow: ["/"], disallow },
|
|
475
|
+
host: ORIGIN,
|
|
476
|
+
sitemap: ORIGIN + "/sitemap.xml",
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
## 9) Middleware pour le routage des locales
|
|
484
|
+
|
|
485
|
+
Détecte la locale et redirige vers une route localisée si elle est manquante.
|
|
486
|
+
|
|
487
|
+
```ts fileName="src/middleware.ts"
|
|
488
|
+
import { NextResponse, type NextRequest } from "next/server";
|
|
489
|
+
import { defaultLocale, locales } from "@/i18n.config";
|
|
490
|
+
|
|
491
|
+
const PUBLIC_FILE = /\.[^/]+$/; // exclure les fichiers avec extensions
|
|
492
|
+
|
|
493
|
+
export function middleware(request: NextRequest) {
|
|
494
|
+
const { pathname } = request.nextUrl;
|
|
495
|
+
|
|
496
|
+
if (
|
|
497
|
+
pathname.startsWith("/_next") ||
|
|
498
|
+
pathname.startsWith("/api") ||
|
|
499
|
+
pathname.startsWith("/static") ||
|
|
500
|
+
PUBLIC_FILE.test(pathname)
|
|
501
|
+
) {
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
const hasLocale = locales.some(
|
|
506
|
+
(locale) =>
|
|
507
|
+
pathname === "/" + locale || pathname.startsWith("/" + locale + "/")
|
|
508
|
+
);
|
|
509
|
+
if (!hasLocale) {
|
|
510
|
+
const locale = defaultLocale;
|
|
511
|
+
const url = request.nextUrl.clone();
|
|
512
|
+
url.pathname = "/" + locale + (pathname === "/" ? "" : pathname);
|
|
513
|
+
return NextResponse.redirect(url);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
export const config = {
|
|
518
|
+
matcher: [
|
|
519
|
+
// Correspond à tous les chemins sauf ceux commençant par ces préfixes et les fichiers avec une extension
|
|
520
|
+
"/((?!api|_next|static|.*\\..*).*)",
|
|
521
|
+
],
|
|
522
|
+
};
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
## 10) Performance et bonnes pratiques DX
|
|
528
|
+
|
|
529
|
+
- **Définir les attributs html `lang` et `dir`** : Fait dans `src/app/[locale]/layout.tsx`.
|
|
530
|
+
- **Diviser les messages par namespace** : Garder les bundles petits (`common.json`, `about.json`, etc.).
|
|
531
|
+
- **Minimiser la charge côté client** : Sur les pages, passer uniquement les namespaces nécessaires au provider.
|
|
532
|
+
- **Préférer les pages statiques** : Utiliser `export const dynamic = 'force-static'` et `generateStaticParams` par locale.
|
|
533
|
+
- **Synchroniser les composants serveur** : Passer des chaînes/formatages pré-calculés au lieu d'appels asynchrones au moment du rendu.
|
|
534
|
+
- **Mémoriser les opérations lourdes** : Surtout dans le code client pour les anciennes versions de React.
|
|
535
|
+
- **Cache et headers** : Préférer le statique ou `revalidate` plutôt que le rendu dynamique quand c'est possible.
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
## 11) Tests et CI
|
|
540
|
+
|
|
541
|
+
- Ajouter des tests unitaires pour les composants utilisant `t` afin de garantir que les clés existent.
|
|
542
|
+
- Valider que chaque namespace possède les mêmes clés dans toutes les locales.
|
|
543
|
+
- Remonter les clés manquantes lors du CI avant le déploiement.
|
|
544
|
+
|
|
545
|
+
Intlayer automatisera une grande partie de cela (voir section suivante).
|
|
546
|
+
|
|
547
|
+
---
|
|
548
|
+
|
|
549
|
+
## 12) Ajouter Intlayer par-dessus (automatisation)
|
|
550
|
+
|
|
551
|
+
Intlayer vous aide à garder les traductions JSON synchronisées, à tester les clés manquantes, et à les compléter avec l'IA si désiré.
|
|
552
|
+
|
|
553
|
+
Installez les dépendances intlayer :
|
|
554
|
+
|
|
555
|
+
```bash packageManager="npm"
|
|
556
|
+
npm install intlayer @intlayer/sync-json-plugin -D
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
```bash packageManager="pnpm"
|
|
560
|
+
pnpm add intlayer @intlayer/sync-json-plugin -D
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
```bash packageManager="yarn"
|
|
564
|
+
yarn add intlayer @intlayer/sync-json-plugin -D
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
```ts fileName="intlayer.config.ts"
|
|
568
|
+
import { type IntlayerConfig, Locales } from "intlayer";
|
|
569
|
+
import { locales, defaultLocale } from "@/i18n";
|
|
570
|
+
import { syncJSON } from "@intlayer/sync-json";
|
|
571
|
+
|
|
572
|
+
export const locales = [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH];
|
|
573
|
+
|
|
574
|
+
const config: IntlayerConfig = {
|
|
575
|
+
internationalization: {
|
|
576
|
+
locales,
|
|
577
|
+
defaultLocale,
|
|
578
|
+
},
|
|
579
|
+
ai: {
|
|
580
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
581
|
+
},
|
|
582
|
+
plugins: [
|
|
583
|
+
syncJSON({
|
|
584
|
+
source: ({ locale }) => `./locales/${locale}.json`,
|
|
585
|
+
}),
|
|
586
|
+
],
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
export default config;
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
Ajouter des scripts dans le package :
|
|
593
|
+
|
|
594
|
+
```json fileName="package.json"
|
|
595
|
+
{
|
|
596
|
+
"scripts": {
|
|
597
|
+
"i18n:fill": "intlayer fill",
|
|
598
|
+
"i18n:test": "intlayer test"
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
Flux courants :
|
|
604
|
+
|
|
605
|
+
- `pnpm i18n:test` en CI pour échouer la build en cas de clés manquantes
|
|
606
|
+
- `pnpm i18n:fill` localement pour proposer des traductions AI pour les clés nouvellement ajoutées
|
|
607
|
+
|
|
608
|
+
> Vous pouvez fournir des arguments CLI ; consultez la [documentation CLI d'Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_cli.md).
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## 13) Dépannage
|
|
613
|
+
|
|
614
|
+
- **Clés introuvables** : Assurez-vous que la page/le provider liste les bons namespaces et que le fichier JSON existe sous `src/locales/<locale>/<namespace>.json`.
|
|
615
|
+
- **Mauvaise langue/flash d’anglais** : Vérifiez la détection de la locale dans `middleware.ts` et la propriété `lng` du provider.
|
|
616
|
+
- **Problèmes de mise en page RTL** : Vérifiez que `dir` est dérivé de `isRtl(locale)` et que votre CSS respecte `[dir="rtl"]`.
|
|
617
|
+
- **Alternatives SEO manquantes** : Confirmez que `alternates.languages` inclut toutes les locales ainsi que `x-default`.
|
|
618
|
+
- **Bundles trop volumineux** : Scindez davantage les namespaces et évitez d’importer l’arborescence complète des `locales` côté client.
|
|
619
|
+
|
|
620
|
+
---
|
|
621
|
+
|
|
622
|
+
## 14) Et ensuite
|
|
623
|
+
|
|
624
|
+
- Ajouter plus de locales et de namespaces à mesure que les fonctionnalités évoluent
|
|
625
|
+
- Localiser les pages d’erreur, les emails et le contenu généré par API
|
|
626
|
+
- Étendre les workflows Intlayer pour ouvrir automatiquement des PRs pour les mises à jour de traduction
|
|
627
|
+
|
|
628
|
+
Si vous préférez un starter, essayez le template : `https://github.com/aymericzip/intlayer-next-i18next-template`.
|