@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,1546 @@
|
|
|
1
|
+
# Начало работы с интернационализацией (i18n) с Intlayer, Vite и React
|
|
2
|
+
|
|
3
|
+
<iframe title="Vite + React: Build a Multilingual App from Scratch using 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/dS9L7uJeak4?autoplay=0&origin=http://intlayer.org&controls=0&rel=1"/>
|
|
4
|
+
|
|
5
|
+
Смотрите [шаблон приложения](https://github.com/aymericzip/intlayer-vite-react-template) на GitHub.
|
|
6
|
+
|
|
7
|
+
## Что такое Intlayer?
|
|
8
|
+
|
|
9
|
+
**Intlayer** , это инновационная библиотека с открытым исходным кодом для интернационализации (i18n), разработанная для упрощения поддержки многоязычности в современных веб-приложениях.
|
|
10
|
+
|
|
11
|
+
С помощью Intlayer вы можете:
|
|
12
|
+
|
|
13
|
+
- **Легко управлять переводами** с использованием декларативных словарей на уровне компонентов.
|
|
14
|
+
- **Динамически локализовать метаданные**, маршруты и контент.
|
|
15
|
+
- **Обеспечить поддержку TypeScript** с автогенерируемыми типами, улучшая автозаполнение и обнаружение ошибок.
|
|
16
|
+
- **Использовать расширенные функции**, такие как динамическое определение и переключение локали.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Пошаговое руководство по настройке Intlayer в приложении Vite и React
|
|
21
|
+
|
|
22
|
+
### Шаг 1: Установка зависимостей
|
|
23
|
+
|
|
24
|
+
Установите необходимые пакеты с помощью npm:
|
|
25
|
+
|
|
26
|
+
```bash packageManager="npm"
|
|
27
|
+
npm install intlayer react-intlayer vite-intlayer
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```bash packageManager="pnpm"
|
|
31
|
+
pnpm add intlayer react-intlayer vite-intlayer
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
```bash packageManager="yarn"
|
|
35
|
+
yarn add intlayer react-intlayer vite-intlayer
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
- **intlayer**
|
|
39
|
+
|
|
40
|
+
Основной пакет, предоставляющий инструменты интернационализации для управления конфигурацией, переводами, [объявления контента](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).
|
|
41
|
+
|
|
42
|
+
- **react-intlayer**
|
|
43
|
+
Пакет, интегрирующий Intlayer с приложением React. Он предоставляет провайдеры контекста и хуки для интернационализации в React.
|
|
44
|
+
|
|
45
|
+
- **vite-intlayer**
|
|
46
|
+
Включает плагин Vite для интеграции Intlayer с [сборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а также middleware для определения предпочтительной локали пользователя, управления cookies и обработки перенаправлений URL.
|
|
47
|
+
|
|
48
|
+
### Шаг 2: Конфигурация вашего проекта
|
|
49
|
+
|
|
50
|
+
Создайте файл конфигурации для настройки языков вашего приложения:
|
|
51
|
+
|
|
52
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
53
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
54
|
+
|
|
55
|
+
const config: IntlayerConfig = {
|
|
56
|
+
internationalization: {
|
|
57
|
+
locales: [
|
|
58
|
+
Locales.ENGLISH,
|
|
59
|
+
Locales.FRENCH,
|
|
60
|
+
Locales.SPANISH,
|
|
61
|
+
// Ваши другие локали
|
|
62
|
+
],
|
|
63
|
+
defaultLocale: Locales.ENGLISH,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export default config;
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
71
|
+
import { Locales } from "intlayer";
|
|
72
|
+
|
|
73
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
74
|
+
const config = {
|
|
75
|
+
internationalization: {
|
|
76
|
+
locales: [
|
|
77
|
+
Locales.ENGLISH,
|
|
78
|
+
Locales.FRENCH,
|
|
79
|
+
Locales.SPANISH,
|
|
80
|
+
// Ваши другие локали
|
|
81
|
+
],
|
|
82
|
+
defaultLocale: Locales.ENGLISH,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export default config;
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
90
|
+
const { Locales } = require("intlayer");
|
|
91
|
+
|
|
92
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
93
|
+
const config = {
|
|
94
|
+
internationalization: {
|
|
95
|
+
locales: [
|
|
96
|
+
Locales.ENGLISH,
|
|
97
|
+
Locales.FRENCH,
|
|
98
|
+
Locales.SPANISH,
|
|
99
|
+
// Ваши другие локали
|
|
100
|
+
],
|
|
101
|
+
defaultLocale: Locales.ENGLISH,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
module.exports = config;
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
> Через этот файл конфигурации вы можете настроить локализованные URL, перенаправления middleware, имена cookies, расположение и расширение ваших деклараций контента, отключить логи Intlayer в консоли и многое другое. Для полного списка доступных параметров обратитесь к [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/ru/configuration.md).
|
|
109
|
+
|
|
110
|
+
### Шаг 3: Интеграция Intlayer в конфигурацию Vite
|
|
111
|
+
|
|
112
|
+
Добавьте плагин intlayer в вашу конфигурацию.
|
|
113
|
+
|
|
114
|
+
```typescript fileName="vite.config.ts" codeFormat="typescript"
|
|
115
|
+
import { defineConfig } from "vite";
|
|
116
|
+
import react from "@vitejs/plugin-react-swc";
|
|
117
|
+
import { intlayerPlugin } from "vite-intlayer";
|
|
118
|
+
|
|
119
|
+
// https://vitejs.dev/config/
|
|
120
|
+
export default defineConfig({
|
|
121
|
+
plugins: [react(), intlayerPlugin()],
|
|
122
|
+
});
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
```javascript fileName="vite.config.mjs" codeFormat="esm"
|
|
126
|
+
import { defineConfig } from "vite";
|
|
127
|
+
import react from "@vitejs/plugin-react-swc";
|
|
128
|
+
import { intlayerPlugin } from "vite-intlayer";
|
|
129
|
+
|
|
130
|
+
// https://vitejs.dev/config/
|
|
131
|
+
export default defineConfig({
|
|
132
|
+
plugins: [react(), intlayerPlugin()],
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```javascript fileName="vite.config.cjs" codeFormat="commonjs"
|
|
137
|
+
const { defineConfig } = require("vite");
|
|
138
|
+
const react = require("@vitejs/plugin-react-swc");
|
|
139
|
+
const { intlayerPlugin } = require("vite-intlayer");
|
|
140
|
+
|
|
141
|
+
// https://vitejs.dev/config/
|
|
142
|
+
module.exports = defineConfig({
|
|
143
|
+
plugins: [react(), intlayerPlugin()],
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
> Плагин `intlayerPlugin()` для Vite используется для интеграции Intlayer с Vite. Он обеспечивает создание файлов декларации контента и их мониторинг в режиме разработки. Он определяет переменные окружения Intlayer в приложении Vite. Кроме того, он предоставляет алиасы для оптимизации производительности.
|
|
148
|
+
|
|
149
|
+
### Шаг 4: Объявление вашего контента
|
|
150
|
+
|
|
151
|
+
Создайте и управляйте декларациями контента для хранения переводов:
|
|
152
|
+
|
|
153
|
+
```tsx fileName="src/app.content.tsx" contentDeclarationFormat="typescript"
|
|
154
|
+
import { t, type Dictionary } from "intlayer";
|
|
155
|
+
import type { ReactNode } from "react";
|
|
156
|
+
|
|
157
|
+
const appContent = {
|
|
158
|
+
key: "app",
|
|
159
|
+
content: {
|
|
160
|
+
viteLogo: t({
|
|
161
|
+
ru: "Логотип Vite",
|
|
162
|
+
en: "Vite logo",
|
|
163
|
+
fr: "Logo Vite",
|
|
164
|
+
es: "Logo Vite",
|
|
165
|
+
}),
|
|
166
|
+
reactLogo: t({
|
|
167
|
+
ru: "Логотип React",
|
|
168
|
+
en: "React logo",
|
|
169
|
+
fr: "Logo React",
|
|
170
|
+
es: "Logo React",
|
|
171
|
+
}),
|
|
172
|
+
|
|
173
|
+
title: "Vite + React",
|
|
174
|
+
|
|
175
|
+
count: t({
|
|
176
|
+
ru: "счет равен ",
|
|
177
|
+
en: "count is ",
|
|
178
|
+
fr: "le compte est ",
|
|
179
|
+
es: "el recuento es ",
|
|
180
|
+
}),
|
|
181
|
+
|
|
182
|
+
edit: t<ReactNode>({
|
|
183
|
+
ru: (
|
|
184
|
+
<>
|
|
185
|
+
Редактируйте <code>src/App.tsx</code> и сохраните, чтобы
|
|
186
|
+
протестировать HMR
|
|
187
|
+
</>
|
|
188
|
+
),
|
|
189
|
+
en: (
|
|
190
|
+
<>
|
|
191
|
+
Edit <code>src/App.tsx</code> and save to test HMR
|
|
192
|
+
</>
|
|
193
|
+
),
|
|
194
|
+
fr: (
|
|
195
|
+
<>
|
|
196
|
+
Éditez <code>src/App.tsx</code> et enregistrez pour tester HMR
|
|
197
|
+
</>
|
|
198
|
+
),
|
|
199
|
+
es: (
|
|
200
|
+
<>
|
|
201
|
+
Edita <code>src/App.tsx</code> y guarda para probar HMR
|
|
202
|
+
</>
|
|
203
|
+
),
|
|
204
|
+
}),
|
|
205
|
+
|
|
206
|
+
readTheDocs: t({
|
|
207
|
+
ru: "Нажмите на логотипы Vite и React, чтобы узнать больше",
|
|
208
|
+
en: "Click on the Vite and React logos to learn more",
|
|
209
|
+
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
210
|
+
es: "Haga clic en los logotipos de Vite y React para obtener más información",
|
|
211
|
+
}),
|
|
212
|
+
},
|
|
213
|
+
} satisfies Dictionary;
|
|
214
|
+
|
|
215
|
+
export default appContent;
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
```javascript fileName="src/app.content.mjs" contentDeclarationFormat="esm"
|
|
219
|
+
import { t } from "intlayer";
|
|
220
|
+
|
|
221
|
+
/** @type {import('intlayer').Dictionary} */
|
|
222
|
+
const appContent = {
|
|
223
|
+
key: "app",
|
|
224
|
+
content: {
|
|
225
|
+
viteLogo: t({
|
|
226
|
+
ru: "Логотип Vite",
|
|
227
|
+
en: "Vite logo",
|
|
228
|
+
fr: "Logo Vite",
|
|
229
|
+
es: "Logo Vite",
|
|
230
|
+
}),
|
|
231
|
+
reactLogo: t({
|
|
232
|
+
ru: "Логотип React",
|
|
233
|
+
en: "React logo",
|
|
234
|
+
fr: "Logo React",
|
|
235
|
+
es: "Logo React",
|
|
236
|
+
}),
|
|
237
|
+
|
|
238
|
+
title: "Vite + React",
|
|
239
|
+
|
|
240
|
+
count: t({
|
|
241
|
+
ru: "счет равен ",
|
|
242
|
+
en: "count is ",
|
|
243
|
+
fr: "le compte est ",
|
|
244
|
+
es: "el recuento es ",
|
|
245
|
+
}),
|
|
246
|
+
|
|
247
|
+
edit:
|
|
248
|
+
t <
|
|
249
|
+
ReactNode >
|
|
250
|
+
{
|
|
251
|
+
// Не забудьте импортировать React, если вы используете React node в вашем контенте
|
|
252
|
+
ru: (
|
|
253
|
+
<>
|
|
254
|
+
Редактируйте <code>src/App.tsx</code> и сохраните, чтобы
|
|
255
|
+
протестировать HMR
|
|
256
|
+
</>
|
|
257
|
+
),
|
|
258
|
+
en: (
|
|
259
|
+
<>
|
|
260
|
+
Edit <code>src/App.tsx</code> and save to test HMR
|
|
261
|
+
</>
|
|
262
|
+
),
|
|
263
|
+
fr: (
|
|
264
|
+
<>
|
|
265
|
+
Éditez <code>src/App.tsx</code> et enregistrez pour tester HMR
|
|
266
|
+
</>
|
|
267
|
+
),
|
|
268
|
+
es: (
|
|
269
|
+
<>
|
|
270
|
+
Edita <code>src/App.tsx</code> y guarda para probar HMR
|
|
271
|
+
</>
|
|
272
|
+
),
|
|
273
|
+
},
|
|
274
|
+
|
|
275
|
+
readTheDocs: t({
|
|
276
|
+
ru: "Нажмите на логотипы Vite и React, чтобы узнать больше",
|
|
277
|
+
en: "Click on the Vite and React logos to learn more",
|
|
278
|
+
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
279
|
+
es: "Haga clic en los logotipos de Vite y React para obtener más información",
|
|
280
|
+
}),
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
export default appContent;
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
```javascript fileName="src/app.content.cjs" contentDeclarationFormat="commonjs"
|
|
288
|
+
const { t } = require("intlayer");
|
|
289
|
+
|
|
290
|
+
/** @type {import('intlayer').Dictionary} */
|
|
291
|
+
const appContent = {
|
|
292
|
+
key: "app",
|
|
293
|
+
content: {
|
|
294
|
+
viteLogo: t({
|
|
295
|
+
ru: "Логотип Vite",
|
|
296
|
+
en: "Vite logo",
|
|
297
|
+
fr: "Logo Vite",
|
|
298
|
+
es: "Logo Vite",
|
|
299
|
+
}),
|
|
300
|
+
reactLogo: t({
|
|
301
|
+
ru: "Логотип React",
|
|
302
|
+
en: "React logo",
|
|
303
|
+
fr: "Logo React",
|
|
304
|
+
es: "Logo React",
|
|
305
|
+
}),
|
|
306
|
+
|
|
307
|
+
title: "Vite + React",
|
|
308
|
+
|
|
309
|
+
count: t({
|
|
310
|
+
ru: "счет равен ",
|
|
311
|
+
en: "count is ",
|
|
312
|
+
fr: "le compte est ",
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
{
|
|
316
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
317
|
+
"key": "app",
|
|
318
|
+
"content": {
|
|
319
|
+
"viteLogo": {
|
|
320
|
+
"nodeType": "translation",
|
|
321
|
+
"translation": {
|
|
322
|
+
"en": "Vite logo",
|
|
323
|
+
"fr": "Logo Vite",
|
|
324
|
+
"es": "Logo Vite",
|
|
325
|
+
"ru": "Логотип Vite"
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
"reactLogo": {
|
|
329
|
+
"nodeType": "translation",
|
|
330
|
+
"translation": {
|
|
331
|
+
"en": "React logo",
|
|
332
|
+
"fr": "Logo React",
|
|
333
|
+
"es": "Logo React",
|
|
334
|
+
"ru": "Логотип React"
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
"title": {
|
|
338
|
+
"nodeType": "translation",
|
|
339
|
+
"translation": {
|
|
340
|
+
"en": "Vite + React",
|
|
341
|
+
"fr": "Vite + React",
|
|
342
|
+
"es": "Vite + React",
|
|
343
|
+
"ru": "Vite + React"
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
"count": {
|
|
347
|
+
"nodeType": "translation",
|
|
348
|
+
"translation": {
|
|
349
|
+
"en": "count is ",
|
|
350
|
+
"fr": "le compte est ",
|
|
351
|
+
"es": "el recuento es ",
|
|
352
|
+
"ru": "счёт равен "
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
"edit": {
|
|
356
|
+
"nodeType": "translation",
|
|
357
|
+
"translation": {
|
|
358
|
+
"en": "Edit src/App.tsx and save to test HMR",
|
|
359
|
+
"fr": "Éditez src/App.tsx et enregistrez pour tester HMR",
|
|
360
|
+
"es": "Edita src/App.tsx y guarda para probar HMR",
|
|
361
|
+
"ru": "Отредактируйте src/App.tsx и сохраните, чтобы протестировать HMR"
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
"readTheDocs": {
|
|
365
|
+
"nodeType": "translation",
|
|
366
|
+
"translation": {
|
|
367
|
+
"en": "Click on the Vite and React logos to learn more",
|
|
368
|
+
"fr": "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
369
|
+
"es": "Haga clic en los logotipos de Vite y React para obtener más información",
|
|
370
|
+
"ru": "Нажмите на логотипы Vite и React, чтобы узнать больше"
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
> Ваши декларации контента могут быть определены в любом месте вашего приложения, если они включены в каталог `contentDir` (по умолчанию, `./src`). И соответствуют расширению файла декларации контента (по умолчанию, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
378
|
+
|
|
379
|
+
> Для получения более подробной информации обратитесь к [документации по декларации контента](https://github.com/aymericzip/intlayer/blob/main/docs/ru/dictionary/get_started.md).
|
|
380
|
+
|
|
381
|
+
> Если ваш файл контента включает код TSX, вам следует рассмотреть возможность импорта `import React from "react";` в ваш файл контента.
|
|
382
|
+
|
|
383
|
+
### Шаг 5: Используйте Intlayer в вашем коде
|
|
384
|
+
|
|
385
|
+
Получите доступ к словарям контента через ваше приложение:
|
|
386
|
+
|
|
387
|
+
```tsx {5,9} fileName="src/App.tsx" codeFormat="typescript"
|
|
388
|
+
import { useState, type FC } from "react";
|
|
389
|
+
import reactLogo from "./assets/react.svg";
|
|
390
|
+
import viteLogo from "/vite.svg";
|
|
391
|
+
import "./App.css";
|
|
392
|
+
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
393
|
+
|
|
394
|
+
const AppContent: FC = () => {
|
|
395
|
+
const [count, setCount] = useState(0);
|
|
396
|
+
const content = useIntlayer("app");
|
|
397
|
+
|
|
398
|
+
return (
|
|
399
|
+
<>
|
|
400
|
+
<div>
|
|
401
|
+
<a href="https://vitejs.dev" target="_blank">
|
|
402
|
+
<img src={viteLogo} className="logo" alt={content.viteLogo.value} />
|
|
403
|
+
</a>
|
|
404
|
+
<a href="https://react.dev" target="_blank">
|
|
405
|
+
<img
|
|
406
|
+
src={reactLogo}
|
|
407
|
+
className="logo react"
|
|
408
|
+
alt={content.reactLogo.value}
|
|
409
|
+
/>
|
|
410
|
+
</a>
|
|
411
|
+
</div>
|
|
412
|
+
<h1>{content.title}</h1>
|
|
413
|
+
<div className="card">
|
|
414
|
+
<button onClick={() => setCount((count) => count + 1)}>
|
|
415
|
+
{content.count}
|
|
416
|
+
{count}
|
|
417
|
+
</button>
|
|
418
|
+
<p>{content.edit}</p>
|
|
419
|
+
</div>
|
|
420
|
+
<p className="read-the-docs">{content.readTheDocs}</p>
|
|
421
|
+
</>
|
|
422
|
+
);
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
const App: FC = () => (
|
|
426
|
+
<IntlayerProvider>
|
|
427
|
+
<AppContent />
|
|
428
|
+
</IntlayerProvider>
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
export default App;
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
```tsx {5,9} fileName="src/App.msx" codeFormat="esm"
|
|
435
|
+
import { useState } from "react";
|
|
436
|
+
import reactLogo from "./assets/react.svg";
|
|
437
|
+
import viteLogo from "/vite.svg";
|
|
438
|
+
import "./App.css";
|
|
439
|
+
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
440
|
+
|
|
441
|
+
const AppContent = () => {
|
|
442
|
+
const [count, setCount] = useState(0);
|
|
443
|
+
const content = useIntlayer("app");
|
|
444
|
+
|
|
445
|
+
return (
|
|
446
|
+
<>
|
|
447
|
+
<div>
|
|
448
|
+
<a href="https://vitejs.dev" target="_blank">
|
|
449
|
+
<img src={viteLogo} className="logo" alt={content.viteLogo.value} />
|
|
450
|
+
</a>
|
|
451
|
+
<a href="https://react.dev" target="_blank">
|
|
452
|
+
<img
|
|
453
|
+
src={reactLogo}
|
|
454
|
+
className="logo react"
|
|
455
|
+
alt={content.reactLogo.value}
|
|
456
|
+
/>
|
|
457
|
+
</a>
|
|
458
|
+
</div>
|
|
459
|
+
<h1>{content.title}</h1>
|
|
460
|
+
<div className="card">
|
|
461
|
+
<button onClick={() => setCount((count) => count + 1)}>
|
|
462
|
+
{content.count}
|
|
463
|
+
{count}
|
|
464
|
+
</button>
|
|
465
|
+
<p>{content.edit}</p>
|
|
466
|
+
</div>
|
|
467
|
+
<p className="read-the-docs">{content.readTheDocs}</p>
|
|
468
|
+
</>
|
|
469
|
+
);
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
const App = () => (
|
|
473
|
+
<IntlayerProvider>
|
|
474
|
+
<AppContent />
|
|
475
|
+
</IntlayerProvider>
|
|
476
|
+
);
|
|
477
|
+
|
|
478
|
+
export default App;
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
```tsx {5,9} fileName="src/App.csx" codeFormat="commonjs"
|
|
482
|
+
const { useState } = require("react");
|
|
483
|
+
const reactLogo = require("./assets/react.svg");
|
|
484
|
+
const viteLogo = require("/vite.svg");
|
|
485
|
+
require("./App.css");
|
|
486
|
+
const { IntlayerProvider, useIntlayer } = require("react-intlayer");
|
|
487
|
+
|
|
488
|
+
const AppContent = () => {
|
|
489
|
+
const [count, setCount] = useState(0);
|
|
490
|
+
const content = useIntlayer("app");
|
|
491
|
+
|
|
492
|
+
return (
|
|
493
|
+
<>
|
|
494
|
+
<div>
|
|
495
|
+
<a href="https://vitejs.dev" target="_blank">
|
|
496
|
+
<img src={viteLogo} className="logo" alt={content.viteLogo.value} />
|
|
497
|
+
</a>
|
|
498
|
+
<a href="https://react.dev" target="_blank">
|
|
499
|
+
<img
|
|
500
|
+
src={reactLogo}
|
|
501
|
+
className="logo react"
|
|
502
|
+
alt={content.reactLogo.value}
|
|
503
|
+
/>
|
|
504
|
+
</a>
|
|
505
|
+
</div>
|
|
506
|
+
<h1>{content.title}</h1>
|
|
507
|
+
<div className="card">
|
|
508
|
+
<button onClick={() => setCount((count) => count + 1)}>
|
|
509
|
+
{content.count}
|
|
510
|
+
{count}
|
|
511
|
+
</button>
|
|
512
|
+
<p>{content.edit}</p>
|
|
513
|
+
</div>
|
|
514
|
+
<p className="read-the-docs">{content.readTheDocs}</p>
|
|
515
|
+
</>
|
|
516
|
+
);
|
|
517
|
+
};
|
|
518
|
+
|
|
519
|
+
const App = () => (
|
|
520
|
+
<IntlayerProvider>
|
|
521
|
+
<AppContent />
|
|
522
|
+
</IntlayerProvider>
|
|
523
|
+
);
|
|
524
|
+
|
|
525
|
+
module.exports = App;
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
> Если вы хотите использовать ваш контент в атрибуте `string`, таком как `alt`, `title`, `href`, `aria-label` и т.д., вы должны вызвать значение функции, например:
|
|
529
|
+
|
|
530
|
+
> ```jsx
|
|
531
|
+
>
|
|
532
|
+
> ```
|
|
533
|
+
|
|
534
|
+
> <img src={content.image.src.value} alt={content.image.value} />
|
|
535
|
+
|
|
536
|
+
> ```
|
|
537
|
+
>
|
|
538
|
+
> ```
|
|
539
|
+
|
|
540
|
+
> Чтобы узнать больше о хуке `useIntlayer`, обратитесь к [документации](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/react-intlayer/useIntlayer.md).
|
|
541
|
+
|
|
542
|
+
### (Опционально) Шаг 6: Измените язык вашего контента
|
|
543
|
+
|
|
544
|
+
Чтобы изменить язык вашего контента, вы можете использовать функцию `setLocale`, предоставляемую хуком `useLocale`. Эта функция позволяет установить локаль приложения и обновить контент соответствующим образом.
|
|
545
|
+
|
|
546
|
+
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
547
|
+
import type { FC } from "react";
|
|
548
|
+
import { Locales } from "intlayer";
|
|
549
|
+
import { useLocale } from "react-intlayer";
|
|
550
|
+
|
|
551
|
+
const LocaleSwitcher: FC = () => {
|
|
552
|
+
const { setLocale } = useLocale();
|
|
553
|
+
|
|
554
|
+
return (
|
|
555
|
+
<button onClick={() => setLocale(Locales.English)}>
|
|
556
|
+
Изменить язык на английский
|
|
557
|
+
</button>
|
|
558
|
+
);
|
|
559
|
+
};
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
```jsx fileName="src/components/LocaleSwitcher.msx" codeFormat="esm"
|
|
563
|
+
import { Locales } from "intlayer";
|
|
564
|
+
import { useLocale } from "react-intlayer";
|
|
565
|
+
|
|
566
|
+
const LocaleSwitcher = () => {
|
|
567
|
+
const { setLocale } = useLocale();
|
|
568
|
+
|
|
569
|
+
return (
|
|
570
|
+
<button onClick={() => setLocale(Locales.English)}>
|
|
571
|
+
Изменить язык на английский
|
|
572
|
+
</button>
|
|
573
|
+
);
|
|
574
|
+
};
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
```jsx fileName="src/components/LocaleSwitcher.csx" codeFormat="commonjs"
|
|
578
|
+
const { Locales } = require("intlayer");
|
|
579
|
+
|
|
580
|
+
const { useLocale } = require("react-intlayer");
|
|
581
|
+
|
|
582
|
+
const LocaleSwitcher = () => {
|
|
583
|
+
const { setLocale } = useLocale();
|
|
584
|
+
|
|
585
|
+
return (
|
|
586
|
+
<button onClick={() => setLocale(Locales.English)}>
|
|
587
|
+
Изменить язык на английский
|
|
588
|
+
</button>
|
|
589
|
+
);
|
|
590
|
+
};
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
> Чтобы узнать больше о хуке `useLocale`, обратитесь к [документации](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/react-intlayer/useLocale.md).
|
|
594
|
+
|
|
595
|
+
### (Необязательно) Шаг 7: Добавьте локализованные маршруты в ваше приложение
|
|
596
|
+
|
|
597
|
+
Цель этого шага , создать уникальные маршруты для каждого языка. Это полезно для SEO и SEO-дружественных URL.
|
|
598
|
+
Пример:
|
|
599
|
+
|
|
600
|
+
```plaintext
|
|
601
|
+
- https://example.com/about
|
|
602
|
+
- https://example.com/es/about
|
|
603
|
+
- https://example.com/fr/about
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
> По умолчанию маршруты не имеют префикса для языка по умолчанию. Если вы хотите добавить префикс для языка по умолчанию, вы можете установить опцию `middleware.prefixDefault` в `true` в вашей конфигурации. Подробнее см. в [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/ru/configuration.md).
|
|
607
|
+
|
|
608
|
+
Чтобы добавить локализованные маршруты в ваше приложение, вы можете создать компонент `LocaleRouter`, который оборачивает маршруты вашего приложения и обрабатывает маршрутизацию на основе языка. Вот пример с использованием [React Router](https://reactrouter.com/home):
|
|
609
|
+
|
|
610
|
+
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
611
|
+
// Импорт необходимых зависимостей и функций
|
|
612
|
+
import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // Утилиты и типы из 'intlayer'
|
|
613
|
+
import type { FC, PropsWithChildren } from "react"; // Типы React для функциональных компонентов и пропсов
|
|
614
|
+
import { IntlayerProvider } from "react-intlayer"; // Провайдер для контекста интернационализации
|
|
615
|
+
import {
|
|
616
|
+
BrowserRouter,
|
|
617
|
+
Routes,
|
|
618
|
+
Route,
|
|
619
|
+
Navigate,
|
|
620
|
+
useLocation,
|
|
621
|
+
} from "react-router-dom"; // Компоненты маршрутизации для управления навигацией
|
|
622
|
+
|
|
623
|
+
// Деструктуризация конфигурации из Intlayer
|
|
624
|
+
const { internationalization, middleware } = configuration;
|
|
625
|
+
const { locales, defaultLocale } = internationalization;
|
|
626
|
+
|
|
627
|
+
/**
|
|
628
|
+
* Компонент, который обрабатывает локализацию и оборачивает дочерние элементы в соответствующий контекст языка.
|
|
629
|
+
* Управляет определением и проверкой языка на основе URL.
|
|
630
|
+
*/
|
|
631
|
+
const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
632
|
+
children,
|
|
633
|
+
locale,
|
|
634
|
+
}) => {
|
|
635
|
+
const { pathname, search } = useLocation(); // Получение текущего пути URL
|
|
636
|
+
|
|
637
|
+
// Определение текущего языка, с использованием языка по умолчанию, если не указан
|
|
638
|
+
const currentLocale = locale ?? defaultLocale;
|
|
639
|
+
|
|
640
|
+
// Удаление префикса языка из пути для создания базового пути
|
|
641
|
+
const pathWithoutLocale = getPathWithoutLocale(
|
|
642
|
+
pathname // Текущий путь URL
|
|
643
|
+
);
|
|
644
|
+
|
|
645
|
+
/**
|
|
646
|
+
* Если middleware.prefixDefault установлено в true, язык по умолчанию всегда должен быть с префиксом.
|
|
647
|
+
*/
|
|
648
|
+
if (middleware.prefixDefault) {
|
|
649
|
+
// Проверка языка
|
|
650
|
+
if (!locale || !locales.includes(locale)) {
|
|
651
|
+
// Перенаправление на язык по умолчанию с обновленным путем
|
|
652
|
+
return (
|
|
653
|
+
<Navigate
|
|
654
|
+
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
655
|
+
replace // Замена текущей записи в истории на новую
|
|
656
|
+
/>
|
|
657
|
+
);
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
// Оборачивание дочерних элементов с помощью IntlayerProvider и установка текущего языка
|
|
661
|
+
return (
|
|
662
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
663
|
+
);
|
|
664
|
+
} else {
|
|
665
|
+
/**
|
|
666
|
+
* Когда middleware.prefixDefault установлено в false, язык по умолчанию не имеет префикса.
|
|
667
|
+
* Убедитесь, что текущий язык действителен и не является языком по умолчанию.
|
|
668
|
+
*/
|
|
669
|
+
if (
|
|
670
|
+
currentLocale.toString() !== defaultLocale.toString() &&
|
|
671
|
+
!locales
|
|
672
|
+
.filter(
|
|
673
|
+
(locale) => locale.toString() !== defaultLocale.toString() // Исключение языка по умолчанию
|
|
674
|
+
)
|
|
675
|
+
.includes(currentLocale) // Проверка, находится ли текущий язык в списке допустимых языков
|
|
676
|
+
) {
|
|
677
|
+
// Перенаправление на путь без префикса языка
|
|
678
|
+
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
// Оборачивание дочерних элементов с помощью IntlayerProvider и установка текущего языка
|
|
682
|
+
return (
|
|
683
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
684
|
+
);
|
|
685
|
+
}
|
|
686
|
+
};
|
|
687
|
+
|
|
688
|
+
/**
|
|
689
|
+
* Компонент маршрутизатора, который настраивает маршруты для конкретных языков.
|
|
690
|
+
* Использует React Router для управления навигацией и рендеринга локализованных компонентов.
|
|
691
|
+
*/
|
|
692
|
+
export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
693
|
+
<BrowserRouter>
|
|
694
|
+
<Routes>
|
|
695
|
+
{locales
|
|
696
|
+
.filter(
|
|
697
|
+
(locale) => middleware.prefixDefault || locale !== defaultLocale
|
|
698
|
+
)
|
|
699
|
+
.map((locale) => (
|
|
700
|
+
<Route
|
|
701
|
+
// Шаблон маршрута для захвата языка (например, /en/, /fr/) и соответствия всем последующим путям
|
|
702
|
+
path={`/${locale}/*`}
|
|
703
|
+
key={locale}
|
|
704
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Оборачивает дочерние элементы с управлением языком
|
|
705
|
+
/>
|
|
706
|
+
))}
|
|
707
|
+
|
|
708
|
+
{
|
|
709
|
+
// Если префикс для языка по умолчанию отключен, рендеринг дочерних элементов непосредственно в корневом пути
|
|
710
|
+
!middleware.prefixDefault && (
|
|
711
|
+
<Route
|
|
712
|
+
path="*"
|
|
713
|
+
element={
|
|
714
|
+
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
715
|
+
} // Оборачивает дочерние элементы с управлением языком
|
|
716
|
+
/>
|
|
717
|
+
)
|
|
718
|
+
}
|
|
719
|
+
</Routes>
|
|
720
|
+
</BrowserRouter>
|
|
721
|
+
);
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
```jsx fileName="src/components/LocaleRouter.mjx" codeFormat="esm"
|
|
725
|
+
// Импорт необходимых зависимостей и функций
|
|
726
|
+
import { configuration, getPathWithoutLocale } from "intlayer"; // Утилиты и типы из 'intlayer'
|
|
727
|
+
import { IntlayerProvider } from "react-intlayer"; // Провайдер для контекста интернационализации
|
|
728
|
+
import {
|
|
729
|
+
BrowserRouter,
|
|
730
|
+
Routes,
|
|
731
|
+
Route,
|
|
732
|
+
Navigate,
|
|
733
|
+
useLocation,
|
|
734
|
+
} from "react-router-dom"; // Компоненты маршрутизации для управления навигацией
|
|
735
|
+
|
|
736
|
+
// Деструктуризация конфигурации из Intlayer
|
|
737
|
+
const { internationalization, middleware } = configuration;
|
|
738
|
+
const { locales, defaultLocale } = internationalization;
|
|
739
|
+
|
|
740
|
+
/**
|
|
741
|
+
* Компонент, который обрабатывает локализацию и оборачивает дочерние элементы в соответствующий контекст языка.
|
|
742
|
+
* Управляет определением и проверкой языка на основе URL.
|
|
743
|
+
*/
|
|
744
|
+
const AppLocalized = ({ children, locale }) => {
|
|
745
|
+
const { pathname, search } = useLocation(); // Получение текущего пути URL
|
|
746
|
+
|
|
747
|
+
// Определение текущего языка, с использованием языка по умолчанию, если не указан
|
|
748
|
+
const currentLocale = locale ?? defaultLocale;
|
|
749
|
+
|
|
750
|
+
// Удаление префикса языка из пути для создания базового пути
|
|
751
|
+
const pathWithoutLocale = getPathWithoutLocale(
|
|
752
|
+
pathname // Текущий путь URL
|
|
753
|
+
);
|
|
754
|
+
|
|
755
|
+
/**
|
|
756
|
+
* Если middleware.prefixDefault установлено в true, язык по умолчанию всегда должен быть с префиксом.
|
|
757
|
+
*/
|
|
758
|
+
if (middleware.prefixDefault) {
|
|
759
|
+
// Проверка языка
|
|
760
|
+
if (!locale || !locales.includes(locale)) {
|
|
761
|
+
// Перенаправление на язык по умолчанию с обновленным путем
|
|
762
|
+
return (
|
|
763
|
+
<Navigate
|
|
764
|
+
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
765
|
+
replace // Замена текущей записи в истории на новую
|
|
766
|
+
/>
|
|
767
|
+
);
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
// Оборачивание дочерних элементов с помощью IntlayerProvider и установка текущего языка
|
|
771
|
+
return (
|
|
772
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
773
|
+
);
|
|
774
|
+
} else {
|
|
775
|
+
/**
|
|
776
|
+
* Когда middleware.prefixDefault установлено в false, язык по умолчанию не имеет префикса.
|
|
777
|
+
* Убедитесь, что текущий язык действителен и не является языком по умолчанию.
|
|
778
|
+
*/
|
|
779
|
+
if (
|
|
780
|
+
currentLocale.toString() !== defaultLocale.toString() &&
|
|
781
|
+
!locales
|
|
782
|
+
.filter(
|
|
783
|
+
(locale) => locale.toString() !== defaultLocale.toString() // Исключение языка по умолчанию
|
|
784
|
+
)
|
|
785
|
+
.includes(currentLocale) // Проверка, находится ли текущий язык в списке допустимых языков
|
|
786
|
+
) {
|
|
787
|
+
// Перенаправление на путь без префикса языка
|
|
788
|
+
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
// Оборачивание дочерних элементов с помощью IntlayerProvider и установка текущего языка
|
|
792
|
+
return (
|
|
793
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
794
|
+
);
|
|
795
|
+
}
|
|
796
|
+
};
|
|
797
|
+
|
|
798
|
+
// Импорт необходимых зависимостей и функций
|
|
799
|
+
const { configuration, getPathWithoutLocale } = require("intlayer"); // Утилиты и типы из 'intlayer'
|
|
800
|
+
const { IntlayerProvider, useLocale } = require("react-intlayer"); // Провайдер для контекста интернационализации
|
|
801
|
+
const {
|
|
802
|
+
BrowserRouter,
|
|
803
|
+
Routes,
|
|
804
|
+
Route,
|
|
805
|
+
Navigate,
|
|
806
|
+
useLocation,
|
|
807
|
+
} = require("react-router-dom"); // Компоненты маршрутизации для управления навигацией
|
|
808
|
+
|
|
809
|
+
// Деструктуризация конфигурации из Intlayer
|
|
810
|
+
const { internationalization, middleware } = configuration;
|
|
811
|
+
const { locales, defaultLocale } = internationalization;
|
|
812
|
+
|
|
813
|
+
/**
|
|
814
|
+
* Компонент, который обрабатывает локализацию и оборачивает дочерние элементы в соответствующий контекст локали.
|
|
815
|
+
* Управляет определением и проверкой локали на основе URL.
|
|
816
|
+
*/
|
|
817
|
+
const AppLocalized = ({ children, locale }) => {
|
|
818
|
+
const { pathname, search } = useLocation(); // Получение текущего пути URL
|
|
819
|
+
|
|
820
|
+
// Определение текущей локали, с использованием локали по умолчанию, если она не указана
|
|
821
|
+
const currentLocale = locale ?? defaultLocale;
|
|
822
|
+
|
|
823
|
+
// Удаление префикса локали из пути для создания базового пути
|
|
824
|
+
const pathWithoutLocale = getPathWithoutLocale(
|
|
825
|
+
pathname // Текущий путь URL
|
|
826
|
+
);
|
|
827
|
+
|
|
828
|
+
/**
|
|
829
|
+
* Если middleware.prefixDefault равно true, локаль по умолчанию всегда должна быть с префиксом.
|
|
830
|
+
*/
|
|
831
|
+
if (middleware.prefixDefault) {
|
|
832
|
+
// Проверка локали
|
|
833
|
+
if (!locale || !locales.includes(locale)) {
|
|
834
|
+
// Перенаправление на локаль по умолчанию с обновленным путем
|
|
835
|
+
return (
|
|
836
|
+
<Navigate
|
|
837
|
+
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
838
|
+
replace // Замена текущей записи в истории на новую
|
|
839
|
+
/>
|
|
840
|
+
);
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
// Оборачивание дочерних элементов с использованием IntlayerProvider и установка текущей локали
|
|
844
|
+
return (
|
|
845
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
846
|
+
);
|
|
847
|
+
} else {
|
|
848
|
+
/**
|
|
849
|
+
* Когда middleware.prefixDefault равно false, локаль по умолчанию не имеет префикса.
|
|
850
|
+
* Убедитесь, что текущая локаль действительна и не является локалью по умолчанию.
|
|
851
|
+
*/
|
|
852
|
+
if (
|
|
853
|
+
currentLocale.toString() !== defaultLocale.toString() &&
|
|
854
|
+
!locales
|
|
855
|
+
.filter(
|
|
856
|
+
(locale) => locale.toString() !== defaultLocale.toString() // Исключение локали по умолчанию
|
|
857
|
+
)
|
|
858
|
+
.includes(currentLocale) // Проверка, находится ли текущая локаль в списке допустимых локалей
|
|
859
|
+
) {
|
|
860
|
+
// Перенаправление на путь без префикса локали
|
|
861
|
+
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
// Оборачивание дочерних элементов с использованием IntlayerProvider и установка текущей локали
|
|
865
|
+
return (
|
|
866
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
867
|
+
);
|
|
868
|
+
}
|
|
869
|
+
};
|
|
870
|
+
|
|
871
|
+
/**
|
|
872
|
+
* Компонент маршрутизатора, который настраивает маршруты, зависящие от локали.
|
|
873
|
+
* Использует React Router для управления навигацией и отображения локализованных компонентов.
|
|
874
|
+
*/
|
|
875
|
+
const LocaleRouter = ({ children }) => (
|
|
876
|
+
<BrowserRouter>
|
|
877
|
+
<Routes>
|
|
878
|
+
{locales
|
|
879
|
+
.filter(
|
|
880
|
+
(locale) => middleware.prefixDefault || locale !== defaultLocale
|
|
881
|
+
)
|
|
882
|
+
.map((locale) => (
|
|
883
|
+
<Route
|
|
884
|
+
// Шаблон маршрута для захвата локали (например, /en/, /fr/) и сопоставления всех последующих путей
|
|
885
|
+
path={`/${locale}/*`}
|
|
886
|
+
key={locale}
|
|
887
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Оборачивание дочерних элементов с управлением локалями
|
|
888
|
+
/>
|
|
889
|
+
))}
|
|
890
|
+
|
|
891
|
+
{
|
|
892
|
+
// Если префикс локали по умолчанию отключен, отображайте дочерние элементы непосредственно в корневом пути
|
|
893
|
+
!middleware.prefixDefault && (
|
|
894
|
+
<Route
|
|
895
|
+
path="*"
|
|
896
|
+
element={
|
|
897
|
+
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
898
|
+
} // Оборачивание дочерних элементов с управлением локалями
|
|
899
|
+
/>
|
|
900
|
+
)
|
|
901
|
+
}
|
|
902
|
+
</Routes>
|
|
903
|
+
</BrowserRouter>
|
|
904
|
+
);
|
|
905
|
+
```
|
|
906
|
+
|
|
907
|
+
Затем вы можете использовать компонент `LocaleRouter` в своем приложении:
|
|
908
|
+
|
|
909
|
+
```tsx fileName="src/App.tsx" codeFormat="typescript"
|
|
910
|
+
import { LocaleRouter } from "./components/LocaleRouter";
|
|
911
|
+
import type { FC } from "react";
|
|
912
|
+
|
|
913
|
+
// ... Ваш компонент AppContent
|
|
914
|
+
|
|
915
|
+
const App: FC = () => (
|
|
916
|
+
<LocaleRouter>
|
|
917
|
+
<AppContent />
|
|
918
|
+
</LocaleRouter>
|
|
919
|
+
);
|
|
920
|
+
```
|
|
921
|
+
|
|
922
|
+
```jsx fileName="src/App.mjx" codeFormat="esm"
|
|
923
|
+
import { LocaleRouter } from "./components/LocaleRouter";
|
|
924
|
+
|
|
925
|
+
// ... Ваш компонент AppContent
|
|
926
|
+
|
|
927
|
+
const App = () => (
|
|
928
|
+
<LocaleRouter>
|
|
929
|
+
<AppContent />
|
|
930
|
+
</LocaleRouter>
|
|
931
|
+
);
|
|
932
|
+
```
|
|
933
|
+
|
|
934
|
+
```jsx fileName="src/App.cjx" codeFormat="commonjs"
|
|
935
|
+
const { LocaleRouter } = require("./components/LocaleRouter");
|
|
936
|
+
|
|
937
|
+
// ... Ваш компонент AppContent
|
|
938
|
+
|
|
939
|
+
const App = () => (
|
|
940
|
+
<LocaleRouter>
|
|
941
|
+
<AppContent />
|
|
942
|
+
</LocaleRouter>
|
|
943
|
+
);
|
|
944
|
+
```
|
|
945
|
+
|
|
946
|
+
Параллельно вы также можете использовать `intLayerMiddlewarePlugin` для добавления маршрутизации на стороне сервера в ваше приложение. Этот плагин автоматически определяет текущую локаль на основе URL и устанавливает соответствующий cookie локали. Если локаль не указана, плагин определяет наиболее подходящую локаль на основе языковых предпочтений браузера пользователя. Если локаль не обнаружена, он перенаправляет на локаль по умолчанию.
|
|
947
|
+
|
|
948
|
+
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
949
|
+
import { defineConfig } from "vite";
|
|
950
|
+
import react from "@vitejs/plugin-react-swc";
|
|
951
|
+
import { intlayerPlugin, intLayerMiddlewarePlugin } from "vite-intlayer";
|
|
952
|
+
|
|
953
|
+
// https://vitejs.dev/config/
|
|
954
|
+
export default defineConfig({
|
|
955
|
+
plugins: [react(), intlayerPlugin(), intLayerMiddlewarePlugin()],
|
|
956
|
+
});
|
|
957
|
+
```
|
|
958
|
+
|
|
959
|
+
```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
|
|
960
|
+
import { defineConfig } from "vite";
|
|
961
|
+
import react from "@vitejs/plugin-react-swc";
|
|
962
|
+
import { intlayerPlugin, intLayerMiddlewarePlugin } from "vite-intlayer";
|
|
963
|
+
|
|
964
|
+
// https://vitejs.dev/config/
|
|
965
|
+
export default defineConfig({
|
|
966
|
+
plugins: [react(), intlayerPlugin(), intLayerMiddlewarePlugin()],
|
|
967
|
+
});
|
|
968
|
+
```
|
|
969
|
+
|
|
970
|
+
```javascript {5,10} fileName="vite.config.cjs" codeFormat="commonjs"
|
|
971
|
+
const { defineConfig } = require("vite");
|
|
972
|
+
const react = require("@vitejs/plugin-react-swc");
|
|
973
|
+
const { intlayerPlugin, intLayerMiddlewarePlugin } = require("vite-intlayer");
|
|
974
|
+
|
|
975
|
+
// https://vitejs.dev/config/
|
|
976
|
+
module.exports = defineConfig({
|
|
977
|
+
plugins: [react(), intlayerPlugin(), intLayerMiddlewarePlugin()],
|
|
978
|
+
});
|
|
979
|
+
```
|
|
980
|
+
|
|
981
|
+
### (Опционально) Шаг 8: Изменение URL при смене локали
|
|
982
|
+
|
|
983
|
+
Чтобы изменить URL при смене локали, вы можете использовать проп `onLocaleChange`, предоставляемый хуком `useLocale`. Параллельно вы можете использовать хуки `useLocation` и `useNavigate` из `react-router-dom` для обновления пути URL.
|
|
984
|
+
|
|
985
|
+
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
986
|
+
import { useLocation, useNavigate } from "react-router-dom";
|
|
987
|
+
import {
|
|
988
|
+
Locales,
|
|
989
|
+
getHTMLTextDir,
|
|
990
|
+
getLocaleName,
|
|
991
|
+
getLocalizedUrl,
|
|
992
|
+
} from "intlayer";
|
|
993
|
+
import { useLocale } from "react-intlayer";
|
|
994
|
+
import { type FC } from "react";
|
|
995
|
+
|
|
996
|
+
const LocaleSwitcher: FC = () => {
|
|
997
|
+
const { pathname, search } = useLocation(); // Получение текущего пути URL. Пример: /fr/about?foo=bar
|
|
998
|
+
const navigate = useNavigate();
|
|
999
|
+
|
|
1000
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
1001
|
+
onLocaleChange: (locale) => {
|
|
1002
|
+
// Построить URL с обновленным языком
|
|
1003
|
+
// Пример: /es/about?foo=bar
|
|
1004
|
+
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
1005
|
+
|
|
1006
|
+
// Обновить путь URL
|
|
1007
|
+
navigate(pathWithLocale);
|
|
1008
|
+
},
|
|
1009
|
+
});
|
|
1010
|
+
|
|
1011
|
+
return (
|
|
1012
|
+
<div>
|
|
1013
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
1014
|
+
<div id="localePopover" popover="auto">
|
|
1015
|
+
{availableLocales.map((localeItem) => (
|
|
1016
|
+
<a
|
|
1017
|
+
href={getLocalizedUrl(location.pathname, localeItem)}
|
|
1018
|
+
hrefLang={localeItem}
|
|
1019
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1020
|
+
onClick={(e) => {
|
|
1021
|
+
e.preventDefault();
|
|
1022
|
+
setLocale(localeItem);
|
|
1023
|
+
}}
|
|
1024
|
+
key={localeItem}
|
|
1025
|
+
>
|
|
1026
|
+
<span>
|
|
1027
|
+
{/* Локаль - например, FR */}
|
|
1028
|
+
{localeItem}
|
|
1029
|
+
</span>
|
|
1030
|
+
<span>
|
|
1031
|
+
{/* Язык на своем языке - например, Français */}
|
|
1032
|
+
{getLocaleName(localeItem, locale)}
|
|
1033
|
+
</span>
|
|
1034
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1035
|
+
{/* Язык на текущем языке - например, Francés, если текущая локаль установлена на Locales.SPANISH */}
|
|
1036
|
+
{getLocaleName(localeItem)}
|
|
1037
|
+
</span>
|
|
1038
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1039
|
+
{/* Язык на английском - например, French */}
|
|
1040
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1041
|
+
</span>
|
|
1042
|
+
</a>
|
|
1043
|
+
))}
|
|
1044
|
+
</div>
|
|
1045
|
+
</div>
|
|
1046
|
+
);
|
|
1047
|
+
};
|
|
1048
|
+
```
|
|
1049
|
+
|
|
1050
|
+
```jsx fileName="src/components/LocaleSwitcher.msx" codeFormat="esm"
|
|
1051
|
+
import { useLocation, useNavigate } from "react-router-dom";
|
|
1052
|
+
import {
|
|
1053
|
+
Locales,
|
|
1054
|
+
getHTMLTextDir,
|
|
1055
|
+
getLocaleName,
|
|
1056
|
+
getLocalizedUrl,
|
|
1057
|
+
} from "intlayer";
|
|
1058
|
+
import { useLocale } from "react-intlayer";
|
|
1059
|
+
|
|
1060
|
+
const LocaleSwitcher = () => {
|
|
1061
|
+
const { pathname, search } = useLocation(); // Получить текущий путь URL. Пример: /fr/about?foo=bar
|
|
1062
|
+
const navigate = useNavigate();
|
|
1063
|
+
|
|
1064
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
1065
|
+
onLocaleChange: (locale) => {
|
|
1066
|
+
// Построить URL с обновленным языком
|
|
1067
|
+
// Пример: /es/about?foo=bar
|
|
1068
|
+
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
1069
|
+
|
|
1070
|
+
// Обновить путь URL
|
|
1071
|
+
navigate(pathWithLocale);
|
|
1072
|
+
},
|
|
1073
|
+
});
|
|
1074
|
+
|
|
1075
|
+
return (
|
|
1076
|
+
<div>
|
|
1077
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
1078
|
+
<div id="localePopover" popover="auto">
|
|
1079
|
+
{availableLocales.map((localeItem) => (
|
|
1080
|
+
<a
|
|
1081
|
+
href={getLocalizedUrl(location.pathname, localeItem)}
|
|
1082
|
+
hrefLang={localeItem}
|
|
1083
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1084
|
+
onClick={(e) => {
|
|
1085
|
+
e.preventDefault();
|
|
1086
|
+
setLocale(localeItem);
|
|
1087
|
+
}}
|
|
1088
|
+
key={localeItem}
|
|
1089
|
+
>
|
|
1090
|
+
<span>
|
|
1091
|
+
{/* Локаль - например, FR */}
|
|
1092
|
+
{localeItem}
|
|
1093
|
+
</span>
|
|
1094
|
+
<span>
|
|
1095
|
+
{/* Язык на своем языке - например, Français */}
|
|
1096
|
+
{getLocaleName(localeItem, locale)}
|
|
1097
|
+
</span>
|
|
1098
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1099
|
+
{/* Язык на текущем языке - например, Francés, если текущая локаль установлена на Locales.SPANISH */}
|
|
1100
|
+
{getLocaleName(localeItem)}
|
|
1101
|
+
</span>
|
|
1102
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1103
|
+
{/* Язык на английском - например, French */}
|
|
1104
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1105
|
+
</span>
|
|
1106
|
+
</a>
|
|
1107
|
+
))}
|
|
1108
|
+
</div>
|
|
1109
|
+
</div>
|
|
1110
|
+
);
|
|
1111
|
+
};
|
|
1112
|
+
```
|
|
1113
|
+
|
|
1114
|
+
```jsx fileName="src/components/LocaleSwitcher.csx" codeFormat="commonjs"
|
|
1115
|
+
const { useLocation, useNavigate } = require("react-router-dom");
|
|
1116
|
+
const {
|
|
1117
|
+
Locales,
|
|
1118
|
+
getHTMLTextDir,
|
|
1119
|
+
getLocaleName,
|
|
1120
|
+
getLocalizedUrl,
|
|
1121
|
+
} = require("intlayer");
|
|
1122
|
+
const { useLocale } = require("react-intlayer");
|
|
1123
|
+
|
|
1124
|
+
const LocaleSwitcher = () => {
|
|
1125
|
+
const { pathname, search } = useLocation(); // Получить текущий путь URL. Пример: /fr/about?foo=bar
|
|
1126
|
+
const navigate = useNavigate();
|
|
1127
|
+
|
|
1128
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
1129
|
+
onLocaleChange: (locale) => {
|
|
1130
|
+
// Построить URL с обновленным языком
|
|
1131
|
+
// Пример: /es/about?foo=bar
|
|
1132
|
+
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
1133
|
+
|
|
1134
|
+
// Обновить путь URL
|
|
1135
|
+
navigate(pathWithLocale);
|
|
1136
|
+
},
|
|
1137
|
+
});
|
|
1138
|
+
|
|
1139
|
+
return (
|
|
1140
|
+
<div>
|
|
1141
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
1142
|
+
<div id="localePopover" popover="auto">
|
|
1143
|
+
{availableLocales.map((localeItem) => (
|
|
1144
|
+
<a
|
|
1145
|
+
href={getLocalizedUrl(location.pathname, localeItem)}
|
|
1146
|
+
hrefLang={localeItem}
|
|
1147
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1148
|
+
onClick={(e) => {
|
|
1149
|
+
e.preventDefault();
|
|
1150
|
+
setLocale(localeItem);
|
|
1151
|
+
}}
|
|
1152
|
+
key={localeItem}
|
|
1153
|
+
>
|
|
1154
|
+
<span>
|
|
1155
|
+
{/* Локаль - например, FR */}
|
|
1156
|
+
{localeItem}
|
|
1157
|
+
</span>
|
|
1158
|
+
<span>
|
|
1159
|
+
{/* Язык на своем языке - например, Français */}
|
|
1160
|
+
{getLocaleName(localeItem, locale)}
|
|
1161
|
+
</span>
|
|
1162
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1163
|
+
{/* Язык на текущем языке - например, Francés, если текущая локаль установлена на Locales.SPANISH */}
|
|
1164
|
+
{getLocaleName(localeItem)}
|
|
1165
|
+
</span>
|
|
1166
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1167
|
+
{/* Язык на английском - например, French */}
|
|
1168
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1169
|
+
</span>
|
|
1170
|
+
</a>
|
|
1171
|
+
))}
|
|
1172
|
+
</div>
|
|
1173
|
+
</div>
|
|
1174
|
+
);
|
|
1175
|
+
};
|
|
1176
|
+
```
|
|
1177
|
+
|
|
1178
|
+
> Ссылки на документацию:
|
|
1179
|
+
|
|
1180
|
+
> - [`useLocale` hook](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/react-intlayer/useLocale.md)
|
|
1181
|
+
|
|
1182
|
+
> - [`getLocaleName` hook](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/intlayer/getLocaleName.md)
|
|
1183
|
+
|
|
1184
|
+
> - [`getLocalizedUrl` hook](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/intlayer/getLocalizedUrl.md)
|
|
1185
|
+
|
|
1186
|
+
> - [`getHTMLTextDir` hook](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/intlayer/getHTMLTextDir.md)
|
|
1187
|
+
|
|
1188
|
+
> - [`hrefLang` attribute](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=ru)
|
|
1189
|
+
|
|
1190
|
+
> - [`lang` attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)
|
|
1191
|
+
|
|
1192
|
+
> - [`dir` attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir)
|
|
1193
|
+
|
|
1194
|
+
> - [`aria-current` attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)
|
|
1195
|
+
|
|
1196
|
+
---
|
|
1197
|
+
|
|
1198
|
+
### (Опционально) Шаг 9: Переключение атрибутов языка и направления HTML
|
|
1199
|
+
|
|
1200
|
+
Когда ваше приложение поддерживает несколько языков, важно обновлять атрибуты `lang` и `dir` тега `<html>` в соответствии с текущей локалью. Это обеспечивает:
|
|
1201
|
+
|
|
1202
|
+
- **Доступность**: Читалки экрана и вспомогательные технологии используют правильный атрибут `lang` для точного произношения и интерпретации контента.
|
|
1203
|
+
- **Отображение текста**: Атрибут `dir` (направление) гарантирует, что текст отображается в правильном порядке (например, слева направо для английского, справа налево для арабского или иврита), что важно для читаемости.
|
|
1204
|
+
- **SEO**: Поисковые системы используют атрибут `lang` для определения языка вашей страницы, помогая предоставлять правильный локализованный контент в результатах поиска.
|
|
1205
|
+
|
|
1206
|
+
Динамически обновляя эти атрибуты при изменении локали, вы гарантируете последовательный и доступный опыт для пользователей на всех поддерживаемых языках.
|
|
1207
|
+
|
|
1208
|
+
#### Реализация Hook
|
|
1209
|
+
|
|
1210
|
+
Создайте пользовательский hook для управления атрибутами HTML. Hook отслеживает изменения локали и обновляет атрибуты соответствующим образом:
|
|
1211
|
+
|
|
1212
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
1213
|
+
import { useEffect } from "react";
|
|
1214
|
+
import { useLocale } from "react-intlayer";
|
|
1215
|
+
import { getHTMLTextDir } from "intlayer";
|
|
1216
|
+
|
|
1217
|
+
/**
|
|
1218
|
+
|
|
1219
|
+
* - `lang`: Информирует браузеры и поисковые системы о языке страницы.
|
|
1220
|
+
* - `dir`: Обеспечивает правильный порядок чтения (например, 'ltr' для английского, 'rtl' для арабского).
|
|
1221
|
+
*
|
|
1222
|
+
* Это динамическое обновление необходимо для корректного отображения текста, доступности и SEO.
|
|
1223
|
+
*/
|
|
1224
|
+
export const useI18nHTMLAttributes = () => {
|
|
1225
|
+
const { locale } = useLocale();
|
|
1226
|
+
|
|
1227
|
+
useEffect(() => {
|
|
1228
|
+
// Обновить атрибут языка до текущей локали.
|
|
1229
|
+
document.documentElement.lang = locale;
|
|
1230
|
+
|
|
1231
|
+
// Установить направление текста в зависимости от текущей локали.
|
|
1232
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1233
|
+
}, [locale]);
|
|
1234
|
+
};
|
|
1235
|
+
```
|
|
1236
|
+
|
|
1237
|
+
```jsx fileName="src/hooks/useI18nHTMLAttributes.msx" codeFormat="esm"
|
|
1238
|
+
import { useEffect } from "react";
|
|
1239
|
+
import { useLocale } from "react-intlayer";
|
|
1240
|
+
import { getHTMLTextDir } from "intlayer";
|
|
1241
|
+
|
|
1242
|
+
/**
|
|
1243
|
+
* Обновляет атрибуты `lang` и `dir` элемента HTML <html> в зависимости от текущей локали.
|
|
1244
|
+
* - `lang`: Информирует браузеры и поисковые системы о языке страницы.
|
|
1245
|
+
* - `dir`: Обеспечивает правильный порядок чтения (например, 'ltr' для английского, 'rtl' для арабского).
|
|
1246
|
+
*
|
|
1247
|
+
* Это динамическое обновление необходимо для корректного отображения текста, доступности и SEO.
|
|
1248
|
+
*/
|
|
1249
|
+
export const useI18nHTMLAttributes = () => {
|
|
1250
|
+
const { locale } = useLocale();
|
|
1251
|
+
|
|
1252
|
+
useEffect(() => {
|
|
1253
|
+
// Обновить атрибут языка до текущей локали.
|
|
1254
|
+
document.documentElement.lang = locale;
|
|
1255
|
+
|
|
1256
|
+
// Установить направление текста в зависимости от текущей локали.
|
|
1257
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1258
|
+
}, [locale]);
|
|
1259
|
+
};
|
|
1260
|
+
```
|
|
1261
|
+
|
|
1262
|
+
```jsx fileName="src/hooks/useI18nHTMLAttributes.csx" codeFormat="commonjs"
|
|
1263
|
+
const { useEffect } = require("react");
|
|
1264
|
+
const { useLocale } = require("react-intlayer");
|
|
1265
|
+
const { getHTMLTextDir } = require("intlayer");
|
|
1266
|
+
|
|
1267
|
+
/**
|
|
1268
|
+
* Обновляет атрибуты `lang` и `dir` элемента HTML <html> в зависимости от текущей локали.
|
|
1269
|
+
* - `lang`: Информирует браузеры и поисковые системы о языке страницы.
|
|
1270
|
+
* - `dir`: Обеспечивает правильный порядок чтения (например, 'ltr' для английского, 'rtl' для арабского).
|
|
1271
|
+
*
|
|
1272
|
+
* Это динамическое обновление необходимо для корректного отображения текста, доступности и SEO.
|
|
1273
|
+
*/
|
|
1274
|
+
const useI18nHTMLAttributes = () => {
|
|
1275
|
+
const { locale } = useLocale();
|
|
1276
|
+
|
|
1277
|
+
useEffect(() => {
|
|
1278
|
+
// Обновить атрибут языка до текущей локали.
|
|
1279
|
+
document.documentElement.lang = locale;
|
|
1280
|
+
|
|
1281
|
+
// Установить направление текста в зависимости от текущей локали.
|
|
1282
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1283
|
+
}, [locale]);
|
|
1284
|
+
};
|
|
1285
|
+
|
|
1286
|
+
module.exports = { useI18nHTMLAttributes };
|
|
1287
|
+
```
|
|
1288
|
+
|
|
1289
|
+
#### Использование хука в вашем приложении
|
|
1290
|
+
|
|
1291
|
+
Интегрируйте хук в ваш основной компонент, чтобы атрибуты HTML обновлялись при изменении локали:
|
|
1292
|
+
|
|
1293
|
+
```tsx fileName="src/App.tsx" codeFormat="typescript"
|
|
1294
|
+
import type { FC } from "react";
|
|
1295
|
+
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
1296
|
+
import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
1297
|
+
import "./App.css";
|
|
1298
|
+
|
|
1299
|
+
const AppContent: FC = () => {
|
|
1300
|
+
// Применить хук для обновления атрибутов lang и dir тега <html> в зависимости от локали.
|
|
1301
|
+
useI18nHTMLAttributes();
|
|
1302
|
+
|
|
1303
|
+
// ... Остальная часть вашего компонента
|
|
1304
|
+
};
|
|
1305
|
+
|
|
1306
|
+
const App: FC = () => (
|
|
1307
|
+
<IntlayerProvider>
|
|
1308
|
+
<AppContent />
|
|
1309
|
+
</IntlayerProvider>
|
|
1310
|
+
);
|
|
1311
|
+
|
|
1312
|
+
export default App;
|
|
1313
|
+
```
|
|
1314
|
+
|
|
1315
|
+
```jsx fileName="src/App.msx" codeFormat="esm"
|
|
1316
|
+
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
1317
|
+
import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
1318
|
+
import "./App.css";
|
|
1319
|
+
|
|
1320
|
+
const AppContent = () => {
|
|
1321
|
+
// Применить хук для обновления атрибутов lang и dir тега <html> в зависимости от локали.
|
|
1322
|
+
useI18nHTMLAttributes();
|
|
1323
|
+
|
|
1324
|
+
// ... Остальная часть вашего компонента
|
|
1325
|
+
};
|
|
1326
|
+
|
|
1327
|
+
const App = () => (
|
|
1328
|
+
<IntlayerProvider>
|
|
1329
|
+
<AppContent />
|
|
1330
|
+
</IntlayerProvider>
|
|
1331
|
+
);
|
|
1332
|
+
|
|
1333
|
+
export default App;
|
|
1334
|
+
```
|
|
1335
|
+
|
|
1336
|
+
```jsx fileName="src/App.csx" codeFormat="commonjs"
|
|
1337
|
+
const { FC } = require("react");
|
|
1338
|
+
const { IntlayerProvider, useIntlayer } = require("react-intlayer");
|
|
1339
|
+
const { useI18nHTMLAttributes } = require("./hooks/useI18nHTMLAttributes");
|
|
1340
|
+
require("./App.css");
|
|
1341
|
+
|
|
1342
|
+
const AppContent = () => {
|
|
1343
|
+
// Применить хук для обновления атрибутов lang и dir тега <html> в зависимости от локали.
|
|
1344
|
+
useI18nHTMLAttributes();
|
|
1345
|
+
|
|
1346
|
+
// ... Остальная часть вашего компонента
|
|
1347
|
+
};
|
|
1348
|
+
|
|
1349
|
+
const App = () => (
|
|
1350
|
+
<IntlayerProvider>
|
|
1351
|
+
<AppContent />
|
|
1352
|
+
</IntlayerProvider>
|
|
1353
|
+
);
|
|
1354
|
+
|
|
1355
|
+
module.exports = App;
|
|
1356
|
+
```
|
|
1357
|
+
|
|
1358
|
+
Применяя эти изменения, ваше приложение будет:
|
|
1359
|
+
|
|
1360
|
+
- Обеспечивать, чтобы атрибут **языка** (`lang`) корректно отражал текущую локаль, что важно для SEO и поведения браузера.
|
|
1361
|
+
- Настраивать **направление текста** (`dir`) в соответствии с локалью, улучшая читаемость и удобство использования для языков с разным порядком чтения.
|
|
1362
|
+
- Предоставлять более **доступный** опыт, так как вспомогательные технологии зависят от этих атрибутов для оптимальной работы.
|
|
1363
|
+
|
|
1364
|
+
### (Опционально) Шаг 10: Создание локализованного компонента Link
|
|
1365
|
+
|
|
1366
|
+
Чтобы обеспечить, что навигация вашего приложения учитывает текущую локаль, вы можете создать пользовательский компонент `Link`. Этот компонент автоматически добавляет префикс к внутренним URL-адресам с текущим языком, например, когда пользователь, говорящий на французском, нажимает на ссылку на страницу "О нас", он будет перенаправлен на `/ru/about` вместо `/about`.
|
|
1367
|
+
|
|
1368
|
+
Это поведение полезно по нескольким причинам:
|
|
1369
|
+
|
|
1370
|
+
- **SEO и пользовательский опыт**: Локализованные URL-адреса помогают поисковым системам правильно индексировать страницы на определенных языках и предоставляют пользователям контент на их предпочтительном языке.
|
|
1371
|
+
- **Последовательность**: Используя локализованную ссылку по всему приложению, вы гарантируете, что навигация остается в рамках текущей локали, предотвращая неожиданные переключения языка.
|
|
1372
|
+
- **Поддерживаемость**: Централизация логики локализации в одном компоненте упрощает управление URL-адресами, делая ваш код более удобным для поддержки и расширения по мере роста приложения.
|
|
1373
|
+
|
|
1374
|
+
Ниже представлена реализация локализованного компонента `Link` на TypeScript:
|
|
1375
|
+
|
|
1376
|
+
```tsx fileName="src/components/Link.tsx" codeFormat="typescript"
|
|
1377
|
+
import { getLocalizedUrl } from "intlayer";
|
|
1378
|
+
import {
|
|
1379
|
+
forwardRef,
|
|
1380
|
+
type DetailedHTMLProps,
|
|
1381
|
+
type AnchorHTMLAttributes,
|
|
1382
|
+
} from "react";
|
|
1383
|
+
import { useLocale } from "react-intlayer";
|
|
1384
|
+
|
|
1385
|
+
export interface LinkProps
|
|
1386
|
+
extends DetailedHTMLProps<
|
|
1387
|
+
AnchorHTMLAttributes<HTMLAnchorElement>,
|
|
1388
|
+
HTMLAnchorElement
|
|
1389
|
+
> {}
|
|
1390
|
+
|
|
1391
|
+
/**
|
|
1392
|
+
* Утилита для проверки, является ли данный URL внешним.
|
|
1393
|
+
* Если URL начинается с http:// или https://, он считается внешним.
|
|
1394
|
+
*/
|
|
1395
|
+
export const checkIsExternalLink = (href?: string): boolean =>
|
|
1396
|
+
/^https?:\/\//.test(href ?? "");
|
|
1397
|
+
|
|
1398
|
+
/**
|
|
1399
|
+
* Пользовательский компонент Link, который адаптирует атрибут href в зависимости от текущей локали.
|
|
1400
|
+
* Для внутренних ссылок используется `getLocalizedUrl` для добавления префикса URL с локалью (например, /ru/about).
|
|
1401
|
+
* Это гарантирует, что навигация остается в рамках текущей локали.
|
|
1402
|
+
*/
|
|
1403
|
+
export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
1404
|
+
({ href, children, ...props }, ref) => {
|
|
1405
|
+
const { locale } = useLocale();
|
|
1406
|
+
const isExternalLink = checkIsExternalLink(href);
|
|
1407
|
+
|
|
1408
|
+
// Если ссылка внутренняя и предоставлен допустимый href, получить локализованный URL.
|
|
1409
|
+
const hrefI18n =
|
|
1410
|
+
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1411
|
+
|
|
1412
|
+
return (
|
|
1413
|
+
<a href={hrefI18n} ref={ref} {...props}>
|
|
1414
|
+
{children}
|
|
1415
|
+
</a>
|
|
1416
|
+
);
|
|
1417
|
+
}
|
|
1418
|
+
);
|
|
1419
|
+
|
|
1420
|
+
Link.displayName = "Link";
|
|
1421
|
+
```
|
|
1422
|
+
|
|
1423
|
+
```jsx fileName="src/components/Link.mjx" codeFormat="esm"
|
|
1424
|
+
import { getLocalizedUrl } from "intlayer";
|
|
1425
|
+
import { useLocale } from "react-intlayer";
|
|
1426
|
+
import { forwardRef } from "react";
|
|
1427
|
+
|
|
1428
|
+
/**
|
|
1429
|
+
* Утилита для проверки, является ли данный URL внешним.
|
|
1430
|
+
* Если URL начинается с http:// или https://, он считается внешним.
|
|
1431
|
+
*/
|
|
1432
|
+
export const checkIsExternalLink = (href?: string): boolean =>
|
|
1433
|
+
/^https?:\/\//.test(href ?? "");
|
|
1434
|
+
|
|
1435
|
+
/**
|
|
1436
|
+
* Пользовательский компонент Link, который адаптирует атрибут href в зависимости от текущей локали.
|
|
1437
|
+
* Для внутренних ссылок используется `getLocalizedUrl` для добавления префикса URL с локалью (например, /ru/about).
|
|
1438
|
+
* Это гарантирует, что навигация остается в рамках текущей локали.
|
|
1439
|
+
*/
|
|
1440
|
+
export const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1441
|
+
|
|
1442
|
+
const { locale } = useLocale();
|
|
1443
|
+
const isExternalLink = checkIsExternalLink(href);
|
|
1444
|
+
|
|
1445
|
+
// Если ссылка внутренняя и предоставлен допустимый href, получить локализованный URL.
|
|
1446
|
+
const hrefI18n =
|
|
1447
|
+
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1448
|
+
|
|
1449
|
+
return (
|
|
1450
|
+
<a href={hrefI18n} ref={ref} {...props}>
|
|
1451
|
+
{children}
|
|
1452
|
+
</a>
|
|
1453
|
+
);
|
|
1454
|
+
});
|
|
1455
|
+
|
|
1456
|
+
Link.displayName = "Link";
|
|
1457
|
+
```
|
|
1458
|
+
|
|
1459
|
+
```jsx fileName="src/components/Link.csx" codeFormat="commonjs"
|
|
1460
|
+
const { getLocalizedUrl } = require("intlayer");
|
|
1461
|
+
const { useLocale } = require("react-intlayer");
|
|
1462
|
+
const { forwardRef } = require("react");
|
|
1463
|
+
|
|
1464
|
+
/**
|
|
1465
|
+
* Утилита для проверки, является ли данный URL внешним.
|
|
1466
|
+
* Если URL начинается с http:// или https://, он считается внешним.
|
|
1467
|
+
*/
|
|
1468
|
+
const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1469
|
+
|
|
1470
|
+
/**
|
|
1471
|
+
* Кастомный компонент Link, который адаптирует атрибут href в зависимости от текущей локали.
|
|
1472
|
+
* Для внутренних ссылок используется `getLocalizedUrl`, чтобы добавить префикс локали к URL (например, /ru/about).
|
|
1473
|
+
* Это гарантирует, что навигация остается в рамках одной локали.
|
|
1474
|
+
*/
|
|
1475
|
+
const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1476
|
+
const { locale } = useLocale();
|
|
1477
|
+
const isExternalLink = checkIsExternalLink(href);
|
|
1478
|
+
|
|
1479
|
+
// Если ссылка внутренняя и предоставлен допустимый href, получить локализованный URL.
|
|
1480
|
+
const localizedHref = isExternalLink ? href : getLocalizedUrl(href, locale);
|
|
1481
|
+
|
|
1482
|
+
return (
|
|
1483
|
+
<a
|
|
1484
|
+
href={localizedHref}
|
|
1485
|
+
ref={ref}
|
|
1486
|
+
{...props}
|
|
1487
|
+
aria-current={isExternalLink ? "external" : undefined}
|
|
1488
|
+
>
|
|
1489
|
+
{children}
|
|
1490
|
+
</a>
|
|
1491
|
+
);
|
|
1492
|
+
});
|
|
1493
|
+
|
|
1494
|
+
Link.displayName = "Link";
|
|
1495
|
+
```
|
|
1496
|
+
|
|
1497
|
+
#### Как это работает
|
|
1498
|
+
|
|
1499
|
+
- **Определение внешних ссылок**:
|
|
1500
|
+
Вспомогательная функция `checkIsExternalLink` определяет, является ли URL внешним. Внешние ссылки остаются неизменными, так как они не требуют локализации.
|
|
1501
|
+
|
|
1502
|
+
- **Получение текущей локали**:
|
|
1503
|
+
Хук `useLocale` предоставляет текущую локаль (например, `ru` для русского).
|
|
1504
|
+
|
|
1505
|
+
- **Локализация URL**:
|
|
1506
|
+
Для внутренних ссылок (т.е. не внешних) используется `getLocalizedUrl`, чтобы автоматически добавить префикс локали к URL. Это означает, что если ваш пользователь находится на русском языке, передача `/about` в качестве `href` преобразует его в `/ru/about`.
|
|
1507
|
+
|
|
1508
|
+
- **Возврат ссылки**:
|
|
1509
|
+
Компонент возвращает элемент `<a>` с локализованным URL, обеспечивая навигацию, соответствующую локали.
|
|
1510
|
+
|
|
1511
|
+
Интегрируя этот компонент `Link` в вашем приложении, вы поддерживаете согласованный и ориентированный на язык пользовательский опыт, а также улучшаете SEO и удобство использования.
|
|
1512
|
+
|
|
1513
|
+
### Настройка TypeScript
|
|
1514
|
+
|
|
1515
|
+
Intlayer использует расширение модулей для получения преимуществ TypeScript и укрепления вашей кодовой базы.
|
|
1516
|
+
|
|
1517
|
+

|
|
1518
|
+
|
|
1519
|
+

|
|
1520
|
+
|
|
1521
|
+
Убедитесь, что ваша конфигурация TypeScript включает автоматически сгенерированные типы.
|
|
1522
|
+
|
|
1523
|
+
```json5 fileName="tsconfig.json"
|
|
1524
|
+
{
|
|
1525
|
+
// ... Ваша существующая конфигурация TypeScript
|
|
1526
|
+
"include": [
|
|
1527
|
+
// ... Ваша существующая конфигурация TypeScript
|
|
1528
|
+
".intlayer/**/*.ts", // Включите автоматически сгенерированные типы
|
|
1529
|
+
],
|
|
1530
|
+
}
|
|
1531
|
+
```
|
|
1532
|
+
|
|
1533
|
+
### Конфигурация Git
|
|
1534
|
+
|
|
1535
|
+
Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволит вам избежать их добавления в ваш Git-репозиторий.
|
|
1536
|
+
|
|
1537
|
+
Для этого вы можете добавить следующие инструкции в ваш файл `.gitignore`:
|
|
1538
|
+
|
|
1539
|
+
```plaintext
|
|
1540
|
+
# Игнорировать файлы, сгенерированные Intlayer
|
|
1541
|
+
.intlayer
|
|
1542
|
+
```
|
|
1543
|
+
|
|
1544
|
+
### Дальнейшие шаги
|
|
1545
|
+
|
|
1546
|
+
Чтобы углубиться, вы можете реализовать [визуальный редактор](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).
|