@intlayer/docs 8.12.2 → 8.12.4-canary.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/dist/cjs/blog.cjs.map +1 -1
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/doc.cjs.map +1 -1
- package/dist/cjs/frequentQuestions.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +1 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +1 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +1 -0
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +1 -0
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/cjs/legal.cjs.map +1 -1
- package/dist/esm/blog.mjs.map +1 -1
- package/dist/esm/common.mjs.map +1 -1
- package/dist/esm/doc.mjs.map +1 -1
- package/dist/esm/frequentQuestions.mjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/esm/legal.mjs.map +1 -1
- package/dist/types/blog.d.ts.map +1 -1
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/doc.d.ts.map +1 -1
- package/dist/types/frequentQuestions.d.ts.map +1 -1
- package/dist/types/legal.d.ts.map +1 -1
- package/docs/ar/bundle_optimization.md +250 -102
- package/docs/ar/configuration.md +10 -10
- package/docs/bn/bundle_optimization.md +252 -104
- package/docs/bn/configuration.md +10 -10
- package/docs/cs/bundle_optimization.md +253 -105
- package/docs/cs/configuration.md +10 -10
- package/docs/de/bundle_optimization.md +245 -97
- package/docs/de/configuration.md +10 -10
- package/docs/en/bundle_optimization.md +172 -49
- package/docs/en/configuration.md +10 -10
- package/docs/en-GB/bundle_optimization.md +230 -82
- package/docs/en-GB/configuration.md +10 -10
- package/docs/es/bundle_optimization.md +250 -102
- package/docs/es/configuration.md +10 -10
- package/docs/fr/bundle_optimization.md +223 -75
- package/docs/fr/configuration.md +10 -10
- package/docs/hi/bundle_optimization.md +253 -105
- package/docs/hi/configuration.md +10 -10
- package/docs/id/bundle_optimization.md +258 -110
- package/docs/id/configuration.md +10 -10
- package/docs/it/bundle_optimization.md +249 -103
- package/docs/it/configuration.md +10 -10
- package/docs/ja/bundle_optimization.md +245 -97
- package/docs/ja/configuration.md +10 -10
- package/docs/ko/bundle_optimization.md +253 -105
- package/docs/ko/configuration.md +10 -10
- package/docs/nl/bundle_optimization.md +249 -101
- package/docs/nl/configuration.md +10 -10
- package/docs/pl/bundle_optimization.md +258 -111
- package/docs/pl/configuration.md +10 -10
- package/docs/pt/bundle_optimization.md +256 -115
- package/docs/pt/configuration.md +10 -10
- package/docs/ru/bundle_optimization.md +253 -105
- package/docs/ru/configuration.md +10 -10
- package/docs/tr/bundle_optimization.md +255 -107
- package/docs/tr/configuration.md +10 -10
- package/docs/uk/bundle_optimization.md +250 -102
- package/docs/uk/configuration.md +10 -10
- package/docs/ur/bundle_optimization.md +257 -109
- package/docs/ur/configuration.md +10 -10
- package/docs/vi/bundle_optimization.md +259 -111
- package/docs/vi/configuration.md +10 -10
- package/docs/zh/bundle_optimization.md +260 -112
- package/docs/zh/configuration.md +10 -10
- package/docs/zh-TW/bundle_optimization.md +602 -0
- package/package.json +8 -8
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-11-25
|
|
3
|
-
updatedAt: 2026-
|
|
4
|
-
title: i18n বান্ডেল সাইজ
|
|
5
|
-
description: আন্তর্জাতিকীকরণ (i18n) কন্টেন্ট অপ্টিমাইজ
|
|
3
|
+
updatedAt: 2026-06-07
|
|
4
|
+
title: i18n বান্ডেল সাইজ ও পারফরম্যান্স অপ্টিমাইজেশন
|
|
5
|
+
description: আপনার অ্যাপ্লিকেশনের বান্ডেল সাইজ কমান আন্তর্জাতিকীকরণ (i18n) কন্টেন্ট অপ্টিমাইজ করে। Intlayer-এর মাধ্যমে ডিকশনারির জন্য ট্রি শেকিং (tree shaking) এবং লেজি লোডিং (lazy loading) কীভাবে ব্যবহার করবেন তা জানুন।
|
|
6
6
|
keywords:
|
|
7
7
|
- বান্ডেল অপ্টিমাইজেশন
|
|
8
8
|
- কন্টেন্ট অটোমেশন
|
|
@@ -16,33 +16,36 @@ slugs:
|
|
|
16
16
|
- concept
|
|
17
17
|
- bundle-optimization
|
|
18
18
|
history:
|
|
19
|
+
- version: 8.12.0
|
|
20
|
+
date: 2026-06-07
|
|
21
|
+
changes: "Babel/Webpack-এর জন্য `intlayerPurgeBabelPlugin` এবং `intlayerMinifyBabelPlugin` যোগ করা হয়েছে; প্লাগিন পাইপলাইন পরিষ্কার করা হয়েছে"
|
|
19
22
|
- version: 8.7.0
|
|
20
23
|
date: 2026-04-08
|
|
21
|
-
changes: "বিল্ড কনফিগারেশনে `minify` এবং `purge` অপশন
|
|
24
|
+
changes: "বিল্ড কনফিগারেশনে `minify` এবং `purge` অপশন যোগ করা হয়েছে"
|
|
22
25
|
---
|
|
23
26
|
|
|
24
|
-
# i18n বান্ডেল সাইজ
|
|
27
|
+
# i18n বান্ডেল সাইজ ও পারফরম্যান্স অপ্টিমাইজেশন
|
|
25
28
|
|
|
26
|
-
JSON
|
|
29
|
+
JSON ফাইল ব্যবহার করে এমন প্রচলিত i18n সলিউশনগুলোর অন্যতম প্রধান সমস্যা হলো কন্টেন্টের সাইজ ম্যানেজ করা। ডেভেলপাররা যদি ম্যানুয়ালি কন্টেন্টকে নেমস্পেস-এ আলাদা না করেন, তবে ব্যবহারকারীরা প্রায়শই শুধুমাত্র একটি পেজ দেখার জন্য প্রতিটি পেজ এবং সম্ভাব্য প্রতিটি ভাষার অনুবাদ ডাউনলোড করে ফেলেন।
|
|
27
30
|
|
|
28
|
-
উদাহরণস্বরূপ, ১০টি
|
|
31
|
+
উদাহরণস্বরূপ, ১০টি পেজ এবং ১০টি ভাষায় অনুবাদিত একটি অ্যাপ্লিকেশনের ক্ষেত্রে, একজন ব্যবহারকারী হয়তো ১০০টি পেজের কন্টেন্ট ডাউনলোড করে ফেলতে পারে, যদিও তার প্রয়োজন শুধুমাত্র **একটি** (বর্তমান ভাষায় বর্তমান পেজটি)। এতে ব্যান্ডউইথ নষ্ট হয় এবং লোড হতে অনেক বেশি সময় লাগে।
|
|
29
32
|
|
|
30
|
-
**Intlayer বিল্ড-টাইম অপ্টিমাইজেশনের মাধ্যমে এই সমস্যার সমাধান করে।** এটি আপনার কোড বিশ্লেষণ করে
|
|
33
|
+
**Intlayer বিল্ড-টাইম অপ্টিমাইজেশনের মাধ্যমে এই সমস্যার সমাধান করে।** এটি আপনার কোড বিশ্লেষণ করে ঠিক কোন কম্পোনেন্টের জন্য কোন ডিকশনারিগুলো ব্যবহৃত হচ্ছে তা শনাক্ত করে এবং কেবল প্রয়োজনীয় কন্টেন্টটুকুই আপনার বান্ডেলের মধ্যে পুনরায় প্রবেশ করায়।
|
|
31
34
|
|
|
32
35
|
## সূচিপত্র
|
|
33
36
|
|
|
34
37
|
<TOC />
|
|
35
38
|
|
|
36
|
-
## আপনার বান্ডেল
|
|
39
|
+
## আপনার বান্ডেল বিশ্লেষণ করুন
|
|
37
40
|
|
|
38
|
-
|
|
41
|
+
"ভারী" JSON ফাইল এবং কোড-স্প্লিটিং-এর সুযোগ চিহ্নিত করার প্রথম ধাপ হলো আপনার বান্ডেল বিশ্লেষণ করা। এই টুলগুলো আপনার অ্যাপ্লিকেশনের কম্পাইল করা কোডের একটি ভিজ্যুয়াল ট্রিম্যাপ (treemap) তৈরি করে, যা দিয়ে আপনি ঠিক বুঝতে পারবেন কোন লাইব্রেরিগুলো সবচেয়ে বেশি জায়গা নিচ্ছে।
|
|
39
42
|
|
|
40
43
|
<Tabs>
|
|
41
44
|
<Tab value="vite">
|
|
42
45
|
|
|
43
46
|
### Vite / Rollup
|
|
44
47
|
|
|
45
|
-
Vite এর
|
|
48
|
+
Vite এর ভেতরে Rollup ব্যবহার করে কাজ করে। `rollup-plugin-visualizer` একটি ইন্টারেক্টিভ HTML ফাইল তৈরি করে যা আপনার গ্রাফের প্রতিটি মডিউলের সাইজ দেখায়।
|
|
46
49
|
|
|
47
50
|
```bash
|
|
48
51
|
npm install -D rollup-plugin-visualizer
|
|
@@ -55,7 +58,7 @@ import { visualizer } from "rollup-plugin-visualizer";
|
|
|
55
58
|
export default defineConfig({
|
|
56
59
|
plugins: [
|
|
57
60
|
visualizer({
|
|
58
|
-
open: true, //
|
|
61
|
+
open: true, // ব্রাউজারে স্বয়ংক্রিয়ভাবে রিপোর্ট খুলবে
|
|
59
62
|
filename: "stats.html",
|
|
60
63
|
gzipSize: true,
|
|
61
64
|
brotliSize: true,
|
|
@@ -69,7 +72,7 @@ export default defineConfig({
|
|
|
69
72
|
|
|
70
73
|
### Next.js (Turbopack)
|
|
71
74
|
|
|
72
|
-
|
|
75
|
+
App Router এবং Turbopack ব্যবহার করা প্রজেক্টগুলোর জন্য Next.js একটি বিল্ট-ইন, পরীক্ষামূলক অ্যানালাইজার সরবরাহ করে যার জন্য অতিরিক্ত কোনো ডিপেন্ডেন্সির প্রয়োজন হয় না।
|
|
73
76
|
|
|
74
77
|
```bash packageManager='npm'
|
|
75
78
|
npx next experimental-analyze
|
|
@@ -92,7 +95,7 @@ bun next experimental-analyze
|
|
|
92
95
|
|
|
93
96
|
### Next.js (Webpack)
|
|
94
97
|
|
|
95
|
-
যদি আপনি Next.js-এ ডিফল্ট Webpack
|
|
98
|
+
যদি আপনি Next.js-এ ডিফল্ট Webpack বান্ডলার ব্যবহার করেন, তবে অফিশিয়াল বান্ডেল অ্যানালাইজার ব্যবহার করুন। বিল্ড করার সময় একটি পরিবেশ চলক (environment variable) সেট করে এটি ট্রিগার করতে পারেন।
|
|
96
99
|
|
|
97
100
|
```bash packageManager='npm'
|
|
98
101
|
npm install -D @next/bundle-analyzer
|
|
@@ -120,7 +123,7 @@ module.exports = withBundleAnalyzer({
|
|
|
120
123
|
});
|
|
121
124
|
```
|
|
122
125
|
|
|
123
|
-
|
|
126
|
+
**ব্যবহারবিধি:**
|
|
124
127
|
|
|
125
128
|
```bash
|
|
126
129
|
ANALYZE=true npm run build
|
|
@@ -129,9 +132,9 @@ ANALYZE=true npm run build
|
|
|
129
132
|
</Tab>
|
|
130
133
|
<Tab value="Webpack (CRA / Angular / etc)">
|
|
131
134
|
|
|
132
|
-
###
|
|
135
|
+
### Standard Webpack
|
|
133
136
|
|
|
134
|
-
Create React App (ejected), Angular
|
|
137
|
+
Create React App (ejected), Angular, অথবা কাস্টম Webpack সেটআপের জন্য, বহুল প্রচলিত `webpack-bundle-analyzer` ব্যবহার করুন।
|
|
135
138
|
|
|
136
139
|
```bash packageManager='npm'
|
|
137
140
|
npm install -D webpack-bundle-analyzer
|
|
@@ -166,18 +169,55 @@ export default {
|
|
|
166
169
|
</Tab>
|
|
167
170
|
</Tabs>
|
|
168
171
|
|
|
169
|
-
##
|
|
172
|
+
## কীভাবে কাজ করে
|
|
170
173
|
|
|
171
|
-
Intlayer **প্রতি-কম্পোনেন্ট
|
|
174
|
+
Intlayer **প্রতি-কম্পোনেন্ট (per-component) কৌশল** ব্যবহার করে। গ্লোবাল JSON ফাইলগুলোর বিপরীতে, আপনার কন্টেন্টগুলো সরাসরি কম্পোনেন্টের পাশে বা ভেতরে সংজ্ঞায়িত করা থাকে। বিল্ড প্রক্রিয়ার সময়, Intlayer যা করে:
|
|
172
175
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
+
1. আপনার কোড **বিশ্লেষণ** করে `useIntlayer` কলগুলো খুঁজে বের করে।
|
|
177
|
+
2. সংশ্লিষ্ট ডিকশনারি কন্টেন্ট **বিল্ড** করে।
|
|
178
|
+
3. আপনার কনফিগারেশনের উপর ভিত্তি করে অপ্টিমাইজ করা কোড দিয়ে `useIntlayer` কলটিকে **প্রতিস্থাপন** করে।
|
|
176
179
|
|
|
177
180
|
এটি নিশ্চিত করে যে:
|
|
178
181
|
|
|
179
|
-
- যদি কোনো কম্পোনেন্ট ইমপোর্ট করা না হয়, তবে
|
|
180
|
-
- যদি কোনো কম্পোনেন্ট
|
|
182
|
+
- যদি কোনো কম্পোনেন্ট ইমপোর্ট (import) করা না হয়, তবে তার কন্টেন্ট বান্ডেলে অন্তর্ভুক্ত হয় না (Dead Code Elimination)।
|
|
183
|
+
- যদি কোনো কম্পোনেন্ট লেজি-লোড (lazy-loaded) হয়, তবে তার কন্টেন্টও লেজি-লোড হয়।
|
|
184
|
+
|
|
185
|
+
## প্লাগিন রেফারেন্স
|
|
186
|
+
|
|
187
|
+
Intlayer-এর বিল্ড অপ্টিমাইজেশন কয়েকটি আলাদা প্লাগিনে বিভক্ত, যার প্রত্যেকটির একটি সুনির্দিষ্ট দায়িত্ব রয়েছে। কনফিগারেশন সেট আপ করার সময় কোনো প্লাগিন কী করে তা জানা থাকলে বিভ্রান্তি এড়ানো যায়।
|
|
188
|
+
|
|
189
|
+
### Babel প্লাগিনসমূহ (`@intlayer/babel`)
|
|
190
|
+
|
|
191
|
+
এগুলো Webpack-ভিত্তিক সেটআপগুলোর জন্য (Babel সহ Next.js, CRA, কাস্টম Webpack ইত্যাদি) সরাসরি `babel.config.js`-এ ব্যবহৃত হয়।
|
|
192
|
+
|
|
193
|
+
| প্লাগিন | কী কাজ করে |
|
|
194
|
+
| :---------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
195
|
+
| `intlayerExtractBabelPlugin` | `.content.ts` ফাইলগুলো স্ক্যান করে এবং কম্পাইল করা ডিকশনারিগুলো `.intlayer/`-এ লেখে |
|
|
196
|
+
| `intlayerOptimizeBabelPlugin` | `useIntlayer('key')` কে `useDictionary(hash)`-এ রূপান্তর করে এবং সঠিক ডিকশনারির `import` যোগ করে |
|
|
197
|
+
| `intlayerPurgeBabelPlugin` | সব সোর্স ফাইল স্ক্যান করে, এবং কম্পাইল করা `.intlayer/**/*.json` ডিকশনারি ফাইলগুলো থেকে **অব্যবহৃত কন্টেন্ট ফিল্ড** সরিয়ে দেয় |
|
|
198
|
+
| `intlayerMinifyBabelPlugin` | JSON ফাইল এবং সোর্স কোড—উভয় জায়গাতেই **কন্টেন্ট ফিল্ডের কী (keys) গুলোকে** ছোট অক্ষরের ছদ্মনামে (alias) রূপান্তর করে (যেমন `title` → `a`) |
|
|
199
|
+
|
|
200
|
+
> **প্লাগিনের ক্রম অত্যন্ত গুরুত্বপূর্ণ।** আপনার `babel.config.js` ফাইলে purge এবং minify প্লাগিনগুলো অবশ্যই optimize প্লাগিনের **আগে** রাখতে হবে। optimize পাস `useIntlayer('key')` কে একটি অস্বচ্ছ `useDictionary(hash)` কল দিয়ে প্রতিস্থাপন করে, যার ফলে ডিকশনারির কী-এর তথ্য হারিয়ে যায়, অথচ purge এবং minify ধাপগুলোতে কোন ফিল্ডগুলো ব্যবহৃত হচ্ছে তা চেনার জন্য ঐ তথ্যগুলো অপরিহার্য।
|
|
201
|
+
|
|
202
|
+
প্রতিটি Babel প্লাগিনের সাথে একটি অপশন হেল্পার (options helper) আছে যা কনফিগারেশন লোড করার সময় আপনার `intlayer.config.ts` একবার পড়ে এবং প্রাক-নির্ধারিত মানগুলো (pre-resolved values) ফেরত দেয়:
|
|
203
|
+
|
|
204
|
+
| অপশন হেল্পার | কোন প্লাগিনের সাথে ব্যবহৃত হয় |
|
|
205
|
+
| :--------------------------- | :----------------------------- |
|
|
206
|
+
| `getExtractPluginOptions()` | `intlayerExtractBabelPlugin` |
|
|
207
|
+
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
208
|
+
| `getPurgePluginOptions()` | `intlayerPurgeBabelPlugin` |
|
|
209
|
+
| `getMinifyPluginOptions()` | `intlayerMinifyBabelPlugin` |
|
|
210
|
+
|
|
211
|
+
### Vite প্লাগিনসমূহ (`vite-intlayer`)
|
|
212
|
+
|
|
213
|
+
Vite ব্যবহারকারীদের **কখনোই এগুলো সরাসরি কনফিগার করতে হয় না**। আপনি যখন `vite.config.ts`-এ `withIntlayer()` কল করেন, তখন এগুলো স্বয়ংক্রিয়ভাবে যুক্ত হয়ে যায়। `intlayer.config.ts`-এর `build.purge` এবং `build.minify` ফ্ল্যাগগুলো কোনো অতিরিক্ত প্লাগিন রেজিস্টার করা ছাড়াই তাদের নির্দিষ্ট কাজ সম্পাদন করে।
|
|
214
|
+
|
|
215
|
+
| অভ্যন্তরীণ Vite প্লাগিন | সমতুল্য আচরণ |
|
|
216
|
+
| :---------------------- | :-------------------------------------------------------------------------------------------- |
|
|
217
|
+
| Usage analyzer | `intlayerPurgeBabelPlugin`-এর অ্যানালাইজ পাসের সমতুল্য |
|
|
218
|
+
| Dictionary prune | `intlayerPurgeBabelPlugin`-এর JSON লেখার পাসের সমতুল্য |
|
|
219
|
+
| Dictionary minify | `intlayerMinifyBabelPlugin`-এর JSON লেখার পাসের সমতুল্য |
|
|
220
|
+
| Babel transform | `intlayerMinifyBabelPlugin`-এর সোর্স কোড রিনেম করা + `intlayerOptimizeBabelPlugin`-এর সমতুল্য |
|
|
181
221
|
|
|
182
222
|
## প্ল্যাটফর্ম অনুযায়ী সেটআপ
|
|
183
223
|
|
|
@@ -186,9 +226,9 @@ Intlayer **প্রতি-কম্পোনেন্ট পলি (per-compone
|
|
|
186
226
|
|
|
187
227
|
### Next.js
|
|
188
228
|
|
|
189
|
-
Next.js
|
|
229
|
+
Next.js-এর ক্ষেত্রে অপ্টিমাইজ পাসের (import রূপান্তর) জন্য `@intlayer/swc` প্লাগিন প্রয়োজন, কারণ Next.js বিল্ড করার জন্য SWC ব্যবহার করে।
|
|
190
230
|
|
|
191
|
-
> এই
|
|
231
|
+
> এই প্লাগিনটি ডিফল্টভাবে ইনস্টল হয় না কারণ SWC প্লাগিনগুলো Next.js-এর জন্য এখনও পরীক্ষামূলক পর্যায়ে রয়েছে। এটি ভবিষ্যতে পরিবর্তন হতে পারে।
|
|
192
232
|
|
|
193
233
|
```bash packageManager="npm"
|
|
194
234
|
npm install -D @intlayer/swc
|
|
@@ -206,21 +246,63 @@ pnpm add -D @intlayer/swc
|
|
|
206
246
|
bun add -d @intlayer/swc
|
|
207
247
|
```
|
|
208
248
|
|
|
209
|
-
ইনস্টল
|
|
249
|
+
একবার ইনস্টল হয়ে গেলে, Intlayer স্বয়ংক্রিয়ভাবে প্লাগিনটি শনাক্ত করবে এবং ব্যবহার করবে।
|
|
250
|
+
|
|
251
|
+
**purge এবং minify** পাসের জন্য (ফিল্ড মুছে ফেলা এবং ফিল্ডের নাম পরিবর্তন), এর পাশাপাশি `@intlayer/babel` ইনস্টল করুন এবং Babel প্লাগিনগুলো যোগ করুন। যদিও Next.js ট্রান্সফর্মেশনের জন্য SWC ব্যবহার করে, তবুও প্লাগিন কনফিগারেশনের জন্য এটি `babel.config.js` মূল্যায়ন করে; ফলে SWC-র কাজ শুরু করার আগেই Babel প্লাগিনগুলো একটি প্রি-পাস হিসেবে রান করে।
|
|
252
|
+
|
|
253
|
+
```bash packageManager="npm"
|
|
254
|
+
npm install -D @intlayer/babel
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
```javascript fileName="babel.config.js"
|
|
258
|
+
const {
|
|
259
|
+
intlayerPurgeBabelPlugin,
|
|
260
|
+
intlayerMinifyBabelPlugin,
|
|
261
|
+
getPurgePluginOptions,
|
|
262
|
+
getMinifyPluginOptions,
|
|
263
|
+
} = require("@intlayer/babel");
|
|
264
|
+
|
|
265
|
+
module.exports = {
|
|
266
|
+
presets: ["next/babel"],
|
|
267
|
+
plugins: [
|
|
268
|
+
// Purge: .intlayer/**/*.json থেকে অব্যবহৃত কন্টেন্ট ফিল্ডগুলো রিমুভ করে
|
|
269
|
+
[intlayerPurgeBabelPlugin, getPurgePluginOptions()],
|
|
270
|
+
// Minify: JSON + সোর্স কোডে কন্টেন্ট ফিল্ডের কী-গুলোর নাম পরিবর্তন করে
|
|
271
|
+
[intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
|
|
272
|
+
// দ্রষ্টব্য: intlayerOptimizeBabelPlugin এখানে প্রয়োজন নেই কারণ
|
|
273
|
+
// @intlayer/swc নিজে থেকেই useIntlayer → useDictionary রূপান্তরটি হ্যান্ডেল করে।
|
|
274
|
+
],
|
|
275
|
+
};
|
|
276
|
+
```
|
|
210
277
|
|
|
211
278
|
</Tab>
|
|
212
279
|
<Tab value="vite">
|
|
213
280
|
|
|
214
281
|
### Vite
|
|
215
282
|
|
|
216
|
-
Vite `@intlayer/babel`
|
|
283
|
+
Vite `@intlayer/babel` প্লাগিনটি ব্যবহার করে, যা `vite-intlayer`-এর একটি ডিপেন্ডেন্সি হিসেবে অন্তর্ভুক্ত। পুরো অপ্টিমাইজেশন পাইপলাইন — import রূপান্তর, purge, এবং minify — ডিফল্টভাবে সক্রিয় থাকে এবং এর জন্য অতিরিক্ত কোনো প্লাগিন রেজিস্টার করার প্রয়োজন নেই।
|
|
284
|
+
|
|
285
|
+
`intlayer.config.ts`-এ নির্দিষ্ট ফ্ল্যাগ সেট করে purge এবং minify চালু করুন:
|
|
286
|
+
|
|
287
|
+
```typescript fileName="intlayer.config.ts"
|
|
288
|
+
import type { IntlayerConfig } from "intlayer";
|
|
289
|
+
|
|
290
|
+
const config: IntlayerConfig = {
|
|
291
|
+
build: {
|
|
292
|
+
purge: true, // বান্ডেল করা JSON থেকে অব্যবহৃত কন্টেন্ট ফিল্ড রিমুভ করবে
|
|
293
|
+
minify: true, // কন্টেন্ট ফিল্ড কী-গুলোকে ছোট ছদ্মনামে রিনেম করবে
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
export default config;
|
|
298
|
+
```
|
|
217
299
|
|
|
218
300
|
</Tab>
|
|
219
301
|
<Tab value="webpack">
|
|
220
302
|
|
|
221
|
-
### Webpack
|
|
303
|
+
### Webpack (এবং Babel সহ Next.js)
|
|
222
304
|
|
|
223
|
-
|
|
305
|
+
`@intlayer/babel` ইনস্টল করুন:
|
|
224
306
|
|
|
225
307
|
```bash packageManager="npm"
|
|
226
308
|
npm install -D @intlayer/babel
|
|
@@ -238,14 +320,37 @@ pnpm add -D @intlayer/babel
|
|
|
238
320
|
bun add -d @intlayer/babel
|
|
239
321
|
```
|
|
240
322
|
|
|
241
|
-
|
|
323
|
+
সঠিক ক্রমে চারটে প্লাগিনই `babel.config.js`-এ যোগ করুন:
|
|
324
|
+
|
|
325
|
+
```javascript fileName="babel.config.js"
|
|
242
326
|
const {
|
|
243
|
-
|
|
327
|
+
intlayerExtractBabelPlugin,
|
|
328
|
+
intlayerPurgeBabelPlugin,
|
|
329
|
+
intlayerMinifyBabelPlugin,
|
|
244
330
|
intlayerOptimizeBabelPlugin,
|
|
331
|
+
getExtractPluginOptions,
|
|
332
|
+
getPurgePluginOptions,
|
|
333
|
+
getMinifyPluginOptions,
|
|
334
|
+
getOptimizePluginOptions,
|
|
245
335
|
} = require("@intlayer/babel");
|
|
246
336
|
|
|
247
337
|
module.exports = {
|
|
248
|
-
plugins: [
|
|
338
|
+
plugins: [
|
|
339
|
+
// Extract: .content.ts ফাইলগুলো কম্পাইল করে → .intlayer/**/*.json তৈরি করে
|
|
340
|
+
[intlayerExtractBabelPlugin, getExtractPluginOptions()],
|
|
341
|
+
|
|
342
|
+
// Purge: .intlayer/**/*.json থেকে অব্যবহৃত ফিল্ড রিমুভ করে
|
|
343
|
+
// (intlayer.config.ts-এর build.purge ফ্ল্যাগ পড়ে কাজ করে)
|
|
344
|
+
[intlayerPurgeBabelPlugin, getPurgePluginOptions()],
|
|
345
|
+
|
|
346
|
+
// Minify: JSON + সোর্স কোডে ফিল্ড কী রিনেম করে
|
|
347
|
+
// (intlayer.config.ts-এর build.minify ফ্ল্যাগ পড়ে কাজ করে)
|
|
348
|
+
[intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
|
|
349
|
+
|
|
350
|
+
// Optimize: useIntlayer('key') কে → useDictionary(hash) এ রূপান্তর করে
|
|
351
|
+
// এটি অবশ্যই সবার শেষে থাকতে হবে, কারণ এটি ডিকশনারির কী মুছে দেয়।
|
|
352
|
+
[intlayerOptimizeBabelPlugin, getOptimizePluginOptions()],
|
|
353
|
+
],
|
|
249
354
|
};
|
|
250
355
|
```
|
|
251
356
|
|
|
@@ -254,57 +359,62 @@ module.exports = {
|
|
|
254
359
|
|
|
255
360
|
## কনফিগারেশন
|
|
256
361
|
|
|
257
|
-
আপনি আপনার `intlayer.config.ts
|
|
362
|
+
আপনি আপনার `intlayer.config.ts` ফাইলের `build` প্রপার্টির মাধ্যমে Intlayer কীভাবে আপনার বান্ডেল অপ্টিমাইজ করবে তা নিয়ন্ত্রণ করতে পারবেন।
|
|
258
363
|
|
|
259
364
|
```typescript fileName="intlayer.config.ts"
|
|
260
365
|
import { Locales, type IntlayerConfig } from "intlayer";
|
|
261
366
|
|
|
262
367
|
const config: IntlayerConfig = {
|
|
263
368
|
internationalization: {
|
|
264
|
-
locales: [Locales.ENGLISH, Locales.
|
|
369
|
+
locales: [Locales.ENGLISH, Locales.BENGALI],
|
|
265
370
|
defaultLocale: Locales.ENGLISH,
|
|
266
371
|
},
|
|
267
372
|
dictionary: {
|
|
268
373
|
importMode: "dynamic",
|
|
269
374
|
},
|
|
270
375
|
build: {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
* বিল্ড করার সময় টাইপস্ক্রিপ্ট টাইপগুলো চেক করা হবে কিনা তা নির্দেশ করে
|
|
283
|
-
*/
|
|
284
|
-
checkTypes: false;
|
|
376
|
+
// বিল্ড-টাইমে useIntlayer() কলগুলোকে সরাসরি ডিকশনারি ইমপোর্ট দিয়ে প্রতিস্থাপন করে।
|
|
377
|
+
// undefined = auto (production-এ চালু থাকে), true = সর্বদা, false = কখনোই না।
|
|
378
|
+
optimize: undefined,
|
|
379
|
+
|
|
380
|
+
// কম্পাইল করা ডিকশনারিতে কন্টেন্ট ফিল্ডের কী-গুলোকে ছোট অক্ষরের ছদ্মনামে
|
|
381
|
+
// রিনেম করে (যেমন title → a)। এটি JSON সাইজ ছোট করে; এর জন্য optimize চালু থাকা প্রয়োজন।
|
|
382
|
+
minify: true,
|
|
383
|
+
|
|
384
|
+
// সোর্স কোডে যেসব কন্টেন্ট ফিল্ড কখনোই অ্যাক্সেস করা হয় না সেগুলোকে সরিয়ে দেয়।
|
|
385
|
+
// এর জন্য optimize চালু থাকা প্রয়োজন।
|
|
386
|
+
purge: true,
|
|
285
387
|
},
|
|
286
388
|
};
|
|
287
389
|
|
|
288
390
|
export default config;
|
|
289
391
|
```
|
|
290
392
|
|
|
291
|
-
> বেশিরভাগ ক্ষেত্রে `optimize
|
|
393
|
+
> বেশিরভাগ ক্ষেত্রে `optimize`-এর ডিফল্ট মান (`undefined`) রাখাটাই বাঞ্ছনীয়।
|
|
292
394
|
|
|
293
|
-
>
|
|
395
|
+
> সমস্ত অপশনের জন্য কনফিগারেশন রেফারেন্স দেখুন: [Configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/bn/configuration.md)
|
|
294
396
|
|
|
295
|
-
### বিল্ড
|
|
397
|
+
### বিল্ড অপশনসমূহ
|
|
296
398
|
|
|
297
|
-
|
|
399
|
+
| প্রপার্টি | ধরন | ডিফল্ট | বিবরণ |
|
|
400
|
+
| :------------- | :--------------------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
401
|
+
| **`optimize`** | `boolean \| undefined` | `undefined` | ইমপোর্ট রূপান্তর পাসটি চালু করে। `undefined` = শুধুমাত্র প্রোডাকশন বিল্ডে সক্রিয় থাকে। `false` দিলে purge এবং minify-ও নিষ্ক্রিয় হয়ে যায়। |
|
|
402
|
+
| **`minify`** | `boolean` | `false` | কম্পাইল করা JSON ফাইলে কন্টেন্ট ফিল্ডের কী-গুলোকে ছোট অক্ষরের ছদ্মনামে রিনেম করে। সেই সাথে সোর্স কোডে থাকা প্রপার্টি অ্যাক্সেসগুলোও পরিবর্তন করে। `optimize` যদি `false` থাকে তবে এটি কোনো কাজ করবে না। |
|
|
403
|
+
| **`purge`** | `boolean` | `false` | সোর্স কোডে যেসব কন্টেন্ট ফিল্ড স্ট্যাটিক্যালি কখনোই অ্যাক্সেস করা হয়নি সেগুলোকে কম্পাইল করা JSON ফাইল থেকে রিমুভ করে দেয়। `optimize` যদি `false` থাকে তবে এটি কোনো কাজ করবে না। |
|
|
298
404
|
|
|
299
|
-
|
|
300
|
-
| :------------- | :-------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
301
|
-
| **`optimize`** | `boolean` | `undefined` | বিল্ড অপ্টিমাইজেশন চালু আছে কিনা তা নিয়ন্ত্রণ করে। যদি `true` হয়, তবে Intlayer ডিকশনারি কলগুলোকে অপ্টিমাইজড ইনজেকশন দ্বারা প্রতিস্থাপন করে। যদি `false` হয়, তবে অপ্টিমাইজেশন বন্ধ থাকে। প্রোডাকশনে `true` সেট করা ভালো। |
|
|
302
|
-
| **`minify`** | `boolean` | `false` | বান্ডেল সাইজ কমাতে ডিকশনারিগুলো মিনিফাই করা হবে কিনা। |
|
|
303
|
-
| **`purge`** | `boolean` | `false` | ডিকশনারিতে অব্যবহৃত কীগুলো মুছে ফেলা হবে কিনা। |
|
|
405
|
+
### Minification (ফিল্ডের কী রিনেম করা)
|
|
304
406
|
|
|
305
|
-
|
|
407
|
+
`build.minify` কিন্তু আপনার JavaScript বান্ডেলটিকে **মিনিফাই করে না** — সেটি আপনার বান্ডলার-এর দায়িত্ব। এর পরিবর্তে, এটি আপনার ডিফাইন করা প্রতিটি কন্টেন্ট ফিল্ডের কী-কে ছোট অক্ষরের ছদ্মনাম (alias) দিয়ে রিপ্লেস করে কম্পাইল করা ডিকশনারি JSON ফাইলের সাইজ ছোট করে:
|
|
306
408
|
|
|
307
|
-
|
|
409
|
+
```
|
|
410
|
+
// মিনিফাই করার আগে
|
|
411
|
+
{ "title": "হ্যালো", "subtitle": "বিশ্ব" }
|
|
412
|
+
|
|
413
|
+
// মিনিফাই করার পরে
|
|
414
|
+
{ "a": "হ্যালো", "b": "বিশ্ব" }
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
আপনার সোর্স কোডের সব প্রপার্টি অ্যাক্সেসেও একই রিনেম প্রক্রিয়া প্রয়োগ করা হয়, ফলে কম্পাইল করা আউটপুটে `content.title` হয়ে যায় `content.a`। রানটাইমে এর কাজ হুবহু একই থাকে।
|
|
308
418
|
|
|
309
419
|
```typescript fileName="intlayer.config.ts"
|
|
310
420
|
import type { IntlayerConfig } from "intlayer";
|
|
@@ -318,11 +428,13 @@ const config: IntlayerConfig = {
|
|
|
318
428
|
export default config;
|
|
319
429
|
```
|
|
320
430
|
|
|
321
|
-
>
|
|
431
|
+
> যখন `optimize` `false` থাকে বা যখন `editor.enabled` `true` থাকে তখন মিনিফিকেশন বাদ দেওয়া হয় (ভিজ্যুয়াল এডিটরের এডিটিং সচল রাখার জন্য অরিজিনাল ফিল্ডের নামগুলো প্রয়োজন)।
|
|
432
|
+
|
|
433
|
+
> `importMode: 'fetch'` এর মাধ্যমে লোড করা ডিকশনারিগুলোর ক্ষেত্রেও মিনিফিকেশন করা হয় না, কারণ அவற்றின் JSON একটি রিমোট API থেকে অরিজিনাল ফিল্ডের নাম ব্যবহার করে সার্ভ করা হয় — ক্লায়েন্ট-সাইডে কী-গুলোর নাম পরিবর্তন করলে সার্ভার/ক্লায়েন্ট চুক্তি ভেঙে যাবে।
|
|
322
434
|
|
|
323
|
-
###
|
|
435
|
+
### Purging (অব্যবহৃত ফিল্ড সরিয়ে ফেলা)
|
|
324
436
|
|
|
325
|
-
|
|
437
|
+
`build.purge` বিশ্লেষণ করে দেখে আপনার সোর্স কোডে ঠিক কোন কন্টেন্ট ফিল্ডগুলো অ্যাক্সেস করা হচ্ছে এবং কম্পাইল করা JSON ফাইল থেকে বাকি সমস্ত ফিল্ড সরিয়ে দেয়।
|
|
326
438
|
|
|
327
439
|
```typescript fileName="intlayer.config.ts"
|
|
328
440
|
import type { IntlayerConfig } from "intlayer";
|
|
@@ -336,34 +448,50 @@ const config: IntlayerConfig = {
|
|
|
336
448
|
export default config;
|
|
337
449
|
```
|
|
338
450
|
|
|
339
|
-
|
|
451
|
+
**উদাহরণ:** পাঁচটি ফিল্ডযুক্ত একটি ডিকশনারি যার মধ্যে মাত্র দুটি ব্যবহৃত হয়েছে:
|
|
452
|
+
|
|
453
|
+
```
|
|
454
|
+
// purge করার আগে
|
|
455
|
+
{ "title": "…", "subtitle": "…", "cta": "…", "footer": "…", "badge": "…" }
|
|
456
|
+
|
|
457
|
+
// purge করার পরে (সোর্সে কেবল title + subtitle অ্যাক্সেস করা হয়েছে)
|
|
458
|
+
{ "title": "…", "subtitle": "…" }
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
> যখন `optimize` `false` থাকে বা `editor.enabled` `true` থাকে তখন Purge বাদ দেওয়া হয়।
|
|
462
|
+
|
|
463
|
+
> যদি কোনো সোর্স ফাইল পার্স (parse) করা না যায়, অথবা `useIntlayer`-এর রেজাল্ট কোনো ভেরিয়েবলে অ্যাসাইন করে এমনভাবে পাস করা হয় যা স্ট্যাটিক অ্যানালাইজার ট্র্যাক করতে পারে না (যেমন, কোনো অবজেক্টের মধ্যে স্প্রেড করা, অথবা ডিস্ট্রাকচার না করেই প্রপ হিসেবে পাস করা), সেক্ষেত্রে সুরক্ষার খাতিরে Purge প্রক্রিয়াটি এড়িয়ে যাওয়া হয়। এই ধরনের ক্ষেত্রে সম্পূর্ণ ডিকশনারিটি অক্ষত রাখা হয়।
|
|
464
|
+
|
|
465
|
+
### Import Mode
|
|
340
466
|
|
|
341
|
-
|
|
467
|
+
অনেক পেজ ও লোকেলের সমন্বয়ে তৈরি বড় অ্যাপ্লিকেশনগুলোর ক্ষেত্রে, JSON আপনার বান্ডেল সাইজের একটি বড় অংশ দখল করতে পারে। Intlayer-এর `importMode` অপশন ব্যবহার করে আপনি নিয়ন্ত্রণ করতে পারবেন ডিকশনারিগুলো কীভাবে লোড হবে।
|
|
342
468
|
|
|
343
|
-
|
|
469
|
+
### গ্লোবাল ডেফিনেশন (Global definition)
|
|
344
470
|
|
|
345
|
-
আপনার `intlayer.config.ts` ফাইলে
|
|
471
|
+
আপনার `intlayer.config.ts` ফাইলে গ্লোবালি ইমপোর্ট মোড নির্ধারণ করা যেতে পারে।
|
|
346
472
|
|
|
347
473
|
```typescript fileName="intlayer.config.ts"
|
|
348
474
|
import type { IntlayerConfig } from "intlayer";
|
|
349
475
|
|
|
350
476
|
const config: IntlayerConfig = {
|
|
351
|
-
|
|
352
|
-
|
|
477
|
+
dictionary: {
|
|
478
|
+
importMode: "dynamic", // ডিফল্ট হলো 'static'
|
|
353
479
|
},
|
|
354
480
|
};
|
|
355
481
|
|
|
356
482
|
export default config;
|
|
357
483
|
```
|
|
358
484
|
|
|
359
|
-
|
|
485
|
+
### প্রতি-ডিকশনারি ডেফিনেশন (Per-dictionary definition)
|
|
486
|
+
|
|
487
|
+
আপনি চাইলে নির্দিষ্ট কোনো ডিকশনারির জন্য তার নিজস্ব `.content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5|md|mdx|yaml|yml}}` ফাইলে গিয়ে ইমপোর্ট মোড ওভাররাইড করতে পারেন।
|
|
360
488
|
|
|
361
489
|
```ts
|
|
362
490
|
import { type Dictionary, t } from "intlayer";
|
|
363
491
|
|
|
364
492
|
const appContent: Dictionary = {
|
|
365
493
|
key: "app",
|
|
366
|
-
importMode: "dynamic", // ডিফল্ট ইমপোর্ট
|
|
494
|
+
importMode: "dynamic", // ডিফল্ট ইমপোর্ট মোডকে ওভাররাইড করে
|
|
367
495
|
content: {
|
|
368
496
|
// ...
|
|
369
497
|
},
|
|
@@ -372,35 +500,35 @@ const appContent: Dictionary = {
|
|
|
372
500
|
export default appContent;
|
|
373
501
|
```
|
|
374
502
|
|
|
375
|
-
| প্রপার্টি |
|
|
376
|
-
| :--------------- | :--------------------------------- | :--------- |
|
|
377
|
-
| **`importMode`** | `'static'`, `'dynamic'`, `'fetch'` | `'static'` |
|
|
503
|
+
| প্রপার্টি | ধরন | ডিফল্ট | বিবরণ |
|
|
504
|
+
| :--------------- | :--------------------------------- | :--------- | :---------------------------------------------------------------------------------------------------------------------------------------- |
|
|
505
|
+
| **`importMode`** | `'static'`, `'dynamic'`, `'fetch'` | `'static'` | **Deprecated (বাতিলযোগ্য)**: এর পরিবর্তে `dictionary.importMode` ব্যবহার করুন। এটি নির্ধারণ করে ডিকশনারিগুলো কীভাবে লোড হবে (নিচে দেখুন)। |
|
|
378
506
|
|
|
379
|
-
`importMode` সেটিং ঠিক করে কীভাবে
|
|
380
|
-
আপনি এটি `intlayer.config.ts` ফাইলের `dictionary` অবজেক্টের অধীনে গ্লোবালি ডিফাইন করতে পারেন অথবা কোনো নির্দিষ্ট ডিকশনারির জন্য তার `.content.ts` ফাইলে ওভাররাইট করতে পারেন।
|
|
507
|
+
`importMode` সেটিং ঠিক করে দেয় কীভাবে আপনার কম্পোনেন্টে ডিকশনারির কন্টেন্ট যুক্ত হবে। এটি আপনি গ্লোবালি `intlayer.config.ts`-এ `dictionary` অবজেক্টের অধীনে ডিফাইন করতে পারেন, অথবা নির্দিষ্ট ডিকশনারির `.content.ts` ফাইলে গিয়ে তা ওভাররাইড করতে পারেন।
|
|
381
508
|
|
|
382
|
-
### ১. স্ট্যাটিক মোড (Static Mode -
|
|
509
|
+
### ১. স্ট্যাটিক মোড (Static Mode - `default`)
|
|
383
510
|
|
|
384
|
-
স্ট্যাটিক
|
|
511
|
+
স্ট্যাটিক মোডে, Intlayer `useIntlayer` কে `useDictionary` দিয়ে প্রতিস্থাপন করে এবং সরাসরি JavaScript বান্ডেলের মধ্যে ডিকশনারি যুক্ত করে দেয়।
|
|
385
512
|
|
|
386
|
-
-
|
|
387
|
-
-
|
|
388
|
-
-
|
|
513
|
+
- **সুবিধা (Pros):** তাৎক্ষণিক রেন্ডারিং (সিঙ্ক্রোনাস), হাইড্রেশনের সময় অতিরিক্ত কোনো নেটওয়ার্ক রিকোয়েস্ট হয় না।
|
|
514
|
+
- **অসুবিধা (Cons):** এই বান্ডেলের মধ্যে ওই নির্দিষ্ট কম্পোনেন্টের জন্য **সবগুলো** ভাষার অনুবাদই থেকে যায়।
|
|
515
|
+
- **উপযুক্ত ক্ষেত্র (Best for):** সিঙ্গেল পেজ অ্যাপ্লিকেশন (SPA)।
|
|
389
516
|
|
|
390
|
-
|
|
517
|
+
**রূপান্তরিত কোডের উদাহরণ:**
|
|
391
518
|
|
|
392
519
|
```tsx
|
|
393
520
|
// আপনার কোড
|
|
394
521
|
const content = useIntlayer("my-key");
|
|
395
522
|
|
|
396
|
-
// অপ্টিমাইজ করা
|
|
523
|
+
// রূপান্তরের পরে অপ্টিমাইজ করা কোডের ইলাস্ট্রেশন (Static)
|
|
524
|
+
// এটি কেবল বোঝানোর সুবিধার্থে দেওয়া হলো, আসল কোডটি অপ্টিমাইজেশনের কারণে কিছুটা ভিন্ন হতে পারে
|
|
397
525
|
const content = useDictionary({
|
|
398
526
|
key: "my-key",
|
|
399
527
|
content: {
|
|
400
528
|
nodeType: "translation",
|
|
401
529
|
translation: {
|
|
402
530
|
en: "My title",
|
|
403
|
-
|
|
531
|
+
bn: "আমার শিরোনাম",
|
|
404
532
|
},
|
|
405
533
|
},
|
|
406
534
|
});
|
|
@@ -408,47 +536,67 @@ const content = useDictionary({
|
|
|
408
536
|
|
|
409
537
|
### ২. ডাইনামিক মোড (Dynamic Mode)
|
|
410
538
|
|
|
411
|
-
ডাইনামিক
|
|
539
|
+
ডাইনামিক মোডে, Intlayer `useIntlayer` কে `useDictionaryAsync` দিয়ে প্রতিস্থাপন করে। এটি `import()` মেকানিজম (Suspense-এর মতো) ব্যবহার করে, যাতে শুধুমাত্র বর্তমান লোকেলের JSON-টি নির্দিষ্টভাবে লেজি-লোড করা যায়।
|
|
412
540
|
|
|
413
|
-
-
|
|
414
|
-
-
|
|
415
|
-
-
|
|
541
|
+
- **সুবিধা (Pros):** **লোকেল-লেভেল ট্রি শেকিং (Locale-level tree shaking)।** যে ইউজার ইংরেজি ভার্সন দেখছেন তিনি _কেবলমাত্র_ ইংরেজি ডিকশনারিটিই ডাউনলোড করবেন। বাংলা ডিকশনারি কখনোই লোড হবে না।
|
|
542
|
+
- **অসুবিধা (Cons):** হাইড্রেশনের সময় প্রতি কম্পোনেন্টে একটি করে নেটওয়ার্ক রিকোয়েস্ট (asset fetch) ফায়ার করে।
|
|
543
|
+
- **উপযুক্ত ক্ষেত্র (Best for):** বড় বড় টেক্সট ব্লক, আর্টিকেল, বা এমন অ্যাপ্লিকেশন যা বহু ভাষা সাপোর্ট করে যেখানে বান্ডেল সাইজ একটি বড় ফ্যাক্টর।
|
|
416
544
|
|
|
417
|
-
|
|
545
|
+
**রূপান্তরিত কোডের উদাহরণ:**
|
|
418
546
|
|
|
419
547
|
```tsx
|
|
420
548
|
// আপনার কোড
|
|
421
549
|
const content = useIntlayer("my-key");
|
|
422
550
|
|
|
423
|
-
// অপ্টিমাইজ করা
|
|
551
|
+
// রূপান্তরের পরে অপ্টিমাইজ করা কোডের ইলাস্ট্রেশন (Dynamic)
|
|
552
|
+
// এটি কেবল বোঝানোর সুবিধার্থে দেওয়া হলো, আসল কোডটি অপ্টিমাইজেশনের কারণে কিছুটা ভিন্ন হতে পারে
|
|
424
553
|
const content = useDictionaryAsync({
|
|
425
554
|
en: () =>
|
|
426
555
|
import(".intlayer/dynamic_dictionary/my-key/en.json").then(
|
|
427
556
|
(mod) => mod.default
|
|
428
557
|
),
|
|
429
|
-
|
|
430
|
-
import(".intlayer/dynamic_dictionary/my-key/
|
|
558
|
+
bn: () =>
|
|
559
|
+
import(".intlayer/dynamic_dictionary/my-key/bn.json").then(
|
|
431
560
|
(mod) => mod.default
|
|
432
561
|
),
|
|
433
562
|
});
|
|
434
563
|
```
|
|
435
564
|
|
|
436
|
-
> `importMode: 'dynamic'` ব্যবহার
|
|
565
|
+
> যখন আপনি `importMode: 'dynamic'` ব্যবহার করছেন, তখন যদি একই পেজে ১০০টি কম্পোনেন্ট `useIntlayer` ব্যবহার করে, তবে ব্রাউজার ১০০টি আলাদা ফেচ (fetch) করার চেষ্টা করবে। রিকোয়েস্টের এই "ওয়াটারফল" এড়াতে, প্রতিটি ছোট কম্পোনেন্টের জন্য একটি করে ফাইল না বানিয়ে, কন্টেন্টগুলোকে কমসংখ্যক `.content` ফাইলে (যেমন, প্রতিটি পেজ সেকশনের জন্য একটি ডিকশনারি) গ্রুপ করে ফেলুন। আপনি একই কী ব্যবহার করে একাধিক `.content` ফাইলও ব্যবহার করতে পারেন। Intlayer সেগুলো একত্র করে একটি সিঙ্গেল ডিকশনারি তৈরি করবে।
|
|
437
566
|
|
|
438
567
|
### ৩. ফেচ মোড (Fetch Mode)
|
|
439
568
|
|
|
440
|
-
এটি ডাইনামিক মোডের মতোই কাজ করে, তবে
|
|
569
|
+
এটি ডাইনামিক মোডের মতোই কাজ করে, তবে প্রথমেই Intlayer Live Sync API থেকে ডিকশনারি ফেচ করার চেষ্টা করে। যদি API কলটি ব্যর্থ হয় বা কন্টেন্টটি লাইভ আপডেটের জন্য চিহ্নিত না থাকে, তখন এটি পুনরায় ডাইনামিক ইমপোর্টে (dynamic import) ফিরে যায়।
|
|
570
|
+
|
|
571
|
+
**রূপান্তরিত কোডের উদাহরণ:**
|
|
572
|
+
|
|
573
|
+
```tsx
|
|
574
|
+
// আপনার কোড
|
|
575
|
+
const content = useIntlayer("my-key");
|
|
576
|
+
|
|
577
|
+
// অপ্টিমাইজ করা কোডের ইলাস্ট্রেশন (Fetch)
|
|
578
|
+
const content = useDictionaryAsync({
|
|
579
|
+
en: () =>
|
|
580
|
+
fetch("https://intlayer.my-domain.com/dictionary/my-key/en").then((res) =>
|
|
581
|
+
res.json()
|
|
582
|
+
),
|
|
583
|
+
bn: () =>
|
|
584
|
+
fetch("https://intlayer.my-domain.com/dictionary/my-key/bn").then((res) =>
|
|
585
|
+
res.json()
|
|
586
|
+
),
|
|
587
|
+
});
|
|
588
|
+
```
|
|
441
589
|
|
|
442
|
-
> বিস্তারিত জানতে CMS
|
|
590
|
+
> আরও বিস্তারিত জানতে CMS ডকুমেন্টেশন দেখুন: [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/bn/intlayer_CMS.md)
|
|
443
591
|
|
|
444
|
-
> ফেচ মোডে
|
|
592
|
+
> ফেচ মোডে purge বা minification প্রযোজ্য হয় না কারণ JSON একটি রিমোট API থেকে অরিজিনাল ফিল্ডের নামেই পরিবেশন করা হয়।
|
|
445
593
|
|
|
446
|
-
## সারসংক্ষেপ: স্ট্যাটিক বনাম ডাইনামিক
|
|
594
|
+
## সারসংক্ষেপ: স্ট্যাটিক বনাম ডাইনামিক (Static vs Dynamic)
|
|
447
595
|
|
|
448
|
-
|
|
|
449
|
-
|
|
|
450
|
-
| **JS বান্ডেল সাইজ**
|
|
451
|
-
| **প্রাথমিক লোড**
|
|
452
|
-
| **নেটওয়ার্ক রিকোয়েস্ট**
|
|
453
|
-
| **ট্রি
|
|
454
|
-
|
|
|
596
|
+
| বৈশিষ্ট্য | স্ট্যাটিক মোড (Static Mode) | ডাইনামিক মোড (Dynamic Mode) |
|
|
597
|
+
| :------------------------ | :------------------------------------------ | :--------------------------------------------- |
|
|
598
|
+
| **JS বান্ডেল সাইজ** | বড় (কম্পোনেন্টের সব ভাষা অন্তর্ভুক্ত থাকে) | সবচেয়ে ছোট (শুধুমাত্র কোড থাকে, কন্টেন্ট নয়) |
|
|
599
|
+
| **প্রাথমিক লোড** | তাৎক্ষণিক (কন্টেন্ট বান্ডেলের ভেতরেই থাকে) | সামান্য দেরি হয় (JSON ফেচ করে) |
|
|
600
|
+
| **নেটওয়ার্ক রিকোয়েস্ট** | 0 (অতিরিক্ত কোনো রিকোয়েস্ট নেই) | প্রতি ডিকশনারি কী-এর জন্য ১টি রিকোয়েস্ট |
|
|
601
|
+
| **ট্রি শেকিং** | কম্পোনেন্ট-লেভেল | কম্পোনেন্ট-লেভেল + লোকেল-লেভেল |
|
|
602
|
+
| **সেরা ব্যবহারক্ষেত্র** | UI কম্পোনেন্ট, ছোট অ্যাপ | টেক্সট-বহুল পেজ, অনেকগুলো ভাষা |
|