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

|
|
1554
|
+
|
|
1555
|
+

|
|
1556
|
+
|
|
1557
|
+
تأكد من أن إعدادات TypeScript الخاصة بك تتضمن الأنواع المولدة تلقائيًا.
|
|
1558
|
+
|
|
1559
|
+
```json5 fileName="tsconfig.json"
|
|
1560
|
+
{
|
|
1561
|
+
// ... إعدادات TypeScript الحالية الخاصة بك
|
|
1562
|
+
"include": [
|
|
1563
|
+
// ... إعدادات TypeScript الحالية الخاصة بك
|
|
1564
|
+
".intlayer/**/*.ts", // تضمين الأنواع المولدة تلقائيًا
|
|
1565
|
+
],
|
|
1566
|
+
}
|
|
1567
|
+
```
|
|
1568
|
+
|
|
1569
|
+
### إعداد Git
|
|
1570
|
+
|
|
1571
|
+
يوصى بتجاهل الملفات التي يتم إنشاؤها بواسطة Intlayer. يتيح لك ذلك تجنب إضافتها إلى مستودع Git الخاص بك.
|
|
1572
|
+
|
|
1573
|
+
للقيام بذلك، يمكنك إضافة التعليمات التالية إلى ملف `.gitignore` الخاص بك:
|
|
1574
|
+
|
|
1575
|
+
```plaintext
|
|
1576
|
+
# تجاهل الملفات التي يتم إنشاؤها بواسطة Intlayer
|
|
1577
|
+
.intlayer
|
|
1578
|
+
```
|
|
1579
|
+
|
|
1580
|
+
### المزيد من التقدم
|
|
1581
|
+
|
|
1582
|
+
للمزيد من التقدم، يمكنك تنفيذ [المحرر المرئي](https://github.com/aymericzip/intlayer/blob/main/docs/ar/intlayer_visual_editor.md) أو فصل المحتوى الخاص بك باستخدام [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/ar/intlayer_CMS.md).
|