@intlayer/docs 7.0.7 → 7.0.8
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
package/docs/it/configuration.md
CHANGED
|
@@ -39,6 +39,12 @@ I file di configurazione di Intlayer permettono la personalizzazione di vari asp
|
|
|
39
39
|
|
|
40
40
|
---
|
|
41
41
|
|
|
42
|
+
## Indice
|
|
43
|
+
|
|
44
|
+
<TOC/>
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
42
48
|
## Formati di File di Configurazione Supportati
|
|
43
49
|
|
|
44
50
|
Intlayer accetta formati di file di configurazione JSON, JS, MJS e TS:
|
package/docs/it/intlayer_cli.md
CHANGED
|
@@ -27,6 +27,14 @@ history:
|
|
|
27
27
|
|
|
28
28
|
# CLI di Intlayer
|
|
29
29
|
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Indice
|
|
33
|
+
|
|
34
|
+
<TOC/>
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
30
38
|
## Installare il Pacchetto
|
|
31
39
|
|
|
32
40
|
Installa i pacchetti necessari usando npm:
|
|
@@ -368,7 +376,6 @@ npx intlayer doc translate
|
|
|
368
376
|
> Esempio: `npx intlayer doc translate --excluded-glob-pattern "docs/internal/**"`
|
|
369
377
|
|
|
370
378
|
- **`--skip-if-modified-before [skipIfModifiedBefore]`**: Salta il file se è stato modificato prima del tempo indicato.
|
|
371
|
-
|
|
372
379
|
- Può essere un tempo assoluto come "2025-12-05" (stringa o Date)
|
|
373
380
|
- Può essere un tempo relativo in ms `1 * 60 * 60 * 1000` (1 ora)
|
|
374
381
|
- Questa opzione controlla il tempo di aggiornamento del file usando il metodo `fs.stat`. Quindi potrebbe essere influenzata da Git o altri strumenti che modificano il file.
|
|
@@ -376,7 +383,6 @@ npx intlayer doc translate
|
|
|
376
383
|
> Esempio: `npx intlayer doc translate --skip-if-modified-before "2025-12-05"`
|
|
377
384
|
|
|
378
385
|
- **`--skip-if-modified-after [skipIfModifiedAfter]`**: Salta il file se è stato modificato entro il tempo indicato.
|
|
379
|
-
|
|
380
386
|
- Può essere un orario assoluto come "2025-12-05" (stringa o Date)
|
|
381
387
|
- Può essere un orario relativo in ms `1 * 60 * 60 * 1000` (1 ora)
|
|
382
388
|
- Questa opzione controlla l'orario di aggiornamento del file usando il metodo `fs.stat`. Quindi potrebbe essere influenzata da Git o altri strumenti che modificano il file.
|
|
@@ -427,7 +433,6 @@ npx intlayer doc translate
|
|
|
427
433
|
**Opzioni per istruzioni personalizzate:**
|
|
428
434
|
|
|
429
435
|
- **`--custom-instructions [customInstructions]`**: Istruzioni personalizzate aggiunte al prompt. Utile per applicare regole specifiche riguardanti la formattazione, la traduzione degli URL, ecc.
|
|
430
|
-
|
|
431
436
|
- Può essere un tempo assoluto come "2025-12-05" (stringa o Data)
|
|
432
437
|
- Può essere un tempo relativo in ms `1 * 60 * 60 * 1000` (1 ora)
|
|
433
438
|
- Questa opzione controlla il tempo di aggiornamento del file usando il metodo `fs.stat`. Quindi potrebbe essere influenzata da Git o altri strumenti che modificano il file.
|
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-10-05
|
|
3
|
+
updatedAt: 2025-10-05
|
|
4
|
+
title: Come tradurre la tua Next.js 15 usando next-i18next – guida i18n 2025
|
|
5
|
+
description: Una guida pratica e pronta per la produzione per internazionalizzare un'app Next.js 15 App Router con i18next/next-i18next e migliorarla con Intlayer.
|
|
6
|
+
keywords:
|
|
7
|
+
- Internazionalizzazione
|
|
8
|
+
- Documentazione
|
|
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
|
+
# Traduci il tuo sito Next.js 15 usando next-i18next con Intlayer | Internazionalizzazione (i18n)
|
|
22
|
+
|
|
23
|
+
### A chi è rivolta questa guida
|
|
24
|
+
|
|
25
|
+
- **Junior**: Segui esattamente i passaggi e copia i blocchi di codice. Otterrai un'app multilingue funzionante.
|
|
26
|
+
- **Mid-level**: Usa le checklist e i suggerimenti sulle best practice per evitare errori comuni.
|
|
27
|
+
- **Senior**: Dai una rapida occhiata alla struttura generale, alle sezioni SEO e automazione; troverai impostazioni predefinite sensate e punti di estensione.
|
|
28
|
+
|
|
29
|
+
### Cosa costruirai
|
|
30
|
+
|
|
31
|
+
- Progetto App Router con rotte localizzate (es. `/`, `/fr/...`)
|
|
32
|
+
- Configurazione i18n con locali, locale predefinito, supporto RTL
|
|
33
|
+
- Inizializzazione i18n lato server e un provider client
|
|
34
|
+
- Traduzioni con namespace caricate su richiesta
|
|
35
|
+
- SEO con `hreflang`, `sitemap` localizzato, `robots`
|
|
36
|
+
- Middleware per il routing delle localizzazioni
|
|
37
|
+
- Integrazione Intlayer per automatizzare i flussi di lavoro di traduzione (test, completamento AI, sincronizzazione JSON)
|
|
38
|
+
|
|
39
|
+
> Nota: next-i18next è costruito sopra i18next. Questa guida utilizza le primitive di i18next compatibili con next-i18next nell'App Router, mantenendo l'architettura semplice e pronta per la produzione.
|
|
40
|
+
> Per un confronto più ampio, vedi [next-i18next vs next-i18next vs Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/it/next-i18next_vs_next-i18next_vs_intlayer.md).
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 1) Struttura del progetto
|
|
45
|
+
|
|
46
|
+
Installa le dipendenze di 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
|
+
Inizia con una struttura chiara. Mantieni i messaggi suddivisi per locale e 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 (mid/senior):
|
|
86
|
+
|
|
87
|
+
- Mantieni un JSON per namespace per locale
|
|
88
|
+
- Non centralizzare eccessivamente i messaggi; usa namespace piccoli, limitati a pagina/funzione
|
|
89
|
+
- Evita di importare tutte le locale contemporaneamente; carica solo ciò di cui hai bisogno
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 2) Installa le dipendenze
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
bash
|
|
97
|
+
pnpm add i18next react-i18next i18next-resources-to-backend
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Se prevedi di utilizzare le API o l'interoperabilità di configurazione di next-i18next, aggiungi anche:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
pnpm add next-i18next
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 3) Configurazione core di i18n
|
|
109
|
+
|
|
110
|
+
Definisci le locale, la locale predefinita, RTL e gli helper per percorsi/URL localizzati.
|
|
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
|
+
Nota senior: Se usi `next-i18next.config.js`, mantienilo allineato con `i18n.config.ts` per evitare discrepanze.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 4) Inizializzazione i18n lato server
|
|
137
|
+
|
|
138
|
+
Inizializza i18next sul server con un backend dinamico che importa solo il JSON della locale/namespace richiesti.
|
|
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
|
+
// Carica le risorse JSON da 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
|
+
Nota intermedia: Mantieni la lista dei namespace breve per pagina per limitare il payload. Evita bundle globali “catch-all”.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 5) Provider client per componenti React
|
|
177
|
+
|
|
178
|
+
Avvolgi i componenti client con un provider che rispecchia la configurazione server e carica solo i namespace richiesti.
|
|
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
|
+
Suggerimento per principianti: Non è necessario passare tutti i messaggi al client. Inizia solo con i namespace della pagina.
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 6) Layout e rotte localizzate
|
|
235
|
+
|
|
236
|
+
Imposta la lingua e la direzione, e pre-generare le rotte per locale per favorire il rendering statico.
|
|
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) Pagina di esempio con utilizzo server + 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
|
+
// Forza il rendering statico per la pagina
|
|
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
|
+
Traduzioni (un file JSON per namespace sotto `src/locales/...`):
|
|
307
|
+
|
|
308
|
+
```json fileName="src/locales/it/about.json"
|
|
309
|
+
{
|
|
310
|
+
"title": "Informazioni",
|
|
311
|
+
"description": "Descrizione della pagina Informazioni",
|
|
312
|
+
"counter": {
|
|
313
|
+
"label": "Contatore",
|
|
314
|
+
"increment": "Incrementa"
|
|
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
|
+
Componente client (carica solo il namespace richiesto):
|
|
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
|
+
> Assicurati che la pagina/provider includa solo i namespace di cui hai bisogno (es. `about`).
|
|
361
|
+
> Se usi React < 19, memorizza in cache formatter pesanti come `Intl.NumberFormat`.
|
|
362
|
+
|
|
363
|
+
Componente server sincrono incorporato sotto un confine 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: Metadata, Hreflang, Sitemap, Robots
|
|
389
|
+
|
|
390
|
+
La traduzione dei contenuti è un mezzo per migliorare la portata. Configura accuratamente la SEO multilingue.
|
|
391
|
+
|
|
392
|
+
Best practice:
|
|
393
|
+
|
|
394
|
+
- Imposta `lang` e `dir` alla radice
|
|
395
|
+
- Aggiungi `alternates.languages` per ogni locale (+ `x-default`)
|
|
396
|
+
- Elenca gli URL tradotti in `sitemap.xml` e usa `hreflang`
|
|
397
|
+
- Escludi aree private localizzate (es. `/fr/admin`) in `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
|
+
// Importa il bundle JSON corretto da 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>About</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 per il routing della locale
|
|
484
|
+
|
|
485
|
+
Rileva la locale e reindirizza a un percorso localizzato se mancante.
|
|
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 = /\.[^/]+$/; // esclude i file con estensioni
|
|
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
|
+
// Corrisponde a tutti i percorsi tranne quelli che iniziano con questi e i file con un'estensione
|
|
520
|
+
"/((?!api|_next|static|.*\\..*).*)",
|
|
521
|
+
],
|
|
522
|
+
};
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
## 10) Performance e best practice per DX
|
|
528
|
+
|
|
529
|
+
- **Imposta `lang` e `dir` nell'html**: Fatto in `src/app/[locale]/layout.tsx`.
|
|
530
|
+
- **Dividi i messaggi per namespace**: Mantieni i bundle piccoli (`common.json`, `about.json`, ecc.).
|
|
531
|
+
- **Minimizza il payload client**: Nelle pagine, passa solo i namespace necessari al provider.
|
|
532
|
+
- **Preferisci pagine statiche**: Usa `export const dynamic = 'force-static'` e `generateStaticParams` per ogni locale.
|
|
533
|
+
- **Sincronizza i componenti server**: Passa stringhe/formatting precomputati invece di chiamate async al momento del render.
|
|
534
|
+
- **Memoizza operazioni pesanti**: Specialmente nel codice client per versioni più vecchie di React.
|
|
535
|
+
- **Cache e headers**: Preferisci rendering statico o `revalidate` rispetto a rendering dinamico quando possibile.
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
## 11) Testing e CI
|
|
540
|
+
|
|
541
|
+
- Aggiungi test unitari per i componenti che usano `t` per assicurarti che le chiavi esistano.
|
|
542
|
+
- Verifica che ogni namespace abbia le stesse chiavi tra le diverse localizzazioni.
|
|
543
|
+
- Rileva le chiavi mancanti durante la CI prima del deploy.
|
|
544
|
+
|
|
545
|
+
Intlayer automatizzerà gran parte di questo (vedi sezione successiva).
|
|
546
|
+
|
|
547
|
+
---
|
|
548
|
+
|
|
549
|
+
## 12) Aggiungere Intlayer sopra (automazione)
|
|
550
|
+
|
|
551
|
+
Intlayer ti aiuta a mantenere sincronizzate le traduzioni JSON, testare le chiavi mancanti e completare con AI quando desiderato.
|
|
552
|
+
|
|
553
|
+
Installa le dipendenze di 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
|
+
Aggiungi gli script nel 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
|
+
Flussi comuni:
|
|
604
|
+
|
|
605
|
+
- `pnpm i18n:test` in CI per far fallire le build in caso di chiavi mancanti
|
|
606
|
+
- `pnpm i18n:fill` in locale per proporre traduzioni AI per le chiavi appena aggiunte
|
|
607
|
+
|
|
608
|
+
> Puoi fornire argomenti CLI; consulta la [documentazione CLI di Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_cli.md).
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## 13) Risoluzione dei problemi
|
|
613
|
+
|
|
614
|
+
- **Chiavi non trovate**: Assicurati che la pagina/provider elenchi i namespace corretti e che il file JSON esista sotto `src/locales/<locale>/<namespace>.json`.
|
|
615
|
+
- **Lingua errata/flash di inglese**: Controlla due volte il rilevamento della locale in `middleware.ts` e il provider `lng`.
|
|
616
|
+
- **Problemi di layout RTL**: Verifica che `dir` derivi da `isRtl(locale)` e che il tuo CSS rispetti `[dir="rtl"]`.
|
|
617
|
+
- **Mancanza di alternate SEO**: Conferma che `alternates.languages` includa tutte le localizzazioni e `x-default`.
|
|
618
|
+
- **Bundle troppo grandi**: Suddividi ulteriormente i namespace ed evita di importare interi alberi `locales` sul client.
|
|
619
|
+
|
|
620
|
+
---
|
|
621
|
+
|
|
622
|
+
## 14) Cosa c’è dopo
|
|
623
|
+
|
|
624
|
+
- Aggiungi più localizzazioni e namespace man mano che le funzionalità crescono
|
|
625
|
+
- Localizza pagine di errore, email e contenuti generati da API
|
|
626
|
+
- Estendi i workflow di Intlayer per aprire automaticamente PR per aggiornamenti di traduzione
|
|
627
|
+
|
|
628
|
+
Se preferisci un punto di partenza, prova il template: `https://github.com/aymericzip/intlayer-next-i18next-template`.
|