@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
|
@@ -135,7 +135,7 @@ import { t } from "next-intlayer/server";
|
|
|
135
135
|
const ServerComponentExample = () => (
|
|
136
136
|
<p>
|
|
137
137
|
{t({
|
|
138
|
-
en-GB: "This is the content of a server component example",
|
|
138
|
+
"en-GB": "This is the content of a server component example",
|
|
139
139
|
en: "This is the content of a server component example",
|
|
140
140
|
fr: "Ceci est le contenu d'un exemple de composant serveur",
|
|
141
141
|
es: "Este es el contenido de un ejemplo de componente servidor",
|
|
@@ -150,7 +150,7 @@ const { t } = require("next-intlayer/server");
|
|
|
150
150
|
const ServerComponentExample = () => (
|
|
151
151
|
<p>
|
|
152
152
|
{t({
|
|
153
|
-
en-GB: "This is the content of a server component example",
|
|
153
|
+
"en-GB": "This is the content of a server component example",
|
|
154
154
|
en: "This is the content of a server component example",
|
|
155
155
|
fr: "Ceci est le contenu d'un exemple de composant serveur",
|
|
156
156
|
es: "Este es el contenido de un ejemplo de componente servidor",
|
|
@@ -179,4 +179,4 @@ Consejo: Para metadatos de página y SEO, también puedes obtener contenido con
|
|
|
179
179
|
- React Router v7: https://intlayer.org/doc/environment/vite-and-react/react-router-v7
|
|
180
180
|
- TanStack Start: https://intlayer.org/doc/environment/vite-and-react/tanstack-start
|
|
181
181
|
- Configuración Next.js: https://intlayer.org/doc/environment/nextjs
|
|
182
|
-
- Por qué Intlayer vs. next-intl vs. next-i18next
|
|
182
|
+
- Por qué Intlayer vs. next-intl vs. next-i18next - https://intlayer.org/blog/next-i18next-vs-next-intl-vs-intlayer
|
package/docs/es/configuration.md
CHANGED
|
@@ -39,6 +39,12 @@ Los archivos de configuración de Intlayer permiten la personalización de vario
|
|
|
39
39
|
|
|
40
40
|
---
|
|
41
41
|
|
|
42
|
+
## Tabla de Contenidos
|
|
43
|
+
|
|
44
|
+
<TOC/>
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
42
48
|
## Soporte de Archivos de Configuración
|
|
43
49
|
|
|
44
50
|
Intlayer acepta formatos de archivo de configuración JSON, JS, MJS y TS:
|
package/docs/es/intlayer_cli.md
CHANGED
|
@@ -27,6 +27,14 @@ history:
|
|
|
27
27
|
|
|
28
28
|
# Intlayer CLI
|
|
29
29
|
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Índice
|
|
33
|
+
|
|
34
|
+
<TOC/>
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
30
38
|
## Instalar Paquete
|
|
31
39
|
|
|
32
40
|
Instala los paquetes necesarios usando npm:
|
|
@@ -372,7 +380,6 @@ npx intlayer doc translate
|
|
|
372
380
|
> Ejemplo: `npx intlayer doc translate --excluded-glob-pattern "docs/internal/**"`
|
|
373
381
|
|
|
374
382
|
- **`--skip-if-modified-before [skipIfModifiedBefore]`**: Omitir el archivo si ha sido modificado antes del tiempo dado.
|
|
375
|
-
|
|
376
383
|
- Puede ser un tiempo absoluto como "2025-12-05" (cadena o Date)
|
|
377
384
|
- Puede ser un tiempo relativo en ms `1 * 60 * 60 * 1000` (1 hora)
|
|
378
385
|
- Esta opción verifica la hora de actualización del archivo usando el método `fs.stat`. Por lo tanto, podría verse afectada por Git u otras herramientas que modifiquen el archivo.
|
|
@@ -380,7 +387,6 @@ npx intlayer doc translate
|
|
|
380
387
|
> Ejemplo: `npx intlayer doc translate --skip-if-modified-before "2025-12-05"`
|
|
381
388
|
|
|
382
389
|
- **`--skip-if-modified-after [skipIfModifiedAfter]`**: Omitir el archivo si ha sido modificado dentro del tiempo dado.
|
|
383
|
-
|
|
384
390
|
- Puede ser una hora absoluta como "2025-12-05" (cadena o Date)
|
|
385
391
|
- Puede ser una hora relativa en ms `1 * 60 * 60 * 1000` (1 hora)
|
|
386
392
|
- Esta opción verifica la hora de actualización del archivo usando el método `fs.stat`. Por lo tanto, podría verse afectada por Git u otras herramientas que modifiquen el archivo.
|
|
@@ -431,7 +437,6 @@ npx intlayer doc translate
|
|
|
431
437
|
**Opciones de instrucciones personalizadas:**
|
|
432
438
|
|
|
433
439
|
- **`--custom-instructions [customInstructions]`**: Instrucciones personalizadas añadidas al prompt. Útil para aplicar reglas específicas respecto al formato, traducción de URLs, etc.
|
|
434
|
-
|
|
435
440
|
- Puede ser un tiempo absoluto como "2025-12-05" (cadena o Date)
|
|
436
441
|
- Puede ser un tiempo relativo en ms `1 * 60 * 60 * 1000` (1 hora)
|
|
437
442
|
- Esta opción verifica la hora de actualización del archivo usando el método `fs.stat`. Por lo tanto, podría verse afectada por Git u otras herramientas que modifiquen el archivo.
|
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-10-05
|
|
3
|
+
updatedAt: 2025-10-05
|
|
4
|
+
title: Cómo traducir tu Next.js 15 usando next-i18next – guía i18n 2025
|
|
5
|
+
description: Una guía práctica y lista para producción para internacionalizar una app Next.js 15 App Router con i18next/next-i18next y mejorarla con Intlayer.
|
|
6
|
+
keywords:
|
|
7
|
+
- Internacionalización
|
|
8
|
+
- Documentación
|
|
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
|
+
# Traduce tu sitio web Next.js 15 usando next-i18next con Intlayer | Internacionalización (i18n)
|
|
22
|
+
|
|
23
|
+
### Para quién es esta guía
|
|
24
|
+
|
|
25
|
+
- **Junior**: Sigue los pasos exactos y copia los bloques de código. Obtendrás una app multilingüe funcional.
|
|
26
|
+
- **Intermedio**: Usa las listas de verificación y las recomendaciones de buenas prácticas para evitar errores comunes.
|
|
27
|
+
- **Senior**: Revisa la estructura general, las secciones de SEO y automatización; encontrarás configuraciones predeterminadas sensatas y puntos de extensión.
|
|
28
|
+
|
|
29
|
+
### Lo que construirás
|
|
30
|
+
|
|
31
|
+
- Proyecto App Router con rutas localizadas (por ejemplo, `/`, `/fr/...`)
|
|
32
|
+
- Configuración i18n con locales, locale por defecto, soporte RTL
|
|
33
|
+
- Inicialización i18n del lado servidor y un proveedor para el cliente
|
|
34
|
+
- Traducciones con namespaces cargadas bajo demanda
|
|
35
|
+
- SEO con `hreflang`, `sitemap` localizado, `robots`
|
|
36
|
+
- Middleware para enrutamiento por locale
|
|
37
|
+
- Integración con Intlayer para automatizar flujos de trabajo de traducción (tests, relleno con IA, sincronización JSON)
|
|
38
|
+
|
|
39
|
+
> Nota: next-i18next está construido sobre i18next. Esta guía utiliza las primitivas de i18next compatibles con next-i18next en el App Router, manteniendo la arquitectura simple y lista para producción.
|
|
40
|
+
> Para una comparación más amplia, consulta [next-i18next vs next-i18next vs Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/es/next-i18next_vs_next-i18next_vs_intlayer.md).
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 1) Estructura del proyecto
|
|
45
|
+
|
|
46
|
+
Instala las dependencias de 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
|
+
Comienza con una estructura clara. Mantén los mensajes divididos por locale y 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
|
+
Lista de verificación (mid/senior):
|
|
86
|
+
|
|
87
|
+
- Mantén un JSON por namespace por locale
|
|
88
|
+
- No sobrecentralices los mensajes; usa namespaces pequeños, específicos por página o funcionalidad
|
|
89
|
+
- Evita importar todos los locales a la vez; carga solo lo que necesites
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 2) Instalar dependencias
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
bash
|
|
97
|
+
pnpm add i18next react-i18next i18next-resources-to-backend
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Si planeas usar las APIs de next-i18next o interoperabilidad de configuración, también:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
pnpm add next-i18next
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 3) Configuración principal de i18n
|
|
109
|
+
|
|
110
|
+
Define los locales, el locale por defecto, RTL y helpers para rutas/URLs localizadas.
|
|
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 importante: Si usas `next-i18next.config.js`, mantenlo alineado con `i18n.config.ts` para evitar desincronizaciones.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 4) Inicialización de i18n del lado servidor
|
|
137
|
+
|
|
138
|
+
Inicializa i18next en el servidor con un backend dinámico que importa solo el JSON necesario del locale/namespace.
|
|
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
|
+
// Carga recursos JSON desde 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: Mantén la lista de namespaces corta por página para limitar la carga. Evita paquetes globales “catch-all”.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 5) Proveedor cliente para componentes React
|
|
177
|
+
|
|
178
|
+
Envuelve los componentes cliente con un proveedor que refleja la configuración del servidor y carga solo los namespaces solicitados.
|
|
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: paquete }
|
|
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
|
+
Consejo para principiantes: No necesitas pasar todos los mensajes al cliente. Comienza solo con los namespaces de la página.
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 6) Diseño y rutas localizadas
|
|
235
|
+
|
|
236
|
+
Configura el idioma y la dirección, y pre-genera rutas por locale para favorecer el renderizado estático.
|
|
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) Página de ejemplo con uso en servidor + cliente
|
|
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
|
+
// Forzar renderizado estático para la página
|
|
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
|
+
Traducciones (un JSON por namespace bajo `src/locales/...`):
|
|
307
|
+
|
|
308
|
+
```json fileName="src/locales/es/about.json"
|
|
309
|
+
{
|
|
310
|
+
"title": "Acerca de",
|
|
311
|
+
"description": "Descripción de la página Acerca de",
|
|
312
|
+
"counter": {
|
|
313
|
+
"label": "Contador",
|
|
314
|
+
"increment": "Incrementar"
|
|
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 cliente (carga solo el namespace requerido):
|
|
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
|
+
> Asegúrate de que la página/provider incluya solo los namespaces que necesitas (por ejemplo, `about`).
|
|
361
|
+
> Si usas React < 19, memoiza los formateadores pesados como `Intl.NumberFormat`.
|
|
362
|
+
|
|
363
|
+
Componente de servidor síncrono embebido bajo un límite de cliente:
|
|
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: Metadatos, Hreflang, Sitemap, Robots
|
|
389
|
+
|
|
390
|
+
Traducir contenido es un medio para mejorar el alcance. Configura el SEO multilingüe de manera exhaustiva.
|
|
391
|
+
|
|
392
|
+
Buenas prácticas:
|
|
393
|
+
|
|
394
|
+
- Establece `lang` y `dir` en la raíz
|
|
395
|
+
- Añade `alternates.languages` para cada locale (+ `x-default`)
|
|
396
|
+
- Lista las URLs traducidas en `sitemap.xml` y usa `hreflang`
|
|
397
|
+
- Excluye áreas privadas localizadas (ej., `/fr/admin`) en `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 el paquete JSON correcto desde 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>Acerca de</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 para el enrutamiento de locales
|
|
484
|
+
|
|
485
|
+
Detecta la locale y redirige a una ruta localizada si falta.
|
|
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 = /\.[^/]+$/; // excluir archivos con extensiones
|
|
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
|
+
// Coincidir con todas las rutas excepto las que comienzan con estas y archivos con extensión
|
|
520
|
+
"/((?!api|_next|static|.*\\..*).*)",
|
|
521
|
+
],
|
|
522
|
+
};
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
## 10) Buenas prácticas de rendimiento y experiencia de desarrollo (DX)
|
|
528
|
+
|
|
529
|
+
- **Configurar `lang` y `dir` en html**: Hecho en `src/app/[locale]/layout.tsx`.
|
|
530
|
+
- **Dividir mensajes por namespace**: Mantener los bundles pequeños (`common.json`, `about.json`, etc.).
|
|
531
|
+
- **Minimizar la carga en el cliente**: En las páginas, pasar solo los namespaces requeridos al provider.
|
|
532
|
+
- **Preferir páginas estáticas**: Usar `export const dynamic = 'force-static'` y `generateStaticParams` por locale.
|
|
533
|
+
- **Sincronizar componentes del servidor**: Pasar cadenas/formateos precomputados en lugar de llamadas asíncronas en tiempo de renderizado.
|
|
534
|
+
- **Memoizar operaciones pesadas**: Especialmente en código cliente para versiones antiguas de React.
|
|
535
|
+
- **Cache y headers**: Preferir estático o `revalidate` sobre renderizado dinámico cuando sea posible.
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
## 11) Testing y CI
|
|
540
|
+
|
|
541
|
+
- Añadir tests unitarios para componentes que usan `t` para asegurar que las keys existen.
|
|
542
|
+
- Validar que cada namespace tenga las mismas claves en todas las locales.
|
|
543
|
+
- Mostrar las claves faltantes durante la CI antes del despliegue.
|
|
544
|
+
|
|
545
|
+
Intlayer automatizará gran parte de esto (ver la siguiente sección).
|
|
546
|
+
|
|
547
|
+
---
|
|
548
|
+
|
|
549
|
+
## 12) Añadir Intlayer encima (automatización)
|
|
550
|
+
|
|
551
|
+
Intlayer te ayuda a mantener las traducciones JSON sincronizadas, probar las claves faltantes y completarlas con IA cuando se desee.
|
|
552
|
+
|
|
553
|
+
Instala las dependencias de 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
|
+
Agregar scripts al 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
|
+
Flujos comunes:
|
|
604
|
+
|
|
605
|
+
- `pnpm i18n:test` en CI para fallar la compilación si faltan keys
|
|
606
|
+
- `pnpm i18n:fill` localmente para proponer traducciones con IA para keys recién añadidas
|
|
607
|
+
|
|
608
|
+
> Puedes proporcionar argumentos CLI; consulta la [documentación CLI de Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_cli.md).
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## 13) Solución de problemas
|
|
613
|
+
|
|
614
|
+
- **Claves no encontradas**: Asegúrate de que la página/proveedor liste los namespaces correctos y que el archivo JSON exista en `src/locales/<locale>/<namespace>.json`.
|
|
615
|
+
- **Idioma incorrecto/destello de inglés**: Verifica dos veces la detección de locale en `middleware.ts` y el `lng` del proveedor.
|
|
616
|
+
- **Problemas con diseño RTL**: Confirma que `dir` se derive de `isRtl(locale)` y que tu CSS respete `[dir="rtl"]`.
|
|
617
|
+
- **Faltan alternativos SEO**: Confirma que `alternates.languages` incluya todos los locales y `x-default`.
|
|
618
|
+
- **Bundles demasiado grandes**: Divide aún más los namespaces y evita importar árboles completos de `locales` en el cliente.
|
|
619
|
+
|
|
620
|
+
---
|
|
621
|
+
|
|
622
|
+
## 14) Qué sigue
|
|
623
|
+
|
|
624
|
+
- Añade más locales y namespaces a medida que crecen las funcionalidades
|
|
625
|
+
- Localiza páginas de error, correos electrónicos y contenido impulsado por API
|
|
626
|
+
- Extiende los flujos de trabajo de Intlayer para abrir automáticamente PRs para actualizaciones de traducción
|
|
627
|
+
|
|
628
|
+
Si prefieres un starter, prueba la plantilla: `https://github.com/aymericzip/intlayer-next-i18next-template`.
|