@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.
Files changed (73) hide show
  1. package/dist/cjs/blog.cjs.map +1 -1
  2. package/dist/cjs/common.cjs.map +1 -1
  3. package/dist/cjs/doc.cjs.map +1 -1
  4. package/dist/cjs/frequentQuestions.cjs.map +1 -1
  5. package/dist/cjs/generated/blog.entry.cjs +1 -0
  6. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  7. package/dist/cjs/generated/docs.entry.cjs +1 -0
  8. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  9. package/dist/cjs/generated/frequentQuestions.entry.cjs +1 -0
  10. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  11. package/dist/cjs/generated/legal.entry.cjs +1 -0
  12. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  13. package/dist/cjs/legal.cjs.map +1 -1
  14. package/dist/esm/blog.mjs.map +1 -1
  15. package/dist/esm/common.mjs.map +1 -1
  16. package/dist/esm/doc.mjs.map +1 -1
  17. package/dist/esm/frequentQuestions.mjs.map +1 -1
  18. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  19. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  20. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  21. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  22. package/dist/esm/legal.mjs.map +1 -1
  23. package/dist/types/blog.d.ts.map +1 -1
  24. package/dist/types/common.d.ts.map +1 -1
  25. package/dist/types/doc.d.ts.map +1 -1
  26. package/dist/types/frequentQuestions.d.ts.map +1 -1
  27. package/dist/types/legal.d.ts.map +1 -1
  28. package/docs/ar/bundle_optimization.md +250 -102
  29. package/docs/ar/configuration.md +10 -10
  30. package/docs/bn/bundle_optimization.md +252 -104
  31. package/docs/bn/configuration.md +10 -10
  32. package/docs/cs/bundle_optimization.md +253 -105
  33. package/docs/cs/configuration.md +10 -10
  34. package/docs/de/bundle_optimization.md +245 -97
  35. package/docs/de/configuration.md +10 -10
  36. package/docs/en/bundle_optimization.md +172 -49
  37. package/docs/en/configuration.md +10 -10
  38. package/docs/en-GB/bundle_optimization.md +230 -82
  39. package/docs/en-GB/configuration.md +10 -10
  40. package/docs/es/bundle_optimization.md +250 -102
  41. package/docs/es/configuration.md +10 -10
  42. package/docs/fr/bundle_optimization.md +223 -75
  43. package/docs/fr/configuration.md +10 -10
  44. package/docs/hi/bundle_optimization.md +253 -105
  45. package/docs/hi/configuration.md +10 -10
  46. package/docs/id/bundle_optimization.md +258 -110
  47. package/docs/id/configuration.md +10 -10
  48. package/docs/it/bundle_optimization.md +249 -103
  49. package/docs/it/configuration.md +10 -10
  50. package/docs/ja/bundle_optimization.md +245 -97
  51. package/docs/ja/configuration.md +10 -10
  52. package/docs/ko/bundle_optimization.md +253 -105
  53. package/docs/ko/configuration.md +10 -10
  54. package/docs/nl/bundle_optimization.md +249 -101
  55. package/docs/nl/configuration.md +10 -10
  56. package/docs/pl/bundle_optimization.md +258 -111
  57. package/docs/pl/configuration.md +10 -10
  58. package/docs/pt/bundle_optimization.md +256 -115
  59. package/docs/pt/configuration.md +10 -10
  60. package/docs/ru/bundle_optimization.md +253 -105
  61. package/docs/ru/configuration.md +10 -10
  62. package/docs/tr/bundle_optimization.md +255 -107
  63. package/docs/tr/configuration.md +10 -10
  64. package/docs/uk/bundle_optimization.md +250 -102
  65. package/docs/uk/configuration.md +10 -10
  66. package/docs/ur/bundle_optimization.md +257 -109
  67. package/docs/ur/configuration.md +10 -10
  68. package/docs/vi/bundle_optimization.md +259 -111
  69. package/docs/vi/configuration.md +10 -10
  70. package/docs/zh/bundle_optimization.md +260 -112
  71. package/docs/zh/configuration.md +10 -10
  72. package/docs/zh-TW/bundle_optimization.md +602 -0
  73. package/package.json +8 -8
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  createdAt: 2025-11-25
3
- updatedAt: 2026-04-08
4
- title: i18n বান্ডেল সাইজ এবং পারফরম্যান্স অপ্টিমাইজ করা
5
- description: আন্তর্জাতিকীকরণ (i18n) কন্টেন্ট অপ্টিমাইজ করে অ্যাপ্লিকেশনের বান্ডেল সাইজ কমান। Intlayer-এর মাধ্যমে ডিকশনারির জন্য কীভাবে tree shaking এবং lazy loading ব্যবহার করবেন তা শিখুন।
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 ফাইলের ওপর নির্ভরশীল প্রচলিত i18n সমাধানগুলোর প্রধান চ্যালেঞ্জ হলো কন্টেন্ট সাইজ ম্যানেজ করা। যদি ডেভেলপাররা ম্যানুয়ালি কন্টেন্টকে নেমস্পেসে আলাদা না করেন, তবে ব্যবহারকারীরা প্রায়ই প্রতিটি পেজ এবং সম্ভাব্যভাবে প্রতিটি ভাষার অনুবাদ ডাউনলোড করেন, এমনকি একটি মাত্র পেজ দেখার জন্য।
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
- বান্ডেল বিশ্লেষণ করা হলো "ভারী" JSON ফাইল এবং কোড-স্প্লিটিং (code-splitting) এর সুযোগ শনাক্ত করার প্রথম ধাপ। এই টুলগুলো আপনার অ্যাপ্লিকেশনের কম্পাইল করা কোডের একটি ভিজ্যুয়াল ট্রিম্যাপ (treemap) তৈরি করে, যা আপনাকে দেখতে সাহায্য করে কোন লাইব্রেরিগুলো সবচেয়ে বেশি জায়গা নিচ্ছে।
41
+ "ভারী" JSON ফাইল এবং কোড-স্প্লিটিং-এর সুযোগ চিহ্নিত করার প্রথম ধাপ হলো আপনার বান্ডেল বিশ্লেষণ করা। এই টুলগুলো আপনার অ্যাপ্লিকেশনের কম্পাইল করা কোডের একটি ভিজ্যুয়াল ট্রিম্যাপ (treemap) তৈরি করে, যা দিয়ে আপনি ঠিক বুঝতে পারবেন কোন লাইব্রেরিগুলো সবচেয়ে বেশি জায়গা নিচ্ছে।
39
42
 
40
43
  <Tabs>
41
44
  <Tab value="vite">
42
45
 
43
46
  ### Vite / Rollup
44
47
 
45
- Vite এর ব্যাকএন্ডে Rollup ব্যবহৃত হয়। `rollup-plugin-visualizer` প্লাগইনটি একটি ইন্টারঅ্যাক্টিভ HTML ফাইল তৈরি করে যা আপনার গ্রাফের প্রতিটি মডিউলের সাইজ দেখায়।
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
- যেসব প্রজেক্টে App Router এবং Turbopack ব্যবহৃত হচ্ছে, সেগুলোর জন্য Next.js একটি বিল্ট-ইন এক্সপেরিমেন্টাল অ্যানালাইজার প্রদান করে যা ব্যবহারের জন্য বাড়তি কোনো ডিপেন্ডেন্সির প্রয়োজন হয় না।
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
- ### স্ট্যান্ডার্ড Webpack
135
+ ### Standard Webpack
133
136
 
134
- Create React App (ejected), Angular বা কাস্টম Webpack সেটআপের জন্য ইন্ডাস্ট্রি-স্ট্যান্ডার্ড `webpack-bundle-analyzer` ব্যবহার করুন।
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 **প্রতি-কম্পোনেন্ট পলি (per-component approach)** ব্যবহার করে। গ্লোবাল JSON ফাইলের বিপরীতে, আপনার কন্টেন্টটি আপনার কম্পোনেন্টের সাথেই বা এর ভেতরে ডিফাইন করা থাকে। বিল্ড প্রসেসের সময়, Intlayer যা করে:
174
+ Intlayer **প্রতি-কম্পোনেন্ট (per-component) কৌশল** ব্যবহার করে। গ্লোবাল JSON ফাইলগুলোর বিপরীতে, আপনার কন্টেন্টগুলো সরাসরি কম্পোনেন্টের পাশে বা ভেতরে সংজ্ঞায়িত করা থাকে। বিল্ড প্রক্রিয়ার সময়, Intlayer যা করে:
172
175
 
173
- ১. `useIntlayer` কলগুলো খুঁজে পেতে আপনার কোডটি **বিশ্লেষণ** করে।
174
- ২. সংশ্লিষ্ট ডিকশনারি কন্টেন্টগুলো **তৈরি (build)** করে।
175
- ৩. আপনার কনফিগারেশনের ওপর ভিত্তি করে `useIntlayer` কলটিকে অপ্টিমাইজ করা কোড দ্বারা **প্রতিস্থাপন** করে।
176
+ 1. আপনার কোড **বিশ্লেষণ** করে `useIntlayer` কলগুলো খুঁজে বের করে।
177
+ 2. সংশ্লিষ্ট ডিকশনারি কন্টেন্ট **বিল্ড** করে।
178
+ 3. আপনার কনফিগারেশনের উপর ভিত্তি করে অপ্টিমাইজ করা কোড দিয়ে `useIntlayer` কলটিকে **প্রতিস্থাপন** করে।
176
179
 
177
180
  এটি নিশ্চিত করে যে:
178
181
 
179
- - যদি কোনো কম্পোনেন্ট ইমপোর্ট করা না হয়, তবে এর কন্টেন্ট বান্ডেলে অন্তর্ভুক্ত হবে না (Dead Code Elimination)।
180
- - যদি কোনো কম্পোনেন্ট লেজি-লোডেড (lazy-loaded) হয়, তবে এর কন্টেন্টও লেজি-লোড হবে।
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-এ ট্রান্সফর্মেশন হ্যান্ডেল করার জন্য `@intlayer/swc` প্লাগইনটির প্রয়োজন হয়, কারণ Next.js বিল্ড করার জন্য SWC ব্যবহার করে।
229
+ Next.js-এর ক্ষেত্রে অপ্টিমাইজ পাসের (import রূপান্তর) জন্য `@intlayer/swc` প্লাগিন প্রয়োজন, কারণ Next.js বিল্ড করার জন্য SWC ব্যবহার করে।
190
230
 
191
- > এই প্লাগইনটি ডিফল্টভাবে ইনস্টল করা থাকে না কারণ SWC প্লাগইনগুলো এখনও Next.js-এর জন্য এক্সপেরিমেন্টাল পর্যায়ে রয়েছে। ভবিষ্যতে এটি পরিবর্তিত হতে পারে।
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
- ইনস্টল করার পর, Intlayer স্বয়ংক্রিয়ভাবে প্লাগইনটি শনাক্ত করবে এবং ব্যবহার করবে।
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` প্লাগইন ব্যবহার করে যা `vite-intlayer`-এর ডিপেন্ডেন্সি হিসেবে যুক্ত থাকে। অপ্টিমাইজেশন ডিফল্টভাবে চালু থাকে। বাড়তি কিছু করার প্রয়োজন নেই।
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
- Webpack-এ Intlayer-এর মাধ্যমে বান্ডেল অপ্টিমাইজেশন চালু করার জন্য আপনাকে প্রয়োজনীয় Babel (`@intlayer/babel`) বা SWC (`@intlayer/swc`) প্লাগইন ইনস্টল এবং কনফিগার করতে হবে।
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
- ```typescript fileName="babel.config.js"
323
+ সঠিক ক্রমে চারটে প্লাগিনই `babel.config.js`-এ যোগ করুন:
324
+
325
+ ```javascript fileName="babel.config.js"
242
326
  const {
243
- getOptimizePluginOptions,
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: [[intlayerOptimizeBabelPlugin, getOptimizePluginOptions()]],
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`-এর `build` প্রপার্টির মাধ্যমে Intlayer কীভাবে আপনার বান্ডেল অপ্টিমাইজ করবে তা নিয়ন্ত্রণ করতে পারেন।
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.FRENCH],
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
- minify: true;
275
-
276
- /**
277
- * ডিকশনারিতে অব্যবহৃত কীগুলো (keys) মুছে ফেলুন (purge)
278
- */
279
- purge: true;
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
- > বিস্তারিত জানার জন্য কনফিগারেশন ডকুমেন্ট দেখুন: [Configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/bn/configuration.md)
395
+ > সমস্ত অপশনের জন্য কনফিগারেশন রেফারেন্স দেখুন: [Configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/bn/configuration.md)
294
396
 
295
- ### বিল্ড অপশন
397
+ ### বিল্ড অপশনসমূহ
296
398
 
297
- `build` কনফিগারেশন অবজেক্টের অধীনে নিচের অপশনগুলো উপলব্ধ রয়েছে:
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
- ### মিনিফিকেশন (Minification)
407
+ `build.minify` কিন্তু আপনার JavaScript বান্ডেলটিকে **মিনিফাই করে না** — সেটি আপনার বান্ডলার-এর দায়িত্ব। এর পরিবর্তে, এটি আপনার ডিফাইন করা প্রতিটি কন্টেন্ট ফিল্ডের কী-কে ছোট অক্ষরের ছদ্মনাম (alias) দিয়ে রিপ্লেস করে কম্পাইল করা ডিকশনারি JSON ফাইলের সাইজ ছোট করে:
306
408
 
307
- ডিকশনারি মিনিফাই করার ফলে অপ্রয়োজনীয় হোয়াইটস্পেস, কমেন্ট মুছে যায় এবং JSON কন্টেন্টের সাইজ কমে যায়। বড় ডিকশনারির ক্ষেত্রে এটি অত্যন্ত উপযোগী।
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
- > দ্রষ্টব্য: যদি `optimize` বন্ধ করা থাকে অথবা যদি ভিজ্যুয়াল এডিটর (Visual Editor) চালু থাকে তবে মিনিফিকেশন কাজ করবে না (কারণ এডিটর ব্যবহারের জন্য পূর্ণ কন্টেন্টের প্রয়োজন হয়)।
431
+ > যখন `optimize` `false` থাকে বা যখন `editor.enabled` `true` থাকে তখন মিনিফিকেশন বাদ দেওয়া হয় (ভিজ্যুয়াল এডিটরের এডিটিং সচল রাখার জন্য অরিজিনাল ফিল্ডের নামগুলো প্রয়োজন)।
432
+
433
+ > `importMode: 'fetch'` এর মাধ্যমে লোড করা ডিকশনারিগুলোর ক্ষেত্রেও মিনিফিকেশন করা হয় না, কারণ அவற்றின் JSON একটি রিমোট API থেকে অরিজিনাল ফিল্ডের নাম ব্যবহার করে সার্ভ করা হয় — ক্লায়েন্ট-সাইডে কী-গুলোর নাম পরিবর্তন করলে সার্ভার/ক্লায়েন্ট চুক্তি ভেঙে যাবে।
322
434
 
323
- ### পার্জিং (Purging)
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
- > দ্রষ্টব্য: যদি `optimize` বন্ধ থাকে তবে পার্জিং কাজ করবে না।
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
- ### ইমপোর্ট মোড (Import Mode)
467
+ অনেক পেজ লোকেলের সমন্বয়ে তৈরি বড় অ্যাপ্লিকেশনগুলোর ক্ষেত্রে, JSON আপনার বান্ডেল সাইজের একটি বড় অংশ দখল করতে পারে। Intlayer-এর `importMode` অপশন ব্যবহার করে আপনি নিয়ন্ত্রণ করতে পারবেন ডিকশনারিগুলো কীভাবে লোড হবে।
342
468
 
343
- বড় অ্যাপ্লিকেশনের ক্ষেত্রে অনেকগুলো পেজ এবং লোকাল (locale) থাকলে আপনার JSON ফাইলগুলো বান্ডেল সাইজের একটি বড় অংশ দখল করতে পারে। Intlayer আপনাকে নিয়ন্ত্রণ করতে দেয় কীভাবে ডিকশনারিগুলো লোড হবে।
469
+ ### গ্লোবাল ডেফিনেশন (Global definition)
344
470
 
345
- আপনার `intlayer.config.ts` ফাইলে বিশ্বব্যাপী (globally) ডিফল্ট ইমপোর্ট মোড ডিফাইন করা যেতে পারে।
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
- build: {
352
- minify: true,
477
+ dictionary: {
478
+ importMode: "dynamic", // ডিফল্ট হলো 'static'
353
479
  },
354
480
  };
355
481
 
356
482
  export default config;
357
483
  ```
358
484
 
359
- পাশাপাশি আপনার `.content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5}}` ফাইলগুলোতে প্রতিটি ডিকশনারির জন্যও এটি করা যায়।
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'` | **অপ্রচলিত (Deprecated)**: পরিবর্তে `dictionary.importMode` ব্যবহার করুন। ডিকশনারি কীভাবে লোড হবে তা নির্ধারণ করে। |
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
- স্ট্যাটিক মোডে Intlayer `useIntlayer`-কে `useDictionary` দ্বারা প্রতিস্থাপন করে এবং ডিকশনারিটিকে সরাসরি জাভাস্ক্রিপ্ট বান্ডেলে যুক্ত করে।
511
+ স্ট্যাটিক মোডে, Intlayer `useIntlayer` কে `useDictionary` দিয়ে প্রতিস্থাপন করে এবং সরাসরি JavaScript বান্ডেলের মধ্যে ডিকশনারি যুক্ত করে দেয়।
385
512
 
386
- - **সুবিধা:** তাৎক্ষণিক রেন্ডারিং (সিঙ্ক্রোনাস), হাইড্রেশনের সময় আলাদা কোনো নেটওয়ার্ক রিকোয়েস্টের প্রয়োজন হয় না।
387
- - **অসুবিধা:** বান্ডেলে সংশ্লিষ্ট কম্পোনেন্টের জন্য উপলব্ধ **সবগুলো** ভাষার অনুবাদ অন্তর্ভুক্ত থাকে।
388
- - **উপযোগিতা:** সিঙ্গেল পেজ অ্যাপ্লিকেশন (SPA)।
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
- // অপ্টিমাইজ করা কোড (Static)
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
- fr: "Mon titre",
531
+ bn: "আমার শিরোনাম",
404
532
  },
405
533
  },
406
534
  });
@@ -408,47 +536,67 @@ const content = useDictionary({
408
536
 
409
537
  ### ২. ডাইনামিক মোড (Dynamic Mode)
410
538
 
411
- ডাইনামিক মোডে Intlayer `useIntlayer`-কে `useDictionaryAsync` দ্বারা প্রতিস্থাপন করে। এটি বর্তমান লোকাল (locale)-এর নির্দিষ্ট JSON ফাইলকে লেজি-লোড (lazy-load) করতে `import()` ব্যবহার করে।
539
+ ডাইনামিক মোডে, Intlayer `useIntlayer` কে `useDictionaryAsync` দিয়ে প্রতিস্থাপন করে। এটি `import()` মেকানিজম (Suspense-এর মতো) ব্যবহার করে, যাতে শুধুমাত্র বর্তমান লোকেলের JSON-টি নির্দিষ্টভাবে লেজি-লোড করা যায়।
412
540
 
413
- - **সুবিধা:** **ভাষা-স্তরের ট্রি শেকিং (Locale-level tree shaking)।** একজন ব্যবহারকারী ইংরেজি ভার্সন দেখলে _শুধুমাত্র_ ইংরেজি ডিকশনারি ডাউনলোড করবেন। ফ্রেঞ্চ ডিকশনারি কখনোই লোড হবে না।
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
- // অপ্টিমাইজ করা কোড (Dynamic)
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
- fr: () =>
430
- import(".intlayer/dynamic_dictionary/my-key/fr.json").then(
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'` ব্যবহার করার সময় যদি একটি পেজে ১০০টি কম্পোনেন্ট `useIntlayer` ব্যবহার করে, তবে ব্রাউজার ১০০টি আলাদা ডাউনলোড রিকোয়েস্ট পাঠাবে। এই রিকোয়েস্টের "তুষারপাত" (waterfall) এড়াতে প্রতিটি ছোট কম্পোনেন্টের পরিবর্তে কম সংখ্যক `.content` ফাইলে কন্টেন্টগুলো গ্রুপ করুন (যেমন: প্রতিটি পেজ সেকশনের জন্য একটি ডিকশনারি)
565
+ > যখন আপনি `importMode: 'dynamic'` ব্যবহার করছেন, তখন যদি একই পেজে ১০০টি কম্পোনেন্ট `useIntlayer` ব্যবহার করে, তবে ব্রাউজার ১০০টি আলাদা ফেচ (fetch) করার চেষ্টা করবে। রিকোয়েস্টের এই "ওয়াটারফল" এড়াতে, প্রতিটি ছোট কম্পোনেন্টের জন্য একটি করে ফাইল না বানিয়ে, কন্টেন্টগুলোকে কমসংখ্যক `.content` ফাইলে (যেমন, প্রতিটি পেজ সেকশনের জন্য একটি ডিকশনারি) গ্রুপ করে ফেলুন। আপনি একই কী ব্যবহার করে একাধিক `.content` ফাইলও ব্যবহার করতে পারেন। Intlayer সেগুলো একত্র করে একটি সিঙ্গেল ডিকশনারি তৈরি করবে।
437
566
 
438
567
  ### ৩. ফেচ মোড (Fetch Mode)
439
568
 
440
- এটি ডাইনামিক মোডের মতোই কাজ করে, তবে এটি প্রথমে Intlayer Live Sync API থেকে ডিকশনারিগুলো আনার চেষ্টা করে। যদি API কল ব্যর্থ হয় বা কন্টেন্ট লাইভ আপডেটের জন্য চিহ্নিত করা না থাকে, তবে এটি ডাইনামিক ইমপোর্টে ফিরে যায়।
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 ডকুমেন্ট দেখুন: [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/bn/intlayer_CMS.md)
590
+ > আরও বিস্তারিত জানতে CMS ডকুমেন্টেশন দেখুন: [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/bn/intlayer_CMS.md)
443
591
 
444
- > ফেচ মোডে পার্জিং (purge) এবং মিনিফিকেশন ব্যবহার করা যায় না।
592
+ > ফেচ মোডে purge বা minification প্রযোজ্য হয় না কারণ JSON একটি রিমোট API থেকে অরিজিনাল ফিল্ডের নামেই পরিবেশন করা হয়।
445
593
 
446
- ## সারসংক্ষেপ: স্ট্যাটিক বনাম ডাইনামিক
594
+ ## সারসংক্ষেপ: স্ট্যাটিক বনাম ডাইনামিক (Static vs Dynamic)
447
595
 
448
- | ফিচার | স্ট্যাটিক মোড | ডাইনামিক মোড |
449
- | :---------------------------- | :----------------------------------------- | :---------------------------------------- |
450
- | **JS বান্ডেল সাইজ** | তুলনামূলক বড় (সব ভাষা অন্তর্ভুক্ত করে) | সবচেয়ে ছোট (শুধুমাত্র কোড, কন্টেন্ট নেই) |
451
- | **প্রাথমিক লোড** | তাৎক্ষণিক (কন্টেন্ট বান্ডেলের ভেতরেই থাকে) | সামান্য দেরি (JSON ফেচ করে আনে) |
452
- | **নেটওয়ার্ক রিকোয়েস্ট** | ০টি অতিরিক্ত রিকোয়েস্ট | ডিকশনারি পিছু ১টি রিকোয়েস্ট |
453
- | **ট্রি শেকিং (Tree Shaking)** | কম্পোনেন্ট-স্তরে | কম্পোনেন্ট-স্তর + ভাষা-স্তরে |
454
- | **উপযোগিতা** | UI কম্পোনেন্ট, ছোট অ্যাপ্লিকেশন | বেশি টেক্সটযুক্ত পেজ, অনেকগুলো ভাষা |
596
+ | বৈশিষ্ট্য | স্ট্যাটিক মোড (Static Mode) | ডাইনামিক মোড (Dynamic Mode) |
597
+ | :------------------------ | :------------------------------------------ | :--------------------------------------------- |
598
+ | **JS বান্ডেল সাইজ** | বড় (কম্পোনেন্টের সব ভাষা অন্তর্ভুক্ত থাকে) | সবচেয়ে ছোট (শুধুমাত্র কোড থাকে, কন্টেন্ট নয়) |
599
+ | **প্রাথমিক লোড** | তাৎক্ষণিক (কন্টেন্ট বান্ডেলের ভেতরেই থাকে) | সামান্য দেরি হয় (JSON ফেচ করে) |
600
+ | **নেটওয়ার্ক রিকোয়েস্ট** | 0 (অতিরিক্ত কোনো রিকোয়েস্ট নেই) | প্রতি ডিকশনারি কী-এর জন্য ১টি রিকোয়েস্ট |
601
+ | **ট্রি শেকিং** | কম্পোনেন্ট-লেভেল | কম্পোনেন্ট-লেভেল + লোকেল-লেভেল |
602
+ | **সেরা ব্যবহারক্ষেত্র** | UI কম্পোনেন্ট, ছোট অ্যাপ | টেক্সট-বহুল পেজ, অনেকগুলো ভাষা |