@intlayer/docs 9.3.0 → 9.3.2

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 (217) hide show
  1. package/README.md +24 -24
  2. package/blog/ar/rag_powered_documentation_assistant.md +1 -1
  3. package/blog/pl/rag_powered_documentation_assistant.md +1 -1
  4. package/dist/cjs/_virtual/_rolldown/runtime.cjs +1 -2
  5. package/dist/cjs/authors2.cjs +0 -1
  6. package/dist/cjs/common.cjs.map +1 -1
  7. package/dist/cjs/generated/blog.entry.cjs +4 -2
  8. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  9. package/dist/cjs/generated/docs.entry.cjs +24 -2
  10. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  11. package/dist/cjs/generated/frequentQuestions.entry.cjs +4 -2
  12. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  13. package/dist/cjs/generated/legal.entry.cjs +4 -2
  14. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  15. package/dist/esm/generated/blog.entry.mjs +4 -2
  16. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  17. package/dist/esm/generated/docs.entry.mjs +24 -2
  18. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  19. package/dist/esm/generated/frequentQuestions.entry.mjs +4 -2
  20. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  21. package/dist/esm/generated/legal.entry.mjs +4 -2
  22. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  23. package/dist/types/generated/docs.entry.d.ts +1 -0
  24. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  25. package/docs/ar/configuration.md +10 -10
  26. package/docs/ar/eslint.md +336 -0
  27. package/docs/ar/interest_of_intlayer.md +24 -22
  28. package/docs/ar/intlayer_with_express.md +1 -1
  29. package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +1 -1
  30. package/docs/ar/intlayer_with_svelte_kit.md +1 -1
  31. package/docs/ar/intlayer_with_tanstack+solid.md +5 -3
  32. package/docs/ar/intlayer_with_tanstack.md +5 -3
  33. package/docs/ar/lsp.md +114 -175
  34. package/docs/ar/readme.md +25 -25
  35. package/docs/bn/configuration.md +10 -10
  36. package/docs/bn/eslint.md +336 -0
  37. package/docs/bn/interest_of_intlayer.md +24 -22
  38. package/docs/cs/configuration.md +10 -10
  39. package/docs/cs/eslint.md +336 -0
  40. package/docs/cs/interest_of_intlayer.md +24 -22
  41. package/docs/de/configuration.md +10 -10
  42. package/docs/de/eslint.md +336 -0
  43. package/docs/de/interest_of_intlayer.md +24 -22
  44. package/docs/de/intlayer_with_svelte_kit.md +1 -1
  45. package/docs/de/intlayer_with_tanstack+solid.md +5 -3
  46. package/docs/de/intlayer_with_tanstack.md +5 -3
  47. package/docs/de/lsp.md +111 -172
  48. package/docs/de/readme.md +24 -24
  49. package/docs/en/configuration.md +10 -10
  50. package/docs/en/eslint.md +336 -0
  51. package/docs/en/interest_of_intlayer.md +24 -22
  52. package/docs/en/intlayer_with_svelte_kit.md +1 -1
  53. package/docs/en/intlayer_with_tanstack+solid.md +5 -3
  54. package/docs/en/intlayer_with_tanstack.md +5 -3
  55. package/docs/en/lsp.md +109 -170
  56. package/docs/en/readme.md +24 -24
  57. package/docs/en-GB/configuration.md +10 -10
  58. package/docs/en-GB/eslint.md +336 -0
  59. package/docs/en-GB/interest_of_intlayer.md +24 -22
  60. package/docs/en-GB/intlayer_with_create_react_app.md +32 -35
  61. package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +1 -1
  62. package/docs/en-GB/intlayer_with_svelte_kit.md +1 -1
  63. package/docs/en-GB/intlayer_with_tanstack+solid.md +5 -3
  64. package/docs/en-GB/intlayer_with_tanstack.md +5 -3
  65. package/docs/en-GB/lsp.md +109 -170
  66. package/docs/en-GB/readme.md +24 -24
  67. package/docs/es/configuration.md +10 -10
  68. package/docs/es/eslint.md +336 -0
  69. package/docs/es/interest_of_intlayer.md +24 -22
  70. package/docs/es/intlayer_with_svelte_kit.md +1 -1
  71. package/docs/es/intlayer_with_tanstack+solid.md +5 -3
  72. package/docs/es/intlayer_with_tanstack.md +5 -3
  73. package/docs/es/lsp.md +114 -175
  74. package/docs/es/readme.md +24 -24
  75. package/docs/fr/configuration.md +10 -10
  76. package/docs/fr/eslint.md +336 -0
  77. package/docs/fr/interest_of_intlayer.md +24 -22
  78. package/docs/fr/intlayer_with_svelte_kit.md +1 -1
  79. package/docs/fr/intlayer_with_tanstack+solid.md +5 -3
  80. package/docs/fr/intlayer_with_tanstack.md +5 -3
  81. package/docs/fr/lsp.md +110 -171
  82. package/docs/fr/readme.md +24 -24
  83. package/docs/hi/configuration.md +10 -10
  84. package/docs/hi/eslint.md +336 -0
  85. package/docs/hi/interest_of_intlayer.md +24 -22
  86. package/docs/hi/intlayer_with_express.md +1 -1
  87. package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +1 -1
  88. package/docs/hi/intlayer_with_svelte_kit.md +1 -1
  89. package/docs/hi/intlayer_with_tanstack+solid.md +5 -3
  90. package/docs/hi/intlayer_with_tanstack.md +5 -3
  91. package/docs/hi/intlayer_with_vite+svelte.md +2 -2
  92. package/docs/hi/lsp.md +113 -174
  93. package/docs/hi/readme.md +24 -24
  94. package/docs/id/configuration.md +10 -10
  95. package/docs/id/eslint.md +336 -0
  96. package/docs/id/interest_of_intlayer.md +24 -22
  97. package/docs/id/intlayer_with_svelte_kit.md +1 -1
  98. package/docs/id/intlayer_with_tanstack+solid.md +5 -3
  99. package/docs/id/intlayer_with_tanstack.md +5 -3
  100. package/docs/id/lsp.md +113 -174
  101. package/docs/id/readme.md +24 -24
  102. package/docs/it/configuration.md +10 -10
  103. package/docs/it/eslint.md +336 -0
  104. package/docs/it/interest_of_intlayer.md +24 -22
  105. package/docs/it/intlayer_with_svelte_kit.md +1 -1
  106. package/docs/it/intlayer_with_tanstack+solid.md +5 -3
  107. package/docs/it/intlayer_with_tanstack.md +5 -3
  108. package/docs/it/lsp.md +115 -176
  109. package/docs/it/readme.md +24 -24
  110. package/docs/ja/configuration.md +10 -10
  111. package/docs/ja/eslint.md +336 -0
  112. package/docs/ja/interest_of_intlayer.md +24 -22
  113. package/docs/ja/intlayer_with_react_router_v7.md +1 -146
  114. package/docs/ja/intlayer_with_tanstack+solid.md +5 -3
  115. package/docs/ja/intlayer_with_tanstack.md +5 -3
  116. package/docs/ja/intlayer_with_vite+react.md +5 -1
  117. package/docs/ja/lsp.md +113 -174
  118. package/docs/ja/readme.md +24 -24
  119. package/docs/ko/configuration.md +10 -10
  120. package/docs/ko/eslint.md +336 -0
  121. package/docs/ko/interest_of_intlayer.md +24 -22
  122. package/docs/ko/intlayer_with_lynx+react.md +4 -0
  123. package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +1 -1
  124. package/docs/ko/intlayer_with_storybook.md +5 -5
  125. package/docs/ko/intlayer_with_svelte_kit.md +1 -1
  126. package/docs/ko/intlayer_with_tanstack+solid.md +5 -3
  127. package/docs/ko/intlayer_with_tanstack.md +5 -3
  128. package/docs/ko/lsp.md +112 -173
  129. package/docs/ko/readme.md +24 -24
  130. package/docs/nl/configuration.md +10 -10
  131. package/docs/nl/eslint.md +336 -0
  132. package/docs/nl/interest_of_intlayer.md +24 -22
  133. package/docs/pl/configuration.md +10 -10
  134. package/docs/pl/eslint.md +336 -0
  135. package/docs/pl/interest_of_intlayer.md +4 -2
  136. package/docs/pl/intlayer_with_astro.md +1 -114
  137. package/docs/pl/intlayer_with_svelte_kit.md +1 -1
  138. package/docs/pl/intlayer_with_tanstack+solid.md +5 -3
  139. package/docs/pl/intlayer_with_tanstack.md +5 -3
  140. package/docs/pl/lsp.md +115 -176
  141. package/docs/pl/migration_from_i18next_to_intlayer.md +4 -0
  142. package/docs/pl/migration_from_next-i18next_to_intlayer.md +8 -4
  143. package/docs/pl/migration_from_next-intl_to_intlayer.md +11 -5
  144. package/docs/pl/migration_from_nuxtjs_i18n_to_intlayer.md +8 -4
  145. package/docs/pl/migration_from_react-i18next_to_intlayer.md +8 -4
  146. package/docs/pl/migration_from_vue-i18n_to_intlayer.md +4 -0
  147. package/docs/pl/readme.md +24 -24
  148. package/docs/pt/configuration.md +10 -10
  149. package/docs/pt/eslint.md +336 -0
  150. package/docs/pt/interest_of_intlayer.md +24 -22
  151. package/docs/pt/intlayer_with_astro.md +1 -114
  152. package/docs/pt/intlayer_with_svelte_kit.md +1 -1
  153. package/docs/pt/intlayer_with_tanstack+solid.md +5 -3
  154. package/docs/pt/intlayer_with_tanstack.md +5 -3
  155. package/docs/pt/lsp.md +113 -174
  156. package/docs/pt/readme.md +24 -24
  157. package/docs/ru/configuration.md +10 -10
  158. package/docs/ru/eslint.md +336 -0
  159. package/docs/ru/interest_of_intlayer.md +24 -22
  160. package/docs/ru/intlayer_with_nextjs_14.md +1 -1
  161. package/docs/ru/intlayer_with_nextjs_15.md +1 -1
  162. package/docs/ru/intlayer_with_svelte_kit.md +1 -1
  163. package/docs/ru/intlayer_with_tanstack+solid.md +5 -3
  164. package/docs/ru/intlayer_with_tanstack.md +5 -3
  165. package/docs/ru/lsp.md +112 -173
  166. package/docs/ru/readme.md +24 -24
  167. package/docs/tr/configuration.md +10 -10
  168. package/docs/tr/eslint.md +336 -0
  169. package/docs/tr/interest_of_intlayer.md +24 -22
  170. package/docs/tr/intlayer_with_svelte_kit.md +1 -1
  171. package/docs/tr/intlayer_with_tanstack+solid.md +5 -3
  172. package/docs/tr/intlayer_with_tanstack.md +5 -3
  173. package/docs/tr/lsp.md +113 -174
  174. package/docs/tr/readme.md +24 -24
  175. package/docs/uk/configuration.md +10 -10
  176. package/docs/uk/eslint.md +336 -0
  177. package/docs/uk/interest_of_intlayer.md +4 -2
  178. package/docs/uk/intlayer_with_svelte_kit.md +1 -1
  179. package/docs/uk/intlayer_with_tanstack+solid.md +5 -3
  180. package/docs/uk/intlayer_with_tanstack.md +5 -3
  181. package/docs/uk/lsp.md +113 -174
  182. package/docs/uk/packages/angular-intlayer/exports.md +2 -2
  183. package/docs/uk/per_locale_file.md +1 -1
  184. package/docs/uk/readme.md +24 -24
  185. package/docs/ur/configuration.md +10 -10
  186. package/docs/ur/eslint.md +336 -0
  187. package/docs/ur/interest_of_intlayer.md +24 -22
  188. package/docs/vi/configuration.md +10 -10
  189. package/docs/vi/eslint.md +336 -0
  190. package/docs/vi/interest_of_intlayer.md +24 -22
  191. package/docs/vi/intlayer_with_svelte_kit.md +1 -1
  192. package/docs/vi/intlayer_with_tanstack+solid.md +5 -3
  193. package/docs/vi/intlayer_with_tanstack.md +5 -3
  194. package/docs/vi/lsp.md +115 -176
  195. package/docs/vi/readme.md +24 -24
  196. package/docs/zh/configuration.md +10 -10
  197. package/docs/zh/eslint.md +336 -0
  198. package/docs/zh/interest_of_intlayer.md +24 -22
  199. package/docs/zh/intlayer_with_create_react_app.md +4 -0
  200. package/docs/zh/intlayer_with_lynx+react.md +4 -0
  201. package/docs/zh/intlayer_with_nextjs_14.md +0 -2
  202. package/docs/zh/intlayer_with_nextjs_15.md +0 -2
  203. package/docs/zh/intlayer_with_nextjs_page_router.md +0 -2
  204. package/docs/zh/intlayer_with_nuxt.md +1 -1
  205. package/docs/zh/intlayer_with_react_router_v7.md +4 -0
  206. package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +4 -0
  207. package/docs/zh/intlayer_with_solid_start.md +1 -1
  208. package/docs/zh/intlayer_with_svelte_kit.md +1 -1
  209. package/docs/zh/intlayer_with_tanstack+solid.md +5 -3
  210. package/docs/zh/intlayer_with_tanstack.md +5 -3
  211. package/docs/zh/intlayer_with_vite+vue.md +0 -2
  212. package/docs/zh/lsp.md +113 -174
  213. package/docs/zh/readme.md +21 -21
  214. package/docs/zh-TW/eslint.md +336 -0
  215. package/docs/zh-TW/interest_of_intlayer.md +24 -22
  216. package/package.json +6 -6
  217. package/src/generated/docs.entry.ts +20 -0
@@ -0,0 +1,336 @@
1
+ ---
2
+ createdAt: 2026-08-12
3
+ updatedAt: 2026-08-12
4
+ title: إضافة ESLint | قواعد الفحص (Lint) لـ Intlayer
5
+ description: اكتشف النصوص المكتوبة يدويًا (hardcoded)، والاستدعاءات الديناميكية التي لا يمكن لمترجم Intlayer تحسينها، ومحتوى القواميس غير المستخدم، باستخدام eslint-plugin-intlayer. متوافقة مع ESLint و oxlint عبر React و Vue و Svelte و Angular و Astro.
6
+ keywords:
7
+ - Intlayer
8
+ - ESLint
9
+ - oxlint
10
+ - الفحص
11
+ - i18n
12
+ - التدويل
13
+ - no-raw-text
14
+ - نصوص مكتوبة يدويًا
15
+ - ترجمات غير مستخدمة
16
+ - محتوى غير مستخدم
17
+ - React
18
+ - Vue
19
+ - Svelte
20
+ - Angular
21
+ slugs:
22
+ - doc
23
+ - eslint
24
+ history:
25
+ - version: 9.3.1
26
+ date: 2026-08-12
27
+ changes: "السجل الأولي"
28
+ author: aymericzip
29
+ ---
30
+
31
+ # إضافة ESLint x OXLint
32
+
33
+ تلتقط `eslint-plugin-intlayer` أنواع أخطاء التدويل (i18n) التي لا يستطيع TypeScript اكتشافها:
34
+
35
+ 1. **النصوص المكتوبة يدويًا (Hardcoded text)** التي لم يتم نقلها إلى القاموس مطلقًا.
36
+ 2. **الاستدعاءات الديناميكية** التي تجتاز فحص الأنواع وتعمل، لكن مترجم Intlayer لا يمكنه تحسينها.
37
+ 3. **المحتوى غير المستخدم (Dead content)** — القواميس والحقول التي لا يقرأها أي شيء في المشروع (اختياري بالطلب).
38
+
39
+ المفاتيح غير المعروفة ومسارات الحقول غير المعروفة واللغات المفقودة هي بالفعل أخطاء تجميع، لذا لا تعيد الإضافة تكرارها.
40
+
41
+ ## التثبيت
42
+
43
+ ```bash packageManager="npm"
44
+ npm install --save-dev eslint-plugin-intlayer
45
+ ```
46
+
47
+ ```bash packageManager="pnpm"
48
+ pnpm add --save-dev eslint-plugin-intlayer
49
+ ```
50
+
51
+ ```bash packageManager="yarn"
52
+ yarn add --dev eslint-plugin-intlayer
53
+ ```
54
+
55
+ تتطلب الإصدار 9 من ESLint أو أحدث (flat config).
56
+
57
+ ## الاستخدام
58
+
59
+ تعمل الإضافة في كل من ESLint و [oxlint](https://oxc.rs) — بنفس القواعد ونفس الخيارات.
60
+
61
+ <Tabs defaultTab="eslint">
62
+ <Tab label="ESLint" value="eslint">
63
+
64
+ ```javascript fileName="eslint.config.mjs" codeFormat="esm"
65
+ import intlayer from "eslint-plugin-intlayer";
66
+
67
+ export default [...intlayer.configs.recommended];
68
+ ```
69
+
70
+ أو قم بتمكين القواعد واحدة تلو الأخرى:
71
+
72
+ ```javascript fileName="eslint.config.mjs" codeFormat="esm"
73
+ import intlayer from "eslint-plugin-intlayer";
74
+
75
+ export default [
76
+ {
77
+ plugins: { intlayer },
78
+ rules: {
79
+ "intlayer/no-raw-text": "warn",
80
+ "intlayer/static-dictionary-key": "error",
81
+ "intlayer/no-dynamic-field-access": "error",
82
+ "intlayer/enforce-adapter-import": "warn",
83
+ "intlayer/no-unused-content": "warn",
84
+ },
85
+ },
86
+ ];
87
+ ```
88
+
89
+ </Tab>
90
+ <Tab label="oxlint" value="oxlint">
91
+
92
+ ```json fileName=".oxlintrc.json"
93
+ {
94
+ "jsPlugins": ["eslint-plugin-intlayer"],
95
+ "rules": {
96
+ "intlayer/no-raw-text": "warn",
97
+ "intlayer/static-dictionary-key": "error",
98
+ "intlayer/no-dynamic-field-access": "error",
99
+ "intlayer/enforce-adapter-import": "warn"
100
+ }
101
+ }
102
+ ```
103
+
104
+ تنبيهان: لا يزال دعم إضافات JS في oxlint تجريبيًا (alpha)، كما أن oxlint لا يدعم المحللات المخصصة (custom parsers) — وبالتالي لا يتم فحص ملفات `.vue` و `.svelte` و `.astro` وقوالب Angular هناك. قم بتشغيل oxlint على ملفات JS/TS/JSX واحتفظ بـ ESLint للباقي.
105
+
106
+ تم استبعاد `no-unused-content` أعلاه عمدًا: فهي تحتاج إلى دليل العمل ومسار الملف المفحوص من سياق القاعدة، وهو ما لا يضمنه جسر إضافات JS التجريبي. قم بتشغيلها تحت ESLint.
107
+
108
+ </Tab>
109
+ </Tabs>
110
+
111
+ ### الإعدادات المسبقة (Configs)
112
+
113
+ | الإعداد | `no-raw-text` | `static-dictionary-key` | `no-dynamic-field-access` | `enforce-adapter-import` | `no-unused-content` |
114
+ | --------------- | ----------------------- | ----------------------- | ------------------------- | ------------------------ | ------------------- |
115
+ | `recommended` | warn | error | error | off | off |
116
+ | `strict` | error (+ نصوص خارج JSX) | error | error | error | off |
117
+ | `contract-only` | off | error | error | off | off |
118
+
119
+ يحتفظ `recommended` بـ `no-raw-text` عند مستوى `warn` عمدًا: توجيهه إلى قاعدة تعليمات برمجية حالية يُظهر جميع النصوص غير المترجمة دفعة واحدة، وهو ما لا ينبغي أن يعطل عملية البناء من اليوم الأول.
120
+
121
+ `enforce-adapter-import` معطلة افتراضيًا — قم بتمكينها بشكل صريح إذا أردت ذلك.
122
+
123
+ `no-unused-content` معطلة في كل الإعدادات، بما في ذلك `strict`. إنها القاعدة الوحيدة التي تقرأ إعدادات Intlayer وتفحص ملفات المصدر من القرص، لذا يجب أن يكون تفعيلها خيارًا مقصودًا بدلاً من شيء يتم تفعيله تلقائيًا.
124
+
125
+ ## القواعد
126
+
127
+ ### `no-raw-text`
128
+
129
+ تبلغ عن النصوص الموجهة للمستخدم غير المصرح بها في القاموس. تستخدم نفس آلية الكشف مثل `intlayer extract`، لذلك يتم تجاهل أسماء العلامات التجارية وفئات CSS والمعرفات التقنية.
130
+
131
+ ```jsx
132
+ // ✗ تم الإبلاغ عنه
133
+ <h1>Welcome to our documentation</h1>
134
+ <input placeholder="Enter your email address" />
135
+
136
+ // ✓ سليم
137
+ const { title } = useIntlayer("home");
138
+ <h1>{title}</h1>
139
+ ```
140
+
141
+ يتم تخطي ملفات الإعلان عن المحتوى (`*.content.ts`, …).
142
+
143
+ لإصلاح ملف بالكامل مرة واحدة، قم بتشغيل `npx intlayer extract` ودع المترجم ينقل النصوص إلى قاموس نيابة عنك.
144
+
145
+ **الخيارات**
146
+
147
+ ```javascript fileName="eslint.config.mjs" codeFormat="esm"
148
+ {
149
+ "intlayer/no-raw-text": [
150
+ "warn",
151
+ {
152
+ // السمات التي قيمتها نص موجه للمستخدم.
153
+ // الافتراضي: title, placeholder, alt, aria-label, label
154
+ attributes: ["title", "placeholder", "alt", "aria-label", "label"],
155
+
156
+ // العناصر التي لا يكون محتواها نصًا موجهًا للمستخدم أبدًا.
157
+ // الافتراضي: code, pre, script, style
158
+ ignoreElements: ["code", "pre", "script", "style"],
159
+
160
+ // تعبيرات نمطية للنصوص التي لا يجب الإبلاغ عنها أبدًا.
161
+ ignorePatterns: ["^Powered by"],
162
+
163
+ // الإبلاغ أيضًا عن السلاسل النصية الصريحة خارج وسوم العرض. الافتراضي: false
164
+ includeStringLiterals: false,
165
+ },
166
+ ],
167
+ }
168
+ ```
169
+
170
+ ### `static-dictionary-key`
171
+
172
+ تتطلب أن يكون مفتاح القاموس سلسلة نصية صريحة (string literal).
173
+
174
+ لا يمكن للمترجم تحميل القاموس مسبقًا إلا عندما يتمكن من قراءة المفتاح مباشرة في موقع الاستدعاء. عند استخدام مفتاح محسوب، يتخطى التحسين بصمت ويقوم بحزم جميع القواميس بدلاً من ذلك.
175
+
176
+ ```typescript
177
+ // ✗ تم الإبلاغ عنه
178
+ useIntlayer(dictionaryKey);
179
+ useIntlayer(`home-${suffix}`);
180
+ getTranslations({ namespace: page });
181
+
182
+ // ✗ المتغير لا يزال ليس قيمة صريحة
183
+ const key = "home";
184
+ useIntlayer(key);
185
+
186
+ // ✓ سليم
187
+ useIntlayer("home");
188
+ getTranslations({ namespace: "home" });
189
+ ```
190
+
191
+ ينطبق هذا على `useIntlayer` و `getIntlayer` وجميع محولات التوافق (`useTranslation`, `useTranslations`, `formatMessage`, `<FormattedMessage id>`, `<Trans i18nKey>`, …).
192
+
193
+ ### `no-dynamic-field-access`
194
+
195
+ تتطلب أن يكون الحقل الذي تقرأه من القاموس معروفًا بشكل ثابت.
196
+
197
+ يقوم المترجم بإزالة الحقول التي لا يرى أنها مستخدمة. الوصول الديناميكي غير مرئي بالنسبة له، وبالتالي قد تُرجع القراءة `undefined` أثناء التشغيل.
198
+
199
+ ```typescript
200
+ // ✗ تم الإبلاغ عنه
201
+ const content = useIntlayer("home");
202
+ content[fieldName];
203
+
204
+ const t = useTranslations("home");
205
+ t(messageKey);
206
+
207
+ // ✓ سليم
208
+ content.title;
209
+ content["title"];
210
+ content.items[0];
211
+ t("hero.title");
212
+ ```
213
+
214
+ ### `enforce-adapter-import`
215
+
216
+ تفضل استخدام محول التوافق `@intlayer/*` على الحزمة الأصلية. لا يتم حل الحزمة الأصلية إلى Intlayer إلا عند تكوين الاسم المستعار في أداة التجميع؛ بينما يعمل المحول دائمًا. قابلة للإصلاح التلقائي باستخدام `--fix`.
217
+
218
+ ```typescript
219
+ // ✗ تم الإبلاغ عنه
220
+ import { useTranslation } from "react-i18next";
221
+ import { getTranslations } from "next-intl/server";
222
+
223
+ // ✓ سليم
224
+ import { useTranslation } from "@intlayer/react-i18next";
225
+ import { getTranslations } from "@intlayer/next-intl/server";
226
+ ```
227
+
228
+ ### `no-unused-content`
229
+
230
+ **معطلة افتراضيًا.** تبلغ عن المحتوى الذي لا يقرأه أي شيء في مشروعك، بالإضافة إلى مفاتيح القاموس المصرح بها في أكثر من مكان.
231
+
232
+ ```typescript fileName="src/home.content.ts"
233
+ export default {
234
+ key: "home", // ✗ يتم الإبلاغ عنه إذا لم يطلب أي مستدعي "home" في المشروع
235
+ content: {
236
+ title: t({ ar: "العنوان", en: "Title" }),
237
+
238
+ // ✗ يتم الإبلاغ عنه عندما لا يقرأ أي شيء `hero`
239
+ hero: {
240
+ subtitle: t({ ar: "العنوان الفرعي", en: "Subtitle" }),
241
+ },
242
+ },
243
+ };
244
+ ```
245
+
246
+ على عكس القواعد الأخرى، لا يمكن لهذه القاعدة الإجابة من الملف الحالي فقط — فالحقل يعتبر غير مستخدم بالنسبة للمشروع بأكمله فقط. عند أول إعلان محتوى في فحص الفاحص، تقوم بتحميل تكوين Intlayer الخاص بك، وفحص ملفات المصدر التي يعلن عنها التكوين (`build.traversePattern`, `compiler.transformPattern`)، وتشغيل نفس محلل الاستخدام الذي يشغل `@intlayer/lsp` والخط المشطوب "غير مستخدم" في إضافة VS Code. يتم تخزين النتيجة مؤقتًا لمدى `cacheTtl` مللي ثانية، بحيث يتم الفحص مرة واحدة لكل تشغيل بدلاً من مرة واحدة لكل ملف.
247
+
248
+ **الخيارات**
249
+
250
+ ```javascript fileName="eslint.config.mjs" codeFormat="esm"
251
+ {
252
+ "intlayer/no-unused-content": [
253
+ "warn",
254
+ {
255
+ // الإبلاغ عن مفاتيح القواميس التي لا يشير إليها أي شيء. الافتراضي: true
256
+ reportUnusedDictionaries: true,
257
+
258
+ // الإبلاغ عن حقول المحتوى التي لا يقرأها أي شيء. الافتراضي: true
259
+ reportUnusedFields: true,
260
+
261
+ // الإبلاغ عن المفاتيح المصرح بها في أكثر من مكان. الافتراضي: true
262
+ reportDuplicateKeys: true,
263
+
264
+ // تعبيرات نمطية لمسارات الحقول التي لا يجب الإبلاغ عنها أبدًا.
265
+ ignoreFields: ["^meta"],
266
+
267
+ // جذر المشروع الذي يبدأ منه الفحص. الافتراضي: دليل عمل ESLint
268
+ baseDir: process.cwd(),
269
+
270
+ // مدة إعادة استخدام فحص المشروع، بالمللي ثانية. الافتراضي: 30000
271
+ cacheTtl: 30000,
272
+ },
273
+ ],
274
+ }
275
+ ```
276
+
277
+ قم بتقليل `cacheTtl` عند الفحص من خادم محرر طويل الأمد وتريد أن تظهر تعديلاتك بشكل أسرع؛ قم بتعيين `baseDir` عندما يمتد فحص واحد عبر عدة مشاريع Intlayer في مستودع موحد (monorepo).
278
+
279
+ > **تميل إلى التزام الصمت.** الإيجابية الخاطئة هنا تحذف ترجمة، لذا لا يتم الإبلاغ عن أي شيء عند استهلاك القاموس بطريقة لا يمكن للتحليل تتبعها: تمرير كائن المحتوى ككل، دالة ترجمة مرتبطة به (`const t = useTranslations("home")`)، إعلان تم الوصول إليه من خلال استيراد مباشر (`useDictionary(myDictionary)`)، استخدام `nest()` من قاموس آخر، أو قائمة حقول غير شاملة بسبب استخدام عامل النشر (spread). يتم احتساب مكونات الملف الواحد (`.vue`, `.svelte`, `.astro`) على أنها تستخدم كل حقل من القواميس المذكورة لأن كتل البرمجة النصية الخاصة بها لا يتم تحليلها هنا.
280
+
281
+ تقرأ `reportDuplicateKeys` القواميس غير المدمجة التي يكتبها البناء تحت `.intlayer/`، لذا تظل هادئة حتى يتم بناء المشروع مرة واحدة على الأقل. يتم دمج إعلانين يشتركان في نفس المفتاح وهو نمط مشروع — يوجد التقرير لأن حقلاً محددًا على كلا الجانبين يحتفظ بصمت بقيمة واحدة فقط من القيمتين.
282
+
283
+ يتم تحميل المحلل من `@intlayer/lsp`، والذي يتم توزيعه كـ ESM. وبالتالي تتطلب القاعدة إصدار Node قادرًا على تنفيذ `require()` لوحدة ES — مثل Node 20.19+ أو 22.12+. في أي إصدار أقدم، لا تبلغ عن شيء بدلاً من التسبب في فشل الفحص.
284
+
285
+ ## أطر العمل (Frameworks)
286
+
287
+ تعمل كل قاعدة عبر جميع تكاملات Intlayer، بما في ذلك داخل قوالب Vue و Svelte و Angular. ما عليك سوى إخبار ESLint بالمحلل الذي يقرأ كل نوع ملف.
288
+
289
+ | إطار العمل | الملفات | المحلل (Parser) |
290
+ | ------------------------- | ----------------- | --------------------------------- |
291
+ | React, Preact, Solid, Lit | `.jsx` `.tsx` | `typescript-eslint` |
292
+ | Next.js | `.jsx` `.tsx` | `typescript-eslint` |
293
+ | Vue, Nuxt | `.vue` | `vue-eslint-parser` |
294
+ | Svelte, SvelteKit | `.svelte` | `svelte-eslint-parser` |
295
+ | Angular | `.ts` | `typescript-eslint` |
296
+ | قوالب Angular | `.component.html` | `@angular-eslint/template-parser` |
297
+ | Astro | `.astro` | `astro-eslint-parser` |
298
+
299
+ ```javascript fileName="eslint.config.mjs" codeFormat="esm"
300
+ import intlayer from "eslint-plugin-intlayer";
301
+ import tseslint from "typescript-eslint";
302
+ import vueParser from "vue-eslint-parser";
303
+ import svelteParser from "svelte-eslint-parser";
304
+ import angularTemplateParser from "@angular-eslint/template-parser";
305
+
306
+ export default [
307
+ ...intlayer.configs.recommended,
308
+
309
+ {
310
+ files: ["**/*.{ts,tsx,jsx}"],
311
+ languageOptions: { parser: tseslint.parser },
312
+ },
313
+ {
314
+ files: ["**/*.vue"],
315
+ languageOptions: {
316
+ parser: vueParser,
317
+ parserOptions: { parser: tseslint.parser },
318
+ },
319
+ },
320
+ {
321
+ files: ["**/*.svelte"],
322
+ languageOptions: {
323
+ parser: svelteParser,
324
+ parserOptions: { parser: tseslint.parser },
325
+ },
326
+ },
327
+ {
328
+ files: ["**/*.component.html"],
329
+ languageOptions: { parser: angularTemplateParser },
330
+ },
331
+ ];
332
+ ```
333
+
334
+ قم بتثبيت المحللات التي يحتاجها مشروعك فقط.
335
+
336
+ > **قيد معروف.** في قوالب Vue و Angular، التعبير مثل `{{ content[key] }}` لا يتم فحصه بواسطة `no-dynamic-field-access`. يتم التقاط القراءات الديناميكية المكتوبة داخل كتلة البرمجة النصية كالمعتاد.
@@ -191,7 +191,7 @@ export const ComponentExample = () => {
191
191
  يتيح لك هذا النهج:
192
192
 
193
193
  1. **زيادة سرعة التطوير**
194
- - يمكن إنشاء ملفات `.content.{{ts|mjs|cjs|json}}` باستخدام امتداد VSCode
194
+ - يمكن إنشاء ملفات `.content.{ts|js|mjs|cjs|json|tsx|jsx|md|mdx|yaml|yml}` باستخدام امتداد VSCode
195
195
  - أدوات إكمال الذكاء الاصطناعي في محررك (مثل GitHub Copilot) يمكنها مساعدتك في التصريح عن محتواك، مما يقلل النسخ واللصق
196
196
 
197
197
  2. **تنظيف codebase الخاص بك**
@@ -215,27 +215,27 @@ export const ComponentExample = () => {
215
215
 
216
216
  ## الميزات الإضافية لـ Intlayer
217
217
 
218
- | Feature | Description |
219
- | ------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
220
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/frameworks.png?raw=true) | **دعم الأطر المتقاطعة**<br><br>Intlayer متوافق مع جميع الأطر والمكتبات الرئيسية، بما في ذلك Next.js و React و Vite و Vue.js و Nuxt و Preact و Express والمزيد. |
221
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.jpg?raw=true) | **إدارة المحتوى المدعومة بـ JavaScript**<br><br>استفد من مرونة JavaScript لتحديد وإدارة المحتوى الخاص بك بكفاءة. <br><br> - [إعلان المحتوى](https://intlayer.org/doc/concept/content) |
222
- | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/compiler.jpg?raw=true" alt="Feature" width="700"> | **المترجم**<br><br>يستخرج مترجم Intlayer المحتوى تلقائياً من المكونات وينشئ ملفات القاموس.<br><br> - [المترجم](https://intlayer.org/doc/compiler) |
223
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/per_locale_content_declaration_file.png?raw=true) | **ملف إعلان المحتوى لكل لغة**<br><br>سرّع التطوير الخاص بك بإعلان المحتوى مرة واحدة، قبل الإنشاء التلقائي.<br><br> - [ملف إعلان المحتوى لكل لغة](https://intlayer.org/doc/concept/per-locale-file) |
224
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true) | **بيئة آمنة من حيث النوع**<br><br>استفد من TypeScript لضمان خلو تعريفات المحتوى والكود من الأخطاء، مع الاستفادة أيضاً من إكمال تلقائي IDE.<br><br> - [تكوين TypeScript](https://intlayer.org/doc/environment/vite-and-react#configure-typescript) |
225
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/config_file.png?raw=true) | **إعداد مبسط**<br><br>ابدأ بسرعة مع الحد الأدنى من الإعدادات. اضبط الإعدادات للدولية والتوجيه والذكاء الاصطناعي والبناء والمحتوى بسهولة. <br><br> - [استكشف تكامل Next.js](https://intlayer.org/doc/environment/nextjs) |
226
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/content_retrieval.png?raw=true) | **استرجاع المحتوى المبسط**<br><br>لا حاجة لاستدعاء دالة `t` الخاصة بك لكل جزء من المحتوى. استرجع كل المحتوى الخاص بك مباشرة باستخدام hook واحد.<br><br> - [تكامل React](https://intlayer.org/doc/environment/create-react-app) |
227
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/server_component.png?raw=true) | **تطبيق مكون الخادم المتسق**<br><br>مناسب تماماً لمكونات خادم Next.js، استخدم نفس التطبيق لكل من مكونات العميل والخادم، لا حاجة لتمرير دالة `t` عبر كل مكون خادم. <br><br> - [مكونات الخادم](https://intlayer.org/doc/environment/nextjs#step-7-utilize-content-in-your-code) |
228
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/file_tree.png?raw=true) | **قاعدة أكواد منظمة**<br><br>حافظ على قاعدة الأكواد الخاصة بك منظمة أكثر: 1 مكون = 1 قاموس في نفس المجلد. الترجمات القريبة من مكوناتها الخاصة تحسن الصيانة والوضوح. <br><br> - [كيف يعمل Intlayer](https://intlayer.org/doc/concept/how-works-intlayer) |
229
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/url_routing.png?raw=true) | **التوجيه المحسّن**<br><br>دعم كامل لتوجيه التطبيق، والتكيف بسلاسة مع الهياكل المعقدة للتطبيق، لـ Next.js و React و Vite و Vue.js وغيرها.<br><br> - [استكشف تكامل Next.js](https://intlayer.org/doc/environment/nextjs) |
230
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/markdown.png?raw=true) | **دعم Markdown**<br><br>استيراد وتفسير ملفات اللغة والمحتوى البعيد Markdown للمحتوى متعدد اللغات مثل سياسات الخصوصية والتوثيق وغيرها. فسّر واجعل بيانات وصف Markdown متاحة في الكود الخاص بك.<br><br> - [ملفات المحتوى](https://intlayer.org/doc/concept/content/file) |
231
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/visual_editor.png?raw=true) | **محرر مرئي مجاني وCMS**<br><br>محرر مرئي مجاني وCMS متاحان لكتاب المحتوى، مما يزيل الحاجة إلى منصة توطين. حافظ على تزامن المحتوى باستخدام Git، أو قم بإضفاء الطابع الخارجي عليه بشكل كامل أو جزئي مع CMS.<br><br> - [محرر Intlayer](https://intlayer.org/doc/concept/editor) <br> - [CMS Intlayer](https://intlayer.org/doc/concept/cms) |
232
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/bundle.png?raw=true) | **محتوى قابل للاستبدال**<br><br>محتوى قابل للاستبدال، مما يقلل من حجم الحزمة النهائية. تحميل المحتوى لكل مكون، مع استبعاد أي محتوى غير مستخدم من الحزمة الخاصة بك. يدعم التحميل البطيء لتحسين كفاءة تحميل التطبيق. <br><br> - [تحسين بناء التطبيق](https://intlayer.org/doc/concept/how-works-intlayer#app-build-optimization) |
233
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/static_rendering.png?raw=true) | **العرض الثابت**<br><br>لا يمنع العرض الثابت. <br><br> - [تكامل Next.js](https://intlayer.org/doc/environment/nextjs) |
234
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/AI_translation.png?raw=true) | **الترجمة المدعومة بالذكاء الاصطناعي**<br><br>حوّل موقعك الإلكتروني إلى 231 لغة بنقرة واحدة باستخدام أدوات الترجمة المتقدمة المدعومة بالذكاء الاصطناعي من Intlayer باستخدام مفتاح API/موفر الذكاء الاصطناعي الخاص بك. <br><br> - [تكامل CI/CD](https://intlayer.org/doc/concept/ci-cd) <br> - [Intlayer CLI](https://intlayer.org/doc/concept/cli) <br> - [الملء التلقائي](https://intlayer.org/doc/concept/auto-fill) |
235
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/mcp.png?raw=true) | **تكامل خادم MCP**<br><br>يوفر خادم MCP (Model Context Protocol) لأتمتة IDE، مما يتيح إدارة محتوى وسير عمل i18n بسلاسة مباشرة في بيئة التطوير الخاصة بك. <br><br> - [خادم MCP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/mcp_server.md) |
236
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/vscode_extension.png?raw=true) | **امتداد VSCode**<br><br>يوفر Intlayer امتداد VSCode لمساعدتك في إدارة المحتوى والترجمات وبناء القواميس وترجمة المحتوى والمزيد. <br><br> - [امتداد VSCode](https://intlayer.org/doc/vs-code-extension) |
237
- | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/interoperability.png?raw=true) | **التشغيل المتبادل**<br><br>يسمح بالتشغيل المتبادل مع react-i18next و next-i18next و next-intl و react-intl. <br><br> - [Intlayer و react-intl](https://intlayer.org/blog/intlayer-with-react-intl) <br> - [Intlayer و next-intl](https://intlayer.org/blog/intlayer-with-next-intl) <br> - [Intlayer و next-i18next](https://intlayer.org/blog/intlayer-with-next-i18next) |
238
- | اختبار الترجمات المفقودة (CLI/CI) | ✅ CLI: npx intlayer content test (CI-friendly audit) |
218
+ | Feature | Description |
219
+ | ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
220
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/frameworks.png?raw=true) | **دعم الأطر المتقاطعة**<br><br>Intlayer متوافق مع جميع الأطر والمكتبات الرئيسية، بما في ذلك Next.js و React و Vite و Vue.js و Nuxt و Preact و Express والمزيد. |
221
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.jpg?raw=true) | **إدارة المحتوى المدعومة بـ JavaScript**<br><br>استفد من مرونة JavaScript لتحديد وإدارة المحتوى الخاص بك بكفاءة. <br><br> - [إعلان المحتوى](https://intlayer.org/doc/concept/content) |
222
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/compiler.jpg?raw=true" alt="Feature" width="700"> | **المترجم**<br><br>يستخرج مترجم Intlayer المحتوى تلقائياً من المكونات وينشئ ملفات القاموس.<br><br> - [المترجم](https://intlayer.org/doc/compiler) |
223
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/per_locale_content_declaration_file.png?raw=true) | **ملف إعلان المحتوى لكل لغة**<br><br>سرّع التطوير الخاص بك بإعلان المحتوى مرة واحدة، قبل الإنشاء التلقائي.<br><br> - [ملف إعلان المحتوى لكل لغة](https://intlayer.org/doc/concept/per-locale-file) |
224
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true) | **بيئة آمنة من حيث النوع**<br><br>استفد من TypeScript لضمان خلو تعريفات المحتوى والكود من الأخطاء، مع الاستفادة أيضاً من إكمال تلقائي IDE.<br><br> - [تكوين TypeScript](https://intlayer.org/doc/environment/vite-and-react#configure-typescript) |
225
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/config_file.png?raw=true) | **إعداد مبسط**<br><br>ابدأ بسرعة مع الحد الأدنى من الإعدادات. اضبط الإعدادات للدولية والتوجيه والذكاء الاصطناعي والبناء والمحتوى بسهولة. <br><br> - [استكشف تكامل Next.js](https://intlayer.org/doc/environment/nextjs) |
226
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/content_retrieval.png?raw=true) | **استرجاع المحتوى المبسط**<br><br>لا حاجة لاستدعاء دالة `t` الخاصة بك لكل جزء من المحتوى. استرجع كل المحتوى الخاص بك مباشرة باستخدام hook واحد.<br><br> - [تكامل React](https://intlayer.org/doc/environment/create-react-app) |
227
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/server_component.png?raw=true) | **تطبيق مكون الخادم المتسق**<br><br>مناسب تماماً لمكونات خادم Next.js، استخدم نفس التطبيق لكل من مكونات العميل والخادم، لا حاجة لتمرير دالة `t` عبر كل مكون خادم. <br><br> - [مكونات الخادم](https://intlayer.org/doc/environment/nextjs#step-7-utilize-content-in-your-code) |
228
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/file_tree.png?raw=true) | **قاعدة أكواد منظمة**<br><br>حافظ على قاعدة الأكواد الخاصة بك منظمة أكثر: 1 مكون = 1 قاموس في نفس المجلد. الترجمات القريبة من مكوناتها الخاصة تحسن الصيانة والوضوح. <br><br> - [كيف يعمل Intlayer](https://intlayer.org/doc/concept/how-works-intlayer) |
229
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/url_routing.png?raw=true) | **التوجيه المحسّن**<br><br>دعم كامل لتوجيه التطبيق، والتكيف بسلاسة مع الهياكل المعقدة للتطبيق، لـ Next.js و React و Vite و Vue.js وغيرها.<br><br> - [استكشف تكامل Next.js](https://intlayer.org/doc/environment/nextjs) |
230
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/markdown.png?raw=true) | **دعم Markdown**<br><br>استيراد وتفسير ملفات اللغة والمحتوى البعيد Markdown للمحتوى متعدد اللغات مثل سياسات الخصوصية والتوثيق وغيرها. فسّر واجعل بيانات وصف Markdown متاحة في الكود الخاص بك.<br><br> - [ملفات المحتوى](https://intlayer.org/doc/concept/content/file) |
231
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/visual_editor.png?raw=true) | **محرر مرئي مجاني وCMS**<br><br>محرر مرئي مجاني وCMS متاحان لكتاب المحتوى، مما يزيل الحاجة إلى منصة توطين. حافظ على تزامن المحتوى باستخدام Git، أو قم بإضفاء الطابع الخارجي عليه بشكل كامل أو جزئي مع CMS.<br><br> - [محرر Intlayer](https://intlayer.org/doc/concept/editor) <br> - [CMS Intlayer](https://intlayer.org/doc/concept/cms) |
232
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/bundle.png?raw=true) | **محتوى قابل للاستبدال**<br><br>محتوى قابل للاستبدال، مما يقلل من حجم الحزمة النهائية. تحميل المحتوى لكل مكون، مع استبعاد أي محتوى غير مستخدم من الحزمة الخاصة بك. يدعم التحميل البطيء لتحسين كفاءة تحميل التطبيق. <br><br> - [تحسين بناء التطبيق](https://intlayer.org/doc/concept/how-works-intlayer#app-build-optimization) |
233
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/static_rendering.png?raw=true) | **العرض الثابت**<br><br>لا يمنع العرض الثابت. <br><br> - [تكامل Next.js](https://intlayer.org/doc/environment/nextjs) |
234
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/AI_translation.png?raw=true) | **الترجمة المدعومة بالذكاء الاصطناعي**<br><br>حوّل موقعك الإلكتروني إلى 231 لغة بنقرة واحدة باستخدام أدوات الترجمة المتقدمة المدعومة بالذكاء الاصطناعي من Intlayer باستخدام مفتاح API/موفر الذكاء الاصطناعي الخاص بك. <br><br> - [تكامل CI/CD](https://intlayer.org/doc/concept/ci-cd) <br> - [Intlayer CLI](https://intlayer.org/doc/concept/cli) <br> - [الملء التلقائي](https://intlayer.org/doc/concept/auto-fill) |
235
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/mcp.png?raw=true) | **تكامل خادم MCP**<br><br>يوفر خادم MCP (Model Context Protocol) لأتمتة IDE، مما يتيح إدارة محتوى وسير عمل i18n بسلاسة مباشرة في بيئة التطوير الخاصة بك. <br><br> - [خادم MCP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/mcp_server.md) |
236
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/vscode_extension.png?raw=true) | **امتداد VSCode**<br><br>يوفر Intlayer امتداد VSCode لمساعدتك في إدارة المحتوى والترجمات وبناء القواميس وترجمة المحتوى والمزيد. <br><br> - [امتداد VSCode](https://intlayer.org/doc/vs-code-extension) |
237
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/interoperability.png?raw=true) | **التشغيل المتبادل**<br><br>يسمح بالتشغيل المتبادل مع react-i18next و next-i18next و next-intl و react-intl. <br><br> - [Intlayer و react-intl](https://intlayer.org/blog/intlayer-with-react-intl) <br> - [Intlayer و next-intl](https://intlayer.org/blog/intlayer-with-next-intl) <br> - [Intlayer و next-i18next](https://intlayer.org/blog/intlayer-with-next-i18next) <br> - [محوّلات التوافق في Intlayer](https://intlayer.org/doc/compatibility) |
238
+ | اختبار الترجمات المفقودة (CLI/CI) | ✅ CLI: npx intlayer content test (CI-friendly audit) |
239
239
 
240
240
  ## مقارنة Intlayer مع الحلول الأخرى
241
241
 
@@ -274,3 +274,5 @@ export const ComponentExample = () => {
274
274
  يمكن لـ `intlayer` أيضًا المساعدة في إدارة مساحات الأسماء الخاصة بـ `react-intl` و `react-i18next` و `next-intl` و `next-i18next` و `vue-i18n`.
275
275
 
276
276
  باستخدام `intlayer`، يمكنك التصريح عن المحتوى الخاص بك بتنسيق مكتبة i18n المفضلة لديك، وسيقوم intlayer بإنشاء مساحات الأسماء الخاصة بك في الموقع الذي تختاره (مثال: `/messages/{{locale}}/{{namespace}}.json`).
277
+
278
+ إذا كنت ترغب في الاستمرار في استخدام واجهة برمجة التطبيقات الخاصة بمكتبة i18n الحالية لديك، فإن `intlayer` يوفر أيضًا **محوّلات التوافق (compat adapters)**: حزم تكشف نفس واجهة برمجة التطبيقات تمامًا مثل `react-i18next` و `next-intl` و `react-intl` و `vue-i18n` وغيرها، لكن يتم تزويدها بقواميس Intlayer. هذا يتيح لك الترحيل تدريجيًا دون إعادة كتابة الشيفرة الخاصة بك. راجع [توثيق محوّلات التوافق](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/index.md).
@@ -262,7 +262,7 @@ export default config;
262
262
  - **معاينات داخلية** للمحتوى المترجم.
263
263
  - **إجراءات سريعة** لإنشاء الترجمات وتحديثها بسهولة.
264
264
 
265
- لمزيد من التفاصيل حول كيفية استخدام الامتداد، راجع [توثيق امتداد Intlayer لـ VS Code](https://intlayer.org/doc/ar/vs-code-extension).
265
+ لمزيد من التفاصيل حول كيفية استخدام الامتداد، راجع [توثيق امتداد Intlayer لـ VS Code](https://intlayer.org/ar/doc/vs-code-extension).
266
266
 
267
267
  ### إعدادات Git
268
268
 
@@ -144,7 +144,7 @@ bun add vite-intlayer --dev
144
144
 
145
145
  </Step>
146
146
 
147
- </Steps>
147
+ <Step number={5} title="إنشاء مكونات التخطيط">
148
148
 
149
149
  #### بنية الملفات
150
150
 
@@ -387,7 +387,7 @@ export const getLocale = (event: RequestEvent): Locale => {
387
387
  };
388
388
  ```
389
389
 
390
- > `getLocaleFromStorage` سيتحقق من اللغة من الهيدر أو الكوكي حسب تكوينك. راجع [Configuration](https://intlayer.org/doc/configuration) لمزيد من التفاصيل.
390
+ > `getLocaleFromStorage` سيتحقق من اللغة من الهيدر أو الكوكي حسب تكوينك. راجع [Configuration](https://intlayer.org/doc/concept/configuration) لمزيد من التفاصيل.
391
391
 
392
392
  > دالة `localeDetector` ستتعامل مع هيدر `Accept-Language` وتعيد أفضل تطابق.
393
393
 
@@ -236,19 +236,21 @@ import {
236
236
  HeadContent,
237
237
  Scripts,
238
238
  createRootRouteWithContext,
239
+ getRouteApi,
239
240
  } from "@tanstack/solid-router";
240
241
  import { HydrationScript } from "solid-js/web";
241
242
  import { Suspense, type ParentComponent } from "solid-js";
242
243
  import { IntlayerProvider } from "solid-intlayer";
243
244
  import { defaultLocale, getHTMLTextDir } from "intlayer";
244
- import { Route as LocaleRoute } from "./{-$locale}/route";
245
+
246
+ const localeRoute = getRouteApi("/{-$locale}");
245
247
 
246
248
  export const Route = createRootRouteWithContext()({
247
249
  shellComponent: RootComponent,
248
250
  });
249
251
 
250
252
  const RootComponent: ParentComponent = (props) => {
251
- const params = LocaleRoute.useParams();
253
+ const params = localeRoute.useParams();
252
254
  const locale = params()?.locale ?? defaultLocale;
253
255
 
254
256
  return (
@@ -533,7 +535,7 @@ export default LocaleSwitcher;
533
535
 
534
536
  ```tsx fileName="src/routes/__root.tsx"
535
537
  const RootComponent: ParentComponent = (props) => {
536
- const params = LocaleRoute.useParams();
538
+ const params = localeRoute.useParams();
537
539
  const locale = params()?.locale ?? defaultLocale;
538
540
 
539
541
  return (
@@ -253,13 +253,15 @@ export default config;
253
253
  ```tsx fileName="src/routes/__root.tsx"
254
254
  import {
255
255
  createRootRouteWithContext,
256
+ getRouteApi,
256
257
  HeadContent,
257
258
  Scripts,
258
259
  } from "@tanstack/react-router";
259
260
  import { defaultLocale, getHTMLTextDir } from "intlayer";
260
261
  import { type ReactNode } from "react";
261
262
  import { IntlayerProvider } from "react-intlayer";
262
- import { Route as LocaleRoute } from "./{-$locale}/route";
263
+
264
+ const localeRoute = getRouteApi("/{-$locale}");
263
265
 
264
266
  export const Route = createRootRouteWithContext<{}>()({
265
267
  head: () => ({
@@ -281,7 +283,7 @@ export const Route = createRootRouteWithContext<{}>()({
281
283
  });
282
284
 
283
285
  function RootDocument({ children }: { children: ReactNode }) {
284
- const params = LocaleRoute.useParams();
286
+ const params = localeRoute.useParams();
285
287
  const locale = params?.locale ?? defaultLocale;
286
288
 
287
289
  return (
@@ -614,7 +616,7 @@ export const LocaleSwitcher: FC = () => {
614
616
 
615
617
  ```tsx fileName="src/routes/__root.tsx"
616
618
  function RootDocument({ children }: { children: ReactNode }) {
617
- const params = LocaleRoute.useParams();
619
+ const params = localeRoute.useParams();
618
620
  const locale = params?.locale ?? defaultLocale;
619
621
 
620
622
  return (