@intlayer/docs 6.1.6-canary.0 → 6.1.6
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/en/next-i18next_vs_next-intl_vs_intlayer.md +71 -80
- package/dist/cjs/generated/docs.entry.cjs +16 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +16 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/intlayer_with_angular.md +2 -2
- package/docs/ar/intlayer_with_astro.md +246 -0
- package/docs/ar/intlayer_with_create_react_app.md +3 -2
- package/docs/ar/intlayer_with_express.md +2 -2
- package/docs/ar/intlayer_with_nestjs.md +2 -2
- package/docs/ar/intlayer_with_nextjs_14.md +2 -2
- package/docs/ar/intlayer_with_nextjs_15.md +2 -2
- package/docs/ar/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ar/intlayer_with_nuxt.md +2 -2
- package/docs/ar/intlayer_with_react_native+expo.md +11 -20
- package/docs/ar/intlayer_with_react_router_v7.md +195 -241
- package/docs/ar/intlayer_with_tanstack.md +198 -272
- package/docs/ar/intlayer_with_vite+preact.md +9 -9
- package/docs/ar/intlayer_with_vite+react.md +7 -7
- package/docs/ar/intlayer_with_vite+vue.md +9 -9
- package/docs/de/intlayer_with_angular.md +2 -2
- package/docs/de/intlayer_with_astro.md +246 -0
- package/docs/de/intlayer_with_create_react_app.md +2 -2
- package/docs/de/intlayer_with_express.md +2 -2
- package/docs/de/intlayer_with_nestjs.md +2 -2
- package/docs/de/intlayer_with_nextjs_14.md +2 -2
- package/docs/de/intlayer_with_nextjs_15.md +2 -2
- package/docs/de/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/de/intlayer_with_nuxt.md +2 -2
- package/docs/de/intlayer_with_react_native+expo.md +11 -20
- package/docs/de/intlayer_with_react_router_v7.md +193 -242
- package/docs/de/intlayer_with_tanstack.md +194 -266
- package/docs/de/intlayer_with_vite+preact.md +9 -9
- package/docs/de/intlayer_with_vite+react.md +9 -9
- package/docs/de/intlayer_with_vite+vue.md +11 -11
- package/docs/de/packages/vite-intlayer/index.md +3 -3
- package/docs/en/how_works_intlayer.md +1 -1
- package/docs/en/index.md +1 -1
- package/docs/en/intlayer_cli.md +1 -1
- package/docs/en/intlayer_with_angular.md +4 -4
- package/docs/en/intlayer_with_astro.md +246 -0
- package/docs/en/intlayer_with_create_react_app.md +4 -4
- package/docs/en/intlayer_with_express.md +3 -3
- package/docs/en/intlayer_with_lynx+react.md +1 -1
- package/docs/en/intlayer_with_nestjs.md +2 -2
- package/docs/en/intlayer_with_nextjs_14.md +13 -4
- package/docs/en/intlayer_with_nextjs_15.md +13 -4
- package/docs/en/intlayer_with_nextjs_page_router.md +5 -5
- package/docs/en/intlayer_with_nuxt.md +4 -4
- package/docs/en/intlayer_with_react_native+expo.md +46 -24
- package/docs/en/intlayer_with_react_router_v7.md +164 -211
- package/docs/en/intlayer_with_tanstack.md +166 -241
- package/docs/en/intlayer_with_vite+preact.md +12 -12
- package/docs/en/intlayer_with_vite+react.md +12 -12
- package/docs/en/intlayer_with_vite+solid.md +2 -2
- package/docs/en/intlayer_with_vite+svelte.md +2 -2
- package/docs/en/intlayer_with_vite+vue.md +12 -12
- package/docs/en/introduction.md +1 -1
- package/docs/en/packages/next-intlayer/useDictionary.md +1 -1
- package/docs/en/packages/next-intlayer/useIntlayer.md +1 -1
- package/docs/en/packages/react-intlayer/useDictionary.md +1 -1
- package/docs/en/packages/react-intlayer/useI18n.md +1 -1
- package/docs/en/packages/react-intlayer/useIntlayer.md +1 -1
- package/docs/en/releases/v6.md +1 -0
- package/docs/en/roadmap.md +1 -1
- package/docs/en-GB/intlayer_with_angular.md +3 -3
- package/docs/en-GB/intlayer_with_astro.md +246 -0
- package/docs/en-GB/intlayer_with_create_react_app.md +5 -4
- package/docs/en-GB/intlayer_with_express.md +2 -2
- package/docs/en-GB/intlayer_with_nestjs.md +2 -2
- package/docs/en-GB/intlayer_with_nextjs_14.md +4 -4
- package/docs/en-GB/intlayer_with_nextjs_15.md +2 -2
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/en-GB/intlayer_with_nuxt.md +2 -2
- package/docs/en-GB/intlayer_with_react_native+expo.md +11 -20
- package/docs/en-GB/intlayer_with_react_router_v7.md +171 -220
- package/docs/en-GB/intlayer_with_tanstack.md +174 -248
- package/docs/en-GB/intlayer_with_vite+preact.md +9 -9
- package/docs/en-GB/intlayer_with_vite+react.md +9 -9
- package/docs/en-GB/intlayer_with_vite+vue.md +11 -11
- package/docs/en-GB/packages/next-intlayer/useIntlayer.md +1 -1
- package/docs/en-GB/packages/react-intlayer/useIntlayer.md +1 -1
- package/docs/es/intlayer_with_angular.md +2 -2
- package/docs/es/intlayer_with_astro.md +246 -0
- package/docs/es/intlayer_with_create_react_app.md +3 -2
- package/docs/es/intlayer_with_express.md +2 -2
- package/docs/es/intlayer_with_nextjs_14.md +2 -2
- package/docs/es/intlayer_with_nextjs_15.md +2 -2
- package/docs/es/intlayer_with_react_native+expo.md +11 -20
- package/docs/es/intlayer_with_react_router_v7.md +188 -232
- package/docs/es/intlayer_with_tanstack.md +203 -273
- package/docs/es/intlayer_with_vite+preact.md +7 -7
- package/docs/es/intlayer_with_vite+react.md +7 -7
- package/docs/es/intlayer_with_vite+vue.md +9 -9
- package/docs/fr/intlayer_with_angular.md +2 -2
- package/docs/fr/intlayer_with_astro.md +246 -0
- package/docs/fr/intlayer_with_create_react_app.md +3 -2
- package/docs/fr/intlayer_with_express.md +2 -2
- package/docs/fr/intlayer_with_nestjs.md +2 -2
- package/docs/fr/intlayer_with_nextjs_14.md +2 -2
- package/docs/fr/intlayer_with_react_native+expo.md +11 -20
- package/docs/fr/intlayer_with_react_router_v7.md +188 -248
- package/docs/fr/intlayer_with_tanstack.md +192 -265
- package/docs/fr/intlayer_with_vite+preact.md +7 -7
- package/docs/fr/intlayer_with_vite+react.md +7 -7
- package/docs/fr/intlayer_with_vite+vue.md +9 -9
- package/docs/hi/intlayer_cli.md +1 -4
- package/docs/hi/intlayer_with_angular.md +2 -2
- package/docs/hi/intlayer_with_astro.md +246 -0
- package/docs/hi/intlayer_with_create_react_app.md +2 -2
- package/docs/hi/intlayer_with_express.md +2 -2
- package/docs/hi/intlayer_with_nestjs.md +2 -2
- package/docs/hi/intlayer_with_nextjs_14.md +2 -2
- package/docs/hi/intlayer_with_nextjs_15.md +2 -2
- package/docs/hi/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/hi/intlayer_with_nuxt.md +2 -2
- package/docs/hi/intlayer_with_react_native+expo.md +11 -20
- package/docs/hi/intlayer_with_react_router_v7.md +199 -243
- package/docs/hi/intlayer_with_tanstack.md +210 -285
- package/docs/hi/intlayer_with_vite+preact.md +9 -9
- package/docs/hi/intlayer_with_vite+react.md +9 -9
- package/docs/hi/intlayer_with_vite+solid.md +1 -1
- package/docs/hi/intlayer_with_vite+vue.md +11 -11
- package/docs/it/intlayer_with_angular.md +2 -2
- package/docs/it/intlayer_with_astro.md +246 -0
- package/docs/it/intlayer_with_create_react_app.md +3 -2
- package/docs/it/intlayer_with_express.md +2 -2
- package/docs/it/intlayer_with_nestjs.md +2 -2
- package/docs/it/intlayer_with_nextjs_14.md +2 -2
- package/docs/it/intlayer_with_nextjs_15.md +2 -2
- package/docs/it/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/it/intlayer_with_nuxt.md +2 -2
- package/docs/it/intlayer_with_react_native+expo.md +11 -21
- package/docs/it/intlayer_with_react_router_v7.md +195 -242
- package/docs/it/intlayer_with_tanstack.md +203 -267
- package/docs/it/intlayer_with_vite+preact.md +9 -9
- package/docs/it/intlayer_with_vite+react.md +13 -11
- package/docs/it/intlayer_with_vite+vue.md +11 -11
- package/docs/ja/intlayer_with_angular.md +2 -2
- package/docs/ja/intlayer_with_astro.md +246 -0
- package/docs/ja/intlayer_with_create_react_app.md +3 -2
- package/docs/ja/intlayer_with_express.md +2 -2
- package/docs/ja/intlayer_with_nestjs.md +2 -2
- package/docs/ja/intlayer_with_nextjs_14.md +2 -2
- package/docs/ja/intlayer_with_nextjs_15.md +2 -2
- package/docs/ja/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ja/intlayer_with_nuxt.md +2 -2
- package/docs/ja/intlayer_with_react_native+expo.md +18 -29
- package/docs/ja/intlayer_with_react_router_v7.md +204 -250
- package/docs/ja/intlayer_with_tanstack.md +218 -286
- package/docs/ja/intlayer_with_vite+preact.md +9 -9
- package/docs/ja/intlayer_with_vite+react.md +11 -11
- package/docs/ja/intlayer_with_vite+vue.md +11 -11
- package/docs/ko/intlayer_with_angular.md +2 -2
- package/docs/ko/intlayer_with_astro.md +246 -0
- package/docs/ko/intlayer_with_create_react_app.md +3 -2
- package/docs/ko/intlayer_with_express.md +2 -2
- package/docs/ko/intlayer_with_nestjs.md +2 -2
- package/docs/ko/intlayer_with_nextjs_14.md +2 -2
- package/docs/ko/intlayer_with_nextjs_15.md +2 -2
- package/docs/ko/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ko/intlayer_with_nuxt.md +2 -2
- package/docs/ko/intlayer_with_react_native+expo.md +19 -28
- package/docs/ko/intlayer_with_react_router_v7.md +190 -244
- package/docs/ko/intlayer_with_tanstack.md +200 -270
- package/docs/ko/intlayer_with_vite+preact.md +9 -9
- package/docs/ko/intlayer_with_vite+react.md +9 -9
- package/docs/ko/intlayer_with_vite+vue.md +11 -11
- package/docs/pt/intlayer_with_angular.md +2 -2
- package/docs/pt/intlayer_with_astro.md +246 -0
- package/docs/pt/intlayer_with_create_react_app.md +3 -2
- package/docs/pt/intlayer_with_express.md +2 -2
- package/docs/pt/intlayer_with_nestjs.md +2 -2
- package/docs/pt/intlayer_with_nextjs_14.md +2 -2
- package/docs/pt/intlayer_with_nextjs_15.md +2 -2
- package/docs/pt/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/pt/intlayer_with_nuxt.md +2 -2
- package/docs/pt/intlayer_with_react_native+expo.md +11 -20
- package/docs/pt/intlayer_with_react_router_v7.md +7 -13
- package/docs/pt/intlayer_with_tanstack.md +183 -258
- package/docs/pt/intlayer_with_vite+preact.md +9 -9
- package/docs/pt/intlayer_with_vite+react.md +9 -9
- package/docs/pt/intlayer_with_vite+vue.md +9 -9
- package/docs/ru/intlayer_with_angular.md +2 -2
- package/docs/ru/intlayer_with_astro.md +246 -0
- package/docs/ru/intlayer_with_create_react_app.md +3 -2
- package/docs/ru/intlayer_with_express.md +2 -2
- package/docs/ru/intlayer_with_nestjs.md +2 -2
- package/docs/ru/intlayer_with_nextjs_14.md +2 -2
- package/docs/ru/intlayer_with_nextjs_15.md +2 -2
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +2 -2
- package/docs/ru/intlayer_with_react_native+expo.md +11 -20
- package/docs/ru/intlayer_with_react_router_v7.md +192 -238
- package/docs/ru/intlayer_with_tanstack.md +197 -269
- package/docs/ru/intlayer_with_vite+preact.md +9 -9
- package/docs/ru/intlayer_with_vite+react.md +9 -9
- package/docs/ru/intlayer_with_vite+vue.md +11 -11
- package/docs/tr/how_works_intlayer.md +1 -1
- package/docs/tr/index.md +1 -1
- package/docs/tr/intlayer_cli.md +1 -1
- package/docs/tr/intlayer_with_angular.md +4 -4
- package/docs/tr/intlayer_with_astro.md +246 -0
- package/docs/tr/intlayer_with_create_react_app.md +4 -4
- package/docs/tr/intlayer_with_express.md +3 -3
- package/docs/tr/intlayer_with_lynx+react.md +1 -1
- package/docs/tr/intlayer_with_nestjs.md +2 -2
- package/docs/tr/intlayer_with_nextjs_14.md +2 -2
- package/docs/tr/intlayer_with_nextjs_15.md +4 -4
- package/docs/tr/intlayer_with_nextjs_page_router.md +5 -5
- package/docs/tr/intlayer_with_nuxt.md +4 -4
- package/docs/tr/intlayer_with_react_native+expo.md +12 -21
- package/docs/tr/intlayer_with_react_router_v7.md +222 -267
- package/docs/tr/intlayer_with_tanstack.md +400 -303
- package/docs/tr/intlayer_with_vite+preact.md +12 -12
- package/docs/tr/intlayer_with_vite+react.md +12 -12
- package/docs/tr/intlayer_with_vite+solid.md +2 -2
- package/docs/tr/intlayer_with_vite+svelte.md +2 -2
- package/docs/tr/intlayer_with_vite+vue.md +12 -12
- package/docs/tr/introduction.md +1 -1
- package/docs/tr/packages/react-intlayer/useDictionary.md +1 -1
- package/docs/tr/packages/react-intlayer/useI18n.md +1 -1
- package/docs/tr/roadmap.md +1 -1
- package/docs/zh/intlayer_with_angular.md +2 -2
- package/docs/zh/intlayer_with_astro.md +246 -0
- package/docs/zh/intlayer_with_create_react_app.md +3 -2
- package/docs/zh/intlayer_with_express.md +2 -2
- package/docs/zh/intlayer_with_nestjs.md +2 -2
- package/docs/zh/intlayer_with_nextjs_14.md +2 -2
- package/docs/zh/intlayer_with_nextjs_15.md +2 -2
- package/docs/zh/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/zh/intlayer_with_nuxt.md +2 -2
- package/docs/zh/intlayer_with_react_native+expo.md +19 -28
- package/docs/zh/intlayer_with_react_router_v7.md +200 -248
- package/docs/zh/intlayer_with_tanstack.md +208 -283
- package/docs/zh/intlayer_with_vite+preact.md +9 -9
- package/docs/zh/intlayer_with_vite+react.md +9 -9
- package/docs/zh/intlayer_with_vite+vue.md +9 -9
- package/package.json +11 -11
- package/src/generated/docs.entry.ts +16 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
createdAt: 2025-09-09
|
|
3
3
|
updatedAt: 2025-09-09
|
|
4
4
|
title: البدء مع Intlayer في Tanstack Start
|
|
5
|
-
description: تعلّم كيفية إضافة التدويل (i18n) إلى تطبيق Tanstack Start الخاص بك باستخدام Intlayer. اتبع هذا الدليل الشامل لجعل تطبيقك متعدد اللغات مع توجيه
|
|
5
|
+
description: تعلّم كيفية إضافة التدويل (i18n) إلى تطبيق Tanstack Start الخاص بك باستخدام Intlayer. اتبع هذا الدليل الشامل لجعل تطبيقك متعدد اللغات مع توجيه يعتمد على اللغة.
|
|
6
6
|
keywords:
|
|
7
7
|
- التدويل
|
|
8
8
|
- التوثيق
|
|
@@ -15,15 +15,13 @@ keywords:
|
|
|
15
15
|
slugs:
|
|
16
16
|
- doc
|
|
17
17
|
- environment
|
|
18
|
-
- vite-and-react
|
|
19
18
|
- tanstack-start
|
|
20
|
-
applicationTemplate: https://github.com/
|
|
21
|
-
author: AydinTheFirst
|
|
19
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
|
|
22
20
|
---
|
|
23
21
|
|
|
24
|
-
# البدء
|
|
22
|
+
# البدء بالتدويل (i18n) باستخدام Intlayer و Tanstack Start
|
|
25
23
|
|
|
26
|
-
يوضح هذا الدليل كيفية دمج **Intlayer** لتحقيق تدويل سلس في مشاريع Tanstack Start مع توجيه
|
|
24
|
+
يوضح هذا الدليل كيفية دمج **Intlayer** لتحقيق تدويل سلس في مشاريع Tanstack Start مع توجيه يعتمد على اللغة، ودعم TypeScript، وممارسات تطوير حديثة.
|
|
27
25
|
|
|
28
26
|
## ما هو Intlayer؟
|
|
29
27
|
|
|
@@ -32,10 +30,10 @@ author: AydinTheFirst
|
|
|
32
30
|
مع Intlayer، يمكنك:
|
|
33
31
|
|
|
34
32
|
- **إدارة الترجمات بسهولة** باستخدام قواميس إعلانية على مستوى المكونات.
|
|
35
|
-
- **توطين البيانات
|
|
36
|
-
- **ضمان دعم TypeScript**
|
|
33
|
+
- **توطين البيانات الوصفية والمسارات والمحتوى ديناميكيًا**.
|
|
34
|
+
- **ضمان دعم TypeScript** مع أنواع مولدة تلقائيًا، مما يحسن الإكمال التلقائي واكتشاف الأخطاء.
|
|
37
35
|
- **الاستفادة من الميزات المتقدمة**، مثل الكشف الديناميكي عن اللغة والتبديل بينها.
|
|
38
|
-
- **تمكين التوجيه
|
|
36
|
+
- **تمكين التوجيه المعتمد على اللغة** باستخدام نظام التوجيه القائم على الملفات في Tanstack Start.
|
|
39
37
|
|
|
40
38
|
---
|
|
41
39
|
|
|
@@ -61,19 +59,19 @@ pnpm add vite-intlayer --save-dev
|
|
|
61
59
|
|
|
62
60
|
- **intlayer**
|
|
63
61
|
|
|
64
|
-
الحزمة الأساسية التي توفر أدوات التدويل لإدارة التكوين،
|
|
62
|
+
الحزمة الأساسية التي توفر أدوات التدويل لإدارة التكوين، الترجمة، [إعلان المحتوى](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).
|
|
65
63
|
|
|
66
64
|
- **react-intlayer**
|
|
67
|
-
الحزمة التي تدمج Intlayer مع تطبيق React. توفر
|
|
65
|
+
الحزمة التي تدمج Intlayer مع تطبيق React. توفر مزودي السياق (context providers) وخطافات (hooks) لتدويل React.
|
|
68
66
|
|
|
69
67
|
- **vite-intlayer**
|
|
70
|
-
تتضمن إضافة Vite لدمج Intlayer مع [مجمّع Vite](https://vite.dev/guide/why.html#why-bundle-for-production)، بالإضافة إلى وسيط (middleware) لاكتشاف اللغة المفضلة للمستخدم،
|
|
68
|
+
تتضمن إضافة Vite لدمج Intlayer مع [مجمّع Vite](https://vite.dev/guide/why.html#why-bundle-for-production)، بالإضافة إلى وسيط (middleware) لاكتشاف اللغة المفضلة للمستخدم، إدارة الكوكيز، والتعامل مع إعادة توجيه عناوين URL.
|
|
71
69
|
|
|
72
70
|
### الخطوة 3: تكوين مشروعك
|
|
73
71
|
|
|
74
|
-
|
|
72
|
+
أنشئ ملف تكوين لتكوين لغات تطبيقك:
|
|
75
73
|
|
|
76
|
-
```typescript fileName="intlayer.config.ts"
|
|
74
|
+
```typescript fileName="intlayer.config.ts"
|
|
77
75
|
import type { IntlayerConfig } from "intlayer";
|
|
78
76
|
|
|
79
77
|
import { Locales } from "intlayer";
|
|
@@ -81,90 +79,40 @@ import { Locales } from "intlayer";
|
|
|
81
79
|
const config: IntlayerConfig = {
|
|
82
80
|
internationalization: {
|
|
83
81
|
defaultLocale: Locales.ENGLISH,
|
|
84
|
-
locales: [
|
|
85
|
-
Locales.ENGLISH,
|
|
86
|
-
Locales.FRENCH,
|
|
87
|
-
Locales.SPANISH,
|
|
88
|
-
// لغاتك الأخرى
|
|
89
|
-
],
|
|
82
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
90
83
|
},
|
|
91
84
|
};
|
|
92
85
|
|
|
93
86
|
export default config;
|
|
94
87
|
```
|
|
95
88
|
|
|
96
|
-
|
|
97
|
-
import { Locales } from "intlayer";
|
|
98
|
-
|
|
99
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
100
|
-
const config = {
|
|
101
|
-
internationalization: {
|
|
102
|
-
defaultLocale: Locales.ENGLISH,
|
|
103
|
-
locales: [
|
|
104
|
-
Locales.ENGLISH,
|
|
105
|
-
Locales.FRENCH,
|
|
106
|
-
Locales.SPANISH,
|
|
107
|
-
// لغاتك الأخرى
|
|
108
|
-
],
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
export default config;
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
116
|
-
const { Locales } = require("intlayer");
|
|
117
|
-
|
|
118
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
119
|
-
const config = {
|
|
120
|
-
internationalization: {
|
|
121
|
-
defaultLocale: Locales.ENGLISH,
|
|
122
|
-
locales: [
|
|
123
|
-
Locales.ENGLISH,
|
|
124
|
-
Locales.FRENCH,
|
|
125
|
-
Locales.SPANISH,
|
|
126
|
-
// لغاتك الأخرى
|
|
127
|
-
],
|
|
128
|
-
},
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
module.exports = config;
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
> من خلال ملف التكوين هذا، يمكنك إعداد عناوين URL محلية، إعادة توجيه الوسيط، أسماء ملفات تعريف الارتباط، موقع وامتداد إعلانات المحتوى الخاصة بك، تعطيل سجلات Intlayer في وحدة التحكم، والمزيد. للحصول على قائمة كاملة بالمعلمات المتاحة، راجع [توثيق التكوين](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/configuration.md).
|
|
89
|
+
> من خلال ملف التكوين هذا، يمكنك إعداد عناوين URL محلية، إعادة توجيه الوسيط (middleware)، أسماء الكوكيز، موقع وامتداد إعلانات المحتوى الخاصة بك، تعطيل سجلات Intlayer في وحدة التحكم، والمزيد. للحصول على قائمة كاملة بالمعلمات المتاحة، راجع [توثيق التكوين](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/configuration.md).
|
|
135
90
|
|
|
136
91
|
### الخطوة 4: دمج Intlayer في تكوين Vite الخاص بك
|
|
137
92
|
|
|
138
93
|
أضف مكون intlayer الإضافي إلى تكوينك:
|
|
139
94
|
|
|
140
|
-
```typescript fileName="vite.config.ts"
|
|
95
|
+
```typescript fileName="vite.config.ts"
|
|
141
96
|
import { reactRouter } from "@react-router/dev/vite";
|
|
142
97
|
import { defineConfig } from "vite";
|
|
143
|
-
import {
|
|
98
|
+
import { intlayer } from "vite-intlayer";
|
|
144
99
|
import tsconfigPaths from "vite-tsconfig-paths";
|
|
145
100
|
|
|
146
101
|
export default defineConfig({
|
|
147
|
-
plugins: [
|
|
148
|
-
reactRouter(),
|
|
149
|
-
tsconfigPaths(),
|
|
150
|
-
intlayer(),
|
|
151
|
-
intlayerMiddlewarePlugin(),
|
|
152
|
-
],
|
|
102
|
+
plugins: [reactRouter(), tsconfigPaths(), intlayer()],
|
|
153
103
|
});
|
|
154
104
|
```
|
|
155
105
|
|
|
156
|
-
>
|
|
106
|
+
> يُستخدم مكون Vite الإضافي `intlayer()` لدمج Intlayer مع Vite. يضمن بناء ملفات إعلان المحتوى ومراقبتها في وضع التطوير. كما يعرّف متغيرات بيئة Intlayer داخل تطبيق Vite. بالإضافة إلى ذلك، يوفر ألقابًا لتحسين الأداء.
|
|
157
107
|
|
|
158
108
|
### الخطوة 5: إنشاء مكونات التخطيط
|
|
159
109
|
|
|
160
|
-
قم بإعداد
|
|
110
|
+
قم بإعداد التخطيط الجذري والتخطيطات الخاصة بكل لغة:
|
|
161
111
|
|
|
162
|
-
####
|
|
112
|
+
#### التخطيط الجذري
|
|
163
113
|
|
|
164
|
-
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
165
|
-
// src/routes/{-$locale}/route.tsx
|
|
114
|
+
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
166
115
|
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
167
|
-
import { configuration } from "intlayer";
|
|
168
116
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
169
117
|
|
|
170
118
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
@@ -174,10 +122,11 @@ export const Route = createFileRoute("/{-$locale}")({
|
|
|
174
122
|
});
|
|
175
123
|
|
|
176
124
|
function LayoutComponent() {
|
|
125
|
+
const { defaultLocale } = useLocale();
|
|
177
126
|
const { locale } = Route.useParams();
|
|
178
127
|
|
|
179
128
|
return (
|
|
180
|
-
<IntlayerProvider locale={
|
|
129
|
+
<IntlayerProvider locale={defaultLocale}>
|
|
181
130
|
<Outlet />
|
|
182
131
|
</IntlayerProvider>
|
|
183
132
|
);
|
|
@@ -188,7 +137,7 @@ function LayoutComponent() {
|
|
|
188
137
|
|
|
189
138
|
قم بإنشاء وإدارة إعلانات المحتوى الخاصة بك لتخزين الترجمات:
|
|
190
139
|
|
|
191
|
-
```tsx fileName="src/contents/page.content.ts"
|
|
140
|
+
```tsx fileName="src/contents/page.content.ts"
|
|
192
141
|
import type { Dictionary } from "intlayer";
|
|
193
142
|
|
|
194
143
|
import { t } from "intlayer";
|
|
@@ -197,25 +146,29 @@ const appContent = {
|
|
|
197
146
|
content: {
|
|
198
147
|
links: {
|
|
199
148
|
about: t({
|
|
149
|
+
ar: "حول",
|
|
200
150
|
en: "About",
|
|
201
151
|
es: "Acerca de",
|
|
202
152
|
fr: "À propos",
|
|
203
153
|
}),
|
|
204
154
|
home: t({
|
|
205
|
-
|
|
155
|
+
ar: "الرئيسية",
|
|
156
|
+
en: "Home",
|
|
206
157
|
es: "Inicio",
|
|
207
158
|
fr: "Accueil",
|
|
208
159
|
}),
|
|
209
160
|
},
|
|
210
161
|
meta: {
|
|
211
162
|
description: t({
|
|
212
|
-
|
|
163
|
+
ar: "هذا مثال على استخدام Intlayer مع TanStack Router",
|
|
164
|
+
en: "This is an example of using Intlayer with TanStack Router",
|
|
213
165
|
es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
|
|
214
166
|
fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
|
|
215
167
|
}),
|
|
216
168
|
},
|
|
217
169
|
title: t({
|
|
218
|
-
|
|
170
|
+
ar: "مرحبًا بك في Intlayer + TanStack Router",
|
|
171
|
+
en: "Welcome to Intlayer + TanStack Router",
|
|
219
172
|
es: "Bienvenido a Intlayer + TanStack Router",
|
|
220
173
|
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
221
174
|
}),
|
|
@@ -226,69 +179,107 @@ const appContent = {
|
|
|
226
179
|
export default appContent;
|
|
227
180
|
```
|
|
228
181
|
|
|
229
|
-
> يمكن تعريف إعلانات المحتوى الخاصة بك في أي مكان في تطبيقك بمجرد تضمينها في دليل `contentDir` (افتراضيًا، `./app`). ويجب أن
|
|
182
|
+
> يمكن تعريف إعلانات المحتوى الخاصة بك في أي مكان في تطبيقك بمجرد تضمينها في دليل `contentDir` (افتراضيًا، `./app`). ويجب أن تطابق امتداد ملف إعلان المحتوى (افتراضيًا، `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
230
183
|
|
|
231
184
|
> لمزيد من التفاصيل، راجع [توثيق إعلان المحتوى](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/get_started.md).
|
|
232
185
|
|
|
233
|
-
### الخطوة 7: إنشاء مكونات وخطافات
|
|
186
|
+
### الخطوة 7: إنشاء مكونات وخطافات تدعم الواجهة متعددة اللغات
|
|
234
187
|
|
|
235
|
-
|
|
188
|
+
أنشئ مكون `LocalizedLink` للتنقل المدرك للواجهة متعددة اللغات:
|
|
236
189
|
|
|
237
|
-
```tsx fileName="src/components/localized-link.tsx"
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
import { Link, type
|
|
241
|
-
import { getLocalizedUrl } from "intlayer";
|
|
190
|
+
```tsx fileName="src/components/localized-link.tsx"
|
|
191
|
+
import type { FC } from "react";
|
|
192
|
+
|
|
193
|
+
import { Link, type LinkComponentProps } from "@tanstack/react-router";
|
|
242
194
|
import { useLocale } from "react-intlayer";
|
|
243
195
|
|
|
196
|
+
export const LOCALE_ROUTE = "{-$locale}" as const;
|
|
197
|
+
|
|
198
|
+
// الأداة الرئيسية
|
|
199
|
+
export type RemoveLocaleParam<T> = T extends string
|
|
200
|
+
? RemoveLocaleFromString<T>
|
|
201
|
+
: T;
|
|
202
|
+
|
|
203
|
+
export type To = RemoveLocaleParam<LinkComponentProps["to"]>;
|
|
204
|
+
|
|
205
|
+
type CollapseDoubleSlashes<S extends string> =
|
|
206
|
+
S extends `${infer H}//${infer T}` ? CollapseDoubleSlashes<`${H}/${T}`> : S;
|
|
207
|
+
|
|
244
208
|
type LocalizedLinkProps = {
|
|
245
|
-
to
|
|
246
|
-
} & Omit<
|
|
209
|
+
to?: To;
|
|
210
|
+
} & Omit<LinkComponentProps, "to">;
|
|
247
211
|
|
|
248
|
-
|
|
249
|
-
|
|
212
|
+
// المساعدات
|
|
213
|
+
type RemoveAll<
|
|
214
|
+
S extends string,
|
|
215
|
+
Sub extends string,
|
|
216
|
+
> = S extends `${infer H}${Sub}${infer T}` ? RemoveAll<`${H}${T}`, Sub> : S;
|
|
250
217
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
};
|
|
218
|
+
type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
|
|
219
|
+
RemoveAll<S, typeof LOCALE_ROUTE>
|
|
220
|
+
>;
|
|
255
221
|
|
|
256
|
-
|
|
257
|
-
const
|
|
258
|
-
? props.to
|
|
259
|
-
: getLocalizedUrl(props.to, locale);
|
|
222
|
+
export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
|
|
223
|
+
const { locale } = useLocale();
|
|
260
224
|
|
|
261
|
-
return
|
|
262
|
-
|
|
225
|
+
return (
|
|
226
|
+
<Link
|
|
227
|
+
{...props}
|
|
228
|
+
params={{
|
|
229
|
+
locale,
|
|
230
|
+
...(typeof props?.params === "object" ? props?.params : {}),
|
|
231
|
+
}}
|
|
232
|
+
to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
|
|
233
|
+
/>
|
|
234
|
+
);
|
|
235
|
+
};
|
|
263
236
|
```
|
|
264
237
|
|
|
265
|
-
|
|
238
|
+
هذا المكون له هدفان:
|
|
266
239
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
// eslint-disable-next-line no-restricted-imports
|
|
270
|
-
import { NavigateOptions, useNavigate } from "@tanstack/react-router";
|
|
271
|
-
import { getLocalizedUrl } from "intlayer";
|
|
272
|
-
import { useLocale } from "react-intlayer";
|
|
240
|
+
- إزالة بادئة `{-$locale}` غير الضرورية من عنوان URL.
|
|
241
|
+
- حقن معامل اللغة (locale) في عنوان URL لضمان إعادة توجيه المستخدم مباشرة إلى المسار المحلي.
|
|
273
242
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
243
|
+
بعد ذلك يمكننا إنشاء هوك `useLocalizedNavigate` للملاحة البرمجية:
|
|
244
|
+
|
|
245
|
+
```tsx fileName="src/hooks/useLocalizedNavigate.tsx"
|
|
246
|
+
import { useLocale } from "react-intlayer";
|
|
247
|
+
import { useNavigate } from "@tanstack/react-router";
|
|
248
|
+
import { LOCALE_ROUTE } from "@/components/localized-link";
|
|
249
|
+
import type { FileRouteTypes } from "@/routeTree.gen";
|
|
277
250
|
|
|
278
251
|
export const useLocalizedNavigate = () => {
|
|
279
252
|
const navigate = useNavigate();
|
|
253
|
+
|
|
280
254
|
const { locale } = useLocale();
|
|
281
255
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
256
|
+
type StripLocalePrefix<T extends string> = T extends
|
|
257
|
+
| `/${typeof LOCALE_ROUTE}`
|
|
258
|
+
| `/${typeof LOCALE_ROUTE}/`
|
|
259
|
+
? "/"
|
|
260
|
+
: T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
|
|
261
|
+
? `/${Rest}`
|
|
262
|
+
: never;
|
|
263
|
+
|
|
264
|
+
type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
|
|
265
|
+
|
|
266
|
+
interface LocalizedNavigate {
|
|
267
|
+
(to: LocalizedTo): ReturnType<typeof navigate>;
|
|
268
|
+
(
|
|
269
|
+
opts: { to: LocalizedTo } & Record<string, unknown>
|
|
270
|
+
): ReturnType<typeof navigate>;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const localizedNavigate: LocalizedNavigate = (args: any) => {
|
|
274
|
+
if (typeof args === "string") {
|
|
275
|
+
return navigate({ to: `/${LOCALE_ROUTE}${args}`, params: { locale } });
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const { to, ...rest } = args;
|
|
285
279
|
|
|
286
|
-
|
|
287
|
-
const to = isExternal(options.to)
|
|
288
|
-
? options.to
|
|
289
|
-
: getLocalizedUrl(options.to, locale);
|
|
280
|
+
const localedTo = `/${LOCALE_ROUTE}${to}` as any;
|
|
290
281
|
|
|
291
|
-
navigate({
|
|
282
|
+
return navigate({ to: localedTo, params: { locale, ...rest } as any });
|
|
292
283
|
};
|
|
293
284
|
|
|
294
285
|
return localizedNavigate;
|
|
@@ -297,25 +288,11 @@ export const useLocalizedNavigate = () => {
|
|
|
297
288
|
|
|
298
289
|
### الخطوة 8: استخدام Intlayer في صفحاتك
|
|
299
290
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
#### صفحة إعادة التوجيه الجذرية
|
|
303
|
-
|
|
304
|
-
```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
|
|
305
|
-
// src/routes/page.tsx
|
|
306
|
-
import { useLocale } from "intlayer";
|
|
307
|
-
import { Navigate } from "react-router";
|
|
308
|
-
|
|
309
|
-
export default function Page() {
|
|
310
|
-
const { locale } = useLocale();
|
|
311
|
-
|
|
312
|
-
return <Navigate replace to={locale} />;
|
|
313
|
-
}
|
|
314
|
-
```
|
|
291
|
+
قم بالوصول إلى قواميس المحتوى الخاصة بك في جميع أنحاء تطبيقك:
|
|
315
292
|
|
|
316
293
|
#### الصفحة الرئيسية المحلية
|
|
317
294
|
|
|
318
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
295
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
319
296
|
import { createFileRoute } from "@tanstack/react-router";
|
|
320
297
|
import { getIntlayer } from "intlayer";
|
|
321
298
|
import { useIntlayer } from "react-intlayer";
|
|
@@ -344,16 +321,15 @@ function RouteComponent() {
|
|
|
344
321
|
const navigate = useLocalizedNavigate();
|
|
345
322
|
|
|
346
323
|
return (
|
|
347
|
-
<div
|
|
348
|
-
<div
|
|
324
|
+
<div>
|
|
325
|
+
<div>
|
|
349
326
|
{content.title}
|
|
350
327
|
<LocaleSwitcher />
|
|
351
|
-
<div
|
|
352
|
-
<a href="/">الفهرس</a>
|
|
328
|
+
<div>
|
|
353
329
|
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
354
330
|
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
355
331
|
</div>
|
|
356
|
-
<div
|
|
332
|
+
<div>
|
|
357
333
|
<button onClick={() => navigate({ to: "/" })}>
|
|
358
334
|
{content.links.home}
|
|
359
335
|
</button>
|
|
@@ -371,59 +347,67 @@ function RouteComponent() {
|
|
|
371
347
|
|
|
372
348
|
### الخطوة 9: إنشاء مكون لتبديل اللغة
|
|
373
349
|
|
|
374
|
-
|
|
350
|
+
قم بإنشاء مكون يسمح للمستخدمين بتغيير اللغة:
|
|
351
|
+
|
|
352
|
+
```tsx fileName="src/components/locale-switcher.tsx"
|
|
353
|
+
import type { FC } from "react";
|
|
375
354
|
|
|
376
|
-
```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
|
|
377
355
|
import { useLocation } from "@tanstack/react-router";
|
|
378
|
-
import {
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
const {
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
const { availableLocales, locale, setLocale } = useLocale({
|
|
391
|
-
onLocaleChange: (newLocale) => {
|
|
392
|
-
const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
|
|
393
|
-
location.replace(pathWithLocale);
|
|
394
|
-
},
|
|
395
|
-
});
|
|
356
|
+
import { getHTMLTextDir, getLocaleName, getPathWithoutLocale } from "intlayer";
|
|
357
|
+
import { setLocaleCookie, useIntlayer, useLocale } from "react-intlayer";
|
|
358
|
+
|
|
359
|
+
import { LocalizedLink, To } from "./localized-link";
|
|
360
|
+
|
|
361
|
+
export const LocaleSwitcher: FC = () => {
|
|
362
|
+
const { localeSwitcherLabel } = useIntlayer("locale-switcher");
|
|
363
|
+
const { pathname } = useLocation();
|
|
364
|
+
|
|
365
|
+
const { availableLocales, locale } = useLocale();
|
|
366
|
+
|
|
367
|
+
const pathWithoutLocale = getPathWithoutLocale(pathname);
|
|
396
368
|
|
|
397
369
|
return (
|
|
398
|
-
<
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
370
|
+
<ol>
|
|
371
|
+
{availableLocales.map((localeEl) => (
|
|
372
|
+
<li key={localeEl}>
|
|
373
|
+
<LocalizedLink
|
|
374
|
+
aria-current={localeEl === locale ? "page" : undefined}
|
|
375
|
+
aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeEl)}`}
|
|
376
|
+
onClick={() => setLocaleCookie(localeEl)}
|
|
377
|
+
params={{ locale: localeEl }}
|
|
378
|
+
to={pathWithoutLocale as To}
|
|
379
|
+
>
|
|
380
|
+
<span>
|
|
381
|
+
{/* اللغة المحلية - مثل FR */}
|
|
382
|
+
{localeItem}
|
|
383
|
+
</span>
|
|
384
|
+
<span>
|
|
385
|
+
{/* اللغة بلغتها المحلية - مثل Français */}
|
|
386
|
+
{getLocaleName(localeItem, locale)}
|
|
387
|
+
</span>
|
|
388
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
389
|
+
{/* اللغة في اللغة الحالية - مثل Francés مع تعيين اللغة الحالية إلى Locales.SPANISH */}
|
|
390
|
+
{getLocaleName(localeItem)}
|
|
391
|
+
</span>
|
|
392
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
393
|
+
{/* اللغة بالإنجليزية - مثل French */}
|
|
394
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
395
|
+
</span>
|
|
396
|
+
</LocalizedLink>
|
|
397
|
+
</li>
|
|
414
398
|
))}
|
|
415
|
-
</
|
|
399
|
+
</ol>
|
|
416
400
|
);
|
|
417
|
-
}
|
|
401
|
+
};
|
|
418
402
|
```
|
|
419
403
|
|
|
420
|
-
> لمعرفة المزيد عن الخطاف `useLocale`،
|
|
404
|
+
> لمعرفة المزيد عن الخطاف `useLocale`، راجع [التوثيق](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/react-intlayer/useLocale.md).
|
|
421
405
|
|
|
422
406
|
### الخطوة 10: إضافة إدارة خصائص HTML (اختياري)
|
|
423
407
|
|
|
424
|
-
|
|
408
|
+
أنشئ خطافًا لإدارة خصائص lang و dir في HTML:
|
|
425
409
|
|
|
426
|
-
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
410
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
427
411
|
// src/hooks/useI18nHTMLAttributes.tsx
|
|
428
412
|
import { getHTMLTextDir } from "intlayer";
|
|
429
413
|
import { useEffect } from "react";
|
|
@@ -441,9 +425,8 @@ export const useI18nHTMLAttributes = () => {
|
|
|
441
425
|
|
|
442
426
|
ثم استخدمه في مكون الجذر الخاص بك:
|
|
443
427
|
|
|
444
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
428
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
445
429
|
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
446
|
-
import { configuration } from "intlayer";
|
|
447
430
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
448
431
|
|
|
449
432
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // استيراد الخطاف
|
|
@@ -455,55 +438,54 @@ export const Route = createFileRoute("/{-$locale}")({
|
|
|
455
438
|
function LayoutComponent() {
|
|
456
439
|
useI18nHTMLAttributes(); // أضف هذا السطر
|
|
457
440
|
|
|
441
|
+
const { defaultLocale } = useLocale();
|
|
458
442
|
const { locale } = Route.useParams();
|
|
459
443
|
|
|
460
444
|
return (
|
|
461
|
-
<IntlayerProvider locale={locale}>
|
|
445
|
+
<IntlayerProvider locale={locale ?? defaultLocale}>
|
|
462
446
|
<Outlet />
|
|
463
447
|
</IntlayerProvider>
|
|
464
448
|
);
|
|
465
449
|
}
|
|
466
450
|
```
|
|
467
451
|
|
|
468
|
-
|
|
452
|
+
---
|
|
469
453
|
|
|
470
|
-
|
|
454
|
+
### الخطوة 11: إضافة الوسيط (اختياري)
|
|
471
455
|
|
|
472
|
-
|
|
473
|
-
# بناء قواميس Intlayer
|
|
474
|
-
npm run intlayer:build
|
|
456
|
+
يمكنك أيضًا استخدام `intlayerMiddleware` لإضافة التوجيه من جانب الخادم إلى تطبيقك. سيقوم هذا الملحق تلقائيًا بالكشف عن اللغة الحالية بناءً على عنوان URL وتعيين ملف تعريف الارتباط الخاص باللغة المناسبة. إذا لم يتم تحديد لغة، فسيحدد الملحق اللغة الأنسب بناءً على تفضيلات لغة متصفح المستخدم. وإذا لم يتم الكشف عن أي لغة، فسيتم إعادة التوجيه إلى اللغة الافتراضية.
|
|
475
457
|
|
|
476
|
-
|
|
477
|
-
npm run dev
|
|
478
|
-
```
|
|
458
|
+
> لاحظ أنه لاستخدام `intlayerMiddleware` في بيئة الإنتاج، تحتاج إلى نقل حزمة `vite-intlayer` من `devDependencies` إلى `dependencies`.
|
|
479
459
|
|
|
480
|
-
```
|
|
481
|
-
|
|
482
|
-
|
|
460
|
+
```typescript {3,7} fileName="vite.config.ts"
|
|
461
|
+
import { reactRouter } from "@react-router/dev/vite";
|
|
462
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
463
|
+
import { defineConfig } from "vite";
|
|
464
|
+
import { intlayer, intlayerMiddleware } from "vite-intlayer";
|
|
465
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
483
466
|
|
|
484
|
-
|
|
485
|
-
|
|
467
|
+
export default defineConfig({
|
|
468
|
+
plugins: [
|
|
469
|
+
tailwindcss(),
|
|
470
|
+
reactRouter(),
|
|
471
|
+
tsconfigPaths(),
|
|
472
|
+
intlayer(),
|
|
473
|
+
intlayerMiddleware(),
|
|
474
|
+
],
|
|
475
|
+
});
|
|
486
476
|
```
|
|
487
477
|
|
|
488
|
-
|
|
489
|
-
# بناء قواميس Intlayer
|
|
490
|
-
yarn intlayer:build
|
|
491
|
-
|
|
492
|
-
# بدء خادم التطوير
|
|
493
|
-
yarn dev
|
|
494
|
-
```
|
|
478
|
+
---
|
|
495
479
|
|
|
496
480
|
### الخطوة 12: تكوين TypeScript (اختياري)
|
|
497
481
|
|
|
498
|
-
يستخدم Intlayer
|
|
482
|
+
يستخدم Intlayer توسيع الوحدات (module augmentation) للاستفادة من TypeScript وجعل قاعدة الشيفرة الخاصة بك أقوى.
|
|
499
483
|
|
|
500
484
|
تأكد من أن تكوين TypeScript الخاص بك يتضمن الأنواع التي تم إنشاؤها تلقائيًا:
|
|
501
485
|
|
|
502
486
|
```json5 fileName="tsconfig.json"
|
|
503
487
|
{
|
|
504
|
-
|
|
505
|
-
// ... تكوينات TypeScript الحالية الخاصة بك
|
|
506
|
-
},
|
|
488
|
+
// ... التكوينات الحالية الخاصة بك
|
|
507
489
|
include: [
|
|
508
490
|
// ... الملفات التي تشملها حاليًا
|
|
509
491
|
".intlayer/**/*.ts", // تضمين الأنواع التي تم إنشاؤها تلقائيًا
|
|
@@ -511,11 +493,13 @@ yarn dev
|
|
|
511
493
|
}
|
|
512
494
|
```
|
|
513
495
|
|
|
496
|
+
---
|
|
497
|
+
|
|
514
498
|
### تكوين Git
|
|
515
499
|
|
|
516
|
-
يوصى بتجاهل الملفات التي تم إنشاؤها بواسطة Intlayer. هذا يسمح لك بتجنب
|
|
500
|
+
يوصى بتجاهل الملفات التي تم إنشاؤها بواسطة Intlayer. هذا يسمح لك بتجنب الالتزام بها في مستودع Git الخاص بك.
|
|
517
501
|
|
|
518
|
-
|
|
502
|
+
لتحقيق ذلك، يمكنك إضافة التعليمات التالية إلى ملف `.gitignore` الخاص بك:
|
|
519
503
|
|
|
520
504
|
```plaintext fileName=".gitignore"
|
|
521
505
|
# تجاهل الملفات التي تم إنشاؤها بواسطة Intlayer
|
|
@@ -524,64 +508,6 @@ yarn dev
|
|
|
524
508
|
|
|
525
509
|
---
|
|
526
510
|
|
|
527
|
-
### الخطوة 13: إنشاء إعادة توجيه (اختياري)
|
|
528
|
-
|
|
529
|
-
```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
|
|
530
|
-
function LayoutComponent() {
|
|
531
|
-
useI18nHTMLAttributes();
|
|
532
|
-
|
|
533
|
-
const { locale } = Route.useParams();
|
|
534
|
-
const { locale: selectedLocale } = useLocale();
|
|
535
|
-
const { defaultLocale } = configuration.internationalization;
|
|
536
|
-
const { prefixDefault } = configuration.middleware;
|
|
537
|
-
|
|
538
|
-
// إعادة التوجيه إلى اللغة الافتراضية إذا لم تكن هناك لغة في عنوان URL عندما تكون prefixDefault صحيحة
|
|
539
|
-
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
540
|
-
return <Navigate replace to={defaultLocale} />;
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
// إعادة التوجيه إلى اللغة المختارة إذا كانت اللغة في عنوان URL لا تطابق اللغة المختارة
|
|
544
|
-
if (selectedLocale !== defaultLocale && !locale) {
|
|
545
|
-
return <Navigate replace to={selectedLocale} />;
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
return (
|
|
549
|
-
<IntlayerProvider locale={locale}>
|
|
550
|
-
<Outlet />
|
|
551
|
-
</IntlayerProvider>
|
|
552
|
-
);
|
|
553
|
-
}
|
|
554
|
-
```
|
|
555
|
-
|
|
556
|
-
## النشر في بيئة الإنتاج
|
|
557
|
-
|
|
558
|
-
عند نشر تطبيقك:
|
|
559
|
-
|
|
560
|
-
1. **قم ببناء تطبيقك:**
|
|
561
|
-
|
|
562
|
-
```bash
|
|
563
|
-
npm run build
|
|
564
|
-
```
|
|
565
|
-
|
|
566
|
-
2. **قم ببناء قواميس Intlayer:**
|
|
567
|
-
|
|
568
|
-
```bash
|
|
569
|
-
npm run intlayer:build
|
|
570
|
-
```
|
|
571
|
-
|
|
572
|
-
3. **انقل `vite-intlayer` إلى التبعيات** إذا كنت تستخدم الوسيط (middleware) في الإنتاج:
|
|
573
|
-
```bash
|
|
574
|
-
npm install vite-intlayer --save
|
|
575
|
-
```
|
|
576
|
-
|
|
577
|
-
سيصبح تطبيقك الآن يدعم:
|
|
578
|
-
|
|
579
|
-
- **هيكلية URL**: `/en`، `/en/about`، `/tr`، `/tr/about`
|
|
580
|
-
- **الكشف التلقائي عن اللغة** بناءً على تفضيلات المتصفح
|
|
581
|
-
- **التوجيه المدرك للغة** باستخدام Tanstack Start
|
|
582
|
-
- **دعم TypeScript** مع أنواع مولدة تلقائيًا
|
|
583
|
-
- **التصيير على جانب الخادم** مع التعامل الصحيح مع اللغة
|
|
584
|
-
|
|
585
511
|
## امتداد VS Code
|
|
586
512
|
|
|
587
513
|
لتحسين تجربة التطوير الخاصة بك مع Intlayer، يمكنك تثبيت **امتداد Intlayer الرسمي لـ VS Code**.
|
|
@@ -593,15 +519,15 @@ function LayoutComponent() {
|
|
|
593
519
|
- **الإكمال التلقائي** لمفاتيح الترجمة.
|
|
594
520
|
- **الكشف الفوري عن الأخطاء** للترجمات المفقودة.
|
|
595
521
|
- **معاينات داخلية** للمحتوى المترجم.
|
|
596
|
-
- **إجراءات سريعة** لإنشاء
|
|
522
|
+
- **إجراءات سريعة** لإنشاء الترجمات وتحديثها بسهولة.
|
|
597
523
|
|
|
598
|
-
لمزيد من التفاصيل حول كيفية استخدام
|
|
524
|
+
لمزيد من التفاصيل حول كيفية استخدام الإضافة، راجع [توثيق إضافة Intlayer لـ VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
599
525
|
|
|
600
526
|
---
|
|
601
527
|
|
|
602
528
|
## التقدم أكثر
|
|
603
529
|
|
|
604
|
-
|
|
530
|
+
للتقدم أكثر، يمكنك تنفيذ [المحرر المرئي](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_visual_editor.md) أو إخراج محتواك باستخدام [نظام إدارة المحتوى (CMS)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_CMS.md).
|
|
605
531
|
|
|
606
532
|
---
|
|
607
533
|
|
|
@@ -610,11 +536,11 @@ function LayoutComponent() {
|
|
|
610
536
|
- [توثيق Intlayer](https://intlayer.org)
|
|
611
537
|
- [توثيق Tanstack Start](https://reactrouter.com/)
|
|
612
538
|
- [هوك useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/react-intlayer/useIntlayer.md)
|
|
613
|
-
- [
|
|
539
|
+
- [خطاف useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/react-intlayer/useLocale.md)
|
|
614
540
|
- [إعلان المحتوى](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/get_started.md)
|
|
615
541
|
- [التكوين](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/configuration.md)
|
|
616
542
|
|
|
617
|
-
يوفر هذا الدليل الشامل كل ما تحتاجه لدمج Intlayer مع Tanstack Start لتطبيق
|
|
543
|
+
يوفر هذا الدليل الشامل كل ما تحتاجه لدمج Intlayer مع Tanstack Start لتطبيق دولي بالكامل مع توجيه واعٍ للغة ودعم TypeScript.
|
|
618
544
|
|
|
619
545
|
## تاريخ الوثيقة
|
|
620
546
|
|