@intlayer/docs 9.5.7 → 9.5.8

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 (162) hide show
  1. package/blog/ar/is_intlayer_lighter_than_paraglide.md +284 -0
  2. package/blog/de/is_intlayer_lighter_than_paraglide.md +284 -0
  3. package/blog/en/is_intlayer_lighter_than_paraglide.md +288 -0
  4. package/blog/en-GB/is_intlayer_lighter_than_paraglide.md +285 -0
  5. package/blog/es/is_intlayer_lighter_than_paraglide.md +284 -0
  6. package/blog/fr/is_intlayer_lighter_than_paraglide.md +284 -0
  7. package/blog/hi/is_intlayer_lighter_than_paraglide.md +284 -0
  8. package/blog/id/is_intlayer_lighter_than_paraglide.md +284 -0
  9. package/blog/it/is_intlayer_lighter_than_paraglide.md +284 -0
  10. package/blog/ja/is_intlayer_lighter_than_paraglide.md +284 -0
  11. package/blog/ko/is_intlayer_lighter_than_paraglide.md +284 -0
  12. package/blog/pl/is_intlayer_lighter_than_paraglide.md +284 -0
  13. package/blog/pt/is_intlayer_lighter_than_paraglide.md +284 -0
  14. package/blog/ru/is_intlayer_lighter_than_paraglide.md +284 -0
  15. package/blog/tr/is_intlayer_lighter_than_paraglide.md +284 -0
  16. package/blog/uk/is_intlayer_lighter_than_paraglide.md +284 -0
  17. package/blog/vi/is_intlayer_lighter_than_paraglide.md +284 -0
  18. package/blog/zh/is_intlayer_lighter_than_paraglide.md +284 -0
  19. package/dist/cjs/generated/blog.entry.cjs +20 -0
  20. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  21. package/dist/cjs/generated/docs.entry.cjs +20 -0
  22. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  23. package/dist/cjs/index.cjs +2 -2
  24. package/dist/esm/generated/blog.entry.mjs +20 -0
  25. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  26. package/dist/esm/generated/docs.entry.mjs +20 -0
  27. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  28. package/dist/esm/index.mjs +2 -2
  29. package/dist/types/generated/blog.entry.d.ts +1 -0
  30. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  31. package/dist/types/generated/docs.entry.d.ts +1 -0
  32. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  33. package/docs/ar/benchmark/nextjs.md +6 -3
  34. package/docs/ar/benchmark/solid.md +21 -4
  35. package/docs/ar/benchmark/svelte.md +18 -3
  36. package/docs/ar/benchmark/tanstack.md +6 -3
  37. package/docs/ar/benchmark/vue.md +14 -5
  38. package/docs/ar/cli/index.md +6 -1
  39. package/docs/ar/cli/upgrade.md +125 -0
  40. package/docs/de/benchmark/nextjs.md +6 -3
  41. package/docs/de/benchmark/solid.md +21 -4
  42. package/docs/de/benchmark/svelte.md +18 -3
  43. package/docs/de/benchmark/tanstack.md +6 -3
  44. package/docs/de/benchmark/vue.md +14 -5
  45. package/docs/de/cli/index.md +6 -1
  46. package/docs/de/cli/upgrade.md +125 -0
  47. package/docs/en/agent_skills.md +29 -1
  48. package/docs/en/benchmark/nextjs.md +6 -3
  49. package/docs/en/benchmark/solid.md +21 -4
  50. package/docs/en/benchmark/svelte.md +18 -3
  51. package/docs/en/benchmark/tanstack.md +7 -4
  52. package/docs/en/benchmark/vue.md +15 -6
  53. package/docs/en/cli/index.md +6 -1
  54. package/docs/en/cli/upgrade.md +125 -0
  55. package/docs/en-GB/benchmark/nextjs.md +6 -3
  56. package/docs/en-GB/benchmark/solid.md +21 -4
  57. package/docs/en-GB/benchmark/svelte.md +18 -3
  58. package/docs/en-GB/benchmark/tanstack.md +6 -3
  59. package/docs/en-GB/benchmark/vue.md +15 -6
  60. package/docs/en-GB/cli/index.md +6 -1
  61. package/docs/en-GB/cli/upgrade.md +125 -0
  62. package/docs/es/benchmark/nextjs.md +6 -3
  63. package/docs/es/benchmark/solid.md +21 -4
  64. package/docs/es/benchmark/svelte.md +18 -3
  65. package/docs/es/benchmark/tanstack.md +6 -3
  66. package/docs/es/benchmark/vue.md +14 -5
  67. package/docs/es/cli/index.md +6 -1
  68. package/docs/es/cli/upgrade.md +125 -0
  69. package/docs/fr/benchmark/nextjs.md +6 -3
  70. package/docs/fr/benchmark/solid.md +21 -4
  71. package/docs/fr/benchmark/svelte.md +18 -3
  72. package/docs/fr/benchmark/tanstack.md +6 -3
  73. package/docs/fr/benchmark/vue.md +15 -6
  74. package/docs/fr/cli/index.md +6 -1
  75. package/docs/fr/cli/upgrade.md +125 -0
  76. package/docs/hi/benchmark/nextjs.md +6 -3
  77. package/docs/hi/benchmark/solid.md +21 -4
  78. package/docs/hi/benchmark/svelte.md +18 -3
  79. package/docs/hi/benchmark/tanstack.md +6 -3
  80. package/docs/hi/benchmark/vue.md +15 -6
  81. package/docs/hi/cli/index.md +6 -1
  82. package/docs/hi/cli/upgrade.md +125 -0
  83. package/docs/id/benchmark/nextjs.md +6 -3
  84. package/docs/id/benchmark/solid.md +21 -4
  85. package/docs/id/benchmark/svelte.md +18 -3
  86. package/docs/id/benchmark/tanstack.md +6 -3
  87. package/docs/id/benchmark/vue.md +15 -6
  88. package/docs/id/cli/index.md +6 -1
  89. package/docs/id/cli/upgrade.md +125 -0
  90. package/docs/it/benchmark/nextjs.md +6 -3
  91. package/docs/it/benchmark/solid.md +21 -4
  92. package/docs/it/benchmark/svelte.md +18 -3
  93. package/docs/it/benchmark/tanstack.md +6 -3
  94. package/docs/it/benchmark/vue.md +14 -5
  95. package/docs/it/cli/index.md +6 -1
  96. package/docs/it/cli/upgrade.md +125 -0
  97. package/docs/ja/benchmark/nextjs.md +6 -3
  98. package/docs/ja/benchmark/solid.md +21 -4
  99. package/docs/ja/benchmark/svelte.md +18 -3
  100. package/docs/ja/benchmark/tanstack.md +5 -2
  101. package/docs/ja/benchmark/vue.md +14 -5
  102. package/docs/ja/cli/index.md +6 -1
  103. package/docs/ja/cli/upgrade.md +125 -0
  104. package/docs/ko/benchmark/nextjs.md +6 -3
  105. package/docs/ko/benchmark/solid.md +21 -4
  106. package/docs/ko/benchmark/svelte.md +18 -3
  107. package/docs/ko/benchmark/tanstack.md +6 -3
  108. package/docs/ko/benchmark/vue.md +15 -6
  109. package/docs/ko/cli/index.md +6 -1
  110. package/docs/ko/cli/upgrade.md +126 -0
  111. package/docs/pl/benchmark/nextjs.md +6 -3
  112. package/docs/pl/benchmark/solid.md +21 -4
  113. package/docs/pl/benchmark/svelte.md +18 -3
  114. package/docs/pl/benchmark/tanstack.md +6 -3
  115. package/docs/pl/benchmark/vue.md +15 -6
  116. package/docs/pl/cli/index.md +6 -1
  117. package/docs/pl/cli/upgrade.md +125 -0
  118. package/docs/pt/benchmark/nextjs.md +6 -3
  119. package/docs/pt/benchmark/solid.md +21 -4
  120. package/docs/pt/benchmark/svelte.md +18 -3
  121. package/docs/pt/benchmark/tanstack.md +6 -3
  122. package/docs/pt/benchmark/vue.md +14 -5
  123. package/docs/pt/cli/index.md +6 -1
  124. package/docs/pt/cli/upgrade.md +125 -0
  125. package/docs/ru/benchmark/nextjs.md +6 -3
  126. package/docs/ru/benchmark/solid.md +21 -4
  127. package/docs/ru/benchmark/svelte.md +18 -3
  128. package/docs/ru/benchmark/tanstack.md +6 -3
  129. package/docs/ru/benchmark/vue.md +15 -6
  130. package/docs/ru/cli/index.md +6 -1
  131. package/docs/ru/cli/upgrade.md +125 -0
  132. package/docs/tr/benchmark/nextjs.md +6 -3
  133. package/docs/tr/benchmark/solid.md +21 -4
  134. package/docs/tr/benchmark/svelte.md +18 -3
  135. package/docs/tr/benchmark/tanstack.md +6 -3
  136. package/docs/tr/benchmark/vue.md +15 -6
  137. package/docs/tr/cli/index.md +6 -1
  138. package/docs/tr/cli/upgrade.md +125 -0
  139. package/docs/uk/benchmark/nextjs.md +6 -3
  140. package/docs/uk/benchmark/solid.md +21 -4
  141. package/docs/uk/benchmark/svelte.md +18 -3
  142. package/docs/uk/benchmark/tanstack.md +6 -3
  143. package/docs/uk/benchmark/vue.md +15 -6
  144. package/docs/uk/cli/index.md +6 -1
  145. package/docs/uk/cli/upgrade.md +125 -0
  146. package/docs/vi/benchmark/nextjs.md +6 -3
  147. package/docs/vi/benchmark/solid.md +21 -4
  148. package/docs/vi/benchmark/svelte.md +18 -3
  149. package/docs/vi/benchmark/tanstack.md +6 -3
  150. package/docs/vi/benchmark/vue.md +15 -6
  151. package/docs/vi/cli/index.md +6 -1
  152. package/docs/vi/cli/upgrade.md +125 -0
  153. package/docs/zh/benchmark/nextjs.md +6 -3
  154. package/docs/zh/benchmark/solid.md +21 -4
  155. package/docs/zh/benchmark/svelte.md +18 -3
  156. package/docs/zh/benchmark/tanstack.md +5 -2
  157. package/docs/zh/benchmark/vue.md +15 -6
  158. package/docs/zh/cli/index.md +6 -1
  159. package/docs/zh/cli/upgrade.md +125 -0
  160. package/package.json +6 -6
  161. package/src/generated/blog.entry.ts +20 -0
  162. package/src/generated/docs.entry.ts +20 -0
@@ -0,0 +1,284 @@
1
+ ---
2
+ createdAt: 2026-09-23
3
+ updatedAt: 2026-09-23
4
+ title: क्या Intlayer, Paraglide से हल्का है?
5
+ description: Paraglide i18n बेंचमार्क में लगभग शून्य भार वाला प्रतीत होता है क्योंकि इसका कोड सीधे आपके रिपॉजिटरी में जेनरेट होता है। जानिए यह वजन वास्तव में कहाँ जाता है, प्रति-नोड लोकेल पढ़ना प्रदर्शन को कैसे प्रभावित करता है, और Intlayer का डायनामिक लोडिंग सभी के बजाय केवल एक लोकेल कैसे लोड करता है।
6
+ keywords:
7
+ - Paraglide
8
+ - Intlayer
9
+ - अंतर्राष्ट्रीयकरण
10
+ - i18n
11
+ - Bundle size
12
+ - Tree shaking
13
+ - Benchmark
14
+ - Blog
15
+ slugs:
16
+ - blog
17
+ - is-intlayer-lighter-than-paraglide
18
+ author: aymericzip
19
+ ---
20
+
21
+ # क्या Intlayer, Paraglide से हल्का है?
22
+
23
+ हाँ।
24
+
25
+ `Paraglide` सबसे हल्के i18n समाधान के रूप में जाना जाता है, और पहली नज़र में [बेंचमार्क](https://intlayer.org/hi/doc/benchmark/tanstack) भी इससे सहमत दिखता है: इसका लाइब्रेरी साइज शून्य के करीब है। लेकिन शून्य लाइब्रेरी साइज का मतलब यह नहीं है कि ब्राउज़र को शून्य बाइट भेजे गए हैं। इसका सीधा सा मतलब है कि बाइट्स ऐसी जगह मौजूद हैं जहाँ यह मेट्रिक ध्यान नहीं देती।
26
+
27
+ <TOC/>
28
+
29
+ ## मुख्य निष्कर्ष
30
+
31
+ **लाइब्रेरी का आकार छिपा हुआ है, समाप्त नहीं हुआ:**
32
+
33
+ Paraglide अपने रनटाइम और मैसेज फ़ंक्शंस को सीधे आपके कोडबेस में जेनरेट करता है। वह कोड ब्राउज़र में भेजा जाता है, लेकिन उसे लाइब्रेरी के कोड के बजाय _आपके_ कोड के रूप में गिना जाता है।
34
+
35
+ **बिना प्रोवाइडर के होना मुफ्त का लाभ नहीं है:**
36
+
37
+ प्रत्येक `m.my_key()` कॉल लोकेल को अपने दम पर हल करता है, संदर्भ (context) से एक बार पढ़ने के बजाय रेंडर किए गए प्रत्येक नोड के लिए कुकी या स्टोरेज को पढ़ता है।
38
+
39
+ **कोई डायनामिक लोडिंग नहीं:**
40
+
41
+ Paraglide किसी मैसेज के सभी लोकेल्स को आपके क्लाइंट बंडल में इम्पोर्ट करता है। जबकि Intlayer `importMode: 'dynamic'` या `'fetch'` के साथ केवल उसी लोकेल को लोड करता है जो रेंडर हो रहा है।
42
+
43
+ **Tree shaking की गारंटी नहीं है:**
44
+
45
+ हमारे कुछ बेंचमार्क में, Paraglide का विज्ञापित Tree shaking काम नहीं कर सका। अपने स्वयं के बंडल की जाँच अवश्य करें।
46
+
47
+ ## Paraglide का वजन वास्तव में कहाँ जाता है?
48
+
49
+ बेंचमार्क रिपोर्ट में, "लाइब्रेरी साइज" मेट्रिक किसी भी सामग्री को जोड़ने से पहले, खाली कंपोनेंट में प्रत्येक i18n लाइब्रेरी के प्रोवाइडर और हुक्स को मापती है।
50
+
51
+ | लाइब्रेरी (TanStack Start) | लाइब्रेरी साइज (gz) | लाइब्रेरी साइज (min) |
52
+ | ----------------------------- | ------------------- | -------------------- |
53
+ | `@inlang/paraglide-js@2.15.1` | 1.8 KB | 4.5 KB |
54
+ | `react-intlayer@9.5.1` | 5.0 KB | 15.2 KB |
55
+
56
+ अलग से देखने पर Paraglide जीतता हुआ दिखता है। लेकिन Paraglide एक कंपाइलर है: यह आपकी `messages/*.json` फ़ाइलों को पढ़ता है और आपके रिपॉजिटरी में एक `paraglide/` फ़ोल्डर लिखता है, जिसमें एक `runtime.js` (लोकेल डिटेक्शन, कुकी और स्टोरेज रणनीतियाँ, URL स्थानीयकरण) और प्रति मैसेज एक जावास्क्रिप्ट फ़ंक्शन शामिल होता है।
57
+
58
+ ```bash
59
+ src/paraglide/
60
+ ├── runtime.js # लोकेल डिटेक्शन, रणनीतियाँ, URL हेल्पर्स
61
+ ├── server.js
62
+ ├── messages.js # सभी संदेशों को पुनः निर्यात करता है
63
+ └── messages/
64
+ ├── _index.js
65
+ ├── en.js
66
+ └── fr.js
67
+ ```
68
+
69
+ चूँकि यह कोड आपके `src/` फ़ोल्डर में रहता है और आप इसे रिलेटिव पाथ से इम्पोर्ट करते हैं, इसलिए बंडलर इसे `node_modules` पैकेज के बजाय आपके एप्लिकेशन का हिस्सा मानता है। लाइब्रेरी साइज कॉलम में लगभग कुछ भी दिखाई नहीं देता, जबकि वही लॉजिक आपके पेज बंडल में भेजा जाता है।
70
+
71
+ कोड जेनरेट करना अपने आप में कोई बुरा विचार नहीं है: जेनरेट किया गया रनटाइम केवल वही लॉजिक शामिल करता है जिसकी आपके कॉन्फ़िगरेशन को आवश्यकता होती है (प्रीफ़िक्स रणनीति, कुकी बनाम लोकल स्टोरेज, आदि)। Intlayer बिल्ड समय पर एनवायरनमेंट वेरिएबल्स इंजेक्ट करके अलग तरीके से यही परिणाम प्राप्त करता है, जिससे बंडलर उन शाखाओं को हटा देता है जिनका आपका कॉन्फ़िगरेशन उपयोग नहीं करता है। दोनों ही दृष्टिकोण `i18next` या `next-intl` की तुलना में 3 से 10 गुना हल्के साबित होते हैं।
72
+
73
+ इसलिए निष्पक्ष तुलना लाइब्रेरी साइज की नहीं है। यह **प्रति पेज वास्तव में भेजे गए जावास्क्रिप्ट** की है।
74
+
75
+ ## मापा गया पेज वजन
76
+
77
+ TanStack Start ऐप, 10 पेज, `en` और `fr` रूट्स पर मापा गया, gzip संपीड़न:
78
+
79
+ | सेटअप | पेज JS औसत (gz) | बेस से अधिक | लोकेल लीकेज | अन्य पेज लीकेज |
80
+ | ---------------------------------- | --------------- | ----------- | ----------- | -------------- |
81
+ | बेस (कोई i18n नहीं) | 111.0 KB | - | 0.0% | 0.0% |
82
+ | `paraglide` (कोई भी रणनीति) | 125.1 KB | +14.1 KB | 49.7% | 0.0% |
83
+ | `intlayer` (`importMode: static`) | 125.8 KB | +14.8 KB | 50.0% | 0.0% |
84
+ | `intlayer` (`importMode: dynamic`) | **118.6 KB** | **+7.6 KB** | **0.0%** | **0.0%** |
85
+
86
+ Next.js 16 App Router, समान ऐप:
87
+
88
+ | सेटअप | पेज JS औसत (gz) | बेस से अधिक |
89
+ | ------------------- | --------------- | ----------- |
90
+ | बेस (कोई i18n नहीं) | 141.0 KB | - |
91
+ | `paraglide-next` | 155.3 KB | +14.3 KB |
92
+ | `next-intlayer` | **141.3 KB** | **+0.3 KB** |
93
+
94
+ <I18nBenchmark framework="tanstack" vertical/>
95
+
96
+ > संपूर्ण डेटा [TanStack Start बेंचमार्क रिपोर्ट](https://intlayer.org/hi/doc/benchmark/tanstack) और [Next.js बेंचमार्क रिपोर्ट](https://intlayer.org/hi/doc/benchmark/nextjs) में उपलब्ध है। प्रत्येक बंडल का निरीक्षण [बेंचमार्क रिपॉजिटरी](https://github.com/intlayer-org/benchmark-i18n) में किया जा सकता है।
97
+
98
+ दो बातें स्पष्ट रूप से सामने आती हैं:
99
+
100
+ - `static` मोड में, Intlayer व्यावहारिक रूप से Paraglide के समान ही सामग्री भेजता है (125.8 KB बनाम 125.1 KB)। यह अपेक्षित है: दोनों में उस पेज द्वारा उपयोग किए जाने वाले संदेशों के सभी लोकेल शामिल होते हैं।
101
+ - Paraglide किसी भी रणनीति में 125.1 KB पर बना रहता है, क्योंकि इसमें कोई डायनामिक मोड नहीं है। ऊपर दी गई तालिका की प्रत्येक पंक्ति इसके स्थिर मोड का प्रतिनिधित्व करती है।
102
+
103
+ ## कोई प्रोवाइडर नहीं: एक विचार जो अच्छा दिखता है पर है नहीं
104
+
105
+ Paraglide को किसी प्रोवाइडर की आवश्यकता नहीं होती। आप सीधे मैसेज इम्पोर्ट करते हैं और कॉल करते हैं:
106
+
107
+ ```tsx fileName="Hero.tsx"
108
+ import { m } from "../paraglide/messages.js";
109
+
110
+ export const Hero = () => (
111
+ <section>
112
+ <h1>{m.hero_title()}</h1>
113
+ <p>{m.hero_description()}</p>
114
+ <button>{m.hero_cta()}</button>
115
+ </section>
116
+ );
117
+ ```
118
+
119
+ कोई संदर्भ नहीं, कोई रैपर नहीं, कोई हुक नहीं। यह सरल दिखता है। लेकिन लोकेल की जानकारी कहीं से तो आनी ही चाहिए। प्रत्येक जेनरेट किया गया मैसेज फ़ंक्शन लगभग ऐसा दिखता है (सरलीकृत):
120
+
121
+ ```js fileName="paraglide/messages/_index.js"
122
+ export const hero_title = (inputs = {}, options = {}) => {
123
+ const locale = options.locale ?? getLocale(); // प्रत्येक कॉल पर हल किया जाता है
124
+
125
+ if (locale === "en") return en.hero_title(inputs);
126
+ if (locale === "fr") return fr.hero_title(inputs);
127
+ // ...प्रत्येक लोकेल के लिए एक ब्रांच
128
+ };
129
+ ```
130
+
131
+ और `getLocale()` वर्तमान लोकेल खोजने के लिए कॉन्फ़िगर की गई रणनीतियों (कुकी, लोकल स्टोरेज, URL, बेस लोकेल) को स्कैन करता है। इसलिए आपके द्वारा रेंडर किया जाने वाला प्रत्येक टेक्स्ट नोड (`<>{m.my_key()}</>`) अपना स्वयं का लोकेल रिज़ॉल्यूशन चलाता है, जिसमें ब्राउज़र में `document.cookie` पढ़ना भी शामिल है। 200 अनुवादित स्ट्रिंग्स वाला एक पेज प्रति रेंडर 200 बार लोकेल हल करता है, और प्रत्येक री-रेंडर पर इसे दोहराता है।
132
+
133
+ एक प्रोवाइडर-आधारित लाइब्रेरी लोकेल को **केवल एक बार** पढ़ती है, इसे एक संदर्भ (या सिग्नल, या स्टोर) में संग्रहीत करती है, और प्रत्येक नोड मेमोरी में पहले से मौजूद मान को पढ़ता है। प्रोवाइडर का आकार कुछ सौ बाइट्स का होता है। इसे छोड़ने पर प्रत्येक रेंडर में सीपीयू की खपत होती है, जो बेंचमार्क में स्पष्ट दिखाई देता है: TanStack Start पर Paraglide का पेज लोड और भाषा बदलने का समय Intlayer से लगातार पीछे रहता है (पेज लोड में 22.1 ms बनाम 14.6 ms, E2E प्रतिक्रिया में 4.3 ms बनाम 3.2 ms)।
134
+
135
+ ## डेवलपर अनुभव (DX)
136
+
137
+ Paraglide का सोर्स ऑफ ट्रुथ JSON है, लेकिन आप सीधे JSON को कभी इम्पोर्ट नहीं करते हैं। आप कंपाइलर द्वारा जेनरेट की गई `.js` फ़ाइल को इम्पोर्ट करते हैं:
138
+
139
+ <Tabs defaultTab="intlayer" group="techno">
140
+ <Tab label="Paraglide" value="paraglide">
141
+
142
+ ```json fileName="messages/en.json"
143
+ {
144
+ "hero_title": "Ship your app in every language"
145
+ }
146
+ ```
147
+
148
+ ```json fileName="messages/hi.json"
149
+ {
150
+ "hero_title": "अपने ऐप को हर भाषा में प्रकाशित करें"
151
+ }
152
+ ```
153
+
154
+ ```tsx fileName="Hero.tsx"
155
+ // कंपाइलर द्वारा JSON से पुनः उत्पन्न किए जाने के बाद ही मौजूद होता है
156
+ import { m } from "../paraglide/messages.js";
157
+
158
+ export const Hero = () => <h1>{m.hero_title()}</h1>;
159
+ ```
160
+
161
+ </Tab>
162
+ <Tab label="Intlayer" value="intlayer">
163
+
164
+ ```ts fileName="Hero.content.ts"
165
+ import { t, type Dictionary } from "intlayer";
166
+
167
+ export default {
168
+ key: "hero",
169
+ content: {
170
+ title: t({
171
+ hi: "अपने ऐप को हर भाषा में प्रकाशित करें",
172
+ en: "Ship your app in every language",
173
+ }),
174
+ },
175
+ } satisfies Dictionary;
176
+ ```
177
+
178
+ ```tsx fileName="Hero.tsx"
179
+ import { useIntlayer } from "react-intlayer";
180
+
181
+ export const Hero = () => {
182
+ const { title } = useIntlayer("hero");
183
+
184
+ return <h1>{title}</h1>;
185
+ };
186
+ ```
187
+
188
+ </Tab>
189
+ </Tabs>
190
+
191
+ इस कार्यप्रणाली की अपनी कमियां हैं:
192
+
193
+ - JSON फ़ाइल में प्रत्येक परिवर्तन के लिए इम्पोर्ट के रिज़ॉल्व होने या प्रकारों के अपडेट होने से पहले पुनः जेनरेशन की आवश्यकता होती है।
194
+ - जेनरेट किया गया `paraglide/` फ़ोल्डर या तो गिट में कमिट किया जाना चाहिए (जिससे टेक्स्ट बदलने वाले प्रत्येक पीआर में जेनरेट की गई फ़ाइलों पर मर्ज टकराव होता है), या इसे अनदेखा किया जाना चाहिए (जिसके लिए प्रत्येक टाइप चेक, टेस्ट और सीआई जॉब से पहले एक जेनरेशन चरण की आवश्यकता होती है)।
195
+ - प्रत्येक स्ट्रिंग एक फ़ंक्शन कॉल बन जाती है। स्थिरांक हर जगह `m.key()` में बदल जाते हैं, यहाँ तक कि उन स्थानों पर भी जहाँ एक साधारण स्ट्रिंग मान पर्याप्त होता।
196
+
197
+ ## Tree Shaking: अपना बंडल जांचें
198
+
199
+ Paraglide का मुख्य वादा यह है कि अप्रयुक्त संदेशों को Tree shaking द्वारा हटा दिया जाता है, क्योंकि प्रत्येक संदेश अपना स्वयं का निर्यात होता है। Svelte + Vite बेंचमार्क में, यह विज्ञापनों के अनुसार काम करता है।
200
+
201
+ अन्य सेटअपों में ऐसा नहीं हुआ। हमारे [Next.js](https://intlayer.org/hi/doc/benchmark/nextjs) परीक्षण में, Paraglide के पेज बेस ऐप से 14 KB अधिक भारी थे, जबकि `next-intlayer` ने केवल 0.3 KB जोड़ा। TanStack Start पर पहले के परीक्षणों से यह भी पता चला कि अन्य पेजों के संदेश भी वर्तमान रूट बंडल में शामिल हो रहे थे।
202
+
203
+ Tree shaking आपके बंडलर (Turbopack, Rolldown, Rollup), संदेशों को आयात करने के तरीके (`import { m }` बनाम `import * as m`) और साइड-इफेक्ट विश्लेषण पर निर्भर करता है। यदि आप इसके आकार के कारण Paraglide चुनते हैं, तो अपने बंडल विज़ुअलाइज़र को खोलें और सत्यापित करें कि यह आपके ऐप में सही काम कर रहा है या नहीं।
204
+
205
+ ## कोई डायनामिक लोडिंग नहीं
206
+
207
+ यह संरचनात्मक सीमा है। Paraglide के पास एक समय में एक लोकेल लोड करने का कोई साधन नहीं है: प्रत्येक संदेश फ़ंक्शन प्रत्येक भाषा के कार्यान्वयन को स्थैतिक रूप से आयात करता है, इसलिए सभी भाषाएं आपके क्लाइंट बंडल में समाप्त हो जाती हैं।
208
+
209
+ 2 भाषाओं के साथ, आपका आधा अनुवाद पेलोड बर्बाद हो जाता है, जो ऊपर मापे गए ~50% लोकेल रिसाव से मेल खाता है। 10 भाषाओं के साथ, 90% पेलोड बर्बाद होता है। 30 भाषाओं के साथ, 97%।
210
+
211
+ डायनामिक लोडिंग पर स्विच करने से भी इसका समाधान नहीं होगा: प्रति संदेश एक फ़ंक्शन होने के कारण, प्रत्येक फ़ंक्शन को लेज़ी-लोड करने का अर्थ हजारों नेटवर्क अनुरोध होगा।
212
+
213
+ Intlayer आपको विश्व स्तर पर या प्रति डिक्शनरी चुनने की सुविधा देता है:
214
+
215
+ ```ts fileName="intlayer.config.ts"
216
+ import { Locales, type IntlayerConfig } from "intlayer";
217
+
218
+ const config: IntlayerConfig = {
219
+ internationalization: {
220
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
221
+ defaultLocale: Locales.ENGLISH,
222
+ },
223
+ dictionary: {
224
+ importMode: "dynamic", // 'static' | 'dynamic' | 'fetch'
225
+ },
226
+ };
227
+
228
+ export default config;
229
+ ```
230
+
231
+ | `importMode` | क्लाइंट को क्या भेजा जाता है | Paraglide की तुलना में |
232
+ | ------------ | ------------------------------------------------------ | ---------------------------------- |
233
+ | `static` | पेज द्वारा उपयोग की जाने वाली डिक्शनरी के सभी लोकेल्स | सैद्धांतिक रूप से समान सामग्री |
234
+ | `dynamic` | केवल वर्तमान लोकेल, प्रति डिक्शनरी लेज़ी-लोड किया गया | N भाषाओं में **N गुना अधिक हल्का** |
235
+ | `fetch` | केवल वर्तमान लोकेल, Live Sync API के माध्यम से प्राप्त | N भाषाओं में **N गुना अधिक हल्का** |
236
+
237
+ [बिल्ड ट्रांसफ़ॉर्मेशन](https://intlayer.org/hi/doc/concept/bundle-optimization) और `importMode: 'static'` के साथ, Intlayer सैद्धांतिक रूप से Paraglide के समान ही सामग्री लोड करता है। `'dynamic'` या `'fetch'` के साथ, यह केवल वही लोड करता है जिसकी वर्तमान लोकेल को आवश्यकता होती है: N भाषाओं वाले ऐप के लिए, अनुवाद पेलोड Paraglide की तुलना में N गुना छोटा होता है।
238
+
239
+ ## Paraglide कहाँ अभी भी उपयुक्त है
240
+
241
+ <AccordionGroup>
242
+ <Accordion header="कम भाषाओं के साथ Svelte + Vite">
243
+
244
+ यदि आपका स्टैक Vite के साथ Svelte है और आप दो या तीन भाषाओं का समर्थन करते हैं, तो Tree shaking विज्ञापनों के अनुसार काम करता है और लोकेल का ओवरहेड छोटा रहता है।
245
+
246
+ </Accordion>
247
+ <Accordion header="मौजूदा inlang वर्कफ़्लो">
248
+
249
+ यदि आपकी टीम पहले से ही inlang पारिस्थितिकी तंत्र (Fink, Sherlock, मैसेज फॉर्मेट प्लगइन्स) का उपयोग करती है, तो Paraglide इसके साथ मूल रूप से एकीकृत होता है।
250
+
251
+ </Accordion>
252
+ </AccordionGroup>
253
+
254
+ ## अपने ऐप पर इसे आज़माएं
255
+
256
+ मुफ़्त [i18n SEO Scanner](https://intlayer.org/i18n-seo-scanner) के साथ अपने लाइव एप्लिकेशन के पेलोड और लोकेल लीकेज की जाँच करें:
257
+
258
+ <ClickToOpenIframe src="https://intlayer.org/i18n-seo-scanner" width="100%" height="600px" style="border:none;"/>
259
+
260
+ Intlayer सेट अप करने के लिए:
261
+
262
+ ```bash packageManager="npm"
263
+ npx intlayer init --interactive
264
+ ```
265
+
266
+ ```bash packageManager="pnpm"
267
+ pnpm dlx intlayer init --interactive
268
+ ```
269
+
270
+ ```bash packageManager="yarn"
271
+ yarn dlx intlayer init --interactive
272
+ ```
273
+
274
+ ```bash packageManager="bun"
275
+ bunx intlayer init --interactive
276
+ ```
277
+
278
+ ## अतिरिक्त संदर्भ
279
+
280
+ - [TanStack Start i18n बेंचमार्क](https://intlayer.org/hi/doc/benchmark/tanstack)
281
+ - [Next.js i18n बेंचमार्क](https://intlayer.org/hi/doc/benchmark/nextjs)
282
+ - [बंडल अनुकूलन और `importMode`](https://intlayer.org/hi/doc/concept/bundle-optimization)
283
+ - [React i18n लाइब्रेरी कैसे चुनें](https://intlayer.org/hi/blog/how-to-pick-react-i18n-library)
284
+ - [कंपाइलर-संचालित अंतर्राष्ट्रीयकरण के पक्ष और विपक्ष](https://intlayer.org/hi/blog/compiler-vs-declarative-i18n)
@@ -0,0 +1,284 @@
1
+ ---
2
+ createdAt: 2026-09-23
3
+ updatedAt: 2026-09-23
4
+ title: Apakah Intlayer lebih ringan dari Paraglide?
5
+ description: Paraglide terlihat hampir tanpa beban dalam tolok ukur i18n karena kodenya dibuat langsung di repositori Anda. Berikut analisis ke mana beban tersebut sebenarnya berada, mengapa pembacaan lokal per-node membebani performa, dan bagaimana pemuatan dinamis Intlayer mengirimkan satu bahasa saja alih-alih semuanya.
6
+ keywords:
7
+ - Paraglide
8
+ - Intlayer
9
+ - Internasionalisasi
10
+ - i18n
11
+ - Bundle size
12
+ - Tree shaking
13
+ - Benchmark
14
+ - Blog
15
+ slugs:
16
+ - blog
17
+ - is-intlayer-lighter-than-paraglide
18
+ author: aymericzip
19
+ ---
20
+
21
+ # Apakah Intlayer lebih ringan dari Paraglide?
22
+
23
+ Ya.
24
+
25
+ `Paraglide` memiliki reputasi yang sangat baik sebagai solusi i18n paling ringan, dan sekilas hasil [benchmark](https://intlayer.org/id/doc/benchmark/tanstack) mengonfirmasi hal tersebut: ukuran pustakanya mendekati nol. Namun, ukuran pustaka nol tidak berarti nol bita yang dikirim ke peramban. Itu hanya berarti bita-bita tersebut berada di tempat yang tidak diukur oleh metrik tersebut.
26
+
27
+ <TOC/>
28
+
29
+ ## Poin Kunci
30
+
31
+ **Ukuran pustaka disembunyikan, bukan dihilangkan:**
32
+
33
+ Paraglide membuat kode runtime dan fungsi pesannya langsung di dalam codebase Anda. Kode tersebut tetap dikirim ke peramban, tetapi dihitung sebagai kode _Anda_, bukan sebagai kode pustaka pihak ketiga.
34
+
35
+ **Tanpa provider bukan berarti kemenangan cuma-cuma:**
36
+
37
+ Setiap pemanggilan `m.my_key()` menyelesaikan penentuan lokal secara mandiri, membaca cookie atau penyimpanan untuk setiap node yang dirender, alih-alih membacanya sekali saja dari sebuah konteks.
38
+
39
+ **Tidak ada pemuatan dinamis (Dynamic Loading):**
40
+
41
+ Paraglide mengimpor seluruh bahasa dari sebuah pesan ke dalam bundle klien Anda. Sebaliknya, Intlayer dengan `importMode: 'dynamic'` atau `'fetch'` hanya memuat bahasa yang sedang dirender.
42
+
43
+ **Tree shaking tidak selalu terjamin:**
44
+
45
+ Dalam beberapa pengujian tolok ukur kami, tree shaking yang digadang-gadang oleh Paraglide tidak bekerja efektif. Sebaiknya periksa bundle aplikasi Anda sendiri.
46
+
47
+ ## Ke Mana Sebenarnya Beban Paraglide Berada?
48
+
49
+ Dalam laporan tolok ukur, metrik "ukuran pustaka" mengukur provider dan hook dari masing-masing pustaka i18n pada komponen kosong, sebelum konten apa pun ditambahkan.
50
+
51
+ | Pustaka (TanStack Start) | Ukuran lib (gz) | Ukuran lib (min) |
52
+ | ----------------------------- | --------------- | ---------------- |
53
+ | `@inlang/paraglide-js@2.15.1` | 1.8 KB | 4.5 KB |
54
+ | `react-intlayer@9.5.1` | 5.0 KB | 15.2 KB |
55
+
56
+ Jika dibaca secara terpisah, Paraglide tampak unggul. Namun Paraglide adalah sebuah kompilator: ia membaca berkas `messages/*.json` Anda dan menulis folder `paraglide/` ke repositori Anda, yang berisi `runtime.js` (deteksi lokal, strategi cookie dan penyimpanan, pelokalan URL) serta satu fungsi JavaScript per pesan.
57
+
58
+ ```bash
59
+ src/paraglide/
60
+ ├── runtime.js # deteksi lokal, strategi, helper URL
61
+ ├── server.js
62
+ ├── messages.js # mengekspor kembali semua pesan
63
+ └── messages/
64
+ ├── _index.js
65
+ ├── en.js
66
+ └── fr.js
67
+ ```
68
+
69
+ Karena kode ini berada di dalam folder `src/` Anda dan diimpor menggunakan jalur relatif, bundler menganggapnya sebagai bagian dari aplikasi Anda, bukan paket luar di `node_modules`. Kolom ukuran pustaka memperlihatkan angka mendekati nol, padahal logika yang sama tetap dikirim dalam bundle halaman Anda.
70
+
71
+ Menghasilkan kode otomatis bukanlah ide buruk: runtime yang dihasilkan hanya memuat logika yang benar-benar dibutuhkan konfigurasi Anda (strategi awalan, cookie vs local storage, dll.). Intlayer mencapai hasil yang sama dengan cara berbeda, yaitu menyuntikkan variabel lingkungan saat proses build sehingga bundler membuang percabangan kode yang tidak digunakan konfigurasi Anda. Kedua pendekatan ini berakhir 3 hingga 10 kali lebih ringan daripada `i18next` atau `next-intl`.
72
+
73
+ Oleh karena itu, perbandingan yang adil bukanlah ukuran pustakanya, melainkan **JavaScript yang benar-benar dikirimkan per halaman**.
74
+
75
+ ## Beban Halaman yang Terukur
76
+
77
+ Aplikasi TanStack Start, 10 halaman, diukur pada rute `en` dan `fr`, dikompresi dengan gzip:
78
+
79
+ | Konfigurasi | Rata-rata JS Hal (gz) | Di atas dasar | Kebocoran lokal | Kebocoran hal lain |
80
+ | ---------------------------------- | --------------------- | ------------- | --------------- | ------------------ |
81
+ | Dasar (tanpa i18n) | 111.0 KB | - | 0.0% | 0.0% |
82
+ | `paraglide` (semua strategi) | 125.1 KB | +14.1 KB | 49.7% | 0.0% |
83
+ | `intlayer` (`importMode: static`) | 125.8 KB | +14.8 KB | 50.0% | 0.0% |
84
+ | `intlayer` (`importMode: dynamic`) | **118.6 KB** | **+7.6 KB** | **0.0%** | **0.0%** |
85
+
86
+ Next.js 16 App Router, aplikasi yang sama:
87
+
88
+ | Konfigurasi | Rata-rata JS Hal (gz) | Di atas dasar |
89
+ | ------------------ | --------------------- | ------------- |
90
+ | Dasar (tanpa i18n) | 141.0 KB | - |
91
+ | `paraglide-next` | 155.3 KB | +14.3 KB |
92
+ | `next-intlayer` | **141.3 KB** | **+0.3 KB** |
93
+
94
+ <I18nBenchmark framework="tanstack" vertical/>
95
+
96
+ > Data lengkap tersedia di [laporan benchmark TanStack Start](https://intlayer.org/id/doc/benchmark/tanstack) dan [laporan benchmark Next.js](https://intlayer.org/id/doc/benchmark/nextjs). Setiap bundle dapat diperiksa langsung di [repositori benchmark](https://github.com/intlayer-org/benchmark-i18n).
97
+
98
+ Dua hal terlihat sangat jelas:
99
+
100
+ - Dalam mode `static`, Intlayer mengirimkan konten yang hampir sama persis dengan Paraglide (125.8 KB vs 125.1 KB). Hal ini wajar: keduanya menyertakan semua bahasa dari pesan yang digunakan oleh halaman tersebut.
101
+ - Paraglide tetap berada di angka 125.1 KB apa pun strateginya, karena tidak memiliki mode dinamis. Setiap baris pada tabel di atas mewakili mode statis.
102
+
103
+ ## Tanpa Provider: Ide yang Tampak Bagus Namun Berisiko
104
+
105
+ Paraglide tidak memerlukan provider. Anda cukup mengimpor pesan dan memanggilnya:
106
+
107
+ ```tsx fileName="Hero.tsx"
108
+ import { m } from "../paraglide/messages.js";
109
+
110
+ export const Hero = () => (
111
+ <section>
112
+ <h1>{m.hero_title()}</h1>
113
+ <p>{m.hero_description()}</p>
114
+ <button>{m.hero_cta()}</button>
115
+ </section>
116
+ );
117
+ ```
118
+
119
+ Tanpa konteks, tanpa wrapper, tanpa hook. Tampak lebih sederhana. Namun, informasi bahasa tetap harus diperoleh dari suatu tempat. Setiap fungsi pesan yang dihasilkan kurang lebih tampak seperti ini (disederhanakan):
120
+
121
+ ```js fileName="paraglide/messages/_index.js"
122
+ export const hero_title = (inputs = {}, options = {}) => {
123
+ const locale = options.locale ?? getLocale(); // diselesaikan pada setiap pemanggilan
124
+
125
+ if (locale === "en") return en.hero_title(inputs);
126
+ if (locale === "fr") return fr.hero_title(inputs);
127
+ // ...satu percabangan per bahasa
128
+ };
129
+ ```
130
+
131
+ Dan `getLocale()` menelusuri seluruh strategi yang dikonfigurasi (cookie, penyimpanan lokal, URL, bahasa dasar) untuk menemukan lokal aktif. Akibatnya, setiap node teks yang Anda render (`<>{m.my_key()}</>`) menjalankan proses resolusi lokalnya sendiri, termasuk membaca `document.cookie` di peramban. Halaman dengan 200 string terjemahan akan menyelesaikan lokal sebanyak 200 kali per render, dan berulang kembali pada setiap re-render.
132
+
133
+ Pustaka berbasis provider membaca lokal **hanya sekali**, menyimpannya dalam konteks (atau sinyal, atau store), dan setiap node hanya membaca nilai yang sudah tersedia di memori. Biaya provider hanya beberapa ratus bita. Menghilangkannya justru membebani kerja CPU pada setiap render. Hal ini terbukti dalam tolok ukur: waktu muat halaman dan pergantian bahasa Paraglide konsisten berada di belakang Intlayer pada TanStack Start (waktu muat halaman 22.1 ms vs 14.6 ms, reaktivitas E2E 4.3 ms vs 3.2 ms).
134
+
135
+ ## Pengalaman Pengembang (DX)
136
+
137
+ Sumber kebenaran Paraglide adalah berkas JSON, tetapi Anda tidak pernah mengimpor berkas JSON secara langsung. Anda mengimpor berkas `.js` yang dihasilkan:
138
+
139
+ <Tabs defaultTab="intlayer" group="techno">
140
+ <Tab label="Paraglide" value="paraglide">
141
+
142
+ ```json fileName="messages/en.json"
143
+ {
144
+ "hero_title": "Ship your app in every language"
145
+ }
146
+ ```
147
+
148
+ ```json fileName="messages/id.json"
149
+ {
150
+ "hero_title": "Rilis aplikasi Anda dalam semua bahasa"
151
+ }
152
+ ```
153
+
154
+ ```tsx fileName="Hero.tsx"
155
+ // Hanya ada setelah kompilator membuatnya ulang dari JSON
156
+ import { m } from "../paraglide/messages.js";
157
+
158
+ export const Hero = () => <h1>{m.hero_title()}</h1>;
159
+ ```
160
+
161
+ </Tab>
162
+ <Tab label="Intlayer" value="intlayer">
163
+
164
+ ```ts fileName="Hero.content.ts"
165
+ import { t, type Dictionary } from "intlayer";
166
+
167
+ export default {
168
+ key: "hero",
169
+ content: {
170
+ title: t({
171
+ id: "Rilis aplikasi Anda dalam semua bahasa",
172
+ en: "Ship your app in every language",
173
+ }),
174
+ },
175
+ } satisfies Dictionary;
176
+ ```
177
+
178
+ ```tsx fileName="Hero.tsx"
179
+ import { useIntlayer } from "react-intlayer";
180
+
181
+ export const Hero = () => {
182
+ const { title } = useIntlayer("hero");
183
+
184
+ return <h1>{title}</h1>;
185
+ };
186
+ ```
187
+
188
+ </Tab>
189
+ </Tabs>
190
+
191
+ Alur kerja semacam ini menimbulkan konsekuensi:
192
+
193
+ - Setiap perubahan pada berkas JSON memerlukan pembuatan ulang (regeneration) sebelum import dapat dikenali atau tipe data diperbarui.
194
+ - Folder `paraglide/` yang dibuat harus diikutsertakan dalam commit git (memicu konflik merge pada berkas buatan di setiap PR teks), atau diabaikan (mengharuskan langkah kompilasi sebelum pemeriksaan tipe, pengujian, dan tugas CI).
195
+ - Setiap string berubah menjadi pemanggilan fungsi. Konstanta berubah menjadi `m.key()` di mana-mana, bahkan di tempat yang sebenarnya cukup dengan nilai statis biasa.
196
+
197
+ ## Tree Shaking: Periksa Bundle Anda
198
+
199
+ Janji utama Paraglide adalah bahwa pesan yang tidak digunakan akan dibuang melalui tree shaking, karena setiap pesan merupakan ekspor mandiri. Pada tolok ukur Svelte + Vite, fitur ini bekerja sesuai klaim.
200
+
201
+ Namun dalam konfigurasi lain, hal itu tidak terjadi. Pada pengujian [Next.js](https://intlayer.org/id/doc/benchmark/nextjs) kami, halaman Paraglide berbobot 14 KB lebih berat daripada aplikasi dasar, sedangkan `next-intlayer` hanya menambahkan 0.3 KB. Pengujian awal di TanStack Start juga memperlihatkan pesan dari halaman lain ikut terbawa ke dalam bundle rute yang sedang dibuka.
202
+
203
+ Tree shaking sangat bergantung pada bundler Anda (Turbopack, Rolldown, Rollup), cara pesan diimpor (`import { m }` vs `import * as m`), dan analisis efek samping (side effects). Jika Anda memilih Paraglide karena pertimbangan ukuran, buka visualizer bundle Anda dan pastikan fitur tersebut bekerja di aplikasi Anda.
204
+
205
+ ## Tanpa Pemuatan Dinamis
206
+
207
+ Inilah batasan struktural utamanya. Paraglide tidak memiliki mekanisme untuk memuat satu bahasa dalam satu waktu: setiap fungsi pesan secara statis mengimpor implementasi setiap bahasa, sehingga seluruh bahasa berakhir di dalam bundle klien Anda.
208
+
209
+ Dengan 2 bahasa, separuh muatan terjemahan terbuang sia-sia, cocok dengan ~50% kebocoran lokal yang diukur sebelumnya. Dengan 10 bahasa, pemborosan mencapai 90%. Dengan 30 bahasa, melonjak hingga 97%.
210
+
211
+ Beralih ke pemuatan dinamis pun tidak serta-merta menyelesaikan masalah: dengan satu fungsi untuk setiap pesan, memuat setiap fungsi secara lazy akan memicu ribuan permintaan jaringan yang terpisah-pisah.
212
+
213
+ Intlayer memberi Anda fleksibilitas untuk memilih secara global maupun per kamus:
214
+
215
+ ```ts fileName="intlayer.config.ts"
216
+ import { Locales, type IntlayerConfig } from "intlayer";
217
+
218
+ const config: IntlayerConfig = {
219
+ internationalization: {
220
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
221
+ defaultLocale: Locales.ENGLISH,
222
+ },
223
+ dictionary: {
224
+ importMode: "dynamic", // 'static' | 'dynamic' | 'fetch'
225
+ },
226
+ };
227
+
228
+ export default config;
229
+ ```
230
+
231
+ | `importMode` | Yang dikirimkan ke klien | vs. Paraglide |
232
+ | ------------ | ------------------------------------------------------- | --------------------------------------- |
233
+ | `static` | Seluruh bahasa dari kamus yang digunakan halaman | Secara teori muatan sama |
234
+ | `dynamic` | Hanya bahasa aktif, dimuat secara lazy per kamus | **N kali lebih ringan** dengan N bahasa |
235
+ | `fetch` | Hanya bahasa aktif, diambil langsung dari Live Sync API | **N kali lebih ringan** dengan N bahasa |
236
+
237
+ Dengan [transformasi build](https://intlayer.org/id/doc/concept/bundle-optimization) dan `importMode: 'static'`, Intlayer secara teoritis memuat konten yang sama persis dengan Paraglide. Namun dengan mode `'dynamic'` atau `'fetch'`, ia hanya memuat apa yang dibutuhkan bahasa saat ini: untuk aplikasi dengan N bahasa, beban terjemahan menjadi N kali lebih kecil daripada Paraglide.
238
+
239
+ ## Kapan Paraglide Masih Relevan?
240
+
241
+ <AccordionGroup>
242
+ <Accordion header="Svelte + Vite dengan sedikit bahasa">
243
+
244
+ Jika teknologi Anda menggunakan Svelte bersama Vite dan Anda hanya mendukung dua atau tiga bahasa, tree shaking bekerja sesuai harapan dan overhead bahasa tambahan tetap minim.
245
+
246
+ </Accordion>
247
+ <Accordion header="Alur kerja inlang yang sudah ada">
248
+
249
+ Jika tim Anda sudah terbiasa menggunakan ekosistem inlang (Fink, Sherlock, plugin format pesan), Paraglide terintegrasi secara mulus.
250
+
251
+ </Accordion>
252
+ </AccordionGroup>
253
+
254
+ ## Uji Sendiri di Aplikasi Anda
255
+
256
+ Periksa ukuran muatan dan kebocoran lokal aplikasi produksi Anda dengan [i18n SEO Scanner](https://intlayer.org/i18n-seo-scanner) gratis:
257
+
258
+ <ClickToOpenIframe src="https://intlayer.org/i18n-seo-scanner" width="100%" height="600px" style="border:none;"/>
259
+
260
+ Untuk menyiapkan Intlayer:
261
+
262
+ ```bash packageManager="npm"
263
+ npx intlayer init --interactive
264
+ ```
265
+
266
+ ```bash packageManager="pnpm"
267
+ pnpm dlx intlayer init --interactive
268
+ ```
269
+
270
+ ```bash packageManager="yarn"
271
+ yarn dlx intlayer init --interactive
272
+ ```
273
+
274
+ ```bash packageManager="bun"
275
+ bunx intlayer init --interactive
276
+ ```
277
+
278
+ ## Bacaan Lanjutan
279
+
280
+ - [Benchmark i18n TanStack Start](https://intlayer.org/id/doc/benchmark/tanstack)
281
+ - [Benchmark i18n Next.js](https://intlayer.org/id/doc/benchmark/nextjs)
282
+ - [Optimasi Bundle dan `importMode`](https://intlayer.org/id/doc/concept/bundle-optimization)
283
+ - [Cara Memilih Pustaka i18n untuk React](https://intlayer.org/id/blog/how-to-pick-react-i18n-library)
284
+ - [Alasan Memilih Internasionalisasi Berbasis Kompilator](https://intlayer.org/id/blog/compiler-vs-declarative-i18n)