@intlayer/docs 7.5.11 → 7.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.
Files changed (227) hide show
  1. package/blog/ar/intlayer_with_i18next.md +0 -2
  2. package/blog/ar/intlayer_with_next-i18next.md +0 -2
  3. package/blog/ar/intlayer_with_react-i18next.md +0 -2
  4. package/blog/de/intlayer_with_i18next.md +0 -45
  5. package/blog/de/intlayer_with_next-i18next.md +0 -46
  6. package/blog/de/intlayer_with_react-i18next.md +0 -2
  7. package/blog/en/intlayer_with_i18next.md +0 -46
  8. package/blog/en/intlayer_with_next-i18next.md +0 -48
  9. package/blog/en/intlayer_with_next-intl.md +0 -44
  10. package/blog/en/intlayer_with_react-i18next.md +0 -44
  11. package/blog/en/intlayer_with_react-intl.md +0 -42
  12. package/blog/en/intlayer_with_vue-i18n.md +0 -44
  13. package/blog/en-GB/intlayer_with_i18next.md +0 -45
  14. package/blog/en-GB/intlayer_with_next-i18next.md +0 -47
  15. package/blog/en-GB/intlayer_with_next-intl.md +0 -42
  16. package/blog/en-GB/intlayer_with_react-i18next.md +0 -43
  17. package/blog/en-GB/intlayer_with_react-intl.md +0 -42
  18. package/blog/en-GB/intlayer_with_vue-i18n.md +0 -46
  19. package/blog/es/intlayer_with_i18next.md +0 -45
  20. package/blog/es/intlayer_with_next-i18next.md +0 -47
  21. package/blog/es/intlayer_with_next-intl.md +0 -42
  22. package/blog/es/intlayer_with_react-i18next.md +0 -43
  23. package/blog/es/intlayer_with_react-intl.md +0 -42
  24. package/blog/es/intlayer_with_vue-i18n.md +0 -46
  25. package/blog/fr/intlayer_with_i18next.md +0 -45
  26. package/blog/fr/intlayer_with_next-i18next.md +0 -47
  27. package/blog/fr/intlayer_with_next-intl.md +0 -42
  28. package/blog/fr/intlayer_with_react-i18next.md +0 -43
  29. package/blog/fr/intlayer_with_react-intl.md +0 -42
  30. package/blog/fr/intlayer_with_vue-i18n.md +0 -46
  31. package/blog/hi/intlayer_with_i18next.md +0 -2
  32. package/blog/hi/intlayer_with_next-i18next.md +0 -2
  33. package/blog/hi/intlayer_with_react-i18next.md +0 -2
  34. package/blog/id/intlayer_with_i18next.md +0 -2
  35. package/blog/id/intlayer_with_next-i18next.md +0 -2
  36. package/blog/id/intlayer_with_react-i18next.md +0 -2
  37. package/blog/it/intlayer_with_i18next.md +0 -2
  38. package/blog/it/intlayer_with_next-i18next.md +0 -2
  39. package/blog/it/intlayer_with_react-i18next.md +0 -2
  40. package/blog/ja/intlayer_with_i18next.md +0 -45
  41. package/blog/ja/intlayer_with_next-i18next.md +0 -46
  42. package/blog/ja/intlayer_with_next-intl.md +0 -42
  43. package/blog/ja/intlayer_with_react-i18next.md +0 -42
  44. package/blog/ja/intlayer_with_react-intl.md +0 -42
  45. package/blog/ja/intlayer_with_vue-i18n.md +0 -46
  46. package/blog/ko/intlayer_with_i18next.md +0 -2
  47. package/blog/ko/intlayer_with_next-i18next.md +0 -2
  48. package/blog/ko/intlayer_with_react-i18next.md +0 -1
  49. package/blog/pl/intlayer_with_i18next.md +0 -45
  50. package/blog/pl/intlayer_with_next-i18next.md +0 -46
  51. package/blog/pl/intlayer_with_next-intl.md +0 -42
  52. package/blog/pl/intlayer_with_react-i18next.md +0 -43
  53. package/blog/pl/intlayer_with_react-intl.md +0 -42
  54. package/blog/pl/intlayer_with_vue-i18n.md +0 -46
  55. package/blog/pt/intlayer_with_i18next.md +0 -2
  56. package/blog/pt/intlayer_with_next-i18next.md +0 -2
  57. package/blog/pt/intlayer_with_react-i18next.md +0 -2
  58. package/blog/ru/intlayer_with_i18next.md +0 -45
  59. package/blog/ru/intlayer_with_next-i18next.md +0 -47
  60. package/blog/ru/intlayer_with_next-intl.md +0 -42
  61. package/blog/ru/intlayer_with_react-i18next.md +0 -43
  62. package/blog/ru/intlayer_with_react-intl.md +0 -42
  63. package/blog/ru/intlayer_with_vue-i18n.md +0 -46
  64. package/blog/tr/intlayer_with_i18next.md +0 -2
  65. package/blog/tr/intlayer_with_next-i18next.md +0 -1
  66. package/blog/tr/intlayer_with_react-i18next.md +0 -2
  67. package/blog/vi/intlayer_with_i18next.md +0 -2
  68. package/blog/vi/intlayer_with_next-i18next.md +0 -2
  69. package/blog/vi/intlayer_with_react-i18next.md +0 -2
  70. package/blog/zh/intlayer_with_i18next.md +0 -2
  71. package/blog/zh/intlayer_with_next-i18next.md +0 -2
  72. package/blog/zh/intlayer_with_react-i18next.md +0 -2
  73. package/blog/zh/intlayer_with_vue-i18n.md +0 -46
  74. package/dist/cjs/generated/blog.entry.cjs +58 -29
  75. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  76. package/dist/cjs/generated/docs.entry.cjs +218 -99
  77. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  78. package/dist/cjs/generated/frequentQuestions.entry.cjs +30 -15
  79. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  80. package/dist/cjs/generated/legal.entry.cjs +4 -2
  81. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  82. package/dist/esm/generated/blog.entry.mjs +58 -29
  83. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  84. package/dist/esm/generated/docs.entry.mjs +218 -99
  85. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  86. package/dist/esm/generated/frequentQuestions.entry.mjs +30 -15
  87. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  88. package/dist/esm/generated/legal.entry.mjs +4 -2
  89. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  90. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  91. package/dist/types/generated/docs.entry.d.ts +1 -0
  92. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  93. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  94. package/dist/types/generated/legal.entry.d.ts.map +1 -1
  95. package/docs/ar/intlayer_with_next-i18next.md +0 -1
  96. package/docs/ar/intlayer_with_nextjs_14.md +28 -0
  97. package/docs/ar/intlayer_with_nextjs_15.md +28 -0
  98. package/docs/ar/intlayer_with_nextjs_16.md +28 -0
  99. package/docs/ar/intlayer_with_nextjs_no_locale_path.md +1159 -0
  100. package/docs/ar/plugins/sync-json.md +6 -2
  101. package/docs/de/intlayer_with_next-i18next.md +0 -1
  102. package/docs/de/intlayer_with_nextjs_14.md +28 -0
  103. package/docs/de/intlayer_with_nextjs_15.md +28 -0
  104. package/docs/de/intlayer_with_nextjs_16.md +28 -0
  105. package/docs/de/intlayer_with_nextjs_no_locale_path.md +1152 -0
  106. package/docs/de/plugins/sync-json.md +6 -2
  107. package/docs/en/intlayer_with_next-i18next.md +0 -1
  108. package/docs/en/intlayer_with_nextjs_14.md +28 -0
  109. package/docs/en/intlayer_with_nextjs_15.md +28 -0
  110. package/docs/en/intlayer_with_nextjs_16.md +31 -1
  111. package/docs/en/intlayer_with_nextjs_no_locale_path.md +1132 -0
  112. package/docs/en/plugins/sync-json.md +6 -2
  113. package/docs/en-GB/intlayer_with_next-i18next.md +0 -1
  114. package/docs/en-GB/intlayer_with_nextjs_14.md +28 -0
  115. package/docs/en-GB/intlayer_with_nextjs_15.md +28 -0
  116. package/docs/en-GB/intlayer_with_nextjs_16.md +28 -0
  117. package/docs/en-GB/intlayer_with_nextjs_no_locale_path.md +1154 -0
  118. package/docs/en-GB/plugins/sync-json.md +6 -2
  119. package/docs/es/intlayer_with_next-i18next.md +0 -1
  120. package/docs/es/intlayer_with_nextjs_14.md +28 -0
  121. package/docs/es/intlayer_with_nextjs_15.md +28 -0
  122. package/docs/es/intlayer_with_nextjs_16.md +28 -0
  123. package/docs/es/intlayer_with_nextjs_no_locale_path.md +1143 -0
  124. package/docs/es/plugins/sync-json.md +6 -2
  125. package/docs/fr/intlayer_with_next-i18next.md +0 -1
  126. package/docs/fr/intlayer_with_nextjs_14.md +28 -0
  127. package/docs/fr/intlayer_with_nextjs_15.md +28 -0
  128. package/docs/fr/intlayer_with_nextjs_16.md +28 -0
  129. package/docs/fr/intlayer_with_nextjs_no_locale_path.md +1174 -0
  130. package/docs/fr/plugins/sync-json.md +9 -5
  131. package/docs/hi/intlayer_with_next-i18next.md +0 -1
  132. package/docs/hi/intlayer_with_nextjs_14.md +28 -0
  133. package/docs/hi/intlayer_with_nextjs_15.md +28 -0
  134. package/docs/hi/intlayer_with_nextjs_16.md +28 -0
  135. package/docs/hi/intlayer_with_nextjs_no_locale_path.md +1151 -0
  136. package/docs/hi/plugins/sync-json.md +6 -2
  137. package/docs/id/intlayer_with_next-i18next.md +0 -1
  138. package/docs/id/intlayer_with_nextjs_14.md +28 -0
  139. package/docs/id/intlayer_with_nextjs_15.md +28 -0
  140. package/docs/id/intlayer_with_nextjs_16.md +28 -0
  141. package/docs/id/intlayer_with_nextjs_no_locale_path.md +1154 -0
  142. package/docs/id/plugins/sync-json.md +6 -2
  143. package/docs/it/intlayer_with_next-i18next.md +0 -1
  144. package/docs/it/intlayer_with_nextjs_14.md +28 -0
  145. package/docs/it/intlayer_with_nextjs_15.md +28 -0
  146. package/docs/it/intlayer_with_nextjs_16.md +28 -0
  147. package/docs/it/intlayer_with_nextjs_no_locale_path.md +1148 -0
  148. package/docs/it/plugins/sync-json.md +6 -2
  149. package/docs/ja/intlayer_with_next-i18next.md +0 -1
  150. package/docs/ja/intlayer_with_nextjs_14.md +28 -0
  151. package/docs/ja/intlayer_with_nextjs_15.md +28 -0
  152. package/docs/ja/intlayer_with_nextjs_16.md +28 -0
  153. package/docs/ja/intlayer_with_nextjs_no_locale_path.md +1222 -0
  154. package/docs/ja/plugins/sync-json.md +6 -2
  155. package/docs/ko/intlayer_with_next-i18next.md +0 -1
  156. package/docs/ko/intlayer_with_nextjs_14.md +28 -0
  157. package/docs/ko/intlayer_with_nextjs_15.md +28 -0
  158. package/docs/ko/intlayer_with_nextjs_16.md +28 -0
  159. package/docs/ko/intlayer_with_nextjs_no_locale_path.md +1205 -0
  160. package/docs/ko/plugins/sync-json.md +6 -2
  161. package/docs/pl/intlayer_with_next-i18next.md +0 -1
  162. package/docs/pl/intlayer_with_nextjs_14.md +28 -0
  163. package/docs/pl/intlayer_with_nextjs_15.md +28 -0
  164. package/docs/pl/intlayer_with_nextjs_16.md +28 -0
  165. package/docs/pl/intlayer_with_nextjs_no_locale_path.md +1149 -0
  166. package/docs/pl/plugins/sync-json.md +6 -2
  167. package/docs/pt/intlayer_with_next-i18next.md +0 -1
  168. package/docs/pt/intlayer_with_nextjs_14.md +28 -0
  169. package/docs/pt/intlayer_with_nextjs_15.md +28 -0
  170. package/docs/pt/intlayer_with_nextjs_16.md +28 -0
  171. package/docs/pt/intlayer_with_nextjs_no_locale_path.md +1152 -0
  172. package/docs/pt/plugins/sync-json.md +6 -2
  173. package/docs/ru/intlayer_with_next-i18next.md +0 -1
  174. package/docs/ru/intlayer_with_nextjs_14.md +28 -0
  175. package/docs/ru/intlayer_with_nextjs_15.md +28 -0
  176. package/docs/ru/intlayer_with_nextjs_16.md +28 -0
  177. package/docs/ru/intlayer_with_nextjs_no_locale_path.md +1204 -0
  178. package/docs/ru/plugins/sync-json.md +6 -2
  179. package/docs/tr/intlayer_with_next-i18next.md +0 -1
  180. package/docs/tr/intlayer_with_nextjs_14.md +28 -0
  181. package/docs/tr/intlayer_with_nextjs_15.md +28 -0
  182. package/docs/tr/intlayer_with_nextjs_16.md +28 -0
  183. package/docs/tr/intlayer_with_nextjs_no_locale_path.md +1159 -0
  184. package/docs/tr/plugins/sync-json.md +6 -2
  185. package/docs/uk/compiler.md +133 -0
  186. package/docs/uk/component_i18n.md +194 -0
  187. package/docs/uk/intlayer_with_nextjs_14.md +1646 -0
  188. package/docs/uk/intlayer_with_nextjs_15.md +1910 -0
  189. package/docs/uk/intlayer_with_nextjs_16.md +1763 -0
  190. package/docs/uk/intlayer_with_nextjs_no_locale_path.md +1159 -0
  191. package/docs/uk/intlayer_with_react_native+expo.md +715 -0
  192. package/docs/uk/packages/intlayer/getConfiguration.md +145 -0
  193. package/docs/uk/vs_code_extension.md +133 -0
  194. package/docs/vi/intlayer_with_next-i18next.md +0 -1
  195. package/docs/vi/intlayer_with_nextjs_14.md +28 -0
  196. package/docs/vi/intlayer_with_nextjs_15.md +28 -0
  197. package/docs/vi/intlayer_with_nextjs_16.md +28 -0
  198. package/docs/vi/intlayer_with_nextjs_no_locale_path.md +1151 -0
  199. package/docs/vi/plugins/sync-json.md +6 -2
  200. package/docs/zh/intlayer_with_next-i18next.md +0 -1
  201. package/docs/zh/intlayer_with_nextjs_14.md +28 -0
  202. package/docs/zh/intlayer_with_nextjs_15.md +28 -0
  203. package/docs/zh/intlayer_with_nextjs_16.md +28 -0
  204. package/docs/zh/intlayer_with_nextjs_no_locale_path.md +1206 -0
  205. package/docs/zh/plugins/sync-json.md +9 -5
  206. package/frequent_questions/ar/SSR_Next_no_[locale].md +1 -1
  207. package/frequent_questions/de/SSR_Next_no_[locale].md +1 -1
  208. package/frequent_questions/en/SSR_Next_no_[locale].md +1 -1
  209. package/frequent_questions/en-GB/SSR_Next_no_[locale].md +1 -1
  210. package/frequent_questions/es/SSR_Next_no_[locale].md +1 -1
  211. package/frequent_questions/fr/SSR_Next_no_[locale].md +1 -1
  212. package/frequent_questions/hi/SSR_Next_no_[locale].md +1 -1
  213. package/frequent_questions/id/SSR_Next_no_[locale].md +1 -1
  214. package/frequent_questions/it/SSR_Next_no_[locale].md +1 -1
  215. package/frequent_questions/ja/SSR_Next_no_[locale].md +1 -1
  216. package/frequent_questions/ko/SSR_Next_no_[locale].md +1 -1
  217. package/frequent_questions/pl/SSR_Next_no_[locale].md +1 -1
  218. package/frequent_questions/pt/SSR_Next_no_[locale].md +1 -1
  219. package/frequent_questions/ru/SSR_Next_no_[locale].md +1 -1
  220. package/frequent_questions/tr/SSR_Next_no_[locale].md +1 -1
  221. package/frequent_questions/vi/SSR_Next_no_[locale].md +1 -1
  222. package/frequent_questions/zh/SSR_Next_no_[locale].md +1 -1
  223. package/package.json +6 -6
  224. package/src/generated/blog.entry.ts +29 -0
  225. package/src/generated/docs.entry.ts +119 -0
  226. package/src/generated/frequentQuestions.entry.ts +15 -0
  227. package/src/generated/legal.entry.ts +2 -0
@@ -0,0 +1,1159 @@
1
+ ---
2
+ createdAt: 2026-01-10
3
+ updatedAt: 2026-01-10
4
+ title: كيفية ترجمة تطبيق Next.js 16 الخاص بك (بدون [locale] في مسار الصفحة) – دليل i18n 2026
5
+ description: اكتشف كيفية جعل موقع Next.js 16 متعدد اللغات بدون [locale] في مسار الصفحة. اتبع الوثائق لعمل تدويل (i18n) وترجمته.
6
+ keywords:
7
+ - التدويل
8
+ - الوثائق
9
+ - Intlayer
10
+ - Next.js 16
11
+ - JavaScript
12
+ - React
13
+ slugs:
14
+ - doc
15
+ - environment
16
+ - nextjs
17
+ - no-locale-path
18
+ applicationTemplate: https://github.com/aymericzip/intlayer-next-no-lolale-path-template
19
+ youtubeVideo: https://www.youtube.com/watch?v=e_PPG7PTqGU
20
+ history:
21
+ - version: 1.0.0
22
+ date: 2026-01-10
23
+ changes: الإصدار الأولي
24
+ ---
25
+
26
+ # ترجمة موقعك Next.js 16 (بدون [locale] في مسار الصفحة) باستخدام Intlayer | التدويل (i18n)
27
+
28
+ <Tab defaultTab="video">
29
+ <TabItem label="فيديو" value="video">
30
+
31
+ <iframe title="أفضل حل للتدويل (i18n) لـ Next.js؟ اكتشف Intlayer" class="m-auto aspect-16/9 w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/e_PPG7PTqGU?autoplay=0&amp;origin=http://intlayer.org&amp;controls=0&amp;rel=1"/>
32
+
33
+ </TabItem>
34
+ <TabItem label="كود" value="code">
35
+
36
+ <iframe
37
+ src="https://stackblitz.com/github/aymericzip/intlayer-next-16-no-locale-path-template?embed=1&ctl=1&file=intlayer.config.ts"
38
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
39
+ title="عرض تجريبي على CodeSandbox - كيفية تدويل تطبيقك باستخدام Intlayer"
40
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
41
+ loading="lazy"
42
+ />
43
+
44
+ </TabItem>
45
+ </Tab>
46
+
47
+ اطّلع على [قالب التطبيق](https://github.com/aymericzip/intlayer-next-no-lolale-path-template) على GitHub.
48
+
49
+ ## جدول المحتويات
50
+
51
+ <TOC/>
52
+
53
+ ## ما هو Intlayer؟
54
+
55
+ **Intlayer** هي مكتبة مبتكرة ومفتوحة المصدر للتدويل (i18n) مصممة لتبسيط دعم متعدد اللغات في تطبيقات الويب الحديثة. يتكامل **Intlayer** بسلاسة مع إطار **Next.js 16** الأحدث، بما في ذلك **App Router** القوي. وهي مُحسّنة للعمل مع **Server Components** من أجل عرض فعال ومتوافقة تمامًا مع [**Turbopack**](https://nextjs.org/docs/architecture/turbopack).
56
+
57
+ مع Intlayer، يمكنك:
58
+
59
+ - **إدارة الترجمات بسهولة** باستخدام قواميس تصريحية على مستوى المكوّن.
60
+ - **توطين البيانات الوصفية بشكل ديناميكي**، والمسارات، والمحتوى.
61
+ - **الوصول إلى الترجمات في مكوّنات جانب العميل وجانب الخادم على حد سواء**.
62
+ - **ضمان دعم TypeScript** بأنواع مُولّدة تلقائيًا، مما يحسّن الإكمال التلقائي واكتشاف الأخطاء.
63
+ /// **الاستفادة من ميزات متقدمة** مثل الكشف الديناميكي عن اللغة وتبديلها.
64
+
65
+ > يتوافق Intlayer مع Next.js 12 و13 و14 و16. إذا كنت تستخدم Next.js Page Router، يمكنك الاطلاع على هذا [الدليل](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_with_nextjs_page_router.md). بالنسبة لـ Next.js 12 و13 و14 مع App Router، اطلع على هذا [الدليل](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_with_nextjs_14.md).
66
+
67
+ ---
68
+
69
+ ## دليل خطوة بخطوة لإعداد Intlayer في تطبيق Next.js
70
+
71
+ ### الخطوة 1: تثبيت التبعيات
72
+
73
+ قم بتثبيت الحزم اللازمة باستخدام npm:
74
+
75
+ ```bash packageManager="npm"
76
+ npm install intlayer next-intlayer
77
+ npx intlayer init
78
+ ```
79
+
80
+ ```bash packageManager="pnpm"
81
+ pnpm add intlayer next-intlayer
82
+ pnpm intlayer init
83
+ ```
84
+
85
+ ```bash packageManager="yarn"
86
+ yarn add intlayer next-intlayer
87
+ yarn intlayer init
88
+ ```
89
+
90
+ ```bash packageManager="bun"
91
+ bun add intlayer next-intlayer
92
+ bunx intlayer init
93
+ ```
94
+
95
+ - **intlayer**
96
+
97
+ الحزمة الأساسية التي توفّر أدوات التعريب لإدارة التهيئة، والترجمة، و[إعلان المحتوى](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/content_file.md)، والـتحويل البرمجي (transpilation)، و[أوامر CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/cli/index.md).
98
+
99
+ - **next-intlayer**
100
+
101
+ الحزمة التي تدمج Intlayer مع Next.js. توفر مزودات السياق (context providers) والـ hooks لدعم التدويل في Next.js. بالإضافة إلى ذلك، تتضمن مكون Next.js الإضافي (plugin) لربط Intlayer مع [Webpack](https://webpack.js.org/) أو [Turbopack](https://nextjs.org/docs/app/api-reference/turbopack)، وكذلك بروكسي لاكتشاف لغة المستخدم المفضلة، وإدارة الكوكيز، ومعالجة إعادة توجيه URL.
102
+
103
+ ### الخطوة 2: تكوين مشروعك
104
+
105
+ فيما يلي البنية النهائية التي سننشئها:
106
+
107
+ ```bash
108
+ .
109
+ ├── src
110
+ │ ├── app
111
+ │ │ ├── layout.tsx
112
+ │ │ ├── page.content.ts
113
+ │ │ └── page.tsx
114
+ │ ├── components
115
+ │ │ ├── clientComponentExample
116
+ │ │ │ ├── client-component-example.content.ts
117
+ │ │ │ └── ClientComponentExample.tsx
118
+ │ │ ├── localeSwitcher
119
+ │ │ │ ├── localeSwitcher.content.ts
120
+ │ │ │ └── LocaleSwitcher.tsx
121
+ │ │ └── serverComponentExample
122
+ │ │ ├── server-component-example.content.ts
123
+ │ │ └── ServerComponentExample.tsx
124
+ │ └── proxy.ts
125
+ ├── intlayer.config.ts
126
+ ├── next.config.ts
127
+ ├── package.json
128
+ └── tsconfig.json
129
+ ```
130
+
131
+ > إذا كنت لا تريد توجيه المسارات حسب اللغة، يمكن استخدام intlayer كمزود (provider) أو hook بسيط. راجع [هذا الدليل](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_with_nextjs_no_locale_path.md) لمزيد من التفاصيل.
132
+
133
+ أنشئ ملف تكوين لتحديد لغات تطبيقك:
134
+
135
+ ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
136
+ import { Locales, type IntlayerConfig } from "intlayer";
137
+
138
+ const config: IntlayerConfig = {
139
+ internationalization: {
140
+ locales: [
141
+ Locales.ENGLISH,
142
+ Locales.FRENCH,
143
+ Locales.SPANISH,
144
+ // بقية اللغات الخاصة بك
145
+ ],
146
+ defaultLocale: Locales.ENGLISH,
147
+ },
148
+ routing: {
149
+ mode: "search-params", // أو `no-prefix` - مفيد لاكتشاف الوسيط (middleware)
150
+ },
151
+ };
152
+
153
+ export default config;
154
+ ```
155
+
156
+ ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
157
+ import { Locales } from "intlayer";
158
+
159
+ /** @type {import('intlayer').IntlayerConfig} */
160
+ const config = {
161
+ internationalization: {
162
+ locales: [
163
+ Locales.ENGLISH,
164
+ Locales.FRENCH,
165
+ Locales.SPANISH,
166
+ // بقية اللغات الخاصة بك
167
+ ],
168
+ defaultLocale: Locales.ENGLISH,
169
+ },
170
+ routing: {
171
+ mode: "search-params", // أو `no-prefix` - مفيد لاكتشاف الوسيط (middleware)
172
+ },
173
+ };
174
+
175
+ export default config;
176
+ ```
177
+
178
+ ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
179
+ const { Locales } = require("intlayer");
180
+
181
+ /** @type {import('intlayer').IntlayerConfig} */
182
+ const config = {
183
+ internationalization: {
184
+ locales: [
185
+ Locales.ENGLISH,
186
+ Locales.FRENCH,
187
+ Locales.SPANISH,
188
+ // لغاتك الأخرى
189
+ ],
190
+ defaultLocale: Locales.ENGLISH,
191
+ },
192
+ routing: {
193
+ mode: "search-params", // أو `no-prefix` - مفيد لاكتشاف middleware
194
+ },
195
+ };
196
+
197
+ module.exports = config;
198
+ ```
199
+
200
+ > من خلال ملف التكوين هذا، يمكنك إعداد عناوين URL محلية، وإعادة توجيه البروكسي، وأسماء ملفات تعريف الارتباط، وموقع وامتداد تعريفات المحتوى الخاصة بك، وتعطيل سجلات Intlayer في وحدة التحكم، والمزيد. لقائمة كاملة بالمعلمات المتاحة، راجع [توثيق التكوين](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/configuration.md).
201
+
202
+ ### الخطوة 3: دمج Intlayer في تكوين Next.js الخاص بك
203
+
204
+ قم بتكوين إعداد Next.js الخاص بك لاستخدام Intlayer:
205
+
206
+ ```typescript fileName="next.config.ts" codeFormat="typescript"
207
+ import type { NextConfig } from "next";
208
+ import { withIntlayer } from "next-intlayer/server";
209
+
210
+ const nextConfig: NextConfig = {
211
+ /* خيارات التكوين هنا */
212
+ };
213
+
214
+ export default withIntlayer(nextConfig);
215
+ ```
216
+
217
+ ```typescript fileName="next.config.mjs" codeFormat="esm"
218
+ import { withIntlayer } from "next-intlayer/server";
219
+
220
+ /** @type {import('next').NextConfig} */
221
+ // نوع التكوين: NextConfig
222
+ const nextConfig = {
223
+ /* خيارات التهيئة هنا */
224
+ };
225
+
226
+ export default withIntlayer(nextConfig);
227
+ ```
228
+
229
+ ```typescript fileName="next.config.cjs" codeFormat="commonjs"
230
+ const { withIntlayer } = require("next-intlayer/server");
231
+
232
+ /** @type {import('next').NextConfig} */
233
+ // نوع التكوين: NextConfig
234
+ const nextConfig = {
235
+ /* خيارات التهيئة هنا */
236
+ };
237
+
238
+ module.exports = withIntlayer(nextConfig);
239
+ ```
240
+
241
+ > يُستخدم مكوّن Next.js الإضافي `withIntlayer()` لدمج Intlayer مع Next.js. يضمن بناء ملفات إعلان المحتوى ويقوم بمراقبتها في وضع التطوير. يعرّف متغيرات بيئة Intlayer داخل بيئات [Webpack](https://webpack.js.org/) أو [Turbopack](https://nextjs.org/docs/app/api-reference/turbopack). بالإضافة إلى ذلك، يوفر aliases لتحسين الأداء ويضمن التوافق مع مكونات الخادم.
242
+
243
+ > دالة `withIntlayer()` هي دالة تُعيد Promise. تتيح تحضير قواميس intlayer قبل بدء عملية البناء. إذا أردت استخدامها مع إضافات (plugins) أخرى، يمكنك انتظارها باستخدام await. مثال:
244
+ >
245
+ > ```ts
246
+ > const nextConfig = await withIntlayer(nextConfig);
247
+ > const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);
248
+ >
249
+ > export default nextConfigWithOtherPlugins;
250
+ > ```
251
+ >
252
+ > إذا رغبت في استخدامه بشكل متزامن، يمكنك استخدام الدالة `withIntlayerSync()`. مثال:
253
+ >
254
+ > ```ts
255
+ > const nextConfig = withIntlayerSync(nextConfig);
256
+ > const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);
257
+ >
258
+ > export default nextConfigWithOtherPlugins;
259
+ > ```
260
+ >
261
+ > يكتشف Intlayer تلقائياً ما إذا كان مشروعك يستخدم **webpack** أو **Turbopack** بناءً على وسائط سطر الأوامر `--webpack`، `--turbo`، أو `--turbopack`، وكذلك اعتماداً على إصدار **Next.js** الحالي لديك.
262
+ >
263
+ > بما أن `next>=16`، إذا كنت تستخدم **Rspack**، يجب عليك إجبار Intlayer صراحةً على استخدام إعداد webpack عن طريق تعطيل Turbopack:
264
+ >
265
+ > ```ts
266
+ > withRspack(withIntlayer(nextConfig, { enableTurbopack: false }));
267
+ > ```
268
+
269
+ ### الخطوة 4: تعريف مسارات اللغة الديناميكية
270
+
271
+ أزل كل شيء من `RootLayout` واستبدله بالشيفرة التالية:
272
+
273
+ ```tsx {3} fileName="src/app/layout.tsx" codeFormat="typescript"
274
+ import type { Metadata } from "next";
275
+ import type { ReactNode } from "react";
276
+ import "./globals.css";
277
+ import { IntlayerClientProvider, LocalPromiseParams } from "next-intlayer";
278
+ import { getHTMLTextDir, getIntlayer } from "intlayer";
279
+ import { getLocale } from "next-intlayer/server";
280
+ export { generateStaticParams } from "next-intlayer";
281
+
282
+ export const generateMetadata = async ({
283
+ params,
284
+ }: LocalPromiseParams): Promise<Metadata> => {
285
+ const { locale } = await params;
286
+ const { title, description, keywords } = getIntlayer("metadata", locale);
287
+
288
+ return {
289
+ title,
290
+ description,
291
+ keywords,
292
+ };
293
+ };
294
+
295
+ const RootLayout = async ({
296
+ children,
297
+ }: Readonly<{
298
+ children: ReactNode;
299
+ }>) => {
300
+ const locale = await getLocale();
301
+
302
+ return (
303
+ <html lang={locale} dir={getHTMLTextDir(locale)}>
304
+ <IntlayerClientProvider defaultLocale={locale}>
305
+ <body>{children}</body>
306
+ </IntlayerClientProvider>
307
+ </html>
308
+ );
309
+ };
310
+
311
+ export default RootLayout;
312
+ ```
313
+
314
+ ```jsx {3} fileName="src/app/layout.mjx" codeFormat="esm"
315
+ import "./globals.css";
316
+ import { IntlayerClientProvider } from "next-intlayer";
317
+ import { getHTMLTextDir, getIntlayer } from "intlayer";
318
+ import { getLocale } from "next-intlayer/server";
319
+ export { generateStaticParams } from "next-intlayer";
320
+
321
+ export const generateMetadata = async ({ params }) => {
322
+ const { locale } = await params;
323
+ const { title, description, keywords } = getIntlayer("metadata", locale);
324
+
325
+ return {
326
+ title,
327
+ description,
328
+ keywords,
329
+ };
330
+ };
331
+
332
+ const RootLayout = async ({ children }) => {
333
+ const locale = await getLocale();
334
+
335
+ return (
336
+ <html lang={locale} dir={getHTMLTextDir(locale)}>
337
+ <IntlayerClientProvider defaultLocale={locale}>
338
+ <body>{children}</body>
339
+ </IntlayerClientProvider>
340
+ </html>
341
+ );
342
+ };
343
+
344
+ export default RootLayout;
345
+ ```
346
+
347
+ ```jsx {1,8} fileName="src/app/layout.csx" codeFormat="commonjs"
348
+ require("./globals.css");
349
+ const { IntlayerClientProvider } = require("next-intlayer");
350
+ const { getHTMLTextDir, getIntlayer } = require("intlayer");
351
+ const { getLocale } = require("next-intlayer/server");
352
+ const { generateStaticParams } = require("next-intlayer");
353
+
354
+ const generateMetadata = async ({ params }) => {
355
+ const { locale } = await params;
356
+ const { title, description, keywords } = getIntlayer("metadata", locale);
357
+
358
+ return {
359
+ title,
360
+ description,
361
+ keywords,
362
+ };
363
+ };
364
+
365
+ const RootLayout = async ({ children }) => {
366
+ const locale = await getLocale();
367
+
368
+ return (
369
+ <html lang={locale} dir={getHTMLTextDir(locale)}>
370
+ <IntlayerClientProvider defaultLocale={locale}>
371
+ <body>{children}</body>
372
+ </IntlayerClientProvider>
373
+ </html>
374
+ );
375
+ };
376
+
377
+ module.exports = {
378
+ default: RootLayout,
379
+ generateStaticParams,
380
+ generateMetadata,
381
+ };
382
+ ```
383
+
384
+ ### الخطوة 5: أعلن محتواك
385
+
386
+ قم بإنشاء وإدارة تصريحات المحتوى الخاصة بك لتخزين الترجمات:
387
+
388
+ ```tsx fileName="src/app/metadata.content.ts" contentDeclarationFormat="typescript"
389
+ import { t, type Dictionary } from "intlayer";
390
+ import { Metadata } from "next";
391
+
392
+ const metadataContent = {
393
+ key: "metadata",
394
+ content: {
395
+ title: t({
396
+ ar: "عنوان المشروع الخاص بي",
397
+ en: "My Project Title",
398
+ fr: "Le Titre de mon Projet",
399
+ es: "El Título de mi Proyecto",
400
+ }),
401
+
402
+ description: t({
403
+ ar: "اكتشف منصتنا المبتكرة المصممة لتبسيط سير عملك وزيادة إنتاجيتك.",
404
+ en: "Discover our innovative platform designed to streamline your workflow and boost productivity.",
405
+ fr: "Découvrez notre plateforme innovante conçue pour simplifier votre flux de travail et booster votre productivité.",
406
+ es: "Descubra nuestra plataforma innovadora diseñada para simplificar su flujo de trabajo y aumentar su productividad.",
407
+ }),
408
+
409
+ keywords: t({
410
+ ar: ["الابتكار", "الإنتاجية", "سير العمل", "SaaS"],
411
+ en: ["innovation", "productivity", "workflow", "SaaS"],
412
+ ar: ["الابتكار", "الإنتاجية", "سير العمل", "SaaS"],
413
+ fr: ["innovation", "productivité", "flux de travail", "SaaS"],
414
+ es: ["innovación", "productividad", "flujo de trabajo", "SaaS"],
415
+ }),
416
+ },
417
+ } as Dictionary<Metadata>;
418
+
419
+ export default metadataContent;
420
+ ```
421
+
422
+ ```tsx fileName="src/app/metadata.content.mjs" contentDeclarationFormat="typescript"
423
+ import { t, type Dictionary } from "intlayer";
424
+
425
+ /** @type {import('intlayer').Dictionary<import('next').Metadata>} */
426
+ const metadataContent = {
427
+ key: "metadata",
428
+ content: {
429
+ title: t({
430
+ en: "My Project Title",
431
+ fr: "Le Titre de mon Projet",
432
+ es: "El Título de mi Proyecto",
433
+ }),
434
+
435
+ description: t({
436
+ en: "Discover our innovative platform designed to streamline your workflow and boost productivity.",
437
+ ar: "اكتشف منصتنا المبتكرة المصممة لتبسيط سير عملك وزيادة إنتاجيتك.",
438
+ fr: "Découvrez notre plateforme innovante conçue pour simplifier votre flux de travail et booster votre productivité.",
439
+ es: "Descubra nuestra plataforma innovadora diseñada para simplificar su flujo de trabajo y aumentar su productividad.",
440
+ }),
441
+
442
+ keywords: t({
443
+ ar: ["ابتكار", "إنتاجية", "سير العمل", "SaaS"],
444
+ en: ["innovation", "productivity", "workflow", "SaaS"],
445
+ fr: ["innovation", "productivité", "flux de travail", "SaaS"],
446
+ es: ["innovación", "productividad", "flujo de trabajo", "SaaS"],
447
+ }),
448
+ },
449
+ };
450
+
451
+ export default metadataContent;
452
+ ```
453
+
454
+ ```javascript fileName="src/app/metadata.content.cjs" contentDeclarationFormat="commonjs"
455
+ const { t } = require("intlayer");
456
+
457
+ /** @type {import('intlayer').Dictionary<import('next').Metadata>} */
458
+ const metadataContent = {
459
+ key: "metadata",
460
+ content: {
461
+ title: t({
462
+ ar: "عنوان مشروعي",
463
+ en: "My Project Title",
464
+ fr: "Le Titre de mon Projet",
465
+ es: "El Título de mi Proyecto",
466
+ }),
467
+
468
+ description: t({
469
+ ar: "اكتشف منصتنا المبتكرة المصممة لتبسيط سير عملك وزيادة الإنتاجية.",
470
+ en: "Discover our innovative platform designed to streamline your workflow and boost productivity.",
471
+ fr: "Découvrez notre plateforme innovante conçue pour simplifier votre flux de travail et booster votre productivité.",
472
+ es: "Descubra nuestra plataforma innovadora diseñada para simplificar su flujo de trabajo y aumentar su productividad.",
473
+ }),
474
+
475
+ keywords: t({
476
+ ar: ["الابتكار", "الإنتاجية", "سير العمل", "SaaS"],
477
+ en: ["innovation", "productivity", "workflow", "SaaS"],
478
+ fr: ["innovation", "productivité", "flux de travail", "SaaS"],
479
+ es: ["innovación", "productividad", "flujo de trabajo", "SaaS"],
480
+ }),
481
+ },
482
+ };
483
+
484
+ module.exports = metadataContent;
485
+ ```
486
+
487
+ ```json fileName="src/app/metadata.content.json" contentDeclarationFormat="json"
488
+ {
489
+ "key": "metadata",
490
+ "content": {
491
+ "title": {
492
+ "nodeType": "translation",
493
+ "translation": {
494
+ "ar": "عنوان مشروعي",
495
+ "en": "My Project Title",
496
+ "fr": "Le Titre de mon Projet",
497
+ "es": "El Título de mi Proyecto"
498
+ }
499
+ },
500
+ "description": {
501
+ "nodeType": "translation",
502
+ "translation": {
503
+ "ar": "اكتشف منصتنا المبتكرة المصممة لتبسيط سير عملك وزيادة الإنتاجية.",
504
+ "en": "Discover our innovative platform designed to streamline your workflow and boost productivity.",
505
+ "fr": "Découvrez notre plateforme innovante conçue pour simplifier votre flux de travail et booster votre productivité.",
506
+ "es": "Descubra nuestra plataforma innovadora diseñada para simplificar su flujo de trabajo y aumentar su productividad."
507
+ }
508
+ },
509
+ ```
510
+
511
+ "keywords": {
512
+ "nodeType": "translation",
513
+ "translation": {
514
+ "ar": ["الابتكار", "الإنتاجية", "سير العمل", "SaaS"],
515
+ "en": ["innovation", "productivity", "workflow", "SaaS"],
516
+ "fr": ["innovation", "productivité", "flux de travail", "SaaS"],
517
+ "es": ["innovación", "productividad", "flujo de trabajo", "SaaS"]
518
+ }
519
+ }
520
+
521
+ }
522
+ }
523
+
524
+ ````
525
+
526
+ ```tsx fileName="src/app/page.content.ts" contentDeclarationFormat="typescript"
527
+ import { t, type Dictionary } from "intlayer";
528
+
529
+ const pageContent = {
530
+ key: "page",
531
+ content: {
532
+ getStarted: {
533
+ main: t({
534
+ ar: "ابدأ بالتعديل",
535
+ en: "Get started by editing",
536
+ fr: "Commencez par éditer",
537
+ es: "Comience por editar",
538
+ }),
539
+ pageLink: "src/app/page.tsx",
540
+ },
541
+ },
542
+ } satisfies Dictionary;
543
+
544
+ export default pageContent;
545
+ ````
546
+
547
+ ```javascript fileName="src/app/page.content.mjs" contentDeclarationFormat="esm"
548
+ import { t } from "intlayer";
549
+
550
+ /** @type {import('intlayer').Dictionary} */
551
+ // نوع: Dictionary من intlayer
552
+ const pageContent = {
553
+ key: "page",
554
+ content: {
555
+ getStarted: {
556
+ main: t({
557
+ ar: "ابدأ بالتعديل",
558
+ en: "Get started by editing",
559
+ fr: "Commencez par éditer",
560
+ es: "Comience por editar",
561
+ }),
562
+ pageLink: "src/app/page.tsx",
563
+ },
564
+ },
565
+ };
566
+
567
+ export default pageContent;
568
+ ```
569
+
570
+ ```javascript fileName="src/app/page.content.cjs" contentDeclarationFormat="commonjs"
571
+ const { t } = require("intlayer");
572
+
573
+ /** @type {import('intlayer').Dictionary} */
574
+ // نوع: Dictionary من intlayer
575
+ const pageContent = {
576
+ key: "page",
577
+ content: {
578
+ getStarted: {
579
+ main: t({
580
+ ar: "ابدأ بالتعديل",
581
+ en: "Get started by editing",
582
+ fr: "Commencez par éditer",
583
+ ar: "ابدأ بالتحرير",
584
+ es: "Comience por editar",
585
+ }),
586
+ pageLink: "src/app/page.tsx",
587
+ },
588
+ },
589
+ };
590
+
591
+ module.exports = pageContent;
592
+ ```
593
+
594
+ ```json fileName="src/app/page.content.json" contentDeclarationFormat="json"
595
+ {
596
+ "$schema": "https://intlayer.org/schema.json",
597
+ "key": "page",
598
+ "content": {
599
+ "getStarted": {
600
+ "nodeType": "translation",
601
+ "translation": {
602
+ "ar": "ابدأ بالتحرير",
603
+ "en": "Get started by editing",
604
+ "fr": "Commencez par éditer",
605
+ "es": "Comience por editar"
606
+ }
607
+ },
608
+ "pageLink": "src/app/page.tsx"
609
+ }
610
+ }
611
+ ```
612
+
613
+ > يمكن تعريف إعلانات المحتوى (content declarations) في أي مكان داخل تطبيقك طالما أنها موجودة داخل دليل `contentDir` (افتراضيًا `./src`). ويجب أن يتطابق امتداد ملف إعلان المحتوى (افتراضيًا `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
614
+
615
+ > لمزيد من التفاصيل، راجع [توثيق إعلان المحتوى](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/content_file.md).
616
+
617
+ ### الخطوة 6: استخدام المحتوى في الشيفرة الخاصة بك
618
+
619
+ الوصول إلى قواميس المحتوى في جميع أنحاء تطبيقك:
620
+
621
+ ```tsx fileName="src/app/page.tsx" codeFormat="typescript"
622
+ import type { FC } from "react";
623
+ import { ClientComponentExample } from "@components/clientComponentExample/ClientComponentExample";
624
+ import { ServerComponentExample } from "@components/serverComponentExample/ServerComponentExample";
625
+ import {
626
+ IntlayerServerProvider,
627
+ useIntlayer,
628
+ getLocale,
629
+ } from "next-intlayer/server";
630
+ import { NextPage } from "next";
631
+ import { headers, cookies } from "next/headers";
632
+
633
+ const PageContent: FC = () => {
634
+ const content = useIntlayer("page");
635
+
636
+ return (
637
+ <>
638
+ <p>{content.getStarted.main}</p>
639
+ <code>{content.getStarted.pageLink}</code>
640
+ </>
641
+ );
642
+ };
643
+
644
+ const Page: NextPage = async () => {
645
+ const locale = await getLocale();
646
+
647
+ return (
648
+ <IntlayerServerProvider locale={locale}>
649
+ <PageContent />
650
+ <ServerComponentExample />
651
+ <ClientComponentExample />
652
+ </IntlayerServerProvider>
653
+ );
654
+ };
655
+
656
+ export default Page;
657
+ ```
658
+
659
+ ```jsx fileName="src/app/page.mjx" codeFormat="esm"
660
+ import { ClientComponentExample } from "@components/clientComponentExample/ClientComponentExample";
661
+ import { ServerComponentExample } from "@components/serverComponentExample/ServerComponentExample";
662
+ import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server";
663
+ import { getLocale } from "intlayer";
664
+ import { headers, cookies } from "next/headers";
665
+ import { NextPage } from "next";
666
+
667
+ const Page: NextPage = async () => {
668
+ const content = useIntlayer("page");
669
+
670
+ return (
671
+ <>
672
+ <p>{content.getStarted.main}</p>
673
+ <code>{content.getStarted.pageLink}</code>
674
+ </>
675
+ );
676
+ };
677
+
678
+ const Page = async () => {
679
+
680
+ const locale = await getLocale();
681
+
682
+ return (
683
+ <IntlayerServerProvider locale={locale}>
684
+ <PageContent />
685
+ ```
686
+
687
+ <ServerComponentExample />
688
+ <ClientComponentExample />
689
+ </IntlayerServerProvider>
690
+
691
+ );
692
+ };
693
+
694
+ export default Page;
695
+
696
+ ````
697
+
698
+ ```jsx fileName="src/app/page.csx" codeFormat="commonjs"
699
+ import { ClientComponentExample } from "@components/clientComponentExample/ClientComponentExample";
700
+ import { ServerComponentExample } from "@components/serverComponentExample/ServerComponentExample";
701
+ import { IntlayerServerProvider, useIntlayer, getLocale } from "next-intlayer/server";
702
+ import { NextPage } from "next";
703
+ import { headers, cookies } from "next/headers";
704
+
705
+ const Page: NextPage = async () => {
706
+ const content = useIntlayer("page");
707
+
708
+ return (
709
+ <>
710
+ <p>{content.getStarted.main}</p>
711
+ <code>{content.getStarted.pageLink}</code>
712
+ </>
713
+ );
714
+ };
715
+
716
+ const Page: NextPage = async () => {
717
+ const locale = await getLocale();
718
+
719
+ return (
720
+ <IntlayerServerProvider locale={locale}>
721
+ <PageContent />
722
+ <ServerComponentExample />
723
+ <ClientComponentExample />
724
+ </IntlayerServerProvider>
725
+ );
726
+ };
727
+
728
+ - **`IntlayerClientProvider`** يُستخدم لتوفير الـ locale للمكونات على جانب العميل. يمكن وضعه في أي مكوّن أصل (parent component)، بما في ذلك الـ layout. ومع ذلك، يُنصح بوضعه في الـ layout لأن Next.js يشارك كود الـ layout عبر الصفحات، مما يجعله أكثر كفاءة. باستخدام `IntlayerClientProvider` داخل الـ layout، تتجنّب إعادة تهيئته لكل صفحة، مما يحسّن الأداء ويحافظ على سياق التعريب المتسق في تطبيقك.
729
+ - **`IntlayerServerProvider`** تُستخدم لتزويد العناصر الفرعية التي تعمل على الخادم بالـ locale. لا يمكن تعيينها في الـ layout.
730
+
731
+ > لا يمكن أن يتشارك الـ layout والصفحة نفس سياق الخادم لأن نظام سياق الخادم يعتمد على مخزن بيانات لكل طلب (عبر آلية [React's cache](https://react.dev/reference/react/cache))، مما يجعل كل "context" يُعاد إنشاؤه لأجزاء مختلفة من التطبيق. وضع الـ provider في layout مشترك سيكسر هذا العزل، وسيمنع الانتشار الصحيح لقيم سياق الخادم إلى مكوناتك على الخادم.
732
+
733
+ ```tsx {4,7} fileName="src/components/clientComponentExample/ClientComponentExample.tsx" codeFormat="typescript"
734
+ "use client";
735
+
736
+ import type { FC } from "react";
737
+ import { useIntlayer } from "next-intlayer";
738
+
739
+ export const ClientComponentExample: FC = () => {
740
+ const content = useIntlayer("client-component-example"); // إنشاء تعريف المحتوى المرتبط
741
+
742
+ return (
743
+ <div>
744
+ <h2>{content.title}</h2>
745
+ <p>{content.content}</p>
746
+ </div>
747
+ );
748
+ };
749
+ ````
750
+
751
+ ```jsx {3,6} fileName="src/components/clientComponentExample/ClientComponentExample.mjx" codeFormat="esm"
752
+ "use client";
753
+
754
+ import { useIntlayer } from "next-intlayer";
755
+
756
+ const ClientComponentExample = () => {
757
+ const content = useIntlayer("client-component-example"); // إنشاء تعريف المحتوى المرتبط
758
+
759
+ return (
760
+ <div>
761
+ <h2>{content.title}</h2>
762
+ <p>{content.content}</p>
763
+ </div>
764
+ );
765
+ };
766
+ ```
767
+
768
+ ```jsx {3,6} fileName="src/components/clientComponentExample/ClientComponentExample.csx" codeFormat="commonjs"
769
+ "use client";
770
+
771
+ const { useIntlayer } = require("next-intlayer");
772
+
773
+ const ClientComponentExample = () => {
774
+ const content = useIntlayer("client-component-example"); // إنشاء تعريف المحتوى المرتبط
775
+
776
+ return (
777
+ <div>
778
+ <h2>{content.title}</h2>
779
+ <p>{content.content}</p>
780
+ </div>
781
+ );
782
+ };
783
+ ```
784
+
785
+ ```tsx {2} fileName="src/components/serverComponentExample/ServerComponentExample.tsx" codeFormat="typescript"
786
+ import type { FC } from "react";
787
+ import { useIntlayer } from "next-intlayer/server";
788
+
789
+ export const ServerComponentExample: FC = () => {
790
+ const content = useIntlayer("server-component-example"); // إنشاء تعريف المحتوى المرتبط
791
+
792
+ return (
793
+ <div>
794
+ <h2>{content.title}</h2>
795
+ <p>{content.content}</p>
796
+ </div>
797
+ );
798
+ };
799
+ ```
800
+
801
+ ```jsx {1} fileName="src/components/serverComponentExample/ServerComponentExample.mjx" codeFormat="esm"
802
+ import { useIntlayer } from "next-intlayer/server";
803
+
804
+ const ServerComponentExample = () => {
805
+ const content = useIntlayer("server-component-example"); // إنشاء تعريف المحتوى المرتبط
806
+
807
+ return (
808
+ <div>
809
+ <h2>{content.title}</h2>
810
+ <p>{content.content}</p>
811
+ </div>
812
+ );
813
+ };
814
+ ```
815
+
816
+ ````jsx {1} fileName="src/components/serverComponentExample/ServerComponentExample.csx" codeFormat="commonjs"
817
+ const { useIntlayer } = require("next-intlayer/server");
818
+
819
+ const ServerComponentExample = () => {
820
+ const content = useIntlayer("server-component-example"); // إنشاء تعريف المحتوى المرتبط
821
+
822
+ return (
823
+ <div>
824
+ <h2>{content.title}</h2>
825
+ <p>{content.content}</p>
826
+ </div>
827
+ );
828
+ };
829
+
830
+ > إذا أردت استخدام المحتوى في سمة من نوع سلسلة مثل `alt`، `title`، `href`، `aria-label`، إلخ، يجب عليك استدعاء قيمة الدالة، على سبيل المثال:
831
+
832
+ > ```jsx
833
+ > <img src={content.image.src.value} alt={content.image.value} />
834
+ > ```
835
+
836
+ > لمعرفة المزيد عن الـ `useIntlayer` hook، راجع الـ [الوثائق](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/next-intlayer/useIntlayer.md).
837
+
838
+ ### (اختياري) الخطوة 7: تكوين البروكسي لاكتشاف لغة المستخدم المفضلة
839
+
840
+ قم بإعداد البروكسي لاكتشاف اللغة المفضلة للمستخدم:
841
+
842
+ ```typescript fileName="src/proxy.ts" codeFormat="typescript"
843
+ export { intlayerProxy as proxy } from "next-intlayer/proxy";
844
+
845
+ export const config = {
846
+ matcher:
847
+ "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
848
+ };
849
+ ````
850
+
851
+ ```javascript fileName="src/proxy.mjs" codeFormat="esm"
852
+ export { intlayerProxy as proxy } from "next-intlayer/proxy";
853
+
854
+ export const config = {
855
+ matcher:
856
+ "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
857
+ };
858
+ ```
859
+
860
+ ```javascript fileName="src/proxy.cjs" codeFormat="commonjs"
861
+ const { intlayerProxy } = require("next-intlayer/proxy");
862
+
863
+ const config = {
864
+ matcher:
865
+ "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
866
+ };
867
+
868
+ module.exports = { proxy: intlayerProxy, config };
869
+ ```
870
+
871
+ > يُستخدم `intlayerProxy` لاكتشاف اللغة المفضلة للمستخدم وإعادة توجيهه إلى عنوان URL المناسب كما هو موضح في [التكوين](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/configuration.md). بالإضافة إلى ذلك، يتيح حفظ اللغة المفضلة للمستخدم في ملف تعريف الارتباط (cookie).
872
+
873
+ > إذا احتجت إلى ربط عدة proxies معًا (على سبيل المثال، `intlayerProxy` مع المصادقة أو proxies مخصصة)، فإن Intlayer يوفر الآن مساعدًا يسمى `multipleProxies`.
874
+
875
+ ```ts
876
+ import { multipleProxies, intlayerProxy } from "next-intlayer/proxy";
877
+ import { customProxy } from "@utils/customProxy";
878
+
879
+ export const proxy = multipleProxies([intlayerProxy, customProxy]);
880
+ ```
881
+
882
+ ### (اختياري) الخطوة 8: تغيير لغة المحتوى الخاص بك
883
+
884
+ لتغيير لغة المحتوى في Next.js، الطريقة الموصى بها هي استخدام مكوّن Link لإعادة توجيه المستخدمين إلى الصفحة المحلية المناسبة. يتيح مكوّن Link إمكانية التحميل المسبق للصفحة (prefetching)، مما يساعد على تجنّب إعادة تحميل الصفحة بالكامل.
885
+
886
+ ```tsx fileName="src/components/localeSwitcher/LocaleSwitcher.tsx" codeFormat="typescript"
887
+ "use client";
888
+
889
+ import type { FC } from "react";
890
+ import { Locales, getHTMLTextDir, getLocaleName } from "intlayer";
891
+ import { useLocale } from "next-intlayer";
892
+
893
+ export const LocaleSwitcher: FC = () => {
894
+ const { locale, availableLocales, setLocale } = useLocale({
895
+ onChange: () => window.location.reload(),
896
+ });
897
+
898
+ return (
899
+ <div>
900
+ <button popoverTarget="localePopover">{getLocaleName(locale)}</button>
901
+ <div id="localePopover" popover="auto">
902
+ {availableLocales.map((localeItem) => (
903
+ <button
904
+ key={localeItem}
905
+ aria-current={locale === localeItem ? "page" : undefined}
906
+ onClick={() => setLocale(localeItem)}
907
+ >
908
+ <span>
909
+ {/* اللغة - مثال: FR */}
910
+ {localeItem}
911
+ </span>
912
+ <span>
913
+ {/* اللغة بلغة نفسها - مثال: Français */}
914
+ {getLocaleName(localeItem, locale)}
915
+ </span>
916
+ <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
917
+ {/* اللغة بالترجمة الحالية - مثال: Francés مع تعيين locale الحالي إلى Locales.SPANISH */}
918
+ {getLocaleName(localeItem)}
919
+ </span>
920
+ <span dir="ltr" lang={Locales.ENGLISH}>
921
+ {/* اللغة بالإنجليزية - على سبيل المثال: French */}
922
+ {getLocaleName(localeItem, Locales.ENGLISH)}
923
+ </span>
924
+ </button>
925
+ ))}
926
+ </div>
927
+ </div>
928
+ );
929
+ };
930
+ ```
931
+
932
+ ```jsx fileName="src/components/localeSwitcher/LocaleSwitcher.msx" codeFormat="esm"
933
+ "use client";
934
+
935
+ import { Locales, getHTMLTextDir, getLocaleName } from "intlayer";
936
+ import { useLocale } from "next-intlayer";
937
+
938
+ export const LocaleSwitcher = () => {
939
+ const { locale, availableLocales, setLocale } = useLocale({
940
+ onChange: () => window.location.reload(),
941
+ });
942
+
943
+ return (
944
+ <div>
945
+ <button popoverTarget="localePopover">{getLocaleName(locale)}</button>
946
+ <div id="localePopover" popover="auto">
947
+ {availableLocales.map((localeItem) => (
948
+ <button
949
+ key={localeItem}
950
+ aria-current={locale === localeItem ? "page" : undefined}
951
+ onClick={() => setLocale(localeItem)}
952
+ >
953
+ <span>
954
+ {/* اللغة المحلية - مثال: FR */}
955
+ {localeItem}
956
+ </span>
957
+ <span>
958
+ {/* اسم اللغة بلفظها المحلي - مثال: Français */}
959
+ {getLocaleName(localeItem, locale)}
960
+ </span>
961
+ <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
962
+ {/* اسم اللغة باللغة الحالية - مثال: Francés عندما تكون اللغة الحالية Locales.SPANISH */}
963
+ {getLocaleName(localeItem)}
964
+ </span>
965
+ <span dir="ltr" lang={Locales.ENGLISH}>
966
+ {/* اسم اللغة بالإنجليزية - مثال: French */}
967
+ {getLocaleName(localeItem, Locales.ENGLISH)}
968
+ </span>
969
+ </button>
970
+ ))}
971
+ </div>
972
+ </div>
973
+ );
974
+ };
975
+ ```
976
+
977
+ ```jsx fileName="src/components/localeSwitcher/LocaleSwitcher.csx" codeFormat="commonjs"
978
+ "use client";
979
+
980
+ const { Locales, getHTMLTextDir, getLocaleName } = require("intlayer");
981
+ const { useLocale } = require("next-intlayer");
982
+
983
+ export const LocaleSwitcher = () => {
984
+ const path
985
+ const { locale availableLocales, setLocale } = useLocale({
986
+ onChange: ()=> window.location.reload(),
987
+ });
988
+
989
+ return (
990
+ <div>
991
+ <button popoverTarget="localePopover">{getLocaleName(locale)}</button>
992
+ <div id="localePopover" popover="auto">
993
+ {availableLocales.map((localeItem) => (
994
+ <button
995
+ key={localeItem}
996
+ aria-current={locale === localeItem ? "page" : undefined}
997
+ onClick={() => setLocale(localeItem)}
998
+ >
999
+ <span>
1000
+ {/* اللغة المختصرة - مثال: FR */}
1001
+ {localeItem}
1002
+ </span>
1003
+ <span>
1004
+ {/* اسم اللغة في لغتها الأصلية - مثلا Français */}
1005
+ {getLocaleName(localeItem, locale)}
1006
+ </span>
1007
+ <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
1008
+ {/* اسم اللغة بلغة الواجهة الحالية - مثلا Francés عندما تكون الواجهة على Locales.SPANISH */}
1009
+ {getLocaleName(localeItem)}
1010
+ </span>
1011
+ <span dir="ltr" lang={Locales.ENGLISH}>
1012
+ {/* اسم اللغة بالإنجليزية - مثلا French */}
1013
+ {getLocaleName(localeItem, Locales.ENGLISH)}
1014
+ </span>
1015
+ </button>
1016
+ ))}
1017
+ </div>
1018
+ </div>
1019
+ );
1020
+ };
1021
+ ```
1022
+
1023
+ > طريقة بديلة هي استخدام الدالة `setLocale` المقدمة من الـ `useLocale` هوك. هذه الدالة لن تسمح بالتحميل المسبق للصفحة. راجع توثيق [`useLocale` هوك](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/next-intlayer/useLocale.md) لمزيد من التفاصيل.
1024
+
1025
+ > مراجع التوثيق:
1026
+ >
1027
+ > - [`useLocale` هوك](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/next-intlayer/useLocale.md)
1028
+ > - [`getLocaleName` هوك](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/next-intlayer/getLocaleName.md)
1029
+ > - [`getLocalizedUrl` هوك](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/next-intlayer/getLocalizedUrl.md)
1030
+ > - [`getHTMLTextDir` هوك](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/intlayer/getHTMLTextDir.md)
1031
+ > - [`hrefLang` الخاصية](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=fr)
1032
+ > - [`lang` الخاصية](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)
1033
+ > - [`dir` الخاصية](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir)
1034
+ > - [`aria-current` الخاصية](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)
1035
+
1036
+ ### (اختياري) الخطوة 9: الحصول على اللغة الحالية في Server Actions
1037
+
1038
+ إذا احتجت إلى الـ locale النشط داخل Server Action (مثلًا، لتوطين رسائل البريد الإلكتروني أو لتنفيذ منطق يتعامل مع اللغة)، استدعِ `getLocale` من `next-intlayer/server`:
1039
+
1040
+ ```tsx fileName="src/app/actions/getLocale.ts" codeFormat="typescript"
1041
+ "use server";
1042
+
1043
+ import { getLocale } from "next-intlayer/server";
1044
+
1045
+ export const myServerAction = async () => {
1046
+ const locale = await getLocale();
1047
+
1048
+ // قم بعمل شيء باستخدام المتغير locale
1049
+ };
1050
+ ```
1051
+
1052
+ > تتبع الدالة `getLocale` استراتيجية متدرجة لتحديد لغة المستخدم:
1053
+ >
1054
+ > 1. أولاً، تتحقق من request headers عن قيمة locale قد تكون قد تم تعيينها بواسطة proxy
1055
+ > 2. إذا لم يتم العثور على locale في الرؤوس، فإنها تبحث عن locale مخزنة في cookies
1056
+ > 3. إذا لم يتم العثور على cookie، تحاول اكتشاف اللغة المفضلة للمستخدم من إعدادات الـ browser
1057
+ > 4. كملاذ أخير، تعود إلى الـ default locale المكوّن للتطبيق
1058
+ >
1059
+ > هذا يضمن اختيار الـlocale الأنسب بناءً على السياق المتاح.
1060
+
1061
+ ### (اختياري) الخطوة 10: تحسين حجم الحزمة
1062
+
1063
+ عند استخدام `next-intlayer`، يتم تضمين القواميس في كل bundle لكل صفحة بشكل افتراضي. لتقليل حجم الـbundle، يوفر Intlayer ملحق SWC اختياري يستبدل استدعاءات `useIntlayer` بذكاء باستخدام الماكروز. هذا يضمن تضمين القواميس فقط في الحزم الخاصة بالصفحات التي تستخدمها فعليًا.
1064
+
1065
+ لتمكين هذا التحسين، ثبّت الحزمة `@intlayer/swc`. بمجرد التثبيت، سيكتشف `next-intlayer` الملحق ويستخدمه تلقائيًا:
1066
+
1067
+ ```bash packageManager="npm"
1068
+ npm install @intlayer/swc --save-dev
1069
+ npx intlayer init
1070
+ ```
1071
+
1072
+ ```bash packageManager="pnpm"
1073
+ pnpm add @intlayer/swc --save-dev
1074
+ pnpm intlayer init
1075
+ ```
1076
+
1077
+ ```bash packageManager="yarn"
1078
+ yarn add @intlayer/swc --save-dev
1079
+ yarn intlayer init
1080
+ ```
1081
+
1082
+ ```bash packageManager="bun"
1083
+ bun add @intlayer/swc --dev
1084
+ bunx intlayer init
1085
+ ```
1086
+
1087
+ > ملاحظة: هذا التحسين متاح فقط لـ Next.js 13 والإصدارات الأحدث.
1088
+
1089
+ > ملاحظة: هذه الحزمة غير مثبتة افتراضيًا لأن إضافات SWC لا تزال تجريبية في Next.js. قد يتغير ذلك في المستقبل.
1090
+
1091
+ > ملاحظة: إذا قمت بتعيين الخيار إلى `importMode: 'dynamic'` أو `importMode: 'live'`، فسيعتمد ذلك على Suspense، لذا سيتوجب عليك تغليف استدعاءات `useIntlayer` ضمن حدّ `Suspense`. هذا يعني أنك لن تتمكن من استخدام `useIntlayer` مباشرةً على المستوى العلوي لمكوّن الصفحة / التخطيط الخاص بك.
1092
+
1093
+ ### مراقبة تغيّرات القواميس على Turbopack
1094
+
1095
+ عند استخدام Turbopack كسيرفر التطوير مع الأمر `next dev`، فلن يتم اكتشاف تغييرات القواميس تلقائيًا افتراضيًا.
1096
+
1097
+ يحدث هذا القيد لأن Turbopack لا يستطيع تشغيل ملحقات webpack بالتوازي لمراقبة التغييرات في ملفات المحتوى الخاصة بك. كحل بديل، ستحتاج إلى استخدام الأمر `intlayer watch` لتشغيل كلٍ من سيرفر التطوير ومراقب بناء Intlayer في آنٍ واحد.
1098
+
1099
+ ```json5 fileName="package.json"
1100
+ {
1101
+ // ... Your existing package.json configurations
1102
+ "scripts": {
1103
+ // ... Your existing scripts configurations
1104
+ "dev": "intlayer watch --with 'next dev'",
1105
+ },
1106
+ }
1107
+ ```
1108
+
1109
+ > إذا كنت تستخدم next-intlayer@<=6.x.x، تحتاج إلى الاحتفاظ بالعلم `--turbopack` لجعل تطبيق Next.js 16 يعمل بشكل صحيح مع Turbopack. نوصي باستخدام next-intlayer@>=7.x.x لتجنب هذا القيد.
1110
+
1111
+ ### تكوين TypeScript
1112
+
1113
+ يستخدم Intlayer module augmentation للاستفادة من TypeScript وتقوية الـ codebase الخاصة بك.
1114
+
1115
+ ![الإكمال التلقائي](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true)
1116
+
1117
+ ![خطأ في الترجمة](https://github.com/aymericzip/intlayer/blob/main/docs/assets/translation_error.png?raw=true)
1118
+
1119
+ تأكد من أن إعدادات TypeScript تتضمن الأنواع المولدة تلقائيًا.
1120
+
1121
+ ```json5 fileName="tsconfig.json"
1122
+ {
1123
+ // ... تكوينات TypeScript الحالية الخاصة بك
1124
+ "include": [
1125
+ // ... تكوينات TypeScript الحالية الخاصة بك
1126
+ ".intlayer/**/*.ts", // تضمين الأنواع المولدة تلقائيًا
1127
+ ],
1128
+ }
1129
+ ```
1130
+
1131
+ ### تهيئة Git
1132
+
1133
+ يوصى بتجاهل الملفات المولدة بواسطة Intlayer. يسمح لك هذا بتجنّب إضافتها إلى مستودع Git الخاص بك.
1134
+
1135
+ للقيام بذلك، يمكنك إضافة التعليمات التالية إلى ملف `.gitignore` الخاص بك:
1136
+
1137
+ ```plaintext fileName=".gitignore"
1138
+ # تجاهل الملفات المولدة بواسطة Intlayer
1139
+ .intlayer
1140
+ ```
1141
+
1142
+ ### امتداد VS Code
1143
+
1144
+ لتحسين تجربة التطوير مع Intlayer، يمكنك تثبيت الامتداد الرسمي **Intlayer VS Code Extension**.
1145
+
1146
+ [التثبيت من سوق VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
1147
+
1148
+ يوفر هذا الامتداد:
1149
+
1150
+ - **Autocompletion** لمفاتيح الترجمة.
1151
+ - **Real-time error detection** للترجمات المفقودة.
1152
+ - **معاينات مضمنة** للمحتوى المترجم.
1153
+ - **إجراءات سريعة** لإنشاء التراجمات وتحديثها بسهولة.
1154
+
1155
+ للمزيد من التفاصيل حول كيفية استخدام الامتداد، راجع توثيق امتداد Intlayer لـ VS Code: [Intlayer VS Code Extension documentation](https://intlayer.org/doc/vs-code-extension).
1156
+
1157
+ ### التوسع
1158
+
1159
+ للتوسع، يمكنك تنفيذ [المحرر المرئي](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).