@intlayer/docs 5.5.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/LICENSE +202 -0
- package/ar/CI_CD.md +149 -0
- package/ar/autoFill.md +157 -0
- package/ar/concept/content/file.md +1 -0
- package/ar/configuration.md +492 -0
- package/ar/dictionary/condition.md +213 -0
- package/ar/dictionary/content_extention_customization.md +81 -0
- package/ar/dictionary/enumeration.md +221 -0
- package/ar/dictionary/file.md +209 -0
- package/ar/dictionary/function_fetching.md +190 -0
- package/ar/dictionary/get_started.md +490 -0
- package/ar/dictionary/insertion.md +161 -0
- package/ar/dictionary/markdown.md +343 -0
- package/ar/dictionary/nesting.md +249 -0
- package/ar/dictionary/translation.md +307 -0
- package/ar/header.md +7 -0
- package/ar/how_works_intlayer.md +219 -0
- package/ar/index.md +125 -0
- package/ar/interest_of_intlayer.md +132 -0
- package/ar/intlayer_CMS.md +328 -0
- package/ar/intlayer_cli.md +258 -0
- package/ar/intlayer_visual_editor.md +210 -0
- package/ar/intlayer_with_angular.md +3 -0
- package/ar/intlayer_with_create_react_app.md +1196 -0
- package/ar/intlayer_with_express.md +270 -0
- package/ar/intlayer_with_lynx+react.md +482 -0
- package/ar/intlayer_with_nextjs_14.md +1260 -0
- package/ar/intlayer_with_nextjs_15.md +1311 -0
- package/ar/intlayer_with_nextjs_page_router.md +1099 -0
- package/ar/intlayer_with_react_native+expo.md +539 -0
- package/ar/intlayer_with_vite+preact.md +1679 -0
- package/ar/intlayer_with_vite+react.md +1582 -0
- package/ar/intlayer_with_vite+solid.md +3 -0
- package/ar/intlayer_with_vite+svelte.md +3 -0
- package/ar/intlayer_with_vite+vue.md +989 -0
- package/ar/introduction.md +190 -0
- package/ar/mcp_server.md +150 -0
- package/ar/packages/@intlayer/api/index.md +31 -0
- package/ar/packages/@intlayer/chokidar/index.md +31 -0
- package/ar/packages/@intlayer/cli/index.md +1 -0
- package/ar/packages/@intlayer/config/index.md +116 -0
- package/ar/packages/@intlayer/core/index.md +25 -0
- package/ar/packages/@intlayer/design-system/index.md +21 -0
- package/ar/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/ar/packages/@intlayer/editor/index.md +21 -0
- package/ar/packages/@intlayer/editor-react/index.md +21 -0
- package/ar/packages/@intlayer/webpack/index.md +35 -0
- package/ar/packages/angular-intlayer/index.md +3 -0
- package/ar/packages/express-intlayer/index.md +232 -0
- package/ar/packages/express-intlayer/t.md +448 -0
- package/ar/packages/intlayer/getConfiguration.md +120 -0
- package/ar/packages/intlayer/getEnumeration.md +138 -0
- package/ar/packages/intlayer/getHTMLTextDir.md +97 -0
- package/ar/packages/intlayer/getLocaleLang.md +61 -0
- package/ar/packages/intlayer/getLocaleName.md +93 -0
- package/ar/packages/intlayer/getLocalizedUrl.md +221 -0
- package/ar/packages/intlayer/getMultilingualUrls.md +198 -0
- package/ar/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/ar/packages/intlayer/getTranslation.md +175 -0
- package/ar/packages/intlayer/getTranslationContent.md +175 -0
- package/ar/packages/intlayer/index.md +254 -0
- package/ar/packages/intlayer-cli/index.md +41 -0
- package/ar/packages/intlayer-editor/index.md +113 -0
- package/ar/packages/lynx-intlayer/index.md +58 -0
- package/ar/packages/next-intlayer/index.md +267 -0
- package/ar/packages/next-intlayer/t.md +341 -0
- package/ar/packages/next-intlayer/useDictionary.md +248 -0
- package/ar/packages/next-intlayer/useIntlayer.md +237 -0
- package/ar/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/ar/packages/next-intlayer/useLocale.md +105 -0
- package/ar/packages/preact-intlayer/index.md +3 -0
- package/ar/packages/react-intlayer/index.md +261 -0
- package/ar/packages/react-intlayer/t.md +283 -0
- package/ar/packages/react-intlayer/useDictionary.md +268 -0
- package/ar/packages/react-intlayer/useIntlayer.md +225 -0
- package/ar/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/ar/packages/react-intlayer/useLocale.md +184 -0
- package/ar/packages/react-native-intlayer/index.md +57 -0
- package/ar/packages/react-scripts-intlayer/index.md +57 -0
- package/ar/packages/solid-intlayer/index.md +3 -0
- package/ar/packages/svelte-intlayer/index.md +3 -0
- package/ar/packages/vite-intlayer/index.md +53 -0
- package/ar/packages/vue-intlayer/index.md +3 -0
- package/ar/per_locale_file.md +298 -0
- package/ar/privacy_notice.md +61 -0
- package/ar/roadmap.md +208 -0
- package/ar/terms_of_service.md +33 -0
- package/ar/vs_code_extension.md +139 -0
- package/de/CI_CD.md +149 -0
- package/de/angular-intlayer/index.md +3 -0
- package/de/autoFill.md +157 -0
- package/de/configuration.md +501 -0
- package/de/dictionary/condition.md +213 -0
- package/de/dictionary/content_extention_customization.md +81 -0
- package/de/dictionary/enumeration.md +221 -0
- package/de/dictionary/file.md +207 -0
- package/de/dictionary/function_fetching.md +190 -0
- package/de/dictionary/get_started.md +466 -0
- package/de/dictionary/insertion.md +167 -0
- package/de/dictionary/markdown.md +345 -0
- package/de/dictionary/nesting.md +252 -0
- package/de/dictionary/translation.md +287 -0
- package/de/header.md +5 -0
- package/de/how_works_intlayer.md +216 -0
- package/de/index.md +125 -0
- package/de/insertion.md +0 -0
- package/de/interest_of_intlayer.md +132 -0
- package/de/intlayer_CMS.md +334 -0
- package/de/intlayer_cli.md +274 -0
- package/de/intlayer_visual_editor.md +210 -0
- package/de/intlayer_with_angular.md +3 -0
- package/de/intlayer_with_create_react_app.md +1200 -0
- package/de/intlayer_with_express.md +268 -0
- package/de/intlayer_with_lynx+react.md +482 -0
- package/de/intlayer_with_nextjs_14.md +1258 -0
- package/de/intlayer_with_nextjs_15.md +1306 -0
- package/de/intlayer_with_nextjs_page_router.md +1087 -0
- package/de/intlayer_with_react_native+expo.md +539 -0
- package/de/intlayer_with_vite+preact.md +1701 -0
- package/de/intlayer_with_vite+react.md +1584 -0
- package/de/intlayer_with_vite+solid.md +3 -0
- package/de/intlayer_with_vite+svelte.md +3 -0
- package/de/intlayer_with_vite+vue.md +989 -0
- package/de/introduction.md +186 -0
- package/de/mcp_server.md +150 -0
- package/de/packages/@intlayer/api/index.md +31 -0
- package/de/packages/@intlayer/chokidar/index.md +31 -0
- package/de/packages/@intlayer/cli/index.md +21 -0
- package/de/packages/@intlayer/config/index.md +116 -0
- package/de/packages/@intlayer/core/index.md +25 -0
- package/de/packages/@intlayer/design-system/index.md +21 -0
- package/de/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/de/packages/@intlayer/editor/index.md +21 -0
- package/de/packages/@intlayer/editor-react/index.md +21 -0
- package/de/packages/@intlayer/webpack/index.md +35 -0
- package/de/packages/angular-intlayer/index.md +31 -0
- package/de/packages/express-intlayer/index.md +229 -0
- package/de/packages/express-intlayer/t.md +432 -0
- package/de/packages/intlayer/getConfiguration.md +120 -0
- package/de/packages/intlayer/getEnumeration.md +140 -0
- package/de/packages/intlayer/getHTMLTextDir.md +97 -0
- package/de/packages/intlayer/getLocaleLang.md +57 -0
- package/de/packages/intlayer/getLocaleName.md +93 -0
- package/de/packages/intlayer/getLocalizedUrl.md +221 -0
- package/de/packages/intlayer/getMultilingualUrls.md +198 -0
- package/de/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/de/packages/intlayer/getTranslation.md +166 -0
- package/de/packages/intlayer/getTranslationContent.md +166 -0
- package/de/packages/intlayer/index.md +478 -0
- package/de/packages/intlayer-cli/index.md +41 -0
- package/de/packages/intlayer-editor/index.md +113 -0
- package/de/packages/lynx-intlayer/index.md +58 -0
- package/de/packages/next-intlayer/index.md +263 -0
- package/de/packages/next-intlayer/t.md +325 -0
- package/de/packages/next-intlayer/useDictionary.md +242 -0
- package/de/packages/next-intlayer/useIntlayer.md +237 -0
- package/de/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/de/packages/next-intlayer/useLocale.md +105 -0
- package/de/packages/preact-intlayer/index.md +3 -0
- package/de/packages/react-intlayer/index.md +260 -0
- package/de/packages/react-intlayer/t.md +277 -0
- package/de/packages/react-intlayer/useDictionary.md +260 -0
- package/de/packages/react-intlayer/useIntlayer.md +225 -0
- package/de/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/de/packages/react-intlayer/useLocale.md +184 -0
- package/de/packages/react-native-intlayer/index.md +57 -0
- package/de/packages/react-scripts-intlayer/index.md +57 -0
- package/de/packages/solid-intlayer/index.md +3 -0
- package/de/packages/svelte-intlayer/index.md +3 -0
- package/de/packages/vite-intlayer/index.md +53 -0
- package/de/packages/vue-intlayer/index.md +3 -0
- package/de/per_locale_file.md +298 -0
- package/de/privacy_notice.md +61 -0
- package/de/roadmap.md +206 -0
- package/de/terms_of_service.md +33 -0
- package/de/vs_code_extension.md +139 -0
- package/en/CI_CD.md +149 -0
- package/en/autoFill.md +157 -0
- package/en/configuration.md +506 -0
- package/en/dictionary/condition.md +213 -0
- package/en/dictionary/content_extention_customization.md +81 -0
- package/en/dictionary/enumeration.md +221 -0
- package/en/dictionary/file.md +198 -0
- package/en/dictionary/function_fetching.md +190 -0
- package/en/dictionary/get_started.md +504 -0
- package/en/dictionary/insertion.md +167 -0
- package/en/dictionary/markdown.md +355 -0
- package/en/dictionary/nesting.md +249 -0
- package/en/dictionary/translation.md +285 -0
- package/en/frequent_questions/build_dictionaries.md +37 -0
- package/en/frequent_questions/domain_routing.md +92 -0
- package/en/frequent_questions/esbuild_error.md +9 -0
- package/en/frequent_questions/get_locale_cookie.md +121 -0
- package/en/frequent_questions/intlayer_command_undefined.md +135 -0
- package/en/frequent_questions/locale_incorect_in_url.md +52 -0
- package/en/frequent_questions/static_rendering.md +24 -0
- package/en/frequent_questions/unknown_command.md +76 -0
- package/en/header.md +5 -0
- package/en/how_works_intlayer.md +219 -0
- package/en/index.md +139 -0
- package/en/interest_of_intlayer.md +133 -0
- package/en/intlayer_CMS.md +334 -0
- package/en/intlayer_cli.md +309 -0
- package/en/intlayer_visual_editor.md +244 -0
- package/en/intlayer_with_angular.md +139 -0
- package/en/intlayer_with_create_react_app.md +1209 -0
- package/en/intlayer_with_express.md +391 -0
- package/en/intlayer_with_lynx+react.md +483 -0
- package/en/intlayer_with_nextjs_14.md +1298 -0
- package/en/intlayer_with_nextjs_15.md +1347 -0
- package/en/intlayer_with_nextjs_page_router.md +1126 -0
- package/en/intlayer_with_react_native+expo.md +630 -0
- package/en/intlayer_with_vite+preact.md +1659 -0
- package/en/intlayer_with_vite+react.md +1605 -0
- package/en/intlayer_with_vite+solid.md +254 -0
- package/en/intlayer_with_vite+svelte.md +254 -0
- package/en/intlayer_with_vite+vue.md +1000 -0
- package/en/introduction.md +185 -0
- package/en/mcp_server.md +150 -0
- package/en/packages/@intlayer/api/index.md +31 -0
- package/en/packages/@intlayer/chokidar/index.md +31 -0
- package/en/packages/@intlayer/cli/index.md +21 -0
- package/en/packages/@intlayer/config/index.md +116 -0
- package/en/packages/@intlayer/core/index.md +25 -0
- package/en/packages/@intlayer/design-system/index.md +21 -0
- package/en/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/en/packages/@intlayer/editor/index.md +21 -0
- package/en/packages/@intlayer/editor-react/index.md +21 -0
- package/en/packages/@intlayer/webpack/index.md +35 -0
- package/en/packages/angular-intlayer/index.md +31 -0
- package/en/packages/express-intlayer/index.md +229 -0
- package/en/packages/express-intlayer/t.md +432 -0
- package/en/packages/intlayer/getConfiguration.md +120 -0
- package/en/packages/intlayer/getEnumeration.md +138 -0
- package/en/packages/intlayer/getHTMLTextDir.md +97 -0
- package/en/packages/intlayer/getLocaleLang.md +57 -0
- package/en/packages/intlayer/getLocaleName.md +93 -0
- package/en/packages/intlayer/getLocalizedUrl.md +221 -0
- package/en/packages/intlayer/getMultilingualUrls.md +198 -0
- package/en/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/en/packages/intlayer/getTranslation.md +166 -0
- package/en/packages/intlayer/getTranslationContent.md +166 -0
- package/en/packages/intlayer/index.md +476 -0
- package/en/packages/intlayer-cli/index.md +41 -0
- package/en/packages/intlayer-editor/index.md +113 -0
- package/en/packages/lynx-intlayer/index.md +60 -0
- package/en/packages/next-intlayer/index.md +263 -0
- package/en/packages/next-intlayer/t.md +326 -0
- package/en/packages/next-intlayer/useDictionary.md +242 -0
- package/en/packages/next-intlayer/useIntlayer.md +237 -0
- package/en/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/en/packages/next-intlayer/useLocale.md +105 -0
- package/en/packages/preact-intlayer/index.md +31 -0
- package/en/packages/react-intlayer/index.md +257 -0
- package/en/packages/react-intlayer/t.md +277 -0
- package/en/packages/react-intlayer/useDictionary.md +260 -0
- package/en/packages/react-intlayer/useIntlayer.md +225 -0
- package/en/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/en/packages/react-intlayer/useLocale.md +184 -0
- package/en/packages/react-native-intlayer/index.md +59 -0
- package/en/packages/react-scripts-intlayer/index.md +57 -0
- package/en/packages/solid-intlayer/index.md +31 -0
- package/en/packages/svelte-intlayer/index.md +31 -0
- package/en/packages/vite-intlayer/index.md +53 -0
- package/en/packages/vue-intlayer/index.md +31 -0
- package/en/per_locale_file.md +297 -0
- package/en/privacy_notice.md +61 -0
- package/en/roadmap.md +270 -0
- package/en/t.md +163 -0
- package/en/terms_of_service.md +33 -0
- package/en/vs_code_extension.md +129 -0
- package/en-GB/CI_CD.md +149 -0
- package/en-GB/autoFill.md +0 -0
- package/en-GB/configuration.md +490 -0
- package/en-GB/dictionary/condition.md +213 -0
- package/en-GB/dictionary/content_extention_customization.md +83 -0
- package/en-GB/dictionary/enumeration.md +221 -0
- package/en-GB/dictionary/file.md +201 -0
- package/en-GB/dictionary/function_fetching.md +190 -0
- package/en-GB/dictionary/get_started.md +466 -0
- package/en-GB/dictionary/insertion.md +167 -0
- package/en-GB/dictionary/markdown.md +343 -0
- package/en-GB/dictionary/nesting.md +249 -0
- package/en-GB/dictionary/translation.md +285 -0
- package/en-GB/header.md +1 -0
- package/en-GB/how_works_intlayer.md +217 -0
- package/en-GB/index.md +142 -0
- package/en-GB/interest_of_intlayer.md +123 -0
- package/en-GB/intlayer_CMS.md +334 -0
- package/en-GB/intlayer_cli.md +239 -0
- package/en-GB/intlayer_visual_editor.md +210 -0
- package/en-GB/intlayer_with_angular.md +3 -0
- package/en-GB/intlayer_with_create_react_app.md +1192 -0
- package/en-GB/intlayer_with_express.md +267 -0
- package/en-GB/intlayer_with_lynx+react.md +484 -0
- package/en-GB/intlayer_with_nextjs_14.md +1267 -0
- package/en-GB/intlayer_with_nextjs_15.md +1308 -0
- package/en-GB/intlayer_with_nextjs_page_router.md +1087 -0
- package/en-GB/intlayer_with_react_native+expo.md +539 -0
- package/en-GB/intlayer_with_vite+preact.md +1648 -0
- package/en-GB/intlayer_with_vite+react.md +1430 -0
- package/en-GB/intlayer_with_vite+solid.md +3 -0
- package/en-GB/intlayer_with_vite+svelte.md +3 -0
- package/en-GB/intlayer_with_vite+vue.md +993 -0
- package/en-GB/introduction.md +201 -0
- package/en-GB/mcp_server.md +150 -0
- package/en-GB/packages/@intlayer/api/index.md +31 -0
- package/en-GB/packages/@intlayer/chokidar/index.md +31 -0
- package/en-GB/packages/@intlayer/cli/index.md +21 -0
- package/en-GB/packages/@intlayer/config/index.md +116 -0
- package/en-GB/packages/@intlayer/core/index.md +25 -0
- package/en-GB/packages/@intlayer/design-system/index.md +21 -0
- package/en-GB/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/en-GB/packages/@intlayer/editor/index.md +21 -0
- package/en-GB/packages/@intlayer/editor-react/index.md +21 -0
- package/en-GB/packages/@intlayer/webpack/index.md +35 -0
- package/en-GB/packages/angular-intlayer/index.md +3 -0
- package/en-GB/packages/express-intlayer/index.md +229 -0
- package/en-GB/packages/express-intlayer/t.md +432 -0
- package/en-GB/packages/intlayer/getConfiguration.md +120 -0
- package/en-GB/packages/intlayer/getEnumeration.md +140 -0
- package/en-GB/packages/intlayer/getHTMLTextDir.md +97 -0
- package/en-GB/packages/intlayer/getLocaleLang.md +57 -0
- package/en-GB/packages/intlayer/getLocaleName.md +93 -0
- package/en-GB/packages/intlayer/getLocalizedUrl.md +221 -0
- package/en-GB/packages/intlayer/getMultilingualUrls.md +198 -0
- package/en-GB/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/en-GB/packages/intlayer/getTranslation.md +166 -0
- package/en-GB/packages/intlayer/getTranslationContent.md +166 -0
- package/en-GB/packages/intlayer/index.md +476 -0
- package/en-GB/packages/intlayer-cli/index.md +41 -0
- package/en-GB/packages/intlayer-editor/index.md +113 -0
- package/en-GB/packages/lynx-intlayer/index.md +58 -0
- package/en-GB/packages/next-intlayer/index.md +263 -0
- package/en-GB/packages/next-intlayer/t.md +326 -0
- package/en-GB/packages/next-intlayer/useDictionary.md +242 -0
- package/en-GB/packages/next-intlayer/useIntlayer.md +237 -0
- package/en-GB/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/en-GB/packages/next-intlayer/useLocale.md +105 -0
- package/en-GB/packages/preact-intlayer/index.md +3 -0
- package/en-GB/packages/react-intlayer/index.md +257 -0
- package/en-GB/packages/react-intlayer/t.md +277 -0
- package/en-GB/packages/react-intlayer/useDictionary.md +260 -0
- package/en-GB/packages/react-intlayer/useIntlayer.md +225 -0
- package/en-GB/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/en-GB/packages/react-intlayer/useLocale.md +184 -0
- package/en-GB/packages/react-native-intlayer/index.md +57 -0
- package/en-GB/packages/react-scripts-intlayer/index.md +57 -0
- package/en-GB/packages/solid-intlayer/index.md +3 -0
- package/en-GB/packages/svelte-intlayer/index.md +3 -0
- package/en-GB/packages/vite-intlayer/index.md +53 -0
- package/en-GB/packages/vue-intlayer/index.md +3 -0
- package/en-GB/per_locale_file.md +298 -0
- package/en-GB/privacy_notice.md +57 -0
- package/en-GB/roadmap.md +206 -0
- package/en-GB/terms_of_service.md +33 -0
- package/en-GB/vs_code_extension.md +139 -0
- package/es/CI_CD.md +149 -0
- package/es/autoFill.md +157 -0
- package/es/configuration.md +503 -0
- package/es/dictionary/condition.md +213 -0
- package/es/dictionary/content_extention_customization.md +81 -0
- package/es/dictionary/enumeration.md +221 -0
- package/es/dictionary/file.md +206 -0
- package/es/dictionary/function_fetching.md +190 -0
- package/es/dictionary/get_started.md +466 -0
- package/es/dictionary/insertion.md +161 -0
- package/es/dictionary/markdown.md +338 -0
- package/es/dictionary/nesting.md +249 -0
- package/es/dictionary/translation.md +287 -0
- package/es/header.md +5 -0
- package/es/how_works_intlayer.md +217 -0
- package/es/index.md +122 -0
- package/es/interest_of_intlayer.md +132 -0
- package/es/intlayer_CMS.md +334 -0
- package/es/intlayer_cli.md +274 -0
- package/es/intlayer_visual_editor.md +210 -0
- package/es/intlayer_with_angular.md +3 -0
- package/es/intlayer_with_create_react_app.md +1192 -0
- package/es/intlayer_with_express.md +276 -0
- package/es/intlayer_with_lynx+react.md +475 -0
- package/es/intlayer_with_nextjs_14.md +1258 -0
- package/es/intlayer_with_nextjs_15.md +1308 -0
- package/es/intlayer_with_nextjs_page_router.md +1088 -0
- package/es/intlayer_with_react_native+expo.md +180 -0
- package/es/intlayer_with_vite+preact.md +1637 -0
- package/es/intlayer_with_vite+react.md +1592 -0
- package/es/intlayer_with_vite+solid.md +3 -0
- package/es/intlayer_with_vite+svelte.md +3 -0
- package/es/intlayer_with_vite+vue.md +947 -0
- package/es/introduction.md +184 -0
- package/es/mcp_server.md +150 -0
- package/es/packages/@intlayer/api/index.md +31 -0
- package/es/packages/@intlayer/chokidar/index.md +31 -0
- package/es/packages/@intlayer/cli/index.md +21 -0
- package/es/packages/@intlayer/config/index.md +116 -0
- package/es/packages/@intlayer/core/index.md +25 -0
- package/es/packages/@intlayer/design-system/index.md +21 -0
- package/es/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/es/packages/@intlayer/editor/index.md +21 -0
- package/es/packages/@intlayer/editor-react/index.md +21 -0
- package/es/packages/@intlayer/webpack/index.md +35 -0
- package/es/packages/angular-intlayer/index.md +3 -0
- package/es/packages/express-intlayer/index.md +229 -0
- package/es/packages/express-intlayer/t.md +432 -0
- package/es/packages/intlayer/getConfiguration.md +120 -0
- package/es/packages/intlayer/getEnumeration.md +138 -0
- package/es/packages/intlayer/getHTMLTextDir.md +97 -0
- package/es/packages/intlayer/getLocaleLang.md +57 -0
- package/es/packages/intlayer/getLocaleName.md +93 -0
- package/es/packages/intlayer/getLocalizedUrl.md +221 -0
- package/es/packages/intlayer/getMultilingualUrls.md +198 -0
- package/es/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/es/packages/intlayer/getTranslation.md +166 -0
- package/es/packages/intlayer/getTranslationContent.md +166 -0
- package/es/packages/intlayer/index.md +478 -0
- package/es/packages/intlayer-cli/index.md +41 -0
- package/es/packages/intlayer-editor/index.md +115 -0
- package/es/packages/lynx-intlayer/index.md +58 -0
- package/es/packages/next-intlayer/index.md +263 -0
- package/es/packages/next-intlayer/t.md +325 -0
- package/es/packages/next-intlayer/useDictionary.md +242 -0
- package/es/packages/next-intlayer/useIntlayer.md +237 -0
- package/es/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/es/packages/next-intlayer/useLocale.md +105 -0
- package/es/packages/preact-intlayer/index.md +3 -0
- package/es/packages/react-intlayer/index.md +263 -0
- package/es/packages/react-intlayer/t.md +277 -0
- package/es/packages/react-intlayer/useDictionary.md +270 -0
- package/es/packages/react-intlayer/useIntlayer.md +225 -0
- package/es/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/es/packages/react-intlayer/useLocale.md +184 -0
- package/es/packages/react-native-intlayer/index.md +57 -0
- package/es/packages/react-scripts-intlayer/index.md +57 -0
- package/es/packages/solid-intlayer/index.md +3 -0
- package/es/packages/svelte-intlayer/index.md +5 -0
- package/es/packages/vite-intlayer/index.md +53 -0
- package/es/packages/vue-intlayer/index.md +3 -0
- package/es/per_locale_file.md +293 -0
- package/es/privacy_notice.md +61 -0
- package/es/roadmap.md +157 -0
- package/es/terms_of_service.md +33 -0
- package/es/vs_code_extension.md +139 -0
- package/fr/CI_CD.md +149 -0
- package/fr/autoFill.md +157 -0
- package/fr/configuration.md +481 -0
- package/fr/dictionary/condition.md +213 -0
- package/fr/dictionary/content_extention_customization.md +81 -0
- package/fr/dictionary/enumeration.md +221 -0
- package/fr/dictionary/file.md +206 -0
- package/fr/dictionary/function_fetching.md +190 -0
- package/fr/dictionary/get_started.md +466 -0
- package/fr/dictionary/insertion.md +161 -0
- package/fr/dictionary/markdown.md +335 -0
- package/fr/dictionary/nesting.md +249 -0
- package/fr/dictionary/translation.md +287 -0
- package/fr/header.md +5 -0
- package/fr/how_works_intlayer.md +217 -0
- package/fr/index.md +122 -0
- package/fr/interest_of_intlayer.md +132 -0
- package/fr/intlayer_CMS.md +334 -0
- package/fr/intlayer_cli.md +274 -0
- package/fr/intlayer_visual_editor.md +210 -0
- package/fr/intlayer_with_angular.md +3 -0
- package/fr/intlayer_with_create_react_app.md +1192 -0
- package/fr/intlayer_with_express.md +270 -0
- package/fr/intlayer_with_lynx+react.md +466 -0
- package/fr/intlayer_with_nextjs_14.md +1258 -0
- package/fr/intlayer_with_nextjs_15.md +1308 -0
- package/fr/intlayer_with_nextjs_page_router.md +1085 -0
- package/fr/intlayer_with_react_native+expo.md +535 -0
- package/fr/intlayer_with_vite+preact.md +1621 -0
- package/fr/intlayer_with_vite+react.md +1589 -0
- package/fr/intlayer_with_vite+solid.md +3 -0
- package/fr/intlayer_with_vite+svelte.md +3 -0
- package/fr/intlayer_with_vite+vue.md +947 -0
- package/fr/introduction.md +190 -0
- package/fr/mcp_server.md +152 -0
- package/fr/packages/@intlayer/api/index.md +31 -0
- package/fr/packages/@intlayer/chokidar/index.md +31 -0
- package/fr/packages/@intlayer/cli/index.md +21 -0
- package/fr/packages/@intlayer/config/index.md +116 -0
- package/fr/packages/@intlayer/core/index.md +25 -0
- package/fr/packages/@intlayer/design-system/index.md +21 -0
- package/fr/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/fr/packages/@intlayer/editor/index.md +21 -0
- package/fr/packages/@intlayer/editor-react/index.md +21 -0
- package/fr/packages/@intlayer/webpack/index.md +35 -0
- package/fr/packages/angular-intlayer/index.md +3 -0
- package/fr/packages/express-intlayer/index.md +238 -0
- package/fr/packages/express-intlayer/t.md +432 -0
- package/fr/packages/intlayer/getConfiguration.md +120 -0
- package/fr/packages/intlayer/getEnumeration.md +138 -0
- package/fr/packages/intlayer/getHTMLTextDir.md +97 -0
- package/fr/packages/intlayer/getLocaleLang.md +57 -0
- package/fr/packages/intlayer/getLocaleName.md +93 -0
- package/fr/packages/intlayer/getLocalizedUrl.md +221 -0
- package/fr/packages/intlayer/getMultilingualUrls.md +198 -0
- package/fr/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/fr/packages/intlayer/getTranslation.md +166 -0
- package/fr/packages/intlayer/getTranslationContent.md +166 -0
- package/fr/packages/intlayer/index.md +476 -0
- package/fr/packages/intlayer-cli/index.md +41 -0
- package/fr/packages/intlayer-editor/index.md +115 -0
- package/fr/packages/lynx-intlayer/index.md +58 -0
- package/fr/packages/next-intlayer/index.md +266 -0
- package/fr/packages/next-intlayer/t.md +325 -0
- package/fr/packages/next-intlayer/useDictionary.md +242 -0
- package/fr/packages/next-intlayer/useIntlayer.md +237 -0
- package/fr/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/fr/packages/next-intlayer/useLocale.md +105 -0
- package/fr/packages/preact-intlayer/index.md +3 -0
- package/fr/packages/react-intlayer/index.md +257 -0
- package/fr/packages/react-intlayer/t.md +277 -0
- package/fr/packages/react-intlayer/useDictionary.md +269 -0
- package/fr/packages/react-intlayer/useIntlayer.md +234 -0
- package/fr/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/fr/packages/react-intlayer/useLocale.md +184 -0
- package/fr/packages/react-native-intlayer/index.md +57 -0
- package/fr/packages/react-scripts-intlayer/index.md +57 -0
- package/fr/packages/solid-intlayer/index.md +3 -0
- package/fr/packages/svelte-intlayer/index.md +3 -0
- package/fr/packages/vite-intlayer/index.md +53 -0
- package/fr/packages/vue-intlayer/index.md +3 -0
- package/fr/per_locale_file.md +297 -0
- package/fr/privacy_notice.md +57 -0
- package/fr/roadmap.md +206 -0
- package/fr/terms_of_service.md +33 -0
- package/fr/vs_code_extension.md +139 -0
- package/hi/CI_CD.md +149 -0
- package/hi/autoFill.md +157 -0
- package/hi/configuration.md +509 -0
- package/hi/dictionary/condition.md +213 -0
- package/hi/dictionary/content_extention_customization.md +81 -0
- package/hi/dictionary/enumeration.md +221 -0
- package/hi/dictionary/file.md +209 -0
- package/hi/dictionary/function_fetching.md +188 -0
- package/hi/dictionary/get_started.md +490 -0
- package/hi/dictionary/insertion.md +167 -0
- package/hi/dictionary/markdown.md +344 -0
- package/hi/dictionary/nesting.md +249 -0
- package/hi/dictionary/translation.md +307 -0
- package/hi/header.md +7 -0
- package/hi/how_works_intlayer.md +217 -0
- package/hi/index.md +125 -0
- package/hi/interest_of_intlayer.md +132 -0
- package/hi/intlayer_CMS.md +334 -0
- package/hi/intlayer_cli.md +274 -0
- package/hi/intlayer_visual_editor.md +210 -0
- package/hi/intlayer_with_angular.md +3 -0
- package/hi/intlayer_with_create_react_app.md +1395 -0
- package/hi/intlayer_with_express.md +273 -0
- package/hi/intlayer_with_lynx+react.md +456 -0
- package/hi/intlayer_with_nextjs_14.md +1283 -0
- package/hi/intlayer_with_nextjs_15.md +1319 -0
- package/hi/intlayer_with_nextjs_page_router.md +1097 -0
- package/hi/intlayer_with_react_native+expo.md +554 -0
- package/hi/intlayer_with_vite+preact.md +1538 -0
- package/hi/intlayer_with_vite+react.md +1540 -0
- package/hi/intlayer_with_vite+solid.md +3 -0
- package/hi/intlayer_with_vite+svelte.md +3 -0
- package/hi/intlayer_with_vite+vue.md +840 -0
- package/hi/introduction.md +190 -0
- package/hi/mcp_server.md +150 -0
- package/hi/packages/@intlayer/api/index.md +31 -0
- package/hi/packages/@intlayer/chokidar/index.md +31 -0
- package/hi/packages/@intlayer/cli/index.md +21 -0
- package/hi/packages/@intlayer/config/index.md +116 -0
- package/hi/packages/@intlayer/core/index.md +25 -0
- package/hi/packages/@intlayer/design-system/index.md +21 -0
- package/hi/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/hi/packages/@intlayer/editor/index.md +21 -0
- package/hi/packages/@intlayer/editor-react/index.md +21 -0
- package/hi/packages/@intlayer/webpack/index.md +35 -0
- package/hi/packages/angular-intlayer/index.md +3 -0
- package/hi/packages/express-intlayer/index.md +232 -0
- package/hi/packages/express-intlayer/t.md +445 -0
- package/hi/packages/intlayer/getConfiguration.md +120 -0
- package/hi/packages/intlayer/getEnumeration.md +138 -0
- package/hi/packages/intlayer/getHTMLTextDir.md +97 -0
- package/hi/packages/intlayer/getLocaleLang.md +57 -0
- package/hi/packages/intlayer/getLocaleName.md +93 -0
- package/hi/packages/intlayer/getLocalizedUrl.md +221 -0
- package/hi/packages/intlayer/getMultilingualUrls.md +198 -0
- package/hi/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/hi/packages/intlayer/getTranslation.md +175 -0
- package/hi/packages/intlayer/getTranslationContent.md +175 -0
- package/hi/packages/intlayer/index.md +314 -0
- package/hi/packages/intlayer-cli/index.md +41 -0
- package/hi/packages/intlayer-editor/index.md +113 -0
- package/hi/packages/lynx-intlayer/index.md +58 -0
- package/hi/packages/next-intlayer/index.md +270 -0
- package/hi/packages/next-intlayer/t.md +337 -0
- package/hi/packages/next-intlayer/useDictionary.md +248 -0
- package/hi/packages/next-intlayer/useIntlayer.md +237 -0
- package/hi/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/hi/packages/next-intlayer/useLocale.md +105 -0
- package/hi/packages/preact-intlayer/index.md +3 -0
- package/hi/packages/react-intlayer/index.md +261 -0
- package/hi/packages/react-intlayer/t.md +283 -0
- package/hi/packages/react-intlayer/useDictionary.md +268 -0
- package/hi/packages/react-intlayer/useIntlayer.md +225 -0
- package/hi/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/hi/packages/react-intlayer/useLocale.md +184 -0
- package/hi/packages/react-native-intlayer/index.md +57 -0
- package/hi/packages/react-scripts-intlayer/index.md +57 -0
- package/hi/packages/solid-intlayer/index.md +3 -0
- package/hi/packages/svelte-intlayer/index.md +3 -0
- package/hi/packages/vite-intlayer/index.md +53 -0
- package/hi/packages/vue-intlayer/index.md +3 -0
- package/hi/per_locale_file.md +298 -0
- package/hi/privacy_notice.md +61 -0
- package/hi/roadmap.md +206 -0
- package/hi/terms_of_service.md +33 -0
- package/hi/vs_code_extension.md +139 -0
- package/index.cjs +1265 -0
- package/index.d.ts +100 -0
- package/it/CI_CD.md +149 -0
- package/it/autoFill.md +157 -0
- package/it/configuration.md +503 -0
- package/it/dictionary/condition.md +213 -0
- package/it/dictionary/content_extention_customization.md +81 -0
- package/it/dictionary/enumeration.md +221 -0
- package/it/dictionary/file.md +207 -0
- package/it/dictionary/function_fetching.md +190 -0
- package/it/dictionary/get_started.md +466 -0
- package/it/dictionary/insertion.md +161 -0
- package/it/dictionary/markdown.md +343 -0
- package/it/dictionary/nesting.md +249 -0
- package/it/dictionary/translation.md +287 -0
- package/it/header.md +7 -0
- package/it/how_works_intlayer.md +217 -0
- package/it/index.md +125 -0
- package/it/interest_of_intlayer.md +132 -0
- package/it/intlayer_CMS.md +334 -0
- package/it/intlayer_cli.md +274 -0
- package/it/intlayer_visual_editor.md +210 -0
- package/it/intlayer_with_angular.md +3 -0
- package/it/intlayer_with_create_react_app.md +413 -0
- package/it/intlayer_with_express.md +267 -0
- package/it/intlayer_with_lynx+react.md +482 -0
- package/it/intlayer_with_nextjs_14.md +1269 -0
- package/it/intlayer_with_nextjs_15.md +1319 -0
- package/it/intlayer_with_nextjs_page_router.md +1095 -0
- package/it/intlayer_with_react_native+expo.md +261 -0
- package/it/intlayer_with_vite+preact.md +1681 -0
- package/it/intlayer_with_vite+react.md +1580 -0
- package/it/intlayer_with_vite+solid.md +3 -0
- package/it/intlayer_with_vite+svelte.md +3 -0
- package/it/intlayer_with_vite+vue.md +989 -0
- package/it/introduction.md +192 -0
- package/it/mcp_server.md +152 -0
- package/it/packages/@intlayer/api/index.md +31 -0
- package/it/packages/@intlayer/chokidar/index.md +31 -0
- package/it/packages/@intlayer/cli/index.md +21 -0
- package/it/packages/@intlayer/config/index.md +116 -0
- package/it/packages/@intlayer/core/index.md +25 -0
- package/it/packages/@intlayer/design-system/index.md +21 -0
- package/it/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/it/packages/@intlayer/editor/index.md +21 -0
- package/it/packages/@intlayer/editor-react/index.md +21 -0
- package/it/packages/@intlayer/webpack/index.md +35 -0
- package/it/packages/angular-intlayer/index.md +3 -0
- package/it/packages/express-intlayer/index.md +229 -0
- package/it/packages/express-intlayer/t.md +432 -0
- package/it/packages/intlayer/getConfiguration.md +120 -0
- package/it/packages/intlayer/getEnumeration.md +138 -0
- package/it/packages/intlayer/getHTMLTextDir.md +97 -0
- package/it/packages/intlayer/getLocaleLang.md +57 -0
- package/it/packages/intlayer/getLocaleName.md +93 -0
- package/it/packages/intlayer/getLocalizedUrl.md +221 -0
- package/it/packages/intlayer/getMultilingualUrls.md +200 -0
- package/it/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/it/packages/intlayer/getTranslation.md +166 -0
- package/it/packages/intlayer/getTranslationContent.md +166 -0
- package/it/packages/intlayer/index.md +479 -0
- package/it/packages/intlayer-cli/index.md +41 -0
- package/it/packages/intlayer-editor/index.md +113 -0
- package/it/packages/lynx-intlayer/index.md +58 -0
- package/it/packages/next-intlayer/index.md +267 -0
- package/it/packages/next-intlayer/t.md +326 -0
- package/it/packages/next-intlayer/useDictionary.md +242 -0
- package/it/packages/next-intlayer/useIntlayer.md +237 -0
- package/it/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/it/packages/next-intlayer/useLocale.md +105 -0
- package/it/packages/preact-intlayer/index.md +3 -0
- package/it/packages/react-intlayer/index.md +260 -0
- package/it/packages/react-intlayer/t.md +277 -0
- package/it/packages/react-intlayer/useDictionary.md +260 -0
- package/it/packages/react-intlayer/useIntlayer.md +225 -0
- package/it/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/it/packages/react-intlayer/useLocale.md +184 -0
- package/it/packages/react-native-intlayer/index.md +57 -0
- package/it/packages/react-scripts-intlayer/index.md +57 -0
- package/it/packages/solid-intlayer/index.md +5 -0
- package/it/packages/svelte-intlayer/index.md +3 -0
- package/it/packages/vite-intlayer/index.md +53 -0
- package/it/packages/vue-intlayer/index.md +5 -0
- package/it/per_locale_file.md +298 -0
- package/it/privacy_notice.md +61 -0
- package/it/roadmap.md +206 -0
- package/it/terms_of_service.md +33 -0
- package/it/vs_code_extension.md +139 -0
- package/ja/CI_CD.md +149 -0
- package/ja/autoFill.md +157 -0
- package/ja/configuration.md +507 -0
- package/ja/dictionary/condition.md +213 -0
- package/ja/dictionary/content_extention_customization.md +81 -0
- package/ja/dictionary/enumeration.md +221 -0
- package/ja/dictionary/file.md +209 -0
- package/ja/dictionary/function_fetching.md +190 -0
- package/ja/dictionary/get_started.md +466 -0
- package/ja/dictionary/insertion.md +161 -0
- package/ja/dictionary/markdown.md +343 -0
- package/ja/dictionary/nesting.md +249 -0
- package/ja/dictionary/translation.md +287 -0
- package/ja/header.md +7 -0
- package/ja/how_works_intlayer.md +217 -0
- package/ja/index.md +125 -0
- package/ja/interest_of_intlayer.md +132 -0
- package/ja/intlayer_CMS.md +334 -0
- package/ja/intlayer_cli.md +274 -0
- package/ja/intlayer_visual_editor.md +213 -0
- package/ja/intlayer_with_angular.md +3 -0
- package/ja/intlayer_with_create_react_app.md +1186 -0
- package/ja/intlayer_with_express.md +267 -0
- package/ja/intlayer_with_lynx+react.md +482 -0
- package/ja/intlayer_with_nextjs_14.md +1256 -0
- package/ja/intlayer_with_nextjs_15.md +1308 -0
- package/ja/intlayer_with_nextjs_page_router.md +1085 -0
- package/ja/intlayer_with_react_native+expo.md +537 -0
- package/ja/intlayer_with_vite+preact.md +1601 -0
- package/ja/intlayer_with_vite+react.md +1555 -0
- package/ja/intlayer_with_vite+solid.md +3 -0
- package/ja/intlayer_with_vite+svelte.md +3 -0
- package/ja/intlayer_with_vite+vue.md +990 -0
- package/ja/introduction.md +186 -0
- package/ja/mcp_server.md +150 -0
- package/ja/packages/@intlayer/api/index.md +31 -0
- package/ja/packages/@intlayer/chokidar/index.md +31 -0
- package/ja/packages/@intlayer/cli/index.md +21 -0
- package/ja/packages/@intlayer/config/index.md +116 -0
- package/ja/packages/@intlayer/core/index.md +25 -0
- package/ja/packages/@intlayer/design-system/index.md +21 -0
- package/ja/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/ja/packages/@intlayer/editor/index.md +21 -0
- package/ja/packages/@intlayer/editor-react/index.md +21 -0
- package/ja/packages/@intlayer/webpack/index.md +35 -0
- package/ja/packages/angular-intlayer/index.md +3 -0
- package/ja/packages/express-intlayer/index.md +229 -0
- package/ja/packages/express-intlayer/t.md +432 -0
- package/ja/packages/intlayer/getConfiguration.md +120 -0
- package/ja/packages/intlayer/getEnumeration.md +140 -0
- package/ja/packages/intlayer/getHTMLTextDir.md +97 -0
- package/ja/packages/intlayer/getLocaleLang.md +59 -0
- package/ja/packages/intlayer/getLocaleName.md +93 -0
- package/ja/packages/intlayer/getLocalizedUrl.md +221 -0
- package/ja/packages/intlayer/getMultilingualUrls.md +198 -0
- package/ja/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/ja/packages/intlayer/getTranslation.md +166 -0
- package/ja/packages/intlayer/getTranslationContent.md +166 -0
- package/ja/packages/intlayer/index.md +479 -0
- package/ja/packages/intlayer-cli/index.md +41 -0
- package/ja/packages/intlayer-editor/index.md +115 -0
- package/ja/packages/lynx-intlayer/index.md +58 -0
- package/ja/packages/next-intlayer/index.md +263 -0
- package/ja/packages/next-intlayer/t.md +326 -0
- package/ja/packages/next-intlayer/useDictionary.md +242 -0
- package/ja/packages/next-intlayer/useIntlayer.md +237 -0
- package/ja/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/ja/packages/next-intlayer/useLocale.md +105 -0
- package/ja/packages/preact-intlayer/index.md +3 -0
- package/ja/packages/react-intlayer/index.md +257 -0
- package/ja/packages/react-intlayer/t.md +277 -0
- package/ja/packages/react-intlayer/useDictionary.md +260 -0
- package/ja/packages/react-intlayer/useIntlayer.md +225 -0
- package/ja/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/ja/packages/react-intlayer/useLocale.md +184 -0
- package/ja/packages/react-native-intlayer/index.md +57 -0
- package/ja/packages/react-scripts-intlayer/index.md +57 -0
- package/ja/packages/solid-intlayer/index.md +3 -0
- package/ja/packages/svelte-intlayer/index.md +3 -0
- package/ja/packages/vite-intlayer/index.md +53 -0
- package/ja/packages/vue-intlayer/index.md +3 -0
- package/ja/per_locale_file.md +298 -0
- package/ja/privacy_notice.md +57 -0
- package/ja/roadmap.md +206 -0
- package/ja/terms_of_service.md +33 -0
- package/ja/vs_code_extension.md +139 -0
- package/ko/CI_CD.md +149 -0
- package/ko/autoFill.md +157 -0
- package/ko/configuration.md +507 -0
- package/ko/dictionary/condition.md +213 -0
- package/ko/dictionary/content_extention_customization.md +81 -0
- package/ko/dictionary/enumeration.md +221 -0
- package/ko/dictionary/file.md +207 -0
- package/ko/dictionary/function_fetching.md +190 -0
- package/ko/dictionary/get_started.md +466 -0
- package/ko/dictionary/insertion.md +167 -0
- package/ko/dictionary/markdown.md +343 -0
- package/ko/dictionary/nesting.md +249 -0
- package/ko/dictionary/translation.md +287 -0
- package/ko/header.md +7 -0
- package/ko/how_works_intlayer.md +216 -0
- package/ko/index.md +125 -0
- package/ko/interest_of_intlayer.md +132 -0
- package/ko/intlayer_CMS.md +334 -0
- package/ko/intlayer_cli.md +274 -0
- package/ko/intlayer_visual_editor.md +210 -0
- package/ko/intlayer_with_angular.md +3 -0
- package/ko/intlayer_with_create_react_app.md +1186 -0
- package/ko/intlayer_with_express.md +267 -0
- package/ko/intlayer_with_lynx+react.md +482 -0
- package/ko/intlayer_with_nextjs_14.md +1267 -0
- package/ko/intlayer_with_nextjs_15.md +1319 -0
- package/ko/intlayer_with_nextjs_page_router.md +1097 -0
- package/ko/intlayer_with_react_native+expo.md +537 -0
- package/ko/intlayer_with_vite+preact.md +1682 -0
- package/ko/intlayer_with_vite+react.md +1582 -0
- package/ko/intlayer_with_vite+solid.md +3 -0
- package/ko/intlayer_with_vite+svelte.md +3 -0
- package/ko/intlayer_with_vite+vue.md +988 -0
- package/ko/introduction.md +186 -0
- package/ko/mcp_server.md +150 -0
- package/ko/packages/@intlayer/api/index.md +31 -0
- package/ko/packages/@intlayer/chokidar/index.md +31 -0
- package/ko/packages/@intlayer/cli/index.md +21 -0
- package/ko/packages/@intlayer/config/index.md +116 -0
- package/ko/packages/@intlayer/core/index.md +25 -0
- package/ko/packages/@intlayer/design-system/index.md +21 -0
- package/ko/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/ko/packages/@intlayer/editor/index.md +21 -0
- package/ko/packages/@intlayer/editor-react/index.md +21 -0
- package/ko/packages/@intlayer/webpack/index.md +35 -0
- package/ko/packages/angular-intlayer/index.md +5 -0
- package/ko/packages/express-intlayer/index.md +229 -0
- package/ko/packages/express-intlayer/t.md +432 -0
- package/ko/packages/intlayer/getConfiguration.md +120 -0
- package/ko/packages/intlayer/getEnumeration.md +138 -0
- package/ko/packages/intlayer/getHTMLTextDir.md +97 -0
- package/ko/packages/intlayer/getLocaleLang.md +57 -0
- package/ko/packages/intlayer/getLocaleName.md +93 -0
- package/ko/packages/intlayer/getLocalizedUrl.md +221 -0
- package/ko/packages/intlayer/getMultilingualUrls.md +198 -0
- package/ko/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/ko/packages/intlayer/getTranslation.md +166 -0
- package/ko/packages/intlayer/getTranslationContent.md +166 -0
- package/ko/packages/intlayer/index.md +480 -0
- package/ko/packages/intlayer-cli/index.md +41 -0
- package/ko/packages/intlayer-editor/index.md +113 -0
- package/ko/packages/lynx-intlayer/index.md +58 -0
- package/ko/packages/next-intlayer/index.md +267 -0
- package/ko/packages/next-intlayer/t.md +337 -0
- package/ko/packages/next-intlayer/useDictionary.md +242 -0
- package/ko/packages/next-intlayer/useIntlayer.md +237 -0
- package/ko/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/ko/packages/next-intlayer/useLocale.md +105 -0
- package/ko/packages/preact-intlayer/index.md +3 -0
- package/ko/packages/react-intlayer/index.md +260 -0
- package/ko/packages/react-intlayer/t.md +277 -0
- package/ko/packages/react-intlayer/useDictionary.md +268 -0
- package/ko/packages/react-intlayer/useIntlayer.md +225 -0
- package/ko/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/ko/packages/react-intlayer/useLocale.md +184 -0
- package/ko/packages/react-native-intlayer/index.md +57 -0
- package/ko/packages/react-scripts-intlayer/index.md +57 -0
- package/ko/packages/solid-intlayer/index.md +3 -0
- package/ko/packages/svelte-intlayer/index.md +3 -0
- package/ko/packages/vite-intlayer/index.md +53 -0
- package/ko/packages/vue-intlayer/index.md +3 -0
- package/ko/per_locale_file.md +300 -0
- package/ko/privacy_notice.md +61 -0
- package/ko/roadmap.md +206 -0
- package/ko/terms_of_service.md +33 -0
- package/ko/vs_code_extension.md +139 -0
- package/package.json +96 -0
- package/pt/CI_CD.md +149 -0
- package/pt/autoFill.md +157 -0
- package/pt/configuration.md +503 -0
- package/pt/dictionary/condition.md +213 -0
- package/pt/dictionary/content_extention_customization.md +81 -0
- package/pt/dictionary/enumeration.md +221 -0
- package/pt/dictionary/file.md +210 -0
- package/pt/dictionary/function_fetching.md +190 -0
- package/pt/dictionary/get_started.md +490 -0
- package/pt/dictionary/insertion.md +161 -0
- package/pt/dictionary/markdown.md +339 -0
- package/pt/dictionary/nesting.md +249 -0
- package/pt/dictionary/translation.md +322 -0
- package/pt/header.md +7 -0
- package/pt/how_works_intlayer.md +216 -0
- package/pt/index.md +125 -0
- package/pt/interest_of_intlayer.md +132 -0
- package/pt/intlayer_CMS.md +334 -0
- package/pt/intlayer_cli.md +274 -0
- package/pt/intlayer_visual_editor.md +210 -0
- package/pt/intlayer_with_angular.md +3 -0
- package/pt/intlayer_with_create_react_app.md +1204 -0
- package/pt/intlayer_with_express.md +270 -0
- package/pt/intlayer_with_lynx+react.md +467 -0
- package/pt/intlayer_with_nextjs_14.md +1269 -0
- package/pt/intlayer_with_nextjs_15.md +1319 -0
- package/pt/intlayer_with_nextjs_page_router.md +1109 -0
- package/pt/intlayer_with_react_native+expo.md +259 -0
- package/pt/intlayer_with_vite+preact.md +1663 -0
- package/pt/intlayer_with_vite+react.md +1621 -0
- package/pt/intlayer_with_vite+solid.md +3 -0
- package/pt/intlayer_with_vite+svelte.md +3 -0
- package/pt/intlayer_with_vite+vue.md +989 -0
- package/pt/introduction.md +193 -0
- package/pt/mcp_server.md +150 -0
- package/pt/packages/@intlayer/api/index.md +31 -0
- package/pt/packages/@intlayer/chokidar/index.md +31 -0
- package/pt/packages/@intlayer/cli/index.md +21 -0
- package/pt/packages/@intlayer/config/index.md +116 -0
- package/pt/packages/@intlayer/core/index.md +25 -0
- package/pt/packages/@intlayer/design-system/index.md +21 -0
- package/pt/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/pt/packages/@intlayer/editor/index.md +21 -0
- package/pt/packages/@intlayer/editor-react/index.md +21 -0
- package/pt/packages/@intlayer/webpack/index.md +35 -0
- package/pt/packages/angular-intlayer/index.md +3 -0
- package/pt/packages/express-intlayer/index.md +232 -0
- package/pt/packages/express-intlayer/t.md +267 -0
- package/pt/packages/intlayer/getConfiguration.md +120 -0
- package/pt/packages/intlayer/getEnumeration.md +138 -0
- package/pt/packages/intlayer/getHTMLTextDir.md +97 -0
- package/pt/packages/intlayer/getLocaleLang.md +57 -0
- package/pt/packages/intlayer/getLocaleName.md +93 -0
- package/pt/packages/intlayer/getLocalizedUrl.md +221 -0
- package/pt/packages/intlayer/getMultilingualUrls.md +198 -0
- package/pt/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/pt/packages/intlayer/getTranslation.md +175 -0
- package/pt/packages/intlayer/getTranslationContent.md +177 -0
- package/pt/packages/intlayer/index.md +484 -0
- package/pt/packages/intlayer-cli/index.md +41 -0
- package/pt/packages/intlayer-editor/index.md +113 -0
- package/pt/packages/lynx-intlayer/index.md +58 -0
- package/pt/packages/next-intlayer/index.md +270 -0
- package/pt/packages/next-intlayer/t.md +341 -0
- package/pt/packages/next-intlayer/useDictionary.md +248 -0
- package/pt/packages/next-intlayer/useIntlayer.md +237 -0
- package/pt/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/pt/packages/next-intlayer/useLocale.md +105 -0
- package/pt/packages/preact-intlayer/index.md +3 -0
- package/pt/packages/react-intlayer/index.md +261 -0
- package/pt/packages/react-intlayer/t.md +289 -0
- package/pt/packages/react-intlayer/useDictionary.md +268 -0
- package/pt/packages/react-intlayer/useIntlayer.md +225 -0
- package/pt/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/pt/packages/react-intlayer/useLocale.md +184 -0
- package/pt/packages/react-native-intlayer/index.md +57 -0
- package/pt/packages/react-scripts-intlayer/index.md +57 -0
- package/pt/packages/solid-intlayer/index.md +3 -0
- package/pt/packages/svelte-intlayer/index.md +3 -0
- package/pt/packages/vite-intlayer/index.md +53 -0
- package/pt/packages/vue-intlayer/index.md +3 -0
- package/pt/per_locale_file.md +298 -0
- package/pt/privacy_notice.md +61 -0
- package/pt/roadmap.md +206 -0
- package/pt/terms_of_service.md +33 -0
- package/pt/vs_code_extension.md +139 -0
- package/ru/CI_CD.md +149 -0
- package/ru/autoFill.md +157 -0
- package/ru/configuration.md +507 -0
- package/ru/dictionary/condition.md +213 -0
- package/ru/dictionary/content_extention_customization.md +81 -0
- package/ru/dictionary/enumeration.md +221 -0
- package/ru/dictionary/file.md +209 -0
- package/ru/dictionary/function_fetching.md +188 -0
- package/ru/dictionary/get_started.md +311 -0
- package/ru/dictionary/insertion.md +161 -0
- package/ru/dictionary/markdown.md +339 -0
- package/ru/dictionary/nesting.md +249 -0
- package/ru/dictionary/translation.md +322 -0
- package/ru/environment/angular.md +3 -0
- package/ru/header.md +7 -0
- package/ru/how_works_intlayer.md +217 -0
- package/ru/index.md +125 -0
- package/ru/interest_of_intlayer.md +132 -0
- package/ru/intlayer_CMS.md +334 -0
- package/ru/intlayer_cli.md +274 -0
- package/ru/intlayer_visual_editor.md +210 -0
- package/ru/intlayer_with_angular.md +3 -0
- package/ru/intlayer_with_create_react_app.md +1196 -0
- package/ru/intlayer_with_express.md +273 -0
- package/ru/intlayer_with_lynx+react.md +482 -0
- package/ru/intlayer_with_nextjs_14.md +1274 -0
- package/ru/intlayer_with_nextjs_15.md +1318 -0
- package/ru/intlayer_with_nextjs_page_router.md +1100 -0
- package/ru/intlayer_with_react_native+expo.md +537 -0
- package/ru/intlayer_with_vite+preact.md +1663 -0
- package/ru/intlayer_with_vite+react.md +1546 -0
- package/ru/intlayer_with_vite+solid.md +3 -0
- package/ru/intlayer_with_vite+svelte.md +3 -0
- package/ru/intlayer_with_vite+vue.md +987 -0
- package/ru/introduction.md +190 -0
- package/ru/mcp_server.md +152 -0
- package/ru/packages/@intlayer/api/index.md +31 -0
- package/ru/packages/@intlayer/chokidar/index.md +31 -0
- package/ru/packages/@intlayer/cli/index.md +23 -0
- package/ru/packages/@intlayer/config/index.md +116 -0
- package/ru/packages/@intlayer/core/index.md +25 -0
- package/ru/packages/@intlayer/design-system/index.md +21 -0
- package/ru/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/ru/packages/@intlayer/editor/index.md +21 -0
- package/ru/packages/@intlayer/editor-react/index.md +21 -0
- package/ru/packages/@intlayer/webpack/index.md +35 -0
- package/ru/packages/angular-intlayer/index.md +3 -0
- package/ru/packages/express-intlayer/index.md +235 -0
- package/ru/packages/express-intlayer/t.md +445 -0
- package/ru/packages/intlayer/getConfiguration.md +120 -0
- package/ru/packages/intlayer/getEnumeration.md +140 -0
- package/ru/packages/intlayer/getHTMLTextDir.md +97 -0
- package/ru/packages/intlayer/getLocaleLang.md +59 -0
- package/ru/packages/intlayer/getLocaleName.md +93 -0
- package/ru/packages/intlayer/getLocalizedUrl.md +221 -0
- package/ru/packages/intlayer/getMultilingualUrls.md +198 -0
- package/ru/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/ru/packages/intlayer/getTranslation.md +177 -0
- package/ru/packages/intlayer/getTranslationContent.md +175 -0
- package/ru/packages/intlayer/index.md +275 -0
- package/ru/packages/intlayer-cli/index.md +41 -0
- package/ru/packages/intlayer-editor/index.md +115 -0
- package/ru/packages/lynx-intlayer/index.md +58 -0
- package/ru/packages/next-intlayer/index.md +267 -0
- package/ru/packages/next-intlayer/t.md +340 -0
- package/ru/packages/next-intlayer/useDictionary.md +248 -0
- package/ru/packages/next-intlayer/useIntlayer.md +237 -0
- package/ru/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/ru/packages/next-intlayer/useLocale.md +105 -0
- package/ru/packages/preact-intlayer/index.md +3 -0
- package/ru/packages/react-intlayer/index.md +261 -0
- package/ru/packages/react-intlayer/t.md +289 -0
- package/ru/packages/react-intlayer/useDictionary.md +268 -0
- package/ru/packages/react-intlayer/useIntlayer.md +225 -0
- package/ru/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/ru/packages/react-intlayer/useLocale.md +184 -0
- package/ru/packages/react-native-intlayer/index.md +57 -0
- package/ru/packages/react-scripts-intlayer/index.md +57 -0
- package/ru/packages/solid-intlayer/index.md +3 -0
- package/ru/packages/svelte-intlayer/index.md +3 -0
- package/ru/packages/vite-intlayer/index.md +53 -0
- package/ru/packages/vue-intlayer/index.md +3 -0
- package/ru/per_locale_file.md +298 -0
- package/ru/privacy_notice.md +61 -0
- package/ru/roadmap.md +206 -0
- package/ru/terms_of_service.md +33 -0
- package/ru/vs_code_extension.md +139 -0
- package/zh/CI_CD.md +149 -0
- package/zh/autoFill.md +157 -0
- package/zh/configuration.md +484 -0
- package/zh/dictionary/condition.md +213 -0
- package/zh/dictionary/content_extention_customization.md +81 -0
- package/zh/dictionary/enumeration.md +221 -0
- package/zh/dictionary/file.md +209 -0
- package/zh/dictionary/function_fetching.md +188 -0
- package/zh/dictionary/get_started.md +490 -0
- package/zh/dictionary/insertion.md +161 -0
- package/zh/dictionary/markdown.md +342 -0
- package/zh/dictionary/nesting.md +249 -0
- package/zh/dictionary/translation.md +287 -0
- package/zh/header.md +7 -0
- package/zh/how_works_intlayer.md +217 -0
- package/zh/index.md +125 -0
- package/zh/interest_of_intlayer.md +132 -0
- package/zh/intlayer_CMS.md +334 -0
- package/zh/intlayer_cli.md +274 -0
- package/zh/intlayer_visual_editor.md +210 -0
- package/zh/intlayer_with_angular.md +3 -0
- package/zh/intlayer_with_create_react_app.md +1196 -0
- package/zh/intlayer_with_express.md +267 -0
- package/zh/intlayer_with_lynx+react.md +484 -0
- package/zh/intlayer_with_nextjs_14.md +1286 -0
- package/zh/intlayer_with_nextjs_15.md +1322 -0
- package/zh/intlayer_with_nextjs_page_router.md +1097 -0
- package/zh/intlayer_with_react_native+expo.md +539 -0
- package/zh/intlayer_with_vite+preact.md +1681 -0
- package/zh/intlayer_with_vite+react.md +1577 -0
- package/zh/intlayer_with_vite+solid.md +3 -0
- package/zh/intlayer_with_vite+svelte.md +3 -0
- package/zh/intlayer_with_vite+vue.md +988 -0
- package/zh/introduction.md +186 -0
- package/zh/mcp_server.md +152 -0
- package/zh/packages/@intlayer/api/index.md +31 -0
- package/zh/packages/@intlayer/chokidar/index.md +31 -0
- package/zh/packages/@intlayer/cli/index.md +21 -0
- package/zh/packages/@intlayer/config/index.md +116 -0
- package/zh/packages/@intlayer/core/index.md +25 -0
- package/zh/packages/@intlayer/design-system/index.md +21 -0
- package/zh/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/zh/packages/@intlayer/editor/index.md +21 -0
- package/zh/packages/@intlayer/editor-react/index.md +21 -0
- package/zh/packages/@intlayer/webpack/index.md +35 -0
- package/zh/packages/angular-intlayer/index.md +3 -0
- package/zh/packages/express-intlayer/index.md +229 -0
- package/zh/packages/express-intlayer/t.md +432 -0
- package/zh/packages/intlayer/getConfiguration.md +120 -0
- package/zh/packages/intlayer/getEnumeration.md +140 -0
- package/zh/packages/intlayer/getHTMLTextDir.md +97 -0
- package/zh/packages/intlayer/getLocaleLang.md +57 -0
- package/zh/packages/intlayer/getLocaleName.md +93 -0
- package/zh/packages/intlayer/getLocalizedUrl.md +221 -0
- package/zh/packages/intlayer/getMultilingualUrls.md +198 -0
- package/zh/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/zh/packages/intlayer/getTranslation.md +166 -0
- package/zh/packages/intlayer/getTranslationContent.md +166 -0
- package/zh/packages/intlayer/index.md +360 -0
- package/zh/packages/intlayer-cli/index.md +41 -0
- package/zh/packages/intlayer-editor/index.md +113 -0
- package/zh/packages/lynx-intlayer/index.md +60 -0
- package/zh/packages/next-intlayer/index.md +267 -0
- package/zh/packages/next-intlayer/t.md +338 -0
- package/zh/packages/next-intlayer/useDictionary.md +242 -0
- package/zh/packages/next-intlayer/useIntlayer.md +237 -0
- package/zh/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/zh/packages/next-intlayer/useLocale.md +105 -0
- package/zh/packages/preact-intlayer/index.md +3 -0
- package/zh/packages/react-intlayer/index.md +257 -0
- package/zh/packages/react-intlayer/t.md +271 -0
- package/zh/packages/react-intlayer/useDictionary.md +260 -0
- package/zh/packages/react-intlayer/useIntlayer.md +225 -0
- package/zh/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/zh/packages/react-intlayer/useLocale.md +184 -0
- package/zh/packages/react-native-intlayer/index.md +57 -0
- package/zh/packages/react-scripts-intlayer/index.md +57 -0
- package/zh/packages/solid-intlayer/index.md +3 -0
- package/zh/packages/svelte-intlayer/index.md +3 -0
- package/zh/packages/vite-intlayer/index.md +53 -0
- package/zh/packages/vue-intlayer/index.md +3 -0
- package/zh/per_locale_file.md +298 -0
- package/zh/privacy_notice.md +61 -0
- package/zh/roadmap.md +206 -0
- package/zh/terms_of_service.md +33 -0
- package/zh/vs_code_extension.md +139 -0
|
@@ -0,0 +1,1308 @@
|
|
|
1
|
+
# Comenzando con la internacionalización (i18n) con Intlayer y Next.js 15 App Router
|
|
2
|
+
|
|
3
|
+
<iframe title="The best i18n solution for Next.js? Discover Intlayer" class="m-auto aspect-[16/9] w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/e_PPG7PTqGU?autoplay=0&origin=http://intlayer.org&controls=0&rel=1"/>
|
|
4
|
+
|
|
5
|
+
Vea [Application Template](https://github.com/aymericzip/intlayer-next-15-template) en GitHub.
|
|
6
|
+
|
|
7
|
+
## ¿Qué es Intlayer?
|
|
8
|
+
|
|
9
|
+
**Intlayer** es una biblioteca innovadora y de código abierto para la internacionalización (i18n) diseñada para simplificar el soporte multilingüe en aplicaciones web modernas. Intlayer se integra perfectamente con el último framework **Next.js 15**, incluyendo su potente **App Router**. Está optimizado para trabajar con **Server Components** para un renderizado eficiente y es totalmente compatible con [**Turbopack**](https://nextjs.org/docs/architecture/turbopack).
|
|
10
|
+
|
|
11
|
+
Con Intlayer, puedes:
|
|
12
|
+
|
|
13
|
+
- **Gestionar traducciones fácilmente** utilizando diccionarios declarativos a nivel de componente.
|
|
14
|
+
- **Localizar dinámicamente metadatos**, rutas y contenido.
|
|
15
|
+
- **Acceder a traducciones tanto en componentes del lado del cliente como del servidor**.
|
|
16
|
+
- **Asegurar soporte para TypeScript** con tipos autogenerados, mejorando la autocompletación y la detección de errores.
|
|
17
|
+
- **Beneficiarte de características avanzadas**, como la detección dinámica de locales y el cambio entre ellos.
|
|
18
|
+
|
|
19
|
+
> Intlayer es compatible con Next.js 12, 13, 14 y 15. Si estás utilizando Next.js Page Router, puedes consultar esta [guía](https://github.com/aymericzip/intlayer/blob/main/docs/es/intlayer_with_nextjs_page_router.md). Para Next.js 12, 13, 14 con App Router, consulta esta [guía](https://github.com/aymericzip/intlayer/blob/main/docs/es/intlayer_with_nextjs_14.md).
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Guía paso a paso para configurar Intlayer en una aplicación Next.js
|
|
24
|
+
|
|
25
|
+
### Paso 1: Instalar dependencias
|
|
26
|
+
|
|
27
|
+
Instala los paquetes necesarios utilizando npm:
|
|
28
|
+
|
|
29
|
+
```bash packageManager="npm"
|
|
30
|
+
npm install intlayer next-intlayer
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
```bash packageManager="pnpm"
|
|
34
|
+
pnpm add intlayer next-intlayer
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
```bash packageManager="yarn"
|
|
38
|
+
yarn add intlayer next-intlayer
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
- **intlayer**
|
|
42
|
+
|
|
43
|
+
El paquete principal que proporciona herramientas de internacionalización para la gestión de configuración, traducción, [declaración de contenido](https://github.com/aymericzip/intlayer/blob/main/docs/es/dictionary/get_started.md), transpilación y [comandos CLI](https://github.com/aymericzip/intlayer/blob/main/docs/es/intlayer_cli.md).
|
|
44
|
+
|
|
45
|
+
- **next-intlayer**
|
|
46
|
+
|
|
47
|
+
El paquete que integra Intlayer con Next.js. Proporciona proveedores de contexto y hooks para la internacionalización en Next.js. Además, incluye el plugin de Next.js para integrar Intlayer con [Webpack](https://webpack.js.org/) o [Turbopack](https://nextjs.org/docs/app/api-reference/turbopack), así como middleware para detectar el idioma preferido del usuario, gestionar cookies y manejar redirecciones de URL.
|
|
48
|
+
|
|
49
|
+
### Paso 2: Configurar tu proyecto
|
|
50
|
+
|
|
51
|
+
Crea un archivo de configuración para configurar los idiomas de tu aplicación:
|
|
52
|
+
|
|
53
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
54
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
55
|
+
|
|
56
|
+
const config: IntlayerConfig = {
|
|
57
|
+
internationalization: {
|
|
58
|
+
locales: [
|
|
59
|
+
Locales.ENGLISH,
|
|
60
|
+
Locales.FRENCH,
|
|
61
|
+
Locales.SPANISH,
|
|
62
|
+
// Tus otros locales
|
|
63
|
+
],
|
|
64
|
+
defaultLocale: Locales.ENGLISH,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export default config;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
72
|
+
import { Locales } from "intlayer";
|
|
73
|
+
|
|
74
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
75
|
+
const config = {
|
|
76
|
+
internationalization: {
|
|
77
|
+
locales: [
|
|
78
|
+
Locales.ENGLISH,
|
|
79
|
+
Locales.FRENCH,
|
|
80
|
+
Locales.SPANISH,
|
|
81
|
+
// Tus otros locales
|
|
82
|
+
],
|
|
83
|
+
defaultLocale: Locales.ENGLISH,
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export default config;
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
91
|
+
const { Locales } = require("intlayer");
|
|
92
|
+
|
|
93
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
94
|
+
const config = {
|
|
95
|
+
internationalization: {
|
|
96
|
+
locales: [
|
|
97
|
+
Locales.ENGLISH,
|
|
98
|
+
Locales.FRENCH,
|
|
99
|
+
Locales.SPANISH,
|
|
100
|
+
// Tus otros locales
|
|
101
|
+
],
|
|
102
|
+
defaultLocale: Locales.ENGLISH,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
module.exports = config;
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
> A través de este archivo de configuración, puedes configurar URLs localizadas, redirecciones de middleware, nombres de cookies, la ubicación y extensión de tus declaraciones de contenido, deshabilitar los logs de Intlayer en la consola y más. Para una lista completa de parámetros disponibles, consulta la [documentación de configuración](https://github.com/aymericzip/intlayer/blob/main/docs/es/configuration.md).
|
|
110
|
+
|
|
111
|
+
### Paso 3: Integrar Intlayer en tu configuración de Next.js
|
|
112
|
+
|
|
113
|
+
Configura tu proyecto de Next.js para usar Intlayer:
|
|
114
|
+
|
|
115
|
+
```typescript filename="next.config.ts" codeFormat="typescript"
|
|
116
|
+
import type { NextConfig } from "next";
|
|
117
|
+
import { withIntlayer } from "next-intlayer/server";
|
|
118
|
+
|
|
119
|
+
const nextConfig: NextConfig = {
|
|
120
|
+
/* opciones de configuración aquí */
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export default withIntlayer(nextConfig);
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
```typescript fileName="next.config.mjs" codeFormat="esm"
|
|
127
|
+
import { withIntlayer } from "next-intlayer/server";
|
|
128
|
+
|
|
129
|
+
/** @type {import('next').NextConfig} */
|
|
130
|
+
const nextConfig = {
|
|
131
|
+
/* opciones de configuración aquí */
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
export default withIntlayer(nextConfig);
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
```typescript fileName="next.config.cjs" codeFormat="commonjs"
|
|
138
|
+
const { withIntlayer } = require("next-intlayer/server");
|
|
139
|
+
|
|
140
|
+
/** @type {import('next').NextConfig} */
|
|
141
|
+
const nextConfig = {
|
|
142
|
+
/* opciones de configuración aquí */
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
module.exports = withIntlayer(nextConfig);
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
> El plugin `withIntlayer()` de Next.js se utiliza para integrar Intlayer con Next.js. Asegura la construcción de archivos de declaración de contenido y los monitorea en modo de desarrollo. Define variables de entorno de Intlayer dentro de los entornos [Webpack](https://webpack.js.org/) o [Turbopack](https://nextjs.org/docs/app/api-reference/turbopack). Además, proporciona alias para optimizar el rendimiento y asegura la compatibilidad con componentes del servidor.
|
|
149
|
+
|
|
150
|
+
### Paso 4: Definir rutas dinámicas de locales
|
|
151
|
+
|
|
152
|
+
Elimina todo de `RootLayout` y reemplázalo con el siguiente código:
|
|
153
|
+
|
|
154
|
+
```tsx {3} fileName="src/app/layout.tsx" codeFormat="typescript"
|
|
155
|
+
import type { PropsWithChildren, FC } from "react";
|
|
156
|
+
import "./globals.css";
|
|
157
|
+
|
|
158
|
+
const RootLayout: FC<PropsWithChildren> = ({ children }) => children;
|
|
159
|
+
|
|
160
|
+
export default RootLayout;
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```jsx {3} fileName="src/app/layout.mjx" codeFormat="esm"
|
|
164
|
+
import "./globals.css";
|
|
165
|
+
|
|
166
|
+
const RootLayout = ({ children }) => children;
|
|
167
|
+
|
|
168
|
+
export default RootLayout;
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
```jsx {1,8} fileName="src/app/layout.csx" codeFormat="commonjs"
|
|
172
|
+
require("./globals.css");
|
|
173
|
+
|
|
174
|
+
const RootLayout = ({ children }) => children;
|
|
175
|
+
|
|
176
|
+
module.exports = {
|
|
177
|
+
default: RootLayout,
|
|
178
|
+
generateStaticParams,
|
|
179
|
+
};
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
> Mantener el componente `RootLayout` vacío permite establecer los atributos [`lang`](https://developer.mozilla.org/fr/docs/Web/HTML/Global_attributes/lang) y [`dir`](https://developer.mozilla.org/fr/docs/Web/HTML/Global_attributes/dir) en la etiqueta `<html>`.
|
|
183
|
+
|
|
184
|
+
Para implementar el enrutamiento dinámico, proporciona la ruta para el local añadiendo un nuevo diseño en tu directorio `[locale]`:
|
|
185
|
+
|
|
186
|
+
```tsx fileName="src/app/[locale]/layout.tsx" codeFormat="typescript"
|
|
187
|
+
import type { NextLayoutIntlayer } from "next-intlayer";
|
|
188
|
+
import { Inter } from "next/font/google";
|
|
189
|
+
import { getHTMLTextDir } from "intlayer";
|
|
190
|
+
|
|
191
|
+
const inter = Inter({ subsets: ["latin"] });
|
|
192
|
+
|
|
193
|
+
const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
|
|
194
|
+
const { locale } = await params;
|
|
195
|
+
return (
|
|
196
|
+
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
197
|
+
<body className={inter.className}>{children}</body>
|
|
198
|
+
</html>
|
|
199
|
+
);
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
export default LocaleLayout;
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
```jsx fileName="src/app/[locale]/layout.mjx" codeFormat="esm"
|
|
206
|
+
import { getHTMLTextDir } from "intlayer";
|
|
207
|
+
|
|
208
|
+
const inter = Inter({ subsets: ["latin"] });
|
|
209
|
+
|
|
210
|
+
const LocaleLayout = async ({ children, params: { locale } }) => {
|
|
211
|
+
const { locale } = await params;
|
|
212
|
+
return (
|
|
213
|
+
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
214
|
+
<body className={inter.className}>{children}</body>
|
|
215
|
+
</html>
|
|
216
|
+
);
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
export default LocaleLayout;
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
```jsx fileName="src/app/[locale]/layout.csx" codeFormat="commonjs"
|
|
223
|
+
const { Inter } = require("next/font/google");
|
|
224
|
+
const { getHTMLTextDir } = require("intlayer");
|
|
225
|
+
|
|
226
|
+
const inter = Inter({ subsets: ["latin"] });
|
|
227
|
+
|
|
228
|
+
const LocaleLayout = async ({ children, params: { locale } }) => {
|
|
229
|
+
const { locale } = await params;
|
|
230
|
+
return (
|
|
231
|
+
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
232
|
+
<body className={inter.className}>{children}</body>
|
|
233
|
+
</html>
|
|
234
|
+
);
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
module.exports = LocaleLayout;
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
> El segmento de ruta `[locale]` se utiliza para definir el local. Ejemplo: `/en-US/about` se referirá a `en-US` y `/fr/about` a `fr`.
|
|
241
|
+
|
|
242
|
+
Luego, implementa la función `generateStaticParams` en el diseño de tu aplicación.
|
|
243
|
+
|
|
244
|
+
```tsx {1} fileName="src/app/[locale]/layout.tsx" codeFormat="typescript"
|
|
245
|
+
export { generateStaticParams } from "next-intlayer"; // Línea a insertar
|
|
246
|
+
|
|
247
|
+
const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
|
|
248
|
+
/*... Resto del código*/
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
export default LocaleLayout;
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
```jsx {1} fileName="src/app/[locale]/layout.mjx" codeFormat="esm"
|
|
255
|
+
export { generateStaticParams } from "next-intlayer"; // Línea a insertar
|
|
256
|
+
|
|
257
|
+
const LocaleLayout = async ({ children, params: { locale } }) => {
|
|
258
|
+
/*... Resto del código*/
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
// ... Resto del código
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
```jsx {1,7} fileName="src/app/[locale]/layout.csx" codeFormat="commonjs"
|
|
265
|
+
const { generateStaticParams } = require("next-intlayer"); // Línea a insertar
|
|
266
|
+
|
|
267
|
+
const LocaleLayout = async ({ children, params: { locale } }) => {
|
|
268
|
+
/*... Resto del código*/
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
module.exports = { default: LocaleLayout, generateStaticParams };
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
> `generateStaticParams` asegura que tu aplicación preconstruya las páginas necesarias para todos los locales, reduciendo el cálculo en tiempo de ejecución y mejorando la experiencia del usuario. Para más detalles, consulta la [documentación de Next.js sobre generateStaticParams](https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic-rendering#generate-static-params).
|
|
275
|
+
|
|
276
|
+
### Paso 5: Declarar tu contenido
|
|
277
|
+
|
|
278
|
+
Crea y gestiona tus declaraciones de contenido para almacenar traducciones:
|
|
279
|
+
|
|
280
|
+
```tsx fileName="src/app/[locale]/page.content.ts" contentDeclarationFormat="typescript"
|
|
281
|
+
import { t, type Dictionary } from "intlayer";
|
|
282
|
+
|
|
283
|
+
const pageContent = {
|
|
284
|
+
key: "page",
|
|
285
|
+
content: {
|
|
286
|
+
getStarted: {
|
|
287
|
+
main: t({
|
|
288
|
+
en: "Get started by editing",
|
|
289
|
+
fr: "Commencez par éditer",
|
|
290
|
+
es: "Comience por editar",
|
|
291
|
+
}),
|
|
292
|
+
pageLink: "src/app/page.tsx",
|
|
293
|
+
},
|
|
294
|
+
},
|
|
295
|
+
} satisfies Dictionary;
|
|
296
|
+
|
|
297
|
+
export default pageContent;
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
```javascript fileName="src/app/[locale]/page.content.mjs" contentDeclarationFormat="esm"
|
|
301
|
+
import { t } from "intlayer";
|
|
302
|
+
|
|
303
|
+
/** @type {import('intlayer').Dictionary} */
|
|
304
|
+
const pageContent = {
|
|
305
|
+
key: "page",
|
|
306
|
+
content: {
|
|
307
|
+
getStarted: {
|
|
308
|
+
main: t({
|
|
309
|
+
en: "Get started by editing",
|
|
310
|
+
fr: "Commencez par éditer",
|
|
311
|
+
es: "Comience por editar",
|
|
312
|
+
}),
|
|
313
|
+
pageLink: "src/app/page.tsx",
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
export default pageContent;
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
```javascript fileName="src/app/[locale]/page.content.cjs" contentDeclarationFormat="commonjs"
|
|
322
|
+
const { t } = require("intlayer");
|
|
323
|
+
|
|
324
|
+
/** @type {import('intlayer').Dictionary} */
|
|
325
|
+
const pageContent = {
|
|
326
|
+
key: "page",
|
|
327
|
+
content: {
|
|
328
|
+
getStarted: {
|
|
329
|
+
main: t({
|
|
330
|
+
en: "Get started by editing",
|
|
331
|
+
fr: "Commencez par éditer",
|
|
332
|
+
es: "Comience por editar",
|
|
333
|
+
}),
|
|
334
|
+
pageLink: "src/app/page.tsx",
|
|
335
|
+
},
|
|
336
|
+
},
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
module.exports = pageContent;
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
```json fileName="src/app/[locale]/page.content.json" contentDeclarationFormat="json"
|
|
343
|
+
{
|
|
344
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
345
|
+
"key": "page",
|
|
346
|
+
"content": {
|
|
347
|
+
"getStarted": {
|
|
348
|
+
"nodeType": "translation",
|
|
349
|
+
"translation": {
|
|
350
|
+
"en": "Get started by editing",
|
|
351
|
+
"fr": "Commencez par éditer",
|
|
352
|
+
"es": "Comience por editar"
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
"pageLink": {
|
|
356
|
+
"nodeType": "translation",
|
|
357
|
+
"translation": {
|
|
358
|
+
"en": "src/app/page.tsx",
|
|
359
|
+
"fr": "src/app/page.tsx",
|
|
360
|
+
"es": "src/app/page.tsx"
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
> Tus declaraciones de contenido pueden definirse en cualquier lugar de tu aplicación siempre que estén incluidas en el directorio `contentDir` (por defecto, `./src`). Y coincidan con la extensión del archivo de declaración de contenido (por defecto, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
368
|
+
|
|
369
|
+
> Para más detalles, consulta la [documentación de declaración de contenido](https://github.com/aymericzip/intlayer/blob/main/docs/es/dictionary/get_started.md).
|
|
370
|
+
|
|
371
|
+
### Paso 6: Utilizar contenido en tu código
|
|
372
|
+
|
|
373
|
+
Accede a tus diccionarios de contenido en toda tu aplicación:
|
|
374
|
+
|
|
375
|
+
```tsx fileName="src/app/[locale]/page.tsx" codeFormat="typescript"
|
|
376
|
+
import type { FC } from "react";
|
|
377
|
+
import { ClientComponentExample } from "@components/ClientComponentExample";
|
|
378
|
+
import { ServerComponentExample } from "@components/ServerComponentExample";
|
|
379
|
+
import { type NextPageIntlayer, IntlayerClientProvider } from "next-intlayer";
|
|
380
|
+
import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server";
|
|
381
|
+
|
|
382
|
+
const PageContent: FC = () => {
|
|
383
|
+
const content = useIntlayer("page");
|
|
384
|
+
|
|
385
|
+
return (
|
|
386
|
+
<>
|
|
387
|
+
<p>{content.getStarted.main}</p>
|
|
388
|
+
<code>{content.getStarted.pageLink}</code>
|
|
389
|
+
</>
|
|
390
|
+
);
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
const Page: NextPageIntlayer = async ({ params }) => {
|
|
394
|
+
const { locale } = await params;
|
|
395
|
+
|
|
396
|
+
return (
|
|
397
|
+
<IntlayerServerProvider locale={locale}>
|
|
398
|
+
<PageContent />
|
|
399
|
+
<ServerComponentExample />
|
|
400
|
+
|
|
401
|
+
<IntlayerClientProvider locale={locale}>
|
|
402
|
+
<ClientComponentExample />
|
|
403
|
+
</IntlayerClientProvider>
|
|
404
|
+
</IntlayerServerProvider>
|
|
405
|
+
);
|
|
406
|
+
};
|
|
407
|
+
|
|
408
|
+
export default Page;
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
```jsx fileName="src/app/[locale]/page.mjx" codeFormat="esm"
|
|
412
|
+
import { ClientComponentExample } from "@components/ClientComponentExample";
|
|
413
|
+
import { ServerComponentExample } from "@components/ServerComponentExample";
|
|
414
|
+
import { IntlayerClientProvider } from "next-intlayer";
|
|
415
|
+
import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server";
|
|
416
|
+
|
|
417
|
+
const PageContent = () => {
|
|
418
|
+
const content = useIntlayer("page");
|
|
419
|
+
|
|
420
|
+
return (
|
|
421
|
+
<>
|
|
422
|
+
<p>{content.getStarted.main}</p>
|
|
423
|
+
<code>{content.getStarted.pageLink}</code>
|
|
424
|
+
</>
|
|
425
|
+
);
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
const Page = async ({ params }) => {
|
|
429
|
+
const { locale } = await params;
|
|
430
|
+
|
|
431
|
+
return (
|
|
432
|
+
<IntlayerServerProvider locale={locale}>
|
|
433
|
+
<PageContent />
|
|
434
|
+
<ServerComponentExample />
|
|
435
|
+
|
|
436
|
+
<IntlayerClientProvider locale={locale}>
|
|
437
|
+
<ClientComponentExample />
|
|
438
|
+
</IntlayerClientProvider>
|
|
439
|
+
</IntlayerServerProvider>
|
|
440
|
+
);
|
|
441
|
+
};
|
|
442
|
+
|
|
443
|
+
export default Page;
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
```jsx fileName="src/app/[locale]/page.csx" codeFormat="commonjs"
|
|
447
|
+
import { ClientComponentExample } from "@components/ClientComponentExample";
|
|
448
|
+
import { ServerComponentExample } from "@components/ServerComponentExample";
|
|
449
|
+
import { IntlayerClientProvider } from "next-intlayer";
|
|
450
|
+
import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server";
|
|
451
|
+
|
|
452
|
+
const PageContent = () => {
|
|
453
|
+
const content = useIntlayer("page");
|
|
454
|
+
|
|
455
|
+
return (
|
|
456
|
+
<>
|
|
457
|
+
<p>{content.getStarted.main}</p>
|
|
458
|
+
<code>{content.getStarted.pageLink}</code>
|
|
459
|
+
</>
|
|
460
|
+
);
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
const Page = async ({ params }) => {
|
|
464
|
+
const { locale } = await params;
|
|
465
|
+
|
|
466
|
+
return (
|
|
467
|
+
<IntlayerServerProvider locale={locale}>
|
|
468
|
+
<PageContent />
|
|
469
|
+
<ServerComponentExample />
|
|
470
|
+
|
|
471
|
+
<IntlayerClientProvider locale={locale}>
|
|
472
|
+
<ClientComponentExample />
|
|
473
|
+
</IntlayerClientProvider>
|
|
474
|
+
</IntlayerServerProvider>
|
|
475
|
+
);
|
|
476
|
+
};
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
- **`IntlayerClientProvider`** se utiliza para proporcionar el local a los componentes del lado del cliente. Puede colocarse en cualquier componente padre, incluido el diseño. Sin embargo, se recomienda colocarlo en un diseño porque Next.js comparte el código del diseño entre páginas, haciéndolo más eficiente. Al usar `IntlayerClientProvider` en el diseño, evitas reinicializarlo para cada página, mejorando el rendimiento y manteniendo un contexto de localización consistente en toda tu aplicación.
|
|
480
|
+
- **`IntlayerServerProvider`** se utiliza para proporcionar el local a los hijos del servidor. No puede establecerse en el diseño.
|
|
481
|
+
|
|
482
|
+
> El diseño y la página no pueden compartir un contexto de servidor común porque el sistema de contexto del servidor se basa en un almacén de datos por solicitud (a través del mecanismo de [React's cache](https://react.dev/reference/react/cache)), causando que cada "contexto" se recree para diferentes segmentos de la aplicación. Colocar el proveedor en un diseño compartido rompería este aislamiento, impidiendo la propagación correcta de los valores del contexto del servidor a tus componentes del servidor.
|
|
483
|
+
|
|
484
|
+
```tsx {4,7} fileName="src/components/ClientComponentExample.tsx" codeFormat="typescript"
|
|
485
|
+
"use client";
|
|
486
|
+
|
|
487
|
+
import type { FC } from "react";
|
|
488
|
+
import { useIntlayer } from "next-intlayer";
|
|
489
|
+
|
|
490
|
+
export const ClientComponentExample: FC = () => {
|
|
491
|
+
const content = useIntlayer("client-component-example"); // Crear declaración de contenido relacionada
|
|
492
|
+
|
|
493
|
+
return (
|
|
494
|
+
<div>
|
|
495
|
+
<h2>{content.title}</h2>
|
|
496
|
+
<p>{content.content}</p>
|
|
497
|
+
</div>
|
|
498
|
+
);
|
|
499
|
+
};
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
```jsx {3,6} fileName="src/components/ClientComponentExample.mjx" codeFormat="esm"
|
|
503
|
+
"use client";
|
|
504
|
+
|
|
505
|
+
import { useIntlayer } from "next-intlayer";
|
|
506
|
+
|
|
507
|
+
const ClientComponentExample = () => {
|
|
508
|
+
const content = useIntlayer("client-component-example"); // Crear declaración de contenido relacionada
|
|
509
|
+
|
|
510
|
+
return (
|
|
511
|
+
<div>
|
|
512
|
+
<h2>{content.title}</h2>
|
|
513
|
+
<p>{content.content}</p>
|
|
514
|
+
</div>
|
|
515
|
+
);
|
|
516
|
+
};
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
```jsx {3,6} fileName="src/components/ClientComponentExample.csx" codeFormat="commonjs"
|
|
520
|
+
"use client";
|
|
521
|
+
|
|
522
|
+
const { useIntlayer } = require("next-intlayer");
|
|
523
|
+
|
|
524
|
+
const ClientComponentExample = () => {
|
|
525
|
+
const content = useIntlayer("client-component-example"); // Crear declaración de contenido relacionada
|
|
526
|
+
|
|
527
|
+
return (
|
|
528
|
+
<div>
|
|
529
|
+
<h2>{content.title}</h2>
|
|
530
|
+
<p>{content.content}</p>
|
|
531
|
+
</div>
|
|
532
|
+
);
|
|
533
|
+
};
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
```tsx {2} fileName="src/components/ServerComponentExample.tsx" codeFormat="typescript"
|
|
537
|
+
import type { FC } from "react";
|
|
538
|
+
import { useIntlayer } from "next-intlayer/server";
|
|
539
|
+
|
|
540
|
+
export const ServerComponentExample: FC = () => {
|
|
541
|
+
const content = useIntlayer("server-component-example"); // Crear declaración de contenido relacionada
|
|
542
|
+
|
|
543
|
+
return (
|
|
544
|
+
<div>
|
|
545
|
+
<h2>{content.title}</h2>
|
|
546
|
+
<p>{content.content}</p>
|
|
547
|
+
</div>
|
|
548
|
+
);
|
|
549
|
+
};
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
```jsx {1} fileName="src/components/ServerComponentExample.mjx" codeFormat="esm"
|
|
553
|
+
import { useIntlayer } from "next-intlayer/server";
|
|
554
|
+
|
|
555
|
+
const ServerComponentExample = () => {
|
|
556
|
+
const content = useIntlayer("server-component-example"); // Crear declaración de contenido relacionada
|
|
557
|
+
|
|
558
|
+
return (
|
|
559
|
+
<div>
|
|
560
|
+
<h2>{content.title}</h2>
|
|
561
|
+
<p>{content.content}</p>
|
|
562
|
+
</div>
|
|
563
|
+
);
|
|
564
|
+
};
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
```jsx {1} fileName="src/components/ServerComponentExample.csx" codeFormat="commonjs"
|
|
568
|
+
const { useIntlayer } = require("next-intlayer/server");
|
|
569
|
+
|
|
570
|
+
const ServerComponentExample = () => {
|
|
571
|
+
const content = useIntlayer("server-component-example"); // Crear declaración de contenido relacionada
|
|
572
|
+
|
|
573
|
+
return (
|
|
574
|
+
<div>
|
|
575
|
+
<h2>{content.title}</h2>
|
|
576
|
+
<p>{content.content}</p>
|
|
577
|
+
</div>
|
|
578
|
+
);
|
|
579
|
+
};
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
> Si deseas usar tu contenido en un atributo `string`, como `alt`, `title`, `href`, `aria-label`, etc., debes llamar al valor de la función, como:
|
|
583
|
+
|
|
584
|
+
> ```jsx
|
|
585
|
+
>
|
|
586
|
+
> ```
|
|
587
|
+
|
|
588
|
+
> <img src={content.image.src.value} alt={content.image.value} />
|
|
589
|
+
|
|
590
|
+
> ```
|
|
591
|
+
>
|
|
592
|
+
> ```
|
|
593
|
+
|
|
594
|
+
> Para aprender más sobre el hook `useIntlayer`, consulta la [documentación](https://github.com/aymericzip/intlayer/blob/main/docs/es/packages/next-intlayer/useIntlayer.md).
|
|
595
|
+
|
|
596
|
+
### (Opcional) Paso 7: Configurar Middleware para la detección de locales
|
|
597
|
+
|
|
598
|
+
Configura middleware para detectar el idioma preferido del usuario:
|
|
599
|
+
|
|
600
|
+
```typescript fileName="src/middleware.ts" codeFormat="typescript"
|
|
601
|
+
export { intlayerMiddleware as middleware } from "next-intlayer/middleware";
|
|
602
|
+
|
|
603
|
+
export const config = {
|
|
604
|
+
matcher:
|
|
605
|
+
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
606
|
+
};
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
```javascript fileName="src/middleware.mjs" codeFormat="esm"
|
|
610
|
+
export { intlayerMiddleware as middleware } from "next-intlayer/middleware";
|
|
611
|
+
|
|
612
|
+
export const config = {
|
|
613
|
+
matcher:
|
|
614
|
+
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
615
|
+
};
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
```javascript fileName="src/middleware.cjs" codeFormat="commonjs"
|
|
619
|
+
const { intlayerMiddleware } = require("next-intlayer/middleware");
|
|
620
|
+
|
|
621
|
+
const config = {
|
|
622
|
+
matcher:
|
|
623
|
+
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
624
|
+
};
|
|
625
|
+
|
|
626
|
+
module.exports = { middleware: intlayerMiddleware, config };
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
> El `intlayerMiddleware` se utiliza para detectar el idioma preferido del usuario y redirigirlo a la URL adecuada según lo especificado en la [configuración](https://github.com/aymericzip/intlayer/blob/main/docs/es/configuration.md). Además, permite guardar el idioma preferido del usuario en una cookie.
|
|
630
|
+
|
|
631
|
+
### (Opcional) Paso 8: Internacionalización de tus metadatos
|
|
632
|
+
|
|
633
|
+
En caso de que desees internacionalizar tus metadatos, como el título de tu página, puedes usar la función `generateMetadata` proporcionada por Next.js. Dentro de la función, utiliza la función `getTranslation` para traducir tus metadatos.
|
|
634
|
+
|
|
635
|
+
````typescript fileName="src/app/[locale]/layout.tsx or src/app/[locale]/page.tsx" codeFormat="typescript"
|
|
636
|
+
import {
|
|
637
|
+
type IConfigLocales,
|
|
638
|
+
getTranslation,
|
|
639
|
+
getMultilingualUrls,
|
|
640
|
+
} from "intlayer";
|
|
641
|
+
import type { Metadata } from "next";
|
|
642
|
+
import type { LocalPromiseParams } from "next-intlayer";
|
|
643
|
+
|
|
644
|
+
export const generateMetadata = async ({
|
|
645
|
+
params,
|
|
646
|
+
}: LocalPromiseParams): Promise<Metadata> => {
|
|
647
|
+
const { locale } = await params;
|
|
648
|
+
const t = <T>(content: IConfigLocales<T>) => getTranslation(content, locale);
|
|
649
|
+
|
|
650
|
+
/**
|
|
651
|
+
* Genera un objeto que contiene todas las URLs para cada local.
|
|
652
|
+
*
|
|
653
|
+
* Ejemplo:
|
|
654
|
+
* ```ts
|
|
655
|
+
* getMultilingualUrls('/about');
|
|
656
|
+
*
|
|
657
|
+
* // Devuelve
|
|
658
|
+
* // {
|
|
659
|
+
* // en: '/about',
|
|
660
|
+
* // fr: '/fr/about',
|
|
661
|
+
* // es: '/es/about',
|
|
662
|
+
* // }
|
|
663
|
+
* ```
|
|
664
|
+
*/
|
|
665
|
+
const multilingualUrls = getMultilingualUrls("/");
|
|
666
|
+
|
|
667
|
+
return {
|
|
668
|
+
title: t<string>({
|
|
669
|
+
en: "My title",
|
|
670
|
+
fr: "Mon titre",
|
|
671
|
+
es: "Mi título",
|
|
672
|
+
}),
|
|
673
|
+
description: t({
|
|
674
|
+
en: "My description",
|
|
675
|
+
fr: "Ma description",
|
|
676
|
+
es: "Mi descripción",
|
|
677
|
+
}),
|
|
678
|
+
alternates: {
|
|
679
|
+
canonical: multilingualUrls[locale as keyof typeof multilingualUrls],
|
|
680
|
+
languages: { ...multilingualUrls, "x-default": "/" },
|
|
681
|
+
},
|
|
682
|
+
openGraph: {
|
|
683
|
+
url: multilingualUrls[locale],
|
|
684
|
+
},
|
|
685
|
+
};
|
|
686
|
+
};
|
|
687
|
+
|
|
688
|
+
// ... Resto del código
|
|
689
|
+
````
|
|
690
|
+
|
|
691
|
+
````javascript fileName="src/app/[locale]/layout.mjs or src/app/[locale]/page.mjs" codeFormat="esm"
|
|
692
|
+
import { getTranslation, getMultilingualUrls } from "intlayer";
|
|
693
|
+
|
|
694
|
+
export const generateMetadata = async ({ params }) => {
|
|
695
|
+
const { locale } = await params;
|
|
696
|
+
const t = (content) => getTranslation(content, locale);
|
|
697
|
+
|
|
698
|
+
/**
|
|
699
|
+
* Genera un objeto que contiene todas las URLs para cada local.
|
|
700
|
+
*
|
|
701
|
+
* Ejemplo:
|
|
702
|
+
* ```ts
|
|
703
|
+
* getMultilingualUrls('/about');
|
|
704
|
+
*
|
|
705
|
+
* // Devuelve
|
|
706
|
+
* // {
|
|
707
|
+
* // en: '/about',
|
|
708
|
+
* // fr: '/fr/about',
|
|
709
|
+
* // es: '/es/about'
|
|
710
|
+
* // }
|
|
711
|
+
* ```
|
|
712
|
+
*/
|
|
713
|
+
const multilingualUrls = getMultilingualUrls("/");
|
|
714
|
+
|
|
715
|
+
return {
|
|
716
|
+
title: t({
|
|
717
|
+
en: "My title",
|
|
718
|
+
fr: "Mon titre",
|
|
719
|
+
es: "Mi título",
|
|
720
|
+
}),
|
|
721
|
+
description: t({
|
|
722
|
+
en: "My description",
|
|
723
|
+
fr: "Ma description",
|
|
724
|
+
es: "Mi descripción",
|
|
725
|
+
}),
|
|
726
|
+
alternates: {
|
|
727
|
+
canonical: multilingualUrls[locale],
|
|
728
|
+
languages: { ...multilingualUrls, "x-default": "/" },
|
|
729
|
+
},
|
|
730
|
+
openGraph: {
|
|
731
|
+
url: multilingualUrls[locale],
|
|
732
|
+
},
|
|
733
|
+
};
|
|
734
|
+
};
|
|
735
|
+
|
|
736
|
+
// ... Resto del código
|
|
737
|
+
````
|
|
738
|
+
|
|
739
|
+
````javascript fileName="src/app/[locale]/layout.cjs or src/app/[locale]/page.cjs" codeFormat="commonjs"
|
|
740
|
+
const { getTranslation, getMultilingualUrls } = require("intlayer");
|
|
741
|
+
|
|
742
|
+
const generateMetadata = async ({ params }) => {
|
|
743
|
+
const { locale } = await params;
|
|
744
|
+
|
|
745
|
+
const t = (content) => getTranslation(content, locale);
|
|
746
|
+
|
|
747
|
+
/**
|
|
748
|
+
* Genera un objeto que contiene todas las URLs para cada local.
|
|
749
|
+
*
|
|
750
|
+
* Ejemplo:
|
|
751
|
+
* ```ts
|
|
752
|
+
* getMultilingualUrls('/about');
|
|
753
|
+
*
|
|
754
|
+
* // Devuelve
|
|
755
|
+
* // {
|
|
756
|
+
* // en: '/about',
|
|
757
|
+
* // fr: '/fr/about',
|
|
758
|
+
* // es: '/es/about'
|
|
759
|
+
* // }
|
|
760
|
+
* ```
|
|
761
|
+
*/
|
|
762
|
+
const multilingualUrls = getMultilingualUrls("/");
|
|
763
|
+
|
|
764
|
+
return {
|
|
765
|
+
title: t({
|
|
766
|
+
en: "My title",
|
|
767
|
+
fr: "Mon titre",
|
|
768
|
+
es: "Mi título",
|
|
769
|
+
}),
|
|
770
|
+
description: t({
|
|
771
|
+
en: "My description",
|
|
772
|
+
fr: "Ma description",
|
|
773
|
+
es: "Mi descripción",
|
|
774
|
+
}),
|
|
775
|
+
alternates: {
|
|
776
|
+
canonical: multilingualUrls[locale],
|
|
777
|
+
languages: { ...multilingualUrls, "x-default": "/" },
|
|
778
|
+
},
|
|
779
|
+
openGraph: {
|
|
780
|
+
url: multilingualUrls[locale],
|
|
781
|
+
},
|
|
782
|
+
};
|
|
783
|
+
};
|
|
784
|
+
|
|
785
|
+
module.exports = { generateMetadata };
|
|
786
|
+
|
|
787
|
+
// ... Resto del código
|
|
788
|
+
````
|
|
789
|
+
|
|
790
|
+
> Aprende más sobre la optimización de metadatos [en la documentación oficial de Next.js](https://nextjs.org/docs/app/building-your-application/optimizing/metadata).
|
|
791
|
+
|
|
792
|
+
### (Opcional) Paso 9: Internacionalización de tu sitemap.xml y robots.txt
|
|
793
|
+
|
|
794
|
+
Para internacionalizar tu `sitemap.xml` y `robots.txt`, puedes usar la función `getMultilingualUrls` proporcionada por Intlayer. Esta función te permite generar URLs multilingües para tu sitemap.
|
|
795
|
+
|
|
796
|
+
```tsx fileName="src/app/sitemap.ts" codeFormat="typescript"
|
|
797
|
+
import { getMultilingualUrls } from "intlayer";
|
|
798
|
+
import type { MetadataRoute } from "next";
|
|
799
|
+
|
|
800
|
+
const sitemap = (): MetadataRoute.Sitemap => [
|
|
801
|
+
{
|
|
802
|
+
url: "https://example.com",
|
|
803
|
+
alternates: {
|
|
804
|
+
languages: { ...getMultilingualUrls("https://example.com") },
|
|
805
|
+
},
|
|
806
|
+
},
|
|
807
|
+
{
|
|
808
|
+
url: "https://example.com/login",
|
|
809
|
+
alternates: {
|
|
810
|
+
languages: { ...getMultilingualUrls("https://example.com/login") },
|
|
811
|
+
},
|
|
812
|
+
},
|
|
813
|
+
{
|
|
814
|
+
url: "https://example.com/register",
|
|
815
|
+
alternates: {
|
|
816
|
+
languages: { ...getMultilingualUrls("https://example.com/register") },
|
|
817
|
+
},
|
|
818
|
+
},
|
|
819
|
+
];
|
|
820
|
+
|
|
821
|
+
export default sitemap;
|
|
822
|
+
```
|
|
823
|
+
|
|
824
|
+
```jsx fileName="src/app/sitemap.mjx" codeFormat="esm"
|
|
825
|
+
import { getMultilingualUrls } from "intlayer";
|
|
826
|
+
|
|
827
|
+
const sitemap = () => [
|
|
828
|
+
{
|
|
829
|
+
url: "https://example.com",
|
|
830
|
+
alternates: {
|
|
831
|
+
languages: { ...getMultilingualUrls("https://example.com") },
|
|
832
|
+
},
|
|
833
|
+
},
|
|
834
|
+
{
|
|
835
|
+
url: "https://example.com/login",
|
|
836
|
+
alternates: {
|
|
837
|
+
languages: { ...getMultilingualUrls("https://example.com/login") },
|
|
838
|
+
},
|
|
839
|
+
},
|
|
840
|
+
{
|
|
841
|
+
url: "https://example.com/register",
|
|
842
|
+
alternates: {
|
|
843
|
+
languages: { ...getMultilingualUrls("https://example.com/register") },
|
|
844
|
+
},
|
|
845
|
+
},
|
|
846
|
+
];
|
|
847
|
+
|
|
848
|
+
export default sitemap;
|
|
849
|
+
```
|
|
850
|
+
|
|
851
|
+
```jsx fileName="src/app/sitemap.csx" codeFormat="commonjs"
|
|
852
|
+
const { getMultilingualUrls } = require("intlayer");
|
|
853
|
+
|
|
854
|
+
const sitemap = () => [
|
|
855
|
+
{
|
|
856
|
+
url: "https://example.com",
|
|
857
|
+
alternates: {
|
|
858
|
+
languages: { ...getMultilingualUrls("https://example.com") },
|
|
859
|
+
},
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
url: "https://example.com/login",
|
|
863
|
+
alternates: {
|
|
864
|
+
languages: { ...getMultilingualUrls("https://example.com/login") },
|
|
865
|
+
},
|
|
866
|
+
},
|
|
867
|
+
{
|
|
868
|
+
url: "https://example.com/register",
|
|
869
|
+
alternates: {
|
|
870
|
+
languages: { ...getMultilingualUrls("https://example.com/register") },
|
|
871
|
+
},
|
|
872
|
+
},
|
|
873
|
+
];
|
|
874
|
+
|
|
875
|
+
module.exports = sitemap;
|
|
876
|
+
```
|
|
877
|
+
|
|
878
|
+
```tsx fileName="src/app/robots.ts" codeFormat="typescript"
|
|
879
|
+
import type { MetadataRoute } from "next";
|
|
880
|
+
import { getMultilingualUrls } from "intlayer";
|
|
881
|
+
|
|
882
|
+
const getAllMultilingualUrls = (urls: string[]) =>
|
|
883
|
+
urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]);
|
|
884
|
+
|
|
885
|
+
const robots = (): MetadataRoute.Robots => ({
|
|
886
|
+
rules: {
|
|
887
|
+
userAgent: "*",
|
|
888
|
+
allow: ["/"],
|
|
889
|
+
disallow: getAllMultilingualUrls(["/login", "/register"]),
|
|
890
|
+
},
|
|
891
|
+
host: "https://example.com",
|
|
892
|
+
sitemap: `https://example.com/sitemap.xml`,
|
|
893
|
+
});
|
|
894
|
+
|
|
895
|
+
export default robots;
|
|
896
|
+
```
|
|
897
|
+
|
|
898
|
+
```jsx fileName="src/app/robots.mjx" codeFormat="esm"
|
|
899
|
+
import { getMultilingualUrls } from "intlayer";
|
|
900
|
+
|
|
901
|
+
const getAllMultilingualUrls = (urls) =>
|
|
902
|
+
urls.flatMap((url) => Object.values(getMultilingualUrls(url)));
|
|
903
|
+
|
|
904
|
+
const robots = () => ({
|
|
905
|
+
rules: {
|
|
906
|
+
userAgent: "*",
|
|
907
|
+
allow: ["/"],
|
|
908
|
+
disallow: getAllMultilingualUrls(["/login", "/register"]),
|
|
909
|
+
},
|
|
910
|
+
host: "https://example.com",
|
|
911
|
+
sitemap: `https://example.com/sitemap.xml`,
|
|
912
|
+
});
|
|
913
|
+
|
|
914
|
+
export default robots;
|
|
915
|
+
```
|
|
916
|
+
|
|
917
|
+
```jsx fileName="src/app/robots.csx" codeFormat="commonjs"
|
|
918
|
+
const { getMultilingualUrls } = require("intlayer");
|
|
919
|
+
|
|
920
|
+
const getAllMultilingualUrls = (urls) =>
|
|
921
|
+
urls.flatMap((url) => Object.values(getMultilingualUrls(url)));
|
|
922
|
+
|
|
923
|
+
const robots = () => ({
|
|
924
|
+
rules: {
|
|
925
|
+
userAgent: "*",
|
|
926
|
+
allow: ["/"],
|
|
927
|
+
disallow: getAllMultilingualUrls(["/login", "/register"]),
|
|
928
|
+
},
|
|
929
|
+
host: "https://example.com",
|
|
930
|
+
sitemap: `https://example.com/sitemap.xml`,
|
|
931
|
+
});
|
|
932
|
+
|
|
933
|
+
module.exports = robots;
|
|
934
|
+
```
|
|
935
|
+
|
|
936
|
+
> Aprende más sobre la optimización del sitemap [en la documentación oficial de Next.js](https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap). Aprende más sobre la optimización del robots.txt [en la documentación oficial de Next.js](https://nextjs.org/docs/app/api-reference/file-conventions/metadata/robots).
|
|
937
|
+
|
|
938
|
+
### (Opcional) Paso 10: Cambiar el idioma de tu contenido
|
|
939
|
+
|
|
940
|
+
Para cambiar el idioma de tu contenido en Next.js, la forma recomendada es usar el componente `Link` para redirigir a los usuarios a la página localizada apropiada. El componente `Link` permite la precarga de la página, lo que ayuda a evitar una recarga completa de la página.
|
|
941
|
+
|
|
942
|
+
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
943
|
+
"use client";
|
|
944
|
+
|
|
945
|
+
import type { FC } from "react";
|
|
946
|
+
import {
|
|
947
|
+
Locales,
|
|
948
|
+
getHTMLTextDir,
|
|
949
|
+
getLocaleName,
|
|
950
|
+
getLocalizedUrl,
|
|
951
|
+
} from "intlayer";
|
|
952
|
+
import { useLocale } from "next-intlayer";
|
|
953
|
+
import Link from "next/link";
|
|
954
|
+
|
|
955
|
+
export const LocaleSwitcher: FC = () => {
|
|
956
|
+
const { locale, pathWithoutLocale, availableLocales } = useLocale();
|
|
957
|
+
const { setLocaleCookie } = useLocaleCookie();
|
|
958
|
+
|
|
959
|
+
return (
|
|
960
|
+
<div>
|
|
961
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
962
|
+
<div id="localePopover" popover="auto">
|
|
963
|
+
{availableLocales.map((localeItem) => (
|
|
964
|
+
<Link
|
|
965
|
+
href={getLocalizedUrl(pathWithoutLocale, localeItem)}
|
|
966
|
+
hrefLang={localeItem}
|
|
967
|
+
key={localeItem}
|
|
968
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
969
|
+
onClick={() => setLocaleCookie(localeItem)}
|
|
970
|
+
>
|
|
971
|
+
<span>
|
|
972
|
+
{/* Locale - e.g. FR */}
|
|
973
|
+
{localeItem}
|
|
974
|
+
</span>
|
|
975
|
+
<span>
|
|
976
|
+
{/* Idioma en su propio local - e.g. Français */}
|
|
977
|
+
{getLocaleName(localeItem, locale)}
|
|
978
|
+
</span>
|
|
979
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
980
|
+
{/* Idioma en el local actual - e.g. Francés con local actual configurado en Locales.SPANISH */}
|
|
981
|
+
{getLocaleName(localeItem)}
|
|
982
|
+
</span>
|
|
983
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
984
|
+
{/* Idioma en inglés - e.g. French */}
|
|
985
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
986
|
+
</span>
|
|
987
|
+
</Link>
|
|
988
|
+
))}
|
|
989
|
+
</div>
|
|
990
|
+
</div>
|
|
991
|
+
);
|
|
992
|
+
};
|
|
993
|
+
```
|
|
994
|
+
|
|
995
|
+
```jsx fileName="src/components/LocaleSwitcher.msx" codeFormat="esm"
|
|
996
|
+
"use client";
|
|
997
|
+
|
|
998
|
+
import {
|
|
999
|
+
Locales,
|
|
1000
|
+
getHTMLTextDir,
|
|
1001
|
+
getLocaleName,
|
|
1002
|
+
getLocalizedUrl,
|
|
1003
|
+
} from "intlayer";
|
|
1004
|
+
import { useLocale } from "next-intlayer";
|
|
1005
|
+
import Link from "next/link";
|
|
1006
|
+
|
|
1007
|
+
export const LocaleSwitcher = () => {
|
|
1008
|
+
const { locale, pathWithoutLocale, availableLocales } = useLocale();
|
|
1009
|
+
const { setLocaleCookie } = useLocaleCookie();
|
|
1010
|
+
|
|
1011
|
+
return (
|
|
1012
|
+
<div>
|
|
1013
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
1014
|
+
<div id="localePopover" popover="auto">
|
|
1015
|
+
{availableLocales.map((localeItem) => (
|
|
1016
|
+
<Link
|
|
1017
|
+
href={getLocalizedUrl(pathWithoutLocale, localeItem)}
|
|
1018
|
+
hrefLang={localeItem}
|
|
1019
|
+
key={localeItem}
|
|
1020
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1021
|
+
onClick={() => setLocaleCookie(localeItem)}
|
|
1022
|
+
>
|
|
1023
|
+
<span>
|
|
1024
|
+
{/* Locale - e.g. FR */}
|
|
1025
|
+
{localeItem}
|
|
1026
|
+
</span>
|
|
1027
|
+
<span>
|
|
1028
|
+
{/* Idioma en su propio local - e.g. Français */}
|
|
1029
|
+
{getLocaleName(localeItem, locale)}
|
|
1030
|
+
</span>
|
|
1031
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1032
|
+
{/* Idioma en el local actual - e.g. Francés con local actual configurado en Locales.SPANISH */}
|
|
1033
|
+
{getLocaleName(localeItem)}
|
|
1034
|
+
</span>
|
|
1035
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1036
|
+
{/* Idioma en inglés - e.g. French */}
|
|
1037
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1038
|
+
</span>
|
|
1039
|
+
</Link>
|
|
1040
|
+
))}
|
|
1041
|
+
</div>
|
|
1042
|
+
</div>
|
|
1043
|
+
);
|
|
1044
|
+
};
|
|
1045
|
+
```
|
|
1046
|
+
|
|
1047
|
+
```jsx fileName="src/components/LocaleSwitcher.csx" codeFormat="commonjs"
|
|
1048
|
+
"use client";
|
|
1049
|
+
|
|
1050
|
+
const {
|
|
1051
|
+
Locales,
|
|
1052
|
+
getHTMLTextDir,
|
|
1053
|
+
getLocaleName,
|
|
1054
|
+
getLocalizedUrl,
|
|
1055
|
+
} = require("intlayer");
|
|
1056
|
+
const { useLocale } = require("next-intlayer");
|
|
1057
|
+
const Link = require("next/link");
|
|
1058
|
+
|
|
1059
|
+
export const LocaleSwitcher = () => {
|
|
1060
|
+
const { locale, pathWithoutLocale, availableLocales } = useLocale();
|
|
1061
|
+
const { setLocaleCookie } = useLocaleCookie();
|
|
1062
|
+
|
|
1063
|
+
return (
|
|
1064
|
+
<div>
|
|
1065
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
1066
|
+
<div id="localePopover" popover="auto">
|
|
1067
|
+
{availableLocales.map((localeItem) => (
|
|
1068
|
+
<Link
|
|
1069
|
+
href={getLocalizedUrl(pathWithoutLocale, localeItem)}
|
|
1070
|
+
hrefLang={localeItem}
|
|
1071
|
+
key={localeItem}
|
|
1072
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1073
|
+
onClick={() => setLocaleCookie(localeItem)}
|
|
1074
|
+
>
|
|
1075
|
+
<span>
|
|
1076
|
+
{/* Locale - e.g. FR */}
|
|
1077
|
+
{localeItem}
|
|
1078
|
+
</span>
|
|
1079
|
+
<span>
|
|
1080
|
+
{/* Idioma en su propio local - e.g. Français */}
|
|
1081
|
+
{getLocaleName(localeItem, locale)}
|
|
1082
|
+
</span>
|
|
1083
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1084
|
+
{/* Idioma en el local actual - e.g. Francés con local actual configurado en Locales.SPANISH */}
|
|
1085
|
+
{getLocaleName(localeItem)}
|
|
1086
|
+
</span>
|
|
1087
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1088
|
+
{/* Idioma en inglés - e.g. French */}
|
|
1089
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1090
|
+
</span>
|
|
1091
|
+
</Link>
|
|
1092
|
+
))}
|
|
1093
|
+
</div>
|
|
1094
|
+
</div>
|
|
1095
|
+
);
|
|
1096
|
+
};
|
|
1097
|
+
```
|
|
1098
|
+
|
|
1099
|
+
> Referencias de documentación:
|
|
1100
|
+
|
|
1101
|
+
> - [Hook `useLocale`](https://github.com/aymericzip/intlayer/blob/main/docs/es/packages/next-intlayer/useLocale.md)
|
|
1102
|
+
|
|
1103
|
+
> - [Hook `getLocaleName`](https://github.com/aymericzip/intlayer/blob/main/docs/es/packages/intlayer/getLocaleName.md)
|
|
1104
|
+
|
|
1105
|
+
> - [Hook `getLocalizedUrl`](https://github.com/aymericzip/intlayer/blob/main/docs/es/packages/intlayer/getLocalizedUrl.md)
|
|
1106
|
+
|
|
1107
|
+
> - [Hook `getHTMLTextDir`](https://github.com/aymericzip/intlayer/blob/main/docs/es/packages/intlayer/getHTMLTextDir.md)
|
|
1108
|
+
|
|
1109
|
+
> - [Atributo `hrefLang`](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=fr)
|
|
1110
|
+
|
|
1111
|
+
> - [Atributo `lang`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)
|
|
1112
|
+
|
|
1113
|
+
> - [Atributo `dir`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir)
|
|
1114
|
+
|
|
1115
|
+
> - [Atributo `aria-current`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)
|
|
1116
|
+
|
|
1117
|
+
### (Opcional) Paso 11: Crear un componente de enlace localizado
|
|
1118
|
+
|
|
1119
|
+
Para garantizar que la navegación de tu aplicación respete el local actual, puedes crear un componente `Link` personalizado. Este componente automáticamente antepone las URLs internas con el idioma actual, de modo que, por ejemplo, cuando un usuario que habla francés haga clic en un enlace a la página "Acerca de", sea redirigido a `/fr/about` en lugar de `/about`.
|
|
1120
|
+
|
|
1121
|
+
Este comportamiento es útil por varias razones:
|
|
1122
|
+
|
|
1123
|
+
- **SEO y experiencia del usuario**: Las URLs localizadas ayudan a los motores de búsqueda a indexar correctamente las páginas específicas de cada idioma y proporcionan a los usuarios contenido en su idioma preferido.
|
|
1124
|
+
- **Consistencia**: Al usar un enlace localizado en toda tu aplicación, garantizas que la navegación se mantenga dentro del contexto del idioma actual, evitando cambios inesperados de idioma.
|
|
1125
|
+
- **Mantenibilidad**: Centralizar la lógica de localización en un único componente simplifica la gestión de URLs, haciendo que tu base de código sea más fácil de mantener y ampliar a medida que tu aplicación crece.
|
|
1126
|
+
|
|
1127
|
+
A continuación, se muestra la implementación de un componente `Link` localizado en TypeScript:
|
|
1128
|
+
|
|
1129
|
+
```tsx fileName="src/components/Link.tsx" codeFormat="typescript"
|
|
1130
|
+
"use client";
|
|
1131
|
+
|
|
1132
|
+
import { getLocalizedUrl } from "intlayer";
|
|
1133
|
+
import NextLink, { type LinkProps as NextLinkProps } from "next/link";
|
|
1134
|
+
import { useLocale } from "next-intlayer";
|
|
1135
|
+
import type { PropsWithChildren, FC } from "react";
|
|
1136
|
+
|
|
1137
|
+
/**
|
|
1138
|
+
* Función de utilidad para comprobar si una URL dada es externa.
|
|
1139
|
+
* Si la URL comienza con http:// o https://, se considera externa.
|
|
1140
|
+
*/
|
|
1141
|
+
export const checkIsExternalLink = (href?: string): boolean =>
|
|
1142
|
+
/^https?:\/\//.test(href ?? "");
|
|
1143
|
+
|
|
1144
|
+
/**
|
|
1145
|
+
* Un componente Link personalizado que adapta el atributo href según el idioma actual.
|
|
1146
|
+
* Para enlaces internos, utiliza `getLocalizedUrl` para anteponer la URL con el idioma (por ejemplo, /fr/about).
|
|
1147
|
+
* Esto asegura que la navegación se mantenga dentro del mismo contexto de idioma.
|
|
1148
|
+
*/
|
|
1149
|
+
export const Link: FC<PropsWithChildren<NextLinkProps>> = ({
|
|
1150
|
+
href,
|
|
1151
|
+
children,
|
|
1152
|
+
...props
|
|
1153
|
+
}) => {
|
|
1154
|
+
const { locale } = useLocale();
|
|
1155
|
+
const isExternalLink = checkIsExternalLink(href.toString());
|
|
1156
|
+
|
|
1157
|
+
// Si el enlace es interno y se proporciona un href válido, obtiene la URL localizada.
|
|
1158
|
+
const hrefI18n: NextLinkProps["href"] =
|
|
1159
|
+
href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href;
|
|
1160
|
+
|
|
1161
|
+
return (
|
|
1162
|
+
<NextLink href={hrefI18n} {...props}>
|
|
1163
|
+
{children}
|
|
1164
|
+
</NextLink>
|
|
1165
|
+
);
|
|
1166
|
+
};
|
|
1167
|
+
```
|
|
1168
|
+
|
|
1169
|
+
```jsx fileName="src/components/Link.mjx" codeFormat="esm"
|
|
1170
|
+
"use client";
|
|
1171
|
+
|
|
1172
|
+
import { getLocalizedUrl } from "intlayer";
|
|
1173
|
+
import NextLink from "next/link";
|
|
1174
|
+
import { useLocale } from "next-intlayer";
|
|
1175
|
+
|
|
1176
|
+
/**
|
|
1177
|
+
* Función de utilidad para comprobar si una URL dada es externa.
|
|
1178
|
+
* Si la URL comienza con http:// o https://, se considera externa.
|
|
1179
|
+
*/
|
|
1180
|
+
export const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1181
|
+
|
|
1182
|
+
/**
|
|
1183
|
+
* Un componente Link personalizado que adapta el atributo href según el idioma actual.
|
|
1184
|
+
* Para enlaces internos, utiliza `getLocalizedUrl` para anteponer la URL con el idioma (por ejemplo, /fr/about).
|
|
1185
|
+
* Esto asegura que la navegación se mantenga dentro del mismo contexto de idioma.
|
|
1186
|
+
*/
|
|
1187
|
+
export const Link = ({ href, children, ...props }) => {
|
|
1188
|
+
const { locale } = useLocale();
|
|
1189
|
+
const isExternalLink = checkIsExternalLink(href.toString());
|
|
1190
|
+
|
|
1191
|
+
// Si el enlace es interno y se proporciona un href válido, obtiene la URL localizada.
|
|
1192
|
+
const hrefI18n =
|
|
1193
|
+
href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href;
|
|
1194
|
+
|
|
1195
|
+
return (
|
|
1196
|
+
<NextLink href={hrefI18n} {...props}>
|
|
1197
|
+
{children}
|
|
1198
|
+
</NextLink>
|
|
1199
|
+
);
|
|
1200
|
+
};
|
|
1201
|
+
```
|
|
1202
|
+
|
|
1203
|
+
```jsx fileName="src/components/Link.csx" codeFormat="commonjs"
|
|
1204
|
+
"use client";
|
|
1205
|
+
|
|
1206
|
+
const { getLocalizedUrl } = require("intlayer");
|
|
1207
|
+
const NextLink = require("next/link");
|
|
1208
|
+
const { useLocale } = require("next-intlayer");
|
|
1209
|
+
|
|
1210
|
+
/**
|
|
1211
|
+
* Función de utilidad para comprobar si una URL dada es externa.
|
|
1212
|
+
* Si la URL comienza con http:// o https://, se considera externa.
|
|
1213
|
+
*/
|
|
1214
|
+
const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1215
|
+
|
|
1216
|
+
/**
|
|
1217
|
+
* Un componente Link personalizado que adapta el atributo href según el idioma actual.
|
|
1218
|
+
* Para enlaces internos, utiliza `getLocalizedUrl` para anteponer la URL con el idioma (por ejemplo, /fr/about).
|
|
1219
|
+
* Esto asegura que la navegación se mantenga dentro del mismo contexto de idioma.
|
|
1220
|
+
*/
|
|
1221
|
+
const Link = ({ href, children, ...props }) => {
|
|
1222
|
+
const { locale } = useLocale();
|
|
1223
|
+
const isExternalLink = checkIsExternalLink(href.toString());
|
|
1224
|
+
|
|
1225
|
+
// Si el enlace es interno y se proporciona un href válido, obtiene la URL localizada.
|
|
1226
|
+
const hrefI18n =
|
|
1227
|
+
href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href;
|
|
1228
|
+
|
|
1229
|
+
return (
|
|
1230
|
+
<NextLink href={hrefI18n} {...props}>
|
|
1231
|
+
{children}
|
|
1232
|
+
</NextLink>
|
|
1233
|
+
);
|
|
1234
|
+
};
|
|
1235
|
+
```
|
|
1236
|
+
|
|
1237
|
+
#### Cómo funciona
|
|
1238
|
+
|
|
1239
|
+
- **Detección de enlaces externos**:
|
|
1240
|
+
La función auxiliar `checkIsExternalLink` determina si una URL es externa. Los enlaces externos se dejan sin cambios porque no necesitan localización.
|
|
1241
|
+
|
|
1242
|
+
- **Obtención del idioma actual**:
|
|
1243
|
+
El hook `useLocale` proporciona el idioma actual (por ejemplo, `fr` para francés).
|
|
1244
|
+
|
|
1245
|
+
- **Localización de la URL**:
|
|
1246
|
+
Para enlaces internos (es decir, no externos), se utiliza `getLocalizedUrl` para anteponer automáticamente la URL con el idioma actual. Esto significa que si tu usuario está en francés, pasar `/about` como el `href` lo transformará en `/fr/about`.
|
|
1247
|
+
|
|
1248
|
+
- **Devolución del enlace**:
|
|
1249
|
+
El componente devuelve un elemento `<a>` con la URL localizada, asegurando que la navegación sea consistente con el idioma.
|
|
1250
|
+
|
|
1251
|
+
Al integrar este componente `Link` en toda tu aplicación, mantienes una experiencia de usuario coherente y consciente del idioma, mientras también te beneficias de un mejor SEO y usabilidad.
|
|
1252
|
+
|
|
1253
|
+
### (Opcional) Paso 12: Optimiza el tamaño de tu bundle
|
|
1254
|
+
|
|
1255
|
+
Cuando usas `next-intlayer`, los diccionarios se incluyen en el bundle de cada página por defecto. Para optimizar el tamaño de tu bundle, Intlayer ofrece un plugin SWC opcional que reemplaza de forma inteligente las llamadas a `useIntlayer` usando macros. Esto asegura que los diccionarios solo se incluyan en los bundles de las páginas que realmente los utilizan.
|
|
1256
|
+
|
|
1257
|
+
Para habilitar esta optimización, instala el paquete `@intlayer/swc`. Una vez instalado, `next-intlayer` lo detectará y lo usará automáticamente:
|
|
1258
|
+
|
|
1259
|
+
```bash packageManager="npm"
|
|
1260
|
+
npm install @intlayer/swc --save-dev
|
|
1261
|
+
```
|
|
1262
|
+
|
|
1263
|
+
```bash packageManager="pnpm"
|
|
1264
|
+
pnpm add @intlayer/swc --save-dev
|
|
1265
|
+
```
|
|
1266
|
+
|
|
1267
|
+
```bash packageManager="yarn"
|
|
1268
|
+
yarn add @intlayer/swc --save-dev
|
|
1269
|
+
```
|
|
1270
|
+
|
|
1271
|
+
> Nota: Esta optimización solo está disponible para Next.js 13 y superior.
|
|
1272
|
+
|
|
1273
|
+
> Nota: Este paquete no se instala por defecto porque los plugins SWC aún son experimentales en Next.js. Puede cambiar en el futuro.
|
|
1274
|
+
|
|
1275
|
+
### Configurar TypeScript
|
|
1276
|
+
|
|
1277
|
+
Intlayer utiliza la ampliación de módulos para obtener los beneficios de TypeScript y fortalecer tu base de código.
|
|
1278
|
+
|
|
1279
|
+

|
|
1280
|
+
|
|
1281
|
+

|
|
1282
|
+
|
|
1283
|
+
Asegúrate de que tu configuración de TypeScript incluya los tipos autogenerados.
|
|
1284
|
+
|
|
1285
|
+
```json5 fileName="tsconfig.json"
|
|
1286
|
+
{
|
|
1287
|
+
// ... Tus configuraciones existentes de TypeScript
|
|
1288
|
+
"include": [
|
|
1289
|
+
// ... Tus configuraciones existentes de TypeScript
|
|
1290
|
+
".intlayer/**/*.ts", // Incluir los tipos autogenerados
|
|
1291
|
+
],
|
|
1292
|
+
}
|
|
1293
|
+
```
|
|
1294
|
+
|
|
1295
|
+
### Configuración de Git
|
|
1296
|
+
|
|
1297
|
+
Se recomienda ignorar los archivos generados por Intlayer. Esto te permite evitar comprometerlos en tu repositorio de Git.
|
|
1298
|
+
|
|
1299
|
+
Para hacer esto, puedes agregar las siguientes instrucciones a tu archivo `.gitignore`:
|
|
1300
|
+
|
|
1301
|
+
```plaintext fileName=".gitignore"
|
|
1302
|
+
# Ignorar los archivos generados por Intlayer
|
|
1303
|
+
.intlayer
|
|
1304
|
+
```
|
|
1305
|
+
|
|
1306
|
+
### Ir más allá
|
|
1307
|
+
|
|
1308
|
+
Para ir más allá, puedes implementar el [editor visual](https://github.com/aymericzip/intlayer/blob/main/docs/es/intlayer_visual_editor.md) o externalizar tu contenido utilizando el [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/es/intlayer_CMS.md).
|