@intlayer/docs 7.0.7 → 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,757 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-11-01
|
|
3
|
+
updatedAt: 2025-11-01
|
|
4
|
+
title: How to internationalize your Next.js application using next-intl
|
|
5
|
+
description: Set up i18n with next-intl - best practices and SEO tips for multilingual Next.js apps, covering internationalization, content organization, and technical setup.
|
|
6
|
+
slugs:
|
|
7
|
+
- blog
|
|
8
|
+
- nextjs-internationalization-using-next-intl
|
|
9
|
+
applicationTemplate: https://github.com/aymericzip/next-intl-template
|
|
10
|
+
history:
|
|
11
|
+
- version: 7.0.0
|
|
12
|
+
date: 2025-11-01
|
|
13
|
+
changes: Initial version
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# How to internationalize your Next.js application using next-intl in 2025
|
|
17
|
+
|
|
18
|
+
## Table of Contents
|
|
19
|
+
|
|
20
|
+
<TOC/>
|
|
21
|
+
|
|
22
|
+
## What is next-intl?
|
|
23
|
+
|
|
24
|
+
**next-intl** is a popular internationalization (i18n) library designed specifically for Next.js App Router. It provides a seamless way to build multilingual Next.js applications with excellent TypeScript support and built-in optimizations.
|
|
25
|
+
|
|
26
|
+
> If you prefer, you can also refer to the [next-i18next guide](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/i18n_using_next-i18next.md), or directly using [Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_with_next-intl.md).
|
|
27
|
+
|
|
28
|
+
> See the comparison in [next-i18next vs next-intl vs Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/next-i18next_vs_next-intl_vs_intlayer.md).
|
|
29
|
+
|
|
30
|
+
## Practices you should follow
|
|
31
|
+
|
|
32
|
+
Before we dive into the implementation, here are some practices you should follow:
|
|
33
|
+
|
|
34
|
+
- **Set HTML `lang` and `dir` attributes**
|
|
35
|
+
In your layout, compute `dir` using `getLocaleDirection(locale)` and set `<html lang={locale} dir={dir}>` for proper accessibility and SEO.
|
|
36
|
+
- **Split messages by namespace**
|
|
37
|
+
Organize JSON files per locale and namespace (e.g., `common.json`, `about.json`) to load only what you need.
|
|
38
|
+
- **Minimize client payload**
|
|
39
|
+
On pages, send only required namespaces to `NextIntlClientProvider` (e.g., `pick(messages, ['common', 'about'])`).
|
|
40
|
+
- **Prefer static pages**
|
|
41
|
+
Use static page as much as possible for better performance and SEO.
|
|
42
|
+
- **I18n in server components**
|
|
43
|
+
Server components, like pages or all components not marked as `client` are statics and can be pre-rendered at build time. So we will have to pass the translation functions to them as props.
|
|
44
|
+
- **Set up TypeScript types**
|
|
45
|
+
For your locales to ensure type safety throughout your application.
|
|
46
|
+
- **Proxy for redirection**
|
|
47
|
+
Use a proxy to handle the locale detection and routing and redirect the user to the appropriate locale-prefixed URL.
|
|
48
|
+
- **Internationalization of your metadata, sitemap, robots.txt**
|
|
49
|
+
Internationalize your metadata, sitemap, robots.txt using the `generateMetadata` function provided by Next.js to ensure a better discovery by search engines in all locales.
|
|
50
|
+
- **Localize Links**
|
|
51
|
+
Localize Links using the `Link` component to redirect the user to the appropriate locale-prefixed URL. It's important to ensure the discovery of your pages in all locales.
|
|
52
|
+
- **Automate tests and translations**
|
|
53
|
+
Automate tests and translations help loosing time to maintain your multilingual application.
|
|
54
|
+
|
|
55
|
+
> See our doc listing everything you need to know about internationalization and SEO: [Internationalization (i18n) with next-intl](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/internationalization_and_SEO.md).
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Step-by-Step Guide to Set Up next-intl in a Next.js Application
|
|
60
|
+
|
|
61
|
+
<iframe
|
|
62
|
+
src="https://stackblitz.com/github/aymericzip/next-intl-template?embed=1&ctl=1&file=src/i18n.ts"
|
|
63
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
64
|
+
title="Demo CodeSandbox - How to Internationalize your application using Intlayer"
|
|
65
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
66
|
+
loading="lazy"
|
|
67
|
+
/>
|
|
68
|
+
|
|
69
|
+
> See [Application Template](https://github.com/aymericzip/next-intl-template) on GitHub.
|
|
70
|
+
|
|
71
|
+
Here's the project structure we'll be creating:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
.
|
|
75
|
+
├── global.ts
|
|
76
|
+
├── locales
|
|
77
|
+
│ ├── en
|
|
78
|
+
│ │ ├── common.json
|
|
79
|
+
│ │ └── about.json
|
|
80
|
+
│ ├── fr
|
|
81
|
+
│ │ ├── common.json
|
|
82
|
+
│ │ └── about.json
|
|
83
|
+
│ └── es
|
|
84
|
+
│ ├── common.json
|
|
85
|
+
│ └── about.json
|
|
86
|
+
└── src # Src is optional
|
|
87
|
+
├── proxy.ts
|
|
88
|
+
├── app
|
|
89
|
+
│ ├── i18n.ts
|
|
90
|
+
│ └── [locale]
|
|
91
|
+
│ ├── layout.tsx
|
|
92
|
+
│ ├── (home) # / (Route Group to not pollute all pages with home resources)
|
|
93
|
+
│ │ ├── layout.tsx
|
|
94
|
+
│ │ └── page.tsx
|
|
95
|
+
│ └── about # /about
|
|
96
|
+
│ ├── layout.tsx
|
|
97
|
+
│ └── page.tsx
|
|
98
|
+
└── components
|
|
99
|
+
├── ClientComponent.tsx
|
|
100
|
+
└── ServerComponent.tsx
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Step 1: Install Dependencies
|
|
104
|
+
|
|
105
|
+
Install the necessary packages using npm:
|
|
106
|
+
|
|
107
|
+
```bash packageManager="npm"
|
|
108
|
+
npm install next-intl
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
```bash packageManager="pnpm"
|
|
112
|
+
pnpm add next-intl
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
```bash packageManager="yarn"
|
|
116
|
+
yarn add next-intl
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
- **next-intl**: The core internationalization library for Next.js App Router that provides hooks, server functions, and client providers for managing translations.
|
|
120
|
+
|
|
121
|
+
### Step 2: Configure Your Project
|
|
122
|
+
|
|
123
|
+
Create a configuration file that defines your supported locales and sets up next-intl's request configuration. This file serves as the single source of truth for your i18n setup and ensures type safety throughout your application.
|
|
124
|
+
|
|
125
|
+
Centralizing your locale configuration prevents inconsistencies and makes it easier to add or remove locales in the future. The `getRequestConfig` function runs on every request and loads only the translations needed for each page, enabling code-splitting and reducing bundle size.
|
|
126
|
+
|
|
127
|
+
```tsx fileName="src/i18n.ts"
|
|
128
|
+
import { notFound } from "next/navigation";
|
|
129
|
+
import createMiddleware from "next-intl/middleware";
|
|
130
|
+
import { createNavigation } from "next-intl/navigation";
|
|
131
|
+
|
|
132
|
+
// Define supported locales with type safety
|
|
133
|
+
export const locales = ["en", "fr", "es"] as const;
|
|
134
|
+
export type Locale = (typeof locales)[number];
|
|
135
|
+
export const defaultLocale: Locale = "en";
|
|
136
|
+
|
|
137
|
+
export function isRTL(locale: Locale | (string & {})) {
|
|
138
|
+
return /^(ar|fa|he|iw|ur|ps|sd|ug|yi|ckb|ku)(-|$)/i.test(locale);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Load messages dynamically per locale to enable code-splitting
|
|
142
|
+
// Promise.all loads namespaces in parallel for better performance
|
|
143
|
+
async function loadMessages(locale: Locale) {
|
|
144
|
+
// Load only the namespaces your layout/pages need
|
|
145
|
+
const [common, home, about] = await Promise.all([
|
|
146
|
+
import(`../locales/${locale}/common.json`).then((m) => m.default),
|
|
147
|
+
import(`../locales/${locale}/home.json`).then((m) => m.default),
|
|
148
|
+
import(`../locales/${locale}/about.json`).then((m) => m.default),
|
|
149
|
+
// ... Future JSON files should be added here
|
|
150
|
+
]);
|
|
151
|
+
|
|
152
|
+
return { common, home, about } as const;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Helper to generate localized URLs (e.g., /about vs /fr/about)
|
|
156
|
+
export function localizedPath(locale: string, path: string) {
|
|
157
|
+
return locale === defaultLocale ? path : `/${locale}${path}`;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// getRequestConfig runs on every request and provides messages to server components
|
|
161
|
+
// This is where next-intl hooks into Next.js's server-side rendering
|
|
162
|
+
export default async function getRequestConfig({
|
|
163
|
+
requestLocale,
|
|
164
|
+
}: {
|
|
165
|
+
requestLocale: Promise<string | undefined>;
|
|
166
|
+
}) {
|
|
167
|
+
const requested: Locale = ((await requestLocale) as Locale) ?? defaultLocale;
|
|
168
|
+
|
|
169
|
+
if (!locales.includes(requested)) notFound();
|
|
170
|
+
|
|
171
|
+
return {
|
|
172
|
+
locale: requested,
|
|
173
|
+
messages: await loadMessages(requested),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function getCookie(locale: Locale) {
|
|
178
|
+
return [
|
|
179
|
+
`NEXT_LOCALE=${locale}`,
|
|
180
|
+
"Path=/",
|
|
181
|
+
`Max-Age=${60 * 60 * 24 * 365}`, // 1 year
|
|
182
|
+
"SameSite=Lax",
|
|
183
|
+
].join("; ");
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const routingOptions = {
|
|
187
|
+
locales,
|
|
188
|
+
defaultLocale,
|
|
189
|
+
localePrefix: "as-needed", // Change /en/... route to /...
|
|
190
|
+
// Optional: localized pathnames
|
|
191
|
+
// pathnames: {
|
|
192
|
+
// '/': '/',
|
|
193
|
+
// '/about': {en: '/about', fr: '/a-propos', es: '/acerca-de'},
|
|
194
|
+
// '/blog/[slug]': '/blog/[slug]'
|
|
195
|
+
// }
|
|
196
|
+
// localeDetection: true, // prevent "/" -> "/en" redirects from cookie
|
|
197
|
+
} as const;
|
|
198
|
+
|
|
199
|
+
export const { Link, redirect, usePathname, useRouter, getPathname } =
|
|
200
|
+
createNavigation(routingOptions);
|
|
201
|
+
|
|
202
|
+
export const proxy = createMiddleware(routingOptions);
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Step 3: Define Dynamic Locale Routes
|
|
206
|
+
|
|
207
|
+
Set up dynamic routing for locales by creating a `[locale]` directory in your app folder. This allows Next.js to handle locale-based routing where each locale becomes a URL segment (e.g., `/en/about`, `/fr/about`).
|
|
208
|
+
|
|
209
|
+
Using dynamic routes enables Next.js to generate static pages for all locales at build time, improving performance and SEO. The layout component sets the HTML `lang` and `dir` attributes based on the locale, which is crucial for accessibility and search engine understanding.
|
|
210
|
+
|
|
211
|
+
```tsx fileName="src/app/[locale]/layout.tsx"
|
|
212
|
+
import type { ReactNode } from "react";
|
|
213
|
+
import { locales } from "@/i18n";
|
|
214
|
+
import { getLocaleDirection, setRequestLocale } from "next-intl/server";
|
|
215
|
+
|
|
216
|
+
// Pre-generate static pages for all locales at build time (SSG)
|
|
217
|
+
// This improves performance and SEO
|
|
218
|
+
export function generateStaticParams() {
|
|
219
|
+
return locales.map((locale) => ({ locale }));
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export default function LocaleLayout({
|
|
223
|
+
children,
|
|
224
|
+
params,
|
|
225
|
+
}: {
|
|
226
|
+
children: ReactNode;
|
|
227
|
+
params: Promise<{ locale: string }>;
|
|
228
|
+
}) {
|
|
229
|
+
// In Next.js App Router, params is a Promise (can be await'd)
|
|
230
|
+
// This allows for dynamic route segments to be resolved asynchronously
|
|
231
|
+
const { locale } = await params;
|
|
232
|
+
|
|
233
|
+
// Critical: setRequestLocale tells next-intl which locale to use for this request
|
|
234
|
+
// Without this, getTranslations() won't know which locale to use in server components
|
|
235
|
+
setRequestLocale(locale);
|
|
236
|
+
|
|
237
|
+
// Get text direction (LTR/RTL) for proper HTML rendering
|
|
238
|
+
const dir = getLocaleDirection(locale);
|
|
239
|
+
|
|
240
|
+
return (
|
|
241
|
+
<html lang={locale} dir={dir}>
|
|
242
|
+
<body>{children}</body>
|
|
243
|
+
</html>
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
```tsx fileName="src/app/[locale]/about/page.tsx"
|
|
249
|
+
import { getTranslations, getMessages, getFormatter } from "next-intl/server";
|
|
250
|
+
import { NextIntlClientProvider } from "next-intl";
|
|
251
|
+
import pick from "lodash/pick";
|
|
252
|
+
import ServerComponent from "@/components/ServerComponent";
|
|
253
|
+
import ClientComponent from "@/components/ClientComponent";
|
|
254
|
+
|
|
255
|
+
export default async function AboutPage({
|
|
256
|
+
params,
|
|
257
|
+
}: {
|
|
258
|
+
params: Promise<{ locale: string }>;
|
|
259
|
+
}) {
|
|
260
|
+
const { locale } = await params;
|
|
261
|
+
|
|
262
|
+
// Messages are loaded server-side. Push only what's needed to the client.
|
|
263
|
+
// This minimizes the JavaScript bundle sent to the browser
|
|
264
|
+
const messages = await getMessages();
|
|
265
|
+
const clientMessages = pick(messages, ["common", "about"]);
|
|
266
|
+
|
|
267
|
+
// Strictly server-side translations/formatting
|
|
268
|
+
// These run on the server and can be passed as props to components
|
|
269
|
+
const tAbout = await getTranslations("about");
|
|
270
|
+
const tCounter = await getTranslations("about.counter");
|
|
271
|
+
const format = await getFormatter();
|
|
272
|
+
|
|
273
|
+
const initialFormattedCount = format.number(0);
|
|
274
|
+
|
|
275
|
+
return (
|
|
276
|
+
// NextIntlClientProvider makes translations available to client components
|
|
277
|
+
// Only pass the namespaces your client components actually use
|
|
278
|
+
<NextIntlClientProvider locale={locale} messages={clientMessages}>
|
|
279
|
+
<main>
|
|
280
|
+
<h1>{tAbout("title")}</h1>
|
|
281
|
+
<ClientComponent />
|
|
282
|
+
<ServerComponent
|
|
283
|
+
formattedCount={initialFormattedCount}
|
|
284
|
+
label={tCounter("label")}
|
|
285
|
+
increment={tCounter("increment")}
|
|
286
|
+
/>
|
|
287
|
+
</main>
|
|
288
|
+
</NextIntlClientProvider>
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Step 4: Create Your Translation Files
|
|
294
|
+
|
|
295
|
+
Create JSON files for each locale and namespace. This structure allows you to organize translations logically and load only what you need for each page.
|
|
296
|
+
|
|
297
|
+
Organizing translations by namespace (e.g., `common.json`, `about.json`) enables code splitting and reduces bundle size. You only load the translations needed for each page, improving performance.
|
|
298
|
+
|
|
299
|
+
```json fileName="locales/en/common.json"
|
|
300
|
+
{
|
|
301
|
+
"welcome": "Welcome",
|
|
302
|
+
"greeting": "Hello, world!"
|
|
303
|
+
}
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
```json fileName="locales/fr/common.json"
|
|
307
|
+
{
|
|
308
|
+
"welcome": "Bienvenue",
|
|
309
|
+
"greeting": "Bonjour le monde!"
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
```json fileName="locales/en/about.json"
|
|
314
|
+
{
|
|
315
|
+
"title": "About",
|
|
316
|
+
"description": "About page description",
|
|
317
|
+
"counter": {
|
|
318
|
+
"label": "Counter",
|
|
319
|
+
"increment": "Increment"
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
```json fileName="locales/fr/about.json"
|
|
325
|
+
{
|
|
326
|
+
"title": "À propos",
|
|
327
|
+
"description": "Description de la page À propos",
|
|
328
|
+
"counter": {
|
|
329
|
+
"label": "Compteur",
|
|
330
|
+
"increment": "Incrémenter"
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Step 5: Utilize Translations in Your Pages
|
|
336
|
+
|
|
337
|
+
Create a page component that loads translations on the server and passes them to both server and client components. This ensures that translations are loaded before rendering and prevents content flashing.
|
|
338
|
+
|
|
339
|
+
Server-side loading of translations improves SEO and prevents FOUC (Flash of Untranslated Content). By using `pick` to send only required namespaces to the client provider, we minimize the JavaScript bundle sent to the browser.
|
|
340
|
+
|
|
341
|
+
```tsx fileName="src/app/[locale]/about/page.tsx"
|
|
342
|
+
import { getTranslations, getMessages, getFormatter } from "next-intl/server";
|
|
343
|
+
import { NextIntlClientProvider } from "next-intl";
|
|
344
|
+
import pick from "lodash/pick";
|
|
345
|
+
import ServerComponent from "@/components/ServerComponent";
|
|
346
|
+
import ClientComponent from "@/components/ClientComponent";
|
|
347
|
+
|
|
348
|
+
export default async function AboutPage({
|
|
349
|
+
params,
|
|
350
|
+
}: {
|
|
351
|
+
params: Promise<{ locale: string }>;
|
|
352
|
+
}) {
|
|
353
|
+
const { locale } = await params;
|
|
354
|
+
|
|
355
|
+
// Messages are loaded server-side. Push only what's needed to the client.
|
|
356
|
+
// This minimizes the JavaScript bundle sent to the browser
|
|
357
|
+
const messages = await getMessages();
|
|
358
|
+
const clientMessages = pick(messages, ["common", "about"]);
|
|
359
|
+
|
|
360
|
+
// Strictly server-side translations/formatting
|
|
361
|
+
// These run on the server and can be passed as props to components
|
|
362
|
+
const tAbout = await getTranslations("about");
|
|
363
|
+
const tCounter = await getTranslations("about.counter");
|
|
364
|
+
const format = await getFormatter();
|
|
365
|
+
|
|
366
|
+
const initialFormattedCount = format.number(0);
|
|
367
|
+
|
|
368
|
+
return (
|
|
369
|
+
// NextIntlClientProvider makes translations available to client components
|
|
370
|
+
// Only pass the namespaces your client components actually use
|
|
371
|
+
<NextIntlClientProvider locale={locale} messages={clientMessages}>
|
|
372
|
+
<main>
|
|
373
|
+
<h1>{tAbout("title")}</h1>
|
|
374
|
+
<ClientComponent />
|
|
375
|
+
<ServerComponent
|
|
376
|
+
formattedCount={initialFormattedCount}
|
|
377
|
+
label={tCounter("label")}
|
|
378
|
+
increment={tCounter("increment")}
|
|
379
|
+
/>
|
|
380
|
+
</main>
|
|
381
|
+
</NextIntlClientProvider>
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### Step 6: Use Translations in Client Components
|
|
387
|
+
|
|
388
|
+
Client components can use the `useTranslations` and `useFormatter` hooks to access translations and formatting functions. These hooks read from the `NextIntlClientProvider` context.
|
|
389
|
+
|
|
390
|
+
Client components need React hooks to access translations. The `useTranslations` and `useFormatter` hooks integrate seamlessly with next-intl and provide reactive updates when the locale changes.
|
|
391
|
+
|
|
392
|
+
> Don't forget to add the required namespaces to the page's client messages (only include the namespaces your client components actually need).
|
|
393
|
+
|
|
394
|
+
```tsx fileName="src/components/ClientComponent.tsx"
|
|
395
|
+
"use client";
|
|
396
|
+
|
|
397
|
+
import React, { useState } from "react";
|
|
398
|
+
import { useTranslations, useFormatter } from "next-intl";
|
|
399
|
+
|
|
400
|
+
const ClientComponent = () => {
|
|
401
|
+
// Scope directly to the nested object
|
|
402
|
+
// useTranslations/useFormatter are hooks that read from NextIntlClientProvider context
|
|
403
|
+
// They only work if the component is wrapped in NextIntlClientProvider
|
|
404
|
+
const t = useTranslations("about.counter");
|
|
405
|
+
const format = useFormatter();
|
|
406
|
+
const [count, setCount] = useState(0);
|
|
407
|
+
|
|
408
|
+
return (
|
|
409
|
+
<div>
|
|
410
|
+
<p>{format.number(count)}</p>
|
|
411
|
+
<button
|
|
412
|
+
aria-label={t("label")}
|
|
413
|
+
onClick={() => setCount((count) => count + 1)}
|
|
414
|
+
>
|
|
415
|
+
{t("increment")}
|
|
416
|
+
</button>
|
|
417
|
+
</div>
|
|
418
|
+
);
|
|
419
|
+
};
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### Step 7: Use Translations in Server Components
|
|
423
|
+
|
|
424
|
+
Server components cannot use React hooks, so they receive translations and formatters via props from their parent components. This approach keeps server components synchronous and allows them to be nested inside client components.
|
|
425
|
+
|
|
426
|
+
Server components that might be nested under client boundaries need to be synchronous. By passing translated strings and formatted values as props, we avoid async operations and ensure proper rendering. Pre-compute translations and formatting in the parent page component.
|
|
427
|
+
|
|
428
|
+
```tsx fileName="src/components/ServerComponent.tsx"
|
|
429
|
+
// Server components nested inside client components must be synchronous
|
|
430
|
+
// React can't serialize async functions across the server/client boundary
|
|
431
|
+
// Solution: pre-compute translations/formats in the parent and pass as props
|
|
432
|
+
type ServerComponentProps = {
|
|
433
|
+
formattedCount: string;
|
|
434
|
+
label: string;
|
|
435
|
+
increment: string;
|
|
436
|
+
};
|
|
437
|
+
|
|
438
|
+
const ServerComponent = ({
|
|
439
|
+
formattedCount,
|
|
440
|
+
label,
|
|
441
|
+
increment,
|
|
442
|
+
}: ServerComponentProps) => {
|
|
443
|
+
return (
|
|
444
|
+
<div>
|
|
445
|
+
<p>{formattedCount}</p>
|
|
446
|
+
<button aria-label={label}>{increment}</button>
|
|
447
|
+
</div>
|
|
448
|
+
);
|
|
449
|
+
};
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
> In your page/layout, use `getTranslations` and `getFormatter` from `next-intl/server` to pre-compute translations and formatting, then pass them as props to server components.
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
### (Optional) Step 8: Change the language of your content
|
|
457
|
+
|
|
458
|
+
To change the language of your content with next-intl, render locale-aware links that point to the same pathname while switching locale. The provider rewrites URLs automatically, so you only have to target the current route.
|
|
459
|
+
|
|
460
|
+
```tsx fileName="src/components/LocaleSwitcher.tsx"
|
|
461
|
+
"use client";
|
|
462
|
+
|
|
463
|
+
import Link from "next/link";
|
|
464
|
+
import { usePathname } from "next/navigation";
|
|
465
|
+
import { useLocale } from "next-intl";
|
|
466
|
+
import { defaultLocale, getCookie, type Locale, locales } from "@/i18n";
|
|
467
|
+
|
|
468
|
+
const getLocaleLabel = (locale: Locale): string => {
|
|
469
|
+
try {
|
|
470
|
+
const displayNames = new Intl.DisplayNames([locale], { type: "language" });
|
|
471
|
+
return displayNames.of(locale) ?? locale.toUpperCase();
|
|
472
|
+
} catch {
|
|
473
|
+
return locale.toUpperCase();
|
|
474
|
+
}
|
|
475
|
+
};
|
|
476
|
+
|
|
477
|
+
const localeFlags: Record<Locale, string> = {
|
|
478
|
+
en: "🇬🇧",
|
|
479
|
+
fr: "🇫🇷",
|
|
480
|
+
es: "🇪🇸",
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
export default function LocaleSwitcher() {
|
|
484
|
+
const activeLocale = useLocale();
|
|
485
|
+
const pathname = usePathname();
|
|
486
|
+
|
|
487
|
+
// Remove the locale prefix from the pathname to get the base path
|
|
488
|
+
const getBasePath = (path: string) => {
|
|
489
|
+
for (const locale of locales) {
|
|
490
|
+
if (path.startsWith(`/${locale}`)) {
|
|
491
|
+
return path.slice(locale.length + 1) || "/";
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return path;
|
|
495
|
+
};
|
|
496
|
+
|
|
497
|
+
const basePath = getBasePath(pathname);
|
|
498
|
+
|
|
499
|
+
return (
|
|
500
|
+
<nav aria-label="Language selector">
|
|
501
|
+
<div>
|
|
502
|
+
{(locales as readonly Locale[]).map((locale) => {
|
|
503
|
+
const isActive = locale === activeLocale;
|
|
504
|
+
// Build the href based on whether it's the default locale
|
|
505
|
+
const href =
|
|
506
|
+
locale === defaultLocale ? basePath : `/${locale}${basePath}`;
|
|
507
|
+
return (
|
|
508
|
+
<Link
|
|
509
|
+
key={locale}
|
|
510
|
+
href={href}
|
|
511
|
+
aria-current={isActive ? "page" : undefined}
|
|
512
|
+
onClick={() => {
|
|
513
|
+
document.cookie = getCookie(locale);
|
|
514
|
+
}}
|
|
515
|
+
>
|
|
516
|
+
<span>{localeFlags[locale]}</span>
|
|
517
|
+
<span>{getLocaleLabel(locale)}</span>
|
|
518
|
+
<span>{locale.toUpperCase()}</span>
|
|
519
|
+
</Link>
|
|
520
|
+
);
|
|
521
|
+
})}
|
|
522
|
+
</div>
|
|
523
|
+
</nav>
|
|
524
|
+
);
|
|
525
|
+
}
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
### (Optional) Step 9: Use the localized Link component
|
|
529
|
+
|
|
530
|
+
`next-intl` provides a subpackage `next-intl/navigation` that contains a localized link component that automatically applies the active locale. We already extracted it for you in the `@/i18n` file, so you can use it like this:
|
|
531
|
+
|
|
532
|
+
```tsx fileName="src/components/MyComponent.tsx"
|
|
533
|
+
import { Link } from "@/i18n";
|
|
534
|
+
|
|
535
|
+
return <Link href="/about">t("about.title")</Link>;
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### (Optional) Step 10: Access the active locale inside Server Actions
|
|
539
|
+
|
|
540
|
+
Server Actions can read the current locale using `next-intl/server`. This is useful for sending localized emails or storing language preferences alongside submitted data.
|
|
541
|
+
|
|
542
|
+
```ts fileName="src/app/actions/get-current-locale.ts"
|
|
543
|
+
"use server";
|
|
544
|
+
|
|
545
|
+
import { getLocale } from "next-intl/server";
|
|
546
|
+
|
|
547
|
+
export async function getCurrentLocale() {
|
|
548
|
+
return getLocale();
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
export async function handleContactForm(formData: FormData) {
|
|
552
|
+
const locale = await getCurrentLocale();
|
|
553
|
+
|
|
554
|
+
// Use the locale to select templates, analytics labels, etc.
|
|
555
|
+
console.log(`Received contact form from locale ${locale}`);
|
|
556
|
+
}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
> `getLocale` reads the locale set by `next-intl` proxy, so it works anywhere on the server: Route Handlers, Server Actions, and edge functions.
|
|
560
|
+
|
|
561
|
+
### (Optional) Step 11: Internationalize Your Metadata
|
|
562
|
+
|
|
563
|
+
Translating content is important, but the main goal of internationalization is to make your website more visible to the world. I18n is an incredible lever to improve your website visibility through proper SEO.
|
|
564
|
+
|
|
565
|
+
Properly internationalized metadata helps search engines understand what languages are available on your pages. This includes setting hreflang meta tags, translating titles and descriptions, and ensuring canonical URLs are correctly set for each locale.
|
|
566
|
+
|
|
567
|
+
```tsx fileName="src/app/[locale]/about/layout.tsx"
|
|
568
|
+
import type { Metadata } from "next";
|
|
569
|
+
import { locales, defaultLocale, localizedPath } from "@/i18n";
|
|
570
|
+
import { getTranslations } from "next-intl/server";
|
|
571
|
+
|
|
572
|
+
// generateMetadata runs for each locale, generating SEO-friendly metadata
|
|
573
|
+
// This helps search engines understand alternate language versions
|
|
574
|
+
export async function generateMetadata({
|
|
575
|
+
params,
|
|
576
|
+
}: {
|
|
577
|
+
params: { locale: string };
|
|
578
|
+
}): Promise<Metadata> {
|
|
579
|
+
const { locale } = params;
|
|
580
|
+
const t = await getTranslations({ locale, namespace: "about" });
|
|
581
|
+
|
|
582
|
+
const url = "/about";
|
|
583
|
+
const languages = Object.fromEntries(
|
|
584
|
+
locales.map((locale) => [locale, localizedPath(locale, url)])
|
|
585
|
+
);
|
|
586
|
+
|
|
587
|
+
return {
|
|
588
|
+
title: t("title"),
|
|
589
|
+
description: t("description"),
|
|
590
|
+
alternates: {
|
|
591
|
+
canonical: localizedPath(locale, url),
|
|
592
|
+
languages: { ...languages, "x-default": url },
|
|
593
|
+
},
|
|
594
|
+
};
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
// ... Rest of the page code
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
### (Optional) Step 12: Internationalize Your Sitemap
|
|
601
|
+
|
|
602
|
+
Generate a sitemap that includes all locale versions of your pages. This helps search engines discover and index all language versions of your content.
|
|
603
|
+
|
|
604
|
+
A properly internationalized sitemap ensures search engines can find and index all language versions of your pages. This improves visibility in international search results.
|
|
605
|
+
|
|
606
|
+
```tsx fileName="src/app/sitemap.ts"
|
|
607
|
+
import type { MetadataRoute } from "next";
|
|
608
|
+
import { defaultLocale, locales } from "@/i18n";
|
|
609
|
+
|
|
610
|
+
const origin = "https://example.com";
|
|
611
|
+
|
|
612
|
+
const formatterLocalizedPath = (locale: string, path: string) =>
|
|
613
|
+
locale === defaultLocale ? `${origin}${path}` : `${origin}/${locale}${path}`;
|
|
614
|
+
|
|
615
|
+
/**
|
|
616
|
+
* Get a map of all locales and their localized paths
|
|
617
|
+
*
|
|
618
|
+
* Example output:
|
|
619
|
+
* {
|
|
620
|
+
* "en": "https://example.com",
|
|
621
|
+
* "fr": "https://example.com/fr",
|
|
622
|
+
* "es": "https://example.com/es",
|
|
623
|
+
* "x-default": "https://example.com"
|
|
624
|
+
* }
|
|
625
|
+
*/
|
|
626
|
+
const getLocalizedMap = (path: string) =>
|
|
627
|
+
Object.fromEntries([
|
|
628
|
+
...locales.map((locale) => [locale, formatterLocalizedPath(locale, path)]),
|
|
629
|
+
["x-default", formatterLocalizedPath(defaultLocale, path)],
|
|
630
|
+
]);
|
|
631
|
+
|
|
632
|
+
// Generate sitemap with all locale variants for better SEO
|
|
633
|
+
// The alternates field tells search engines about language versions
|
|
634
|
+
export default function sitemap(): MetadataRoute.Sitemap {
|
|
635
|
+
return [
|
|
636
|
+
{
|
|
637
|
+
url: formatterLocalizedPath(defaultLocale, "/"),
|
|
638
|
+
lastModified: new Date(),
|
|
639
|
+
changeFrequency: "monthly",
|
|
640
|
+
priority: 1.0,
|
|
641
|
+
alternates: { languages: getLocalizedMap("/") },
|
|
642
|
+
},
|
|
643
|
+
{
|
|
644
|
+
url: formatterLocalizedPath(defaultLocale, "/about"),
|
|
645
|
+
lastModified: new Date(),
|
|
646
|
+
changeFrequency: "monthly",
|
|
647
|
+
priority: 0.7,
|
|
648
|
+
alternates: { languages: getLocalizedMap("/about") },
|
|
649
|
+
},
|
|
650
|
+
];
|
|
651
|
+
}
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
### (Optional) Step 13: Internationalize Your robots.txt
|
|
655
|
+
|
|
656
|
+
Create a robots.txt file that properly handles all locale versions of your protected routes. This ensures that search engines don't index admin or dashboard pages in any language.
|
|
657
|
+
|
|
658
|
+
Properly configuring robots.txt for all locales prevents search engines from indexing sensitive pages when your routes are different for each locale.
|
|
659
|
+
|
|
660
|
+
```tsx fileName="src/app/robots.ts"
|
|
661
|
+
import type { MetadataRoute } from "next";
|
|
662
|
+
import { locales, defaultLocale } from "@/i18n";
|
|
663
|
+
|
|
664
|
+
const origin = "https://example.com";
|
|
665
|
+
// Generate paths for all locales (e.g., /admin, /fr/admin, /es/admin)
|
|
666
|
+
const withAllLocales = (path: string) => [
|
|
667
|
+
path,
|
|
668
|
+
...locales
|
|
669
|
+
.filter((locale) => locale !== defaultLocale)
|
|
670
|
+
.map((locale) => "/" + locale + path),
|
|
671
|
+
];
|
|
672
|
+
|
|
673
|
+
export default function robots(): MetadataRoute.Robots {
|
|
674
|
+
const disallow = [
|
|
675
|
+
...withAllLocales("/dashboard"),
|
|
676
|
+
...withAllLocales("/admin"),
|
|
677
|
+
];
|
|
678
|
+
|
|
679
|
+
return {
|
|
680
|
+
rules: { userAgent: "*", allow: ["/"], disallow },
|
|
681
|
+
host: origin,
|
|
682
|
+
sitemap: origin + "/sitemap.xml",
|
|
683
|
+
};
|
|
684
|
+
}
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
### (Optional) Step 14: Set Up Proxy for Locale Routing
|
|
688
|
+
|
|
689
|
+
Create a proxy to automatically detect the user's preferred locale and redirect them to the appropriate locale-prefixed URL. next-intl provides a convenient proxy function that handles this automatically.
|
|
690
|
+
|
|
691
|
+
Proxy ensures that users are automatically redirected to their preferred language when they visit your site. It also saves the user's preference for future visits, improving user experience.
|
|
692
|
+
|
|
693
|
+
```ts fileName="src/proxy.ts"
|
|
694
|
+
import { proxy } from "@/i18n";
|
|
695
|
+
|
|
696
|
+
// Middleware runs before routes, handling locale detection and routing
|
|
697
|
+
// localeDetection: true uses Accept-Language header to auto-detect locale
|
|
698
|
+
export default proxy;
|
|
699
|
+
|
|
700
|
+
export const config = {
|
|
701
|
+
// Skip API, Next internals and static assets
|
|
702
|
+
// Regex: match all routes except those starting with api, _next, or containing a dot (files)
|
|
703
|
+
matcher: ["/((?!api|_next|.*\\..*).*)"],
|
|
704
|
+
};
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
### (Optional) Step 15: Set Up TypeScript Types for the Locale
|
|
708
|
+
|
|
709
|
+
Setting up TypeScript will help you to get autocompletion and type safety for your keys.
|
|
710
|
+
|
|
711
|
+
For that, you can create a global.ts file in your project root and add the following code:
|
|
712
|
+
|
|
713
|
+
```ts fileName="global.ts"
|
|
714
|
+
import type { locales } from "@/i18n";
|
|
715
|
+
|
|
716
|
+
type Messages = {
|
|
717
|
+
common: typeof import("./locales/en/common.json");
|
|
718
|
+
home: typeof import("./locales/en/home.json");
|
|
719
|
+
about: typeof import("./locales/en/about.json");
|
|
720
|
+
// ... Future JSON files should be added here too
|
|
721
|
+
};
|
|
722
|
+
|
|
723
|
+
declare module "next-intl" {
|
|
724
|
+
interface AppConfig {
|
|
725
|
+
Locale: (typeof locales)[number];
|
|
726
|
+
Messages: Messages;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
This code will use Module Augmentation to add the locales and messages to the next-intl AppConfig type.
|
|
732
|
+
|
|
733
|
+
### (Optional) Step 15: Automate Your Translations Using Intlayer
|
|
734
|
+
|
|
735
|
+
Intlayer is a **free** and **open-source** library designed to assist the localization process in your application. While next-intl handles the translation loading and management, Intlayer helps automate the translation workflow.
|
|
736
|
+
|
|
737
|
+
Managing translations manually can be time-consuming and error-prone. Intlayer automates translation testing, generation, and management, saving you time and ensuring consistency across your application.
|
|
738
|
+
|
|
739
|
+
Intlayer will allows your to:
|
|
740
|
+
|
|
741
|
+
- **Declare your content where you want in your codebase**
|
|
742
|
+
Intlayer allows to declare your content where you want in your codebase using `.content.{ts|js|json}` files. It will allow a better organization of your content, ensuring better readability and maintainability of your codebase.
|
|
743
|
+
|
|
744
|
+
- **Test missing translations**
|
|
745
|
+
Intlayer provide test functions to that can be integrated in your CI/CD pipeline, or in your unit tests. Learn more about [testing your translations](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/testing.md).
|
|
746
|
+
|
|
747
|
+
- **Automate your translations**,
|
|
748
|
+
Intlayer provide a CLI and a VSCode extension to automate your translations. It can be integrated in your CI/CD pipeline. Learn more about [automating your translations](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_cli.md).
|
|
749
|
+
You can use your **own API key, and the AI provider of your choice**. It also provide context aware translations, see [fill content](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/autoFill.md).
|
|
750
|
+
|
|
751
|
+
- **Connect external content**
|
|
752
|
+
Intlayer allows you to connect your content to an external content management system (CMS). To fetch it in a optimized way and insert it in your JSON resources. Learn more about [fetching external content](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/function_fetching.md).
|
|
753
|
+
|
|
754
|
+
- **Visual editor**
|
|
755
|
+
Intlayer offers an free visual editor to edit your content using a visual editor. Learn more about [visual editing your translations](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_visual_editor.md).
|
|
756
|
+
|
|
757
|
+
And more. To discover all the features provided by Intlayer, please refer to the [Interest of Intlayer documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/interest_of_intlayer.md).
|