@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,1196 @@
|
|
|
1
|
+
# Начало работы с интернационализацией (i18n) с Intlayer и React Create App
|
|
2
|
+
|
|
3
|
+
Смотрите [Application Template](https://github.com/aymericzip/intlayer-react-cra-template) на GitHub.
|
|
4
|
+
|
|
5
|
+
## Что такое Intlayer?
|
|
6
|
+
|
|
7
|
+
**Intlayer** , это инновационная, открытая библиотека интернационализации (i18n), разработанная для упрощения поддержки многоязычности в современных веб-приложениях.
|
|
8
|
+
|
|
9
|
+
С помощью Intlayer вы можете:
|
|
10
|
+
|
|
11
|
+
- **Легко управлять переводами** с использованием декларативных словарей на уровне компонентов.
|
|
12
|
+
- **Динамически локализовать метаданные**, маршруты и контент.
|
|
13
|
+
- **Обеспечить поддержку TypeScript** с автогенерируемыми типами, улучшая автозаполнение и обнаружение ошибок.
|
|
14
|
+
- **Использовать расширенные функции**, такие как динамическое определение и переключение локали.
|
|
15
|
+
|
|
16
|
+
## Пошаговое руководство по настройке Intlayer в React-приложении
|
|
17
|
+
|
|
18
|
+
### Шаг 1: Установка зависимостей
|
|
19
|
+
|
|
20
|
+
Установите необходимые пакеты с помощью npm:
|
|
21
|
+
|
|
22
|
+
```bash packageManager="npm"
|
|
23
|
+
npm install intlayer react-intlayer react-scripts-intlayer
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```bash packageManager="pnpm"
|
|
27
|
+
pnpm add intlayer react-intlayer react-scripts-intlayer
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```bash packageManager="yarn"
|
|
31
|
+
yarn add intlayer react-intlayer react-scripts-intlayer
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
- **intlayer**
|
|
35
|
+
|
|
36
|
+
Основной пакет, предоставляющий инструменты интернационализации для управления конфигурацией, переводами, [декларацией контента](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).
|
|
37
|
+
|
|
38
|
+
- **react-intlayer**
|
|
39
|
+
|
|
40
|
+
Пакет, интегрирующий Intlayer с React-приложением. Он предоставляет провайдеры контекста и хуки для интернационализации в React.
|
|
41
|
+
|
|
42
|
+
- **react-scripts-intlayer**
|
|
43
|
+
|
|
44
|
+
Включает команды и плагины `react-scripts-intlayer` для интеграции Intlayer с приложением на основе Create React App. Эти плагины основаны на [craco](https://craco.js.org/) и включают дополнительную конфигурацию для сборщика [Webpack](https://webpack.js.org/).
|
|
45
|
+
|
|
46
|
+
### Шаг 2: Конфигурация вашего проекта
|
|
47
|
+
|
|
48
|
+
Создайте файл конфигурации для настройки языков вашего приложения:
|
|
49
|
+
|
|
50
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
51
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
52
|
+
|
|
53
|
+
const config: IntlayerConfig = {
|
|
54
|
+
internationalization: {
|
|
55
|
+
locales: [
|
|
56
|
+
Locales.ENGLISH,
|
|
57
|
+
Locales.FRENCH,
|
|
58
|
+
Locales.SPANISH,
|
|
59
|
+
// Ваши другие локали
|
|
60
|
+
],
|
|
61
|
+
defaultLocale: Locales.ENGLISH,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export default config;
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
69
|
+
import { Locales } from "intlayer";
|
|
70
|
+
|
|
71
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
72
|
+
const config = {
|
|
73
|
+
internationalization: {
|
|
74
|
+
locales: [
|
|
75
|
+
Locales.ENGLISH,
|
|
76
|
+
Locales.FRENCH,
|
|
77
|
+
Locales.SPANISH,
|
|
78
|
+
// Ваши другие локали
|
|
79
|
+
],
|
|
80
|
+
defaultLocale: Locales.ENGLISH,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export default config;
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
88
|
+
const { Locales } = require("intlayer");
|
|
89
|
+
|
|
90
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
91
|
+
const config = {
|
|
92
|
+
internationalization: {
|
|
93
|
+
locales: [
|
|
94
|
+
Locales.ENGLISH,
|
|
95
|
+
Locales.FRENCH,
|
|
96
|
+
Locales.SPANISH,
|
|
97
|
+
// Ваши другие локали
|
|
98
|
+
],
|
|
99
|
+
defaultLocale: Locales.ENGLISH,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
module.exports = config;
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
> Через этот файл конфигурации вы можете настроить локализованные URL-адреса, перенаправление через middleware, имена cookie, расположение и расширение ваших деклараций контента, отключить логи Intlayer в консоли и многое другое. Для полного списка доступных параметров обратитесь к [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/ru/configuration.md).
|
|
107
|
+
|
|
108
|
+
### Шаг 3: Интеграция Intlayer в конфигурацию CRA
|
|
109
|
+
|
|
110
|
+
Измените ваши скрипты для использования react-intlayer
|
|
111
|
+
|
|
112
|
+
```json fileName="package.json"
|
|
113
|
+
"scripts": {
|
|
114
|
+
"build": "react-scripts-intlayer build",
|
|
115
|
+
"start": "react-scripts-intlayer start",
|
|
116
|
+
"transpile": "intlayer build"
|
|
117
|
+
},
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
> Скрипты `react-scripts-intlayer` основаны на [CRACO](https://craco.js.org/). Вы также можете реализовать собственную настройку на основе плагина intlayer для craco. [См. пример здесь](https://github.com/aymericzip/intlayer/blob/main/examples/react-app/craco.config.js).
|
|
121
|
+
|
|
122
|
+
### Шаг 4: Декларация вашего контента
|
|
123
|
+
|
|
124
|
+
Создайте и управляйте декларациями контента для хранения переводов:
|
|
125
|
+
|
|
126
|
+
```tsx fileName="src/app.content.tsx" codeFormat="typescript"
|
|
127
|
+
import { t, type Dictionary } from "intlayer";
|
|
128
|
+
import React, { type ReactNode } from "react";
|
|
129
|
+
|
|
130
|
+
const appContent = {
|
|
131
|
+
key: "app",
|
|
132
|
+
content: {
|
|
133
|
+
getStarted: t<ReactNode>({
|
|
134
|
+
ru: (
|
|
135
|
+
<>
|
|
136
|
+
Редактируйте <code>src/App.tsx</code> и сохраните для перезагрузки
|
|
137
|
+
</>
|
|
138
|
+
),
|
|
139
|
+
en: (
|
|
140
|
+
<>
|
|
141
|
+
Edit <code>src/App.tsx</code> and save to reload
|
|
142
|
+
</>
|
|
143
|
+
),
|
|
144
|
+
fr: (
|
|
145
|
+
<>
|
|
146
|
+
Éditez <code>src/App.tsx</code> et enregistrez pour recharger
|
|
147
|
+
</>
|
|
148
|
+
),
|
|
149
|
+
es: (
|
|
150
|
+
<>
|
|
151
|
+
Edita <code>src/App.tsx</code> y guarda para recargar
|
|
152
|
+
</>
|
|
153
|
+
),
|
|
154
|
+
}),
|
|
155
|
+
reactLink: {
|
|
156
|
+
href: "https://reactjs.org",
|
|
157
|
+
content: t({
|
|
158
|
+
ru: "Изучить React",
|
|
159
|
+
en: "Learn React",
|
|
160
|
+
fr: "Apprendre React",
|
|
161
|
+
es: "Aprender React",
|
|
162
|
+
}),
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
} satisfies Dictionary;
|
|
166
|
+
|
|
167
|
+
export default appContent;
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
```jsx fileName="src/app.content.mjx" codeFormat="esm"
|
|
171
|
+
import { t } from "intlayer";
|
|
172
|
+
|
|
173
|
+
/** @type {import('intlayer').Dictionary} */
|
|
174
|
+
const appContent = {
|
|
175
|
+
key: "app",
|
|
176
|
+
content: {
|
|
177
|
+
getStarted: t({
|
|
178
|
+
ru: "Начните с редактирования",
|
|
179
|
+
en: "Get started by editing",
|
|
180
|
+
fr: "Commencez par éditer",
|
|
181
|
+
es: "Comience por editar",
|
|
182
|
+
}),
|
|
183
|
+
reactLink: {
|
|
184
|
+
href: "https://reactjs.org",
|
|
185
|
+
content: t({
|
|
186
|
+
ru: "Изучить React",
|
|
187
|
+
en: "Learn React",
|
|
188
|
+
fr: "Apprendre React",
|
|
189
|
+
es: "Aprender React",
|
|
190
|
+
}),
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
export default appContent;
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
```jsx fileName="src/app.content.csx" codeFormat="commonjs"
|
|
199
|
+
const { t } = require("intlayer");
|
|
200
|
+
|
|
201
|
+
/** @type {import('intlayer').Dictionary} */
|
|
202
|
+
const appContent = {
|
|
203
|
+
key: "app",
|
|
204
|
+
content: {
|
|
205
|
+
getStarted: t({
|
|
206
|
+
ru: "Начните с редактирования",
|
|
207
|
+
en: "Get started by editing",
|
|
208
|
+
fr: "Commencez par éditer",
|
|
209
|
+
es: "Comience por editar",
|
|
210
|
+
}),
|
|
211
|
+
reactLink: {
|
|
212
|
+
href: "https://reactjs.org",
|
|
213
|
+
content: t({
|
|
214
|
+
ru: "Изучить React",
|
|
215
|
+
en: "Learn React",
|
|
216
|
+
fr: "Apprendre React",
|
|
217
|
+
es: "Aprender React",
|
|
218
|
+
}),
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
module.exports = appContent;
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
> Ваши декларации контента могут быть определены в любом месте вашего приложения, если они включены в каталог `contentDir` (по умолчанию, `./src`) и соответствуют расширению файла декларации контента (по умолчанию, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
227
|
+
|
|
228
|
+
> Для получения более подробной информации обратитесь к [документации по декларации контента](https://github.com/aymericzip/intlayer/blob/main/docs/ru/dictionary/get_started.md).
|
|
229
|
+
|
|
230
|
+
> Если ваш файл контента включает код TSX, вам следует импортировать `import React from "react";` в ваш файл контента.
|
|
231
|
+
|
|
232
|
+
### Шаг 5: Использование Intlayer в вашем коде
|
|
233
|
+
|
|
234
|
+
Получите доступ к вашим словарям контента по всему приложению:
|
|
235
|
+
|
|
236
|
+
```tsx {4,7} fileName="src/App.tsx" codeFormat="typescript"
|
|
237
|
+
import logo from "./logo.svg";
|
|
238
|
+
import "./App.css";
|
|
239
|
+
import type { FC } from "react";
|
|
240
|
+
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
241
|
+
|
|
242
|
+
const AppContent: FC = () => {
|
|
243
|
+
const content = useIntlayer("app");
|
|
244
|
+
|
|
245
|
+
return (
|
|
246
|
+
<div className="App">
|
|
247
|
+
<img src={logo} className="App-logo" alt="logo" />
|
|
248
|
+
|
|
249
|
+
{content.getStarted}
|
|
250
|
+
<a
|
|
251
|
+
className="App-link"
|
|
252
|
+
href={content.reactLink.href.value}
|
|
253
|
+
target="_blank"
|
|
254
|
+
rel="noopener noreferrer"
|
|
255
|
+
>
|
|
256
|
+
{content.reactLink.content}
|
|
257
|
+
</a>
|
|
258
|
+
</div>
|
|
259
|
+
);
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
const App: FC = () => (
|
|
263
|
+
<IntlayerProvider>
|
|
264
|
+
<AppContent />
|
|
265
|
+
</IntlayerProvider>
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
export default App;
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
```jsx {3,6} fileName="src/App.mjx" codeFormat="esm"
|
|
272
|
+
import "./App.css";
|
|
273
|
+
import logo from "./logo.svg";
|
|
274
|
+
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
275
|
+
|
|
276
|
+
const AppContent = () => {
|
|
277
|
+
const content = useIntlayer("app");
|
|
278
|
+
|
|
279
|
+
return (
|
|
280
|
+
<div className="App">
|
|
281
|
+
<img src={logo} className="App-logo" alt="logo" />
|
|
282
|
+
|
|
283
|
+
{content.getStarted}
|
|
284
|
+
<a
|
|
285
|
+
className="App-link"
|
|
286
|
+
href={content.reactLink.href.value}
|
|
287
|
+
target="_blank"
|
|
288
|
+
rel="noopener noreferrer"
|
|
289
|
+
>
|
|
290
|
+
{content.reactLink.content}
|
|
291
|
+
</a>
|
|
292
|
+
</div>
|
|
293
|
+
);
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
const App = () => (
|
|
297
|
+
<IntlayerProvider>
|
|
298
|
+
<AppContent />
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
require("./App.css");
|
|
302
|
+
const logo = require("./logo.svg");
|
|
303
|
+
const { IntlayerProvider, useIntlayer } = require("react-intlayer");
|
|
304
|
+
|
|
305
|
+
const AppContent = () => {
|
|
306
|
+
const content = useIntlayer("app");
|
|
307
|
+
|
|
308
|
+
return (
|
|
309
|
+
<div className="App">
|
|
310
|
+
<img src={logo} className="App-logo" alt="логотип" />
|
|
311
|
+
|
|
312
|
+
{content.getStarted}
|
|
313
|
+
<a
|
|
314
|
+
className="App-link"
|
|
315
|
+
href={content.reactLink.href.value}
|
|
316
|
+
target="_blank"
|
|
317
|
+
rel="noopener noreferrer"
|
|
318
|
+
>
|
|
319
|
+
{content.reactLink.content}
|
|
320
|
+
</a>
|
|
321
|
+
</div>
|
|
322
|
+
);
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
const App = () => (
|
|
326
|
+
<IntlayerProvider>
|
|
327
|
+
<AppContent />
|
|
328
|
+
</IntlayerProvider>
|
|
329
|
+
);
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
> Примечание: Если вы хотите использовать ваш контент в атрибуте `string`, таком как `alt`, `title`, `href`, `aria-label` и т.д., вы должны вызвать значение функции, например:
|
|
333
|
+
|
|
334
|
+
> ```jsx
|
|
335
|
+
>
|
|
336
|
+
> ```
|
|
337
|
+
|
|
338
|
+
> <img src={content.image.src.value} alt={content.image.value} />
|
|
339
|
+
|
|
340
|
+
> ```
|
|
341
|
+
>
|
|
342
|
+
> ```
|
|
343
|
+
|
|
344
|
+
> Чтобы узнать больше о хуке `useIntlayer`, обратитесь к [документации](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/react-intlayer/useIntlayer.md).
|
|
345
|
+
|
|
346
|
+
### (Опционально) Шаг 6: Изменение языка вашего контента
|
|
347
|
+
|
|
348
|
+
Чтобы изменить язык вашего контента, вы можете использовать функцию `setLocale`, предоставляемую хуком `useLocale`. Эта функция позволяет установить локаль приложения и обновить контент соответствующим образом.
|
|
349
|
+
|
|
350
|
+
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
351
|
+
import { Locales } from "intlayer";
|
|
352
|
+
import { useLocale } from "react-intlayer";
|
|
353
|
+
|
|
354
|
+
const LocaleSwitcher = () => {
|
|
355
|
+
const { setLocale } = useLocale();
|
|
356
|
+
|
|
357
|
+
return (
|
|
358
|
+
<button onClick={() => setLocale(Locales.English)}>
|
|
359
|
+
Изменить язык на английский
|
|
360
|
+
</button>
|
|
361
|
+
);
|
|
362
|
+
};
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
```jsx fileName="src/components/LocaleSwitcher.mjx" codeFormat="esm"
|
|
366
|
+
import { Locales } from "intlayer";
|
|
367
|
+
import { useLocale } from "react-intlayer";
|
|
368
|
+
|
|
369
|
+
const LocaleSwitcher = () => {
|
|
370
|
+
const { setLocale } = useLocale();
|
|
371
|
+
|
|
372
|
+
return (
|
|
373
|
+
<button onClick={() => setLocale(Locales.English)}>
|
|
374
|
+
Изменить язык на английский
|
|
375
|
+
</button>
|
|
376
|
+
);
|
|
377
|
+
};
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
```jsx fileName="src/components/LocaleSwitcher.csx" codeFormat="commonjs"
|
|
381
|
+
const { Locales } = require("intlayer");
|
|
382
|
+
const { useLocale } = require("react-intlayer");
|
|
383
|
+
|
|
384
|
+
const LocaleSwitcher = () => {
|
|
385
|
+
const { setLocale } = useLocale();
|
|
386
|
+
|
|
387
|
+
return (
|
|
388
|
+
<button onClick={() => setLocale(Locales.English)}>
|
|
389
|
+
Изменить язык на английский
|
|
390
|
+
</button>
|
|
391
|
+
);
|
|
392
|
+
};
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
> Чтобы узнать больше о хуке `useLocale`, обратитесь к [документации](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/react-intlayer/useLocale.md).
|
|
396
|
+
|
|
397
|
+
### (Опционально) Шаг 7: Добавление локализованной маршрутизации в ваше приложение
|
|
398
|
+
|
|
399
|
+
Цель этого шага , создать уникальные маршруты для каждого языка. Это полезно для SEO и SEO-дружественных URL.
|
|
400
|
+
Пример:
|
|
401
|
+
|
|
402
|
+
```plaintext
|
|
403
|
+
- https://example.com/about
|
|
404
|
+
- https://example.com/es/about
|
|
405
|
+
- https://example.com/fr/about
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
> По умолчанию маршруты не имеют префикса для локали по умолчанию. Если вы хотите добавить префикс для локали по умолчанию, вы можете установить опцию `middleware.prefixDefault` в `true` в вашей конфигурации. Подробнее смотрите в [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/ru/configuration.md).
|
|
409
|
+
|
|
410
|
+
Чтобы добавить локализованную маршрутизацию в ваше приложение, вы можете создать компонент `LocaleRouter`, который оборачивает маршруты вашего приложения и обрабатывает маршрутизацию на основе локали. Вот пример с использованием [React Router](https://reactrouter.com/home):
|
|
411
|
+
|
|
412
|
+
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
413
|
+
// Импорт необходимых зависимостей и функций
|
|
414
|
+
import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // Утилиты и типы из 'intlayer'
|
|
415
|
+
import type { FC, PropsWithChildren } from "react"; // Типы React для функциональных компонентов и пропсов
|
|
416
|
+
import { IntlayerProvider } from "react-intlayer"; // Провайдер для контекста интернационализации
|
|
417
|
+
import {
|
|
418
|
+
BrowserRouter,
|
|
419
|
+
Routes,
|
|
420
|
+
Route,
|
|
421
|
+
Navigate,
|
|
422
|
+
useLocation,
|
|
423
|
+
} from "react-router-dom"; // Компоненты маршрутизации для управления навигацией
|
|
424
|
+
|
|
425
|
+
// Деструктуризация конфигурации из Intlayer
|
|
426
|
+
const { internationalization, middleware } = configuration;
|
|
427
|
+
const { locales, defaultLocale } = internationalization;
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* Компонент, который обрабатывает локализацию и оборачивает дочерние элементы в соответствующий контекст локали.
|
|
431
|
+
* Управляет обнаружением и проверкой локали на основе URL.
|
|
432
|
+
*/
|
|
433
|
+
const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
434
|
+
children,
|
|
435
|
+
locale,
|
|
436
|
+
}) => {
|
|
437
|
+
const { pathname, search } = useLocation(); // Получение текущего пути URL
|
|
438
|
+
|
|
439
|
+
// Определение текущей локали, с использованием локали по умолчанию, если она не указана
|
|
440
|
+
const currentLocale = locale ?? defaultLocale;
|
|
441
|
+
|
|
442
|
+
// Удаление префикса локали из пути для создания базового пути
|
|
443
|
+
const pathWithoutLocale = getPathWithoutLocale(
|
|
444
|
+
pathname // Текущий путь URL
|
|
445
|
+
);
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Если middleware.prefixDefault установлено в true, локаль по умолчанию всегда должна быть с префиксом.
|
|
449
|
+
*/
|
|
450
|
+
if (middleware.prefixDefault) {
|
|
451
|
+
// Проверка локали
|
|
452
|
+
if (!locale || !locales.includes(locale)) {
|
|
453
|
+
// Перенаправление на локаль по умолчанию с обновленным путем
|
|
454
|
+
return (
|
|
455
|
+
<Navigate
|
|
456
|
+
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
457
|
+
replace // Замена текущей записи в истории на новую
|
|
458
|
+
/>
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
// Оборачивание дочерних элементов с использованием IntlayerProvider и установки текущей локали
|
|
463
|
+
return (
|
|
464
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
465
|
+
);
|
|
466
|
+
} else {
|
|
467
|
+
/**
|
|
468
|
+
* Когда middleware.prefixDefault установлено в false, локаль по умолчанию не имеет префикса.
|
|
469
|
+
* Убедитесь, что текущая локаль действительна и не является локалью по умолчанию.
|
|
470
|
+
*/
|
|
471
|
+
if (
|
|
472
|
+
currentLocale.toString() !== defaultLocale.toString() &&
|
|
473
|
+
!locales
|
|
474
|
+
.filter(
|
|
475
|
+
(locale) => locale.toString() !== defaultLocale.toString() // Исключение локали по умолчанию
|
|
476
|
+
)
|
|
477
|
+
.includes(currentLocale) // Проверка, находится ли текущая локаль в списке допустимых локалей
|
|
478
|
+
) {
|
|
479
|
+
// Перенаправление на путь без префикса локали
|
|
480
|
+
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// Оборачивание дочерних элементов с использованием IntlayerProvider и установки текущей локали
|
|
484
|
+
return (
|
|
485
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
486
|
+
);
|
|
487
|
+
}
|
|
488
|
+
};
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* Компонент маршрутизатора, который настраивает маршруты, специфичные для локали.
|
|
492
|
+
* Использует React Router для управления навигацией и рендеринга локализованных компонентов.
|
|
493
|
+
*/
|
|
494
|
+
export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
495
|
+
<BrowserRouter>
|
|
496
|
+
<Routes>
|
|
497
|
+
{locales
|
|
498
|
+
.filter(
|
|
499
|
+
(locale) => middleware.prefixDefault || locale !== defaultLocale
|
|
500
|
+
)
|
|
501
|
+
.map((locale) => (
|
|
502
|
+
<Route
|
|
503
|
+
// Шаблон маршрута для захвата локали (например, /en/, /fr/) и сопоставления всех последующих путей
|
|
504
|
+
path={`/${locale}/*`}
|
|
505
|
+
key={locale}
|
|
506
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Оборачивает дочерние элементы с управлением локалями
|
|
507
|
+
/>
|
|
508
|
+
))}
|
|
509
|
+
|
|
510
|
+
{
|
|
511
|
+
// Если префиксирование локали по умолчанию отключено, рендеринг дочерних элементов непосредственно в корневом пути
|
|
512
|
+
!middleware.prefixDefault && (
|
|
513
|
+
<Route
|
|
514
|
+
path="*"
|
|
515
|
+
element={
|
|
516
|
+
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
517
|
+
} // Оборачивает дочерние элементы с управлением локалями
|
|
518
|
+
/>
|
|
519
|
+
)
|
|
520
|
+
}
|
|
521
|
+
</Routes>
|
|
522
|
+
</BrowserRouter>
|
|
523
|
+
);
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
```jsx fileName="src/components/LocaleRouter.mjx" codeFormat="esm"
|
|
527
|
+
// Импорт необходимых зависимостей и функций
|
|
528
|
+
import { configuration, getPathWithoutLocale } from "intlayer"; // Утилиты и типы из 'intlayer'
|
|
529
|
+
import { IntlayerProvider } from "react-intlayer"; // Провайдер для контекста интернационализации
|
|
530
|
+
import {
|
|
531
|
+
BrowserRouter,
|
|
532
|
+
Routes,
|
|
533
|
+
Route,
|
|
534
|
+
Navigate,
|
|
535
|
+
useLocation,
|
|
536
|
+
} from "react-router-dom"; // Компоненты маршрутизации для управления навигацией
|
|
537
|
+
|
|
538
|
+
// Деструктуризация конфигурации из Intlayer
|
|
539
|
+
const { internationalization, middleware } = configuration;
|
|
540
|
+
const { locales, defaultLocale } = internationalization;
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
* Компонент, который обрабатывает локализацию и оборачивает дочерние элементы в соответствующий контекст локали.
|
|
544
|
+
* Управляет определением и проверкой локали на основе URL.
|
|
545
|
+
*/
|
|
546
|
+
const AppLocalized = ({ children, locale }) => {
|
|
547
|
+
const { pathname, search } = useLocation(); // Получение текущего пути URL
|
|
548
|
+
|
|
549
|
+
// Определение текущей локали, с использованием локали по умолчанию, если она не указана
|
|
550
|
+
const currentLocale = locale ?? defaultLocale;
|
|
551
|
+
|
|
552
|
+
// Удаление префикса локали из пути для создания базового пути
|
|
553
|
+
const pathWithoutLocale = getPathWithoutLocale(
|
|
554
|
+
pathname // Текущий путь URL
|
|
555
|
+
);
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
* Если middleware.prefixDefault равно true, локаль по умолчанию всегда должна быть с префиксом.
|
|
559
|
+
*/
|
|
560
|
+
if (middleware.prefixDefault) {
|
|
561
|
+
// Проверка локали
|
|
562
|
+
if (!locale || !locales.includes(locale)) {
|
|
563
|
+
// Перенаправление на локаль по умолчанию с обновленным путем
|
|
564
|
+
return (
|
|
565
|
+
<Navigate
|
|
566
|
+
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
567
|
+
replace // Замена текущей записи в истории на новую
|
|
568
|
+
/>
|
|
569
|
+
);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// Оборачивание дочерних элементов с помощью IntlayerProvider и установка текущей локали
|
|
573
|
+
return (
|
|
574
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
575
|
+
);
|
|
576
|
+
} else {
|
|
577
|
+
/**
|
|
578
|
+
* Когда middleware.prefixDefault равно false, локаль по умолчанию не имеет префикса.
|
|
579
|
+
* Убедитесь, что текущая локаль действительна и не является локалью по умолчанию.
|
|
580
|
+
*/
|
|
581
|
+
if (
|
|
582
|
+
currentLocale.toString() !== defaultLocale.toString() &&
|
|
583
|
+
!locales
|
|
584
|
+
.filter(
|
|
585
|
+
(locale) => locale.toString() !== defaultLocale.toString() // Исключение локали по умолчанию
|
|
586
|
+
)
|
|
587
|
+
.includes(currentLocale) // Проверка, находится ли текущая локаль в списке допустимых локалей
|
|
588
|
+
) {
|
|
589
|
+
// Перенаправление на путь без префикса локали
|
|
590
|
+
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
// Оборачивание дочерних элементов с помощью IntlayerProvider и установка текущей локали
|
|
594
|
+
return (
|
|
595
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
596
|
+
);
|
|
597
|
+
}
|
|
598
|
+
};
|
|
599
|
+
|
|
600
|
+
/**
|
|
601
|
+
* Компонент маршрутизатора, который настраивает маршруты, специфичные для локали.
|
|
602
|
+
* Использует React Router для управления навигацией и рендеринга локализованных компонентов.
|
|
603
|
+
*/
|
|
604
|
+
export const LocaleRouter = ({ children }) => (
|
|
605
|
+
<BrowserRouter>
|
|
606
|
+
<Routes>
|
|
607
|
+
{locales
|
|
608
|
+
.filter(
|
|
609
|
+
(locale) => middleware.prefixDefault || locale !== defaultLocale
|
|
610
|
+
)
|
|
611
|
+
.map((locale) => (
|
|
612
|
+
<Route
|
|
613
|
+
// Шаблон маршрута для захвата локали (например, /en/, /fr/) и сопоставления всех последующих путей
|
|
614
|
+
path={`/${locale}/*`}
|
|
615
|
+
key={locale}
|
|
616
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Оборачивает дочерние элементы с управлением локалями
|
|
617
|
+
/>
|
|
618
|
+
))}
|
|
619
|
+
|
|
620
|
+
{
|
|
621
|
+
// Если префикс локали по умолчанию отключен, рендеринг дочерних элементов непосредственно в корневом пути
|
|
622
|
+
!middleware.prefixDefault && (
|
|
623
|
+
<Route
|
|
624
|
+
path="*"
|
|
625
|
+
element={
|
|
626
|
+
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
627
|
+
} // Оборачивает дочерние элементы с управлением локалями
|
|
628
|
+
/>
|
|
629
|
+
)
|
|
630
|
+
}
|
|
631
|
+
</Routes>
|
|
632
|
+
</BrowserRouter>
|
|
633
|
+
);
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
```jsx fileName="src/components/LocaleRouter.cjx" codeFormat="commonjs"
|
|
637
|
+
// Импорт необходимых зависимостей и функций
|
|
638
|
+
const { configuration, getPathWithoutLocale } = require("intlayer"); // Утилиты и типы из 'intlayer'
|
|
639
|
+
const { IntlayerProvider, useLocale } = require("react-intlayer"); // Провайдер для контекста интернационализации
|
|
640
|
+
const {
|
|
641
|
+
BrowserRouter,
|
|
642
|
+
Routes,
|
|
643
|
+
Route,
|
|
644
|
+
Navigate,
|
|
645
|
+
useLocation,
|
|
646
|
+
} = require("react-router-dom"); // Компоненты маршрутизатора для управления навигацией
|
|
647
|
+
|
|
648
|
+
// Деструктуризация конфигурации из Intlayer
|
|
649
|
+
const { internationalization, middleware } = configuration;
|
|
650
|
+
const { locales, defaultLocale } = internationalization;
|
|
651
|
+
|
|
652
|
+
/**
|
|
653
|
+
* Компонент, который обрабатывает локализацию и оборачивает дочерние элементы в соответствующий контекст локали.
|
|
654
|
+
* Управляет определением и проверкой локали на основе URL.
|
|
655
|
+
*/
|
|
656
|
+
const AppLocalized = ({ children, locale }) => {
|
|
657
|
+
const { pathname, search } = useLocation(); // Получение текущего пути URL
|
|
658
|
+
|
|
659
|
+
// Определение текущей локали, с использованием локали по умолчанию, если она не указана
|
|
660
|
+
const currentLocale = locale ?? defaultLocale;
|
|
661
|
+
|
|
662
|
+
// Удаление префикса локали из пути для создания базового пути
|
|
663
|
+
const pathWithoutLocale = getPathWithoutLocale(
|
|
664
|
+
pathname // Текущий путь URL
|
|
665
|
+
);
|
|
666
|
+
|
|
667
|
+
/**
|
|
668
|
+
* Если middleware.prefixDefault равно true, локаль по умолчанию всегда должна быть с префиксом.
|
|
669
|
+
*/
|
|
670
|
+
if (middleware.prefixDefault) {
|
|
671
|
+
// Проверка локали
|
|
672
|
+
if (!locale || !locales.includes(locale)) {
|
|
673
|
+
// Перенаправление на локаль по умолчанию с обновленным путем
|
|
674
|
+
return (
|
|
675
|
+
<Navigate
|
|
676
|
+
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
677
|
+
replace // Замена текущей записи в истории на новую
|
|
678
|
+
/>
|
|
679
|
+
);
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// Оборачивание дочерних элементов с помощью IntlayerProvider и установка текущей локали
|
|
683
|
+
return (
|
|
684
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
685
|
+
);
|
|
686
|
+
} else {
|
|
687
|
+
/**
|
|
688
|
+
* Когда middleware.prefixDefault равно false, локаль по умолчанию не имеет префикса.
|
|
689
|
+
* Убедитесь, что текущая локаль действительна и не является локалью по умолчанию.
|
|
690
|
+
*/
|
|
691
|
+
if (
|
|
692
|
+
currentLocale.toString() !== defaultLocale.toString() &&
|
|
693
|
+
!locales
|
|
694
|
+
.filter(
|
|
695
|
+
(locale) => locale.toString() !== defaultLocale.toString() // Исключение локали по умолчанию
|
|
696
|
+
)
|
|
697
|
+
.includes(currentLocale) // Проверка, находится ли текущая локаль в списке допустимых локалей
|
|
698
|
+
) {
|
|
699
|
+
// Перенаправление на путь без префикса локали
|
|
700
|
+
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
// Оборачивание дочерних элементов с помощью IntlayerProvider и установка текущей локали
|
|
704
|
+
return (
|
|
705
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
706
|
+
);
|
|
707
|
+
}
|
|
708
|
+
};
|
|
709
|
+
|
|
710
|
+
/**
|
|
711
|
+
* Компонент маршрутизатора, который настраивает маршруты, специфичные для локали.
|
|
712
|
+
* Использует React Router для управления навигацией и рендеринга локализованных компонентов.
|
|
713
|
+
*/
|
|
714
|
+
const LocaleRouter = ({ children }) => (
|
|
715
|
+
<BrowserRouter>
|
|
716
|
+
<Routes>
|
|
717
|
+
{locales
|
|
718
|
+
.filter(
|
|
719
|
+
(locale) => middleware.prefixDefault || locale !== defaultLocale
|
|
720
|
+
)
|
|
721
|
+
.map((locale) => (
|
|
722
|
+
<Route
|
|
723
|
+
// Шаблон маршрута для захвата локали (например, /en/, /fr/) и сопоставления всех последующих путей
|
|
724
|
+
path={`/${locale}/*`}
|
|
725
|
+
key={locale}
|
|
726
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Оборачивает дочерние элементы с управлением локалями
|
|
727
|
+
/>
|
|
728
|
+
))}
|
|
729
|
+
|
|
730
|
+
{
|
|
731
|
+
// Если префикс локали по умолчанию отключен, рендеринг дочерних элементов непосредственно в корневом пути
|
|
732
|
+
!middleware.prefixDefault && (
|
|
733
|
+
<Route
|
|
734
|
+
path="*"
|
|
735
|
+
element={
|
|
736
|
+
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
737
|
+
} // Оборачивает дочерние элементы с управлением локалями
|
|
738
|
+
/>
|
|
739
|
+
)
|
|
740
|
+
}
|
|
741
|
+
</Routes>
|
|
742
|
+
</BrowserRouter>
|
|
743
|
+
);
|
|
744
|
+
```
|
|
745
|
+
|
|
746
|
+
Затем вы можете использовать компонент `LocaleRouter` в вашем приложении:
|
|
747
|
+
|
|
748
|
+
```tsx fileName="src/App.tsx" codeFormat="typescript"
|
|
749
|
+
import { LocaleRouter } from "./components/LocaleRouter";
|
|
750
|
+
import type { FC } from "react";
|
|
751
|
+
|
|
752
|
+
// ... Ваш компонент AppContent
|
|
753
|
+
|
|
754
|
+
const App: FC = () => (
|
|
755
|
+
<LocaleRouter>
|
|
756
|
+
<AppContent />
|
|
757
|
+
</LocaleRouter>
|
|
758
|
+
);
|
|
759
|
+
```
|
|
760
|
+
|
|
761
|
+
```jsx fileName="src/App.mjx" codeFormat="esm"
|
|
762
|
+
import { LocaleRouter } from "./components/LocaleRouter";
|
|
763
|
+
|
|
764
|
+
// ... Ваш компонент AppContent
|
|
765
|
+
|
|
766
|
+
const App = () => (
|
|
767
|
+
<LocaleRouter>
|
|
768
|
+
<AppContent />
|
|
769
|
+
</LocaleRouter>
|
|
770
|
+
);
|
|
771
|
+
```
|
|
772
|
+
|
|
773
|
+
```jsx fileName="src/App.cjx" codeFormat="commonjs"
|
|
774
|
+
const { LocaleRouter } = require("./components/LocaleRouter");
|
|
775
|
+
|
|
776
|
+
// ... Ваш компонент AppContent
|
|
777
|
+
|
|
778
|
+
const App = () => (
|
|
779
|
+
<LocaleRouter>
|
|
780
|
+
<AppContent />
|
|
781
|
+
</LocaleRouter>
|
|
782
|
+
);
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
### (Опционально) Шаг 8: Изменение URL при смене локали
|
|
786
|
+
|
|
787
|
+
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
788
|
+
import { useLocation, useNavigate } from "react-router-dom";
|
|
789
|
+
import {
|
|
790
|
+
Locales,
|
|
791
|
+
getHTMLTextDir,
|
|
792
|
+
getLocaleName,
|
|
793
|
+
getLocalizedUrl,
|
|
794
|
+
} from "intlayer";
|
|
795
|
+
import { useLocale } from "react-intlayer";
|
|
796
|
+
import { type FC } from "react";
|
|
797
|
+
|
|
798
|
+
const LocaleSwitcher: FC = () => {
|
|
799
|
+
const { pathname, search } = useLocation(); // Получить текущий путь URL. Пример: /fr/about?foo=bar
|
|
800
|
+
const navigate = useNavigate();
|
|
801
|
+
|
|
802
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
803
|
+
onLocaleChange: (locale) => {
|
|
804
|
+
// Построить URL с обновленной локалью
|
|
805
|
+
// Пример: /es/about?foo=bar
|
|
806
|
+
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
807
|
+
|
|
808
|
+
// Обновить путь URL
|
|
809
|
+
navigate(pathWithLocale);
|
|
810
|
+
},
|
|
811
|
+
});
|
|
812
|
+
|
|
813
|
+
return (
|
|
814
|
+
<div>
|
|
815
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
816
|
+
<div id="localePopover" popover="auto">
|
|
817
|
+
{availableLocales.map((localeItem) => (
|
|
818
|
+
<a
|
|
819
|
+
href={getLocalizedUrl(location.pathname, localeItem)}
|
|
820
|
+
hrefLang={localeItem}
|
|
821
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
822
|
+
onClick={(e) => {
|
|
823
|
+
e.preventDefault();
|
|
824
|
+
setLocale(localeItem);
|
|
825
|
+
}}
|
|
826
|
+
key={localeItem}
|
|
827
|
+
>
|
|
828
|
+
<span>
|
|
829
|
+
{/* Локаль - например, FR */}
|
|
830
|
+
{localeItem}
|
|
831
|
+
</span>
|
|
832
|
+
<span>
|
|
833
|
+
{/* Язык в своей локали - например, Français */}
|
|
834
|
+
{getLocaleName(localeItem, locale)}
|
|
835
|
+
</span>
|
|
836
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
837
|
+
{/* Язык в текущей локали - например, Francés при текущей локали Locales.SPANISH */}
|
|
838
|
+
{getLocaleName(localeItem)}
|
|
839
|
+
</span>
|
|
840
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
841
|
+
{/* Язык на английском - например, French */}
|
|
842
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
843
|
+
</span>
|
|
844
|
+
</a>
|
|
845
|
+
))}
|
|
846
|
+
</div>
|
|
847
|
+
</div>
|
|
848
|
+
);
|
|
849
|
+
};
|
|
850
|
+
```
|
|
851
|
+
|
|
852
|
+
```jsx fileName="src/components/LocaleSwitcher.msx" codeFormat="esm"
|
|
853
|
+
import { useLocation, useNavigate } from "react-router-dom";
|
|
854
|
+
import {
|
|
855
|
+
Locales,
|
|
856
|
+
getHTMLTextDir,
|
|
857
|
+
getLocaleName,
|
|
858
|
+
getLocalizedUrl,
|
|
859
|
+
} from "intlayer";
|
|
860
|
+
import { useLocale } from "react-intlayer";
|
|
861
|
+
|
|
862
|
+
const LocaleSwitcher = () => {
|
|
863
|
+
const { pathname, search } = useLocation(); // Получить текущий путь URL. Пример: /fr/about?foo=bar
|
|
864
|
+
const navigate = useNavigate();
|
|
865
|
+
|
|
866
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
867
|
+
onLocaleChange: (locale) => {
|
|
868
|
+
// Построить URL с обновленной локалью
|
|
869
|
+
// Пример: /es/about?foo=bar
|
|
870
|
+
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
871
|
+
|
|
872
|
+
// Обновить путь URL
|
|
873
|
+
navigate(pathWithLocale);
|
|
874
|
+
},
|
|
875
|
+
});
|
|
876
|
+
|
|
877
|
+
return (
|
|
878
|
+
<div>
|
|
879
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
880
|
+
<div id="localePopover" popover="auto">
|
|
881
|
+
{availableLocales.map((localeItem) => (
|
|
882
|
+
<a
|
|
883
|
+
href={getLocalizedUrl(location.pathname, localeItem)}
|
|
884
|
+
hrefLang={localeItem}
|
|
885
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
886
|
+
onClick={(e) => {
|
|
887
|
+
e.preventDefault();
|
|
888
|
+
setLocale(localeItem);
|
|
889
|
+
}}
|
|
890
|
+
key={localeItem}
|
|
891
|
+
>
|
|
892
|
+
<span>
|
|
893
|
+
{/* Локаль - например, FR */}
|
|
894
|
+
{localeItem}
|
|
895
|
+
</span>
|
|
896
|
+
<span>
|
|
897
|
+
{/* Язык в своей локали - например, Français */}
|
|
898
|
+
{getLocaleName(localeItem, locale)}
|
|
899
|
+
</span>
|
|
900
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
901
|
+
{/* Язык в текущей локали - например, Francés при текущей локали Locales.SPANISH */}
|
|
902
|
+
{getLocaleName(localeItem)}
|
|
903
|
+
</span>
|
|
904
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
905
|
+
{/* Язык на английском - например, French */}
|
|
906
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
907
|
+
</span>
|
|
908
|
+
</a>
|
|
909
|
+
))}
|
|
910
|
+
</div>
|
|
911
|
+
</div>
|
|
912
|
+
);
|
|
913
|
+
};
|
|
914
|
+
```
|
|
915
|
+
|
|
916
|
+
```jsx fileName="src/components/LocaleSwitcher.csx" codeFormat="commonjs"
|
|
917
|
+
const { useLocation, useNavigate } = require("react-router-dom");
|
|
918
|
+
const {
|
|
919
|
+
Locales,
|
|
920
|
+
getHTMLTextDir,
|
|
921
|
+
getLocaleName,
|
|
922
|
+
getLocalizedUrl,
|
|
923
|
+
} = require("intlayer");
|
|
924
|
+
const { useLocale } = require("react-intlayer");
|
|
925
|
+
|
|
926
|
+
const LocaleSwitcher = () => {
|
|
927
|
+
const { pathname, search } = useLocation(); // Получить текущий путь URL. Пример: /fr/about?foo=bar
|
|
928
|
+
const navigate = useNavigate();
|
|
929
|
+
|
|
930
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
931
|
+
onLocaleChange: (locale) => {
|
|
932
|
+
// Построить URL с обновленной локалью
|
|
933
|
+
// Пример: /es/about?foo=bar
|
|
934
|
+
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
935
|
+
|
|
936
|
+
// Обновить путь URL
|
|
937
|
+
navigate(pathWithLocale);
|
|
938
|
+
},
|
|
939
|
+
});
|
|
940
|
+
|
|
941
|
+
return (
|
|
942
|
+
<div>
|
|
943
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
944
|
+
<div id="localePopover" popover="auto">
|
|
945
|
+
{availableLocales.map((localeItem) => (
|
|
946
|
+
<a
|
|
947
|
+
href={getLocalizedUrl(location.pathname, localeItem)}
|
|
948
|
+
hrefLang={localeItem}
|
|
949
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
950
|
+
onClick={(e) => {
|
|
951
|
+
e.preventDefault();
|
|
952
|
+
setLocale(localeItem);
|
|
953
|
+
}}
|
|
954
|
+
key={localeItem}
|
|
955
|
+
>
|
|
956
|
+
<span>
|
|
957
|
+
{/* Локаль - например, FR */}
|
|
958
|
+
{localeItem}
|
|
959
|
+
</span>
|
|
960
|
+
<span>
|
|
961
|
+
{/* Язык в своей локали - например, Français */}
|
|
962
|
+
{getLocaleName(localeItem, locale)}
|
|
963
|
+
</span>
|
|
964
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
965
|
+
{/* Язык в текущей локали - например, Francés при текущей локали Locales.SPANISH */}
|
|
966
|
+
{getLocaleName(localeItem)}
|
|
967
|
+
</span>
|
|
968
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
969
|
+
{/* Язык на английском - например, French */}
|
|
970
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
971
|
+
</span>
|
|
972
|
+
</a>
|
|
973
|
+
))}
|
|
974
|
+
</div>
|
|
975
|
+
</div>
|
|
976
|
+
);
|
|
977
|
+
};
|
|
978
|
+
```
|
|
979
|
+
|
|
980
|
+
> Ссылки на документацию:
|
|
981
|
+
|
|
982
|
+
> - [`useLocale` хук](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/react-intlayer/useLocale.md)
|
|
983
|
+
|
|
984
|
+
> - [`getLocaleName` хук](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/intlayer/getLocaleName.md)
|
|
985
|
+
|
|
986
|
+
> - [`getLocalizedUrl` хук](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/intlayer/getLocalizedUrl.md)
|
|
987
|
+
|
|
988
|
+
> - [`getHTMLTextDir` хук](https://github.com/aymericzip/intlayer/blob/main/docs/ru/packages/intlayer/getHTMLTextDir.md)
|
|
989
|
+
|
|
990
|
+
> - [`hrefLang` атрибут](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=fr)
|
|
991
|
+
|
|
992
|
+
> - [`lang` атрибут](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)
|
|
993
|
+
|
|
994
|
+
> - [`dir` атрибут](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir)
|
|
995
|
+
|
|
996
|
+
> - [`aria-current` атрибут](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)
|
|
997
|
+
|
|
998
|
+
### (Необязательно) Шаг 9: Переключение атрибутов языка и направления HTML
|
|
999
|
+
|
|
1000
|
+
Когда ваше приложение поддерживает несколько языков, важно обновлять атрибуты `lang` и `dir` тега `<html>` в соответствии с текущей локалью. Это обеспечивает:
|
|
1001
|
+
|
|
1002
|
+
- **Доступность**: Читалки экрана и вспомогательные технологии полагаются на правильный атрибут `lang` для точного произношения и интерпретации контента.
|
|
1003
|
+
- **Отображение текста**: Атрибут `dir` (направление) гарантирует, что текст отображается в правильном порядке (например, слева направо для английского, справа налево для арабского или иврита), что важно для читаемости.
|
|
1004
|
+
|
|
1005
|
+
Обновляя эти атрибуты динамически при изменении локали, вы гарантируете последовательный и доступный опыт для пользователей на всех поддерживаемых языках.
|
|
1006
|
+
|
|
1007
|
+
#### Реализация хука
|
|
1008
|
+
|
|
1009
|
+
Создайте пользовательский хук для управления HTML-атрибутами. Хук отслеживает изменения локали и соответственно обновляет атрибуты:
|
|
1010
|
+
|
|
1011
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
1012
|
+
import { useEffect } from "react";
|
|
1013
|
+
import { useLocale } from "react-intlayer";
|
|
1014
|
+
import { getHTMLTextDir } from "intlayer";
|
|
1015
|
+
|
|
1016
|
+
/**
|
|
1017
|
+
* Обновляет атрибуты `lang` и `dir` элемента HTML <html> на основе текущей локали.
|
|
1018
|
+
* - `lang`: Информирует браузеры и поисковые системы о языке страницы.
|
|
1019
|
+
* - `dir`: Обеспечивает правильный порядок чтения (например, 'ltr' для английского, 'rtl' для арабского).
|
|
1020
|
+
*
|
|
1021
|
+
* Это динамическое обновление необходимо для правильного отображения текста, доступности и SEO.
|
|
1022
|
+
*/
|
|
1023
|
+
export const useI18nHTMLAttributes = () => {
|
|
1024
|
+
const { locale } = useLocale();
|
|
1025
|
+
|
|
1026
|
+
useEffect(() => {
|
|
1027
|
+
// Обновляет атрибут языка на текущую локаль.
|
|
1028
|
+
document.documentElement.lang = locale;
|
|
1029
|
+
|
|
1030
|
+
// Устанавливает направление текста на основе текущей локали.
|
|
1031
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1032
|
+
}, [locale]);
|
|
1033
|
+
};
|
|
1034
|
+
```
|
|
1035
|
+
|
|
1036
|
+
```jsx fileName="src/hooks/useI18nHTMLAttributes.msx" codeFormat="esm"
|
|
1037
|
+
import { useEffect } from "react";
|
|
1038
|
+
import { useLocale } from "react-intlayer";
|
|
1039
|
+
import { getHTMLTextDir } from "intlayer";
|
|
1040
|
+
|
|
1041
|
+
/**
|
|
1042
|
+
* Обновляет атрибуты `lang` и `dir` элемента HTML <html> на основе текущей локали.
|
|
1043
|
+
* - `lang`: Информирует браузеры и поисковые системы о языке страницы.
|
|
1044
|
+
* - `dir`: Обеспечивает правильный порядок чтения (например, 'ltr' для английского, 'rtl' для арабского).
|
|
1045
|
+
*
|
|
1046
|
+
* Это динамическое обновление необходимо для правильного отображения текста, доступности и SEO.
|
|
1047
|
+
*/
|
|
1048
|
+
export const useI18nHTMLAttributes = () => {
|
|
1049
|
+
const { locale } = useLocale();
|
|
1050
|
+
|
|
1051
|
+
useEffect(() => {
|
|
1052
|
+
// Обновляет атрибут языка на текущую локаль.
|
|
1053
|
+
document.documentElement.lang = locale;
|
|
1054
|
+
|
|
1055
|
+
// Устанавливает направление текста на основе текущей локали.
|
|
1056
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1057
|
+
}, [locale]);
|
|
1058
|
+
};
|
|
1059
|
+
```
|
|
1060
|
+
|
|
1061
|
+
```jsx fileName="src/hooks/useI18nHTMLAttributes.csx" codeFormat="commonjs"
|
|
1062
|
+
const { useEffect } = require("react");
|
|
1063
|
+
const { useLocale } = require("react-intlayer");
|
|
1064
|
+
const { getHTMLTextDir } = require("intlayer");
|
|
1065
|
+
|
|
1066
|
+
/**
|
|
1067
|
+
* Обновляет атрибуты `lang` и `dir` элемента HTML <html> на основе текущей локали.
|
|
1068
|
+
* - `lang`: Информирует браузеры и поисковые системы о языке страницы.
|
|
1069
|
+
* - `dir`: Обеспечивает правильный порядок чтения (например, 'ltr' для английского, 'rtl' для арабского).
|
|
1070
|
+
*
|
|
1071
|
+
* Это динамическое обновление необходимо для правильного отображения текста, доступности и SEO.
|
|
1072
|
+
*/
|
|
1073
|
+
const useI18nHTMLAttributes = () => {
|
|
1074
|
+
const { locale } = useLocale();
|
|
1075
|
+
|
|
1076
|
+
useEffect(() => {
|
|
1077
|
+
// Обновляет атрибут языка на текущую локаль.
|
|
1078
|
+
document.documentElement.lang = locale;
|
|
1079
|
+
|
|
1080
|
+
// Устанавливает направление текста на основе текущей локали.
|
|
1081
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1082
|
+
}, [locale]);
|
|
1083
|
+
};
|
|
1084
|
+
|
|
1085
|
+
module.exports = { useI18nHTMLAttributes };
|
|
1086
|
+
```
|
|
1087
|
+
|
|
1088
|
+
#### Использование хука в вашем приложении
|
|
1089
|
+
|
|
1090
|
+
Интегрируйте хук в ваш основной компонент, чтобы атрибуты HTML обновлялись при изменении локали:
|
|
1091
|
+
|
|
1092
|
+
```tsx fileName="src/App.tsx" codeFormat="typescript"
|
|
1093
|
+
import type { FC } from "react";
|
|
1094
|
+
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
1095
|
+
import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
1096
|
+
import "./App.css";
|
|
1097
|
+
|
|
1098
|
+
const AppContent: FC = () => {
|
|
1099
|
+
// Примените хук для обновления атрибутов lang и dir тега <html> на основе локали.
|
|
1100
|
+
useI18nHTMLAttributes();
|
|
1101
|
+
|
|
1102
|
+
// ... Остальная часть вашего компонента
|
|
1103
|
+
};
|
|
1104
|
+
|
|
1105
|
+
const App: FC = () => (
|
|
1106
|
+
<IntlayerProvider>
|
|
1107
|
+
<AppContent />
|
|
1108
|
+
</IntlayerProvider>
|
|
1109
|
+
);
|
|
1110
|
+
|
|
1111
|
+
export default App;
|
|
1112
|
+
```
|
|
1113
|
+
|
|
1114
|
+
```jsx fileName="src/App.msx" codeFormat="esm"
|
|
1115
|
+
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
1116
|
+
import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
1117
|
+
import "./App.css";
|
|
1118
|
+
|
|
1119
|
+
const AppContent = () => {
|
|
1120
|
+
// Примените хук для обновления атрибутов lang и dir тега <html> на основе локали.
|
|
1121
|
+
useI18nHTMLAttributes();
|
|
1122
|
+
|
|
1123
|
+
// ... Остальная часть вашего компонента
|
|
1124
|
+
};
|
|
1125
|
+
|
|
1126
|
+
const App = () => (
|
|
1127
|
+
<IntlayerProvider>
|
|
1128
|
+
<AppContent />
|
|
1129
|
+
</IntlayerProvider>
|
|
1130
|
+
);
|
|
1131
|
+
|
|
1132
|
+
export default App;
|
|
1133
|
+
```
|
|
1134
|
+
|
|
1135
|
+
```jsx fileName="src/App.csx" codeFormat="commonjs"
|
|
1136
|
+
const { FC } = require("react");
|
|
1137
|
+
const { IntlayerProvider, useIntlayer } = require("react-intlayer");
|
|
1138
|
+
const { useI18nHTMLAttributes } = require("./hooks/useI18nHTMLAttributes");
|
|
1139
|
+
require("./App.css");
|
|
1140
|
+
|
|
1141
|
+
const AppContent = () => {
|
|
1142
|
+
// Примените хук для обновления атрибутов lang и dir тега <html> на основе локали.
|
|
1143
|
+
useI18nHTMLAttributes();
|
|
1144
|
+
|
|
1145
|
+
// ... Остальная часть вашего компонента
|
|
1146
|
+
};
|
|
1147
|
+
|
|
1148
|
+
const App = () => (
|
|
1149
|
+
<IntlayerProvider>
|
|
1150
|
+
<AppContent />
|
|
1151
|
+
</IntlayerProvider>
|
|
1152
|
+
);
|
|
1153
|
+
|
|
1154
|
+
module.exports = App;
|
|
1155
|
+
```
|
|
1156
|
+
|
|
1157
|
+
Применяя эти изменения, ваше приложение будет:
|
|
1158
|
+
|
|
1159
|
+
- Обеспечивать, чтобы атрибут **языка** (`lang`) корректно отражал текущую локаль, что важно для SEO и поведения браузера.
|
|
1160
|
+
- Настраивать **направление текста** (`dir`) в соответствии с локалью, улучшая читаемость и удобство использования для языков с различными порядками чтения.
|
|
1161
|
+
- Предоставлять более **доступный** опыт, так как вспомогательные технологии зависят от этих атрибутов для оптимальной работы.
|
|
1162
|
+
|
|
1163
|
+
### Настройка TypeScript
|
|
1164
|
+
|
|
1165
|
+
Intlayer использует расширение модулей для получения преимуществ TypeScript и укрепления вашего кода.
|
|
1166
|
+
|
|
1167
|
+

|
|
1168
|
+
|
|
1169
|
+

|
|
1170
|
+
|
|
1171
|
+
Убедитесь, что ваша конфигурация TypeScript включает автогенерируемые типы.
|
|
1172
|
+
|
|
1173
|
+
```json5 fileName="tsconfig.json"
|
|
1174
|
+
{
|
|
1175
|
+
// ... Ваши существующие настройки TypeScript
|
|
1176
|
+
"include": [
|
|
1177
|
+
// ... Ваши существующие настройки TypeScript
|
|
1178
|
+
".intlayer/**/*.ts", // Включите автогенерируемые типы
|
|
1179
|
+
],
|
|
1180
|
+
}
|
|
1181
|
+
```
|
|
1182
|
+
|
|
1183
|
+
### Конфигурация Git
|
|
1184
|
+
|
|
1185
|
+
Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволяет избежать их добавления в ваш репозиторий Git.
|
|
1186
|
+
|
|
1187
|
+
Для этого вы можете добавить следующие инструкции в ваш файл `.gitignore`:
|
|
1188
|
+
|
|
1189
|
+
```plaintext fileName=".gitignore"
|
|
1190
|
+
# Игнорировать файлы, сгенерированные Intlayer
|
|
1191
|
+
.intlayer
|
|
1192
|
+
```
|
|
1193
|
+
|
|
1194
|
+
### Дальнейшие шаги
|
|
1195
|
+
|
|
1196
|
+
Для дальнейшего развития вы можете реализовать [визуальный редактор](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).
|