@intlayer/docs 9.3.1 → 9.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/de/nextjs-multilingual-seo-comparison.md +9 -9
- package/blog/en/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/en-GB/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/es/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/fr/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/hi/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/id/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/it/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/ja/nextjs-multilingual-seo-comparison.md +9 -9
- package/blog/ko/nextjs-multilingual-seo-comparison.md +9 -9
- package/blog/pl/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/pt/nextjs-multilingual-seo-comparison.md +9 -9
- package/blog/ru/nextjs-multilingual-seo-comparison.md +9 -9
- package/blog/tr/nextjs-multilingual-seo-comparison.md +9 -9
- package/blog/uk/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/vi/nextjs-multilingual-seo-comparison.md +10 -10
- package/blog/zh/nextjs-multilingual-seo-comparison.md +10 -10
- package/dist/cjs/generated/docs.entry.cjs +20 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +20 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/bundle_optimization.md +1 -1
- package/docs/ar/configuration.md +32 -9
- package/docs/ar/dictionary/content_file.md +0 -22
- package/docs/ar/dictionary/function_fetching.md +23 -0
- package/docs/ar/eslint.md +336 -0
- package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +1 -1
- package/docs/bn/configuration.md +34 -9
- package/docs/bn/eslint.md +336 -0
- package/docs/cs/bundle_optimization.md +1 -1
- package/docs/cs/configuration.md +33 -9
- package/docs/cs/eslint.md +336 -0
- package/docs/de/bundle_optimization.md +1 -1
- package/docs/de/configuration.md +34 -9
- package/docs/de/dictionary/content_file.md +0 -22
- package/docs/de/dictionary/function_fetching.md +23 -0
- package/docs/de/eslint.md +336 -0
- package/docs/en/bundle_optimization.md +1 -1
- package/docs/en/configuration.md +34 -9
- package/docs/en/dictionary/content_file.md +0 -22
- package/docs/en/dictionary/function_fetching.md +23 -0
- package/docs/en/eslint.md +336 -0
- package/docs/en/packages/intlayer/getLocalizedPath.md +70 -19
- package/docs/en-GB/configuration.md +33 -9
- package/docs/en-GB/dictionary/content_file.md +0 -22
- package/docs/en-GB/dictionary/function_fetching.md +23 -0
- package/docs/en-GB/eslint.md +336 -0
- package/docs/en-GB/intlayer_with_create_react_app.md +32 -35
- package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +1 -1
- package/docs/es/bundle_optimization.md +1 -1
- package/docs/es/configuration.md +35 -9
- package/docs/es/dictionary/content_file.md +0 -22
- package/docs/es/dictionary/function_fetching.md +23 -0
- package/docs/es/eslint.md +336 -0
- package/docs/fr/bundle_optimization.md +1 -1
- package/docs/fr/configuration.md +35 -9
- package/docs/fr/dictionary/content_file.md +0 -22
- package/docs/fr/dictionary/function_fetching.md +23 -0
- package/docs/fr/eslint.md +336 -0
- package/docs/hi/configuration.md +35 -9
- package/docs/hi/dictionary/content_file.md +0 -22
- package/docs/hi/dictionary/function_fetching.md +23 -0
- package/docs/hi/eslint.md +336 -0
- package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +1 -1
- package/docs/hi/intlayer_with_vite+svelte.md +2 -2
- package/docs/id/configuration.md +35 -9
- package/docs/id/dictionary/content_file.md +0 -22
- package/docs/id/dictionary/function_fetching.md +23 -0
- package/docs/id/eslint.md +336 -0
- package/docs/it/bundle_optimization.md +1 -1
- package/docs/it/configuration.md +35 -9
- package/docs/it/dictionary/content_file.md +0 -22
- package/docs/it/dictionary/function_fetching.md +23 -0
- package/docs/it/eslint.md +336 -0
- package/docs/ja/configuration.md +30 -9
- package/docs/ja/dictionary/content_file.md +0 -22
- package/docs/ja/dictionary/function_fetching.md +23 -0
- package/docs/ja/eslint.md +336 -0
- package/docs/ja/intlayer_with_react_router_v7.md +1 -146
- package/docs/ja/intlayer_with_vite+react.md +5 -1
- package/docs/ko/configuration.md +31 -9
- package/docs/ko/dictionary/content_file.md +0 -22
- package/docs/ko/dictionary/function_fetching.md +23 -0
- package/docs/ko/eslint.md +336 -0
- package/docs/ko/intlayer_with_lynx+react.md +4 -0
- package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +1 -1
- package/docs/ko/intlayer_with_storybook.md +5 -5
- package/docs/nl/configuration.md +33 -9
- package/docs/nl/eslint.md +336 -0
- package/docs/pl/bundle_optimization.md +1 -1
- package/docs/pl/configuration.md +34 -9
- package/docs/pl/dictionary/content_file.md +0 -22
- package/docs/pl/dictionary/function_fetching.md +23 -0
- package/docs/pl/eslint.md +336 -0
- package/docs/pl/intlayer_with_astro.md +1 -114
- package/docs/pl/migration_from_i18next_to_intlayer.md +4 -0
- package/docs/pl/migration_from_next-i18next_to_intlayer.md +8 -4
- package/docs/pl/migration_from_next-intl_to_intlayer.md +11 -5
- package/docs/pl/migration_from_nuxtjs_i18n_to_intlayer.md +8 -4
- package/docs/pl/migration_from_react-i18next_to_intlayer.md +8 -4
- package/docs/pl/migration_from_vue-i18n_to_intlayer.md +4 -0
- package/docs/pt/bundle_optimization.md +1 -1
- package/docs/pt/configuration.md +34 -9
- package/docs/pt/dictionary/content_file.md +0 -22
- package/docs/pt/dictionary/function_fetching.md +23 -0
- package/docs/pt/eslint.md +336 -0
- package/docs/pt/intlayer_with_astro.md +1 -114
- package/docs/ru/bundle_optimization.md +1 -1
- package/docs/ru/configuration.md +34 -9
- package/docs/ru/dictionary/content_file.md +0 -22
- package/docs/ru/dictionary/function_fetching.md +23 -0
- package/docs/ru/eslint.md +336 -0
- package/docs/tr/bundle_optimization.md +1 -1
- package/docs/tr/configuration.md +33 -9
- package/docs/tr/dictionary/content_file.md +0 -22
- package/docs/tr/dictionary/function_fetching.md +23 -0
- package/docs/tr/eslint.md +336 -0
- package/docs/uk/configuration.md +35 -9
- package/docs/uk/dictionary/content_file.md +0 -22
- package/docs/uk/dictionary/function_fetching.md +23 -0
- package/docs/uk/eslint.md +336 -0
- package/docs/uk/packages/angular-intlayer/exports.md +2 -2
- package/docs/ur/configuration.md +35 -9
- package/docs/ur/eslint.md +336 -0
- package/docs/vi/bundle_optimization.md +1 -1
- package/docs/vi/configuration.md +33 -9
- package/docs/vi/dictionary/content_file.md +0 -22
- package/docs/vi/dictionary/function_fetching.md +23 -0
- package/docs/vi/eslint.md +336 -0
- package/docs/zh/bundle_optimization.md +1 -1
- package/docs/zh/configuration.md +29 -9
- package/docs/zh/dictionary/content_file.md +0 -22
- package/docs/zh/dictionary/function_fetching.md +23 -0
- package/docs/zh/eslint.md +336 -0
- package/docs/zh/intlayer_with_create_react_app.md +4 -0
- package/docs/zh/intlayer_with_lynx+react.md +4 -0
- package/docs/zh/intlayer_with_nextjs_14.md +0 -2
- package/docs/zh/intlayer_with_nextjs_15.md +0 -2
- package/docs/zh/intlayer_with_nextjs_page_router.md +0 -2
- package/docs/zh/intlayer_with_nuxt.md +1 -1
- package/docs/zh/intlayer_with_react_router_v7.md +4 -0
- package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +4 -0
- package/docs/zh/intlayer_with_solid_start.md +1 -1
- package/docs/zh/intlayer_with_vite+vue.md +0 -2
- package/docs/zh-TW/bundle_optimization.md +1 -1
- package/docs/zh-TW/eslint.md +336 -0
- package/package.json +7 -7
- package/src/generated/docs.entry.ts +20 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-08-12
|
|
3
|
+
updatedAt: 2026-08-13
|
|
4
|
+
title: ESLint پلگ ان | Intlayer کے لیے لنٹ قواعد
|
|
5
|
+
description: eslint-plugin-intlayer کے ذریعے ہارڈ کوڈ شدہ سٹرنگز، ایسی ڈائنامک کالز جنہیں Intlayer کمپائلر بہتر نہیں بنا سکتا، اور غیر استعمال شدہ ڈکشنری مواد کو پکڑیں۔ React، Vue، Svelte، Angular اور Astro میں ESLint اور oxlint کے ساتھ کام کرتا ہے۔
|
|
6
|
+
keywords:
|
|
7
|
+
- Intlayer
|
|
8
|
+
- ESLint
|
|
9
|
+
- oxlint
|
|
10
|
+
- لنٹنگ
|
|
11
|
+
- i18n
|
|
12
|
+
- بین الاقوامیت
|
|
13
|
+
- no-raw-text
|
|
14
|
+
- ہارڈ کوڈ شدہ سٹرنگز
|
|
15
|
+
- غیر استعمال شدہ ترجمے
|
|
16
|
+
- غیر فعال مواد
|
|
17
|
+
- React
|
|
18
|
+
- Vue
|
|
19
|
+
- Svelte
|
|
20
|
+
- Angular
|
|
21
|
+
slugs:
|
|
22
|
+
- doc
|
|
23
|
+
- eslint
|
|
24
|
+
history:
|
|
25
|
+
- version: 9.3.1
|
|
26
|
+
date: 2026-08-12
|
|
27
|
+
changes: "ابتدائی تاریخ"
|
|
28
|
+
author: aymericzip
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
# ESLint x OXLint پلگ ان
|
|
32
|
+
|
|
33
|
+
`eslint-plugin-intlayer` ان i18n غلطیوں کو پکڑتا ہے جنہیں TypeScript نہیں پکڑ سکتا:
|
|
34
|
+
|
|
35
|
+
1. **ہارڈ کوڈ شدہ متن (Hardcoded text)** جو کبھی ڈکشنری میں شامل نہیں ہوا۔
|
|
36
|
+
2. **ڈائنامک کالز (Dynamic calls)** جو ٹائپ چیک پاس کرتی ہیں اور چلتی ہیں، لیکن Intlayer کمپائلر انہیں آپٹمائز نہیں کر سکتا۔
|
|
37
|
+
3. **غیر فعال مواد (Dead content)** — ڈکشنریز اور فیلڈز جنہیں پروجیکٹ میں کہیں بھی نہیں پڑھا جاتا (آپٹ ان)۔
|
|
38
|
+
|
|
39
|
+
نامعلوم ڈکشنری کیز، نامعلوم فیلڈ پاتھز اور غائب لوکیلز پہلے ہی کمپائل نقائص ہیں، اس لیے پلگ ان ان کو دوبارہ رپورٹ نہیں کرتا۔
|
|
40
|
+
|
|
41
|
+
## انسٹالیشن
|
|
42
|
+
|
|
43
|
+
```bash packageManager="npm"
|
|
44
|
+
npm install --save-dev eslint-plugin-intlayer
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```bash packageManager="pnpm"
|
|
48
|
+
pnpm add --save-dev eslint-plugin-intlayer
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
```bash packageManager="yarn"
|
|
52
|
+
yarn add --dev eslint-plugin-intlayer
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
ESLint 9 یا اس سے نیا ورژن (flat config) درکار ہے۔ ESLint 10 معاون ہے۔
|
|
56
|
+
|
|
57
|
+
## استعمال
|
|
58
|
+
|
|
59
|
+
یہ پلگ ان ESLint اور [oxlint](https://oxc.rs) دونوں میں یکساں قواعد اور اختیارات کے ساتھ کام کرتا ہے۔
|
|
60
|
+
|
|
61
|
+
<Tabs defaultTab="eslint">
|
|
62
|
+
<Tab label="ESLint" value="eslint">
|
|
63
|
+
|
|
64
|
+
```javascript fileName="eslint.config.mjs"
|
|
65
|
+
import intlayer from "eslint-plugin-intlayer";
|
|
66
|
+
|
|
67
|
+
export default [...intlayer.configs.recommended];
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
یا کوئی کنفیگ پھیلائیں اور شدت کی سطحیں خود مقرر کریں:
|
|
71
|
+
|
|
72
|
+
```javascript fileName="eslint.config.mjs"
|
|
73
|
+
import intlayer from "eslint-plugin-intlayer";
|
|
74
|
+
|
|
75
|
+
export default [
|
|
76
|
+
...intlayer.configs.recommended,
|
|
77
|
+
{
|
|
78
|
+
rules: {
|
|
79
|
+
"intlayer/no-raw-text": "warn",
|
|
80
|
+
"intlayer/static-dictionary-key": "error",
|
|
81
|
+
"intlayer/no-dynamic-field-access": "error",
|
|
82
|
+
"intlayer/enforce-adapter-import": "warn",
|
|
83
|
+
"intlayer/no-unused-content": "warn",
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
</Tab>
|
|
90
|
+
<Tab label="oxlint" value="oxlint">
|
|
91
|
+
|
|
92
|
+
```json fileName=".oxlintrc.json"
|
|
93
|
+
{
|
|
94
|
+
"jsPlugins": ["eslint-plugin-intlayer"],
|
|
95
|
+
"rules": {
|
|
96
|
+
"intlayer/no-raw-text": "warn",
|
|
97
|
+
"intlayer/static-dictionary-key": "error",
|
|
98
|
+
"intlayer/no-dynamic-field-access": "error",
|
|
99
|
+
"intlayer/enforce-adapter-import": "warn"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
دو اہم باتیں: oxlint کی JS پلگ ان سپورٹ ابھی الفا مرحلے میں ہے، اور oxlint کسٹم پارسرز کو سپورٹ نہیں کرتا — لہذا `.vue`، `.svelte`، `.astro` اور Angular ٹیمپلیٹس وہاں لنٹ نہیں ہوتے۔ اپنی JS/TS/JSX فائلوں پر oxlint چلائیں اور باقی کے لیے ESLint برقرار رکھیں۔
|
|
105
|
+
|
|
106
|
+
`no-unused-content` کو اوپر جان بوجھ کر چھوڑ دیا گیا ہے: اسے رول سیاق و سباق سے ورکنگ ڈائرکٹری اور لنٹ شدہ فائل پاتھ کی ضرورت ہوتی ہے، جس کی الفا JS پلگ ان برج ضمانت نہیں دیتا۔ اسے ESLint کے تحت چلائیں۔
|
|
107
|
+
|
|
108
|
+
</Tab>
|
|
109
|
+
</Tabs>
|
|
110
|
+
|
|
111
|
+
### کنفیگریشنز (Configs)
|
|
112
|
+
|
|
113
|
+
| کنفیگ | `no-raw-text` | `static-dictionary-key` | `no-dynamic-field-access` | `enforce-adapter-import` | `no-unused-content` |
|
|
114
|
+
| --------------- | ----------------------- | ----------------------- | ------------------------- | ------------------------ | ------------------- |
|
|
115
|
+
| `recommended` | warn | error | error | off | off |
|
|
116
|
+
| `strict` | error (+ نان JSX لٹرلز) | error | error | error | off |
|
|
117
|
+
| `contract-only` | off | error | error | off | off |
|
|
118
|
+
|
|
119
|
+
`recommended` جان بوجھ کر `no-raw-text` کو `warn` پر رکھتا ہے: اسے کسی موجودہ کوڈ بیس پر لاگو کرنے سے تمام غیر ترجمہ شدہ سٹرنگز ایک ساتھ سامنے آ جاتی ہیں، جس سے پہلے ہی دن آپ کا بلڈ فیل نہیں ہونا چاہیے۔
|
|
120
|
+
|
|
121
|
+
`enforce-adapter-import` پہلے سے غیر فعال ہے — اگر آپ چاہیں تو اسے واضح طور پر فعال کریں۔
|
|
122
|
+
|
|
123
|
+
`no-unused-content` ہر کنفیگ میں بند ہے، بشمول `strict`۔ یہ واحد قاعدہ ہے جو آپ کی Intlayer کنفیگریشن کو پڑھتا ہے اور ڈسک سے آپ کی سورس فائلوں کو اسکین کرتا ہے، اس لیے اسے آن کرنا ایک دانستہ انتخاب ہونا چاہیے۔
|
|
124
|
+
|
|
125
|
+
## قواعد
|
|
126
|
+
|
|
127
|
+
### `no-raw-text`
|
|
128
|
+
|
|
129
|
+
صارف کے سامنے آنے والے ایسے متن کی رپورٹ کرتا ہے جو ڈکشنری میں ڈکلیئر نہیں ہے۔ یہ `intlayer extract` جیسی شناخت استعمال کرتا ہے، اس لیے برانڈ نام، CSS کلاسز اور تکنیکی شناخت کنندگان کو نظر انداز کر دیا جاتا ہے۔
|
|
130
|
+
|
|
131
|
+
```jsx
|
|
132
|
+
// ✗ رپورٹ کیا گیا
|
|
133
|
+
<h1>Welcome to our documentation</h1>
|
|
134
|
+
<input placeholder="Enter your email address" />
|
|
135
|
+
|
|
136
|
+
// ✓ درست
|
|
137
|
+
const { title } = useIntlayer("home");
|
|
138
|
+
<h1>{title}</h1>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
مواد کے اعلامیہ کی فائلیں (`*.content.ts`, …) چھوڑ دی جاتی ہیں۔
|
|
142
|
+
|
|
143
|
+
ایک ساتھ پوری فائل کو ٹھیک کرنے کے لیے، `npx intlayer extract` چلائیں اور کمپائلر کو سٹرنگز کو ڈکشنری میں منتقل کرنے دیں۔
|
|
144
|
+
|
|
145
|
+
**اختیارات**
|
|
146
|
+
|
|
147
|
+
```javascript fileName="eslint.config.mjs"
|
|
148
|
+
{
|
|
149
|
+
"intlayer/no-raw-text": [
|
|
150
|
+
"warn",
|
|
151
|
+
{
|
|
152
|
+
// وہ اوصاف جن کی قدر صارف کے سامنے آنے والا متن ہے۔
|
|
153
|
+
// ڈیفالٹ: title, placeholder, alt, aria-label, label
|
|
154
|
+
attributes: ["title", "placeholder", "alt", "aria-label", "label"],
|
|
155
|
+
|
|
156
|
+
// وہ عناصر جن کا مواد کبھی بھی صارف کے سامنے آنے والا متن نہیں ہوتا۔
|
|
157
|
+
// ڈیفالٹ: code, pre, script, style
|
|
158
|
+
ignoreElements: ["code", "pre", "script", "style"],
|
|
159
|
+
|
|
160
|
+
// کبھی رپورٹ نہ کیے جانے والے متن کے ریگولر ایکسپریشنز۔
|
|
161
|
+
ignorePatterns: ["^Powered by"],
|
|
162
|
+
|
|
163
|
+
// مارک اپ سے باہر سٹرنگ لٹرلز کی بھی رپورٹ کریں۔ ڈیفالٹ: false
|
|
164
|
+
includeStringLiterals: false,
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### `static-dictionary-key`
|
|
171
|
+
|
|
172
|
+
ڈکشنری کی کے سٹرنگ لٹرل ہونے کا تقاضا کرتا ہے۔
|
|
173
|
+
|
|
174
|
+
کمپائلر صرف اسی صورت میں ڈکشنری کو پری لوڈ کر سکتا ہے جب وہ کال سائٹ پر براہ راست کی کو پڑھ سکے۔ حسابی کی کے ساتھ یہ خاموشی سے اصلاح کو چھوڑ دیتا ہے اور اس کے بجائے ہر ڈکشنری کو بنڈل کر دیتا ہے۔
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
// ✗ رپورٹ کیا گیا
|
|
178
|
+
useIntlayer(dictionaryKey);
|
|
179
|
+
useIntlayer(`home-${suffix}`);
|
|
180
|
+
getTranslations({ namespace: page });
|
|
181
|
+
|
|
182
|
+
// ✗ متغیر اب بھی لٹرل نہیں ہے
|
|
183
|
+
const key = "home";
|
|
184
|
+
useIntlayer(key);
|
|
185
|
+
|
|
186
|
+
// ✓ درست
|
|
187
|
+
useIntlayer("home");
|
|
188
|
+
getTranslations({ namespace: "home" });
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
یہ `useIntlayer`، `getIntlayer` اور ہر مطابقت پذیر اڈاپٹر (`useTranslation`، `useTranslations`، `formatMessage`، `<FormattedMessage id>`، `<Trans i18nKey>`، …) پر لاگو ہوتا ہے۔
|
|
192
|
+
|
|
193
|
+
### `no-dynamic-field-access`
|
|
194
|
+
|
|
195
|
+
ڈکشنری سے پڑھی جانے والی فیلڈ کے جامد طور پر معلوم ہونے کا تقاضا کرتا ہے۔
|
|
196
|
+
|
|
197
|
+
کمپائلر ان فیلڈز کو ہٹا دیتا ہے جنہیں وہ استعمال ہوتے ہوئے نہیں دیکھتا۔ ایک حسابی رسائی اس کے لیے غیر مرئی ہوتی ہے، اس لیے رن ٹائم پر پڑھنا `undefined` واپس کر سکتا ہے۔
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
// ✗ رپورٹ کیا گیا
|
|
201
|
+
const content = useIntlayer("home");
|
|
202
|
+
content[fieldName];
|
|
203
|
+
|
|
204
|
+
const t = useTranslations("home");
|
|
205
|
+
t(messageKey);
|
|
206
|
+
|
|
207
|
+
// ✓ درست
|
|
208
|
+
content.title;
|
|
209
|
+
content["title"];
|
|
210
|
+
content.items[0];
|
|
211
|
+
t("hero.title");
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### `enforce-adapter-import`
|
|
215
|
+
|
|
216
|
+
اصل پیکیج کے مقابلے `@intlayer/*` مطابقت پذیر اڈاپٹر کو ترجیح دیتا ہے۔ اصل پیکیج صرف اس وقت Intlayer پر حل ہوتا ہے جب بنڈلر عرف تشکیل دیا گیا ہو؛ اڈاپٹر ہمیشہ حل ہوتا ہے۔ `--fix` کے ساتھ خودکار طور پر درست کیا جا سکتا ہے۔
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
// ✗ رپورٹ کیا گیا
|
|
220
|
+
import { useTranslation } from "react-i18next";
|
|
221
|
+
import { getTranslations } from "next-intl/server";
|
|
222
|
+
|
|
223
|
+
// ✓ درست
|
|
224
|
+
import { useTranslation } from "@intlayer/react-i18next";
|
|
225
|
+
import { getTranslations } from "@intlayer/next-intl/server";
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### `no-unused-content`
|
|
229
|
+
|
|
230
|
+
**پہلے سے غیر فعال ہے۔** ایسے مواد کی رپورٹ کرتا ہے جسے پروجیکٹ میں کوئی نہیں پڑھتا، نیز ایک سے زیادہ جگہوں پر ڈکلیئر کی گئی ڈکشنری کیز۔
|
|
231
|
+
|
|
232
|
+
```typescript fileName="src/home.content.ts"
|
|
233
|
+
export default {
|
|
234
|
+
key: "home", // ✗ تب رپورٹ ہوتا ہے جب پروجیکٹ میں کوئی "home" کی درخواست نہیں کرتا
|
|
235
|
+
content: {
|
|
236
|
+
title: t({ ur: "عنوان", en: "Title" }),
|
|
237
|
+
|
|
238
|
+
// ✗ جب کوئی چیز `hero` نہیں پڑھتی تو رپورٹ ہوتا ہے
|
|
239
|
+
hero: {
|
|
240
|
+
subtitle: t({ ur: "ذیلی عنوان", en: "Subtitle" }),
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
دوسرے قواعد کے برعکس، یہ قاعدہ صرف سامنے موجود فائل سے فیصلہ نہیں کر سکتا — ایک فیلڈ صرف پورے پروجیکٹ کے تناظر میں غیر استعمال شدہ ہوتی ہے۔ لنٹ رن کے پہلے مواد کے اعلان پر یہ آپ کی Intlayer کنفیگریشن لوڈ کرتا ہے، ان سورس فائلوں کو اسکین کرتا ہے جن کا وہ کنفیگریشن اعلان کرتی ہے (`build.traversePattern`, `compiler.transformPattern`) اور وہی تجزیہ کار چلاتا ہے جو `@intlayer/lsp` اور VS Code ایکسٹینشن میں "غیر استعمال شدہ" کو سپورٹ کرتا ہے۔ نتیجہ `cacheTtl` ملی سیکنڈ کے لیے محفوظ ہوتا ہے، اس لیے اسکین ہر فائل کے بجائے فی رن ایک بار ہوتا ہے۔
|
|
247
|
+
|
|
248
|
+
**اختیارات**
|
|
249
|
+
|
|
250
|
+
```javascript fileName="eslint.config.mjs"
|
|
251
|
+
{
|
|
252
|
+
"intlayer/no-unused-content": [
|
|
253
|
+
"warn",
|
|
254
|
+
{
|
|
255
|
+
// ان ڈکشنری کیز کی رپورٹ کریں جن کا کوئی حوالہ نہیں ہے۔ ڈیفالٹ: true
|
|
256
|
+
reportUnusedDictionaries: true,
|
|
257
|
+
|
|
258
|
+
// ان فیلڈز کی رپورٹ کریں جنہیں کچھ نہیں پڑھتا۔ ڈیفالٹ: true
|
|
259
|
+
reportUnusedFields: true,
|
|
260
|
+
|
|
261
|
+
// ایک سے زیادہ جگہوں پر ڈکلیئر کیز کی رپورٹ کریں۔ ڈیفالٹ: true
|
|
262
|
+
reportDuplicateKeys: true,
|
|
263
|
+
|
|
264
|
+
// فیلڈ پاتھز کے ریگولر ایکسپریشنز جنہیں کبھی رپورٹ نہیں کیا جائے گا۔
|
|
265
|
+
ignoreFields: ["^meta"],
|
|
266
|
+
|
|
267
|
+
// پروجیکٹ روٹ جہاں سے اسکین شروع ہوتا ہے۔ ڈیفالٹ: ESLint کی ورکنگ ڈائرکٹری
|
|
268
|
+
baseDir: process.cwd(),
|
|
269
|
+
|
|
270
|
+
// ایک پروجیکٹ اسکین کو کتنی دیر تک دوبارہ استعمال کیا جائے گا (ms میں)۔ ڈیفالٹ: 30000
|
|
271
|
+
cacheTtl: 30000,
|
|
272
|
+
},
|
|
273
|
+
],
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
جب آپ طویل مدتی ایڈیٹر سرور سے لنٹ کر رہے ہوں اور چاہتے ہیں کہ ترامیم جلد نظر آئیں تو `cacheTtl` کو کم کریں؛ جب ایک ہی لنٹ رن ایک مونوریپو میں متعدد Intlayer پروجیکٹس پر محیط ہو تو `baseDir` سیٹ کریں۔
|
|
278
|
+
|
|
279
|
+
> **یہ خاموش رہنے کو ترجیح دیتا ہے۔** یہاں غلط مثبت رپورٹ ایک ترجمہ کو حذف کر سکتی ہے، اس لیے جب ڈکشنری کو ایسے طریقے سے استعمال کیا جاتا ہے جسے تجزیہ ٹریک نہیں کر سکتا تو کچھ بھی رپورٹ نہیں کیا جاتا: پورا مواد کا آبجیکٹ پاس کرنا، اس سے منسلک ٹرانسلیٹر فنکشن (`const t = useTranslations("home")`)، براہ راست درآمد کے ذریعے رسائی حاصل کردہ اعلان (`useDictionary(myDictionary)`)، کسی دوسری ڈکشنری سے `nest()`، یا اسپرڈ آپریٹر کی وجہ سے غیر جامع بنائی گئی فیلڈ لسٹ۔ سنگل فائل اجزاء (`.vue`, `.svelte`, `.astro`) کو ان تمام فیلڈز کا استعمال کرتے ہوئے شمار کیا جاتا ہے جن کا وہ ذکر کرتے ہیں، کیونکہ ان کے اسکرپٹ بلاکس یہاں پارس نہیں ہوتے۔
|
|
280
|
+
|
|
281
|
+
`reportDuplicateKeys` ان ان مرجڈ ڈکشنریز کو پڑھتا ہے جنہیں بلڈ `.intlayer/` کے تحت لکھتا ہے، اس لیے یہ تب تک خاموش رہتا ہے جب تک کہ پروجیکٹ کو کم از کم ایک بار بلڈ نہ کیا جائے۔ دو اعلانات جو ایک کی کا اشتراک کرتے ہیں وہ ضم ہو جاتے ہیں، جو کہ ایک درست پیٹرن ہے — رپورٹ اس لیے موجود ہے کیونکہ دونوں طرف بیان کردہ فیلڈ خاموشی سے صرف ایک قدر رکھتی ہے۔
|
|
282
|
+
|
|
283
|
+
تجزیہ کار `@intlayer/lsp` سے لوڈ ہوتا ہے، جو ESM کے طور پر فراہم کیا جاتا ہے۔ اس لیے قاعدے کے لیے ایسے Node ورژن کی ضرورت ہوتی ہے جو ES ماڈیول کو `require()` کر سکے — Node 20.19+ یا 22.12+۔ پرانے ورژنز پر یہ لنٹ رن کو فیل کرنے کے بجائے کچھ بھی رپورٹ نہیں کرتا۔
|
|
284
|
+
|
|
285
|
+
## فریم ورکس
|
|
286
|
+
|
|
287
|
+
ہر قاعدہ تمام Intlayer انٹیگریشنز میں کام کرتا ہے، بشمول Vue، Svelte اور Angular ٹیمپلیٹس۔ آپ کو صرف ESLint کو بتانے کی ضرورت ہے کہ کون سا پارسر ہر فائل کی قسم کو پڑھتا ہے۔
|
|
288
|
+
|
|
289
|
+
| فریم ورک | فائلیں | پارسر (Parser) |
|
|
290
|
+
| ------------------------- | ----------------- | --------------------------------- |
|
|
291
|
+
| React, Preact, Solid, Lit | `.jsx` `.tsx` | `typescript-eslint` |
|
|
292
|
+
| Next.js | `.jsx` `.tsx` | `typescript-eslint` |
|
|
293
|
+
| Vue, Nuxt | `.vue` | `vue-eslint-parser` |
|
|
294
|
+
| Svelte, SvelteKit | `.svelte` | `svelte-eslint-parser` |
|
|
295
|
+
| Angular | `.ts` | `typescript-eslint` |
|
|
296
|
+
| Angular ٹیمپلیٹس | `.component.html` | `@angular-eslint/template-parser` |
|
|
297
|
+
| Astro | `.astro` | `astro-eslint-parser` |
|
|
298
|
+
|
|
299
|
+
```javascript fileName="eslint.config.mjs"
|
|
300
|
+
import intlayer from "eslint-plugin-intlayer";
|
|
301
|
+
import tseslint from "typescript-eslint";
|
|
302
|
+
import vueParser from "vue-eslint-parser";
|
|
303
|
+
import svelteParser from "svelte-eslint-parser";
|
|
304
|
+
import angularTemplateParser from "@angular-eslint/template-parser";
|
|
305
|
+
|
|
306
|
+
export default [
|
|
307
|
+
...intlayer.configs.recommended,
|
|
308
|
+
|
|
309
|
+
{
|
|
310
|
+
files: ["**/*.{ts,tsx,jsx}"],
|
|
311
|
+
languageOptions: { parser: tseslint.parser },
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
files: ["**/*.vue"],
|
|
315
|
+
languageOptions: {
|
|
316
|
+
parser: vueParser,
|
|
317
|
+
parserOptions: { parser: tseslint.parser },
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
files: ["**/*.svelte"],
|
|
322
|
+
languageOptions: {
|
|
323
|
+
parser: svelteParser,
|
|
324
|
+
parserOptions: { parser: tseslint.parser },
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
files: ["**/*.component.html"],
|
|
329
|
+
languageOptions: { parser: angularTemplateParser },
|
|
330
|
+
},
|
|
331
|
+
];
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
صرف وہی پارسر انسٹال کریں جن کی آپ کے پروجیکٹ کو ضرورت ہے۔
|
|
335
|
+
|
|
336
|
+
> **معلوم حد بندی۔** Vue اور Angular ٹیمپلیٹس میں `{{ content[key] }}` جیسے ایکسپریشن کو `no-dynamic-field-access` کے ذریعے چیک نہیں کیا جاتا۔ اسکرپٹ بلاک کے اندر لکھی گئی ڈائنامک ریڈنگز معمول کے مطابق پکڑی جاتی ہیں۔
|
|
@@ -159,7 +159,7 @@ pnpm add -D webpack-bundle-analyzer
|
|
|
159
159
|
bun add -d webpack-bundle-analyzer
|
|
160
160
|
```
|
|
161
161
|
|
|
162
|
-
```typescript fileName="webpack.config.ts
|
|
162
|
+
```typescript fileName="webpack.config.ts"
|
|
163
163
|
import { BundleAnalyzerPlugin } from "webpack-bundle-analyzer";
|
|
164
164
|
|
|
165
165
|
export default {
|
package/docs/vi/configuration.md
CHANGED
|
@@ -477,6 +477,28 @@ const config: IntlayerConfig = {
|
|
|
477
477
|
*/
|
|
478
478
|
purge: true,
|
|
479
479
|
|
|
480
|
+
/**
|
|
481
|
+
* Nhóm các phần từ điển theo ngôn ngữ dựa trên ranh giới tách mã sử dụng
|
|
482
|
+
* chúng, để một trang tải lười lấy nội dung của nó trong một yêu cầu duy nhất.
|
|
483
|
+
* Mặc định: true
|
|
484
|
+
*
|
|
485
|
+
* Lưu ý:
|
|
486
|
+
* - Chỉ áp dụng cho các từ điển dùng `importMode: 'dynamic'`.
|
|
487
|
+
*/
|
|
488
|
+
chunkGrouping: true,
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* Tải từ điển cùng với phần mã sử dụng nó, thay vì lấy về sau khi phần mã đó
|
|
492
|
+
* render. Việc đọc được render đồng bộ thay vì bị treo, nên điều hướng không
|
|
493
|
+
* còn nhấp nháy trạng thái đang tải.
|
|
494
|
+
* Mặc định: true
|
|
495
|
+
*
|
|
496
|
+
* Lưu ý:
|
|
497
|
+
* - Chỉ ngôn ngữ đã xác định mới được chờ, nên trang chỉ tải đúng ngôn ngữ mà
|
|
498
|
+
* nó hiển thị.
|
|
499
|
+
*/
|
|
500
|
+
dictionariesPreload: true,
|
|
501
|
+
|
|
480
502
|
/**
|
|
481
503
|
* Định dạng đầu ra cho các tệp dictionary được tạo.
|
|
482
504
|
* Mặc định: ['cjs', 'esm']
|
|
@@ -1053,15 +1075,17 @@ Các tùy chọn build được áp dụng cho các plugin `@intlayer/babel` và
|
|
|
1053
1075
|
|
|
1054
1076
|
> Trong quá trình tối ưu hóa, Intlayer sẽ thay thế các lời gọi dictionary để tối ưu hóa việc phân tách mã (chunking) sao cho gói kết quả chỉ import những dictionary thực sự được sử dụng.
|
|
1055
1077
|
|
|
1056
|
-
| Trường
|
|
1057
|
-
|
|
|
1058
|
-
| `mode`
|
|
1059
|
-
| `optimize`
|
|
1060
|
-
| `minify`
|
|
1061
|
-
| `purge`
|
|
1062
|
-
| `checkTypes`
|
|
1063
|
-
| `
|
|
1064
|
-
| `
|
|
1078
|
+
| Trường | Mô tả | Kiểu dữ liệu | Mặc định | Ví dụ | Nhận xét |
|
|
1079
|
+
| --------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
1080
|
+
| `mode` | Kiểm soát chế độ build. | `'auto'` | <br/> `'manual'` | `'auto'` | `'manual'` | • `'auto'`: Quá trình build được khởi chạy tự động trong quá trình build ứng dụng.<br/>• `'manual'`: Chỉ được thực thi thông qua một lệnh build rõ ràng.<br/>• Có thể được sử dụng để ngăn chặn quá trình build dictionary (ví dụ: để tránh chạy trong môi trường Node.js). |
|
|
1081
|
+
| `optimize` | Kiểm soát liệu các tối ưu hóa build có nên được thực hiện hay không. | `boolean` | `undefined` | `process.env.NODE_ENV === 'production'` | • Nếu chưa được định nghĩa, quá trình tối ưu hóa được khởi chạy trong quá trình build framework (Vite/Next.js).<br/>• `true` buộc thực hiện tối ưu hóa ngay cả trong chế độ dev.<br/>• `false` vô hiệu hóa nó.<br/>• Nếu bật, nó sẽ thay thế các lệnh gọi dictionary để phục vụ tối ưu hóa chunking.<br/>• Yêu cầu các plugin `@intlayer/babel` và `@intlayer/swc`. |
|
|
1082
|
+
| `minify` | Nén (Minify) các từ điển để giảm kích thước bundle. | `boolean` | `false` | | • Cho biết bundle có nên được rút gọn không.<br/>• Mặc định: `true` trong production.<br/>• Tùy chọn này sẽ bị bỏ qua nếu `optimize` bị tắt.<br/>• Tùy chọn này sẽ bị bỏ qua nếu `editor.enabled` là true. |
|
|
1083
|
+
| `purge` | Loại bỏ (Purge) các khóa không sử dụng trong từ điển. | `boolean` | `false` | | • Cho biết bundle có nên được loại bỏ các khóa không sử dụng không.<br/>• Mặc định: `true` trong production.<br/>• Tùy chọn này sẽ bị bỏ qua nếu `optimize` bị tắt. |
|
|
1084
|
+
| `checkTypes` | Biểu thị liệu build có nên kiểm tra các kiểu dữ liệu TypeScript và ghi nhật ký lỗi hay không. | `boolean` | `false` | | Có thể làm chậm quá trình build. |
|
|
1085
|
+
| `chunkGrouping` | Xác định có nhóm các phần từ điển theo ngôn ngữ dựa trên ranh giới tách mã sử dụng chúng hay không. | `boolean` | `true` | | • Không nhóm, một trang gồm nhiều thành phần sẽ gửi một yêu cầu cho mỗi từ điển.<br/>• Các từ điển được truy cập từ nhiều ranh giới sẽ chuyển sang phần dùng chung, nên không trang nào mang nội dung của trang khác.<br/>• Chỉ áp dụng cho các từ điển dùng `importMode: 'dynamic'`.<br/>• Chỉ áp dụng cho bản build phía client, và chỉ khi đóng gói (không phải ở chế độ dev). |
|
|
1086
|
+
| `dictionariesPreload` | Xác định từ điển có được tải cùng với phần mã sử dụng nó hay không, thay vì được lấy về sau khi phần mã đó render. | `boolean` | `true` | | • Điểm vào được tạo sẽ chờ ngôn ngữ duyệt ở cấp cao nhất, nên một route tải lười chưa được coi là đã tải cho đến khi có nội dung.<br/>• Việc đọc được render đồng bộ thay vì bị treo, nên điều hướng không còn nhấp nháy trạng thái đang tải.<br/>• Chỉ ngôn ngữ đã xác định mới được chờ, nên trang chỉ tải đúng ngôn ngữ mà nó hiển thị.<br/>• Chỉ áp dụng cho các từ điển dùng `importMode: 'dynamic'`, ở bản build phía client.<br/>• Yêu cầu bộ đóng gói hỗ trợ top-level await (Vite, esbuild). |
|
|
1087
|
+
| `outputFormat` | Kiểm soát định dạng đầu ra cho các dictionary. | `('esm' | 'cjs')[]` | `['esm', 'cjs']` | `['cjs']` | |
|
|
1088
|
+
| `traversePattern` | Pattern chỉ rõ các tệp cần quét trong quá trình tối ưu hóa. | `string[]` | `['**/*.{tsx,ts,js,mjs,cjs,jsx,vue,svelte,svte}', '!**/node_modules/**', '!**/dist/**', '!**/.intlayer/**', '!**/*.config.*', '!**/*.test.*', '!**/*.spec.*', '!**/*.stories.*']` | `['src/**/*.{ts,tsx}', '../ui-library/**/*.{ts,tsx}', '!**/node_modules/**']` | • Hạn chế tối ưu hóa cho các tệp có liên quan để cải thiện hiệu suất build.<br/>• Bị bỏ qua nếu `optimize` tắt.<br/>• Sử dụng các pattern glob. |
|
|
1065
1089
|
|
|
1066
1090
|
---
|
|
1067
1091
|
|
|
@@ -539,28 +539,6 @@ Chỉ định độ ưu tiên của từ điển để giải quyết xung độ
|
|
|
539
539
|
|
|
540
540
|
> Xem [Biến thể](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dynamic_dictionaries/variants.md) để biết thêm thông tin.
|
|
541
541
|
|
|
542
|
-
#### `meta` (`Record<string, string | number | boolean>`)
|
|
543
|
-
|
|
544
|
-
Được sử dụng cùng với Các bản ghi động (Dynamic Records), trường này cho phép khai báo các bản ghi do CMS quản lý hoặc dữ liệu tùy ý được truy xuất tại thời gian chạy bằng một ID ẩn danh. Danh tính từ điển được xác định bởi tập hợp tùy ý các cặp khóa-giá trị được khai báo trong trường `meta` này.
|
|
545
|
-
|
|
546
|
-
**Ví dụ:**
|
|
547
|
-
|
|
548
|
-
```typescript
|
|
549
|
-
{
|
|
550
|
-
key: "product-copy",
|
|
551
|
-
meta: {
|
|
552
|
-
id: "prod_abc",
|
|
553
|
-
userId: "user_123"
|
|
554
|
-
},
|
|
555
|
-
content: {
|
|
556
|
-
name: "Widget Pro",
|
|
557
|
-
description: "The best widget."
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
```
|
|
561
|
-
|
|
562
|
-
> Xem [Bản ghi động](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dynamic_dictionaries/dynamic_content.md) để biết thêm thông tin.
|
|
563
|
-
|
|
564
542
|
### Thuộc tính CMS
|
|
565
543
|
|
|
566
544
|
##### `version` (string)
|
|
@@ -87,6 +87,29 @@ Không thể lấy nội dung từ file JSON, hãy sử dụng file .ts hoặc .
|
|
|
87
87
|
|
|
88
88
|
Trong trường hợp này, hàm `fakeFetch` mô phỏng một độ trễ để giả lập thời gian phản hồi của server. Intlayer thực thi hàm bất đồng bộ và sử dụng kết quả làm nội dung cho khóa `text`.
|
|
89
89
|
|
|
90
|
+
## Lấy Nội dung Từ Xa
|
|
91
|
+
|
|
92
|
+
Bạn cũng có thể gán trực tiếp một promise cho một trường nội dung. Intlayer sẽ chờ promise đó khi build các từ điển và nhúng giá trị đã được phân giải:
|
|
93
|
+
|
|
94
|
+
```typescript fileName="**/*.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
|
|
95
|
+
import type { Dictionary } from "intlayer";
|
|
96
|
+
|
|
97
|
+
const remoteContent = {
|
|
98
|
+
key: "remote_content",
|
|
99
|
+
content: {
|
|
100
|
+
externalContent: fetch("https://example.com").then((res) => res.json()),
|
|
101
|
+
},
|
|
102
|
+
} satisfies Dictionary;
|
|
103
|
+
|
|
104
|
+
export default remoteContent;
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```plaintext fileName="**/*.content.json" contentDeclarationFormat="json"
|
|
108
|
+
Không thể lấy nội dung từ file JSON, hãy sử dụng file .ts hoặc .js thay thế
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
> Yêu cầu được thực thi tại thời điểm build, vì vậy dữ liệu lấy về là một bản chụp được nhúng trong từ điển. Hãy build lại các từ điển để cập nhật.
|
|
112
|
+
|
|
90
113
|
## Sử dụng Nội dung Dựa trên Hàm trong Các Thành phần React
|
|
91
114
|
|
|
92
115
|
Để sử dụng nội dung dựa trên hàm trong một thành phần React, bạn cần import `useIntlayer` từ `react-intlayer` và gọi nó với ID nội dung để lấy nội dung. Dưới đây là một ví dụ:
|