@intlayer/docs 5.5.11 → 5.5.12
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/blog/ar/intlayer_with_next-intl.md +0 -1
- package/blog/ar/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/ar/what_is_internationalization.md +2 -2
- package/blog/de/intlayer_with_next-intl.md +0 -1
- package/blog/de/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/de/what_is_internationalization.md +2 -2
- package/blog/en/intlayer_with_next-intl.md +0 -1
- package/blog/en/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/en/what_is_internationalization.md +2 -2
- package/blog/en-GB/intlayer_with_next-intl.md +0 -1
- package/blog/en-GB/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/en-GB/what_is_internationalization.md +2 -2
- package/blog/es/intlayer_with_next-intl.md +0 -1
- package/blog/es/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/es/what_is_internationalization.md +2 -2
- package/blog/fr/intlayer_with_next-intl.md +0 -1
- package/blog/fr/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/fr/what_is_internationalization.md +2 -2
- package/blog/hi/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/hi/what_is_internationalization.md +2 -2
- package/blog/it/intlayer_with_next-intl.md +0 -1
- package/blog/it/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/it/what_is_internationalization.md +2 -2
- package/blog/ja/intlayer_with_next-intl.md +0 -1
- package/blog/ja/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/ja/what_is_internationalization.md +2 -2
- package/blog/ko/intlayer_with_next-intl.md +0 -1
- package/blog/ko/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/pt/intlayer_with_next-intl.md +0 -1
- package/blog/pt/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/pt/what_is_internationalization.md +2 -2
- package/blog/ru/intlayer_with_next-intl.md +0 -1
- package/blog/ru/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/ru/what_is_internationalization.md +2 -2
- package/blog/zh/intlayer_with_next-intl.md +0 -1
- package/blog/zh/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/zh/what_is_internationalization.md +2 -2
- package/dist/cjs/blog.cjs +2 -2
- package/dist/cjs/blog.cjs.map +1 -1
- package/dist/cjs/common.cjs +17 -6
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/doc.cjs +2 -2
- package/dist/cjs/doc.cjs.map +1 -1
- package/dist/cjs/frequentQuestions.cjs +2 -2
- package/dist/cjs/frequentQuestions.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +1152 -252
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +3778 -1124
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +794 -161
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +32 -31
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/cjs/legal.cjs +2 -2
- package/dist/cjs/legal.cjs.map +1 -1
- package/dist/esm/blog.mjs +2 -2
- package/dist/esm/blog.mjs.map +1 -1
- package/dist/esm/common.mjs +17 -6
- package/dist/esm/common.mjs.map +1 -1
- package/dist/esm/doc.mjs +2 -2
- package/dist/esm/doc.mjs.map +1 -1
- package/dist/esm/frequentQuestions.mjs +2 -2
- package/dist/esm/frequentQuestions.mjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +1151 -252
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +3777 -1124
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +793 -161
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +31 -31
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/esm/legal.mjs +2 -2
- package/dist/esm/legal.mjs.map +1 -1
- package/dist/types/blog.d.ts +2 -2
- package/dist/types/blog.d.ts.map +1 -1
- package/dist/types/common.d.ts +3 -2
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/doc.d.ts +2 -2
- package/dist/types/doc.d.ts.map +1 -1
- package/dist/types/frequentQuestions.d.ts +2 -2
- package/dist/types/frequentQuestions.d.ts.map +1 -1
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/dist/types/legal.d.ts +2 -2
- package/dist/types/legal.d.ts.map +1 -1
- package/docs/ar/intlayer_with_vite+react.md +100 -108
- package/docs/de/intlayer_with_vite+react.md +121 -142
- package/docs/en/CI_CD.md +3 -1
- package/docs/en/autoFill.md +3 -1
- package/docs/en/configuration.md +4 -1
- package/docs/en/dictionary/condition.md +3 -1
- package/docs/en/dictionary/content_extention_customization.md +3 -1
- package/docs/en/dictionary/enumeration.md +3 -1
- package/docs/en/dictionary/file.md +3 -1
- package/docs/en/dictionary/function_fetching.md +3 -1
- package/docs/en/dictionary/get_started.md +3 -1
- package/docs/en/dictionary/insertion.md +3 -1
- package/docs/en/dictionary/markdown.md +3 -1
- package/docs/en/dictionary/nesting.md +3 -1
- package/docs/en/dictionary/translation.md +3 -1
- package/docs/en/how_works_intlayer.md +3 -1
- package/docs/en/index.md +3 -1
- package/docs/en/interest_of_intlayer.md +3 -1
- package/docs/en/intlayer_CMS.md +3 -1
- package/docs/en/intlayer_cli.md +3 -1
- package/docs/en/intlayer_visual_editor.md +3 -1
- package/docs/en/intlayer_with_angular.md +3 -1
- package/docs/en/intlayer_with_create_react_app.md +3 -1
- package/docs/en/intlayer_with_express.md +3 -1
- package/docs/en/intlayer_with_lynx+react.md +3 -1
- package/docs/en/intlayer_with_nextjs_14.md +6 -1
- package/docs/en/intlayer_with_nextjs_15.md +5 -1
- package/docs/en/intlayer_with_nextjs_page_router.md +5 -1
- package/docs/en/intlayer_with_nuxt.md +3 -1
- package/docs/en/intlayer_with_react_native+expo.md +3 -1
- package/docs/en/intlayer_with_vite+preact.md +3 -1
- package/docs/en/intlayer_with_vite+react.md +9 -7
- package/docs/en/intlayer_with_vite+solid.md +3 -1
- package/docs/en/intlayer_with_vite+svelte.md +3 -1
- package/docs/en/intlayer_with_vite+vue.md +3 -1
- package/docs/en/introduction.md +3 -1
- package/docs/en/mcp_server.md +42 -1
- package/docs/en/packages/@intlayer/api/index.md +3 -1
- package/docs/en/packages/@intlayer/chokidar/index.md +3 -1
- package/docs/en/packages/@intlayer/cli/index.md +3 -1
- package/docs/en/packages/@intlayer/config/index.md +3 -1
- package/docs/en/packages/@intlayer/core/index.md +3 -1
- package/docs/en/packages/@intlayer/design-system/index.md +3 -1
- package/docs/en/packages/@intlayer/dictionary-entry/index.md +3 -1
- package/docs/en/packages/@intlayer/editor/index.md +3 -1
- package/docs/en/packages/@intlayer/editor-react/index.md +3 -1
- package/docs/en/packages/@intlayer/webpack/index.md +3 -1
- package/docs/en/packages/angular-intlayer/index.md +3 -1
- package/docs/en/packages/express-intlayer/index.md +3 -1
- package/docs/en/packages/express-intlayer/t.md +3 -1
- package/docs/en/packages/intlayer/getConfiguration.md +3 -1
- package/docs/en/packages/intlayer/getEnumeration.md +3 -1
- package/docs/en/packages/intlayer/getHTMLTextDir.md +3 -1
- package/docs/en/packages/intlayer/getLocaleLang.md +3 -1
- package/docs/en/packages/intlayer/getLocaleName.md +3 -1
- package/docs/en/packages/intlayer/getLocalizedUrl.md +3 -1
- package/docs/en/packages/intlayer/getMultilingualUrls.md +3 -1
- package/docs/en/packages/intlayer/getPathWithoutLocale.md +3 -1
- package/docs/en/packages/intlayer/getTranslation.md +3 -1
- package/docs/en/packages/intlayer/getTranslationContent.md +3 -1
- package/docs/en/packages/intlayer/index.md +3 -1
- package/docs/en/packages/intlayer-cli/index.md +3 -1
- package/docs/en/packages/intlayer-editor/index.md +3 -1
- package/docs/en/packages/lynx-intlayer/index.md +3 -1
- package/docs/en/packages/next-intlayer/index.md +3 -1
- package/docs/en/packages/next-intlayer/t.md +3 -1
- package/docs/en/packages/next-intlayer/useDictionary.md +3 -1
- package/docs/en/packages/next-intlayer/useIntlayer.md +3 -1
- package/docs/en/packages/next-intlayer/useIntlayerAsync.md +3 -1
- package/docs/en/packages/next-intlayer/useLocale.md +3 -1
- package/docs/en/packages/nuxt-intlayer/index.md +3 -1
- package/docs/en/packages/preact-intlayer/index.md +3 -1
- package/docs/en/packages/react-intlayer/index.md +3 -1
- package/docs/en/packages/react-intlayer/t.md +3 -1
- package/docs/en/packages/react-intlayer/useDictionary.md +3 -1
- package/docs/en/packages/react-intlayer/useIntlayer.md +3 -1
- package/docs/en/packages/react-intlayer/useIntlayerAsync.md +3 -1
- package/docs/en/packages/react-intlayer/useLocale.md +3 -1
- package/docs/en/packages/react-native-intlayer/index.md +3 -1
- package/docs/en/packages/react-scripts-intlayer/index.md +3 -1
- package/docs/en/packages/solid-intlayer/index.md +3 -1
- package/docs/en/packages/svelte-intlayer/index.md +3 -1
- package/docs/en/packages/vite-intlayer/index.md +3 -1
- package/docs/en/packages/vue-intlayer/index.md +3 -1
- package/docs/en/per_locale_file.md +3 -1
- package/docs/en/roadmap.md +5 -2
- package/docs/en/vs_code_extension.md +3 -1
- package/docs/en-GB/intlayer_with_vite+react.md +64 -83
- package/docs/es/intlayer_with_vite+react.md +91 -94
- package/docs/fr/intlayer_with_vite+react.md +73 -65
- package/docs/hi/intlayer_with_vite+react.md +107 -107
- package/docs/it/intlayer_with_vite+react.md +156 -112
- package/docs/ja/intlayer_with_vite+react.md +153 -218
- package/docs/ko/intlayer_with_vite+react.md +116 -148
- package/docs/ko/packages/intlayer/getLocalizedUrl.md +1 -23
- package/docs/pt/intlayer_with_vite+react.md +110 -132
- package/docs/ru/intlayer_with_vite+react.md +98 -83
- package/docs/zh/intlayer_with_vite+react.md +147 -184
- package/docs/zh/packages/intlayer/getLocalizedUrl.md +1 -23
- package/frequent_questions/ar/build_error_CI_CD.md +75 -0
- package/frequent_questions/de/build_error_CI_CD.md +75 -0
- package/frequent_questions/en/build_error_CI_CD.md +75 -0
- package/frequent_questions/en-GB/build_error_CI_CD.md +75 -0
- package/frequent_questions/es/build_error_CI_CD.md +75 -0
- package/frequent_questions/fr/build_error_CI_CD.md +75 -0
- package/frequent_questions/hi/build_error_CI_CD.md +75 -0
- package/frequent_questions/it/build_error_CI_CD.md +75 -0
- package/frequent_questions/ja/build_error_CI_CD.md +75 -0
- package/frequent_questions/ja/intlayer_command_undefined.md +3 -3
- package/frequent_questions/ko/build_error_CI_CD.md +75 -0
- package/frequent_questions/ko/intlayer_command_undefined.md +3 -3
- package/frequent_questions/pt/build_error_CI_CD.md +75 -0
- package/frequent_questions/ru/build_error_CI_CD.md +75 -0
- package/frequent_questions/zh/build_error_CI_CD.md +75 -0
- package/frequent_questions/zh/intlayer_command_undefined.md +3 -3
- package/legal/ar/privacy_notice.md +83 -0
- package/legal/ar/terms_of_service.md +55 -0
- package/legal/de/privacy_notice.md +83 -0
- package/legal/de/terms_of_service.md +55 -0
- package/legal/en/privacy_notice.md +83 -0
- package/legal/en/terms_of_service.md +55 -0
- package/legal/en-GB/privacy_notice.md +83 -0
- package/legal/en-GB/terms_of_service.md +55 -0
- package/legal/es/privacy_notice.md +83 -0
- package/legal/es/terms_of_service.md +55 -0
- package/legal/fr/privacy_notice.md +83 -0
- package/legal/fr/terms_of_service.md +55 -0
- package/legal/hi/privacy_notice.md +83 -0
- package/legal/hi/terms_of_service.md +55 -0
- package/legal/it/privacy_notice.md +83 -0
- package/legal/it/terms_of_service.md +55 -0
- package/legal/ja/privacy_notice.md +83 -0
- package/legal/ja/terms_of_service.md +55 -0
- package/legal/ko/privacy_notice.md +83 -0
- package/legal/ko/terms_of_service.md +55 -0
- package/legal/pt/privacy_notice.md +83 -0
- package/legal/pt/terms_of_service.md +55 -0
- package/legal/ru/privacy_notice.md +83 -0
- package/legal/ru/terms_of_service.md +55 -0
- package/legal/zh/privacy_notice.md +83 -0
- package/legal/zh/terms_of_service.md +55 -0
- package/package.json +7 -6
- package/src/blog.ts +6 -4
- package/src/common.ts +23 -7
- package/src/doc.ts +6 -4
- package/src/frequentQuestions.ts +6 -4
- package/src/generated/blog.entry.ts +1177 -280
- package/src/generated/docs.entry.ts +3868 -1217
- package/src/generated/frequentQuestions.entry.ts +808 -178
- package/src/generated/legal.entry.ts +34 -36
- package/src/legal.ts +6 -4
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt:
|
|
3
|
-
updatedAt:
|
|
4
|
-
title:
|
|
5
|
-
description:
|
|
2
|
+
createdAt: 2024-03-07
|
|
3
|
+
updatedAt: 2024-03-07
|
|
4
|
+
title: البدء مع Intlayer في Vite + React
|
|
5
|
+
description: تعلّم كيفية إضافة التدويل (i18n) إلى تطبيق Vite و React الخاص بك باستخدام Intlayer. اتبع هذا الدليل لجعل تطبيقك متعدد اللغات.
|
|
6
6
|
keywords:
|
|
7
7
|
- التدويل
|
|
8
|
-
-
|
|
8
|
+
- التوثيق
|
|
9
9
|
- Intlayer
|
|
10
10
|
- Vite
|
|
11
11
|
- React
|
|
12
|
-
-
|
|
12
|
+
- i18n
|
|
13
13
|
- جافا سكريبت
|
|
14
14
|
slugs:
|
|
15
15
|
- doc
|
|
16
16
|
- environment
|
|
17
|
-
-
|
|
17
|
+
- vite-and-react
|
|
18
18
|
---
|
|
19
19
|
|
|
20
20
|
# البدء في التدويل (i18n) باستخدام Intlayer و Vite و React
|
|
21
21
|
|
|
22
|
-
راجع [
|
|
22
|
+
راجع [نموذج التطبيق](https://github.com/aymericzip/intlayer-vite-react-template) على GitHub.
|
|
23
23
|
|
|
24
24
|
## ما هو Intlayer؟
|
|
25
25
|
|
|
@@ -28,8 +28,8 @@ slugs:
|
|
|
28
28
|
مع Intlayer، يمكنك:
|
|
29
29
|
|
|
30
30
|
- **إدارة الترجمات بسهولة** باستخدام القواميس التصريحية على مستوى المكونات.
|
|
31
|
-
- **توطين البيانات الوصفية والمسارات والمحتوى
|
|
32
|
-
- **ضمان دعم TypeScript**
|
|
31
|
+
- **توطين البيانات الوصفية والمسارات والمحتوى ديناميكيًا**.
|
|
32
|
+
- **ضمان دعم TypeScript** مع الأنواع التي يتم إنشاؤها تلقائيًا، مما يحسن الإكمال التلقائي واكتشاف الأخطاء.
|
|
33
33
|
- **الاستفادة من الميزات المتقدمة**، مثل الكشف الديناميكي عن اللغة وتبديلها.
|
|
34
34
|
|
|
35
35
|
---
|
|
@@ -60,14 +60,14 @@ yarn add --save-dev vite-intlayer
|
|
|
60
60
|
الحزمة الأساسية التي توفر أدوات التدويل لإدارة التكوين، والترجمة، و[إعلان المحتوى](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/get_started.md)، والترجمة البرمجية، و[أوامر CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_cli.md).
|
|
61
61
|
|
|
62
62
|
- **react-intlayer**
|
|
63
|
-
الحزمة التي تدمج Intlayer مع تطبيق React. توفر
|
|
63
|
+
الحزمة التي تدمج Intlayer مع تطبيق React. توفر مزودي السياق (context providers) وخطافات (hooks) لتدويل React.
|
|
64
64
|
|
|
65
65
|
- **vite-intlayer**
|
|
66
|
-
تتضمن إضافة Vite لدمج Intlayer مع [مجمّع Vite](https://vite.dev/guide/why.html#why-bundle-for-production)، بالإضافة إلى وسيط
|
|
66
|
+
تتضمن إضافة Vite لدمج Intlayer مع [مجمّع Vite](https://vite.dev/guide/why.html#why-bundle-for-production)، بالإضافة إلى وسيط (middleware) لاكتشاف اللغة المفضلة للمستخدم، وإدارة الكوكيز، والتعامل مع إعادة توجيه URL.
|
|
67
67
|
|
|
68
68
|
### الخطوة 2: تكوين مشروعك
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
قم بإنشاء ملف تكوين لتحديد لغات تطبيقك:
|
|
71
71
|
|
|
72
72
|
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
73
73
|
import { Locales, type IntlayerConfig } from "intlayer";
|
|
@@ -78,7 +78,7 @@ const config: IntlayerConfig = {
|
|
|
78
78
|
Locales.ENGLISH,
|
|
79
79
|
Locales.FRENCH,
|
|
80
80
|
Locales.SPANISH,
|
|
81
|
-
//
|
|
81
|
+
// لغاتك الأخرى
|
|
82
82
|
],
|
|
83
83
|
defaultLocale: Locales.ENGLISH,
|
|
84
84
|
},
|
|
@@ -91,14 +91,13 @@ export default config;
|
|
|
91
91
|
import { Locales } from "intlayer";
|
|
92
92
|
|
|
93
93
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
94
|
-
// تكوين إعدادات التدويل
|
|
95
94
|
const config = {
|
|
96
95
|
internationalization: {
|
|
97
96
|
locales: [
|
|
98
97
|
Locales.ENGLISH,
|
|
99
98
|
Locales.FRENCH,
|
|
100
99
|
Locales.SPANISH,
|
|
101
|
-
//
|
|
100
|
+
// لغاتك الأخرى
|
|
102
101
|
],
|
|
103
102
|
defaultLocale: Locales.ENGLISH,
|
|
104
103
|
},
|
|
@@ -111,14 +110,13 @@ export default config;
|
|
|
111
110
|
const { Locales } = require("intlayer");
|
|
112
111
|
|
|
113
112
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
114
|
-
// تكوين إعدادات التدويل
|
|
115
113
|
const config = {
|
|
116
114
|
internationalization: {
|
|
117
115
|
locales: [
|
|
118
116
|
Locales.ENGLISH,
|
|
119
117
|
Locales.FRENCH,
|
|
120
118
|
Locales.SPANISH,
|
|
121
|
-
//
|
|
119
|
+
// لغاتك الأخرى
|
|
122
120
|
],
|
|
123
121
|
defaultLocale: Locales.ENGLISH,
|
|
124
122
|
},
|
|
@@ -127,11 +125,11 @@ const config = {
|
|
|
127
125
|
module.exports = config;
|
|
128
126
|
```
|
|
129
127
|
|
|
130
|
-
> من خلال ملف
|
|
128
|
+
> من خلال ملف التهيئة هذا، يمكنك إعداد عناوين URL محلية، وإعادة توجيه الوسيط، وأسماء ملفات تعريف الارتباط، وموقع وامتداد إعلانات المحتوى الخاصة بك، وتعطيل سجلات Intlayer في وحدة التحكم، والمزيد. للحصول على قائمة كاملة بالمعلمات المتاحة، راجع [توثيق التهيئة](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/configuration.md).
|
|
131
129
|
|
|
132
|
-
### الخطوة 3: دمج Intlayer في
|
|
130
|
+
### الخطوة 3: دمج Intlayer في تهيئة Vite الخاصة بك
|
|
133
131
|
|
|
134
|
-
أضف مكون intlayer الإضافي إلى
|
|
132
|
+
أضف مكون intlayer الإضافي إلى تهيئتك.
|
|
135
133
|
|
|
136
134
|
```typescript fileName="vite.config.ts" codeFormat="typescript"
|
|
137
135
|
import { defineConfig } from "vite";
|
|
@@ -166,9 +164,9 @@ module.exports = defineConfig({
|
|
|
166
164
|
});
|
|
167
165
|
```
|
|
168
166
|
|
|
169
|
-
> يتم استخدام مكون Vite الإضافي `intlayerPlugin()` لدمج Intlayer مع Vite. يضمن بناء ملفات إعلان المحتوى ويراقبها في وضع التطوير. كما
|
|
167
|
+
> يتم استخدام مكون Vite الإضافي `intlayerPlugin()` لدمج Intlayer مع Vite. يضمن بناء ملفات إعلان المحتوى ويراقبها في وضع التطوير. كما يعرّف متغيرات بيئة Intlayer داخل تطبيق Vite. بالإضافة إلى ذلك، يوفر أسماء مستعارة لتحسين الأداء.
|
|
170
168
|
|
|
171
|
-
### الخطوة 4:
|
|
169
|
+
### الخطوة 4: إعلان المحتوى الخاص بك
|
|
172
170
|
|
|
173
171
|
قم بإنشاء وإدارة إعلانات المحتوى الخاصة بك لتخزين الترجمات:
|
|
174
172
|
|
|
@@ -187,13 +185,13 @@ const appContent = {
|
|
|
187
185
|
reactLogo: t({
|
|
188
186
|
en: "React logo",
|
|
189
187
|
fr: "Logo React",
|
|
190
|
-
es: "
|
|
188
|
+
es: "Logo React",
|
|
191
189
|
}),
|
|
192
190
|
|
|
193
191
|
title: "Vite + React",
|
|
194
192
|
|
|
195
193
|
count: t({
|
|
196
|
-
en: "
|
|
194
|
+
en: "count is ",
|
|
197
195
|
fr: "le compte est ",
|
|
198
196
|
es: "el recuento es ",
|
|
199
197
|
}),
|
|
@@ -235,12 +233,12 @@ const appContent = {
|
|
|
235
233
|
key: "app",
|
|
236
234
|
content: {
|
|
237
235
|
viteLogo: t({
|
|
238
|
-
en: "
|
|
236
|
+
en: "Vite logo",
|
|
239
237
|
fr: "Logo Vite",
|
|
240
238
|
es: "Logo Vite",
|
|
241
239
|
}),
|
|
242
240
|
reactLogo: t({
|
|
243
|
-
en: "
|
|
241
|
+
en: "React logo",
|
|
244
242
|
fr: "Logo React",
|
|
245
243
|
es: "Logo React",
|
|
246
244
|
}),
|
|
@@ -248,7 +246,7 @@ const appContent = {
|
|
|
248
246
|
title: "Vite + React",
|
|
249
247
|
|
|
250
248
|
count: t({
|
|
251
|
-
en: "
|
|
249
|
+
en: "count is ",
|
|
252
250
|
fr: "le compte est ",
|
|
253
251
|
es: "el recuento es ",
|
|
254
252
|
}),
|
|
@@ -257,7 +255,7 @@ const appContent = {
|
|
|
257
255
|
t <
|
|
258
256
|
ReactNode >
|
|
259
257
|
{
|
|
260
|
-
// لا
|
|
258
|
+
// لا تنس استيراد React إذا كنت تستخدم عقدة React في المحتوى الخاص بك
|
|
261
259
|
en: (
|
|
262
260
|
<>
|
|
263
261
|
Edit <code>src/App.tsx</code> and save to test HMR
|
|
@@ -270,13 +268,13 @@ const appContent = {
|
|
|
270
268
|
),
|
|
271
269
|
es: (
|
|
272
270
|
<>
|
|
273
|
-
|
|
271
|
+
Edita <code>src/App.tsx</code> y guarda para probar HMR
|
|
274
272
|
</>
|
|
275
273
|
),
|
|
276
274
|
},
|
|
277
275
|
|
|
278
276
|
readTheDocs: t({
|
|
279
|
-
en: "
|
|
277
|
+
en: "انقر على شعارات Vite و React لمعرفة المزيد",
|
|
280
278
|
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
281
279
|
es: "Haga clic en los logotipos de Vite y React para obtener más información",
|
|
282
280
|
}),
|
|
@@ -297,13 +295,11 @@ const appContent = {
|
|
|
297
295
|
en: "Vite logo",
|
|
298
296
|
fr: "Logo Vite",
|
|
299
297
|
es: "Logo Vite",
|
|
300
|
-
ar: "شعار Vite",
|
|
301
298
|
}),
|
|
302
299
|
reactLogo: t({
|
|
303
300
|
en: "React logo",
|
|
304
301
|
fr: "Logo React",
|
|
305
302
|
es: "Logo React",
|
|
306
|
-
ar: "شعار React",
|
|
307
303
|
}),
|
|
308
304
|
|
|
309
305
|
title: "Vite + React",
|
|
@@ -312,7 +308,6 @@ const appContent = {
|
|
|
312
308
|
en: "count is ",
|
|
313
309
|
fr: "le compte est ",
|
|
314
310
|
es: "el recuento es ",
|
|
315
|
-
ar: "العدد هو ",
|
|
316
311
|
}),
|
|
317
312
|
|
|
318
313
|
edit:
|
|
@@ -332,16 +327,15 @@ const appContent = {
|
|
|
332
327
|
),
|
|
333
328
|
es: (
|
|
334
329
|
<>
|
|
335
|
-
Edita <code>src/App.tsx</code>
|
|
330
|
+
Edita <code>src/App.tsx</code> و احفظ لتجربة HMR
|
|
336
331
|
</>
|
|
337
332
|
),
|
|
338
333
|
},
|
|
339
334
|
|
|
340
335
|
readTheDocs: t({
|
|
341
|
-
en: "
|
|
336
|
+
en: "انقر على شعارات Vite و React لمعرفة المزيد",
|
|
342
337
|
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
343
338
|
es: "Haga clic en los logotipos de Vite y React para obtener más información",
|
|
344
|
-
ar: "انقر على شعارات Vite و React لمعرفة المزيد",
|
|
345
339
|
}),
|
|
346
340
|
},
|
|
347
341
|
};
|
|
@@ -359,8 +353,7 @@ module.exports = appContent;
|
|
|
359
353
|
"translation": {
|
|
360
354
|
"en": "Vite logo",
|
|
361
355
|
"fr": "Logo Vite",
|
|
362
|
-
"es": "Logo Vite"
|
|
363
|
-
"ar": "شعار Vite"
|
|
356
|
+
"es": "Logo Vite"
|
|
364
357
|
}
|
|
365
358
|
},
|
|
366
359
|
"reactLogo": {
|
|
@@ -412,13 +405,13 @@ module.exports = appContent;
|
|
|
412
405
|
}
|
|
413
406
|
```
|
|
414
407
|
|
|
415
|
-
> يمكن تعريف إعلانات المحتوى الخاصة بك في أي مكان في تطبيقك بمجرد تضمينها في دليل `contentDir` (افتراضيًا، `./src`). ويجب أن
|
|
408
|
+
> يمكن تعريف إعلانات المحتوى الخاصة بك في أي مكان في تطبيقك بمجرد تضمينها في دليل `contentDir` (افتراضيًا، `./src`). ويجب أن تطابق امتداد ملف إعلان المحتوى (افتراضيًا، `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
416
409
|
|
|
417
410
|
> لمزيد من التفاصيل، راجع [توثيق إعلان المحتوى](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/get_started.md).
|
|
418
411
|
|
|
419
|
-
> إذا كان ملف المحتوى الخاص بك يتضمن كود TSX،
|
|
412
|
+
> إذا كان ملف المحتوى الخاص بك يتضمن كود TSX، يجب أن تفكر في استيراد `import React from "react";` في ملف المحتوى الخاص بك.
|
|
420
413
|
|
|
421
|
-
### الخطوة 5: استخدام Intlayer في
|
|
414
|
+
### الخطوة 5: استخدام Intlayer في الكود الخاص بك
|
|
422
415
|
|
|
423
416
|
قم بالوصول إلى قواميس المحتوى الخاصة بك في جميع أنحاء تطبيقك:
|
|
424
417
|
|
|
@@ -563,7 +556,7 @@ const App = () => (
|
|
|
563
556
|
module.exports = App;
|
|
564
557
|
```
|
|
565
558
|
|
|
566
|
-
> إذا كنت
|
|
559
|
+
> إذا كنت ترغب في استخدام المحتوى الخاص بك في خاصية من نوع `string`، مثل `alt`، `title`، `href`، `aria-label`، إلخ، يجب عليك استدعاء قيمة الدالة، مثل:
|
|
567
560
|
|
|
568
561
|
> ```jsx
|
|
569
562
|
> <img src={content.image.src.value} alt={content.image.value} />
|
|
@@ -634,30 +627,30 @@ const LocaleSwitcher = () => {
|
|
|
634
627
|
- https://example.com/fr/about
|
|
635
628
|
```
|
|
636
629
|
|
|
637
|
-
> بشكل افتراضي، لا يتم إضافة بادئة للمسارات للغة الافتراضية. إذا كنت ترغب في إضافة بادئة للغة الافتراضية، يمكنك تعيين الخيار `middleware.prefixDefault` إلى `true` في
|
|
630
|
+
> بشكل افتراضي، لا يتم إضافة بادئة للمسارات للغة الافتراضية. إذا كنت ترغب في إضافة بادئة للغة الافتراضية، يمكنك تعيين الخيار `middleware.prefixDefault` إلى `true` في إعداداتك. راجع [توثيق الإعدادات](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/configuration.md) لمزيد من المعلومات.
|
|
638
631
|
|
|
639
|
-
لإضافة التوجيه المحلي إلى تطبيقك، يمكنك إنشاء مكون `LocaleRouter` الذي يلف مسارات تطبيقك ويتعامل مع التوجيه بناءً على اللغة. إليك
|
|
632
|
+
لإضافة التوجيه المحلي إلى تطبيقك، يمكنك إنشاء مكون `LocaleRouter` الذي يلف مسارات تطبيقك ويتعامل مع التوجيه بناءً على اللغة. إليك مثالًا باستخدام [React Router](https://reactrouter.com/home):
|
|
640
633
|
|
|
641
634
|
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
642
635
|
// استيراد التبعيات والوظائف اللازمة
|
|
643
636
|
import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // دوال مساعدة وأنواع من 'intlayer'
|
|
644
637
|
import type { FC, PropsWithChildren } from "react"; // أنواع React للمكونات الوظيفية والخصائص
|
|
645
|
-
import { IntlayerProvider } from "react-intlayer"; //
|
|
638
|
+
import { IntlayerProvider } from "react-intlayer"; // مزود سياق التدويل
|
|
646
639
|
import {
|
|
647
640
|
BrowserRouter,
|
|
648
641
|
Routes,
|
|
649
642
|
Route,
|
|
650
643
|
Navigate,
|
|
651
644
|
useLocation,
|
|
652
|
-
} from "react-router-dom"; // مكونات
|
|
645
|
+
} from "react-router-dom"; // مكونات الموجه لإدارة التنقل
|
|
653
646
|
|
|
654
|
-
// تفكيك
|
|
647
|
+
// تفكيك التكوين من Intlayer
|
|
655
648
|
const { internationalization, middleware } = configuration;
|
|
656
649
|
const { locales, defaultLocale } = internationalization;
|
|
657
650
|
|
|
658
651
|
/**
|
|
659
652
|
* مكون يتعامل مع التدويل ويغلف الأطفال بسياق اللغة المناسب.
|
|
660
|
-
* يدير اكتشاف اللغة بناءً على عنوان URL والتحقق
|
|
653
|
+
* يدير اكتشاف اللغة بناءً على عنوان URL والتحقق منها.
|
|
661
654
|
*/
|
|
662
655
|
const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
663
656
|
children,
|
|
@@ -688,7 +681,7 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
688
681
|
);
|
|
689
682
|
}
|
|
690
683
|
|
|
691
|
-
// تغليف العناصر الفرعية
|
|
684
|
+
// تغليف العناصر الفرعية بـ IntlayerProvider وتعيين اللغة الحالية
|
|
692
685
|
return (
|
|
693
686
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
694
687
|
);
|
|
@@ -737,7 +730,7 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
737
730
|
))}
|
|
738
731
|
|
|
739
732
|
{
|
|
740
|
-
// إذا كان تعطيل
|
|
733
|
+
// إذا كان تعطيل بادئة اللغة الافتراضية، يتم عرض الأطفال مباشرة في المسار الجذري
|
|
741
734
|
!middleware.prefixDefault && (
|
|
742
735
|
<Route
|
|
743
736
|
path="*"
|
|
@@ -754,8 +747,8 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
754
747
|
|
|
755
748
|
```jsx fileName="src/components/LocaleRouter.mjx" codeFormat="esm"
|
|
756
749
|
// استيراد التبعيات والوظائف اللازمة
|
|
757
|
-
import { configuration, getPathWithoutLocale } from "intlayer"; // وظائف مساعدة
|
|
758
|
-
// وظائف مساعدة
|
|
750
|
+
import { configuration, getPathWithoutLocale } from "intlayer"; // وظائف وأصناف مساعدة من 'intlayer'
|
|
751
|
+
// وظائف وأصناف مساعدة من 'intlayer'
|
|
759
752
|
import { IntlayerProvider } from "react-intlayer"; // مزود لسياق التدويل
|
|
760
753
|
import {
|
|
761
754
|
BrowserRouter,
|
|
@@ -763,7 +756,7 @@ import {
|
|
|
763
756
|
Route,
|
|
764
757
|
Navigate,
|
|
765
758
|
useLocation,
|
|
766
|
-
} from "react-router-dom"; // مكونات
|
|
759
|
+
} from "react-router-dom"; // مكونات الموجه لإدارة التنقل
|
|
767
760
|
|
|
768
761
|
// تفكيك التكوين من Intlayer
|
|
769
762
|
const { internationalization, middleware } = configuration;
|
|
@@ -771,8 +764,7 @@ const { locales, defaultLocale } = internationalization;
|
|
|
771
764
|
|
|
772
765
|
/**
|
|
773
766
|
* مكون يتعامل مع التدويل ويغلف الأطفال بسياق اللغة المناسب.
|
|
774
|
-
|
|
775
|
-
* يدير الكشف عن اللغة بناءً على عنوان URL والتحقق من صحتها.
|
|
767
|
+
* يدير اكتشاف اللغة بناءً على عنوان URL والتحقق من صحتها.
|
|
776
768
|
*/
|
|
777
769
|
const AppLocalized = ({ children, locale }) => {
|
|
778
770
|
const { pathname, search } = useLocation(); // الحصول على مسار URL الحالي
|
|
@@ -780,7 +772,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
780
772
|
// تحديد اللغة الحالية، والرجوع إلى اللغة الافتراضية إذا لم يتم توفيرها
|
|
781
773
|
const currentLocale = locale ?? defaultLocale;
|
|
782
774
|
|
|
783
|
-
// إزالة بادئة اللغة من المسار
|
|
775
|
+
// إزالة بادئة اللغة من المسار لبناء مسار أساسي
|
|
784
776
|
const pathWithoutLocale = getPathWithoutLocale(
|
|
785
777
|
pathname // مسار URL الحالي
|
|
786
778
|
);
|
|
@@ -795,7 +787,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
795
787
|
return (
|
|
796
788
|
<Navigate
|
|
797
789
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
798
|
-
replace // استبدال
|
|
790
|
+
replace // استبدال إدخال السجل الحالي بالإدخال الجديد
|
|
799
791
|
/>
|
|
800
792
|
);
|
|
801
793
|
}
|
|
@@ -807,7 +799,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
807
799
|
} else {
|
|
808
800
|
/**
|
|
809
801
|
* عندما تكون middleware.prefixDefault خاطئة، لا يتم إضافة بادئة للغة الافتراضية.
|
|
810
|
-
*
|
|
802
|
+
* تأكد من أن اللغة الحالية صالحة وليست اللغة الافتراضية.
|
|
811
803
|
*/
|
|
812
804
|
if (
|
|
813
805
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
@@ -830,7 +822,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
830
822
|
|
|
831
823
|
/**
|
|
832
824
|
* مكون راوتر يقوم بإعداد مسارات خاصة بكل لغة.
|
|
833
|
-
* يستخدم React Router لإدارة التنقل وعرض المكونات
|
|
825
|
+
* يستخدم React Router لإدارة التنقل وعرض المكونات المحلية.
|
|
834
826
|
*/
|
|
835
827
|
export const LocaleRouter = ({ children }) => (
|
|
836
828
|
<BrowserRouter>
|
|
@@ -841,7 +833,7 @@ export const LocaleRouter = ({ children }) => (
|
|
|
841
833
|
)
|
|
842
834
|
.map((locale) => (
|
|
843
835
|
<Route
|
|
844
|
-
// نمط المسار لالتقاط اللغة (مثل /en/، /fr/) ومطابقة جميع المسارات
|
|
836
|
+
// نمط المسار لالتقاط اللغة (مثل /en/، /fr/) ومطابقة جميع المسارات التالية
|
|
845
837
|
path={`/${locale}/*`}
|
|
846
838
|
key={locale}
|
|
847
839
|
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // يلف الأطفال بإدارة اللغة
|
|
@@ -866,8 +858,8 @@ export const LocaleRouter = ({ children }) => (
|
|
|
866
858
|
|
|
867
859
|
```jsx fileName="src/components/LocaleRouter.cjx" codeFormat="commonjs"
|
|
868
860
|
// استيراد التبعيات والوظائف اللازمة
|
|
869
|
-
const { configuration, getPathWithoutLocale } = require("intlayer"); // وظائف
|
|
870
|
-
const { IntlayerProvider, useLocale } = require("react-intlayer"); //
|
|
861
|
+
const { configuration, getPathWithoutLocale } = require("intlayer"); // وظائف مساعدة وأنواع من 'intlayer'
|
|
862
|
+
const { IntlayerProvider, useLocale } = require("react-intlayer"); // موفر لسياق التدويل
|
|
871
863
|
const {
|
|
872
864
|
BrowserRouter,
|
|
873
865
|
Routes,
|
|
@@ -882,7 +874,7 @@ const { locales, defaultLocale } = internationalization;
|
|
|
882
874
|
|
|
883
875
|
/**
|
|
884
876
|
* مكون يتعامل مع التدويل ويغلف الأطفال بسياق اللغة المناسب.
|
|
885
|
-
* يدير اكتشاف اللغة
|
|
877
|
+
* يدير اكتشاف اللغة بناءً على عنوان URL والتحقق منها.
|
|
886
878
|
*/
|
|
887
879
|
const AppLocalized = ({ children, locale }) => {
|
|
888
880
|
const { pathname, search } = useLocation(); // الحصول على مسار URL الحالي
|
|
@@ -910,13 +902,13 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
910
902
|
);
|
|
911
903
|
}
|
|
912
904
|
|
|
913
|
-
//
|
|
905
|
+
// تغليف العناصر الفرعية بمزود Intlayer وتعيين اللغة الحالية
|
|
914
906
|
return (
|
|
915
907
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
916
908
|
);
|
|
917
909
|
} else {
|
|
918
910
|
/**
|
|
919
|
-
* عندما تكون middleware.prefixDefault خاطئة، لا يتم إضافة بادئة
|
|
911
|
+
* عندما تكون middleware.prefixDefault خاطئة، لا يتم إضافة بادئة للغة الافتراضية.
|
|
920
912
|
* تأكد من أن اللغة الحالية صالحة وليست اللغة الافتراضية.
|
|
921
913
|
*/
|
|
922
914
|
if (
|
|
@@ -940,7 +932,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
940
932
|
|
|
941
933
|
/**
|
|
942
934
|
* مكون راوتر يقوم بإعداد مسارات خاصة بكل لغة.
|
|
943
|
-
* يستخدم React Router لإدارة التنقل وعرض المكونات
|
|
935
|
+
* يستخدم React Router لإدارة التنقل وعرض المكونات المترجمة.
|
|
944
936
|
*/
|
|
945
937
|
const LocaleRouter = ({ children }) => (
|
|
946
938
|
<BrowserRouter>
|
|
@@ -959,7 +951,7 @@ const LocaleRouter = ({ children }) => (
|
|
|
959
951
|
))}
|
|
960
952
|
|
|
961
953
|
{
|
|
962
|
-
// إذا تم تعطيل إضافة بادئة اللغة الافتراضية،
|
|
954
|
+
// إذا تم تعطيل إضافة بادئة اللغة الافتراضية، يتم عرض الأطفال مباشرة في المسار الجذري
|
|
963
955
|
!middleware.prefixDefault && (
|
|
964
956
|
<Route
|
|
965
957
|
path="*"
|
|
@@ -1013,7 +1005,7 @@ const App = () => (
|
|
|
1013
1005
|
);
|
|
1014
1006
|
```
|
|
1015
1007
|
|
|
1016
|
-
بالتوازي، يمكنك أيضًا استخدام `intLayerMiddlewarePlugin` لإضافة التوجيه من جانب الخادم إلى تطبيقك. سيقوم هذا المكون الإضافي تلقائيًا
|
|
1008
|
+
بالتوازي، يمكنك أيضًا استخدام `intLayerMiddlewarePlugin` لإضافة التوجيه من جانب الخادم إلى تطبيقك. سيقوم هذا المكون الإضافي بالكشف تلقائيًا عن اللغة الحالية بناءً على عنوان URL وتعيين ملف تعريف الارتباط المناسب للغة. إذا لم يتم تحديد لغة، فسيحدد المكون الإضافي اللغة الأنسب بناءً على تفضيلات لغة متصفح المستخدم. إذا لم يتم الكشف عن أي لغة، فسيتم إعادة التوجيه إلى اللغة الافتراضية.
|
|
1017
1009
|
|
|
1018
1010
|
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
1019
1011
|
import { defineConfig } from "vite";
|
|
@@ -1050,7 +1042,7 @@ module.exports = defineConfig({
|
|
|
1050
1042
|
|
|
1051
1043
|
### (اختياري) الخطوة 8: تغيير عنوان URL عند تغيير اللغة
|
|
1052
1044
|
|
|
1053
|
-
لتغيير عنوان URL عند تغيير اللغة، يمكنك استخدام الخاصية `onLocaleChange` المقدمة من الخطاف `useLocale`.
|
|
1045
|
+
لتغيير عنوان URL عند تغيير اللغة، يمكنك استخدام الخاصية `onLocaleChange` المقدمة من الخطاف `useLocale`. وبالتوازي، يمكنك استخدام الخطافين `useLocation` و `useNavigate` من مكتبة `react-router-dom` لتحديث مسار عنوان URL.
|
|
1054
1046
|
|
|
1055
1047
|
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
1056
1048
|
import { useLocation, useNavigate } from "react-router-dom";
|
|
@@ -1094,15 +1086,15 @@ const LocaleSwitcher: FC = () => {
|
|
|
1094
1086
|
key={localeItem}
|
|
1095
1087
|
>
|
|
1096
1088
|
<span>
|
|
1097
|
-
{/* اللغة
|
|
1089
|
+
{/* اللغة - مثلاً FR */}
|
|
1098
1090
|
{localeItem}
|
|
1099
1091
|
</span>
|
|
1100
1092
|
<span>
|
|
1101
|
-
{/* اللغة بلغتها
|
|
1093
|
+
{/* اللغة بلغتها الأصلية - مثلاً Français */}
|
|
1102
1094
|
{getLocaleName(localeItem, locale)}
|
|
1103
1095
|
</span>
|
|
1104
1096
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1105
|
-
{/* اللغة باللغة
|
|
1097
|
+
{/* اللغة باللغة الحالية - مثلاً Francés مع تعيين اللغة الحالية إلى Locales.SPANISH */}
|
|
1106
1098
|
{getLocaleName(localeItem)}
|
|
1107
1099
|
</span>
|
|
1108
1100
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
@@ -1222,19 +1214,19 @@ const LocaleSwitcher = () => {
|
|
|
1222
1214
|
key={localeItem}
|
|
1223
1215
|
>
|
|
1224
1216
|
<span>
|
|
1225
|
-
{/* اللغة المحلية -
|
|
1217
|
+
{/* اللغة المحلية - مثل FR */}
|
|
1226
1218
|
{localeItem}
|
|
1227
1219
|
</span>
|
|
1228
1220
|
<span>
|
|
1229
|
-
{/* اللغة بلغتها المحلية -
|
|
1221
|
+
{/* اللغة بلغتها المحلية - مثل Français */}
|
|
1230
1222
|
{getLocaleName(localeItem, locale)}
|
|
1231
1223
|
</span>
|
|
1232
1224
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1233
|
-
{/* اللغة
|
|
1225
|
+
{/* اللغة باللغة المحلية الحالية - مثل Francés مع تعيين اللغة الحالية إلى Locales.SPANISH */}
|
|
1234
1226
|
{getLocaleName(localeItem)}
|
|
1235
1227
|
</span>
|
|
1236
1228
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1237
|
-
{/* اللغة بالإنجليزية - على سبيل المثال
|
|
1229
|
+
{/* اللغة بالإنجليزية - على سبيل المثال الفرنسية */}
|
|
1238
1230
|
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1239
1231
|
</span>
|
|
1240
1232
|
</a>
|
|
@@ -1256,7 +1248,7 @@ const LocaleSwitcher = () => {
|
|
|
1256
1248
|
> - [`dir` attribute`](https://developer.mozilla.org/ar/docs/Web/HTML/Global_attributes/dir)
|
|
1257
1249
|
> - [`aria-current` attribute`](https://developer.mozilla.org/ar/docs/Web/Accessibility/ARIA/Attributes/aria-current)
|
|
1258
1250
|
|
|
1259
|
-
فيما يلي الخطوة التاسعة المحدثة مع
|
|
1251
|
+
فيما يلي الخطوة التاسعة المحدثة مع توضيحات إضافية وأمثلة كود محسنة:
|
|
1260
1252
|
|
|
1261
1253
|
---
|
|
1262
1254
|
|
|
@@ -1264,7 +1256,7 @@ const LocaleSwitcher = () => {
|
|
|
1264
1256
|
|
|
1265
1257
|
عندما يدعم تطبيقك لغات متعددة، من الضروري تحديث سمات `lang` و `dir` في وسم `<html>` لتتوافق مع اللغة الحالية. يضمن ذلك:
|
|
1266
1258
|
|
|
1267
|
-
-
|
|
1259
|
+
- **سهولة الوصول**: تعتمد برامج قراءة الشاشة وتقنيات المساعدة على سمة `lang` الصحيحة لنطق المحتوى وتفسيره بدقة.
|
|
1268
1260
|
- **عرض النص**: تضمن سمة `dir` (الاتجاه) عرض النص بالترتيب الصحيح (مثلًا من اليسار إلى اليمين للإنجليزية، ومن اليمين إلى اليسار للعربية أو العبرية)، وهو أمر أساسي لسهولة القراءة.
|
|
1269
1261
|
- **تحسين محركات البحث (SEO)**: تستخدم محركات البحث سمة `lang` لتحديد لغة الصفحة، مما يساعد في تقديم المحتوى المحلي المناسب في نتائج البحث.
|
|
1270
1262
|
|
|
@@ -1272,7 +1264,7 @@ const LocaleSwitcher = () => {
|
|
|
1272
1264
|
|
|
1273
1265
|
#### تنفيذ الـ Hook
|
|
1274
1266
|
|
|
1275
|
-
قم بإنشاء hook مخصص لإدارة سمات HTML. يستمع الـ hook لتغييرات اللغة
|
|
1267
|
+
قم بإنشاء hook مخصص لإدارة سمات HTML. يستمع الـ hook لتغييرات اللغة ويحدث السمات وفقًا لذلك:
|
|
1276
1268
|
|
|
1277
1269
|
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
1278
1270
|
import { useEffect } from "react";
|
|
@@ -1284,7 +1276,7 @@ import { getHTMLTextDir } from "intlayer";
|
|
|
1284
1276
|
* - `lang`: يُعلم المتصفحات ومحركات البحث بلغة الصفحة.
|
|
1285
1277
|
* - `dir`: يضمن ترتيب القراءة الصحيح (مثل 'ltr' للإنجليزية، 'rtl' للعربية).
|
|
1286
1278
|
*
|
|
1287
|
-
* هذا التحديث الديناميكي ضروري لعرض النص بشكل صحيح، وللوصولية، وتحسين محركات
|
|
1279
|
+
* هذا التحديث الديناميكي ضروري لعرض النص بشكل صحيح، وللوصولية، وتحسين محركات البحث.
|
|
1288
1280
|
*/
|
|
1289
1281
|
export const useI18nHTMLAttributes = () => {
|
|
1290
1282
|
const { locale } = useLocale();
|
|
@@ -1307,7 +1299,7 @@ import { getHTMLTextDir } from "intlayer";
|
|
|
1307
1299
|
/**
|
|
1308
1300
|
* يقوم بتحديث خصائص `lang` و `dir` لعنصر HTML <html> بناءً على اللغة الحالية.
|
|
1309
1301
|
* - `lang`: يُعلم المتصفحات ومحركات البحث بلغة الصفحة.
|
|
1310
|
-
* - `dir`: يضمن ترتيب القراءة الصحيح (مثل 'ltr' للإنجليزية، 'rtl' للعربية).
|
|
1302
|
+
* - `dir`: يضمن ترتيب القراءة الصحيح (مثل 'ltr' للإنجليزية، و 'rtl' للعربية).
|
|
1311
1303
|
*
|
|
1312
1304
|
* هذا التحديث الديناميكي ضروري لعرض النص بشكل صحيح، وللوصولية، وتحسين محركات البحث.
|
|
1313
1305
|
*/
|
|
@@ -1332,7 +1324,7 @@ const { getHTMLTextDir } = require("intlayer");
|
|
|
1332
1324
|
/**
|
|
1333
1325
|
* يقوم بتحديث خصائص `lang` و `dir` لعنصر HTML <html> بناءً على اللغة الحالية.
|
|
1334
1326
|
* - `lang`: يُعلم المتصفحات ومحركات البحث بلغة الصفحة.
|
|
1335
|
-
* - `dir`: يضمن ترتيب القراءة الصحيح (
|
|
1327
|
+
* - `dir`: يضمن ترتيب القراءة الصحيح (مثل 'ltr' للإنجليزية، 'rtl' للعربية).
|
|
1336
1328
|
*
|
|
1337
1329
|
* هذا التحديث الديناميكي ضروري لعرض النص بشكل صحيح، وتحسين إمكانية الوصول، وتحسين محركات البحث.
|
|
1338
1330
|
*/
|
|
@@ -1353,7 +1345,7 @@ module.exports = { useI18nHTMLAttributes };
|
|
|
1353
1345
|
|
|
1354
1346
|
#### استخدام الـ Hook في تطبيقك
|
|
1355
1347
|
|
|
1356
|
-
قم بدمج الـ hook في المكون الرئيسي الخاص بك بحيث يتم تحديث خصائص HTML
|
|
1348
|
+
قم بدمج الـ hook في المكون الرئيسي الخاص بك بحيث يتم تحديث خصائص HTML في كل مرة يتغير فيها اللغة:
|
|
1357
1349
|
|
|
1358
1350
|
```tsx fileName="src/App.tsx" codeFormat="typescript"
|
|
1359
1351
|
import type { FC } from "react";
|
|
@@ -1383,7 +1375,7 @@ import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
|
1383
1375
|
import "./App.css";
|
|
1384
1376
|
|
|
1385
1377
|
const AppContent = () => {
|
|
1386
|
-
// تطبيق الـ hook لتحديث خصائص lang و dir
|
|
1378
|
+
// تطبيق الـ hook لتحديث خصائص lang و dir لعلامة <html> بناءً على اللغة الحالية.
|
|
1387
1379
|
useI18nHTMLAttributes();
|
|
1388
1380
|
|
|
1389
1381
|
// ... بقية مكوناتك
|
|
@@ -1405,7 +1397,7 @@ const { useI18nHTMLAttributes } = require("./hooks/useI18nHTMLAttributes");
|
|
|
1405
1397
|
require("./App.css");
|
|
1406
1398
|
|
|
1407
1399
|
const AppContent = () => {
|
|
1408
|
-
// تطبيق الخطاف لتحديث خصائص lang و dir
|
|
1400
|
+
// تطبيق الخطاف لتحديث خصائص lang و dir في وسم <html> بناءً على اللغة المحلية.
|
|
1409
1401
|
useI18nHTMLAttributes();
|
|
1410
1402
|
|
|
1411
1403
|
// ... بقية مكوناتك
|
|
@@ -1420,23 +1412,23 @@ const App = () => (
|
|
|
1420
1412
|
module.exports = App;
|
|
1421
1413
|
```
|
|
1422
1414
|
|
|
1423
|
-
|
|
1415
|
+
بتطبيق هذه التغييرات، سيقوم تطبيقك بـ:
|
|
1424
1416
|
|
|
1425
1417
|
- ضمان أن خاصية **اللغة** (`lang`) تعكس اللغة المحلية الحالية بشكل صحيح، وهو أمر مهم لتحسين محركات البحث وسلوك المتصفح.
|
|
1426
1418
|
- ضبط **اتجاه النص** (`dir`) وفقًا للغة المحلية، مما يعزز من قابلية القراءة وسهولة الاستخدام للغات ذات اتجاهات قراءة مختلفة.
|
|
1427
|
-
- توفير تجربة أكثر **سهولة في الوصول**، حيث تعتمد تقنيات المساعدة على هذه الخصائص لتعمل بشكل
|
|
1419
|
+
- توفير تجربة أكثر **سهولة في الوصول**، حيث تعتمد تقنيات المساعدة على هذه الخصائص لتعمل بشكل مثالي.
|
|
1428
1420
|
|
|
1429
|
-
### (اختياري) الخطوة 10: إنشاء مكون رابط محلي
|
|
1421
|
+
### (اختياري) الخطوة 10: إنشاء مكون رابط محلي
|
|
1430
1422
|
|
|
1431
1423
|
لضمان أن تحترم تنقلات تطبيقك اللغة الحالية، يمكنك إنشاء مكون `Link` مخصص. يقوم هذا المكون تلقائيًا بإضافة بادئة اللغة الحالية إلى عناوين URL الداخلية، بحيث عند نقر مستخدم يتحدث الفرنسية على رابط لصفحة "حول"، يتم توجيهه إلى `/fr/about` بدلاً من `/about`.
|
|
1432
1424
|
|
|
1433
1425
|
هذا السلوك مفيد لعدة أسباب:
|
|
1434
1426
|
|
|
1435
|
-
- **تحسين محركات البحث وتجربة المستخدم**: تساعد عناوين URL
|
|
1436
|
-
- **الاتساق**: باستخدام رابط
|
|
1437
|
-
- **قابلية الصيانة**:
|
|
1427
|
+
- **تحسين محركات البحث وتجربة المستخدم**: تساعد عناوين URL المترجمة محركات البحث على فهرسة الصفحات الخاصة بكل لغة بشكل صحيح وتوفر للمستخدمين محتوى بلغتهم المفضلة.
|
|
1428
|
+
- **الاتساق**: باستخدام رابط مترجم في جميع أنحاء تطبيقك، تضمن أن التنقل يبقى ضمن اللغة الحالية، مما يمنع التبديلات غير المتوقعة في اللغة.
|
|
1429
|
+
- **قابلية الصيانة**: توحيد منطق التوطين في مكون واحد يبسط إدارة عناوين URL، مما يجعل قاعدة الكود الخاصة بك أسهل في الصيانة والتطوير مع نمو تطبيقك.
|
|
1438
1430
|
|
|
1439
|
-
فيما يلي تنفيذ لمكون `Link` مخصص
|
|
1431
|
+
فيما يلي تنفيذ لمكون `Link` مخصص يدعم التوطين باستخدام TypeScript:
|
|
1440
1432
|
|
|
1441
1433
|
```tsx fileName="src/components/Link.tsx" codeFormat="typescript"
|
|
1442
1434
|
import { getLocalizedUrl } from "intlayer";
|
|
@@ -1455,13 +1447,13 @@ export interface LinkProps
|
|
|
1455
1447
|
|
|
1456
1448
|
/**
|
|
1457
1449
|
* دالة مساعدة للتحقق مما إذا كان عنوان URL معين خارجيًا.
|
|
1458
|
-
* إذا بدأ عنوان URL بـ http:// أو https://،
|
|
1450
|
+
* إذا بدأ عنوان URL بـ http:// أو https://، يعتبر خارجيًا.
|
|
1459
1451
|
*/
|
|
1460
1452
|
export const checkIsExternalLink = (href?: string): boolean =>
|
|
1461
1453
|
/^https?:\/\//.test(href ?? "");
|
|
1462
1454
|
|
|
1463
1455
|
/**
|
|
1464
|
-
* مكون
|
|
1456
|
+
* مكون رابط مخصص يقوم بتعديل خاصية href بناءً على اللغة الحالية.
|
|
1465
1457
|
* بالنسبة للروابط الداخلية، يستخدم `getLocalizedUrl` لإضافة بادئة اللغة إلى الرابط (مثل /fr/about).
|
|
1466
1458
|
* هذا يضمن أن التنقل يبقى ضمن نفس سياق اللغة.
|
|
1467
1459
|
*/
|
|
@@ -1470,7 +1462,7 @@ export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
|
1470
1462
|
const { locale } = useLocale();
|
|
1471
1463
|
const isExternalLink = checkIsExternalLink(href);
|
|
1472
1464
|
|
|
1473
|
-
// إذا
|
|
1465
|
+
// إذا كان الرابط داخليًا وتم توفير href صالح، احصل على الرابط المحلي.
|
|
1474
1466
|
const hrefI18n =
|
|
1475
1467
|
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1476
1468
|
|
|
@@ -1491,22 +1483,22 @@ import { useLocale } from "react-intlayer";
|
|
|
1491
1483
|
import { forwardRef } from "react";
|
|
1492
1484
|
|
|
1493
1485
|
/**
|
|
1494
|
-
* دالة مساعدة للتحقق مما إذا كان
|
|
1495
|
-
* إذا بدأ
|
|
1486
|
+
* دالة مساعدة للتحقق مما إذا كان الرابط المعطى خارجيًا.
|
|
1487
|
+
* إذا بدأ الرابط بـ http:// أو https://، فإنه يعتبر خارجيًا.
|
|
1496
1488
|
*/
|
|
1497
1489
|
export const checkIsExternalLink = (href?: string): boolean =>
|
|
1498
1490
|
/^https?:\/\//.test(href ?? "");
|
|
1499
1491
|
|
|
1500
1492
|
/**
|
|
1501
1493
|
* مكون رابط مخصص يقوم بتكييف خاصية href بناءً على اللغة الحالية.
|
|
1502
|
-
* بالنسبة للروابط الداخلية، يستخدم `getLocalizedUrl` لإضافة بادئة اللغة إلى
|
|
1494
|
+
* بالنسبة للروابط الداخلية، يستخدم `getLocalizedUrl` لإضافة بادئة اللغة إلى الرابط (مثلاً /fr/about).
|
|
1503
1495
|
* هذا يضمن أن التنقل يبقى ضمن نفس سياق اللغة.
|
|
1504
1496
|
*/
|
|
1505
1497
|
export const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1506
1498
|
const { locale } = useLocale();
|
|
1507
1499
|
const isExternalLink = checkIsExternalLink(href);
|
|
1508
1500
|
|
|
1509
|
-
// إذا كان الرابط داخليًا وتم توفير href صالح، احصل على
|
|
1501
|
+
// إذا كان الرابط داخليًا وتم توفير href صالح، احصل على الرابط المحلي.
|
|
1510
1502
|
const hrefI18n =
|
|
1511
1503
|
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1512
1504
|
|
|
@@ -1527,7 +1519,7 @@ const { forwardRef } = require("react");
|
|
|
1527
1519
|
|
|
1528
1520
|
/**
|
|
1529
1521
|
* دالة مساعدة للتحقق مما إذا كان عنوان URL معين خارجيًا.
|
|
1530
|
-
* إذا بدأ عنوان URL بـ http:// أو https://،
|
|
1522
|
+
* إذا بدأ عنوان URL بـ http:// أو https://، يُعتبر خارجيًا.
|
|
1531
1523
|
*/
|
|
1532
1524
|
const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1533
1525
|
|
|
@@ -1561,18 +1553,18 @@ Link.displayName = "Link";
|
|
|
1561
1553
|
#### كيف يعمل
|
|
1562
1554
|
|
|
1563
1555
|
- **كشف الروابط الخارجية**:
|
|
1564
|
-
تقوم الدالة المساعدة `checkIsExternalLink` بتحديد ما إذا كان الرابط خارجيًا.
|
|
1556
|
+
تقوم الدالة المساعدة `checkIsExternalLink` بتحديد ما إذا كان الرابط URL خارجيًا. يتم ترك الروابط الخارجية كما هي لأنها لا تحتاج إلى تعريب.
|
|
1565
1557
|
|
|
1566
1558
|
- **استرجاع اللغة الحالية**:
|
|
1567
1559
|
يوفر الخطاف `useLocale` اللغة الحالية (مثلًا `fr` للفرنسية).
|
|
1568
1560
|
|
|
1569
1561
|
- **تعريب الرابط**:
|
|
1570
|
-
بالنسبة للروابط الداخلية (أي غير الخارجية)، يتم استخدام `getLocalizedUrl` لإضافة بادئة اللغة تلقائيًا إلى الرابط. هذا يعني أنه إذا كان المستخدم يتصفح باللغة الفرنسية، فإن تمرير `/about` كـ `href` سيُحوَّل إلى `/fr/about`.
|
|
1562
|
+
بالنسبة للروابط الداخلية (أي غير الخارجية)، يتم استخدام `getLocalizedUrl` لإضافة بادئة اللغة الحالية تلقائيًا إلى الرابط. هذا يعني أنه إذا كان المستخدم يتصفح باللغة الفرنسية، فإن تمرير `/about` كـ `href` سيُحوَّل إلى `/fr/about`.
|
|
1571
1563
|
|
|
1572
1564
|
- **إرجاع الرابط**:
|
|
1573
1565
|
يعيد المكون عنصر `<a>` مع عنوان URL المحلي، مما يضمن أن التنقل متسق مع اللغة المختارة.
|
|
1574
1566
|
|
|
1575
|
-
من خلال دمج هذا المكون `Link`
|
|
1567
|
+
من خلال دمج هذا المكون `Link` عبر تطبيقك، تحافظ على تجربة مستخدم متماسكة وواعية باللغة، مع الاستفادة أيضًا من تحسين محركات البحث وسهولة الاستخدام.
|
|
1576
1568
|
|
|
1577
1569
|
### تكوين TypeScript
|
|
1578
1570
|
|
|
@@ -1605,16 +1597,16 @@ Link.displayName = "Link";
|
|
|
1605
1597
|
.intlayer
|
|
1606
1598
|
```
|
|
1607
1599
|
|
|
1608
|
-
###
|
|
1600
|
+
### إضافة VS Code
|
|
1609
1601
|
|
|
1610
|
-
لتحسين تجربة التطوير الخاصة بك مع Intlayer، يمكنك تثبيت
|
|
1602
|
+
لتحسين تجربة التطوير الخاصة بك مع Intlayer، يمكنك تثبيت **إضافة Intlayer الرسمية لـ VS Code**.
|
|
1611
1603
|
|
|
1612
1604
|
[التثبيت من سوق VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
1613
1605
|
|
|
1614
|
-
|
|
1606
|
+
تقدم هذه الإضافة:
|
|
1615
1607
|
|
|
1616
1608
|
- **الإكمال التلقائي** لمفاتيح الترجمة.
|
|
1617
|
-
- **الكشف
|
|
1609
|
+
- **الكشف عن الأخطاء في الوقت الحقيقي** للترجمات المفقودة.
|
|
1618
1610
|
- **معاينات داخلية** للمحتوى المترجم.
|
|
1619
1611
|
- **إجراءات سريعة** لإنشاء الترجمات وتحديثها بسهولة.
|
|
1620
1612
|
|