@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.
Files changed (151) hide show
  1. package/blog/ar/nextjs-multilingual-seo-comparison.md +10 -10
  2. package/blog/de/nextjs-multilingual-seo-comparison.md +9 -9
  3. package/blog/en/nextjs-multilingual-seo-comparison.md +10 -10
  4. package/blog/en-GB/nextjs-multilingual-seo-comparison.md +10 -10
  5. package/blog/es/nextjs-multilingual-seo-comparison.md +10 -10
  6. package/blog/fr/nextjs-multilingual-seo-comparison.md +10 -10
  7. package/blog/hi/nextjs-multilingual-seo-comparison.md +10 -10
  8. package/blog/id/nextjs-multilingual-seo-comparison.md +10 -10
  9. package/blog/it/nextjs-multilingual-seo-comparison.md +10 -10
  10. package/blog/ja/nextjs-multilingual-seo-comparison.md +9 -9
  11. package/blog/ko/nextjs-multilingual-seo-comparison.md +9 -9
  12. package/blog/pl/nextjs-multilingual-seo-comparison.md +10 -10
  13. package/blog/pt/nextjs-multilingual-seo-comparison.md +9 -9
  14. package/blog/ru/nextjs-multilingual-seo-comparison.md +9 -9
  15. package/blog/tr/nextjs-multilingual-seo-comparison.md +9 -9
  16. package/blog/uk/nextjs-multilingual-seo-comparison.md +10 -10
  17. package/blog/vi/nextjs-multilingual-seo-comparison.md +10 -10
  18. package/blog/zh/nextjs-multilingual-seo-comparison.md +10 -10
  19. package/dist/cjs/generated/docs.entry.cjs +20 -0
  20. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  21. package/dist/esm/generated/docs.entry.mjs +20 -0
  22. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  23. package/dist/types/generated/docs.entry.d.ts +1 -0
  24. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  25. package/docs/ar/bundle_optimization.md +1 -1
  26. package/docs/ar/configuration.md +32 -9
  27. package/docs/ar/dictionary/content_file.md +0 -22
  28. package/docs/ar/dictionary/function_fetching.md +23 -0
  29. package/docs/ar/eslint.md +336 -0
  30. package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +1 -1
  31. package/docs/bn/configuration.md +34 -9
  32. package/docs/bn/eslint.md +336 -0
  33. package/docs/cs/bundle_optimization.md +1 -1
  34. package/docs/cs/configuration.md +33 -9
  35. package/docs/cs/eslint.md +336 -0
  36. package/docs/de/bundle_optimization.md +1 -1
  37. package/docs/de/configuration.md +34 -9
  38. package/docs/de/dictionary/content_file.md +0 -22
  39. package/docs/de/dictionary/function_fetching.md +23 -0
  40. package/docs/de/eslint.md +336 -0
  41. package/docs/en/bundle_optimization.md +1 -1
  42. package/docs/en/configuration.md +34 -9
  43. package/docs/en/dictionary/content_file.md +0 -22
  44. package/docs/en/dictionary/function_fetching.md +23 -0
  45. package/docs/en/eslint.md +336 -0
  46. package/docs/en/packages/intlayer/getLocalizedPath.md +70 -19
  47. package/docs/en-GB/configuration.md +33 -9
  48. package/docs/en-GB/dictionary/content_file.md +0 -22
  49. package/docs/en-GB/dictionary/function_fetching.md +23 -0
  50. package/docs/en-GB/eslint.md +336 -0
  51. package/docs/en-GB/intlayer_with_create_react_app.md +32 -35
  52. package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +1 -1
  53. package/docs/es/bundle_optimization.md +1 -1
  54. package/docs/es/configuration.md +35 -9
  55. package/docs/es/dictionary/content_file.md +0 -22
  56. package/docs/es/dictionary/function_fetching.md +23 -0
  57. package/docs/es/eslint.md +336 -0
  58. package/docs/fr/bundle_optimization.md +1 -1
  59. package/docs/fr/configuration.md +35 -9
  60. package/docs/fr/dictionary/content_file.md +0 -22
  61. package/docs/fr/dictionary/function_fetching.md +23 -0
  62. package/docs/fr/eslint.md +336 -0
  63. package/docs/hi/configuration.md +35 -9
  64. package/docs/hi/dictionary/content_file.md +0 -22
  65. package/docs/hi/dictionary/function_fetching.md +23 -0
  66. package/docs/hi/eslint.md +336 -0
  67. package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +1 -1
  68. package/docs/hi/intlayer_with_vite+svelte.md +2 -2
  69. package/docs/id/configuration.md +35 -9
  70. package/docs/id/dictionary/content_file.md +0 -22
  71. package/docs/id/dictionary/function_fetching.md +23 -0
  72. package/docs/id/eslint.md +336 -0
  73. package/docs/it/bundle_optimization.md +1 -1
  74. package/docs/it/configuration.md +35 -9
  75. package/docs/it/dictionary/content_file.md +0 -22
  76. package/docs/it/dictionary/function_fetching.md +23 -0
  77. package/docs/it/eslint.md +336 -0
  78. package/docs/ja/configuration.md +30 -9
  79. package/docs/ja/dictionary/content_file.md +0 -22
  80. package/docs/ja/dictionary/function_fetching.md +23 -0
  81. package/docs/ja/eslint.md +336 -0
  82. package/docs/ja/intlayer_with_react_router_v7.md +1 -146
  83. package/docs/ja/intlayer_with_vite+react.md +5 -1
  84. package/docs/ko/configuration.md +31 -9
  85. package/docs/ko/dictionary/content_file.md +0 -22
  86. package/docs/ko/dictionary/function_fetching.md +23 -0
  87. package/docs/ko/eslint.md +336 -0
  88. package/docs/ko/intlayer_with_lynx+react.md +4 -0
  89. package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +1 -1
  90. package/docs/ko/intlayer_with_storybook.md +5 -5
  91. package/docs/nl/configuration.md +33 -9
  92. package/docs/nl/eslint.md +336 -0
  93. package/docs/pl/bundle_optimization.md +1 -1
  94. package/docs/pl/configuration.md +34 -9
  95. package/docs/pl/dictionary/content_file.md +0 -22
  96. package/docs/pl/dictionary/function_fetching.md +23 -0
  97. package/docs/pl/eslint.md +336 -0
  98. package/docs/pl/intlayer_with_astro.md +1 -114
  99. package/docs/pl/migration_from_i18next_to_intlayer.md +4 -0
  100. package/docs/pl/migration_from_next-i18next_to_intlayer.md +8 -4
  101. package/docs/pl/migration_from_next-intl_to_intlayer.md +11 -5
  102. package/docs/pl/migration_from_nuxtjs_i18n_to_intlayer.md +8 -4
  103. package/docs/pl/migration_from_react-i18next_to_intlayer.md +8 -4
  104. package/docs/pl/migration_from_vue-i18n_to_intlayer.md +4 -0
  105. package/docs/pt/bundle_optimization.md +1 -1
  106. package/docs/pt/configuration.md +34 -9
  107. package/docs/pt/dictionary/content_file.md +0 -22
  108. package/docs/pt/dictionary/function_fetching.md +23 -0
  109. package/docs/pt/eslint.md +336 -0
  110. package/docs/pt/intlayer_with_astro.md +1 -114
  111. package/docs/ru/bundle_optimization.md +1 -1
  112. package/docs/ru/configuration.md +34 -9
  113. package/docs/ru/dictionary/content_file.md +0 -22
  114. package/docs/ru/dictionary/function_fetching.md +23 -0
  115. package/docs/ru/eslint.md +336 -0
  116. package/docs/tr/bundle_optimization.md +1 -1
  117. package/docs/tr/configuration.md +33 -9
  118. package/docs/tr/dictionary/content_file.md +0 -22
  119. package/docs/tr/dictionary/function_fetching.md +23 -0
  120. package/docs/tr/eslint.md +336 -0
  121. package/docs/uk/configuration.md +35 -9
  122. package/docs/uk/dictionary/content_file.md +0 -22
  123. package/docs/uk/dictionary/function_fetching.md +23 -0
  124. package/docs/uk/eslint.md +336 -0
  125. package/docs/uk/packages/angular-intlayer/exports.md +2 -2
  126. package/docs/ur/configuration.md +35 -9
  127. package/docs/ur/eslint.md +336 -0
  128. package/docs/vi/bundle_optimization.md +1 -1
  129. package/docs/vi/configuration.md +33 -9
  130. package/docs/vi/dictionary/content_file.md +0 -22
  131. package/docs/vi/dictionary/function_fetching.md +23 -0
  132. package/docs/vi/eslint.md +336 -0
  133. package/docs/zh/bundle_optimization.md +1 -1
  134. package/docs/zh/configuration.md +29 -9
  135. package/docs/zh/dictionary/content_file.md +0 -22
  136. package/docs/zh/dictionary/function_fetching.md +23 -0
  137. package/docs/zh/eslint.md +336 -0
  138. package/docs/zh/intlayer_with_create_react_app.md +4 -0
  139. package/docs/zh/intlayer_with_lynx+react.md +4 -0
  140. package/docs/zh/intlayer_with_nextjs_14.md +0 -2
  141. package/docs/zh/intlayer_with_nextjs_15.md +0 -2
  142. package/docs/zh/intlayer_with_nextjs_page_router.md +0 -2
  143. package/docs/zh/intlayer_with_nuxt.md +1 -1
  144. package/docs/zh/intlayer_with_react_router_v7.md +4 -0
  145. package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +4 -0
  146. package/docs/zh/intlayer_with_solid_start.md +1 -1
  147. package/docs/zh/intlayer_with_vite+vue.md +0 -2
  148. package/docs/zh-TW/bundle_optimization.md +1 -1
  149. package/docs/zh-TW/eslint.md +336 -0
  150. package/package.json +7 -7
  151. 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: Знаходьте жорстко закодовані рядки, динамічні виклики, які компілятор Intlayer не може оптимізувати, та невикористаний вміст словників за допомогою eslint-plugin-intlayer. Працює з ESLint та oxlint для React, Vue, Svelte, Angular та Astro.
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. **Жорстко закодований текст**, який так і не потрапив до словника.
36
+ 2. **Динамічні виклики**, які проходять перевірку типів і виконуються, але які компілятор Intlayer не може оптимізувати.
37
+ 3. **Мертвий вміст (Dead content)** — словники та поля, які ніде в проєкті не зчитуються (за бажанням/opt-in).
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
+ Два застереження: підтримка JS-плагінів в oxlint все ще на стадії альфа, і oxlint не підтримує кастомні парсери — тому файли `.vue`, `.svelte`, `.astro` та шаблони Angular там не лінтяться. Запускайте oxlint для ваших файлів JS/TS/JSX, а для решти використовуйте 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({ uk: "Заголовок", en: "Title" }),
237
+
238
+ // ✗ Повідомляється, якщо ніщо не зчитує `hero`
239
+ hero: {
240
+ subtitle: t({ uk: "Підзаголовок", 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
+ // Час повторного використання результату сканування проєкту (у мс). Типово: 30000
271
+ cacheTtl: 30000,
272
+ },
273
+ ],
274
+ }
275
+ ```
276
+
277
+ Зменште `cacheTtl`, якщо ви запускаєте лінтинг із довгоживучого сервера редактора і хочете швидше бачити зміни; встановіть `baseDir`, коли один запуск лінтингу охоплює кілька проєктів Intlayer у монорепозиторії.
278
+
279
+ > **Схильне до мінімізації помилкових спрацьовувань.** Хибне спрацьовування тут призведе до видалення потрібного перекладу, тому нічого не повідомляється, якщо словник використовується способом, який аналіз не може відстежити: об'єкт вмісту передано повністю, прив'язана функція перекладача (`const t = useTranslations("home")`), оголошення отримано через прямий імпорт (`useDictionary(myDictionary)`), виклик `nest()` з іншого словника або список полів, який став невичерпним через оператор spread. Однофайлові компоненти (`.vue`, `.svelte`, `.astro`) вважаються такими, що використовують кожне поле згаданих словників, оскільки їхні блоки скриптів тут не парсяться.
280
+
281
+ `reportDuplicateKeys` зчитує необ'єднані словники, які збірка записує у `.intlayer/`, тому воно залишається неактивним, доки проєкт не буде зібрано принаймні один раз. Два оголошення з однаковим ключем об'єднуються, що є коректним шаблоном — звіт формується тому, що поле, визначене з обох боків, непомітно зберігає лише одне з двох значень.
282
+
283
+ Аналізатор завантажується з `@intlayer/lsp`, який постачається як ESM. Тому правилу потрібна версія Node, здатна виконувати `require()` для ES-модулів — Node 20.19+ або 22.12+. На старіших версіях воно нічого не повідомляє, щоб не зупиняти процес лінтингу.
284
+
285
+ ## Фреймворки
286
+
287
+ Кожне правило працює в усіх інтеграціях Intlayer, включно з шаблонами Vue, Svelte та Angular. Потрібно лише вказати ESLint, який парсер зчитує кожен тип файлів.
288
+
289
+ | Фреймворк | Файли | Парсер |
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`. Динамічні звернення всередині блоку script виявляються у звичайному режимі.
@@ -50,14 +50,14 @@ import "angular-intlayer";
50
50
  ### Хуки
51
51
 
52
52
  | Хук | Опис | Пов'язаний документ |
53
- | ---------------------- | ------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------- | --- |
53
+ | ---------------------- | ------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------- |
54
54
  | `useIntlayer` | На основі `useDictionary`, але інжектує оптимізовану версію словника з згенерованої декларації. | - |
55
55
  | `useDictionary` | Обробляє об'єкти, що схожі на словники (ключ, вміст). Обробляє переклади `t()`, перелічення (enumerations) тощо. | - |
56
56
  | `useDictionaryAsync` | Те саме, що `useDictionary`, але працює з асинхронними словниками. | - |
57
57
  | `useDictionaryDynamic` | Те саме, що `useDictionary`, але працює з динамічними словниками. | - |
58
58
  | `useLocale` | Повертає поточну локаль і функцію для її встановлення. | - |
59
59
  | `usePathname` | Повертає поточний шлях як `Signal<string>` з видаленим сегментом локалі. Реакгує на `popstate` через `DestroyRef`. | [usePathname](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/angular-intlayer/usePathname.md) |
60
- | `useIntl` | Повертає об'єкт Intl для поточної локалі. | - | |
60
+ | `useIntl` | Повертає об'єкт Intl для поточної локалі. | - |
61
61
  | `useLoadDynamic` | Хук для завантаження динамічних словників. | - |
62
62
 
63
63
  ### Компоненти
@@ -480,6 +480,30 @@ const config: IntlayerConfig = {
480
480
  */
481
481
  prune: true,
482
482
 
483
+ /**
484
+ * فی لوکیل ڈکشنری چنکس کو اُس کوڈ اسپلٹ باؤنڈری کے مطابق گروپ کریں جو انہیں
485
+ * استعمال کرتی ہے، تاکہ سست روی سے لوڈ ہونے والا صفحہ اپنا مواد ایک ہی درخواست
486
+ * میں حاصل کرے۔
487
+ * ڈیفالٹ: true
488
+ *
489
+ * نوٹ:
490
+ * - صرف اُن ڈکشنریوں پر لاگو ہوتا ہے جو `importMode: 'dynamic'` استعمال کرتی
491
+ * ہیں۔
492
+ */
493
+ chunkGrouping: true,
494
+
495
+ /**
496
+ * ڈکشنری کو اُس چنک کے ساتھ لوڈ کریں جو اسے استعمال کرتا ہے، بجائے اس کے کہ وہ
497
+ * چنک رینڈر ہونے کے بعد اسے حاصل کیا جائے۔ پڑھائی معطل ہونے کے بجائے ہم وقت
498
+ * رینڈر ہوتی ہے، اس لیے نیویگیشن میں اب لوڈنگ کی حالت نہیں جھلکتی۔
499
+ * ڈیفالٹ: true
500
+ *
501
+ * نوٹ:
502
+ * - صرف طے شدہ لوکیل کا انتظار کیا جاتا ہے، اس لیے صفحہ صرف وہی زبان ڈاؤن لوڈ
503
+ * کرتا ہے جو وہ دکھاتا ہے۔
504
+ */
505
+ dictionariesPreload: true,
506
+
483
507
  /**
484
508
  * تیار کردہ لغت فائلوں کے لیے آؤٹ پٹ فارمیٹ۔
485
509
  * ڈیفالٹ: ['cjs', 'esm']
@@ -1041,15 +1065,17 @@ Intlayer زیادہ سے زیادہ لچک کو یقینی بنانے کے لی
1041
1065
 
1042
1066
  > آپٹیمائزیشن کے دوران، Intlayer لغت کی کالز کو کوڈ اسپلٹنگ (chunking) آپٹیمائزیشن سے بدل دیتا ہے تاکہ حتمی بنڈل صرف وہی لغات امپورٹ کرے جو اصل میں استعمال ہوئی ہیں۔
1043
1067
 
1044
- | فیلڈ | وضاحت | قسم | ڈیفالٹ | مثال | نوٹ |
1045
- | ----------------- | ------------------------------------------------------------------------------------ | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1046
- | `mode` | بلڈ ایگزیکیوشن موڈ کو کنٹرول کرتا ہے۔ | `'auto'` &#124; <br/> `'manual'` | `'auto'` | `'manual'` | • `'auto'`: ایپ بلڈ کے دوران خودکار طور پر بلڈ شروع ہوتا ہے۔<br/>• `'manual'`: صرف واضح بلڈ کمانڈ کے ذریعے چلتا ہے۔<br/>• لغت کی بلڈ کو روکنے کے لیے مفید ہو سکتا ہے (مثلاً: Node.js ماحول میں چلنے سے بچنے کے لیے)۔ |
1047
- | `optimize` | کنٹرول کرتا ہے کہ آیا بلڈ آپٹیمائزیشن کی جاتی ہے۔ | `boolean` | `undefined` | `process.env.NODE_ENV === 'production'` | • اگر متعین نہ ہو، تو یہ فریم ورک بلڈ (Vite/Next.js) کے دوران شروع ہوگا۔<br/>• `true` ڈیولپمنٹ موڈ میں بھی آپٹیمائزیشن کو مجبور کرتا ہے۔<br/>• `false` اسے غیر فعال کرتا ہے۔<br/>• اگر فعال ہو، تو لغت کی کالز کو چنکنگ آپٹیمائزیشن سے بدل دیتا ہے۔<br/>• `@intlayer/babel` اور `@intlayer/swc` پلگ انز کی ضرورت ہے۔ |
1048
- | `minify` | بتاتا ہے کہ آیا بنڈل کے سائز کو کم کرنے کے لیے لغات کو کم (minify) کیا جانا چاہیے۔ | `boolean` | `false` | | • بتاتا ہے کہ آیا بنڈل کو منی فائی کرنا ہے۔<br/>• ڈیفالٹ: پروڈکشن میں `true`۔<br/>• اگر `optimize` غیر فعال ہو تو اسے نظر انداز کر دیا جائے گا۔<br/>• اگر `editor.enabled` کی ویلیو true ہو تو اسے نظر انداز کر دیا جائے گا۔ |
1049
- | `prune` | بتاتا ہے کہ آیا لغات میں غیر استعمال شدہ کلیدوں کو ہٹا دینا (prune) چاہیے۔ | `boolean` | `true` | | • بتاتا ہے کہ آیا بنڈل کو پرون (prune) کرنا ہے۔ <br/>• ڈیفالٹ: پروڈکشن میں `true`۔<br/>• اگر `optimize` غیر فعال ہو تو اسے نظر انداز کر دیا جائے گا۔ |
1050
- | `checkTypes` | بتاتا ہے کہ آیا بلڈ کو TypeScript اقسام کو چیک کرنا چاہیے اور ایررز لاگ کرنے چاہئیں۔ | `boolean` | `false` | | بلڈ کی کارکردگی کو سست کر سکتا ہے۔ |
1051
- | `outputFormat` | لغت کے آؤٹ پٹ فارمیٹ کو کنٹرول کرتا ہے۔ | `('esm' &#124; 'cjs')[]` | `['esm', 'cjs']` | `['cjs']` | |
1052
- | `traversePattern` | آپٹیمائزیشن کے دوران اسکین کی جانے والی فائلوں کا پیٹرن۔ | `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/**']` | متعلقہ فائلوں تک آپٹیمائزیشن کو محدود کرکے بلڈ کی کارکردگی کو بہتر بناتا ہے۔<br/>• اگر `optimize` غیر فعال ہو تو نظر انداز کر دیا جاتا ہے۔<br/>• گلوب (glob) پیٹرنز استعمال کرتا ہے۔ |
1068
+ | فیلڈ | وضاحت | قسم | ڈیفالٹ | مثال | نوٹ |
1069
+ | --------------------- | ------------------------------------------------------------------------------------------------------------------------ | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1070
+ | `mode` | بلڈ ایگزیکیوشن موڈ کو کنٹرول کرتا ہے۔ | `'auto'` &#124; <br/> `'manual'` | `'auto'` | `'manual'` | • `'auto'`: ایپ بلڈ کے دوران خودکار طور پر بلڈ شروع ہوتا ہے۔<br/>• `'manual'`: صرف واضح بلڈ کمانڈ کے ذریعے چلتا ہے۔<br/>• لغت کی بلڈ کو روکنے کے لیے مفید ہو سکتا ہے (مثلاً: Node.js ماحول میں چلنے سے بچنے کے لیے)۔ |
1071
+ | `optimize` | کنٹرول کرتا ہے کہ آیا بلڈ آپٹیمائزیشن کی جاتی ہے۔ | `boolean` | `undefined` | `process.env.NODE_ENV === 'production'` | • اگر متعین نہ ہو، تو یہ فریم ورک بلڈ (Vite/Next.js) کے دوران شروع ہوگا۔<br/>• `true` ڈیولپمنٹ موڈ میں بھی آپٹیمائزیشن کو مجبور کرتا ہے۔<br/>• `false` اسے غیر فعال کرتا ہے۔<br/>• اگر فعال ہو، تو لغت کی کالز کو چنکنگ آپٹیمائزیشن سے بدل دیتا ہے۔<br/>• `@intlayer/babel` اور `@intlayer/swc` پلگ انز کی ضرورت ہے۔ |
1072
+ | `minify` | بتاتا ہے کہ آیا بنڈل کے سائز کو کم کرنے کے لیے لغات کو کم (minify) کیا جانا چاہیے۔ | `boolean` | `false` | | • بتاتا ہے کہ آیا بنڈل کو منی فائی کرنا ہے۔<br/>• ڈیفالٹ: پروڈکشن میں `true`۔<br/>• اگر `optimize` غیر فعال ہو تو اسے نظر انداز کر دیا جائے گا۔<br/>• اگر `editor.enabled` کی ویلیو true ہو تو اسے نظر انداز کر دیا جائے گا۔ |
1073
+ | `prune` | بتاتا ہے کہ آیا لغات میں غیر استعمال شدہ کلیدوں کو ہٹا دینا (prune) چاہیے۔ | `boolean` | `true` | | • بتاتا ہے کہ آیا بنڈل کو پرون (prune) کرنا ہے۔ <br/>• ڈیفالٹ: پروڈکشن میں `true`۔<br/>• اگر `optimize` غیر فعال ہو تو اسے نظر انداز کر دیا جائے گا۔ |
1074
+ | `checkTypes` | بتاتا ہے کہ آیا بلڈ کو TypeScript اقسام کو چیک کرنا چاہیے اور ایررز لاگ کرنے چاہئیں۔ | `boolean` | `false` | | بلڈ کی کارکردگی کو سست کر سکتا ہے۔ |
1075
+ | `chunkGrouping` | آیا فی لوکیل ڈکشنری چنکس کو اُس کوڈ اسپلٹ باؤنڈری کے مطابق گروپ کیا جائے جو انہیں استعمال کرتی ہے۔ | `boolean` | `true` | | • گروپنگ کے بغیر، کئی اجزاء پر مشتمل صفحہ ہر ڈکشنری کے لیے ایک درخواست بھیجتا ہے۔<br/>• متعدد باؤنڈریز سے پہنچی جانے والی ڈکشنریاں مشترکہ چنک میں منتقل ہو جاتی ہیں، اس لیے کوئی صفحہ دوسرے صفحے کا مواد نہیں بھیجتا۔<br/>• صرف اُن ڈکشنریوں پر لاگو ہوتا ہے جو `importMode: 'dynamic'` استعمال کرتی ہیں۔<br/>• صرف کلائنٹ بلڈ پر، اور صرف بنڈلنگ کے دوران لاگو ہوتا ہے (dev میں نہیں)۔ |
1076
+ | `dictionariesPreload` | آیا ڈکشنری کو اُس چنک کے ساتھ لوڈ کیا جائے جو اسے استعمال کرتا ہے، بجائے اس کے کہ وہ چنک رینڈر ہونے کے بعد حاصل کی جائے۔ | `boolean` | `true` | | تیار کردہ انٹری پوائنٹ اعلیٰ سطح پر براؤزنگ لوکیل کا انتظار کرتا ہے، اس لیے سست روی سے لوڈ ہونے والا روٹ اُس وقت تک لوڈ شدہ نہیں سمجھا جاتا جب تک اس کا مواد موجود نہ ہو۔<br/>• پڑھائی معطل ہونے کے بجائے ہم وقت رینڈر ہوتی ہے، اس لیے نیویگیشن میں اب لوڈنگ کی حالت نہیں جھلکتی۔<br/>• صرف طے شدہ لوکیل کا انتظار کیا جاتا ہے، اس لیے صفحہ صرف وہی زبان ڈاؤن لوڈ کرتا ہے جو وہ دکھاتا ہے۔<br/>• صرف کلائنٹ بلڈ میں `importMode: 'dynamic'` استعمال کرنے والی ڈکشنریوں پر لاگو ہوتا ہے۔<br/>• ٹاپ لیول await کی حمایت کرنے والا بنڈلر درکار ہے (Vite، esbuild)۔ |
1077
+ | `outputFormat` | لغت کے آؤٹ پٹ فارمیٹ کو کنٹرول کرتا ہے۔ | `('esm' &#124; 'cjs')[]` | `['esm', 'cjs']` | `['cjs']` | |
1078
+ | `traversePattern` | آپٹیمائزیشن کے دوران اسکین کی جانے والی فائلوں کا پیٹرن۔ | `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/**']` | • متعلقہ فائلوں تک آپٹیمائزیشن کو محدود کرکے بلڈ کی کارکردگی کو بہتر بناتا ہے۔<br/>• اگر `optimize` غیر فعال ہو تو نظر انداز کر دیا جاتا ہے۔<br/>• گلوب (glob) پیٹرنز استعمال کرتا ہے۔ |
1053
1079
 
1054
1080
  ---
1055
1081