@intlayer/docs 8.7.4 → 8.7.5
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/de/next-i18next_vs_next-intl_vs_intlayer.md +0 -2
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +0 -2
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +0 -2
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +0 -2
- package/blog/id/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +0 -2
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +0 -2
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +0 -2
- package/blog/pl/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +0 -2
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +0 -2
- package/blog/vi/list_i18n_technologies/frameworks/svelte.md +0 -2
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +0 -2
- package/dist/cjs/generated/docs.entry.cjs +60 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +60 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +3 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/benchmark/index.md +29 -0
- package/docs/ar/benchmark/nextjs.md +227 -0
- package/docs/ar/benchmark/tanstack.md +193 -0
- package/docs/ar/intlayer_with_tanstack.md +0 -2
- package/docs/de/benchmark/index.md +29 -0
- package/docs/de/benchmark/nextjs.md +227 -0
- package/docs/de/benchmark/tanstack.md +193 -0
- package/docs/en/benchmark/___NOTE.md +82 -0
- package/docs/en/benchmark/___nextjs.md +195 -0
- package/docs/en/benchmark/___tanstack.md +187 -0
- package/docs/en/benchmark/index.md +29 -0
- package/docs/en/benchmark/nextjs.md +228 -0
- package/docs/en/benchmark/tanstack.md +217 -0
- package/docs/en-GB/benchmark/index.md +29 -0
- package/docs/en-GB/benchmark/nextjs.md +228 -0
- package/docs/en-GB/benchmark/tanstack.md +193 -0
- package/docs/es/benchmark/index.md +29 -0
- package/docs/es/benchmark/nextjs.md +226 -0
- package/docs/es/benchmark/tanstack.md +193 -0
- package/docs/fr/benchmark/index.md +29 -0
- package/docs/fr/benchmark/nextjs.md +227 -0
- package/docs/fr/benchmark/tanstack.md +193 -0
- package/docs/hi/benchmark/index.md +29 -0
- package/docs/hi/benchmark/nextjs.md +227 -0
- package/docs/hi/benchmark/tanstack.md +193 -0
- package/docs/id/benchmark/index.md +29 -0
- package/docs/id/benchmark/nextjs.md +227 -0
- package/docs/id/benchmark/tanstack.md +193 -0
- package/docs/id/intlayer_with_react_native+expo.md +0 -2
- package/docs/it/benchmark/index.md +29 -0
- package/docs/it/benchmark/nextjs.md +227 -0
- package/docs/it/benchmark/tanstack.md +193 -0
- package/docs/ja/benchmark/index.md +29 -0
- package/docs/ja/benchmark/nextjs.md +227 -0
- package/docs/ja/benchmark/tanstack.md +193 -0
- package/docs/ko/benchmark/index.md +29 -0
- package/docs/ko/benchmark/nextjs.md +227 -0
- package/docs/ko/benchmark/tanstack.md +193 -0
- package/docs/ko/intlayer_with_tanstack.md +0 -2
- package/docs/pl/benchmark/index.md +29 -0
- package/docs/pl/benchmark/nextjs.md +227 -0
- package/docs/pl/benchmark/tanstack.md +193 -0
- package/docs/pt/benchmark/index.md +29 -0
- package/docs/pt/benchmark/nextjs.md +227 -0
- package/docs/pt/benchmark/tanstack.md +193 -0
- package/docs/ru/benchmark/index.md +29 -0
- package/docs/ru/benchmark/nextjs.md +227 -0
- package/docs/ru/benchmark/tanstack.md +193 -0
- package/docs/tr/benchmark/index.md +29 -0
- package/docs/tr/benchmark/nextjs.md +227 -0
- package/docs/tr/benchmark/tanstack.md +193 -0
- package/docs/uk/benchmark/index.md +29 -0
- package/docs/uk/benchmark/nextjs.md +227 -0
- package/docs/uk/benchmark/tanstack.md +193 -0
- package/docs/vi/benchmark/index.md +29 -0
- package/docs/vi/benchmark/nextjs.md +227 -0
- package/docs/vi/benchmark/tanstack.md +193 -0
- package/docs/zh/benchmark/index.md +29 -0
- package/docs/zh/benchmark/nextjs.md +227 -0
- package/docs/zh/benchmark/tanstack.md +193 -0
- package/package.json +6 -6
- package/src/generated/docs.entry.ts +60 -0
|
@@ -5,6 +5,9 @@ declare const docsEntry: {
|
|
|
5
5
|
readonly './docs/en/CI_CD.md': Record<LocalesValues, Promise<string>>;
|
|
6
6
|
readonly './docs/en/agent_skills.md': Record<LocalesValues, Promise<string>>;
|
|
7
7
|
readonly './docs/en/autoFill.md': Record<LocalesValues, Promise<string>>;
|
|
8
|
+
readonly './docs/en/benchmark/index.md': Record<LocalesValues, Promise<string>>;
|
|
9
|
+
readonly './docs/en/benchmark/nextjs.md': Record<LocalesValues, Promise<string>>;
|
|
10
|
+
readonly './docs/en/benchmark/tanstack.md': Record<LocalesValues, Promise<string>>;
|
|
8
11
|
readonly './docs/en/bundle_optimization.md': Record<LocalesValues, Promise<string>>;
|
|
9
12
|
readonly './docs/en/cli/build.md': Record<LocalesValues, Promise<string>>;
|
|
10
13
|
readonly './docs/en/cli/ci.md': Record<LocalesValues, Promise<string>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.entry.d.ts","names":[],"sources":["../../../src/generated/docs.entry.ts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"docs.entry.d.ts","names":[],"sources":["../../../src/generated/docs.entry.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-04-20
|
|
3
|
+
updatedAt: 2026-04-20
|
|
4
|
+
title: مقارنة مكتبات i18n
|
|
5
|
+
description: تعرف على كيفية مقارنة Intlayer بمكتبات i18n الأخرى من حيث الأداء وحجم الحزمة.
|
|
6
|
+
keywords:
|
|
7
|
+
- benchmark
|
|
8
|
+
- i18n
|
|
9
|
+
- intl
|
|
10
|
+
- nextjs
|
|
11
|
+
- tanstack
|
|
12
|
+
- intlayer
|
|
13
|
+
slugs:
|
|
14
|
+
- doc
|
|
15
|
+
- benchmark
|
|
16
|
+
history:
|
|
17
|
+
- version: 8.7.5
|
|
18
|
+
date: 2026-01-06
|
|
19
|
+
changes: "بدء المقارنة"
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Benchmark - تقرير
|
|
23
|
+
|
|
24
|
+
Benchmark Bloom هي مجموعة لقياس الأداء تقيس التأثير الفعلي لمكتبات i18n (تدويل التطبيقات) عبر عدة أطر عمل React واستراتيجيات التحميل.
|
|
25
|
+
|
|
26
|
+
فيما يلي التقارير التفصيلية والتوثيق الفني لكل إطار عمل:
|
|
27
|
+
|
|
28
|
+
- [**تقرير benchmark لـ Next.js**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/benchmark/nextjs.md)
|
|
29
|
+
- [**تقرير benchmark لـ TanStack Start**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/benchmark/tanstack.md)
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-04-20
|
|
3
|
+
updatedAt: 2026-04-21
|
|
4
|
+
title: أفضل حل i18n لـ Next.js في 2026 - تقرير المقارنة
|
|
5
|
+
description: قارن بين مكتبات تدويل (i18n) Next.js مثل next-intl و next-i18next و Intlayer. تقرير مفصل للأداء حول حجم الحزمة، التسرب، والتفاعلية.
|
|
6
|
+
keywords:
|
|
7
|
+
- benchmark
|
|
8
|
+
- i18n
|
|
9
|
+
- intl
|
|
10
|
+
- nextjs
|
|
11
|
+
- performance
|
|
12
|
+
- intlayer
|
|
13
|
+
slugs:
|
|
14
|
+
- doc
|
|
15
|
+
- benchmark
|
|
16
|
+
- nextjs
|
|
17
|
+
author: Aymeric PINEAU
|
|
18
|
+
applicationTemplate: https://github.com/intlayer-org/benchmark-i18n
|
|
19
|
+
history:
|
|
20
|
+
- version: 8.7.5
|
|
21
|
+
date: 2026-01-06
|
|
22
|
+
changes: "بدء المقارنة"
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# مكتبات i18n لـ Next.js — تقرير مقارنة 2026
|
|
26
|
+
|
|
27
|
+
هذه الصفحة عبارة عن تقرير مقارنة لحلول i18n على Next.js.
|
|
28
|
+
|
|
29
|
+
## جدول المحتويات
|
|
30
|
+
|
|
31
|
+
<Toc/>
|
|
32
|
+
|
|
33
|
+
## مقارنة تفاعلية
|
|
34
|
+
|
|
35
|
+
<I18nBenchmark framework="nextjs" vertical/>
|
|
36
|
+
|
|
37
|
+
## مرجع النتائج:
|
|
38
|
+
|
|
39
|
+
<iframe
|
|
40
|
+
src="https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-nextjs.md"
|
|
41
|
+
width="100%"
|
|
42
|
+
height="600px"
|
|
43
|
+
style="border:none;">
|
|
44
|
+
</iframe>
|
|
45
|
+
|
|
46
|
+
> https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-nextjs.md
|
|
47
|
+
|
|
48
|
+
شاهد مستودع المقارنة الكامل [هنا](https://github.com/intlayer-org/benchmark-i18n).
|
|
49
|
+
|
|
50
|
+
## مقدمة
|
|
51
|
+
|
|
52
|
+
مكتبات التدويل لها تأثير كبير على تطبيقك. الخطر الرئيسي هو تحميل المحتوى لجميع الصفحات وجميع اللغات بينما يزور المستخدم صفحة واحدة فقط.
|
|
53
|
+
|
|
54
|
+
مع نمو تطبيقك، يمكن أن ينمو حجم الحزمة بشكل كبير، مما قد يضر بالأداء بشكل ملحوظ.
|
|
55
|
+
|
|
56
|
+
على سبيل المثال، بالنسبة لأسوأ الحالات، يمكن أن تصبح صفحتك بعد تدويلها أكبر بـ 4 مرات تقريبًا.
|
|
57
|
+
|
|
58
|
+
تأثير آخر لمكتبات i18n هو بطء التطوير. تحويل المكونات إلى محتوى متعدد اللغات يستغرق وقتًا طويلاً.
|
|
59
|
+
|
|
60
|
+
بما أن المشكلة صعبة، توجد العديد من الحلول — بعضها يركز على تجربة المطور (DX)، والبعض الآخر على الأداء أو القابلية للتوسع، وهكذا.
|
|
61
|
+
|
|
62
|
+
يحاول Intlayer التحسين عبر هذه الأبعاد.
|
|
63
|
+
|
|
64
|
+
## اختبر تطبيقك
|
|
65
|
+
|
|
66
|
+
لتسليط الضوء على هذه المشكلات، قمت ببناء ماسح ضوئي مجاني يمكنك تجربته [هنا](https://intlayer.org/i18n-seo-scanner).
|
|
67
|
+
|
|
68
|
+
<iframe src="https://intlayer.org/i18n-seo-scanner" width="100%" height="600px" style="border:none;"/>
|
|
69
|
+
|
|
70
|
+
## المشكلة
|
|
71
|
+
|
|
72
|
+
هناك طريقتان رئيستان للحد من تأثير التطبيق متعدد اللغات على حجم الحزمة الخاص بك:
|
|
73
|
+
|
|
74
|
+
- تقسيم ملفات JSON (أو المحتوى) عبر ملفات / متغيرات / مساحات أسماء (namespaces) حتى يتمكن المجمع (bundler) من إزالة المحتوى غير المستخدم لصفحة معينة عبر Tree-shaking.
|
|
75
|
+
- تحميل محتوى الصفحة ديناميكيًا بلغة المستخدم فقط.
|
|
76
|
+
|
|
77
|
+
القيود الفنية لهذه الأساليب:
|
|
78
|
+
|
|
79
|
+
**التحميل الديناميكي**
|
|
80
|
+
|
|
81
|
+
حتى عندما تعلن عن مسارات مثل `[locale]/page.tsx` باستخدام Webpack أو Turbopack، وحتى إذا تم تعريف `generateStaticParams` ، فإن المجمع لا يعامل `locale` كثابت ستاتيكي. وهذا يعني أنه قد يسحب المحتوى لجميع اللغات في كل صفحة. الطريقة الرئيسية للحد من ذلك هي تحميل المحتوى عبر الاستيراد الديناميكي (مثل `import('./locales/${locale}.json')`).
|
|
82
|
+
|
|
83
|
+
ما يحدث في وقت البناء هو أن Next.js يصدر حزمة JS واحدة لكل لغة (مثل `./locales_fr_12345.js`). بعد إرسال الموقع إلى العميل، وعند تشغيل الصفحة، يقوم المتصفح بإجراء طلب HTTP إضافي لملف JS المطلوب (مثل `./locales_fr_12345.js`).
|
|
84
|
+
|
|
85
|
+
> طريقة أخرى لمعالجة نفس المشكلة هي استخدام `fetch()` لتحميل JSON ديناميكيًا. هذه هي الطريقة التي يعمل بها `Tolgee` عندما يكون ملف JSON تحت `/public` ، أو `next-translate` الذي يعتمد على `getStaticProps` لتحميل المحتوى. التدفق هو نفسه: المتصفح يقوم بطلب HTTP إضافي لتحميل الأصول.
|
|
86
|
+
|
|
87
|
+
**تقسيم المحتوى**
|
|
88
|
+
|
|
89
|
+
إذا كنت تستخدم صياغة مثل `const t = useTranslation()` + `t('my-object.my-sub-object.my-key')` ، فيجب عادةً أن يكون ملف JSON بالكامل في الحزمة حتى تتمكن المكتبة من تحليله والوصول إلى المفتاح. يتم شحن الكثير من هذا المحتوى حتى عندما يكون غير مستخدم في الصفحة.
|
|
90
|
+
|
|
91
|
+
للتخفيف من ذلك، تطلب منك بعض المكتبات الإعلان لكل صفحة عن مساحات الأسماء التي يجب تحميلها — مثل `next-i18next` و `next-intl` و `lingui` و `next-translate` و `next-international`.
|
|
92
|
+
|
|
93
|
+
في المقابل، يضيف `Paraglide` خطوة إضافية قبل البناء لتحويل JSON إلى رموز مسطحة مثل `const en_my_var = () => 'my value'`. نظريًا، يتيح ذلك إزالة المحتوى غير المستخدم في الصفحة. وكما سنرى، لا تزال لهذه الطريقة عيوب.
|
|
94
|
+
|
|
95
|
+
أخيرًا، يطبق `Intlayer` تحسينًا في وقت البناء بحيث يتم استبدال `useIntlayer('my-key')` بالمحتوى المقابل مباشرة.
|
|
96
|
+
|
|
97
|
+
## المنهجية
|
|
98
|
+
|
|
99
|
+
في هذه المقارنة، قمنا بمقارنة المكتبات التالية:
|
|
100
|
+
|
|
101
|
+
- `Base App` (بدون مكتبة i18n)
|
|
102
|
+
- `next-intlayer` (v8.7.5)
|
|
103
|
+
- `next-i18next` (v16.0.5)
|
|
104
|
+
- `next-intl` (v4.9.1)
|
|
105
|
+
- `@lingui/core` (v5.3.0)
|
|
106
|
+
- `next-translate` (v3.1.2)
|
|
107
|
+
- `next-international` (v1.3.1)
|
|
108
|
+
- `@inlang/paraglide-js` (v2.15.1)
|
|
109
|
+
- `tolgee` (v7.0.0)
|
|
110
|
+
- `@lingo.dev/compiler` (v0.4.0)
|
|
111
|
+
- `wuchale` (v0.22.11)
|
|
112
|
+
- `gt-next` (v6.16.5)
|
|
113
|
+
|
|
114
|
+
استخدمت إصدار `Next.js` رقم `16.2.4` مع App Router.
|
|
115
|
+
|
|
116
|
+
قمت ببناء تطبيق متعدد اللغات يحتوي على **10 صفحات** و **10 لغات**.
|
|
117
|
+
|
|
118
|
+
قارنت بين **أربع استراتيجيات تحميل**:
|
|
119
|
+
|
|
120
|
+
| الاستراتيجية | بدون مساحات أسماء (عام) | مع مساحات أسماء (محدد) |
|
|
121
|
+
| :--------------------- | :--------------------------------------- | :------------------------------------------------------------------ |
|
|
122
|
+
| **التحميل الستاتيكي** | **Static**: كل شيء في الذاكرة عند البدء. | **Scoped static**: تقسيم حسب مساحة الأسماء؛ تحميل كل شيء عند البدء. |
|
|
123
|
+
| **التحميل الديناميكي** | **Dynamic**: التحميل عند الطلب لكل لغة. | **Scoped dynamic**: تحميل دقيق حسب مساحة الأسماء واللغة. |
|
|
124
|
+
|
|
125
|
+
## ملخص الاستراتيجيات
|
|
126
|
+
|
|
127
|
+
- **Static**: بسيط؛ لا يوجد تأخير في الشبكة بعد التحميل الأولي. الجانب السلبي: حجم حزمة كبير.
|
|
128
|
+
- **Dynamic**: يقلل الوزن الأولي (التحميل الكسول). مثالي عندما يكون لديك العديد من اللغات.
|
|
129
|
+
- **Scoped static**: يحافظ على تنظيم الكود (فصل منطقي) بدون طلبات شبكة إضافية معقدة.
|
|
130
|
+
- **Scoped dynamic**: أفضل نهج لتقسيم الكود والأداء. يقلل استهلاك الذاكرة عن طريق تحميل ما تحتاجه الرؤية الحالية واللغة النشطة فقط.
|
|
131
|
+
|
|
132
|
+
### ما قمت بقياسه:
|
|
133
|
+
|
|
134
|
+
قمت بتشغيل نفس التطبيق متعدد اللغات في متصفح حقيقي لكل مكتبة، ثم سجلت ما ظهر بالفعل عبر الشبكة والوقت الذي استغرقته العمليات. يتم الإبلاغ عن الأحجام **بعد ضغط الويب العادي** ، لأن هذا أقرب لما يقوم الأشخاص بتنزيله بالفعل.
|
|
135
|
+
|
|
136
|
+
- **حجم مكتبة التدويل**: بعد التجميع والضغط، حجم مكتبة i18n هو حجم المزودين (مثل `NextIntlClientProvider`) + كود الخطافات (مثل `useTranslations`) في مكون فارغ. لا يتضمن تحميل ملفات الترجمة. هذا يوضح مدى "ثقل" المكتبة قبل دخول المحتوى الخاص بك.
|
|
137
|
+
|
|
138
|
+
- **JavaScript لكل صفحة**: لكل مسار في المقارنة، مقدار السكربت الذي يسحبه المتصفح لزيارة تلك الصفحة، محسوبًا كمتوسط عبر صفحات الاختبار (وعبر اللغات). الصفحات الثقيلة هي صفحات بطيئة.
|
|
139
|
+
|
|
140
|
+
- **التسرب من اللغات الأخرى**: هو محتوى نفس الصفحة ولكن بلغة أخرى يتم تحميله عن طريق الخطأ في الصفحة التي يتم فحصها. هذا المحتوى غير ضروري ويجب تجنبه (مثل محتوى صفحة `/fr/about` في حزمة صفحة `/en/about`).
|
|
141
|
+
|
|
142
|
+
- **التسرب من المسارات الأخرى**: نفس الفكرة لـ **الشاشات الأخرى** في التطبيق: ما إذا كانت نصوصها تظهر عندما فتحت صفحة واحدة فقط (مثل محتوى صفحة `/en/about` في حزمة صفحة `/en/contact`). تشير النتيجة العالية إلى ضعف التقسيم أو حزم واسعة بشكل مفرط.
|
|
143
|
+
|
|
144
|
+
- **متوسط حجم حزمة المكون**: يتم قياس مكونات واجهة المستخدم الشائعة **واحدًا تلو الآخر** بدلاً من الاختباء داخل رقم واحد ضخم للتطبيق. يوضح ما إذا كان التدويل يضخم المكونات اليومية بهدوء. على سبيل المثال، إذا أعيد رندرة المكون الخاص بك، فسيقوم بتحميل كل تلك البيانات من الذاكرة. ربط ملف JSON عملاق بأي مكون يشبه ربط مخزن كبير من البيانات غير المستخدمة التي ستبطئ أداء مكوناتك.
|
|
145
|
+
|
|
146
|
+
- **سرعة تبديل اللغة**: أقوم بتبديل اللغة باستخدام عنصر التحكم الخاص بالتطبيق ذاته وأحسب الوقت الذي يستغرقه حتى تتبدل الصفحة بوضوح — وهو ما يلاحظه الزائر.
|
|
147
|
+
|
|
148
|
+
- **جهد الرندرة بعد تغيير اللغة**: مراقبة أدق: مقدار الجهد الذي بذلته الواجهة لإعادة الرسم باللغة الجديدة بمجرد بدء التبديل. مفيد عندما يختلف الوقت "المحسوس" عن تكلفة إطار العمل.
|
|
149
|
+
|
|
150
|
+
- **وقت تحميل الصفحة الأولي**: من الانتقال حتى اعتبار المتصفح أن الصفحة محملة بالكامل للسيناريوهات التي اختبرتها. جيد لمقارنة بدايات التشغيل الباردة (cold starts).
|
|
151
|
+
|
|
152
|
+
- **وقت الهيدرة (Hydration)**: عندما يوفره التطبيق، الوقت الذي يقضيه العميل في تحويل كود HTML من الخادم إلى شيء يمكنك النقر عليه فعليًا. تعني الشرطة في الجداول أن تلك المكتبة لم توفر رقمًا موثوقًا للهيدرة في هذه المقارنة.
|
|
153
|
+
|
|
154
|
+
## النتائج بالتفصيل
|
|
155
|
+
|
|
156
|
+
### 1 — حلول يجب تجنبها
|
|
157
|
+
|
|
158
|
+
بعض الحلول، مثل `gt-next` أو `lingo.dev` ، يجب تجنبها بوضوح. فهي تجمع بين الارتباط الكامل بالبائع (vendor lock-in) وتشويه الكود الخاص بك. على الرغم من قضاء ساعات عديدة في محاولة تنفيذها، لم أتمكن أبدًا من جعلها تعمل — لا على TanStack Start ولا على Next.js.
|
|
159
|
+
|
|
160
|
+
المشكلات التي تمت مواجهتها:
|
|
161
|
+
|
|
162
|
+
**(General Translation)** (`gt-next@6.16.5`):
|
|
163
|
+
|
|
164
|
+
- لتطبيق بحجم 110 كيلوبايت، تضيف `gt-react` أكثر من 440 كيلوبايت إضافية.
|
|
165
|
+
- `Quota Exceeded, please upgrade your plan` (تم تجاوز الحصة، يرجى ترقية خطتك) في أول بناء للمشروع.
|
|
166
|
+
- لا يتم رندرة الترجمات؛ أحصل على خطأ `Error: <T> used on the client-side outside of <GTProvider>` ، والذي يبدو أنه خلل في المكتبة.
|
|
167
|
+
- أثناء تنفيذ **gt-tanstack-start-react** ، صادفت أيضًا [مشكلة](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) في المكتبة: `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser` ، والتي كانت تؤدي إلى تعطل التطبيق. بعد الإبلاغ عن هذه المشكلة، قام المطور بإصلاحها خلال 24 ساعة.
|
|
168
|
+
- المكتبة تمنع الرندرة الستاتيكية لصفحات Next.js.
|
|
169
|
+
|
|
170
|
+
**(Lingo.dev)** (`@lingo.dev/compiler@0.4.0`):
|
|
171
|
+
|
|
172
|
+
- تجاوز حصة الذكاء الاصطناعي، مما يمنع البناء تمامًا — لذا لا يمكنك الإطلاق للإنتاج دون دفع مبالغ مالية.
|
|
173
|
+
- كان المترجم (compiler) يفتقر إلى ما يقرب من 40% من المحتوى المترجم. اضطررت لإعادة كتابة جميع وظائف `.map` إلى كتل مكونات مسطحة لجعلها تعمل.
|
|
174
|
+
- واجهة السطر البرمجي (CLI) الخاصة بهم مليئة بالأخطاء وكانت تقوم بإعادة ضبط ملف الإعدادات بدون سبب.
|
|
175
|
+
- عند البناء، قامت بمسح ملفات JSON التي تم إنشاؤها تمامًا عند إضافة محتوى جديد. ونتيجة لذلك، يمكن لعدد قليل من المفاتيح مسح أكثر من 300 مفتاح موجود.
|
|
176
|
+
|
|
177
|
+
### 2 — حلول تجريبية
|
|
178
|
+
|
|
179
|
+
**(Wuchale)** (`wuchale@0.22.11`):
|
|
180
|
+
|
|
181
|
+
الفكرة وراء `Wuchale` مثيرة للاهتمام ولكنها ليست قابلة للتطبيق بعد. واجهت مشكلات في التفاعلية واضطررت لفرض إعادة رندرة المزود لجعل التطبيق يعمل. التوثيق أيضًا غير واضح تمامًا، مما يجعل البدء صعبًا.
|
|
182
|
+
|
|
183
|
+
**(Paraglide)** (`@inlang/paraglide-js@2.15.1`):
|
|
184
|
+
|
|
185
|
+
يقدم `Paraglide` نهجًا مبتكرًا ومدروسًا جيدًا. ومع ذلك، في هذه المقارنة، لم تعمل ميزة Tree-shaking التي تروج لها الشركة في إعدادات Next.js أو TanStack Start الخاصة بي. سير العمل وتجربة المطور أكثر تعقيدًا من الخيارات الأخرى.
|
|
186
|
+
أنا شخصياً لا أحب الاضطرار إلى إعادة إنشاء ملفات JS قبل كل رفع للكود، مما يخلق خطراً دائماً لتضارب الدمج (merge conflicts). كما يبدو أن الأداة تركز على Vite أكثر من Next.js.
|
|
187
|
+
أخيرًا، مقارنة بالحلول الأخرى، لا يستخدم Paraglide مخزنًا (مثل React context) لجلب اللغة الحالية لرندرة المحتوى. لكل عقدة يتم تحليلها، سيطلب اللغة من localStorage / cookie وما إلى ذلك. يؤدي ذلك إلى تنفيذ منطق غير ضروري يؤثر على تفاعلية المكونات.
|
|
188
|
+
|
|
189
|
+
### 3 — حلول مقبولة
|
|
190
|
+
|
|
191
|
+
**(Tolgee)** (`tolgee@7.0.0`):
|
|
192
|
+
|
|
193
|
+
يعالج `Tolgee` العديد من المشكلات المذكورة سابقًا. وجدت صعوبة في اعتماده أكثر من الأدوات المماثلة. لا يوفر سلامة الأنواع (type safety) ، مما يجعل اكتشاف المفاتيح المفقودة وقت البناء أكثر صعوبة. اضطررت لتغليف دوال Tolgee بدوالي الخاصة لإضافة ميزة اكتشاف المفاتيح المفقودة.
|
|
194
|
+
|
|
195
|
+
**(Next Intl)** (`next-intl@4.9.1`):
|
|
196
|
+
|
|
197
|
+
يعد `next-intl` الخيار الأكثر رواجًا والحل الذي تدفعه أنظمة الذكاء الاصطناعي، ولكن في نظري بشكل خاطئ. البدء سهل، ولكن في الممارسة العملية، فإن التحسين للحد من التسرب معقد. إن الجمع بين التحميل الديناميكي + مساحات الأسماء + أنواع TypeScript يبطئ التطوير كثيرًا. الحزمة ثقيلة أيضًا (~13 كيلوبايت لـ `NextIntlClientProvider` + `useTranslations` ، وهو أكثر من ضعف `next-intlayer`). كان `next-intl` يمنع الرندرة الستاتيكية لصفحات Next.js. يوفر وظيفة مساعدة تسمى `setRequestLocale()`. يبدو أن هذا قد تمت معالجته جزئيًا للملفات المركزية مثل `en.json` / `fr.json` ، لكن الرندرة الستاتيكية لا تزال تتعطل عندما يتم تقسيم المحتوى إلى مساحات أسماء مثل `en/shared.json` / `fr/shared.json` / `es/shared.json`.
|
|
198
|
+
|
|
199
|
+
**(Next I18next)** (`next-i18next@16.0.5`):
|
|
200
|
+
|
|
201
|
+
ربما يكون `next-i18next` هو الخيار الأكثر شعبية لأنه كان من أوائل حلول i18n لتطبيقات JavaScript. يحتوي على العديد من الإضافات المجتمعية. يشارك نفس السلبيات الرئيسية مثل `next-intl`. الحزمة ثقيلة بشكل خاص (~18 كيلوبايت لـ `I18nProvider` + `useTranslation` ، حوالي 3 أضعاف `next-intlayer`).
|
|
202
|
+
|
|
203
|
+
تختلف تنسيقات الرسائل أيضًا: يستخدم `next-intl` خدمة ICU MessageFormat، بينما يستخدم `i18next` تنسيقه الخاص.
|
|
204
|
+
|
|
205
|
+
**(Next International)** (`next-international@1.3.1`):
|
|
206
|
+
|
|
207
|
+
يعالج `next-international` أيضًا المشكلات المذكورة أعلاه ولكنه لا يختلف كثيرًا عن `next-intl` أو `next-i18next`. يتضمن `scopedT()` للترجمات الخاصة بمساحة الأسماء، لكن استخدامه ليس له تأثير يذكر على حجم الحزمة.
|
|
208
|
+
|
|
209
|
+
**(Lingui)** (`@lingui/core@5.3.0`):
|
|
210
|
+
|
|
211
|
+
غالبًا ما يتم الإشادة بـ `Lingui`. أنا شخصياً وجدت سير عمل `lingui extract` / `lingui compile` أكثر تعقيدًا من البدائل، دون ميزة واضحة. لاحظت أيضًا صياغات غير متسقة تربك الذكاء الاصطناعي (مثل `t()` و `t''` و `i18n.t()` و `<Trans>`).
|
|
212
|
+
|
|
213
|
+
### 4 — التوصيات
|
|
214
|
+
|
|
215
|
+
**(Next Translate)** (`next-translate@3.1.2`):
|
|
216
|
+
|
|
217
|
+
خيار `next-translate` هو توصيتي الرئيسية إذا كنت تحب واجهة برمجية بأسلوب `t()`. إنه أنيق عبر `next-translate-plugin` ، حيث يحمل مساحات الأسماء من خلال `getStaticProps` مع مجمع Webpack / Turbopack. إنه أيضًا الخيار الأخف هنا (~2.5 كيلوبايت). بالنسبة لمساحات الأسماء، فإن تحديدها لكل صفحة أو مسار في الإعدادات مدروس جيدًا وأسهل في الصيانة من البدائل الرئيسية مثل **next-intl** أو **next-i18next**. في الإصدار `3.1.2` ، لاحظت أن الرندرة الستاتيكية لم تعمل؛ حيث تراجع Next.js إلى الرندرة الديناميكية.
|
|
218
|
+
|
|
219
|
+
**(Intlayer)** (`next-intlayer@8.7.5`):
|
|
220
|
+
|
|
221
|
+
لن أحكم شخصيًا على `next-intlayer` من أجل الموضوعية، لأنه حلي الخاص.
|
|
222
|
+
|
|
223
|
+
### ملاحظة شخصية
|
|
224
|
+
|
|
225
|
+
هذه الملاحظة شخصية ولا تؤثر على نتائج المقارنة. في عالم i18n، غالبًا ما ترى إجماعًا حول نمط `const t = useTranslation('xx')` + `<>{t('xx.xx')}</>`.
|
|
226
|
+
|
|
227
|
+
في تطبيقات React، يعد حقن دالة كـ `ReactNode` ، في نظري، نمطًا مضادًا (anti-pattern). كما أنه يضيف تعقيدًا يمكن تجنبه وعبئًا على تنفيذ JavaScript (حتى لو كان غير ملحوظ تقريبًا).
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-04-20
|
|
3
|
+
updatedAt: 2026-04-21
|
|
4
|
+
title: أفضل حل i18n لـ TanStack Start في 2026 - تقرير المقارنة
|
|
5
|
+
description: قارن بين مكتبات تدويل TanStack Start مثل react-i18next و use-intl و Intlayer. تقرير مفصل للأداء حول حجم الحزمة، التسرب، والتفاعلية.
|
|
6
|
+
keywords:
|
|
7
|
+
- benchmark
|
|
8
|
+
- i18n
|
|
9
|
+
- intl
|
|
10
|
+
- tanstack
|
|
11
|
+
- performance
|
|
12
|
+
- intlayer
|
|
13
|
+
slugs:
|
|
14
|
+
- doc
|
|
15
|
+
- benchmark
|
|
16
|
+
- tanstack
|
|
17
|
+
author: Aymeric PINEAU
|
|
18
|
+
applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-tanstack-start-template
|
|
19
|
+
history:
|
|
20
|
+
- version: 8.7.5
|
|
21
|
+
date: 2026-01-06
|
|
22
|
+
changes: "بدء المقارنة"
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# مكتبات i18n لـ TanStack Start — تقرير مقارنة 2026
|
|
26
|
+
|
|
27
|
+
هذه الصفحة عبارة عن تقرير مقارنة لحلول i18n على TanStack Start.
|
|
28
|
+
|
|
29
|
+
## جدول المحتويات
|
|
30
|
+
|
|
31
|
+
<Toc/>
|
|
32
|
+
|
|
33
|
+
## مقارنة تفاعلية
|
|
34
|
+
|
|
35
|
+
<I18nBenchmark framework="tanstack" vertical/>
|
|
36
|
+
|
|
37
|
+
## مرجع النتائج:
|
|
38
|
+
|
|
39
|
+
<iframe
|
|
40
|
+
src="https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-tanstack.md"
|
|
41
|
+
width="100%"
|
|
42
|
+
height="600px"
|
|
43
|
+
style="border:none;">
|
|
44
|
+
</iframe>
|
|
45
|
+
|
|
46
|
+
> https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-tanstack.md
|
|
47
|
+
|
|
48
|
+
شاهد مستودع المقارنة الكامل [هنا](https://github.com/intlayer-org/benchmark-i18n/tree/main).
|
|
49
|
+
|
|
50
|
+
## مقدمة
|
|
51
|
+
|
|
52
|
+
تعد حلول التدويل من بين أثقل الاعتمادات (dependencies) في تطبيق React. في TanStack Start، يتمثل الخطر الرئيسي في شحن محتوى غير ضروري: ترجمات لصفحات أخرى ولغات أخرى في حزمة مسار واحد.
|
|
53
|
+
|
|
54
|
+
مع نمو تطبيقك، يمكن أن تؤدي هذه المشكلة إلى تضخم كود JavaScript المرسل إلى العميل وإبطاء التنقل.
|
|
55
|
+
|
|
56
|
+
في الممارسة العملية، بالنسبة للتطبيقات الأقل تحسينًا، يمكن أن تصبح الصفحة المترجمة أثقل بعدة مرات من النسخة بدون i18n.
|
|
57
|
+
|
|
58
|
+
التأثير الآخر هو على تجربة المطور (DX): كيفية الإعلان عن المحتوى، والأنواع، وتنظيم مساحة الأسماء، والتحميل الديناميكي، والتفاعلية عند تغيير اللغة.
|
|
59
|
+
|
|
60
|
+
## اختبر تطبيقك
|
|
61
|
+
|
|
62
|
+
لاكتشاف مشكلات تسرب i18n بسرعة، قمت بإعداد ماسح ضوئي مجاني متاح [هنا](https://intlayer.org/i18n-seo-scanner).
|
|
63
|
+
|
|
64
|
+
<iframe src="https://intlayer.org/i18n-seo-scanner" width="100%" height="600px" style="border:none;"/>
|
|
65
|
+
|
|
66
|
+
## المشكلة
|
|
67
|
+
|
|
68
|
+
هناك ركيزتان أساسيتان للحد من تكلفة التطبيق متعدد اللغات:
|
|
69
|
+
|
|
70
|
+
- تقسيم المحتوى حسب الصفحة / مساحة الأسماء حتى لا يتم تحميل القواميس بالكامل عندما لا تحتاج إليها.
|
|
71
|
+
- تحميل اللغة الصحيحة ديناميكيًا، فقط عند الحاجة إليها.
|
|
72
|
+
|
|
73
|
+
فهم القيود الفنية لهذه الأساليب:
|
|
74
|
+
|
|
75
|
+
**التحميل الديناميكي**
|
|
76
|
+
|
|
77
|
+
بدون التحميل الديناميكي، تحتفظ معظم الحلول بالرسائل في الذاكرة من الرندرة الأولى، مما يضيف عبئًا كبيرًا للتطبيقات التي تحتوي على العديد من المسارات واللغات.
|
|
78
|
+
|
|
79
|
+
مع التحميل الديناميكي، فإنك تقبل المقايضة: كود JS أولي أقل، ولكن في بعض الأحيان طلب إضافي عند تبديل اللغة.
|
|
80
|
+
|
|
81
|
+
**تقسيم المحتوى**
|
|
82
|
+
|
|
83
|
+
تعتبر الصياغات المبنية حول `const t = useTranslation()` + `t('a.b.c')` ملائمة جدًا ولكنها غالبًا ما تشجع على الاحتفاظ بملفات JSON كبيرة في وقت التشغيل. هذا النموذج يجعل Tree-shaking صعبًا ما لم توفر المكتبة استراتيجية حقيقية للتقسيم لكل صفحة.
|
|
84
|
+
|
|
85
|
+
## المنهجية
|
|
86
|
+
|
|
87
|
+
في هذه المقارنة، قمنا بمقارنة المكتبات التالية:
|
|
88
|
+
|
|
89
|
+
- `Base App` (بدون مكتبة i18n)
|
|
90
|
+
- `react-intlayer` (v8.7.5-canary.0)
|
|
91
|
+
- `react-i18next` (v17.0.2)
|
|
92
|
+
- `use-intl` (v4.9.1)
|
|
93
|
+
- `@lingui/core` (v5.3.0)
|
|
94
|
+
- `@inlang/paraglide-js` (v2.15.1)
|
|
95
|
+
- `tolgee` (v7.0.0)
|
|
96
|
+
- `react-intl` (v10.1.1)
|
|
97
|
+
- `wuchale` (v0.22.11)
|
|
98
|
+
- `gt-react` (vlatest)
|
|
99
|
+
- `lingo.dev` (v0.133.9)
|
|
100
|
+
|
|
101
|
+
إطار العمل هو `TanStack Start` مع تطبيق متعدد اللغات يتكون من **10 صفحات** و **10 لغات**.
|
|
102
|
+
|
|
103
|
+
قارنا بين **أربع استراتيجيات تحميل**:
|
|
104
|
+
|
|
105
|
+
| الاستراتيجية | بدون مساحات أسماء (عام) | مع مساحات أسماء (محدد) |
|
|
106
|
+
| :--------------------- | :--------------------------------------- | :------------------------------------------------------------------ |
|
|
107
|
+
| **التحميل الستاتيكي** | **Static**: كل شيء في الذاكرة عند البدء. | **Scoped static**: تقسيم حسب مساحة الأسماء؛ تحميل كل شيء عند البدء. |
|
|
108
|
+
| **التحميل الديناميكي** | **Dynamic**: التحميل عند الطلب لكل لغة. | **Scoped dynamic**: تحميل دقيق حسب مساحة الأسماء واللغة. |
|
|
109
|
+
|
|
110
|
+
## ملخص الاستراتيجيات
|
|
111
|
+
|
|
112
|
+
- **Static**: بسيط؛ لا يوجد تأخير في الشبكة بعد التحميل الأولي. الجانب السلبي: حجم حزمة كبير.
|
|
113
|
+
- **Dynamic**: يقلل الوزن الأولي (التحميل الكسول). مثالي عندما يكون لديك العديد من اللغات.
|
|
114
|
+
- **Scoped static**: يحافظ على تنظيم الكود (فصل منطقي) بدون طلبات شبكة إضافية معقدة.
|
|
115
|
+
- **Scoped dynamic**: أفضل نهج لتقسيم الكود والأداء. يقلل استهلاك الذاكرة عن طريق تحميل ما تحتاجه الرؤية الحالية واللغة النشطة فقط.
|
|
116
|
+
|
|
117
|
+
## النتائج بالتفصيل
|
|
118
|
+
|
|
119
|
+
### 1 — حلول يجب تجنبها
|
|
120
|
+
|
|
121
|
+
من الواضح أن بعض الحلول، مثل `gt-react` أو `lingo.dev` ، يجب الابتعاد عنها. فهي تجمع بين الارتباط بالبائع وتشويه الكود الخاص بك. والأسوأ من ذلك: رغم قضاء ساعات عديدة في محاولة تنفيذها، إلا أنني لم أتمكن من جعلها تعمل بشكل صحيح على TanStack Start (على غرار Next.js مع `gt-next`).
|
|
122
|
+
|
|
123
|
+
المشكلات التي تمت مواجهتها:
|
|
124
|
+
|
|
125
|
+
**(General Translation)** (`gt-react@latest`):
|
|
126
|
+
|
|
127
|
+
- بالنسبة لتطبيق بحجم حوالي 110 كيلوبايت، يمكن لـ `gt-react` إضافة أكثر من 440 كيلوبايت إضافية (القدر المشاهد في تنفيذ Next.js في نفس المقارنة).
|
|
128
|
+
- `Quota Exceeded, please upgrade your plan` في أول بناء للمشروع.
|
|
129
|
+
- لا يتم رندرة الترجمات؛ أحصل على خطأ `Error: <T> used on the client-side outside of <GTProvider>` ، والذي يبدو أنه خلل في المكتبة.
|
|
130
|
+
- أثناء تنفيذ **gt-tanstack-start-react** ، صادفت أيضًا [مشكلة](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) في المكتبة: `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser` ، والتي أدت إلى تعطل التطبيق. بعد الإبلاغ عن هذه المشكلة، قام المطور بإصلاحها في غضون 24 ساعة.
|
|
131
|
+
- تستخدم هذه المكتبات نمطًا مضادًا من خلال دالة `initializeGT()` ، مما يمنع الحزمة من أن يتم مسحها برمجياً بشكل نظيف.
|
|
132
|
+
|
|
133
|
+
**(Lingo.dev)** (`lingo.dev@0.133.9`):
|
|
134
|
+
|
|
135
|
+
- تجاوز حصة الذكاء الاصطناعي (أو حظر الاعتماد على الخادم)، مما يجعل البناء / الإنتاج محفوفًا بالمخاطر دون دفع مبالغ مالية.
|
|
136
|
+
- كان المترجم يفتقد إلى ما يقرب من 40% من المحتوى المترجم. اضطررت لإعادة كتابة جميع `.map` إلى كتل مكونات مسطحة لجعلها تعمل.
|
|
137
|
+
- واجهة السطر البرمجي (CLI) مليئة بالأخطاء وكانت تعيد ضبط ملف الإعدادات بدون سبب.
|
|
138
|
+
- عند البناء، قامت بمسح ملفات JSON التي تم إنشاؤها تمامًا عندما كان هناك محتوى جديد مضاف. ونتيجة لذلك، يمكن لعدد قليل من المفاتيح مسح المئات من المفاتيح الموجودة.
|
|
139
|
+
- واجهت مشكلات في التفاعلية مع المكتبة على TanStack Start: عند تغيير اللغة، كان علي فرض إعادة رندرة المزود لجعلها تعمل.
|
|
140
|
+
|
|
141
|
+
### 2 — حلول تجريبية
|
|
142
|
+
|
|
143
|
+
**(Wuchale)** (`wuchale@0.22.11`):
|
|
144
|
+
|
|
145
|
+
الفكرة وراء `Wuchale` مثيرة للاهتمام ولكنها ليست حلاً قابلاً للتطبيق بعد. واجهت مشكلات في التفاعلية مع هذه المكتبة واضطررت لفرض إعادة رندرة المزود لجعل التطبيق يعمل على TanStack Start. التوثيق أيضًا غير واضح تمامًا، مما يجعل البدء صعبًا.
|
|
146
|
+
|
|
147
|
+
### 3 — حلول مقبولة
|
|
148
|
+
|
|
149
|
+
**(Paraglide)** (`@inlang/paraglide-js@2.15.1`):
|
|
150
|
+
|
|
151
|
+
يقدم `Paraglide` نهجًا مبتكرًا ومدروسًا جيدًا. ومع ذلك، في هذه المقارنة، لم تعمل ميزة Tree-shaking التي تروج لها شركتهم في تنفيذ Next.js أو TanStack Start. كما أن سير العمل وتجربة المطور أكثر تعقيدًا من الخيارات الأخرى. أنا شخصياً لست معجباً بضرورة إعادة إنشاء ملفات JS قبل كل رفع للكود، مما يخلق خطراً دائماً لتضارب الدمج بين المطورين.
|
|
152
|
+
|
|
153
|
+
**(Tolgee)** (`tolgee@7.0.0`):
|
|
154
|
+
|
|
155
|
+
يعالج `Tolgee` العديد من المشكلات المذكورة سابقًا. وجدت صعوبة في البدء معه أكثر من الأدوات الأخرى ذات التوجهات المشابهة. لا يوفر سلامة الأنواع، مما يجعل اكتشاف المفاتيح المفقودة وقت البناء أمراً صعباً للغاية. اضطررت لتغليف واجهات برمجة تطبيقات Tolgee بواجهاتي الخاصة لإضافة ميزة اكتشاف المفاتيح المفقودة.
|
|
156
|
+
|
|
157
|
+
في TanStack Start، واجهت أيضًا مشكلات في التفاعلية: عند تغيير اللغة، كان علي فرض إعادة رندرة المزود والاشتراك في أحداث تغيير اللغة حتى يعمل التحميل بلغة أخرى بشكل صحيح.
|
|
158
|
+
|
|
159
|
+
**(use-intl)** (`use-intl@4.9.1`):
|
|
160
|
+
|
|
161
|
+
يعد `use-intl` الجزء الأكثر رواجاً في نظام React (من نفس عائلة `next-intl`) وغالباً ما تدعمه أنظمة الذكاء الاصطناعي، ولكن في نظري بشكل خاطئ في بيئة تعطي الأولوية للأداء. البدء بسيط إلى حد ما، ولكن في الممارسة العملية، فإن عملية التحسين والحد من التسرب معقدة للغاية. وبالمثل، فإن الجمع بين التحميل الديناميكي + مساحات الأسماء + أنواع TypeScript يبطئ التطوير كثيراً.
|
|
162
|
+
|
|
163
|
+
في TanStack Start، تتجنب الفخاخ الخاصة بـ Next.js (`setRequestLocale` ، الرندرة الستاتيكية) ، لكن المشكلة الأساسية هي نفسها: بدون انضباط صارم، تحمل الحزمة بسرعة كبيرة العديد من الرسائل وتصبح صيانة مساحة الأسماء لكل مسار مؤلمة.
|
|
164
|
+
|
|
165
|
+
**(react-i18next)** (`react-i18next@17.0.2`):
|
|
166
|
+
|
|
167
|
+
ربما يكون `react-i18next` هو الخيار الأكثر شعبية لأنه كان من أوائل الذين خدموا احتياجات i18n لتطبيقات JavaScript. كما يحتوي على مجموعة واسعة من إضافات المجتمع لمشكلات محددة.
|
|
168
|
+
|
|
169
|
+
ومع ذلك، فإنه يشارك نفس السلبيات الرئيسية مثل الواجهات المبنية على `t('a.b.c')` : التحسينات ممكنة ولكنها تستهلك وقتاً طويلاً جداً، والمشاريع الكبيرة تخاطر بممارسات سيئة (مساحات أسماء + تحميل ديناميكي + أنواع).
|
|
170
|
+
|
|
171
|
+
تختلف تنسيقات الرسائل أيضاً: يستخدم `use-intl` تنسيق ICU MessageFormat، بينما يستخدم `i18next` تنسيقه الخاص — مما يعقد الأدوات أو عمليات النقل إذا قمت بخلطهما.
|
|
172
|
+
|
|
173
|
+
**(Lingui)** (`@lingui/core@5.3.0`):
|
|
174
|
+
|
|
175
|
+
غالبًا ما يتم الإشادة بـ `Lingui`. أنا شخصيًا وجدت سير العمل حول `lingui extract` / `lingui compile` أكثر تعقيدًا من المناهج الأخرى، دون ميزة واضحة في اختبار TanStack Start هذا. لاحظت أيضًا صياغات غير متسقة تربك الذكاء الاصطناعي (مثل `t()` و `t''` و `i18n.t()` و `<Trans>`).
|
|
176
|
+
|
|
177
|
+
**(react-intl)** (`react-intl@10.1.1`):
|
|
178
|
+
|
|
179
|
+
يعد `react-intl` تنفيذاً عالي الأداء من فريق Format.js. تظل تجربة المطور مطولة: `const intl = useIntl()` + `intl.formatMessage({ id: "xx.xx" })` يضيف تعقيداً وعملاً إضافياً على JavaScript ويربط مثيل i18n العالمي بالعديد من العقد في شجرة React.
|
|
180
|
+
|
|
181
|
+
### 4 — التوصيات
|
|
182
|
+
|
|
183
|
+
لا يوجد لهذا الاختبار في TanStack Start مكافئ مباشر لـ `next-translate` (إضافة Next.js + `getStaticProps`). بالنسبة للفرق التي تريد حقاً واجهة برمجة تطبيقات بأسلوب `t()` مع نظام ناضج، يظل `react-i18next` و `use-intl` خيارات "معقولة"، ولكن توقع استثمار الكثير من الوقت في التحسين لتجنب التسرب.
|
|
184
|
+
|
|
185
|
+
**(Intlayer)** (`react-intlayer@8.7.5-canary.0`):
|
|
186
|
+
|
|
187
|
+
لن أحكم شخصيًا على `react-intlayer` من أجل الموضوعية، لأنه حلي الخاص.
|
|
188
|
+
|
|
189
|
+
### ملاحظة شخصية
|
|
190
|
+
|
|
191
|
+
هذه الملاحظة شخصية ولا تؤثر على نتائج المقارنة. ومع ذلك، في عالم i18n، غالبًا ما ترى إجماعًا حول نمط مثل `const t = useTranslation('xx')` + `<>{t('xx.xx')}</>` للمحتوى المترجم.
|
|
192
|
+
|
|
193
|
+
في تطبيقات React، يعد حقن دالة كـ `ReactNode` ، في نظري، نمطًا مضادًا. كما أنه يضيف تعقيدًا يمكن تجنبه وعبئًا على تنفيذ JavaScript (حتى لو كان غير ملحوظ تقريبًا).
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-04-20
|
|
3
|
+
updatedAt: 2026-04-20
|
|
4
|
+
title: Benchmark i18n-Bibliotheken
|
|
5
|
+
description: Erfahren Sie, wie Intlayer im Vergleich zu anderen i18n-Bibliotheken in Bezug auf Performance und Bundle-Größe abschneidet.
|
|
6
|
+
keywords:
|
|
7
|
+
- Benchmark
|
|
8
|
+
- i18n
|
|
9
|
+
- intl
|
|
10
|
+
- nextjs
|
|
11
|
+
- tanstack
|
|
12
|
+
- intlayer
|
|
13
|
+
slugs:
|
|
14
|
+
- doc
|
|
15
|
+
- benchmark
|
|
16
|
+
history:
|
|
17
|
+
- version: 8.7.5
|
|
18
|
+
date: 2026-01-06
|
|
19
|
+
changes: "Benchmark initialisiert"
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Benchmark - Bericht
|
|
23
|
+
|
|
24
|
+
Benchmark Bloom ist eine Performance-Benchmark-Suite, die die realen Auswirkungen von i18n-Bibliotheken (Internationalisierung) über mehrere React-Frameworks und Ladestrategien hinweg misst.
|
|
25
|
+
|
|
26
|
+
Detaillierte Berichte und technische Dokumentation für jedes Framework finden Sie unten:
|
|
27
|
+
|
|
28
|
+
- [**Next.js-Benchmark-Bericht**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/benchmark/nextjs.md)
|
|
29
|
+
- [**TanStack-Start-Benchmark-Bericht**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/benchmark/tanstack.md)
|