@intlayer/docs 7.1.9 → 7.2.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 (45) hide show
  1. package/README.md +1 -0
  2. package/dist/cjs/generated/docs.entry.cjs +19 -0
  3. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  4. package/dist/esm/generated/docs.entry.mjs +19 -0
  5. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  6. package/dist/types/generated/docs.entry.d.ts +1 -0
  7. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  8. package/docs/ar/intlayer_with_svelte_kit.md +738 -0
  9. package/docs/ar/intlayer_with_vite+svelte.md +288 -104
  10. package/docs/de/intlayer_with_svelte_kit.md +738 -0
  11. package/docs/de/intlayer_with_vite+svelte.md +302 -101
  12. package/docs/en/intlayer_with_nextjs_16.md +10 -2
  13. package/docs/en/intlayer_with_svelte_kit.md +570 -0
  14. package/docs/en/intlayer_with_vite+svelte.md +22 -6
  15. package/docs/en/introduction.md +2 -0
  16. package/docs/en-GB/intlayer_with_svelte_kit.md +738 -0
  17. package/docs/en-GB/intlayer_with_vite+svelte.md +262 -84
  18. package/docs/es/intlayer_with_svelte_kit.md +738 -0
  19. package/docs/es/intlayer_with_vite+svelte.md +300 -107
  20. package/docs/fr/intlayer_with_svelte_kit.md +770 -0
  21. package/docs/fr/intlayer_with_vite+svelte.md +297 -101
  22. package/docs/hi/intlayer_with_svelte_kit.md +738 -0
  23. package/docs/hi/intlayer_with_vite+svelte.md +298 -108
  24. package/docs/id/intlayer_with_svelte_kit.md +738 -0
  25. package/docs/id/intlayer_with_vite+svelte.md +277 -99
  26. package/docs/it/intlayer_with_svelte_kit.md +770 -0
  27. package/docs/it/intlayer_with_vite+svelte.md +275 -99
  28. package/docs/ja/intlayer_with_svelte_kit.md +738 -0
  29. package/docs/ja/intlayer_with_vite+svelte.md +295 -110
  30. package/docs/ko/intlayer_with_svelte_kit.md +738 -0
  31. package/docs/ko/intlayer_with_vite+svelte.md +286 -199
  32. package/docs/pl/intlayer_with_svelte_kit.md +740 -0
  33. package/docs/pl/intlayer_with_vite+svelte.md +273 -101
  34. package/docs/pt/intlayer_with_svelte_kit.md +772 -0
  35. package/docs/pt/intlayer_with_vite+svelte.md +290 -96
  36. package/docs/ru/intlayer_with_svelte_kit.md +738 -0
  37. package/docs/ru/intlayer_with_vite+svelte.md +275 -99
  38. package/docs/tr/intlayer_with_svelte_kit.md +738 -0
  39. package/docs/tr/intlayer_with_vite+svelte.md +297 -119
  40. package/docs/vi/intlayer_with_svelte_kit.md +738 -0
  41. package/docs/vi/intlayer_with_vite+svelte.md +275 -102
  42. package/docs/zh/intlayer_with_svelte_kit.md +738 -0
  43. package/docs/zh/intlayer_with_vite+svelte.md +309 -107
  44. package/package.json +9 -9
  45. package/src/generated/docs.entry.ts +19 -0
@@ -0,0 +1,738 @@
1
+ ---
2
+ createdAt: 2025-11-20
3
+ updatedAt: 2025-11-20
4
+ title: كيفية ترجمة تطبيق SvelteKit الخاص بك – دليل i18n 2025
5
+ description: اكتشف كيفية جعل موقع SvelteKit الخاص بك متعدد اللغات. اتبع الوثائق لتدويل (i18n) وترجمته باستخدام العرض من جانب الخادم (SSR).
6
+ keywords:
7
+ - التدويل
8
+ - الوثائق
9
+ - Intlayer
10
+ - SvelteKit
11
+ - جافا سكريبت
12
+ - SSR
13
+ slugs:
14
+ - doc
15
+ - environment
16
+ - sveltekit
17
+ applicationTemplate: https://github.com/aymericzip/intlayer-sveltekit-template
18
+ history:
19
+ - version: 7.1.10
20
+ date: 2025-11-20
21
+ changes: بدء التاريخ
22
+ ---
23
+
24
+ # ترجمة موقع SvelteKit الخاص بك باستخدام Intlayer | التدويل (i18n)
25
+
26
+ ## جدول المحتويات
27
+
28
+ <TOC/>
29
+
30
+ ## ما هو Intlayer؟
31
+
32
+ **Intlayer** هي مكتبة تدويل (i18n) مبتكرة ومفتوحة المصدر مصممة لتبسيط دعم اللغات المتعددة في تطبيقات الويب الحديثة. تعمل بسلاسة مع قدرات العرض من جانب الخادم (SSR) في **SvelteKit**.
33
+
34
+ مع Intlayer، يمكنك:
35
+
36
+ - **إدارة الترجمات بسهولة** باستخدام قواميس إعلانية على مستوى المكون.
37
+ - **توطين البيانات الوصفية، والمسارات، والمحتوى بشكل ديناميكي**.
38
+ - **ضمان دعم TypeScript** بأنواع مولدة تلقائيًا.
39
+ - **الاستفادة من SSR في SvelteKit** لتدويل صديق لمحركات البحث (SEO).
40
+
41
+ ---
42
+
43
+ ## دليل خطوة بخطوة لإعداد Intlayer في تطبيق SvelteKit
44
+
45
+ <iframe
46
+ src="https://stackblitz.com/github/aymericzip/intlayer-sveltekit-template?embed=1&ctl=1&file=intlayer.config.ts"
47
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
48
+ title="Demo CodeSandbox - Cách quốc tế hóa ứng dụng của bạn bằng Intlayer"
49
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
50
+ loading="lazy"
51
+ />
52
+
53
+ للبدء، أنشئ مشروع SvelteKit جديد. إليك الهيكل النهائي الذي سننشئه:
54
+
55
+ ```bash
56
+ .
57
+ ├── intlayer.config.ts
58
+ ├── package.json
59
+ ├── src
60
+ │ ├── app.d.ts
61
+ │   ├── app.html
62
+ │   ├── hooks.server.ts
63
+ │   ├── lib
64
+ │   │   ├── getLocale.ts
65
+ │   │   ├── LocaleSwitcher.svelte
66
+ │   │   └── LocalizedLink.svelte
67
+ │   ├── params
68
+ │   │   └── locale.ts
69
+ │   └── routes
70
+ │   ├── [[locale=locale]]
71
+ │   │   ├── +layout.svelte
72
+ │   │   ├── +layout.ts
73
+ │   │   ├── +page.svelte
74
+ │   │   ├── +page.ts
75
+ │   │   ├── about
76
+ │   │   │   ├── +page.svelte
77
+ │   │   │   ├── +page.ts
78
+ │   │   │   └── page.content.ts
79
+ │   │   ├── Counter.content.ts
80
+ │   │   ├── Counter.svelte
81
+ │   │   ├── Header.content.ts
82
+ │   │   ├── Header.svelte
83
+ │   │   ├── home.content.ts
84
+ │   │   └── layout.content.ts
85
+ │   ├── +layout.svelte
86
+ │   └── layout.css
87
+ ├── static
88
+ │   ├── favicon.svg
89
+ │   └── robots.txt
90
+ ├── svelte.config.js
91
+ ├── tsconfig.json
92
+ └── vite.config.ts
93
+ ```
94
+
95
+ ### الخطوة 1: تثبيت التبعيات
96
+
97
+ قم بتثبيت الحزم اللازمة باستخدام npm:
98
+
99
+ ```bash packageManager="npm"
100
+ npm install intlayer svelte-intlayer
101
+ npm install vite-intlayer --save-dev
102
+ ```
103
+
104
+ ```bash packageManager="pnpm"
105
+ pnpm add intlayer svelte-intlayer
106
+ pnpm add vite-intlayer --save-dev
107
+ ```
108
+
109
+ ```bash packageManager="yarn"
110
+ yarn add intlayer svelte-intlayer
111
+ yarn add vite-intlayer --save-dev
112
+ ```
113
+
114
+ ```bash packageManager="bun"
115
+ bun add intlayer svelte-intlayer
116
+ bun add vite-intlayer --save-dev
117
+ ```
118
+
119
+ - **intlayer**: الحزمة الأساسية للترجمة الدولية (i18n).
120
+ - **svelte-intlayer**: يوفر موفري السياق والمخازن لـ Svelte/SvelteKit.
121
+ - **vite-intlayer**: إضافة Vite لدمج إعلانات المحتوى مع عملية البناء.
122
+
123
+ ### الخطوة 2: تكوين مشروعك
124
+
125
+ قم بإنشاء ملف تكوين في جذر مشروعك:
126
+
127
+ ```typescript fileName="intlayer.config.ts"
128
+ import { Locales, type IntlayerConfig } from "intlayer";
129
+
130
+ const config: IntlayerConfig = {
131
+ internationalization: {
132
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
133
+ defaultLocale: Locales.ENGLISH,
134
+ },
135
+ };
136
+
137
+ export default config;
138
+ ```
139
+
140
+ ### الخطوة 3: دمج Intlayer في تكوين Vite الخاص بك
141
+
142
+ قم بتحديث ملف `vite.config.ts` الخاص بك ليشمل إضافة Intlayer. تتولى هذه الإضافة تحويل ملفات المحتوى الخاصة بك.
143
+
144
+ ```typescript fileName="vite.config.ts"
145
+ import { sveltekit } from "@sveltejs/kit/vite";
146
+ import { defineConfig } from "vite";
147
+ import { intlayer } from "vite-intlayer";
148
+
149
+ export default defineConfig({
150
+ plugins: [intlayer(), sveltekit()], // ترتيب الإضافات مهم، يجب وضع Intlayer قبل SvelteKit
151
+ });
152
+ ```
153
+
154
+ ### الخطوة 4: إعلان المحتوى الخاص بك
155
+
156
+ قم بإنشاء ملفات إعلان المحتوى في أي مكان داخل مجلد `src` الخاص بك (مثلًا، `src/lib/content` أو بجانب مكوناتك). تقوم هذه الملفات بتعريف المحتوى القابل للترجمة لتطبيقك باستخدام دالة `t()` لكل لغة.
157
+
158
+ ```ts fileName="src/features/hero/hero.content.ts" contentDeclarationFormat="typescript"
159
+ import { t, type Dictionary } from "intlayer";
160
+
161
+ const heroContent = {
162
+ key: "hero-section",
163
+ content: {
164
+ title: t({
165
+ en: "Welcome to SvelteKit",
166
+ fr: "Bienvenue sur SvelteKit",
167
+ es: "Bienvenido a SvelteKit",
168
+ }),
169
+ },
170
+ } satisfies Dictionary;
171
+
172
+ export default heroContent;
173
+ ```
174
+
175
+ ### الخطوة 5: استخدام Intlayer في مكوناتك
176
+
177
+ الآن يمكنك استخدام دالة `useIntlayer` في أي مكون Svelte. فهي تُرجع مخزنًا تفاعليًا يتم تحديثه تلقائيًا عند تغيير اللغة. ستلتزم الدالة تلقائيًا باللغة الحالية (سواء أثناء SSR أو التنقل على جانب العميل).
178
+
179
+ > **ملاحظة:** تُرجع `useIntlayer` مخزن Svelte، لذا تحتاج إلى استخدام بادئة `---
180
+ > createdAt: 2025-11-20
181
+ > updatedAt: 2025-11-20
182
+ > title: كيفية ترجمة تطبيق SvelteKit الخاص بك – دليل i18n 2025
183
+ > description: اكتشف كيفية جعل موقع SvelteKit الخاص بك متعدد اللغات. اتبع الوثائق لتدويل (i18n) وترجمته باستخدام العرض من جانب الخادم (SSR).
184
+ > keywords:
185
+
186
+ - التدويل
187
+ - الوثائق
188
+ - Intlayer
189
+ - SvelteKit
190
+ - جافا سكريبت
191
+ - SSR
192
+ slugs:
193
+ - doc
194
+ - environment
195
+ - sveltekit
196
+ applicationTemplate: https://github.com/aymericzip/intlayer-sveltekit-template
197
+ history:
198
+ - version: 7.1.10
199
+ date: 2025-11-20
200
+ changes: بدء التاريخ
201
+
202
+ ---
203
+
204
+ # ترجمة موقع SvelteKit الخاص بك باستخدام Intlayer | التدويل (i18n)
205
+
206
+ ## جدول المحتويات
207
+
208
+ <TOC/>
209
+
210
+ ## ما هو Intlayer؟
211
+
212
+ **Intlayer** هي مكتبة تدويل (i18n) مبتكرة ومفتوحة المصدر مصممة لتبسيط دعم اللغات المتعددة في تطبيقات الويب الحديثة. تعمل بسلاسة مع قدرات العرض من جانب الخادم (SSR) في **SvelteKit**.
213
+
214
+ مع Intlayer، يمكنك:
215
+
216
+ - **إدارة الترجمات بسهولة** باستخدام قواميس إعلانية على مستوى المكون.
217
+ - **توطين البيانات الوصفية، والمسارات، والمحتوى بشكل ديناميكي**.
218
+ - **ضمان دعم TypeScript** بأنواع مولدة تلقائيًا.
219
+ - **الاستفادة من SSR في SvelteKit** لتدويل صديق لمحركات البحث (SEO).
220
+
221
+ ---
222
+
223
+ ## دليل خطوة بخطوة لإعداد Intlayer في تطبيق SvelteKit
224
+
225
+ للبدء، أنشئ مشروع SvelteKit جديد. إليك الهيكل النهائي الذي سننشئه:
226
+
227
+ ```bash
228
+ .
229
+ ├── intlayer.config.ts
230
+ ├── package.json
231
+ ├── src
232
+ │ ├── app.d.ts
233
+ │   ├── app.html
234
+ │   ├── hooks.server.ts
235
+ │   ├── lib
236
+ │   │   ├── getLocale.ts
237
+ │   │   ├── LocaleSwitcher.svelte
238
+ │   │   └── LocalizedLink.svelte
239
+ │   ├── params
240
+ │   │   └── locale.ts
241
+ │   └── routes
242
+ │   ├── [[locale=locale]]
243
+ │   │   ├── +layout.svelte
244
+ │   │   ├── +layout.ts
245
+ │   │   ├── +page.svelte
246
+ │   │   ├── +page.ts
247
+ │   │   ├── about
248
+ │   │   │   ├── +page.svelte
249
+ │   │   │   ├── +page.ts
250
+ │   │   │   └── page.content.ts
251
+ │   │   ├── Counter.content.ts
252
+ │   │   ├── Counter.svelte
253
+ │   │   ├── Header.content.ts
254
+ │   │   ├── Header.svelte
255
+ │   │   ├── home.content.ts
256
+ │   │   └── layout.content.ts
257
+ │   ├── +layout.svelte
258
+ │   └── layout.css
259
+ ├── static
260
+ │   ├── favicon.svg
261
+ │   └── robots.txt
262
+ ├── svelte.config.js
263
+ ├── tsconfig.json
264
+ └── vite.config.ts
265
+ ```
266
+
267
+ ### الخطوة 1: تثبيت التبعيات
268
+
269
+ قم بتثبيت الحزم اللازمة باستخدام npm:
270
+
271
+ ```bash packageManager="npm"
272
+ npm install intlayer svelte-intlayer
273
+ npm install vite-intlayer --save-dev
274
+ ```
275
+
276
+ ```bash packageManager="pnpm"
277
+ pnpm add intlayer svelte-intlayer
278
+ pnpm add vite-intlayer --save-dev
279
+ ```
280
+
281
+ ```bash packageManager="yarn"
282
+ yarn add intlayer svelte-intlayer
283
+ yarn add vite-intlayer --save-dev
284
+ ```
285
+
286
+ ```bash packageManager="bun"
287
+ bun add intlayer svelte-intlayer
288
+ bun add vite-intlayer --save-dev
289
+ ```
290
+
291
+ - **intlayer**: الحزمة الأساسية للترجمة الدولية (i18n).
292
+ - **svelte-intlayer**: يوفر موفري السياق والمخازن لـ Svelte/SvelteKit.
293
+ - **vite-intlayer**: إضافة Vite لدمج إعلانات المحتوى مع عملية البناء.
294
+
295
+ ### الخطوة 2: تكوين مشروعك
296
+
297
+ قم بإنشاء ملف تكوين في جذر مشروعك:
298
+
299
+ ```typescript fileName="intlayer.config.ts"
300
+ import { Locales, type IntlayerConfig } from "intlayer";
301
+
302
+ const config: IntlayerConfig = {
303
+ internationalization: {
304
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
305
+ defaultLocale: Locales.ENGLISH,
306
+ },
307
+ };
308
+
309
+ export default config;
310
+ ```
311
+
312
+ ### الخطوة 3: دمج Intlayer في تكوين Vite الخاص بك
313
+
314
+ قم بتحديث ملف `vite.config.ts` الخاص بك ليشمل إضافة Intlayer. تتولى هذه الإضافة تحويل ملفات المحتوى الخاصة بك.
315
+
316
+ ```typescript fileName="vite.config.ts"
317
+ import { sveltekit } from "@sveltejs/kit/vite";
318
+ import { defineConfig } from "vite";
319
+ import { intlayer } from "vite-intlayer";
320
+
321
+ export default defineConfig({
322
+ plugins: [intlayer(), sveltekit()], // ترتيب الإضافات مهم، يجب وضع Intlayer قبل SvelteKit
323
+ });
324
+ ```
325
+
326
+ ### الخطوة 4: إعلان المحتوى الخاص بك
327
+
328
+ قم بإنشاء ملفات إعلان المحتوى في أي مكان داخل مجلد `src` الخاص بك (مثلًا، `src/lib/content` أو بجانب مكوناتك). تقوم هذه الملفات بتعريف المحتوى القابل للترجمة لتطبيقك باستخدام دالة `t()` لكل لغة.
329
+
330
+ ```ts fileName="src/features/hero/hero.content.ts" contentDeclarationFormat="typescript"
331
+ import { t, type Dictionary } from "intlayer";
332
+
333
+ const heroContent = {
334
+ key: "hero-section",
335
+ content: {
336
+ title: t({
337
+ en: "Welcome to SvelteKit",
338
+ fr: "Bienvenue sur SvelteKit",
339
+ es: "Bienvenido a SvelteKit",
340
+ }),
341
+ },
342
+ } satisfies Dictionary;
343
+
344
+ export default heroContent;
345
+ ```
346
+
347
+ ### الخطوة 5: استخدام Intlayer في مكوناتك
348
+
349
+ للوصول إلى قيمته التفاعلية (مثلًا، `$content.title`).
350
+
351
+ ```svelte fileName="src/lib/components/Component.svelte"
352
+ <script lang="ts">
353
+ import { useIntlayer } from "svelte-intlayer";
354
+
355
+ // "hero-section" تتوافق مع المفتاح المُعرف في الخطوة 4
356
+ const content = useIntlayer("hero-section");
357
+ </script>
358
+
359
+ <!-- عرض المحتوى كمحتوى بسيط -->
360
+ <h1>{$content.title}</h1>
361
+ <!-- لعرض المحتوى قابل للتحرير باستخدام المحرر -->
362
+ <h1><svelte:component this={$content.title} /></h1>
363
+ <!-- لعرض المحتوى كنص -->
364
+ <div aria-label={$content.title.value}></div>
365
+ ```
366
+
367
+ ### (اختياري) الخطوة 6: إعداد التوجيه
368
+
369
+ توضح الخطوات التالية كيفية إعداد التوجيه بناءً على اللغة في SvelteKit. يتيح هذا لعناوين URL الخاصة بك أن تتضمن بادئة اللغة (مثل `/en/about`، `/fr/about`) لتحسين تحسين محركات البحث وتجربة المستخدم.
370
+
371
+ ```bash
372
+ .
373
+ └─── src
374
+ ├── app.d.ts # تعريف نوع اللغة
375
+ ├── hooks.server.ts # إدارة توجيه اللغة
376
+ ├── lib
377
+ │   └── getLocale.ts # التحقق من اللغة من الهيدر أو الكوكيز
378
+ ├── params
379
+ │   └── locale.ts # تعريف معامل اللغة
380
+ └── routes
381
+ ├── [[locale=locale]] # تغليف في مجموعة مسارات لتعيين اللغة
382
+ │   ├── +layout.svelte # التخطيط المحلي للمسار
383
+ │   ├── +layout.ts
384
+ │   ├── +page.svelte
385
+ │   ├── +page.ts
386
+ │   └── about
387
+ │      ├── +page.svelte
388
+ │      └── +page.ts
389
+ └── +layout.svelte # التخطيط الجذري للخطوط والأنماط العامة
390
+ ```
391
+
392
+ ### الخطوة 7: التعامل مع اكتشاف اللغة على جانب الخادم (Hooks)
393
+
394
+ في SvelteKit، يحتاج الخادم إلى معرفة لغة المستخدم لعرض المحتوى الصحيح أثناء العرض من جانب الخادم (SSR). نستخدم `hooks.server.ts` لاكتشاف اللغة من عنوان URL أو ملفات تعريف الارتباط.
395
+
396
+ قم بإنشاء أو تعديل الملف `src/hooks.server.ts`:
397
+
398
+ ```typescript fileName="src/hooks.server.ts"
399
+ import type { Handle } from "@sveltejs/kit";
400
+ import { getLocalizedUrl } from "intlayer";
401
+ import { getLocale } from "$lib/getLocale";
402
+
403
+ export const handle: Handle = async ({ event, resolve }) => {
404
+ const detectedLocale = getLocale(event);
405
+
406
+ // تحقق مما إذا كان المسار الحالي يبدأ بالفعل بلغة (مثل /fr، /en)
407
+ const pathname = event.url.pathname;
408
+ const targetPathname = getLocalizedUrl(pathname, detectedLocale);
409
+
410
+ // إذا لم تكن هناك لغة في عنوان URL (مثل زيارة المستخدم لـ "/")، قم بإعادة توجيههم
411
+ if (targetPathname !== pathname) {
412
+ return new Response(undefined, {
413
+ headers: { Location: targetPathname },
414
+ status: 307, // إعادة توجيه مؤقتة
415
+ });
416
+ }
417
+
418
+ return resolve(event, {
419
+ transformPageChunk: ({ html }) => html.replace("%lang%", detectedLocale),
420
+ });
421
+ };
422
+ ```
423
+
424
+ ثم، أنشئ مساعدًا للحصول على لغة المستخدم من حدث الطلب:
425
+
426
+ ```typescript fileName="src/lib/getLocale.ts"
427
+ import {
428
+ configuration,
429
+ getLocaleFromStorage,
430
+ localeDetector,
431
+ type Locale,
432
+ } from "intlayer";
433
+ import type { RequestEvent } from "@sveltejs/kit";
434
+
435
+ /**
436
+ * الحصول على لغة المستخدم من حدث الطلب.
437
+ * تُستخدم هذه الدالة في الخطاف `handle` في الملف `src/hooks.server.ts`.
438
+ *
439
+ * تحاول أولاً الحصول على اللغة من تخزين Intlayer (الكوكيز أو رؤوس مخصصة).
440
+ * إذا لم يتم العثور على اللغة، تعود إلى تفاوض "Accept-Language" الخاص بالمتصفح.
441
+ *
442
+ * @param event - حدث الطلب من SvelteKit
443
+ * @returns لغة المستخدم
444
+ */
445
+ export const getLocale = (event: RequestEvent): Locale => {
446
+ const defaultLocale = configuration?.internationalization?.defaultLocale;
447
+
448
+ // محاولة الحصول على اللغة من تخزين Intlayer (الكوكيز أو الرؤوس)
449
+ const storedLocale = getLocaleFromStorage({
450
+ // الوصول إلى ملفات تعريف الارتباط في SvelteKit
451
+ getCookie: (name: string) => event.cookies.get(name) ?? null,
452
+ // الوصول إلى رؤوس الطلب في SvelteKit
453
+ getHeader: (name: string) => event.request.headers.get(name) ?? null,
454
+ });
455
+
456
+ if (storedLocale) {
457
+ return storedLocale;
458
+ }
459
+
460
+ // الرجوع إلى تفاوض "Accept-Language" في المتصفح
461
+ const negotiatorHeaders: Record<string, string> = {};
462
+
463
+ // تحويل كائن رؤوس SvelteKit إلى سجل بسيط Record<string, string>
464
+ event.request.headers.forEach((value, key) => {
465
+ negotiatorHeaders[key] = value;
466
+ });
467
+
468
+ // التحقق من اللغة من رأس `Accept-Language`
469
+ const userFallbackLocale = localeDetector(negotiatorHeaders);
470
+
471
+ if (userFallbackLocale) {
472
+ return userFallbackLocale;
473
+ }
474
+
475
+ // إرجاع اللغة الافتراضية إذا لم يتم العثور على تطابق
476
+ return defaultLocale;
477
+ };
478
+ ```
479
+
480
+ > `getLocaleFromStorage` سيتحقق من اللغة من الهيدر أو الكوكي حسب تكوينك. راجع [Configuration](https://intlayer.org/doc/configuration) لمزيد من التفاصيل.
481
+
482
+ > دالة `localeDetector` ستتعامل مع هيدر `Accept-Language` وتعيد أفضل تطابق.
483
+
484
+ إذا لم يتم تكوين اللغة، نريد إرجاع خطأ 404. لجعل الأمر أسهل، يمكننا إنشاء دالة `match` للتحقق مما إذا كانت اللغة صالحة:
485
+
486
+ ```ts fileName="/src/params/locale.ts"
487
+ import { configuration, type Locale } from "intlayer";
488
+
489
+ export const match = (
490
+ param: Locale = configuration.internationalization.defaultLocale
491
+ ): boolean => {
492
+ return configuration.internationalization.locales.includes(param);
493
+ };
494
+ ```
495
+
496
+ > **ملاحظة:** تأكد من أن ملف `src/app.d.ts` الخاص بك يتضمن تعريف اللغة:
497
+ >
498
+ > ```typescript
499
+ > declare global {
500
+ > namespace App {
501
+ > interface Locals {
502
+ > locale: import("intlayer").Locale;
503
+ > }
504
+ > }
505
+ > }
506
+ > ```
507
+
508
+ بالنسبة لملف `+layout.svelte`، يمكننا إزالة كل شيء، للاحتفاظ فقط بالمحتوى الثابت، غير المرتبط بالتدويل (i18n):
509
+
510
+ ```svelte fileName="src/+layout.svelte"
511
+ <script lang="ts">
512
+ import './layout.css';
513
+
514
+ let { children } = $props();
515
+ </script>
516
+
517
+ <div class="app">
518
+ {@render children()}
519
+ </div>
520
+
521
+ <style>
522
+ .app {
523
+ /* */
524
+ }
525
+ </style>
526
+ ```
527
+
528
+ ثم، أنشئ صفحة وتخطيط جديد تحت مجموعة `[[locale=locale]]`:
529
+
530
+ ```ts fileName="src/routes/[[locale=locale]]/+layout.ts"
531
+ import type { Load } from "@sveltejs/kit";
532
+ import { configuration, type Locale } from "intlayer";
533
+
534
+ export const prerender = true;
535
+
536
+ // استخدم النوع العام Load
537
+ export const load: Load = ({ params }) => {
538
+ const locale: Locale =
539
+ (params.locale as Locale) ??
540
+ configuration.internationalization.defaultLocale;
541
+
542
+ return {
543
+ locale,
544
+ };
545
+ };
546
+ ```
547
+
548
+ ```svelte fileName="src/routes/[[locale=locale]]/+layout.svelte"
549
+ <script lang="ts">
550
+ import type { Snippet } from 'svelte';
551
+ import { useIntlayer, setupIntlayer } from 'svelte-intlayer';
552
+ import Header from './Header.svelte';
553
+ import type { LayoutData } from './$types';
554
+
555
+ let { children, data }: { children: Snippet, data: LayoutData } = $props();
556
+
557
+ // تهيئة Intlayer باستخدام اللغة من المسار
558
+ setupIntlayer(data.locale);
559
+
560
+ // استخدام قاموس محتوى التخطيط
561
+ const layoutContent = useIntlayer('layout');
562
+ </script>
563
+
564
+ <Header />
565
+
566
+ <main>
567
+ {@render children()}
568
+ </main>
569
+
570
+ <footer>
571
+ <p>
572
+ {$layoutContent.footer.prefix.value}{' '}
573
+ <a href="https://svelte.dev/docs/kit">{$layoutContent.footer.linkLabel.value}</a>{' '}
574
+ {$layoutContent.footer.suffix.value}
575
+ </p>
576
+ </footer>
577
+
578
+ <style>
579
+ /* */
580
+ </style>
581
+ ```
582
+
583
+ ```ts fileName="src/routes/[[locale=locale]]/+page.ts"
584
+ export const prerender = true;
585
+ ```
586
+
587
+ ```svelte fileName="src/routes/[[locale=locale]]/+page.svelte"
588
+ <script lang="ts">
589
+ import { useIntlayer } from 'svelte-intlayer';
590
+
591
+ // استخدم قاموس محتوى الصفحة الرئيسية
592
+ const homeContent = useIntlayer('home');
593
+ </script>
594
+
595
+ <svelte:head>
596
+ <title>{$homeContent.title.value}</title>
597
+ </svelte:head>
598
+
599
+ <section>
600
+ <h1>
601
+ {$homeContent.title}
602
+ </h1>
603
+ </section>
604
+
605
+ <style>
606
+ /* */
607
+ </style>
608
+ ```
609
+
610
+ ### (اختياري) الخطوة 8: الروابط الدولية
611
+
612
+ من أجل تحسين محركات البحث (SEO)، يُنصح بإضافة بادئة اللغة إلى مساراتك (على سبيل المثال، `/en/about`، `/fr/about`). يقوم هذا المكون تلقائيًا بإضافة بادئة اللغة الحالية لأي رابط.
613
+
614
+ ```svelte fileName="src/lib/components/LocalizedLink.svelte"
615
+ <script lang="ts">
616
+ import { getLocalizedUrl } from "intlayer";
617
+ import { useLocale } from 'svelte-intlayer';
618
+
619
+ let { href = "" } = $props();
620
+ const { locale } = useLocale();
621
+
622
+ // مساعد لإضافة بادئة اللغة إلى عنوان URL الحالي
623
+ $: localizedHref = getLocalizedUrl(href, $locale);
624
+ </script>
625
+
626
+ <a href={localizedHref}>
627
+ <slot />
628
+ </a>
629
+ ```
630
+
631
+ إذا كنت تستخدم `goto` من SvelteKit، يمكنك استخدام نفس المنطق مع `getLocalizedUrl` للتنقل إلى عنوان URL المحلي:
632
+
633
+ ```typescript
634
+ import { goto } from "$app/navigation";
635
+ import { getLocalizedUrl } from "intlayer";
636
+ import { useLocale } from "svelte-intlayer";
637
+
638
+ const { locale } = useLocale();
639
+ const localizedPath = getLocalizedUrl("/about", $locale);
640
+ goto(localizedPath); // ينتقل إلى /en/about أو /fr/about حسب اللغة
641
+ ```
642
+
643
+ ### (اختياري) الخطوة 9: مبدل اللغة
644
+
645
+ للسماح للمستخدمين بتغيير اللغة، قم بتحديث عنوان URL.
646
+
647
+ ```svelte fileName="src/lib/components/LanguageSwitcher.svelte"
648
+ <script lang="ts">
649
+ import { getLocalizedUrl, getLocaleName } from 'intlayer';
650
+ import { useLocale } from 'svelte-intlayer';
651
+ import { page } from '$app/stores';
652
+ import { goto } from '$app/navigation';
653
+
654
+ const { locale, setLocale, availableLocales } = useLocale({
655
+ onLocaleChange: (newLocale) => {
656
+ const localizedPath = getLocalizedUrl($page.url.pathname, newLocale);
657
+ goto(localizedPath);
658
+ },
659
+ });
660
+ </script>
661
+
662
+ <ul class="locale-list">
663
+ {#each availableLocales as localeEl}
664
+ <li>
665
+ <a
666
+ href={getLocalizedUrl($page.url.pathname, localeEl)}
667
+ onclick={(e) => {
668
+ e.preventDefault();
669
+ setLocale(localeEl); // سيقوم بتعيين اللغة في المتجر وتفعيل onLocaleChange
670
+ }}
671
+ class:active={$locale === localeEl}
672
+ >
673
+ {getLocaleName(localeEl)}
674
+ </a>
675
+ </li>
676
+ {/each}
677
+ </ul>
678
+
679
+ <style>
680
+ /* */
681
+ </style>
682
+ ```
683
+
684
+ ### (اختياري) الخطوة 10: إضافة وكيل خلفي (backend proxy)
685
+
686
+ لإضافة وكيل خلفي إلى تطبيق SvelteKit الخاص بك، يمكنك استخدام دالة `intlayerProxy` المقدمة من إضافة `vite-intlayer`. ستقوم هذه الإضافة بالكشف تلقائيًا عن أفضل لغة للمستخدم بناءً على عنوان URL، والكوكيز، وتفضيلات لغة المتصفح.
687
+
688
+ ```ts fileName="vite.config.ts"
689
+ import { defineConfig } from "vite";
690
+ import { intlayer, intlayerProxy } from "vite-intlayer";
691
+ import { sveltekit } from "@sveltejs/kit/vite";
692
+
693
+ // https://vitejs.dev/config/
694
+ export default defineConfig({
695
+ plugins: [intlayer(), intlayerProxy(), sveltekit()],
696
+ });
697
+ ```
698
+
699
+ ### (اختياري) الخطوة 11: إعداد محرر / نظام إدارة محتوى intlayer
700
+
701
+ لإعداد محرر intlayer، يجب عليك اتباع [توثيق محرر intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_visual_editor.md).
702
+
703
+ لإعداد نظام إدارة محتوى intlayer، يجب عليك اتباع [توثيق نظام إدارة محتوى intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_CMS.md).
704
+
705
+ لكي تتمكن من عرض محدد محرر intlayer، سيتعين عليك استخدام بناء جملة المكون في محتوى intlayer الخاص بك.
706
+
707
+ ```svelte fileName="Component.svelte"
708
+ <script lang="ts">
709
+ import { useIntlayer } from "svelte-intlayer";
710
+
711
+ const content = useIntlayer("component");
712
+ </script>
713
+
714
+ <div>
715
+
716
+ <!-- عرض المحتوى كمحتوى بسيط -->
717
+ <h1>{$content.title}</h1>
718
+
719
+ <!-- عرض المحتوى كمكون (مطلوب من قبل المحرر) -->
720
+ <svelte:component this={$content.component} />
721
+ </div>
722
+ ```
723
+
724
+ ### إعدادات Git
725
+
726
+ يوصى بتجاهل الملفات التي يتم إنشاؤها بواسطة Intlayer.
727
+
728
+ ```plaintext fileName=".gitignore"
729
+ # تجاهل الملفات التي تم إنشاؤها بواسطة Intlayer
730
+ .intlayer
731
+ ```
732
+
733
+ ---
734
+
735
+ ### التعمق أكثر
736
+
737
+ - **المحرر المرئي**: دمج [المحرر المرئي لـ Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_visual_editor.md) لتحرير الترجمات مباشرة من واجهة المستخدم.
738
+ - **نظام إدارة المحتوى (CMS)**: قم بفصل إدارة المحتوى الخاصة بك باستخدام [نظام إدارة المحتوى Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_CMS.md).