@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,1318 @@
|
|
|
1
|
+
# Начало работы с интернационализацией (i18n) с Intlayer и 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
|
+
Смотрите [шаблон приложения](https://github.com/aymericzip/intlayer-next-15-template) на GitHub.
|
|
6
|
+
|
|
7
|
+
## Что такое Intlayer?
|
|
8
|
+
|
|
9
|
+
**Intlayer** , это инновационная, открытая библиотека интернационализации (i18n), разработанная для упрощения поддержки многоязычности в современных веб-приложениях. Intlayer бесшовно интегрируется с последней версией фреймворка **Next.js 15**, включая его мощный **App Router**. Она оптимизирована для работы с **Server Components** для эффективного рендеринга и полностью совместима с [**Turbopack**](https://nextjs.org/docs/architecture/turbopack).
|
|
10
|
+
|
|
11
|
+
С помощью Intlayer вы можете:
|
|
12
|
+
|
|
13
|
+
- **Легко управлять переводами** с использованием декларативных словарей на уровне компонентов.
|
|
14
|
+
- **Динамически локализовать метаданные**, маршруты и контент.
|
|
15
|
+
- **Получать доступ к переводам как на стороне клиента, так и на стороне сервера**.
|
|
16
|
+
- **Обеспечивать поддержку TypeScript** с автогенерируемыми типами, улучшая автодополнение и обнаружение ошибок.
|
|
17
|
+
- **Использовать расширенные функции**, такие как динамическое определение и переключение локали.
|
|
18
|
+
|
|
19
|
+
> Intlayer совместим с Next.js 12, 13, 14 и 15. Если вы используете Next.js Page Router, вы можете обратиться к этому [руководству](https://github.com/aymericzip/intlayer/blob/main/docs/ru/intlayer_with_nextjs_page_router.md). Для Next.js 12, 13, 14 с App Router, обратитесь к этому [руководству](https://github.com/aymericzip/intlayer/blob/main/docs/ru/intlayer_with_nextjs_14.md).
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Пошаговое руководство по настройке Intlayer в приложении Next.js
|
|
24
|
+
|
|
25
|
+
### Шаг 1: Установите зависимости
|
|
26
|
+
|
|
27
|
+
Установите необходимые пакеты с помощью 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
|
+
Основной пакет, предоставляющий инструменты интернационализации для управления конфигурацией, переводами, [декларацией контента](https://github.com/aymericzip/intlayer/blob/main/docs/ru/dictionary/get_started.md), транспиляцией и [CLI-командами](https://github.com/aymericzip/intlayer/blob/main/docs/ru/intlayer_cli.md).
|
|
44
|
+
|
|
45
|
+
- **next-intlayer**
|
|
46
|
+
|
|
47
|
+
Пакет, интегрирующий Intlayer с Next.js. Он предоставляет провайдеры контекста и хуки для интернационализации в Next.js. Кроме того, он включает плагин Next.js для интеграции Intlayer с [Webpack](https://webpack.js.org/) или [Turbopack](https://nextjs.org/docs/app/api-reference/turbopack), а также middleware для определения предпочтительной локали пользователя, управления cookies и обработки перенаправлений URL.
|
|
48
|
+
|
|
49
|
+
### Шаг 2: Настройте ваш проект
|
|
50
|
+
|
|
51
|
+
Создайте файл конфигурации для настройки языков вашего приложения:
|
|
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
|
+
// Ваши другие локали
|
|
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
|
+
// Ваши другие локали
|
|
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
|
+
// Ваши другие локали
|
|
101
|
+
],
|
|
102
|
+
defaultLocale: Locales.ENGLISH,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
module.exports = config;
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
> Через этот файл конфигурации вы можете настроить локализованные URL, перенаправления middleware, имена cookies, расположение и расширение ваших деклараций контента, отключить логи Intlayer в консоли и многое другое. Для полного списка доступных параметров обратитесь к [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/ru/configuration.md).
|
|
110
|
+
|
|
111
|
+
### Шаг 3: Интеграция Intlayer в конфигурацию Next.js
|
|
112
|
+
|
|
113
|
+
Настройте ваш проект Next.js для использования 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
|
+
/* параметры конфигурации */
|
|
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
|
+
/* параметры конфигурации */
|
|
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
|
+
/* параметры конфигурации */
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
module.exports = withIntlayer(nextConfig);
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
> Плагин `withIntlayer()` для Next.js используется для интеграции Intlayer с Next.js. Он обеспечивает построение файлов декларации контента и их мониторинг в режиме разработки. Он определяет переменные окружения Intlayer в средах [Webpack](https://webpack.js.org/) или [Turbopack](https://nextjs.org/docs/app/api-reference/turbopack). Кроме того, он предоставляет алиасы для оптимизации производительности и обеспечивает совместимость с серверными компонентами.
|
|
149
|
+
|
|
150
|
+
### Шаг 4: Определите динамические маршруты локалей
|
|
151
|
+
|
|
152
|
+
Удалите все из `RootLayout` и замените следующим кодом:
|
|
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
|
+
> Оставляя компонент `RootLayout` пустым, вы можете установить атрибуты [`lang`](https://developer.mozilla.org/fr/docs/Web/HTML/Global_attributes/lang) и [`dir`](https://developer.mozilla.org/fr/docs/Web/HTML/Global_attributes/dir) для тега `<html>`.
|
|
183
|
+
|
|
184
|
+
Для реализации динамической маршрутизации предоставьте путь для локали, добавив новый layout в ваш каталог `[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
|
+
|
|
238
|
+
module.exports = LocaleLayout;
|
|
239
|
+
|
|
240
|
+
````
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
> Сегмент пути `[locale]` используется для определения локали. Пример: `/en-US/about` будет относиться к `en-US`, а `/fr/about` к `fr`.
|
|
244
|
+
|
|
245
|
+
Затем реализуйте функцию `generateStaticParams` в макете вашего приложения.
|
|
246
|
+
|
|
247
|
+
```tsx {1} fileName="src/app/[locale]/layout.tsx" codeFormat="typescript"
|
|
248
|
+
export { generateStaticParams } from "next-intlayer"; // Строка для вставки
|
|
249
|
+
|
|
250
|
+
const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
|
|
251
|
+
/*... Остальной код*/
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
export default LocaleLayout;
|
|
255
|
+
````
|
|
256
|
+
|
|
257
|
+
```jsx {1} fileName="src/app/[locale]/layout.mjx" codeFormat="esm"
|
|
258
|
+
export { generateStaticParams } from "next-intlayer"; // Строка для вставки
|
|
259
|
+
|
|
260
|
+
const LocaleLayout = async ({ children, params: { locale } }) => {
|
|
261
|
+
/*... Остальной код*/
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
// ... Остальной код
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
```jsx {1,7} fileName="src/app/[locale]/layout.csx" codeFormat="commonjs"
|
|
268
|
+
const { generateStaticParams } = require("next-intlayer"); // Строка для вставки
|
|
269
|
+
|
|
270
|
+
const LocaleLayout = async ({ children, params: { locale } }) => {
|
|
271
|
+
/*... Остальной код*/
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
module.exports = { default: LocaleLayout, generateStaticParams };
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
> `generateStaticParams` гарантирует, что ваше приложение предварительно создает необходимые страницы для всех локалей, уменьшая вычисления во время выполнения и улучшая пользовательский опыт. Для получения дополнительной информации обратитесь к [документации Next.js о generateStaticParams](https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic-rendering#generate-static-params).
|
|
278
|
+
|
|
279
|
+
### Шаг 5: Объявите ваш контент
|
|
280
|
+
|
|
281
|
+
Создайте и управляйте объявлениями контента для хранения переводов:
|
|
282
|
+
|
|
283
|
+
```tsx fileName="src/app/[locale]/page.content.ts" contentDeclarationFormat="typescript"
|
|
284
|
+
import { t, type Dictionary } from "intlayer";
|
|
285
|
+
|
|
286
|
+
const pageContent = {
|
|
287
|
+
key: "page",
|
|
288
|
+
content: {
|
|
289
|
+
getStarted: {
|
|
290
|
+
main: t({
|
|
291
|
+
ru: "Начните с редактирования",
|
|
292
|
+
en: "Get started by editing",
|
|
293
|
+
fr: "Commencez par éditer",
|
|
294
|
+
es: "Comience por editar",
|
|
295
|
+
}),
|
|
296
|
+
pageLink: "src/app/page.tsx",
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
} satisfies Dictionary;
|
|
300
|
+
|
|
301
|
+
export default pageContent;
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
```javascript fileName="src/app/[locale]/page.content.mjs" contentDeclarationFormat="esm"
|
|
305
|
+
import { t } from "intlayer";
|
|
306
|
+
|
|
307
|
+
/** @type {import('intlayer').Dictionary} */
|
|
308
|
+
const pageContent = {
|
|
309
|
+
key: "page",
|
|
310
|
+
content: {
|
|
311
|
+
getStarted: {
|
|
312
|
+
main: t({
|
|
313
|
+
ru: "Начните с редактирования",
|
|
314
|
+
en: "Get started by editing",
|
|
315
|
+
fr: "Commencez par éditer",
|
|
316
|
+
es: "Comience por editar",
|
|
317
|
+
}),
|
|
318
|
+
pageLink: "src/app/page.tsx",
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
export default pageContent;
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
```javascript fileName="src/app/[locale]/page.content.cjs" contentDeclarationFormat="commonjs"
|
|
327
|
+
const { t } = require("intlayer");
|
|
328
|
+
|
|
329
|
+
/** @type {import('intlayer').Dictionary} */
|
|
330
|
+
const pageContent = {
|
|
331
|
+
key: "page",
|
|
332
|
+
content: {
|
|
333
|
+
getStarted: {
|
|
334
|
+
main: t({
|
|
335
|
+
ru: "Начните с редактирования",
|
|
336
|
+
en: "Get started by editing",
|
|
337
|
+
fr: "Commencez par éditer",
|
|
338
|
+
es: "Comience por editar",
|
|
339
|
+
}),
|
|
340
|
+
pageLink: "src/app/page.tsx",
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
module.exports = pageContent;
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
```json fileName="src/app/[locale]/page.content.json" contentDeclarationFormat="json"
|
|
349
|
+
{
|
|
350
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
351
|
+
"key": "page",
|
|
352
|
+
"content": {
|
|
353
|
+
"getStarted": {
|
|
354
|
+
"nodeType": "translation",
|
|
355
|
+
"translation": {
|
|
356
|
+
"ru": "Начните с редактирования",
|
|
357
|
+
"en": "Get started by editing",
|
|
358
|
+
"fr": "Commencez par éditer",
|
|
359
|
+
"es": "Comience por editar"
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
"pageLink": {
|
|
363
|
+
"nodeType": "translation",
|
|
364
|
+
"translation": {
|
|
365
|
+
"ru": "src/app/page.tsx",
|
|
366
|
+
"en": "src/app/page.tsx",
|
|
367
|
+
"fr": "src/app/page.tsx",
|
|
368
|
+
"es": "src/app/page.tsx"
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
> Ваши объявления контента могут быть определены в любом месте вашего приложения, если они включены в каталог `contentDir` (по умолчанию, `./src`) и соответствуют расширению файла объявления контента (по умолчанию, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`). Для получения дополнительной информации обратитесь к [документации по объявлениям контента](https://github.com/aymericzip/intlayer/blob/main/docs/ru/dictionary/get_started.md).
|
|
376
|
+
|
|
377
|
+
### Шаг 6: Используйте контент в вашем коде
|
|
378
|
+
|
|
379
|
+
Получите доступ к словарям контента в вашем приложении:
|
|
380
|
+
|
|
381
|
+
```tsx fileName="src/app/[locale]/page.tsx" codeFormat="typescript"
|
|
382
|
+
import type { FC } from "react";
|
|
383
|
+
import { ClientComponentExample } from "@components/ClientComponentExample";
|
|
384
|
+
import { ServerComponentExample } from "@components/ServerComponentExample";
|
|
385
|
+
import { type NextPageIntlayer, IntlayerClientProvider } from "next-intlayer";
|
|
386
|
+
import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server";
|
|
387
|
+
|
|
388
|
+
const PageContent: FC = () => {
|
|
389
|
+
const content = useIntlayer("page");
|
|
390
|
+
|
|
391
|
+
return (
|
|
392
|
+
<>
|
|
393
|
+
<p>{content.getStarted.main}</p>
|
|
394
|
+
<code>{content.getStarted.pageLink}</code>
|
|
395
|
+
</>
|
|
396
|
+
);
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
const Page: NextPageIntlayer = async ({ params }) => {
|
|
400
|
+
const { locale } = await params;
|
|
401
|
+
|
|
402
|
+
return (
|
|
403
|
+
<IntlayerServerProvider locale={locale}>
|
|
404
|
+
<PageContent />
|
|
405
|
+
<ServerComponentExample />
|
|
406
|
+
|
|
407
|
+
<IntlayerClientProvider locale={locale}>
|
|
408
|
+
<ClientComponentExample />
|
|
409
|
+
</IntlayerClientProvider>
|
|
410
|
+
</IntlayerServerProvider>
|
|
411
|
+
);
|
|
412
|
+
};
|
|
413
|
+
|
|
414
|
+
export default Page;
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
```jsx fileName="src/app/[locale]/page.mjx" codeFormat="esm"
|
|
418
|
+
import { ClientComponentExample } from "@components/ClientComponentExample";
|
|
419
|
+
import { ServerComponentExample } from "@components/ServerComponentExample";
|
|
420
|
+
import { IntlayerClientProvider } from "next-intlayer";
|
|
421
|
+
import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server";
|
|
422
|
+
|
|
423
|
+
const PageContent = () => {
|
|
424
|
+
const content = useIntlayer("page");
|
|
425
|
+
|
|
426
|
+
return (
|
|
427
|
+
<>
|
|
428
|
+
<p>{content.getStarted.main}</p>
|
|
429
|
+
<code>{content.getStarted.pageLink}</code>
|
|
430
|
+
</>
|
|
431
|
+
);
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
const Page = async ({ params }) => {
|
|
435
|
+
const { locale } = await params;
|
|
436
|
+
|
|
437
|
+
return (
|
|
438
|
+
<IntlayerServerProvider locale={locale}>
|
|
439
|
+
<PageContent />
|
|
440
|
+
<ServerComponentExample />
|
|
441
|
+
|
|
442
|
+
<IntlayerClientProvider locale={locale}>
|
|
443
|
+
<ClientComponentExample />
|
|
444
|
+
</IntlayerClientProvider>
|
|
445
|
+
</IntlayerServerProvider>
|
|
446
|
+
);
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
export default Page;
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
```jsx fileName="src/app/[locale]/page.csx" codeFormat="commonjs"
|
|
453
|
+
import { ClientComponentExample } from "@components/ClientComponentExample";
|
|
454
|
+
import { ServerComponentExample } from "@components/ServerComponentExample";
|
|
455
|
+
import { IntlayerClientProvider } from "next-intlayer";
|
|
456
|
+
import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server";
|
|
457
|
+
|
|
458
|
+
const PageContent = () => {
|
|
459
|
+
const content = useIntlayer("page");
|
|
460
|
+
|
|
461
|
+
return (
|
|
462
|
+
<>
|
|
463
|
+
<p>{content.getStarted.main}</p>
|
|
464
|
+
<code>{content.getStarted.pageLink}</code>
|
|
465
|
+
</>
|
|
466
|
+
);
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
const Page = async ({ params }) => {
|
|
470
|
+
const { locale } = await params;
|
|
471
|
+
|
|
472
|
+
return (
|
|
473
|
+
<IntlayerServerProvider locale={locale}>
|
|
474
|
+
<PageContent />
|
|
475
|
+
<ServerComponentExample />
|
|
476
|
+
|
|
477
|
+
<IntlayerClientProvider locale={locale}>
|
|
478
|
+
<ClientComponentExample />
|
|
479
|
+
</IntlayerClientProvider>
|
|
480
|
+
</IntlayerServerProvider>
|
|
481
|
+
);
|
|
482
|
+
};
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
- **`IntlayerClientProvider`** используется для предоставления локали клиентским компонентам. Он может быть размещен в любом родительском компоненте, включая макет. Однако рекомендуется размещать его в макете, так как Next.js использует общий код макета для страниц, что делает его более эффективным. Используя `IntlayerClientProvider` в макете, вы избегаете его повторной инициализации для каждой страницы, улучшая производительность и поддерживая единый контекст локализации во всем приложении.
|
|
486
|
+
- **`IntlayerServerProvider`** используется для предоставления локали серверным дочерним компонентам. Он не может быть установлен в макете.
|
|
487
|
+
|
|
488
|
+
> Макет и страница не могут делить общий серверный контекст, так как система серверного контекста основана на хранилище данных для каждого запроса (через механизм [React’s cache](https://react.dev/reference/react/cache)), что приводит к созданию нового “контекста” для разных сегментов приложения. Размещение провайдера в общем макете нарушит эту изоляцию, предотвращая корректное распространение значений серверного контекста на ваши серверные компоненты.
|
|
489
|
+
|
|
490
|
+
```tsx {4,7} fileName="src/components/ClientComponentExample.tsx" codeFormat="typescript"
|
|
491
|
+
"use client";
|
|
492
|
+
|
|
493
|
+
import type { FC } from "react";
|
|
494
|
+
import { useIntlayer } from "next-intlayer";
|
|
495
|
+
|
|
496
|
+
export const ClientComponentExample: FC = () => {
|
|
497
|
+
const content = useIntlayer("client-component-example"); // Создать декларацию связанного контента
|
|
498
|
+
|
|
499
|
+
return (
|
|
500
|
+
<div>
|
|
501
|
+
<h2>{content.title}</h2>
|
|
502
|
+
<p>{content.content}</p>
|
|
503
|
+
</div>
|
|
504
|
+
);
|
|
505
|
+
};
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
```jsx {3,6} fileName="src/components/ClientComponentExample.mjx" codeFormat="esm"
|
|
509
|
+
"use client";
|
|
510
|
+
|
|
511
|
+
import { useIntlayer } from "next-intlayer";
|
|
512
|
+
|
|
513
|
+
const ClientComponentExample = () => {
|
|
514
|
+
const content = useIntlayer("client-component-example"); // Создать декларацию связанного контента
|
|
515
|
+
|
|
516
|
+
return (
|
|
517
|
+
<div>
|
|
518
|
+
<h2>{content.title}</h2>
|
|
519
|
+
<p>{content.content}</p>
|
|
520
|
+
</div>
|
|
521
|
+
);
|
|
522
|
+
};
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
```jsx {3,6} fileName="src/components/ClientComponentExample.csx" codeFormat="commonjs"
|
|
526
|
+
"use client";
|
|
527
|
+
|
|
528
|
+
const { useIntlayer } = require("next-intlayer");
|
|
529
|
+
|
|
530
|
+
const ClientComponentExample = () => {
|
|
531
|
+
const content = useIntlayer("client-component-example"); // Создать декларацию связанного контента
|
|
532
|
+
|
|
533
|
+
return (
|
|
534
|
+
<div>
|
|
535
|
+
<h2>{content.title}</h2>
|
|
536
|
+
<p>{content.content}</p>
|
|
537
|
+
</div>
|
|
538
|
+
);
|
|
539
|
+
};
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
```tsx {2} fileName="src/components/ServerComponentExample.tsx" codeFormat="typescript"
|
|
543
|
+
import type { FC } from "react";
|
|
544
|
+
import { useIntlayer } from "next-intlayer/server";
|
|
545
|
+
|
|
546
|
+
export const ServerComponentExample: FC = () => {
|
|
547
|
+
const content = useIntlayer("server-component-example"); // Создать декларацию связанного контента
|
|
548
|
+
|
|
549
|
+
return (
|
|
550
|
+
<div>
|
|
551
|
+
<h2>{content.title}</h2>
|
|
552
|
+
<p>{content.content}</p>
|
|
553
|
+
</div>
|
|
554
|
+
);
|
|
555
|
+
};
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
```jsx {1} fileName="src/components/ServerComponentExample.mjx" codeFormat="esm"
|
|
559
|
+
import { useIntlayer } from "next-intlayer/server";
|
|
560
|
+
|
|
561
|
+
const ServerComponentExample = () => {
|
|
562
|
+
const content = useIntlayer("server-component-example"); // Создать декларацию связанного контента
|
|
563
|
+
|
|
564
|
+
return (
|
|
565
|
+
<div>
|
|
566
|
+
<h2>{content.title}</h2>
|
|
567
|
+
<p>{content.content}</p>
|
|
568
|
+
</div>
|
|
569
|
+
);
|
|
570
|
+
};
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
```jsx {1} fileName="src/components/ServerComponentExample.csx" codeFormat="commonjs"
|
|
574
|
+
const { useIntlayer } = require("next-intlayer/server");
|
|
575
|
+
|
|
576
|
+
const ServerComponentExample = () => {
|
|
577
|
+
const content = useIntlayer("server-component-example"); // Создать декларацию связанного контента
|
|
578
|
+
|
|
579
|
+
return (
|
|
580
|
+
<div>
|
|
581
|
+
<h2>{content.title}</h2>
|
|
582
|
+
<p>{content.content}</p>
|
|
583
|
+
</div>
|
|
584
|
+
);
|
|
585
|
+
};
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
> Если вы хотите использовать ваш контент в атрибуте `string`, таком как `alt`, `title`, `href`, `aria-label` и т.д., вы должны вызвать значение функции, например:
|
|
589
|
+
|
|
590
|
+
> ```jsx
|
|
591
|
+
>
|
|
592
|
+
> ```
|
|
593
|
+
|
|
594
|
+
> <img src={content.image.src.value} alt={content.image.value} />
|
|
595
|
+
|
|
596
|
+
> ```
|
|
597
|
+
>
|
|
598
|
+
> ```
|
|
599
|
+
|
|
600
|
+
> Чтобы узнать больше о хуке `useIntlayer`, обратитесь к [документации](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/next-intlayer/useIntlayer.md).
|
|
601
|
+
|
|
602
|
+
### (Опционально) Шаг 7: Настройка Middleware для определения локали
|
|
603
|
+
|
|
604
|
+
Настройте middleware для определения предпочтительной локали пользователя:
|
|
605
|
+
|
|
606
|
+
```typescript fileName="src/middleware.ts" codeFormat="typescript"
|
|
607
|
+
export { intlayerMiddleware as middleware } from "next-intlayer/middleware";
|
|
608
|
+
|
|
609
|
+
export const config = {
|
|
610
|
+
matcher:
|
|
611
|
+
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
612
|
+
};
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
```javascript fileName="src/middleware.mjs" codeFormat="esm"
|
|
616
|
+
export { intlayerMiddleware as middleware } from "next-intlayer/middleware";
|
|
617
|
+
|
|
618
|
+
export const config = {
|
|
619
|
+
matcher:
|
|
620
|
+
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
621
|
+
};
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
```javascript fileName="src/middleware.cjs" codeFormat="commonjs"
|
|
625
|
+
const { intlayerMiddleware } = require("next-intlayer/middleware");
|
|
626
|
+
|
|
627
|
+
const config = {
|
|
628
|
+
matcher:
|
|
629
|
+
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
630
|
+
};
|
|
631
|
+
|
|
632
|
+
module.exports = { middleware: intlayerMiddleware, config };
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
> `intlayerMiddleware` используется для определения предпочтительной локали пользователя и перенаправления его на соответствующий URL, указанный в [конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/ru/configuration.md). Кроме того, он позволяет сохранять предпочтительную локаль пользователя в cookie.
|
|
636
|
+
|
|
637
|
+
### (Опционально) Шаг 8: Интернационализация ваших метаданных
|
|
638
|
+
|
|
639
|
+
Если вы хотите интернационализировать ваши метаданные, такие как заголовок страницы, вы можете использовать функцию `generateMetadata`, предоставляемую Next.js. Внутри функции используйте функцию `getTranslation` для перевода ваших метаданных.
|
|
640
|
+
|
|
641
|
+
````typescript fileName="src/app/[locale]/layout.tsx or src/app/[locale]/page.tsx" codeFormat="typescript"
|
|
642
|
+
import {
|
|
643
|
+
type IConfigLocales,
|
|
644
|
+
getTranslation,
|
|
645
|
+
getMultilingualUrls,
|
|
646
|
+
} from "intlayer";
|
|
647
|
+
import type { Metadata } from "next";
|
|
648
|
+
import type { LocalPromiseParams } from "next-intlayer";
|
|
649
|
+
|
|
650
|
+
export const generateMetadata = async ({
|
|
651
|
+
params,
|
|
652
|
+
}: LocalPromiseParams): Promise<Metadata> => {
|
|
653
|
+
const { locale } = await params;
|
|
654
|
+
const t = <T>(content: IConfigLocales<T>) => getTranslation(content, locale);
|
|
655
|
+
|
|
656
|
+
/**
|
|
657
|
+
* Генерирует объект, содержащий все URL для каждой локали.
|
|
658
|
+
*
|
|
659
|
+
* Пример:
|
|
660
|
+
* ```ts
|
|
661
|
+
* getMultilingualUrls('/about');
|
|
662
|
+
*
|
|
663
|
+
* // Возвращает
|
|
664
|
+
* // {
|
|
665
|
+
* // en: '/about',
|
|
666
|
+
* // fr: '/fr/about',
|
|
667
|
+
* // es: '/es/about',
|
|
668
|
+
* // }
|
|
669
|
+
* ```
|
|
670
|
+
*/
|
|
671
|
+
const multilingualUrls = getMultilingualUrls("/");
|
|
672
|
+
|
|
673
|
+
return {
|
|
674
|
+
title: t<string>({
|
|
675
|
+
ru: "Мой заголовок",
|
|
676
|
+
en: "My title",
|
|
677
|
+
fr: "Mon titre",
|
|
678
|
+
es: "Mi título",
|
|
679
|
+
}),
|
|
680
|
+
description: t({
|
|
681
|
+
ru: "Мое описание",
|
|
682
|
+
en: "My description",
|
|
683
|
+
fr: "Ma description",
|
|
684
|
+
es: "Mi descripción",
|
|
685
|
+
}),
|
|
686
|
+
alternates: {
|
|
687
|
+
canonical: multilingualUrls[locale as keyof typeof multilingualUrls],
|
|
688
|
+
languages: { ...multilingualUrls, "x-default": "/" },
|
|
689
|
+
},
|
|
690
|
+
openGraph: {
|
|
691
|
+
url: multilingualUrls[locale],
|
|
692
|
+
},
|
|
693
|
+
};
|
|
694
|
+
};
|
|
695
|
+
|
|
696
|
+
// ... Остальная часть кода
|
|
697
|
+
````
|
|
698
|
+
|
|
699
|
+
````javascript fileName="src/app/[locale]/layout.mjs or src/app/[locale]/page.mjs" codeFormat="esm"
|
|
700
|
+
import { getTranslation, getMultilingualUrls } from "intlayer";
|
|
701
|
+
|
|
702
|
+
export const generateMetadata = async ({ params }) => {
|
|
703
|
+
const { locale } = await params;
|
|
704
|
+
const t = (content) => getTranslation(content, locale);
|
|
705
|
+
|
|
706
|
+
/**
|
|
707
|
+
* Генерирует объект, содержащий все URL для каждой локали.
|
|
708
|
+
*
|
|
709
|
+
* Пример:
|
|
710
|
+
* ```ts
|
|
711
|
+
* getMultilingualUrls('/about');
|
|
712
|
+
*
|
|
713
|
+
* // Возвращает
|
|
714
|
+
* // {
|
|
715
|
+
* // en: '/about',
|
|
716
|
+
* // fr: '/fr/about',
|
|
717
|
+
* // es: '/es/about'
|
|
718
|
+
* // }
|
|
719
|
+
* ```
|
|
720
|
+
*/
|
|
721
|
+
const multilingualUrls = getMultilingualUrls("/");
|
|
722
|
+
|
|
723
|
+
return {
|
|
724
|
+
title: t({
|
|
725
|
+
ru: "Мой заголовок",
|
|
726
|
+
en: "My title",
|
|
727
|
+
fr: "Mon titre",
|
|
728
|
+
es: "Mi título",
|
|
729
|
+
}),
|
|
730
|
+
description: t({
|
|
731
|
+
ru: "Мое описание",
|
|
732
|
+
en: "My description",
|
|
733
|
+
fr: "Ma description",
|
|
734
|
+
es: "Mi descripción",
|
|
735
|
+
}),
|
|
736
|
+
alternates: {
|
|
737
|
+
canonical: "/ru/",
|
|
738
|
+
languages: { ...multilingualUrls, "x-default": "/" },
|
|
739
|
+
},
|
|
740
|
+
openGraph: {
|
|
741
|
+
url: multilingualUrls[locale],
|
|
742
|
+
},
|
|
743
|
+
};
|
|
744
|
+
};
|
|
745
|
+
|
|
746
|
+
// ... Остальная часть кода
|
|
747
|
+
````
|
|
748
|
+
|
|
749
|
+
````javascript fileName="src/app/[locale]/layout.cjs or src/app/[locale]/page.cjs" codeFormat="commonjs"
|
|
750
|
+
const { getTranslation, getMultilingualUrls } = require("intlayer");
|
|
751
|
+
|
|
752
|
+
const generateMetadata = async ({ params }) => {
|
|
753
|
+
const { locale } = await params;
|
|
754
|
+
|
|
755
|
+
const t = (content) => getTranslation(content, locale);
|
|
756
|
+
|
|
757
|
+
/**
|
|
758
|
+
* Генерирует объект, содержащий все URL для каждой локали.
|
|
759
|
+
*
|
|
760
|
+
* Пример:
|
|
761
|
+
* ```ts
|
|
762
|
+
* getMultilingualUrls('/about');
|
|
763
|
+
*
|
|
764
|
+
* // Возвращает
|
|
765
|
+
* // {
|
|
766
|
+
* // en: '/about',
|
|
767
|
+
* // fr: '/fr/about',
|
|
768
|
+
* // es: '/es/about'
|
|
769
|
+
* // }
|
|
770
|
+
* ```
|
|
771
|
+
*/
|
|
772
|
+
const multilingualUrls = getMultilingualUrls("/");
|
|
773
|
+
|
|
774
|
+
return {
|
|
775
|
+
title: t({
|
|
776
|
+
ru: "Мой заголовок",
|
|
777
|
+
en: "My title",
|
|
778
|
+
fr: "Mon titre",
|
|
779
|
+
es: "Mi título",
|
|
780
|
+
}),
|
|
781
|
+
description: t({
|
|
782
|
+
ru: "Мое описание",
|
|
783
|
+
en: "My description",
|
|
784
|
+
fr: "Ma description",
|
|
785
|
+
es: "Mi descripción",
|
|
786
|
+
}),
|
|
787
|
+
alternates: {
|
|
788
|
+
canonical: "/ru/",
|
|
789
|
+
languages: { ...multilingualUrls, "x-default": "/" },
|
|
790
|
+
},
|
|
791
|
+
openGraph: {
|
|
792
|
+
url: multilingualUrls[locale],
|
|
793
|
+
},
|
|
794
|
+
};
|
|
795
|
+
};
|
|
796
|
+
|
|
797
|
+
module.exports = { generateMetadata };
|
|
798
|
+
|
|
799
|
+
// ... Остальная часть кода
|
|
800
|
+
````
|
|
801
|
+
|
|
802
|
+
> Узнайте больше об оптимизации метаданных [в официальной документации Next.js](https://nextjs.org/docs/app/building-your-application/optimizing/metadata).
|
|
803
|
+
|
|
804
|
+
### (Опционально) Шаг 9: Интернационализация вашего sitemap.xml и robots.txt
|
|
805
|
+
|
|
806
|
+
Для интернационализации вашего `sitemap.xml` и `robots.txt` вы можете использовать функцию `getMultilingualUrls`, предоставляемую Intlayer. Эта функция позволяет генерировать многоязычные URL для вашего sitemap.
|
|
807
|
+
|
|
808
|
+
```tsx fileName="src/app/sitemap.ts" codeFormat="typescript"
|
|
809
|
+
import { getMultilingualUrls } from "intlayer";
|
|
810
|
+
import type { MetadataRoute } from "next";
|
|
811
|
+
|
|
812
|
+
const sitemap = (): MetadataRoute.Sitemap => [
|
|
813
|
+
{
|
|
814
|
+
url: "https://example.com",
|
|
815
|
+
alternates: {
|
|
816
|
+
languages: { ...getMultilingualUrls("https://example.com") },
|
|
817
|
+
},
|
|
818
|
+
},
|
|
819
|
+
{
|
|
820
|
+
url: "https://example.com/login",
|
|
821
|
+
alternates: {
|
|
822
|
+
languages: { ...getMultilingualUrls("https://example.com/login") },
|
|
823
|
+
},
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
url: "https://example.com/register",
|
|
827
|
+
alternates: {
|
|
828
|
+
languages: { ...getMultilingualUrls("https://example.com/register") },
|
|
829
|
+
},
|
|
830
|
+
},
|
|
831
|
+
];
|
|
832
|
+
|
|
833
|
+
export default sitemap;
|
|
834
|
+
```
|
|
835
|
+
|
|
836
|
+
```jsx fileName="src/app/sitemap.mjx" codeFormat="esm"
|
|
837
|
+
import { getMultilingualUrls } from "intlayer";
|
|
838
|
+
|
|
839
|
+
const sitemap = () => [
|
|
840
|
+
{
|
|
841
|
+
url: "https://example.com",
|
|
842
|
+
alternates: {
|
|
843
|
+
languages: { ...getMultilingualUrls("https://example.com") },
|
|
844
|
+
},
|
|
845
|
+
},
|
|
846
|
+
{
|
|
847
|
+
url: "https://example.com/login",
|
|
848
|
+
alternates: {
|
|
849
|
+
languages: { ...getMultilingualUrls("https://example.com/login") },
|
|
850
|
+
},
|
|
851
|
+
},
|
|
852
|
+
{
|
|
853
|
+
url: "https://example.com/register",
|
|
854
|
+
alternates: {
|
|
855
|
+
languages: { ...getMultilingualUrls("https://example.com/register") },
|
|
856
|
+
},
|
|
857
|
+
},
|
|
858
|
+
];
|
|
859
|
+
|
|
860
|
+
export default sitemap;
|
|
861
|
+
```
|
|
862
|
+
|
|
863
|
+
```jsx fileName="src/app/sitemap.csx" codeFormat="commonjs"
|
|
864
|
+
const { getMultilingualUrls } = require("intlayer");
|
|
865
|
+
|
|
866
|
+
const sitemap = () => [
|
|
867
|
+
{
|
|
868
|
+
url: "https://example.com",
|
|
869
|
+
alternates: {
|
|
870
|
+
languages: { ...getMultilingualUrls("https://example.com") },
|
|
871
|
+
},
|
|
872
|
+
},
|
|
873
|
+
{
|
|
874
|
+
url: "https://example.com/login",
|
|
875
|
+
alternates: {
|
|
876
|
+
languages: { ...getMultilingualUrls("https://example.com/login") },
|
|
877
|
+
},
|
|
878
|
+
},
|
|
879
|
+
{
|
|
880
|
+
url: "https://example.com/register",
|
|
881
|
+
alternates: {
|
|
882
|
+
languages: { ...getMultilingualUrls("https://example.com/register") },
|
|
883
|
+
},
|
|
884
|
+
},
|
|
885
|
+
];
|
|
886
|
+
|
|
887
|
+
module.exports = sitemap;
|
|
888
|
+
```
|
|
889
|
+
|
|
890
|
+
```tsx fileName="src/app/robots.ts" codeFormat="typescript"
|
|
891
|
+
import type { MetadataRoute } from "next";
|
|
892
|
+
import { getMultilingualUrls } from "intlayer";
|
|
893
|
+
|
|
894
|
+
const getAllMultilingualUrls = (urls: string[]) =>
|
|
895
|
+
urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]);
|
|
896
|
+
|
|
897
|
+
const robots = (): MetadataRoute.Robots => ({
|
|
898
|
+
rules: {
|
|
899
|
+
userAgent: "*",
|
|
900
|
+
allow: ["/"],
|
|
901
|
+
disallow: getAllMultilingualUrls(["/login", "/register"]),
|
|
902
|
+
},
|
|
903
|
+
host: "https://example.com",
|
|
904
|
+
sitemap: `https://example.com/sitemap.xml`,
|
|
905
|
+
});
|
|
906
|
+
|
|
907
|
+
export default robots;
|
|
908
|
+
```
|
|
909
|
+
|
|
910
|
+
```jsx fileName="src/app/robots.mjx" codeFormat="esm"
|
|
911
|
+
import { getMultilingualUrls } from "intlayer";
|
|
912
|
+
|
|
913
|
+
const getAllMultilingualUrls = (urls) =>
|
|
914
|
+
urls.flatMap((url) => Object.values(getMultilingualUrls(url)));
|
|
915
|
+
|
|
916
|
+
const robots = () => ({
|
|
917
|
+
rules: {
|
|
918
|
+
userAgent: "*",
|
|
919
|
+
allow: ["/"],
|
|
920
|
+
disallow: getAllMultilingualUrls(["/login", "/register"]),
|
|
921
|
+
},
|
|
922
|
+
host: "https://example.com",
|
|
923
|
+
sitemap: `https://example.com/sitemap.xml`,
|
|
924
|
+
});
|
|
925
|
+
|
|
926
|
+
export default robots;
|
|
927
|
+
```
|
|
928
|
+
|
|
929
|
+
```jsx fileName="src/app/robots.csx" codeFormat="commonjs"
|
|
930
|
+
const { getMultilingualUrls } = require("intlayer");
|
|
931
|
+
|
|
932
|
+
const getAllMultilingualUrls = (urls) =>
|
|
933
|
+
urls.flatMap((url) => Object.values(getMultilingualUrls(url)));
|
|
934
|
+
|
|
935
|
+
const robots = () => ({
|
|
936
|
+
rules: {
|
|
937
|
+
userAgent: "*",
|
|
938
|
+
allow: ["/"],
|
|
939
|
+
disallow: getAllMultilingualUrls(["/login", "/register"]),
|
|
940
|
+
},
|
|
941
|
+
host: "https://example.com",
|
|
942
|
+
sitemap: `https://example.com/sitemap.xml`,
|
|
943
|
+
});
|
|
944
|
+
|
|
945
|
+
module.exports = robots;
|
|
946
|
+
```
|
|
947
|
+
|
|
948
|
+
> Узнайте больше об оптимизации sitemap [в официальной документации Next.js](https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap). Узнайте больше об оптимизации robots.txt [в официальной документации Next.js](https://nextjs.org/docs/app/api-reference/file-conventions/metadata/robots).
|
|
949
|
+
|
|
950
|
+
### (Опционально) Шаг 10: Изменение языка вашего контента
|
|
951
|
+
|
|
952
|
+
Чтобы изменить язык вашего контента в Next.js, рекомендуется использовать компонент `Link` для перенаправления пользователей на соответствующую локализованную страницу. Компонент `Link` позволяет предварительно загружать страницу, что помогает избежать полной перезагрузки страницы.
|
|
953
|
+
|
|
954
|
+
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
955
|
+
"use client";
|
|
956
|
+
|
|
957
|
+
import type { FC } from "react";
|
|
958
|
+
import {
|
|
959
|
+
Locales,
|
|
960
|
+
getHTMLTextDir,
|
|
961
|
+
getLocaleName,
|
|
962
|
+
getLocalizedUrl,
|
|
963
|
+
} from "intlayer";
|
|
964
|
+
import { useLocale } from "next-intlayer";
|
|
965
|
+
import Link from "next/link";
|
|
966
|
+
|
|
967
|
+
export const LocaleSwitcher: FC = () => {
|
|
968
|
+
const { locale, pathWithoutLocale, availableLocales } = useLocale();
|
|
969
|
+
const { setLocaleCookie } = useLocaleCookie();
|
|
970
|
+
|
|
971
|
+
return (
|
|
972
|
+
<div>
|
|
973
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
974
|
+
<div id="localePopover" popover="auto">
|
|
975
|
+
{availableLocales.map((localeItem) => (
|
|
976
|
+
<Link
|
|
977
|
+
href={getLocalizedUrl(pathWithoutLocale, localeItem)}
|
|
978
|
+
hrefLang={localeItem}
|
|
979
|
+
key={localeItem}
|
|
980
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
981
|
+
onClick={() => setLocaleCookie(localeItem)}
|
|
982
|
+
>
|
|
983
|
+
<span>
|
|
984
|
+
{/* Локаль - например, FR */}
|
|
985
|
+
{localeItem}
|
|
986
|
+
</span>
|
|
987
|
+
<span>
|
|
988
|
+
{/* Язык на своей локали - например, Français */}
|
|
989
|
+
{getLocaleName(localeItem, locale)}
|
|
990
|
+
</span>
|
|
991
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
992
|
+
{/* Язык на текущей локали - например, Francés, если текущая локаль установлена на Locales.SPANISH */}
|
|
993
|
+
{getLocaleName(localeItem)}
|
|
994
|
+
</span>
|
|
995
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
996
|
+
{/* Язык на английском - например, French */}
|
|
997
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
998
|
+
</span>
|
|
999
|
+
</Link>
|
|
1000
|
+
))}
|
|
1001
|
+
</div>
|
|
1002
|
+
</div>
|
|
1003
|
+
);
|
|
1004
|
+
};
|
|
1005
|
+
```
|
|
1006
|
+
|
|
1007
|
+
```jsx fileName="src/components/LocaleSwitcher.msx" codeFormat="esm"
|
|
1008
|
+
"use client";
|
|
1009
|
+
|
|
1010
|
+
import {
|
|
1011
|
+
Locales,
|
|
1012
|
+
getHTMLTextDir,
|
|
1013
|
+
getLocaleName,
|
|
1014
|
+
getLocalizedUrl,
|
|
1015
|
+
} from "intlayer";
|
|
1016
|
+
import { useLocale } from "next-intlayer";
|
|
1017
|
+
import Link from "next/link";
|
|
1018
|
+
|
|
1019
|
+
export const LocaleSwitcher = () => {
|
|
1020
|
+
const { locale, pathWithoutLocale, availableLocales } = useLocale();
|
|
1021
|
+
const { setLocaleCookie } = useLocaleCookie();
|
|
1022
|
+
|
|
1023
|
+
return (
|
|
1024
|
+
<div>
|
|
1025
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
1026
|
+
<div id="localePopover" popover="auto">
|
|
1027
|
+
{availableLocales.map((localeItem) => (
|
|
1028
|
+
<Link
|
|
1029
|
+
href={getLocalizedUrl(pathWithoutLocale, localeItem)}
|
|
1030
|
+
hrefLang={localeItem}
|
|
1031
|
+
key={localeItem}
|
|
1032
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1033
|
+
onClick={() => setLocaleCookie(localeItem)}
|
|
1034
|
+
>
|
|
1035
|
+
<span>
|
|
1036
|
+
{/* Локаль - например, FR */}
|
|
1037
|
+
{localeItem}
|
|
1038
|
+
</span>
|
|
1039
|
+
<span>
|
|
1040
|
+
{/* Язык на своей локали - например, Français */}
|
|
1041
|
+
{getLocaleName(localeItem, locale)}
|
|
1042
|
+
</span>
|
|
1043
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1044
|
+
{/* Язык на текущей локали - например, Francés, если текущая локаль установлена на Locales.SPANISH */}
|
|
1045
|
+
{getLocaleName(localeItem)}
|
|
1046
|
+
</span>
|
|
1047
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1048
|
+
{/* Язык на английском - например, French */}
|
|
1049
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1050
|
+
</span>
|
|
1051
|
+
</Link>
|
|
1052
|
+
))}
|
|
1053
|
+
</div>
|
|
1054
|
+
</div>
|
|
1055
|
+
);
|
|
1056
|
+
};
|
|
1057
|
+
```
|
|
1058
|
+
|
|
1059
|
+
```jsx fileName="src/components/LocaleSwitcher.csx" codeFormat="commonjs"
|
|
1060
|
+
"use client";
|
|
1061
|
+
|
|
1062
|
+
const {
|
|
1063
|
+
Locales,
|
|
1064
|
+
getHTMLTextDir,
|
|
1065
|
+
getLocaleName,
|
|
1066
|
+
getLocalizedUrl,
|
|
1067
|
+
} = require("intlayer");
|
|
1068
|
+
const { useLocale } = require("next-intlayer");
|
|
1069
|
+
const Link = require("next/link");
|
|
1070
|
+
|
|
1071
|
+
export const LocaleSwitcher = () => {
|
|
1072
|
+
const { locale, pathWithoutLocale, availableLocales } = useLocale();
|
|
1073
|
+
const { setLocaleCookie } = useLocaleCookie();
|
|
1074
|
+
|
|
1075
|
+
return (
|
|
1076
|
+
<div>
|
|
1077
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
1078
|
+
<div id="localePopover" popover="auto">
|
|
1079
|
+
{availableLocales.map((localeItem) => (
|
|
1080
|
+
<Link
|
|
1081
|
+
href={getLocalizedUrl(pathWithoutLocale, localeItem)}
|
|
1082
|
+
hrefLang={localeItem}
|
|
1083
|
+
key={localeItem}
|
|
1084
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1085
|
+
onClick={() => setLocaleCookie(localeItem)}
|
|
1086
|
+
>
|
|
1087
|
+
<span>
|
|
1088
|
+
{/* Локаль - например, FR */}
|
|
1089
|
+
{localeItem}
|
|
1090
|
+
</span>
|
|
1091
|
+
<span>
|
|
1092
|
+
{/* Язык на своем языке - например, Français */}
|
|
1093
|
+
{getLocaleName(localeItem, locale)}
|
|
1094
|
+
</span>
|
|
1095
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1096
|
+
{/* Язык на текущей локали - например, Francés с текущей локалью, установленной на Locales.SPANISH */}
|
|
1097
|
+
{getLocaleName(localeItem)}
|
|
1098
|
+
</span>
|
|
1099
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1100
|
+
{/* Язык на английском - например, French */}
|
|
1101
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1102
|
+
</span>
|
|
1103
|
+
</Link>
|
|
1104
|
+
))}
|
|
1105
|
+
</div>
|
|
1106
|
+
</div>
|
|
1107
|
+
);
|
|
1108
|
+
};
|
|
1109
|
+
```
|
|
1110
|
+
|
|
1111
|
+
> Ссылки на документацию:
|
|
1112
|
+
|
|
1113
|
+
> - [`useLocale` hook](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/next-intlayer/useLocale.md)
|
|
1114
|
+
|
|
1115
|
+
> - [`getLocaleName` hook](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/intlayer/getLocaleName.md)
|
|
1116
|
+
|
|
1117
|
+
> - [`getLocalizedUrl` hook](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/intlayer/getLocalizedUrl.md)
|
|
1118
|
+
|
|
1119
|
+
> - [`getHTMLTextDir` hook](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/intlayer/getHTMLTextDir.md)
|
|
1120
|
+
|
|
1121
|
+
> - [`hrefLang` attribute](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=ru)
|
|
1122
|
+
|
|
1123
|
+
> - [`lang` attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)
|
|
1124
|
+
|
|
1125
|
+
> - [`dir` attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir)
|
|
1126
|
+
|
|
1127
|
+
> - [`aria-current` attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)
|
|
1128
|
+
|
|
1129
|
+
### (Необязательно) Шаг 11: Создание компонента локализованной ссылки
|
|
1130
|
+
|
|
1131
|
+
Чтобы обеспечить навигацию в приложении в соответствии с текущей локалью, вы можете создать пользовательский компонент `Link`. Этот компонент автоматически добавляет префикс к внутренним URL-адресам с текущим языком. Например, когда пользователь, говорящий на французском, нажимает на ссылку на страницу "О нас", он перенаправляется на `/ru/about` вместо `/about`.
|
|
1132
|
+
|
|
1133
|
+
Это поведение полезно по нескольким причинам:
|
|
1134
|
+
|
|
1135
|
+
- **SEO и пользовательский опыт**: Локализованные URL-адреса помогают поисковым системам правильно индексировать страницы на определенных языках и предоставляют пользователям контент на их предпочтительном языке.
|
|
1136
|
+
- **Последовательность**: Используя локализованную ссылку по всему приложению, вы гарантируете, что навигация остается в пределах текущей локали, предотвращая неожиданные переключения языка.
|
|
1137
|
+
- **Поддерживаемость**: Централизуя логику локализации в одном компоненте, вы упрощаете управление URL-адресами, делая ваш код более удобным для поддержки и расширения по мере роста приложения.
|
|
1138
|
+
|
|
1139
|
+
Ниже приведена реализация локализованного компонента `Link` на TypeScript:
|
|
1140
|
+
|
|
1141
|
+
```tsx fileName="src/components/Link.tsx" codeFormat="typescript"
|
|
1142
|
+
"use client";
|
|
1143
|
+
|
|
1144
|
+
import { getLocalizedUrl } from "intlayer";
|
|
1145
|
+
import NextLink, { type LinkProps as NextLinkProps } from "next/link";
|
|
1146
|
+
import { useLocale } from "next-intlayer";
|
|
1147
|
+
import type { PropsWithChildren, FC } from "react";
|
|
1148
|
+
|
|
1149
|
+
/**
|
|
1150
|
+
* Утилита для проверки, является ли данный URL внешним.
|
|
1151
|
+
* Если URL начинается с http:// или https://, он считается внешним.
|
|
1152
|
+
*/
|
|
1153
|
+
export const checkIsExternalLink = (href?: string): boolean =>
|
|
1154
|
+
/^https?:\/\//.test(href ?? "");
|
|
1155
|
+
|
|
1156
|
+
/**
|
|
1157
|
+
* Пользовательский компонент Link, который адаптирует атрибут href на основе текущей локали.
|
|
1158
|
+
* Для внутренних ссылок используется `getLocalizedUrl` для добавления префикса URL с локалью (например, /fr/about).
|
|
1159
|
+
* Это гарантирует, что навигация остается в контексте той же локали.
|
|
1160
|
+
*/
|
|
1161
|
+
export const Link: FC<PropsWithChildren<NextLinkProps>> = ({
|
|
1162
|
+
href,
|
|
1163
|
+
children,
|
|
1164
|
+
...props
|
|
1165
|
+
}) => {
|
|
1166
|
+
const { locale } = useLocale();
|
|
1167
|
+
const isExternalLink = checkIsExternalLink(href.toString());
|
|
1168
|
+
|
|
1169
|
+
// Если ссылка внутренняя и предоставлен допустимый href, получить локализованный URL.
|
|
1170
|
+
const hrefI18n: NextLinkProps["href"] =
|
|
1171
|
+
href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href;
|
|
1172
|
+
|
|
1173
|
+
return (
|
|
1174
|
+
<NextLink href={hrefI18n} {...props}>
|
|
1175
|
+
{children}
|
|
1176
|
+
</NextLink>
|
|
1177
|
+
);
|
|
1178
|
+
};
|
|
1179
|
+
```
|
|
1180
|
+
|
|
1181
|
+
```jsx fileName="src/components/Link.mjx" codeFormat="esm"
|
|
1182
|
+
"use client";
|
|
1183
|
+
|
|
1184
|
+
import { getLocalizedUrl } from "intlayer";
|
|
1185
|
+
import NextLink from "next/link";
|
|
1186
|
+
import { useLocale } from "next-intlayer";
|
|
1187
|
+
|
|
1188
|
+
/**
|
|
1189
|
+
* Утилита для проверки, является ли данный URL внешним.
|
|
1190
|
+
* Если URL начинается с http:// или https://, он считается внешним.
|
|
1191
|
+
*/
|
|
1192
|
+
export const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1193
|
+
|
|
1194
|
+
/**
|
|
1195
|
+
* Пользовательский компонент Link, который адаптирует атрибут href на основе текущей локали.
|
|
1196
|
+
* Для внутренних ссылок используется `getLocalizedUrl` для добавления префикса URL с локалью (например, /fr/about).
|
|
1197
|
+
* Это гарантирует, что навигация остается в контексте той же локали.
|
|
1198
|
+
*/
|
|
1199
|
+
export const Link = ({ href, children, ...props }) => {
|
|
1200
|
+
const { locale } = useLocale();
|
|
1201
|
+
const isExternalLink = checkIsExternalLink(href.toString());
|
|
1202
|
+
|
|
1203
|
+
// Если ссылка внутренняя и предоставлен допустимый href, получить локализованный URL.
|
|
1204
|
+
const hrefI18n =
|
|
1205
|
+
href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href;
|
|
1206
|
+
|
|
1207
|
+
return (
|
|
1208
|
+
<NextLink href={hrefI18n} {...props}>
|
|
1209
|
+
{children}
|
|
1210
|
+
</NextLink>
|
|
1211
|
+
);
|
|
1212
|
+
};
|
|
1213
|
+
```
|
|
1214
|
+
|
|
1215
|
+
```jsx fileName="src/components/Link.csx" codeFormat="commonjs"
|
|
1216
|
+
"use client";
|
|
1217
|
+
|
|
1218
|
+
const { getLocalizedUrl } = require("intlayer");
|
|
1219
|
+
const NextLink = require("next/link");
|
|
1220
|
+
const { useLocale } = require("next-intlayer");
|
|
1221
|
+
|
|
1222
|
+
/**
|
|
1223
|
+
* Утилита для проверки, является ли данный URL внешним.
|
|
1224
|
+
* Если URL начинается с http:// или https://, он считается внешним.
|
|
1225
|
+
*/
|
|
1226
|
+
const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1227
|
+
|
|
1228
|
+
/**
|
|
1229
|
+
* Пользовательский компонент Link, который адаптирует атрибут href на основе текущей локали.
|
|
1230
|
+
* Для внутренних ссылок используется `getLocalizedUrl` для добавления префикса URL с локалью (например, /fr/about).
|
|
1231
|
+
* Это гарантирует, что навигация остается в контексте той же локали.
|
|
1232
|
+
*/
|
|
1233
|
+
const Link = ({ href, children, ...props }) => {
|
|
1234
|
+
const { locale } = useLocale();
|
|
1235
|
+
const isExternalLink = checkIsExternalLink(href.toString());
|
|
1236
|
+
|
|
1237
|
+
// Если ссылка внутренняя и предоставлен допустимый href, получить локализованный URL.
|
|
1238
|
+
const hrefI18n =
|
|
1239
|
+
href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href;
|
|
1240
|
+
|
|
1241
|
+
return (
|
|
1242
|
+
<NextLink href={hrefI18n} {...props}>
|
|
1243
|
+
{children}
|
|
1244
|
+
</NextLink>
|
|
1245
|
+
);
|
|
1246
|
+
};
|
|
1247
|
+
```
|
|
1248
|
+
|
|
1249
|
+
#### Как это работает
|
|
1250
|
+
|
|
1251
|
+
- **Определение внешних ссылок**:
|
|
1252
|
+
Вспомогательная функция `checkIsExternalLink` определяет, является ли URL внешним. Внешние ссылки остаются неизменными, так как они не нуждаются в локализации.
|
|
1253
|
+
|
|
1254
|
+
- **Получение текущей локали**:
|
|
1255
|
+
Хук `useLocale` предоставляет текущую локаль (например, `fr` для французского).
|
|
1256
|
+
|
|
1257
|
+
- **Локализация URL**:
|
|
1258
|
+
Для внутренних ссылок (т.е. не внешних) используется `getLocalizedUrl`, чтобы автоматически добавлять префикс к URL с текущей локалью. Это означает, что если ваш пользователь находится на французском языке, передача `/about` в качестве `href` преобразует его в `/fr/about`.
|
|
1259
|
+
|
|
1260
|
+
- **Возврат ссылки**:
|
|
1261
|
+
Компонент возвращает элемент `<a>` с локализованным URL, обеспечивая согласованную навигацию в соответствии с локалью.
|
|
1262
|
+
|
|
1263
|
+
Интегрируя этот компонент `Link` в вашем приложении, вы поддерживаете согласованный и языково-осведомленный пользовательский опыт, а также улучшаете SEO и удобство использования.
|
|
1264
|
+
|
|
1265
|
+
### (Опционально) Шаг 12: Оптимизация размера вашего бандла
|
|
1266
|
+
|
|
1267
|
+
При использовании `next-intlayer` словари по умолчанию включаются в бандл для каждой страницы. Чтобы оптимизировать размер бандла, Intlayer предоставляет опциональный SWC плагин, который интеллектуально заменяет вызовы `useIntlayer` с помощью макросов. Это гарантирует, что словари включаются только в бандлы тех страниц, которые их действительно используют.
|
|
1268
|
+
|
|
1269
|
+
Чтобы включить эту оптимизацию, установите пакет `@intlayer/swc`. После установки `next-intlayer` автоматически обнаружит и использует плагин:
|
|
1270
|
+
|
|
1271
|
+
```bash packageManager="npm"
|
|
1272
|
+
npm install @intlayer/swc --save-dev
|
|
1273
|
+
```
|
|
1274
|
+
|
|
1275
|
+
```bash packageManager="pnpm"
|
|
1276
|
+
pnpm add @intlayer/swc --save-dev
|
|
1277
|
+
```
|
|
1278
|
+
|
|
1279
|
+
```bash packageManager="yarn"
|
|
1280
|
+
yarn add @intlayer/swc --save-dev
|
|
1281
|
+
```
|
|
1282
|
+
|
|
1283
|
+
> Примечание: Эта оптимизация доступна только в Next.js 13 и выше.
|
|
1284
|
+
|
|
1285
|
+
> Примечание: Этот пакет не устанавливается по умолчанию, потому что плагин SWC еще находится на этапе экспериментального использования в Next.js. Это может измениться в будущем.
|
|
1286
|
+
|
|
1287
|
+
### Настройка TypeScript
|
|
1288
|
+
|
|
1289
|
+
Intlayer использует расширение модулей для получения преимуществ TypeScript и усиления вашего кода.
|
|
1290
|
+
|
|
1291
|
+

|
|
1292
|
+
|
|
1293
|
+
Убедитесь, что ваша конфигурация TypeScript включает автоматически сгенерированные типы.
|
|
1294
|
+
|
|
1295
|
+
```json5 fileName="tsconfig.json"
|
|
1296
|
+
{
|
|
1297
|
+
// ... Ваши существующие конфигурации TypeScript
|
|
1298
|
+
"include": [
|
|
1299
|
+
// ... Ваши существующие конфигурации TypeScript
|
|
1300
|
+
".intlayer/**/*.ts", // Включить автоматически сгенерированные типы
|
|
1301
|
+
],
|
|
1302
|
+
}
|
|
1303
|
+
```
|
|
1304
|
+
|
|
1305
|
+
### Конфигурация Git
|
|
1306
|
+
|
|
1307
|
+
Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволит избежать их добавления в ваш репозиторий Git.
|
|
1308
|
+
|
|
1309
|
+
Для этого вы можете добавить следующие инструкции в ваш файл `.gitignore`:
|
|
1310
|
+
|
|
1311
|
+
```plaintext fileName=".gitignore"
|
|
1312
|
+
# Игнорировать файлы, сгенерированные Intlayer
|
|
1313
|
+
.intlayer
|
|
1314
|
+
```
|
|
1315
|
+
|
|
1316
|
+
### Дальнейшие шаги
|
|
1317
|
+
|
|
1318
|
+
Чтобы пойти дальше, вы можете внедрить [визуальный редактор](https://github.com/aymericzip/intlayer/blob/main/docs/ru/intlayer_visual_editor.md) или вынести ваш контент с использованием [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/ru/intlayer_CMS.md).
|