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

|
|
1626
|
+
|
|
1627
|
+

|
|
1628
|
+
|
|
1629
|
+
تأكد من أن إعدادات TypeScript الخاصة بك تتضمن الأنواع التي يتم إنشاؤها تلقائيًا.
|
|
1630
|
+
|
|
1631
|
+
```json5 fileName="tsconfig.json"
|
|
1632
|
+
{
|
|
1633
|
+
// ... إعدادات TypeScript الحالية
|
|
1634
|
+
"compilerOptions": {
|
|
1635
|
+
// ...
|
|
1636
|
+
"jsx": "react-jsx",
|
|
1637
|
+
"jsxImportSource": "preact", // موصى به لـ Preact 10+
|
|
1638
|
+
// ...
|
|
1639
|
+
},
|
|
1640
|
+
"include": [
|
|
1641
|
+
// ... إعدادات TypeScript الحالية
|
|
1642
|
+
".intlayer/**/*.ts", // تضمين الأنواع التي يتم إنشاؤها تلقائيًا
|
|
1643
|
+
],
|
|
1644
|
+
}
|
|
1645
|
+
```
|
|
1646
|
+
|
|
1647
|
+
> تأكد من أن `tsconfig.json` الخاص بك معد لـ Preact، خاصةً `jsx` و `jsxImportSource` أو `jsxFactory`/`jsxFragmentFactory` للإصدارات الأقدم من Preact إذا لم تكن تستخدم الإعدادات الافتراضية لـ `preset-vite`.
|
|
1648
|
+
|
|
1649
|
+
### إعداد Git
|
|
1650
|
+
|
|
1651
|
+
يوصى بتجاهل الملفات التي يتم إنشاؤها بواسطة Intlayer. يتيح لك ذلك تجنب إضافتها إلى مستودع Git الخاص بك.
|
|
1652
|
+
|
|
1653
|
+
للقيام بذلك، يمكنك إضافة التعليمات التالية إلى ملف `.gitignore` الخاص بك:
|
|
1654
|
+
|
|
1655
|
+
```plaintext
|
|
1656
|
+
# تجاهل الملفات التي يتم إنشاؤها بواسطة Intlayer
|
|
1657
|
+
.intlayer
|
|
1658
|
+
```
|
|
1659
|
+
|
|
1660
|
+
### إضافة VS Code
|
|
1661
|
+
|
|
1662
|
+
لتحسين تجربة التطوير الخاصة بك مع Intlayer، يمكنك تثبيت **إضافة Intlayer الرسمية لـ VS Code**.
|
|
1663
|
+
|
|
1664
|
+
[التثبيت من سوق VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
1665
|
+
|
|
1666
|
+
توفر هذه الإضافة:
|
|
1667
|
+
|
|
1668
|
+
- **الإكمال التلقائي** لمفاتيح الترجمة.
|
|
1669
|
+
- **كشف الأخطاء في الوقت الفعلي** للترجمات المفقودة.
|
|
1670
|
+
- **معاينات داخلية** للمحتوى المترجم.
|
|
1671
|
+
- **إجراءات سريعة** لإنشاء الترجمات وتحديثها بسهولة.
|
|
1672
|
+
|
|
1673
|
+
لمزيد من التفاصيل حول كيفية استخدام الإضافة، راجع [وثائق إضافة Intlayer لـ VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
1674
|
+
|
|
1675
|
+
---
|
|
1676
|
+
|
|
1677
|
+
### الذهاب إلى أبعد من ذلك
|
|
1678
|
+
|
|
1679
|
+
## للمزيد، يمكنك تنفيذ [المحرر المرئي](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).
|