@intlayer/docs 5.8.0-canary.0 → 5.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/intlayer_with_next-i18next.md +2 -2
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +96 -219
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +88 -129
- package/blog/ar/vue-i18n_vs_intlayer.md +268 -0
- package/blog/de/intlayer_with_next-i18next.md +2 -2
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/de/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/de/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en/intlayer_with_next-i18next.md +2 -2
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +89 -220
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +85 -123
- package/blog/en/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en-GB/intlayer_with_next-i18next.md +2 -2
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +85 -218
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +80 -130
- package/blog/en-GB/vue-i18n_vs_intlayer.md +258 -0
- package/blog/es/intlayer_with_next-i18next.md +2 -2
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/es/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/es/vue-i18n_vs_intlayer.md +268 -0
- package/blog/fr/intlayer_with_next-i18next.md +2 -2
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/fr/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/fr/vue-i18n_vs_intlayer.md +269 -0
- package/blog/hi/intlayer_with_next-i18next.md +2 -2
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +97 -220
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/hi/vue-i18n_vs_intlayer.md +268 -0
- package/blog/it/intlayer_with_next-i18next.md +2 -2
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/it/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ja/intlayer_with_next-i18next.md +2 -2
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ja/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ko/intlayer_with_next-i18next.md +2 -2
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +95 -217
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/ko/vue-i18n_vs_intlayer.md +268 -0
- package/blog/pt/intlayer_with_next-i18next.md +2 -2
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/pt/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/pt/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ru/intlayer_with_next-i18next.md +2 -2
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +94 -217
- package/blog/ru/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ru/vue-i18n_vs_intlayer.md +268 -0
- package/blog/zh/intlayer_with_next-i18next.md +2 -2
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/zh/vue-i18n_vs_intlayer.md +269 -0
- package/dist/cjs/generated/blog.entry.cjs +41 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +41 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/docs/ar/formatters.md +417 -31
- package/docs/ar/how_works_intlayer.md +2 -4
- package/docs/ar/interest_of_intlayer.md +7 -10
- package/docs/ar/intlayer_CMS.md +2 -3
- package/docs/ar/intlayer_visual_editor.md +2 -3
- package/docs/ar/intlayer_with_tanstack.md +1 -1
- package/docs/ar/introduction.md +4 -4
- package/docs/de/formatters.md +444 -34
- package/docs/de/introduction.md +2 -2
- package/docs/en/dictionary/enumeration.md +2 -2
- package/docs/en/dictionary/function_fetching.md +2 -2
- package/docs/en/dictionary/get_started.md +2 -2
- package/docs/en/dictionary/translation.md +2 -2
- package/docs/en/formatters.md +383 -15
- package/docs/en/how_works_intlayer.md +2 -4
- package/docs/en/interest_of_intlayer.md +40 -29
- package/docs/en/intlayer_CMS.md +2 -3
- package/docs/en/intlayer_visual_editor.md +2 -3
- package/docs/en/intlayer_with_create_react_app.md +2 -2
- package/docs/en/intlayer_with_express.md +2 -2
- package/docs/en/intlayer_with_tanstack.md +1 -1
- package/docs/en/introduction.md +4 -4
- package/docs/en/packages/express-intlayer/index.md +2 -2
- package/docs/en/packages/intlayer/getConfiguration.md +2 -3
- package/docs/en/packages/intlayer/getEnumeration.md +2 -7
- package/docs/en/packages/intlayer/getHTMLTextDir.md +2 -4
- package/docs/en/packages/intlayer/getLocaleLang.md +2 -4
- package/docs/en/packages/intlayer/getLocaleName.md +2 -3
- package/docs/en/packages/intlayer/getLocalizedUrl.md +2 -8
- package/docs/en/packages/intlayer/getMultilingualUrls.md +2 -7
- package/docs/en/packages/intlayer/getPathWithoutLocale.md +2 -3
- package/docs/en/packages/intlayer/getTranslation.md +2 -4
- package/docs/en/packages/intlayer/index.md +2 -2
- package/docs/en/packages/next-intlayer/index.md +2 -2
- package/docs/en/packages/next-intlayer/t.md +2 -2
- package/docs/en/packages/next-intlayer/useDictionary.md +2 -2
- package/docs/en/packages/next-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/next-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-intlayer/index.md +2 -2
- package/docs/en/packages/react-intlayer/t.md +2 -2
- package/docs/en/packages/react-intlayer/useI18n.md +2 -2
- package/docs/en/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/react-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-scripts-intlayer/index.md +2 -2
- package/docs/en/packages/solid-intlayer/index.md +2 -2
- package/docs/en/packages/vite-intlayer/index.md +2 -2
- package/docs/en-GB/formatters.md +402 -16
- package/docs/en-GB/how_works_intlayer.md +2 -4
- package/docs/en-GB/interest_of_intlayer.md +7 -10
- package/docs/en-GB/intlayer_with_tanstack.md +1 -1
- package/docs/en-GB/introduction.md +2 -2
- package/docs/es/formatters.md +438 -28
- package/docs/es/how_works_intlayer.md +2 -4
- package/docs/es/interest_of_intlayer.md +7 -10
- package/docs/es/intlayer_with_tanstack.md +1 -1
- package/docs/es/introduction.md +2 -2
- package/docs/fr/formatters.md +438 -28
- package/docs/fr/how_works_intlayer.md +2 -4
- package/docs/fr/interest_of_intlayer.md +7 -10
- package/docs/fr/intlayer_with_tanstack.md +1 -1
- package/docs/fr/introduction.md +2 -2
- package/docs/hi/formatters.md +430 -39
- package/docs/hi/how_works_intlayer.md +2 -4
- package/docs/hi/interest_of_intlayer.md +7 -10
- package/docs/hi/intlayer_with_tanstack.md +1 -1
- package/docs/hi/introduction.md +2 -2
- package/docs/it/formatters.md +438 -30
- package/docs/it/how_works_intlayer.md +2 -4
- package/docs/it/interest_of_intlayer.md +7 -10
- package/docs/it/intlayer_with_tanstack.md +1 -1
- package/docs/it/introduction.md +2 -2
- package/docs/ja/formatters.md +435 -47
- package/docs/ja/how_works_intlayer.md +2 -4
- package/docs/ja/interest_of_intlayer.md +7 -10
- package/docs/ja/intlayer_with_tanstack.md +1 -1
- package/docs/ja/introduction.md +2 -2
- package/docs/ko/formatters.md +432 -41
- package/docs/ko/how_works_intlayer.md +2 -4
- package/docs/ko/interest_of_intlayer.md +7 -10
- package/docs/ko/intlayer_with_tanstack.md +1 -1
- package/docs/ko/introduction.md +2 -2
- package/docs/pt/formatters.md +416 -30
- package/docs/pt/how_works_intlayer.md +2 -4
- package/docs/pt/intlayer_with_tanstack.md +1 -1
- package/docs/pt/introduction.md +2 -2
- package/docs/ru/autoFill.md +2 -2
- package/docs/ru/configuration.md +1 -40
- package/docs/ru/formatters.md +438 -28
- package/docs/ru/how_works_intlayer.md +5 -7
- package/docs/ru/index.md +1 -1
- package/docs/ru/interest_of_intlayer.md +8 -11
- package/docs/ru/intlayer_CMS.md +7 -8
- package/docs/ru/intlayer_cli.md +4 -7
- package/docs/ru/intlayer_visual_editor.md +5 -6
- package/docs/ru/intlayer_with_angular.md +1 -1
- package/docs/ru/intlayer_with_create_react_app.md +5 -5
- package/docs/ru/intlayer_with_lynx+react.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +3 -3
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +1 -1
- package/docs/ru/intlayer_with_react_native+expo.md +2 -2
- package/docs/ru/intlayer_with_tanstack.md +3 -3
- package/docs/ru/intlayer_with_vite+preact.md +3 -3
- package/docs/ru/intlayer_with_vite+react.md +3 -3
- package/docs/ru/intlayer_with_vite+solid.md +1 -1
- package/docs/ru/intlayer_with_vite+svelte.md +1 -1
- package/docs/ru/intlayer_with_vite+vue.md +2 -2
- package/docs/ru/introduction.md +5 -5
- package/docs/ru/locale_mapper.md +1 -1
- package/docs/ru/packages/@intlayer/api/index.md +2 -2
- package/docs/ru/packages/@intlayer/chokidar/index.md +1 -1
- package/docs/ru/packages/@intlayer/cli/index.md +2 -2
- package/docs/ru/packages/@intlayer/config/index.md +2 -2
- package/docs/ru/packages/@intlayer/core/index.md +2 -2
- package/docs/ru/packages/@intlayer/design-system/index.md +2 -2
- package/docs/ru/packages/@intlayer/dictionary-entry/index.md +2 -2
- package/docs/ru/packages/@intlayer/editor/index.md +1 -1
- package/docs/ru/packages/@intlayer/editor-react/index.md +1 -1
- package/docs/ru/packages/@intlayer/webpack/index.md +1 -1
- package/docs/ru/packages/angular-intlayer/index.md +1 -1
- package/docs/ru/packages/express-intlayer/index.md +3 -3
- package/docs/ru/packages/express-intlayer/t.md +1 -1
- package/docs/ru/packages/intlayer/getEnumeration.md +3 -8
- package/docs/ru/packages/intlayer/getTranslation.md +3 -5
- package/docs/ru/packages/intlayer/getTranslationContent.md +1 -3
- package/docs/ru/packages/intlayer/index.md +3 -3
- package/docs/ru/packages/intlayer-cli/index.md +1 -1
- package/docs/ru/packages/intlayer-editor/index.md +2 -2
- package/docs/ru/packages/lynx-intlayer/index.md +1 -1
- package/docs/ru/packages/next-intlayer/index.md +4 -4
- package/docs/ru/packages/next-intlayer/t.md +4 -4
- package/docs/ru/packages/next-intlayer/useLocale.md +3 -3
- package/docs/ru/packages/nuxt-intlayer/index.md +1 -1
- package/docs/ru/packages/preact-intlayer/index.md +1 -1
- package/docs/ru/packages/react-intlayer/index.md +4 -4
- package/docs/ru/packages/react-intlayer/t.md +4 -4
- package/docs/ru/packages/react-native-intlayer/index.md +1 -1
- package/docs/ru/packages/react-scripts-intlayer/index.md +3 -3
- package/docs/ru/packages/solid-intlayer/index.md +3 -3
- package/docs/ru/packages/svelte-intlayer/index.md +1 -1
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/packages/vue-intlayer/index.md +1 -1
- package/docs/ru/per_locale_file.md +1 -1
- package/docs/ru/roadmap.md +3 -5
- package/docs/ru/vs_code_extension.md +1 -1
- package/docs/zh/formatters.md +446 -38
- package/docs/zh/how_works_intlayer.md +2 -4
- package/docs/zh/interest_of_intlayer.md +7 -10
- package/docs/zh/intlayer_with_tanstack.md +1 -1
- package/docs/zh/introduction.md +2 -2
- package/frequent_questions/ar/domain_routing.md +1 -1
- package/frequent_questions/en/domain_routing.md +1 -1
- package/frequent_questions/en-GB/domain_routing.md +1 -1
- package/frequent_questions/es/domain_routing.md +1 -1
- package/frequent_questions/fr/domain_routing.md +1 -1
- package/frequent_questions/hi/domain_routing.md +1 -1
- package/frequent_questions/it/domain_routing.md +1 -1
- package/frequent_questions/ko/domain_routing.md +1 -1
- package/frequent_questions/pt/domain_routing.md +1 -1
- package/frequent_questions/ru/domain_routing.md +1 -1
- package/frequent_questions/ru/get_locale_cookie.md +4 -4
- package/frequent_questions/ru/static_rendering.md +1 -2
- package/frequent_questions/zh/domain_routing.md +1 -1
- package/package.json +7 -7
- package/src/generated/blog.entry.ts +41 -0
|
@@ -1,194 +1,153 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-01-02
|
|
3
3
|
updatedAt: 2025-06-29
|
|
4
|
-
title: react-
|
|
5
|
-
description:
|
|
4
|
+
title: react-i18next مقابل react-intl مقابل Intlayer
|
|
5
|
+
description: دمج react-i18next مع next-intl و Intlayer للتدويل (i18n) في تطبيق React
|
|
6
6
|
keywords:
|
|
7
7
|
- next-intl
|
|
8
8
|
- react-i18next
|
|
9
9
|
- Intlayer
|
|
10
10
|
- التدويل
|
|
11
|
-
-
|
|
11
|
+
- مدونة
|
|
12
12
|
- Next.js
|
|
13
|
-
-
|
|
13
|
+
- جافا سكريبت
|
|
14
14
|
- React
|
|
15
15
|
slugs:
|
|
16
16
|
- blog
|
|
17
17
|
- react-i18next-vs-react-intl-vs-intlayer
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
#
|
|
20
|
+
# react-Intl مقابل react-i18next مقابل intlayer | التدويل في React (i18n)
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
تُقارن هذه الدليل بين ثلاثة خيارات معروفة للتدويل (i18n) لـ **React**: **react-intl** (FormatJS)، **react-i18next** (i18next)، و **Intlayer**.
|
|
23
|
+
نركز على تطبيقات **React العادية** (مثل Vite، CRA، SPA). إذا كنت تستخدم Next.js، راجع مقارنة Next.js المخصصة لدينا.
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
## 1. مقدمة
|
|
27
|
-
|
|
28
|
-
يمكن تحقيق التدويل (i18n) في تطبيقات React بعدة طرق. المكتبات الثلاث المقدمة هنا لديها فلسفات تصميم مختلفة، ومجموعات ميزات، ودعم من المجتمع:
|
|
25
|
+
نقوم بتقييم:
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
- البنية والتنظيم المحتوى
|
|
28
|
+
- TypeScript والأمان
|
|
29
|
+
- التعامل مع الترجمات المفقودة
|
|
30
|
+
- المحتوى الغني وقدرات التنسيق
|
|
31
|
+
- الأداء وسلوك التحميل
|
|
32
|
+
- تجربة المطور (DX)، الأدوات والصيانة
|
|
33
|
+
- تحسين محركات البحث/التوجيه (يعتمد على الإطار)
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
> **ملخص**: يمكن لجميع الثلاثة تعريب تطبيق React. إذا كنت تريد **محتوى مخصص للمكون**، **أنواع TypeScript صارمة**، **فحوصات المفاتيح المفقودة أثناء البناء**، **قواميس معزولة بالشجرة (tree-shaken)**، وأدوات تحرير مدمجة (محرر بصري/نظام إدارة المحتوى + ترجمة مدعومة بالذكاء الاصطناعي اختيارية)، فإن **Intlayer** هو الخيار الأكثر تكاملاً لقواعد الشيفرة المعيارية في React.
|
|
35
36
|
|
|
36
37
|
---
|
|
37
38
|
|
|
38
|
-
##
|
|
39
|
-
|
|
40
|
-
### نظرة عامة
|
|
41
|
-
|
|
42
|
-
[**React-Intl**](https://formatjs.io/docs/react-intl/) هو جزء من مجموعة [FormatJS](https://formatjs.io/). يوفر مجموعة قوية من **واجهات برمجة التطبيقات والمكونات** لمعالجة تنسيق الرسائل، الجمع، تاريخ/وقت، وتنسيق الأرقام. يتم استخدام React-Intl على نطاق واسع في التطبيقات المؤسسية، Mainly because it is part of an ecosystem that standardizes message syntax and formatting.
|
|
43
|
-
|
|
44
|
-
### الميزات الرئيسية
|
|
45
|
-
|
|
46
|
-
- **BICU Message Syntax**: يوفر بناء جملة شامل للتداخل الرسائل، الجمع، وأكثر.
|
|
47
|
-
- **التنسيق المحلي**: أدوات مدمجة لتنسيق التواريخ، الأوقات، الأرقام، والأوقات النسبية بناءً على اللغة المحلية.
|
|
48
|
-
- **المكونات الإعلانية**: يكشف عن `<FormattedMessage>`, `<FormattedNumber>`, `<FormattedDate>`، إلخ، للاستخدام السلس في JSX.
|
|
49
|
-
- **إيكوسيستم غني**: يتكامل جيدًا مع أدوات FormatJS (مثل [babel-plugin-react-intl](https://formatjs.io/docs/tooling/babel-plugin/)) لاستخراج الرسائل وإدارتها وتجميعها.
|
|
50
|
-
|
|
51
|
-
### سير العمل النموذجي
|
|
52
|
-
|
|
53
|
-
1. **تعريف كُتيبات الرسائل** (عادةً ملفات JSON لكل لغة محلية).
|
|
54
|
-
2. **لف التطبيق** بـ `<IntlProvider locale="en" messages={messages}>`.
|
|
55
|
-
3. **استخدام** `<FormattedMessage id="myMessage" defaultMessage="Hello world" />` أو استخدام `useIntl()` للوصول إلى سلاسل الترجمة.
|
|
56
|
-
|
|
57
|
-
### المزايا
|
|
58
|
-
|
|
59
|
-
- راسخ للغاية ومستخدم في العديد من بيئات الإنتاج.
|
|
60
|
-
- تنسيق الرسائل المتقدم، بما في ذلك الجمع، الجنس، المناطق الزمنية، وأكثر.
|
|
61
|
-
- دعم أدوات قوي لاستخراج الرسائل وتجميعها.
|
|
62
|
-
|
|
63
|
-
### العيوب
|
|
39
|
+
## التموقع على مستوى عالٍ
|
|
64
40
|
|
|
65
|
-
-
|
|
66
|
-
-
|
|
41
|
+
- **react-intl** - تنسيق يركز على ICU ومتوافق مع المعايير (تواريخ/أرقام/جمع) مع واجهة برمجة تطبيقات ناضجة. عادةً ما تكون الكتالوجات مركزية؛ سلامة المفاتيح والتحقق أثناء وقت البناء تقع إلى حد كبير على عاتقك.
|
|
42
|
+
- **react-i18next** - شائع للغاية ومرن؛ يدعم المساحات الاسمية، والكاشفات، والعديد من الإضافات (ICU، الخلفيات). قوي، لكن التكوين قد يتوسع مع نمو المشاريع.
|
|
43
|
+
- **Intlayer** - نموذج محتوى يركز على المكونات لـ React، **أنواع TypeScript صارمة**، **فحوصات أثناء وقت البناء**، **عزل بالشجرة (tree-shaking)**، بالإضافة إلى **محرر بصري/نظام إدارة محتوى** و**ترجمات مدعومة بالذكاء الاصطناعي**. يعمل مع React Router وVite وCRA، وغيرها.
|
|
67
44
|
|
|
68
45
|
---
|
|
69
46
|
|
|
70
|
-
##
|
|
47
|
+
## مصفوفة الميزات (تركيز على React)
|
|
48
|
+
|
|
49
|
+
| الميزة | `react-intlayer` (Intlayer) | `react-i18next` (i18next) | `react-intl` (FormatJS) |
|
|
50
|
+
| ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
|
|
51
|
+
| **الترجمات بالقرب من المكونات** | ✅ نعم، المحتوى موضوع بجانب كل مكون | ❌ لا | ❌ لا |
|
|
52
|
+
| **تكامل TypeScript** | ✅ متقدم، أنواع صارمة مولدة تلقائيًا | ⚠️ أساسي؛ إعداد إضافي للسلامة | ✅ جيد، لكن أقل صرامة |
|
|
53
|
+
| **كشف الترجمات المفقودة** | ✅ تمييز أخطاء TypeScript وتحذير/خطأ أثناء وقت البناء | ⚠️ غالبًا سلاسل احتياطية أثناء التشغيل | ⚠️ سلاسل احتياطية |
|
|
54
|
+
| **المحتوى الغني (JSX/Markdown/مكونات)** | ✅ دعم مباشر | ⚠️ محدود / فقط التداخل | ⚠️ صيغة ICU، ليست JSX حقيقية |
|
|
55
|
+
| **الترجمة المدعومة بالذكاء الاصطناعي** | ✅ نعم، يدعم مزودي ذكاء اصطناعي متعددين. يمكن استخدامه باستخدام مفاتيح API الخاصة بك. يأخذ في الاعتبار سياق تطبيقك ونطاق المحتوى | ❌ لا | ❌ لا |
|
|
56
|
+
| **المحرر المرئي** | ✅ نعم، محرر مرئي محلي + نظام إدارة محتوى اختياري؛ يمكنه إخراج محتوى قاعدة الشيفرة؛ قابل للتضمين | ❌ لا / متوفر عبر منصات التوطين الخارجية | ❌ لا / متوفر عبر منصات التوطين الخارجية |
|
|
57
|
+
| **التوجيه المحلي** | ✅ نعم، يدعم المسارات المحلية مباشرة (يعمل مع Next.js و Vite) | ⚠️ لا يوجد مدمج، يتطلب إضافات (مثل `next-i18next`) أو تكوين مخصص للموجه | ❌ لا، فقط تنسيق الرسائل، يجب أن يكون التوجيه يدويًا |
|
|
58
|
+
| **توليد المسارات الديناميكية** | ✅ نعم | ⚠️ يتطلب إضافة/نظام بيئي أو إعداد يدوي | ❌ غير متوفر |
|
|
59
|
+
| **التعددية** | ✅ أنماط قائمة على التعداد | ✅ قابلة للتكوين (إضافات مثل i18next-icu) | ✅ (ICU) |
|
|
60
|
+
| **التنسيق (التواريخ، الأرقام، العملات)** | ✅ منسقات محسنة (Intl تحت الغطاء) | ⚠️ عبر إضافات أو استخدام Intl مخصص | ✅ منسقات ICU |
|
|
61
|
+
| **تنسيق المحتوى** | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml قيد العمل) | ⚠️ .json | ✅ .json, .js |
|
|
62
|
+
| **دعم ICU** | ⚠️ قيد العمل | ⚠️ عبر إضافة (i18next-icu) | ✅ نعم |
|
|
63
|
+
| **مساعدو تحسين محركات البحث (hreflang، خريطة الموقع)** | ✅ أدوات مدمجة: مساعدات لخريطة الموقع، robots.txt، البيانات الوصفية | ⚠️ إضافات مجتمعية/يدوية | ❌ ليست جزءًا أساسيًا |
|
|
64
|
+
| **النظام البيئي / المجتمع** | ⚠️ أصغر لكن ينمو بسرعة وبشكل تفاعلي | ✅ الأكبر والأكثر نضجًا | ✅ كبير |
|
|
65
|
+
| **التصيير على جانب الخادم ومكونات الخادم** | ✅ نعم، مُبسّط للتصيير على جانب الخادم / مكونات خادم React | ⚠️ مدعوم على مستوى الصفحة ولكن يحتاج لتمرير دوال t على شجرة المكونات لمكونات الخادم الفرعية | ❌ غير مدعوم، يحتاج لتمرير دوال t على شجرة المكونات لمكونات الخادم الفرعية |
|
|
66
|
+
| **إزالة الشجر (تحميل المحتوى المستخدم فقط)** | ✅ نعم، لكل مكون أثناء وقت البناء عبر إضافات Babel/SWC | ⚠️ عادةً ما يحمل الكل (يمكن تحسينه باستخدام المساحات الاسمية/تقسيم الكود) | ⚠️ عادةً ما يحمل الكل |
|
|
67
|
+
| **التحميل الكسول** | ✅ نعم، لكل لغة / لكل قاموس | ✅ نعم (مثل الخلفيات/المساحات الاسمية عند الطلب) | ✅ نعم (تقسيم حزم اللغة) |
|
|
68
|
+
| **تنقية المحتوى غير المستخدم** | ✅ نعم، لكل قاموس أثناء وقت البناء | ❌ لا، فقط عبر تقسيم المساحات الاسمية يدويًا | ❌ لا، جميع الرسائل المعلنة يتم تجميعها |
|
|
69
|
+
| **إدارة المشاريع الكبيرة** | ✅ يشجع على التصميم المعياري، مناسب لأنظمة التصميم | ⚠️ يحتاج إلى انضباط جيد في الملفات | ⚠️ يمكن أن تصبح الكتالوجات المركزية كبيرة |
|
|
71
70
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
[**React-i18next**](https://react.i18next.com/) هو امتداد React لـ [i18next](https://www.i18next.com/)، واحدة من أشهر أطر العمل للـ i18n في JavaScript. يوفر **ميزات شاملة** للترجمات في وقت التشغيل، التحميل الكسول، واكتشاف اللغة، مما يجعله مرنًا للغاية لمجموعة واسعة من حالات الاستخدام.
|
|
75
|
-
|
|
76
|
-
### الميزات الرئيسية
|
|
77
|
-
|
|
78
|
-
- **هيكل ترجمة مرن**: غير مرتبط بتنسيق واحد مثل ICU. يمكنك تخزين الترجمات في JSON، واستخدام التداخل، والجمع، إلخ.
|
|
79
|
-
- **تبديل لغة ديناميكي**: مكونات الكشف عن اللغة المدمجة والتحديثات في وقت التشغيل.
|
|
80
|
-
- **ترجمات متداخلة ومهيكلة**: يمكنك بسهولة تداخل الترجمات ضمن JSON.
|
|
81
|
-
- **نظام إضافات شاملة**: للكشف (المتصفح، المسار، المجال الفرعي، إلخ)، وتحميل الموارد، والتخزين المؤقت، وأكثر.
|
|
82
|
-
|
|
83
|
-
### سير العمل النموذجي
|
|
84
|
-
|
|
85
|
-
1. **تثبيت `i18next` و `react-i18next`.**
|
|
86
|
-
2. **تكوين i18n** لتحميل الترجمات (JSON) وإعداد اكتشاف اللغة أو الاحتياطي.
|
|
87
|
-
3. **لف التطبيق** بـ `I18nextProvider`.
|
|
88
|
-
4. **استخدم `useTranslation()`** أو مكون `<Trans>` لعرض الترجمات.
|
|
71
|
+
---
|
|
89
72
|
|
|
90
|
-
|
|
73
|
+
## مقارنة متعمقة
|
|
91
74
|
|
|
92
|
-
|
|
93
|
-
- مجتمع نشط للغاية ونظام بيئي كبير من الإضافات.
|
|
94
|
-
- سهولة **التحميل الديناميكي** للترجمات (مثلًا، من خادم، حسب الطلب).
|
|
75
|
+
### 1) البنية والقابلية للتوسع
|
|
95
76
|
|
|
96
|
-
|
|
77
|
+
- **react-intl / react-i18next**: معظم الإعدادات تحافظ على **مجلدات لغة مركزية** لكل لغة، وأحيانًا مقسمة حسب **المساحات الاسمية** (i18next). يعمل بشكل جيد في البداية لكنه يصبح مساحة مشتركة مع نمو التطبيقات.
|
|
78
|
+
- **Intlayer**: يعزز وجود **قواميس لكل مكون (أو لكل ميزة)** **متمركزة** مع واجهة المستخدم التي تخدمها. هذا يحافظ على وضوح الملكية، ويسهل تكرار/ترحيل المكونات، ويقلل من تقلب المفاتيح بين الفرق. من الأسهل تحديد المحتوى غير المستخدم وإزالته.
|
|
97
79
|
|
|
98
|
-
|
|
99
|
-
- إذا كنت تفضل الترجمات المTyped، قد تحتاج إلى إعدادات TypeScript إضافية.
|
|
80
|
+
**لماذا هذا مهم:** المحتوى المعياري يعكس واجهة المستخدم المعيارية. قواعد كود React الكبيرة تبقى أنظف عندما تعيش الترجمات مع المكونات التي تنتمي إليها.
|
|
100
81
|
|
|
101
82
|
---
|
|
102
83
|
|
|
103
|
-
|
|
84
|
+
### 2) TypeScript والأمان
|
|
104
85
|
|
|
105
|
-
|
|
86
|
+
- **react-intl**: أنواع قوية، لكن **لا يوجد تعيين تلقائي للمفاتيح**؛ أنت من يفرض أنماط الأمان بنفسك.
|
|
87
|
+
- **react-i18next**: أنواع قوية للخطافات؛ **التعيين الصارم للمفاتيح** عادة ما يتطلب تكوينًا إضافيًا أو مولدات.
|
|
88
|
+
- **Intlayer**: **ينشئ تلقائيًا أنواعًا صارمة** من المحتوى الخاص بك. الإكمال التلقائي في بيئة التطوير و**أخطاء وقت الترجمة** تلتقط الأخطاء الإملائية والمفاتيح المفقودة قبل وقت التشغيل.
|
|
106
89
|
|
|
107
|
-
|
|
90
|
+
**لماذا هذا مهم:** نقل الأخطاء إلى **المرحلة المبكرة** (أثناء البناء/التكامل المستمر) يقلل من مشاكل الإنتاج ويسرع دورات تغذية راجع المطورين.
|
|
108
91
|
|
|
109
|
-
|
|
92
|
+
---
|
|
110
93
|
|
|
111
|
-
|
|
112
|
-
- **التوجيه & برامج الوسيط المدمجة**: وحدات اختيارية للتوجيه المحلي (مثل `/en/about`، `/fr/about`) وبرامج الوسيط على الخادم للكشف عن لغة المستخدم.
|
|
113
|
-
- **أنواع TypeScript المولدة تلقائيًا**: تضمن سلامة النوع مع ميزات مثل الإكمال التلقائي وكشف الأخطاء في وقت التجميع.
|
|
114
|
-
- **ترجمات ديناميكية وغنية**: يمكن أن تتضمن JSX/TSX في الترجمات لحالات الاستخدام الأكثر تعقيدًا (مثل الروابط، النص الجريء، الأيقونات في الترجمات).
|
|
94
|
+
### 3) التعامل مع الترجمات المفقودة
|
|
115
95
|
|
|
116
|
-
|
|
96
|
+
- **react-intl / react-i18next**: تعتمد بشكل افتراضي على **الاستعانة بالبدائل وقت التشغيل** (تكرار المفتاح أو اللغة الافتراضية). يمكنك إضافة أدوات فحص/إضافات، لكنها ليست مضمونة أثناء البناء.
|
|
97
|
+
- **Intlayer**: **الكشف أثناء البناء** مع تحذيرات أو أخطاء عند فقدان اللغات/المفاتيح المطلوبة.
|
|
117
98
|
|
|
118
|
-
|
|
119
|
-
2. **إنشاء `intlayer.config.ts`** لتعريف اللغات المتاحة واللغة الافتراضية.
|
|
120
|
-
3. **استخدم Intlayer CLI** أو الإضافات لت **ترتيب** إعلانات المحتوى.
|
|
121
|
-
4. **لف التطبيق** بـ `<IntlayerProvider>` واسترد المحتوى باستخدام `useIntlayer("keyName")`.
|
|
99
|
+
**لماذا هذا مهم:** فشل التكامل المستمر عند وجود سلاسل مفقودة يمنع تسرب "الإنجليزية الغامضة" إلى واجهات المستخدم غير الإنجليزية.
|
|
122
100
|
|
|
123
|
-
|
|
101
|
+
---
|
|
124
102
|
|
|
125
|
-
|
|
126
|
-
- **محتوى غني** ممكن (مثل تمرير عقد React كترجمات).
|
|
127
|
-
- **التوجيه المستند إلى اللغة** خارج الصندوق.
|
|
128
|
-
- متكامل مع أدوات البناء الشهيرة (CRA، Vite) لتسهيل الإعداد.
|
|
103
|
+
### 4) المحتوى الغني والتنسيق
|
|
129
104
|
|
|
130
|
-
|
|
105
|
+
- **react-intl**: دعم ممتاز لـ **ICU** للجمع، والاختيارات، والتواريخ/الأرقام، وتركيب الرسائل. يمكن استخدام JSX، لكن النموذج الذهني يبقى مركزًا على الرسالة.
|
|
106
|
+
- **react-i18next**: تعبير مرن و **`<Trans>`** لتضمين العناصر/المكونات؛ ICU متاح عبر الإضافة.
|
|
107
|
+
- **Intlayer**: يمكن لملفات المحتوى أن تتضمن **عقد غنية** (JSX/Markdown/مكونات) و**بيانات وصفية**. التنسيق يستخدم Intl في الخلفية؛ أنماط الجمع مريحة الاستخدام.
|
|
131
108
|
|
|
132
|
-
|
|
133
|
-
- تركيز أكبر على نهج "إعلان محتوى على مستوى المكونات" - قد تكون هذه تغيرًا عن كتالوجات .json التقليدية.
|
|
134
|
-
- مجتمع أصغر ونظام بيئي مقارنة بالمكتبات الأكثر رسوخًا.
|
|
109
|
+
**لماذا هذا مهم:** نصوص واجهة المستخدم المعقدة (روابط، أجزاء غامقة، مكونات مضمنة) تصبح أسهل عندما تتبنى المكتبة عقد React بشكل نظيف.
|
|
135
110
|
|
|
136
111
|
---
|
|
137
112
|
|
|
138
|
-
|
|
113
|
+
### 5) الأداء وسلوك التحميل
|
|
114
|
+
|
|
115
|
+
- **react-intl / react-i18next**: عادةً ما تدير **تقسيم الكتالوج** و**التحميل الكسول** يدويًا (المساحات الاسمية/الاستيرادات الديناميكية). فعال لكنه يتطلب انضباطًا.
|
|
116
|
+
- **Intlayer**: يقوم بـ **إزالة الشجرية** للقواميس غير المستخدمة ويدعم **التحميل الكسول لكل قاموس/لكل لغة** بشكل مدمج.
|
|
139
117
|
|
|
140
|
-
|
|
141
|
-
| --------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
142
|
-
| **حالة الاستخدام الرئيسية** | الترجمات المعتمدة على النصوص، تنسيق التاريخ/الرقم، بناء جملة ICU | i18n كامل المميزات مع تبديل ديناميكي سهل، تداخل، نظام إضافات | ترجمات آمنة من النوع مع التركيز على المحتوى الإعلاني، التوجيه المحلي، والبرامج الوسيطة على الخادم الاختياري |
|
|
143
|
-
| **النهج** | استخدم `<IntlProvider>` ومكونات رسالة FormatJS | استخدم `I18nextProvider` و `useTranslation()` hook | استخدم `<IntlayerProvider>` و `useIntlayer()` hook مع إعلانات المحتوى |
|
|
144
|
-
| **تنسيق الترجمة** | سلاسل بناء جملة تعتمد على ICU (كتالوجات JSON أو JavaScript) | ملفات موارد JSON (أو محملات مخصصة). تنسيق ICU اختياري عبر مكون i18next | إعلانات `.content.[ts/js/tsx]` أو JSON؛ يمكن أن تحتوي على سلاسل أو مكونات React |
|
|
145
|
-
| **التوجيه** | يتم التعامل معه خارجيًا (لا يوجد توجيه محلي مدمج) | يتم التعامل معه خارجيًا مع إضافات i18next (الكشف عن المسار، المجالات الفرعية، إلخ) | دعم التوجيه المحلي المدمج (مثل `/en/about`، `/fr/about`)، بالإضافة إلى برامج الوسيط الاختيارية (لـ SSR/Vite) |
|
|
146
|
-
| **دعم TypeScript** | جيد (أنواع للحزم الرسمية) | جيد ولكن تكوين إضافي للترجمات المعينة إذا كنت ترغب في التحقق الصارم | ممتاز (تعريفات نوعية مولدة تلقائيًا لمفاتيح المحتوى والترجمات) |
|
|
147
|
-
| **العدد الجمعي والتنسيق** | متقدم: تنسيق التاريخ/الوقت/الرقم المدمج، دعم الجمع/الجنس | الجمع القابل للتكوين. عادةً ما يتم تنسيق التاريخ/الوقت عبر مكتبات خارجية أو مكون i18next | يمكن الاعتماد على JavaScript Intl القياسي أو دمج المنطق في المحتوى. ليست متخصصة كما هو الحال في FormatJS، ولكنها تتعامل مع الحالات النموذجية. |
|
|
148
|
-
| **المجتمع والنظام البيئي** | كبير، جزء من نظام FormatJS | كبير جدًا، نشط للغاية، الكثير من الإضافات (الكشف، التخزين المؤقت، الأطر) | أصغر ولكن ينمو؛ مفتوح المصدر، نهج حديث |
|
|
149
|
-
| **منحنى التعلم** | معتدل (تعلم بناء جملة ICU، تقاليد FormatJS) | منخفض إلى معتدل (استخدام مباشر، ولكن التكوين المتقدم قد يصبح مطولًا) | معتدل (مفهوم إعلانات المحتوى وخطوات البناء المتخصصة) |
|
|
118
|
+
**لماذا هذا مهم:** الحزم الأصغر وسلاسل النصوص غير المستخدمة الأقل تحسن من أداء بدء التشغيل والتنقل.
|
|
150
119
|
|
|
151
120
|
---
|
|
152
121
|
|
|
153
|
-
|
|
122
|
+
### 6) تجربة المطور، الأدوات والصيانة
|
|
154
123
|
|
|
155
|
-
|
|
124
|
+
- **react-intl / react-i18next**: نظام بيئي واسع للمجتمع؛ في سير العمل التحريري عادةً ما تعتمد على منصات الترجمة الخارجية.
|
|
125
|
+
- **Intlayer**: يقدم **محررًا بصريًا مجانيًا** و**نظام إدارة محتوى اختياري** (احتفظ بالمحتوى في Git أو خارجه). كما يوفر **امتداد VSCode** لتأليف المحتوى و**ترجمة بمساعدة الذكاء الاصطناعي** باستخدام مفاتيح المزود الخاصة بك.
|
|
156
126
|
|
|
157
|
-
|
|
158
|
-
- تفضل نهجًا أكثر "**استنادًا إلى المعايير**" للترجمات.
|
|
159
|
-
- لا تحتاج إلى توجيه محلي أو مفاتيح ترجمة ذات نوع محدد.
|
|
127
|
+
**لماذا هذا مهم:** الأدوات المدمجة تقصر الحلقة بين المطورين ومؤلفي المحتوى - كود لاصق أقل، واعتماديات بائعين أقل.
|
|
160
128
|
|
|
161
|
-
|
|
129
|
+
---
|
|
162
130
|
|
|
163
|
-
|
|
164
|
-
- تريد كشف لغة قائم على الإضافات (مثلًا، من عنوان URL، ملفات تعريف الارتباط، التخزين المحلي) أو تخزين مؤقت متقدم.
|
|
165
|
-
- تحتاج إلى أكبر نظام بيئي، مع العديد من التكاملات الموجودة لأطر العمل المتنوعة (Next.js، React Native، إلخ).
|
|
131
|
+
## متى تختار أيًّا منها؟
|
|
166
132
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- تتطلب **توجيه محلي مدمج** أو ترغب في دمجه بسهولة في إعداد SSR أو Vite.
|
|
171
|
-
- ترغب في نهج حديث أو تريد ببساطة مكتبة واحدة تغطي كل من **إدارة المحتوى** (i18n) و**التوجيه** بطريقة آمنة من حيث النوع.
|
|
133
|
+
- **اختر react-intl** إذا كنت تريد تنسيق رسائل **ICU-first** مع واجهة برمجة تطبيقات مباشرة ومتوافقة مع المعايير وكان فريقك مرتاحًا للحفاظ على الكتالوجات وفحوصات الأمان يدويًا.
|
|
134
|
+
- **اختر react-i18next** إذا كنت تحتاج إلى **اتساع نظام i18next البيئي** (الكاشفات، الخلفيات، إضافة ICU، التكاملات) وتقبل المزيد من التهيئة للحصول على مرونة.
|
|
135
|
+
- **اختر Intlayer** إذا كنت تقدر **المحتوى المحدد بالمكون**، و**TypeScript الصارم**، و**ضمانات وقت البناء**، و**tree-shaking**، وأدوات التحرير **المتضمنة بالكامل** - خاصة لتطبيقات React **الكبيرة والمودولارية**.
|
|
172
136
|
|
|
173
137
|
---
|
|
174
138
|
|
|
175
|
-
##
|
|
176
|
-
|
|
177
|
-
كل مكتبة تقدم حلاً قويًا لتدويل تطبيق React:
|
|
178
|
-
|
|
179
|
-
- **React-Intl** تتفوق في تنسيق الرسائل وهي خيار شائع للحلول المؤسسية التي تركز على بناء جملة ICU الخاصة بالرسائل.
|
|
180
|
-
- **React-i18next** يوفر بيئة مرنة للغاية تعتمد على الإضافات لاحتياجات i18n المتقدمة أو الديناميكية.
|
|
181
|
-
- **Intlayer** تقدم نهجًا **حديثًا وسريع النوع** يجمع بين إعلانات المحتوى، التوجيه المحلي المتقدم، والتكاملات المستندة إلى الإضافات (CRA، Vite).
|
|
139
|
+
## ملاحظات عملية للهجرة (من react-intl / react-i18next إلى Intlayer)
|
|
182
140
|
|
|
183
|
-
|
|
141
|
+
- **هاجر بشكل تدريجي**: ابدأ بميزة واحدة أو مسار واحد؛ احتفظ بكتالوجات النظام القديم بالتوازي أثناء الانتقال.
|
|
142
|
+
- **اعتمد على قواميس لكل مكون**: ضع المحتوى بجانب المكونات لتقليل الترابط.
|
|
143
|
+
- **فعّل الفحوصات الصارمة**: دع أخطاء وقت البناء تكشف عن المفاتيح/اللغات المفقودة مبكرًا في CI.
|
|
144
|
+
- **قِس حجم الحزم**: توقع تقليصات مع تقليم السلاسل غير المستخدمة.
|
|
184
145
|
|
|
185
146
|
---
|
|
186
147
|
|
|
187
|
-
|
|
148
|
+
## الخلاصة
|
|
188
149
|
|
|
189
|
-
|
|
190
|
-
- [React-i18next Documentation](https://react.i18next.com/)
|
|
191
|
-
- [Intlayer + CRA Getting Started Guide](/ar/)
|
|
192
|
-
- [Intlayer + Vite & React Getting Started Guide](/ar/)
|
|
150
|
+
جميع المكتبات الثلاث تقوم بتوطين React بفعالية. الفارق هو مقدار **البنية التحتية** التي يجب عليك بناؤها للوصول إلى إعداد **آمن وقابل للتوسع**:
|
|
193
151
|
|
|
194
|
-
|
|
152
|
+
- مع **Intlayer**، يكون **المحتوى المعياري**، و**الكتابة الصارمة في TypeScript**، و**السلامة أثناء وقت البناء**، و**حزم مشذبة بالشجرة**، و**أدوات التحرير** هي الافتراضات - وليست مهامًا مرهقة.
|
|
153
|
+
- إذا كانت فرقك تقدر **قابلية الصيانة والسرعة** في تطبيقات React متعددة اللغات وموجهة بالمكونات، فإن Intlayer تقدم **أكمل** سير عمل للمطورين والمحتوى اليوم.
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-08-11
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
|
+
title: vue-i18n مقابل Intlayer
|
|
5
|
+
description: مقارنة بين vue-i18n و Intlayer للتدويل (i18n) في تطبيقات Vue/Nuxt
|
|
6
|
+
keywords:
|
|
7
|
+
- vue-i18n
|
|
8
|
+
- Intlayer
|
|
9
|
+
- التدويل
|
|
10
|
+
- i18n
|
|
11
|
+
- مدونة
|
|
12
|
+
- Vue
|
|
13
|
+
- Nuxt
|
|
14
|
+
- جافاسكريبت
|
|
15
|
+
slugs:
|
|
16
|
+
- blog
|
|
17
|
+
- vue-i18n-vs-intlayer
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# vue-i18n مقابل Intlayer | التدويل في Vue (i18n)
|
|
21
|
+
|
|
22
|
+
تُقارن هذه الدليل بين خيارين شائعين للتدويل (i18n) لـ **Vue 3** (و **Nuxt**): **vue-i18n** و **Intlayer**.
|
|
23
|
+
نركز على أدوات Vue الحديثة (Vite، Composition API) ونقيّم:
|
|
24
|
+
|
|
25
|
+
1. **البنية وتنظيم المحتوى**
|
|
26
|
+
2. **TypeScript والأمان**
|
|
27
|
+
3. **التعامل مع الترجمات المفقودة**
|
|
28
|
+
4. **التوجيه واستراتيجية عناوين URL**
|
|
29
|
+
5. **الأداء وسلوك التحميل**
|
|
30
|
+
6. **تجربة المطور (DX)، الأدوات والصيانة**
|
|
31
|
+
7. **تحسين محركات البحث (SEO) وقابلية التوسع في المشاريع الكبيرة**
|
|
32
|
+
|
|
33
|
+
> **ملخص**: كلاهما يمكنه تعريب تطبيقات Vue. إذا كنت تريد **محتوى مخصص للمكونات**، **أنواع TypeScript صارمة**، **فحوصات مفاتيح مفقودة أثناء البناء**، **قواميس معزولة بشجرة الاهتزاز (tree-shaken)**، و**مساعدات مدمجة للتوجيه وSEO** بالإضافة إلى **محرر بصري وترجمات مدعومة بالذكاء الاصطناعي**، فإن **Intlayer** هو الخيار الأكثر تكاملاً وحداثة.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## التموقع على مستوى عالٍ
|
|
38
|
+
|
|
39
|
+
- **vue-i18n** - مكتبة التدويل الافتراضية لـ Vue. تنسيق رسائل مرن (نمط ICU)، كتل `<i18n>` في ملفات المكونات المفردة (SFC) للرسائل المحلية، ونظام بيئي كبير. الأمان والصيانة على نطاق واسع تقع بشكل رئيسي على عاتقك.
|
|
40
|
+
- **Intlayer** - نموذج محتوى يركز على المكونات لـ Vue/Vite/Nuxt مع **أنواع TypeScript صارمة**، **فحوصات أثناء وقت البناء**، **عزل القواميس بشجرة الاهتزاز (tree-shaking)**، **مساعدات التوجيه وSEO**، محرر بصري/نظام إدارة محتوى اختياري، وترجمات مدعومة بالذكاء الاصطناعي.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## مقارنة الميزات جنبًا إلى جنب (مركزة على Vue)
|
|
45
|
+
|
|
46
|
+
| الميزة | **Intlayer** | **vue-i18n** |
|
|
47
|
+
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
|
|
48
|
+
| **الترجمات بالقرب من المكونات** | ✅ نعم، المحتوى متواجد بجانب كل مكون (مثلاً، `MyComp.content.ts`) | ✅ نعم، عبر كتل SFC `<i18n>` (اختياري) |
|
|
49
|
+
| **تكامل TypeScript** | ✅ متقدم، أنواع **صارمة** مولدة تلقائيًا وإكمال تلقائي للمفاتيح | ✅ أنواع جيدة؛ **السلامة الصارمة للمفاتيح تتطلب إعدادات/انضباط إضافي** |
|
|
50
|
+
| **كشف الترجمات المفقودة** | ✅ تحذيرات/أخطاء أثناء وقت البناء وظهور في TS | ⚠️ استرجاع/تحذيرات أثناء وقت التشغيل |
|
|
51
|
+
| **المحتوى الغني (المكونات/Markdown)** | ✅ دعم مباشر للعناصر الغنية وملفات محتوى Markdown | ⚠️ محدود (المكونات عبر `<i18n-t>`, وMarkdown عبر إضافات خارجية) |
|
|
52
|
+
| **الترجمة المدعومة بالذكاء الاصطناعي** | ✅ سير عمل مدمج باستخدام مفاتيح مزود الذكاء الاصطناعي الخاصة بك | ❌ غير مدمج |
|
|
53
|
+
| **المحرر المرئي / نظام إدارة المحتوى (CMS)** | ✅ محرر مرئي مجاني ونظام إدارة محتوى اختياري | ❌ غير مدمج (استخدم منصات خارجية) |
|
|
54
|
+
| **التوجيه المحلي** | ✅ أدوات مساعدة لـ Vue Router/Nuxt لإنشاء مسارات وروابط محلية و`hreflang` | ⚠️ ليس جزءًا أساسيًا (استخدم Nuxt i18n أو إعداد Vue Router مخصص) |
|
|
55
|
+
| **توليد المسارات الديناميكية** | ✅ نعم | ❌ غير متوفر (يوفره Nuxt i18n) |
|
|
56
|
+
| **التعددية والتنسيق** | ✅ أنماط تعداد؛ منسقات تعتمد على Intl | ✅ رسائل بأسلوب ICU؛ منسقات Intl |
|
|
57
|
+
| **صياغات المحتوى** | ✅ `.ts`، `.js`، `.json`، `.md`، `.txt` (YAML قيد العمل) | ✅ `.json`، `.js` (بالإضافة إلى كتل SFC `<i18n>`) |
|
|
58
|
+
| **دعم ICU** | ⚠️ قيد العمل | ✅ نعم |
|
|
59
|
+
| **أدوات تحسين محركات البحث (خريطة الموقع، الروبوتات، البيانات الوصفية)** | ✅ أدوات مساعدة مدمجة (غير مرتبطة بإطار عمل معين) | ❌ ليست جزءًا أساسيًا (Nuxt i18n/المجتمع) |
|
|
60
|
+
| **SSR/SSG** | ✅ يعمل مع Vue SSR و Nuxt؛ لا يعيق التقديم الثابت | ✅ يعمل مع Vue SSR/Nuxt |
|
|
61
|
+
| **إزالة الشجر (شحن المحتوى المستخدم فقط)** | ✅ لكل مكون أثناء وقت البناء | ⚠️ جزئي؛ يتطلب تقسيم الكود يدويًا / رسائل غير متزامنة |
|
|
62
|
+
| **التحميل الكسول** | ✅ لكل لغة / لكل قاموس | ✅ دعم رسائل اللغة غير المتزامنة |
|
|
63
|
+
| **تنقية المحتوى غير المستخدم** | ✅ نعم (وقت البناء) | ❌ غير مدمج |
|
|
64
|
+
| **قابلية صيانة المشاريع الكبيرة** | ✅ يشجع على هيكلية معيارية وصديقة لأنظمة التصميم | ✅ ممكن، لكنه يحتاج إلى انضباط قوي في الملفات/المساحات الاسمية |
|
|
65
|
+
| **النظام البيئي / المجتمع** | ⚠️ أصغر لكنه ينمو بسرعة | ✅ كبير وناضج في نظام Vue البيئي |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## مقارنة متعمقة
|
|
70
|
+
|
|
71
|
+
### 1) البنية القابلة للتوسع والمرونة
|
|
72
|
+
|
|
73
|
+
- **vue-i18n**: الإعدادات الشائعة تستخدم **كتالوجات مركزية** لكل لغة (يمكن تقسيمها اختياريًا إلى ملفات/مساحات أسماء). كتل `<i18n>` في ملفات المكونات المفردة (SFC) تسمح برسائل محلية، لكن الفرق غالبًا ما تعود إلى الكتالوجات المشتركة مع نمو المشاريع.
|
|
74
|
+
- **Intlayer**: يشجع على **قواميس لكل مكون** مخزنة بجانب المكون الذي تخدمه. هذا يقلل من النزاعات بين الفرق، ويحافظ على اكتشاف المحتوى، ويحد بشكل طبيعي من الانحراف/المفاتيح غير المستخدمة.
|
|
75
|
+
|
|
76
|
+
**لماذا هذا مهم:** في تطبيقات Vue الكبيرة أو أنظمة التصميم، **المحتوى المعياري** يتوسع بشكل أفضل من الكتالوجات الأحادية.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
### 2) TypeScript والأمان
|
|
81
|
+
|
|
82
|
+
- **vue-i18n**: دعم جيد لـ TS؛ **الكتابة الصارمة للمفاتيح** عادة ما تحتاج إلى مخططات/جنيريكس مخصصة واتفاقيات دقيقة.
|
|
83
|
+
- **Intlayer**: **ينشئ أنواعًا صارمة** من محتواك، مما يوفر **الإكمال التلقائي في بيئة التطوير (IDE)** و**أخطاء وقت الترجمة** للأخطاء الإملائية/المفاتيح المفقودة.
|
|
84
|
+
|
|
85
|
+
**لماذا هذا مهم:** الكتابة الصارمة تكتشف المشاكل **قبل** وقت التشغيل.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### 3) التعامل مع الترجمات المفقودة
|
|
90
|
+
|
|
91
|
+
- **vue-i18n**: تحذيرات/استرجاعات **وقت التشغيل** (مثل الرجوع إلى لغة أو مفتاح بديل).
|
|
92
|
+
- **Intlayer**: كشف **وقت البناء** مع تحذيرات/أخطاء عبر اللغات والمفاتيح.
|
|
93
|
+
|
|
94
|
+
**لماذا هذا مهم:** فرض القواعد وقت البناء يحافظ على واجهة المستخدم في الإنتاج نظيفة ومتسقة.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### 4) التوجيه واستراتيجية عناوين URL (Vue Router/Nuxt)
|
|
99
|
+
|
|
100
|
+
- **كلاهما** يمكن أن يعمل مع مسارات محلية.
|
|
101
|
+
- **Intlayer** يوفر مساعدات لـ **إنشاء مسارات محلية**، و**إدارة بادئات اللغة**، وإصدار **`<link rel="alternate" hreflang>`** لتحسين محركات البحث (SEO). مع Nuxt، يكمل توجيه الإطار.
|
|
102
|
+
|
|
103
|
+
**لماذا هذا مهم:** تقليل طبقات الربط المخصصة و**تحسين SEO أنظف** عبر اللغات.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
### 5) الأداء وسلوك التحميل
|
|
108
|
+
|
|
109
|
+
- **vue-i18n**: يدعم رسائل اللغة غير المتزامنة؛ تجنب التجميع الزائد مسؤوليتك (قسّم الكتالوجات بعناية).
|
|
110
|
+
- **Intlayer**: يقوم بـ **تحليل الشجرة** أثناء البناء و**التحميل الكسول لكل قاموس/لغة**. المحتوى غير المستخدم لا يتم شحنه.
|
|
111
|
+
|
|
112
|
+
**لماذا هذا مهم:** حزم أصغر وتشغيل أسرع لتطبيقات Vue متعددة اللغات.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
### 6) تجربة المطور والأدوات
|
|
117
|
+
|
|
118
|
+
- **vue-i18n**: وثائق ومجتمع ناضج؛ ستعتمد عادةً على **منصات الترجمة الخارجية** لسير العمل التحريري.
|
|
119
|
+
- **Intlayer**: يوفر **محرر بصري مجاني**، و**نظام إدارة محتوى اختياري** (متوافق مع Git أو خارجي)، و**امتداد VSCode**، وأدوات **CLI/CI**، وترجمات **مدعومة بالذكاء الاصطناعي** باستخدام مفاتيح المزود الخاصة بك.
|
|
120
|
+
|
|
121
|
+
**لماذا هذا مهم:** تقليل تكلفة العمليات ودورة تطوير-محتوى أقصر.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
### 7) تحسين محركات البحث (SEO)، العرض من جانب الخادم (SSR) والتوليد الثابت للموقع (SSG)
|
|
126
|
+
|
|
127
|
+
- **كلاهما** يعمل مع Vue SSR وNuxt.
|
|
128
|
+
- **Intlayer**: يضيف **مساعدات SEO** (خرائط الموقع/البيانات الوصفية/`hreflang`) التي لا تعتمد على إطار عمل معين وتتوافق بشكل جيد مع بناء Vue/Nuxt.
|
|
129
|
+
|
|
130
|
+
**لماذا هذا مهم:** تحسين SEO دولي بدون تعقيدات خاصة.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## لماذا Intlayer؟ (المشكلة والمنهجية)
|
|
135
|
+
|
|
136
|
+
تبدأ معظم حزم i18n (بما في ذلك **vue-i18n**) من **كتالوجات مركزية**:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
.
|
|
140
|
+
├── locales
|
|
141
|
+
│ ├── en.json
|
|
142
|
+
│ ├── es.json
|
|
143
|
+
│ └── fr.json
|
|
144
|
+
└── src
|
|
145
|
+
└── components
|
|
146
|
+
└── MyComponent.vue
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
أو باستخدام مجلدات لكل لغة:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
.
|
|
153
|
+
├── locales
|
|
154
|
+
│ ├── en
|
|
155
|
+
│ │ ├── footer.json
|
|
156
|
+
│ │ └── navbar.json
|
|
157
|
+
│ ├── fr
|
|
158
|
+
│ │ ├── footer.json
|
|
159
|
+
│ │ └── navbar.json
|
|
160
|
+
│ └── es
|
|
161
|
+
│ ├── footer.json
|
|
162
|
+
│ └── navbar.json
|
|
163
|
+
└── src
|
|
164
|
+
└── components
|
|
165
|
+
└── MyComponent.vue
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
غالبًا ما يبطئ هذا التطوير مع نمو التطبيقات:
|
|
169
|
+
|
|
170
|
+
1. **لمكون جديد** تقوم بإنشاء/تعديل الكتالوجات البعيدة، ربط مساحات الأسماء، والترجمة (غالبًا عبر النسخ/اللصق اليدوي من أدوات الذكاء الاصطناعي).
|
|
171
|
+
2. **عند تغيير المكونات** تبحث عن المفاتيح المشتركة، تترجم، تحافظ على تزامن اللغات، تزيل المفاتيح غير المستخدمة، وتنسق هياكل JSON.
|
|
172
|
+
|
|
173
|
+
**Intlayer** يحدد المحتوى **لكل مكون** ويحتفظ به **بالقرب من الكود**، كما نفعل بالفعل مع CSS، والقصص، والاختبارات، والوثائق:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
.
|
|
177
|
+
└── components
|
|
178
|
+
└── MyComponent
|
|
179
|
+
├── MyComponent.content.ts
|
|
180
|
+
└── MyComponent.vue
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**إعلان المحتوى** (لكل مكون):
|
|
184
|
+
|
|
185
|
+
```ts fileName="./components/MyComponent/MyComponent.content.ts"
|
|
186
|
+
import { t, type Dictionary } from "intlayer";
|
|
187
|
+
|
|
188
|
+
const componentExampleContent = {
|
|
189
|
+
key: "component-example",
|
|
190
|
+
content: {
|
|
191
|
+
greeting: t({
|
|
192
|
+
en: "Hello World",
|
|
193
|
+
es: "Hola Mundo",
|
|
194
|
+
fr: "Bonjour le monde",
|
|
195
|
+
}),
|
|
196
|
+
},
|
|
197
|
+
} satisfies Dictionary;
|
|
198
|
+
|
|
199
|
+
export default componentExampleContent;
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**الاستخدام في Vue** (واجهة التكوين Composition API):
|
|
203
|
+
|
|
204
|
+
```vue fileName="./components/MyComponent/MyComponent.vue"
|
|
205
|
+
<script setup lang="ts">
|
|
206
|
+
import { useIntlayer } from "vue-intlayer"; // تكامل Vue
|
|
207
|
+
const { greeting } = useIntlayer("component-example");
|
|
208
|
+
</script>
|
|
209
|
+
|
|
210
|
+
<template>
|
|
211
|
+
<span>{{ greeting }}</span>
|
|
212
|
+
</template>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
تتضمن هذه الطريقة:
|
|
216
|
+
|
|
217
|
+
- **تسريع التطوير** (الإعلان مرة واحدة؛ الإكمال التلقائي من IDE/AI).
|
|
218
|
+
- **تنظيف قاعدة الكود** (مكون واحد = قاموس واحد).
|
|
219
|
+
- **تسهيل التكرار/الترحيل** (نسخ المكون ومحتواه معًا).
|
|
220
|
+
- **تجنب المفاتيح الميتة** (المكونات غير المستخدمة لا تستورد المحتوى).
|
|
221
|
+
- **تحسين التحميل** (المكونات المحملة عند الطلب تجلب محتواها معها).
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## ميزات إضافية لـ Intlayer (ذات صلة بـ Vue)
|
|
226
|
+
|
|
227
|
+
- **دعم عبر الأُطُر المختلفة**: يعمل مع Vue، Nuxt، Vite، React، Express، والمزيد.
|
|
228
|
+
- **إدارة المحتوى مدعومة بجافاسكريبت**: الإعلان في الكود مع مرونة كاملة.
|
|
229
|
+
- **ملف إعلان لكل لغة**: قم بتهيئة جميع اللغات ودع الأدوات تولد الباقي.
|
|
230
|
+
- **بيئة آمنة من حيث النوع**: إعداد TS قوي مع الإكمال التلقائي.
|
|
231
|
+
- **استرجاع محتوى مبسط**: هوك/مركب واحد لجلب كل المحتوى لقاموس معين.
|
|
232
|
+
- **قاعدة كود منظمة**: مكون واحد = قاموس واحد في نفس المجلد.
|
|
233
|
+
- **توجيه محسّن**: مساعدات لمسارات وبيانات وصفية محلية لـ **Vue Router/Nuxt**.
|
|
234
|
+
- **دعم Markdown**: استيراد Markdown عن بُعد/محلي لكل لغة؛ عرض البيانات الوصفية في الكود.
|
|
235
|
+
- **محرر بصري مجاني ونظام إدارة محتوى اختياري**: التأليف بدون منصة ترجمة مدفوعة؛ مزامنة صديقة لـ Git.
|
|
236
|
+
- **محتوى قابل للاقتصاص الشجري (Tree-shakable)**: يشحن فقط ما يُستخدم؛ يدعم التحميل عند الطلب.
|
|
237
|
+
- **صديق للتصيير الثابت**: لا يعيق SSG.
|
|
238
|
+
- **ترجمات مدعومة بالذكاء الاصطناعي**: ترجم إلى 231 لغة باستخدام مزود الذكاء الاصطناعي الخاص بك/مفتاح API.
|
|
239
|
+
- **خادم MCP وامتداد VSCode**: أتمتة سير عمل i18n والتأليف داخل بيئة التطوير المتكاملة الخاصة بك.
|
|
240
|
+
- **التشغيل البيني**: جسور مع **vue-i18n**، **react-i18next**، و **react-intl** عند الحاجة.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## متى تختار أيهما؟
|
|
245
|
+
|
|
246
|
+
- **اختر vue-i18n** إذا كنت تريد **النهج القياسي لـ Vue**، وتشعر بالراحة في إدارة الكتالوجات/المساحات الاسمية بنفسك، وكان تطبيقك **صغير إلى متوسط الحجم** (أو تعتمد بالفعل على Nuxt i18n).
|
|
247
|
+
- **اختر Intlayer** إذا كنت تقدر **المحتوى المخصص للمكونات**، و**TypeScript الصارم**، و**ضمانات وقت البناء**، و**الاقتصاص الشجري (tree-shaking)**، وأدوات التوجيه/SEO/المحرر المدمجة-خاصةً لـ **قواعد كود Vue/Nuxt الكبيرة والمودولارية**.
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## ملاحظات عملية للترحيل (من vue-i18n إلى Intlayer)
|
|
252
|
+
|
|
253
|
+
- **ابدأ لكل ميزة على حدة**: انقل مسارًا/عرضًا/مكونًا واحدًا في كل مرة إلى قواميس Intlayer المحلية.
|
|
254
|
+
- **الجسر أثناء الترحيل**: احتفظ بكتالوجات vue-i18n بالتوازي؛ واستبدل عمليات البحث تدريجيًا.
|
|
255
|
+
- **تمكين الفحوصات الصارمة**: دع الكشف أثناء وقت البناء يظهر المفاتيح/اللغات المفقودة مبكرًا.
|
|
256
|
+
- **اعتمد مساعدي التوجيه/SEO**: قم بتوحيد اكتشاف اللغة وعلامات `hreflang`.
|
|
257
|
+
- **قِس الحزم**: توقع **انخفاض حجم الحزمة** مع استبعاد المحتوى غير المستخدم.
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## الخلاصة
|
|
262
|
+
|
|
263
|
+
كلا من **vue-i18n** و **Intlayer** يقومان بتوطين تطبيقات Vue بشكل جيد. الفرق هو **مدى ما يجب عليك بناؤه بنفسك** لتحقيق إعداد قوي وقابل للتوسع:
|
|
264
|
+
|
|
265
|
+
- مع **Intlayer**، يأتي **المحتوى المعياري**، و**TypeScript الصارم**، و**السلامة أثناء وقت البناء**، و**حزم معزولة من الشجرة (tree-shaken)**، و**أدوات التوجيه/SEO/المحرر** **مضمنة بشكل افتراضي**.
|
|
266
|
+
- إذا كانت أولويات فريقك هي **قابلية الصيانة والسرعة** في تطبيق Vue/Nuxt متعدد اللغات وموجه بالمكونات، فإن Intlayer يقدم **التجربة الأكثر اكتمالًا** اليوم.
|
|
267
|
+
|
|
268
|
+
راجع مستند ['لماذا Intlayer؟'](https://intlayer.org/doc/why) لمزيد من التفاصيل.
|